refactor(cli): migrate 64 legacy scripts to CliFramework (#235)
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) 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

Wrap all CLI tools in cli/, automation/, maintenance/, deploy/, and
release/ in classes extending CliFramework. Replaces manual $argv
parsing with configure()/addArgument(), moves logic into run(): int,
and converts fwrite(STDERR,...) to $this->log(). Two CLIApp subclasses
(generate_dolibarr_version_txt, generate_joomla_update_xml) converted
to extend CliFramework directly.

Every script now gets free --help, --verbose, --quiet, --dry-run,
--json, --no-color, banners, coloured logging, and progress bars.

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-31 11:39:10 -05:00
parent af77e9d361
commit b3d9ee8255
64 changed files with 9792 additions and 11200 deletions
+35 -78
View File
@@ -12,13 +12,17 @@
* INGROUP: moko-platform
* REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
* PATH: /cli/client_dashboard.php
* VERSION: 09.21.00
* VERSION: 09.21.07
* BRIEF: Generate unified client dashboard HTML
*/
declare(strict_types=1);
final class ClientDashboard
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
use MokoEnterprise\CliFramework;
class ClientDashboardCli extends CliFramework
{
private string $giteaUrl = 'https://git.mokoconsulting.tech';
private string $token = '';
@@ -29,29 +33,47 @@ final class ClientDashboard
private int $sslWarnDays = 30;
private int $httpTimeout = 10;
public function run(): int
protected function configure(): void
{
$this->parseArgs();
$this->setDescription('Generate unified client dashboard HTML');
$this->addArgument('--token', 'Gitea token (or MOKOGITEA_TOKEN)', '');
$this->addArgument('--gitea-url', 'Gitea URL', 'https://git.mokoconsulting.tech');
$this->addArgument('--org', 'Primary org (default: MokoConsulting)', 'MokoConsulting');
$this->addArgument('--output', 'Output HTML file (default: stdout)', '');
$this->addArgument('-o', 'Output HTML file (alias)', '');
$this->addArgument('--no-ssl', 'Skip SSL checks', false);
$this->addArgument('--no-uptime', 'Skip HTTP uptime checks', false);
$this->addArgument('--ssl-warn-days', 'SSL warning days (default: 30)', '30');
}
protected function run(): int
{
$this->giteaUrl = rtrim($this->getArgument('--gitea-url'), '/');
$this->token = $this->getArgument('--token');
$this->org = $this->getArgument('--org');
$this->outputFile = $this->getArgument('--output') ?: $this->getArgument('-o');
$this->checkSsl = !$this->getArgument('--no-ssl');
$this->checkUptime = !$this->getArgument('--no-uptime');
$this->sslWarnDays = (int) $this->getArgument('--ssl-warn-days');
if ($this->token === '') {
$this->token = getenv('MOKOGITEA_TOKEN') ?: '';
}
if ($this->token === '') {
$this->log('ERROR: --token or MOKOGITEA_TOKEN required.');
$this->printUsage();
$this->log('ERROR', '--token or MOKOGITEA_TOKEN required.');
return 1;
}
$this->log('Gathering client data...');
$this->log('INFO', 'Gathering client data...');
$clients = $this->discoverClients();
if ($clients === null) {
$this->log('ERROR: Could not fetch client repos.');
$this->log('ERROR', 'Could not fetch client repos.');
return 1;
}
$this->log('Found ' . count($clients) . ' client(s).');
$this->log('INFO', 'Found ' . count($clients) . ' client(s).');
foreach ($clients as &$client) {
$this->enrichClient($client);
@@ -63,7 +85,7 @@ final class ClientDashboard
if ($this->outputFile !== '') {
file_put_contents($this->outputFile, $html);
$this->log("Dashboard: {$this->outputFile}");
$this->log('INFO', "Dashboard: {$this->outputFile}");
} else {
fwrite(STDOUT, $html);
}
@@ -151,9 +173,8 @@ final class ClientDashboard
private function enrichClient(array &$client): void
{
$repo = $client['repo'];
$this->log(" Checking {$client['name']}...");
$this->log('INFO', " Checking {$client['name']}...");
// Fetch variables
$resp = $this->api('GET', "/api/v1/repos/{$repo}/actions/variables");
$vars = [];
@@ -185,7 +206,6 @@ final class ClientDashboard
}
}
// SSL
$client['ssl_expiry'] = null;
$client['ssl_days'] = null;
$client['ssl_status'] = 'unknown';
@@ -212,7 +232,6 @@ final class ClientDashboard
}
}
// Last release
$client['last_release'] = '';
$client['last_release_date'] = '';
$relResp = $this->api('GET', "/api/v1/repos/{$repo}/releases?limit=1");
@@ -461,69 +480,7 @@ CARD;
curl_close($ch);
return ['code' => $code, 'body' => $body];
}
private function parseArgs(): void
{
$args = $_SERVER['argv'] ?? [];
$count = count($args);
for ($i = 1; $i < $count; $i++) {
switch ($args[$i]) {
case '--token':
$this->token = $args[++$i] ?? '';
break;
case '--gitea-url':
$this->giteaUrl = rtrim($args[++$i] ?? '', '/');
break;
case '--org':
$this->org = $args[++$i] ?? '';
break;
case '--output':
case '-o':
$this->outputFile = $args[++$i] ?? '';
break;
case '--no-ssl':
$this->checkSsl = false;
break;
case '--no-uptime':
$this->checkUptime = false;
break;
case '--ssl-warn-days':
$this->sslWarnDays = (int) ($args[++$i] ?? 30);
break;
case '--help':
case '-h':
$this->printUsage();
exit(0);
default:
$this->log("WARNING: Unknown arg: {$args[$i]}");
break;
}
}
}
private function printUsage(): void
{
$this->log('Usage: client_dashboard.php --token TOKEN [options]');
$this->log('');
$this->log('Generate unified client status dashboard (HTML).');
$this->log('');
$this->log('Options:');
$this->log(' --token <token> Gitea token (or MOKOGITEA_TOKEN)');
$this->log(' --gitea-url <url> Gitea URL');
$this->log(' --org <org> Primary org (default: MokoConsulting)');
$this->log(' -o, --output <file> Output HTML file (default: stdout)');
$this->log(' --no-ssl Skip SSL checks');
$this->log(' --no-uptime Skip HTTP uptime checks');
$this->log(' --ssl-warn-days <n> SSL warning days (default: 30)');
$this->log(' --help, -h Show this help');
}
private function log(string $message): void
{
fwrite(STDERR, $message . PHP_EOL);
}
}
$app = new ClientDashboard();
exit($app->run());
$app = new ClientDashboardCli();
exit($app->execute());