feat(cli): version pipeline overhaul — multi-branch stability, generic file scanning
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Universal: Auto Version Bump / Version Bump (push) Has been cancelled
Generic: Repo Health / Site Health (pull_request) Has been cancelled
Universal: PR Check / Branch Policy (pull_request) Has been cancelled
Generic: Repo Health / Access control (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) Has been cancelled
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Has been cancelled
Universal: PR Check / Validate PR (pull_request) Has been cancelled
Universal: Build & Release / Promote Pre-Release to RC (pull_request) Has been cancelled
Branch Cleanup / Delete merged branch (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (pull_request) Has been cancelled
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (pull_request) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (pull_request) Has been cancelled
Platform: moko-platform CI / CI Summary (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Generic: Repo Health / Release configuration (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled

Phase 1: version_bump.php — scan CHANGELOG.md and all text files for VERSION: patterns
Phase 2: version_check.php — check manifest.xml, package.json, pyproject.toml, CHANGELOG
Phase 3: version_auto_bump.php — new CLI tool replacing inline workflow bash
Phase 4: auto-release.yml — replace python3 calls with PHP
Phase 5: auto-bump.yml — slim to single CLI call, support all branch types

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan Miller
2026-05-29 04:50:22 -05:00
parent b76b3d5337
commit db06dc31cc
5 changed files with 316 additions and 44 deletions
+75
View File
@@ -205,5 +205,80 @@ if (file_exists($pyprojectFile)) {
}
}
// -- Update CHANGELOG.md --
$changelogFile = "{$root}/CHANGELOG.md";
if (file_exists($changelogFile)) {
$clContent = file_get_contents($changelogFile);
$updatedCl = preg_replace(
'/(VERSION:\s*)\d{2}\.\d{2}\.\d{2}(?:(?:-(?:dev|alpha|beta|rc))+)?/m',
'${1}' . $newFull,
$clContent
);
if ($updatedCl !== null && $updatedCl !== $clContent) {
file_put_contents($changelogFile, $updatedCl);
fwrite(STDERR, "Updated CHANGELOG.md\n");
}
}
// -- Generic VERSION: pattern scan across all text files --
$scanExtensions = ['php', 'yml', 'yaml', 'md', 'txt', 'xml', 'sh', 'toml', 'ini', 'css', 'js'];
$excludeDirs = ['.git', 'vendor', 'node_modules', 'build', 'dist', '.claude'];
$versionPattern = '/(VERSION:\s*)\d{2}\.\d{2}\.\d{2}(?:(?:-(?:dev|alpha|beta|rc))+)?/m';
$directory = new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS);
$filter = new RecursiveCallbackFilterIterator($directory, function ($current, $key, $iterator) use ($excludeDirs) {
if ($current->isDir() && in_array($current->getFilename(), $excludeDirs, true)) {
return false;
}
return true;
});
$iterator = new RecursiveIteratorIterator($filter);
$genericUpdated = [];
foreach ($iterator as $fileInfo) {
if ($fileInfo->isDir()) {
continue;
}
$ext = strtolower($fileInfo->getExtension());
if (!in_array($ext, $scanExtensions, true)) {
continue;
}
$filePath = $fileInfo->getPathname();
// Skip files already handled above
$relPath = str_replace([$root . '/', $root . '\\'], '', $filePath);
if (in_array($relPath, ['README.md', 'CHANGELOG.md', 'package.json', 'pyproject.toml'], true)) {
continue;
}
if (in_array($relPath, $updatedFiles ?? [], true)) {
continue;
}
if (strpos($relPath, '.mokogitea/manifest.xml') !== false) {
continue;
}
$content = @file_get_contents($filePath);
if ($content === false) {
continue;
}
// Skip synced files — they have their own version managed by their source repo
if (preg_match('/^#\s*REPO:\s*https?:\/\//m', $content)) {
continue;
}
$updated = preg_replace($versionPattern, '${1}' . $newFull, $content);
if ($updated !== null && $updated !== $content) {
file_put_contents($filePath, $updated);
$genericUpdated[] = $relPath;
}
}
if (!empty($genericUpdated)) {
fwrite(STDERR, "Updated VERSION: in " . count($genericUpdated) . " file(s): " . implode(', ', $genericUpdated) . "\n");
}
echo "{$old} -> {$newFull}\n";
exit(0);