Public Access
feat: security advisory aggregator, manifest API rewrite, namespace rename (#150, #283)
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Auto Version Bump / Version Bump (push) Successful in 8s
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Site Health (push) Has been skipped
Universal: Auto Version Bump / Version Bump (push) Successful in 8s
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
- Add `security:advisories` command — cross-repo CVE scanner via composer audit with checkpoint resumability, severity filtering, and auto-issue creation - Rewrite `manifest:read` to use Gitea manifest API as primary source with auto-detection fallback from source tree (no more manifest.xml dependency) - Rename MokoStandards namespace → MokoCli across all files - Rename MokoEnterprise namespace → MokoCli across all files - Rename MokoStandardsParser class → ManifestParser - Fix composer.json autoload paths: src/ → source/
This commit is contained in:
@@ -20,9 +20,9 @@ declare(strict_types=1);
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoEnterprise\Config;
|
||||
use MokoEnterprise\PlatformAdapterFactory;
|
||||
use MokoCli\CliFramework;
|
||||
use MokoCli\Config;
|
||||
use MokoCli\PlatformAdapterFactory;
|
||||
|
||||
class ArchiveRepoCli extends CliFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
/**
|
||||
* CLI tool to search, filter, and export audit logs.
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class BadgeUpdateCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class BranchRenameCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class BulkWorkflowPushCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class BulkWorkflowTriggerCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ChangelogPromoteCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ChangelogPruneCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ClientDashboardCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ClientHealthCheckCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ClientInventoryCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ClientProvisionCli extends CliFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class CompletionCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -19,7 +19,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class CreateProjectCli extends CliFramework
|
||||
{
|
||||
@@ -80,10 +80,10 @@ class CreateProjectCli extends CliFramework
|
||||
return 2;
|
||||
}
|
||||
|
||||
$config = \MokoEnterprise\Config::load();
|
||||
$config = \MokoCli\Config::load();
|
||||
$platformName = $config->getString('platform', 'gitea');
|
||||
try {
|
||||
$adapter = \MokoEnterprise\PlatformAdapterFactory::create($config);
|
||||
$adapter = \MokoCli\PlatformAdapterFactory::create($config);
|
||||
$api = $adapter->getApiClient();
|
||||
} catch (\Exception $e) {
|
||||
$this->log('ERROR', "Platform initialization failed: " . $e->getMessage());
|
||||
@@ -205,7 +205,7 @@ class CreateProjectCli extends CliFramework
|
||||
return $data['data'] ?? [];
|
||||
}
|
||||
|
||||
private function restGet(string $path, string $token, ?\MokoEnterprise\ApiClient $apiClient = null): array
|
||||
private function restGet(string $path, string $token, ?\MokoCli\ApiClient $apiClient = null): array
|
||||
{
|
||||
if ($apiClient !== null) {
|
||||
try {
|
||||
@@ -217,7 +217,7 @@ class CreateProjectCli extends CliFramework
|
||||
return [];
|
||||
}
|
||||
|
||||
private function detectRepoPlatform(string $org, string $repo, string $token, ?\MokoEnterprise\ApiClient $apiClient = null): string
|
||||
private function detectRepoPlatform(string $org, string $repo, string $token, ?\MokoCli\ApiClient $apiClient = null): string
|
||||
{
|
||||
foreach (['.github/.mokostandards', '.mokogitea/.mokostandards', '.mokostandards'] as $path) {
|
||||
$data = $this->restGet("repos/{$org}/{$repo}/contents/{$path}", $token, $apiClient);
|
||||
|
||||
+4
-4
@@ -20,9 +20,9 @@ declare(strict_types=1);
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoEnterprise\Config;
|
||||
use MokoEnterprise\PlatformAdapterFactory;
|
||||
use MokoCli\CliFramework;
|
||||
use MokoCli\Config;
|
||||
use MokoCli\PlatformAdapterFactory;
|
||||
|
||||
class CreateRepoCli extends CliFramework
|
||||
{
|
||||
@@ -138,7 +138,7 @@ class CreateRepoCli extends CliFramework
|
||||
echo "Step 4: Creating README.md...\n";
|
||||
$baseUrl = $platformName === 'gitea' ? $config->getString('gitea.url', 'https://git.mokoconsulting.tech') : 'https://github.com';
|
||||
$repoUrl = "{$baseUrl}/{$org}/{$name}";
|
||||
$standardsUrl = "{$baseUrl}/{$org}/MokoStandards";
|
||||
$standardsUrl = "{$baseUrl}/{$org}/MokoCli";
|
||||
$readmeContent = "<!--\n"
|
||||
. "Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>\n"
|
||||
. "SPDX-License-Identifier: GPL-3.0-or-later\n"
|
||||
|
||||
@@ -31,7 +31,7 @@ require_once __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
use phpseclib3\Net\SFTP;
|
||||
use phpseclib3\Crypt\PublicKeyLoader;
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class DevBranchResetCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class GrafanaDashboardCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -19,7 +19,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class JoomlaBuildCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class JoomlaCompatCheckCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class JoomlaMetadataValidateCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -25,7 +25,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
use MokoEnterprise\{ApiClient, AuditLogger, CliFramework, Config, PlatformAdapterFactory, SourceResolver};
|
||||
use MokoCli\{ApiClient, AuditLogger, CliFramework, Config, PlatformAdapterFactory, SourceResolver};
|
||||
|
||||
/**
|
||||
* Joomla Release Manager
|
||||
@@ -57,7 +57,7 @@ class JoomlaRelease extends CliFramework
|
||||
];
|
||||
|
||||
private ApiClient $api;
|
||||
private \MokoEnterprise\GitPlatformAdapter $adapter;
|
||||
private \MokoCli\GitPlatformAdapter $adapter;
|
||||
|
||||
protected function configure(): void
|
||||
{
|
||||
|
||||
@@ -28,7 +28,7 @@ declare(strict_types=1);
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class LicenseManage extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class ManifestDetectCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class ManifestElementCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ManifestIntegrityCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
/**
|
||||
* Reads the <licensing> block from .mokogitea/manifest.xml and ensures that the
|
||||
|
||||
+398
-94
@@ -6,126 +6,431 @@
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* FILE INFORMATION
|
||||
* DEFGROUP: mokoplatform.CLI
|
||||
* INGROUP: mokoplatform
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||
* DEFGROUP: mokocli.CLI
|
||||
* INGROUP: mokocli
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli
|
||||
* PATH: /cli/manifest_read.php
|
||||
* VERSION: 09.29.01
|
||||
* BRIEF: Parse .manifest.xml and output requested field(s) for CI consumption
|
||||
* VERSION: 10.00.00
|
||||
* BRIEF: Read repo metadata from Gitea manifest API, auto-detect the rest
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ManifestReadCli extends CliFramework
|
||||
{
|
||||
/** Joomla extension XML element names searched in root and source/ dirs. */
|
||||
private const JOOMLA_XML_ROOTS = ['extension', 'install'];
|
||||
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->setDescription('Parse manifest.xml and output requested field(s) for CI consumption');
|
||||
$this->addArgument('--path', 'Repository root path', '.');
|
||||
$this->addArgument('--field', 'Single field name to output', '');
|
||||
$this->addArgument('--all', 'Print all fields as KEY=VALUE lines', false);
|
||||
$this->addArgument('--github-output', 'Append all fields to $GITHUB_OUTPUT', false);
|
||||
$this->addArgument('--json', 'Output all fields as JSON', false);
|
||||
$this->setDescription('Read repo metadata from Gitea API with auto-detection fallback');
|
||||
$this->addArgument('--path', 'Repository root path', '.');
|
||||
$this->addArgument('--field', 'Single field name to output', '');
|
||||
$this->addArgument('--all', 'Print all fields as KEY=VALUE lines', false);
|
||||
$this->addArgument('--github-output', 'Append all fields to $GITHUB_OUTPUT', false);
|
||||
$this->addArgument('--json', 'Output all fields as JSON', false);
|
||||
}
|
||||
|
||||
protected function run(): int
|
||||
{
|
||||
$path = $this->getArgument('--path');
|
||||
$field = $this->getArgument('--field');
|
||||
$path = $this->getArgument('--path');
|
||||
$field = $this->getArgument('--field');
|
||||
$showAll = $this->getArgument('--all');
|
||||
$ghOutput = $this->getArgument('--github-output');
|
||||
$ghOut = $this->getArgument('--github-output');
|
||||
$jsonMode = $this->getArgument('--json');
|
||||
|
||||
// Determine mode
|
||||
if ($ghOutput) {
|
||||
$mode = 'github-output';
|
||||
} elseif ($showAll) {
|
||||
$mode = 'all';
|
||||
} elseif ($jsonMode) {
|
||||
$mode = 'json';
|
||||
} else {
|
||||
$mode = 'field';
|
||||
$mode = match (true) {
|
||||
(bool) $ghOut => 'github-output',
|
||||
(bool) $showAll => 'all',
|
||||
(bool) $jsonMode => 'json',
|
||||
default => 'field',
|
||||
};
|
||||
|
||||
$root = realpath($path) ?: $path;
|
||||
|
||||
// ── 1. Resolve org/repo ──────────────────────────────────────────
|
||||
[$org, $repo] = $this->resolveOrgRepo($root);
|
||||
|
||||
// ── 2. Primary: Gitea manifest API ───────────────────────────────
|
||||
$fields = null;
|
||||
if ($org !== '' && $repo !== '') {
|
||||
$fields = $this->fetchFromApi($org, $repo);
|
||||
}
|
||||
|
||||
// -- Locate manifest --
|
||||
$root = realpath($path) ?: $path;
|
||||
$manifestFile = null;
|
||||
// ── 3. Fallback: auto-detect from source tree ────────────────────
|
||||
if ($fields === null) {
|
||||
$this->log('INFO', 'API unavailable — falling back to source-tree detection');
|
||||
$fields = $this->autoDetect($root, $repo);
|
||||
}
|
||||
|
||||
// Priority: manifest.xml (current standard)
|
||||
$candidates = [
|
||||
"{$root}/.mokogitea/manifest.xml",
|
||||
"{$root}/.mokogitea/.manifest.xml", // legacy (dot-prefixed)
|
||||
"{$root}/.mokogitea/.mokoplatform", // legacy v4
|
||||
if (empty($fields)) {
|
||||
$this->log('ERROR', "Could not resolve metadata for {$root}");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Provide backward-compatible aliases (hyphenated → underscore)
|
||||
$fields = $this->addAliases($fields);
|
||||
|
||||
// Strip empty values
|
||||
$fields = array_filter($fields, fn($v) => $v !== '' && $v !== null);
|
||||
|
||||
// ── 4. Output ────────────────────────────────────────────────────
|
||||
return $this->outputFields($fields, $mode, $field);
|
||||
}
|
||||
|
||||
// ── Gitea manifest API ───────────────────────────────────────────────
|
||||
|
||||
private function fetchFromApi(string $org, string $repo): ?array
|
||||
{
|
||||
$token = getenv('GA_TOKEN') ?: getenv('GITEA_TOKEN') ?: '';
|
||||
$baseUrl = getenv('GITEA_URL') ?: 'https://git.mokoconsulting.tech';
|
||||
$baseUrl = rtrim($baseUrl, '/');
|
||||
|
||||
if ($token === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$url = "{$baseUrl}/api/v1/repos/{$org}/{$repo}/manifest";
|
||||
$ctx = stream_context_create([
|
||||
'http' => [
|
||||
'header' => "Authorization: token {$token}\r\nAccept: application/json\r\n",
|
||||
'timeout' => 10,
|
||||
'ignore_errors' => true,
|
||||
],
|
||||
]);
|
||||
|
||||
$body = @file_get_contents($url, false, $ctx);
|
||||
if ($body === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check HTTP status from response headers
|
||||
$status = 0;
|
||||
if (isset($http_response_header[0])) {
|
||||
preg_match('/\d{3}/', $http_response_header[0], $m);
|
||||
$status = (int) ($m[0] ?? 0);
|
||||
}
|
||||
if ($status < 200 || $status >= 300) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$data = json_decode($body, true);
|
||||
if (!is_array($data) || empty($data)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$this->log('INFO', "Loaded metadata from Gitea manifest API ({$org}/{$repo})");
|
||||
return $data;
|
||||
}
|
||||
|
||||
// ── Auto-detection fallback ──────────────────────────────────────────
|
||||
|
||||
private function autoDetect(string $root, string $repoName): array
|
||||
{
|
||||
$fields = [
|
||||
'name' => $repoName ?: basename($root),
|
||||
'org' => 'MokoConsulting',
|
||||
];
|
||||
|
||||
foreach ($candidates as $candidate) {
|
||||
if (file_exists($candidate)) {
|
||||
$manifestFile = $candidate;
|
||||
// Resolve source directory (source/ or src/)
|
||||
$srcDir = null;
|
||||
foreach (['source', 'src'] as $candidate) {
|
||||
if (is_dir("{$root}/{$candidate}")) {
|
||||
$srcDir = $candidate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($manifestFile === null) {
|
||||
$this->log('ERROR', "No manifest found in {$root}");
|
||||
return 1;
|
||||
// ── Try Joomla detection ─────────────────────────────────────
|
||||
$joomlaResult = $this->detectJoomla($root, $srcDir);
|
||||
if ($joomlaResult !== null) {
|
||||
$fields = array_merge($fields, $joomlaResult);
|
||||
$this->log('INFO', "Auto-detected platform: joomla ({$fields['extension_type']} — {$fields['element_name']})");
|
||||
return $fields;
|
||||
}
|
||||
|
||||
// -- Parse XML --
|
||||
$xml = @simplexml_load_file($manifestFile);
|
||||
// ── Try Dolibarr detection ───────────────────────────────────
|
||||
$dolibarrResult = $this->detectDolibarr($root);
|
||||
if ($dolibarrResult !== null) {
|
||||
$fields = array_merge($fields, $dolibarrResult);
|
||||
$this->log('INFO', "Auto-detected platform: dolibarr");
|
||||
return $fields;
|
||||
}
|
||||
|
||||
if ($xml === false) {
|
||||
// Fallback: try YAML format (.mokostandards legacy)
|
||||
$content = file_get_contents($manifestFile);
|
||||
$fields = [];
|
||||
if (preg_match('/^platform:\s*(.+)/m', $content, $m)) {
|
||||
$fields['platform'] = trim($m[1], " \t\n\r\"'");
|
||||
// ── Generic fallback ─────────────────────────────────────────
|
||||
$fields['platform'] = $this->detectGenericPlatform($root);
|
||||
$fields['element_name'] = strtolower($fields['name']);
|
||||
$fields['extension_type'] = 'application';
|
||||
$fields['language'] = $this->detectLanguage($root);
|
||||
if ($srcDir !== null) {
|
||||
$fields['entry_point'] = "{$srcDir}/";
|
||||
}
|
||||
|
||||
$this->log('INFO', "Auto-detected platform: {$fields['platform']}");
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect Joomla platform by scanning for extension XML manifests.
|
||||
*
|
||||
* Searches root and source/ dirs for XML files containing <extension type="...">.
|
||||
* Extracts element name from the filename (pkg_*, com_*, mod_*, plg_*, tpl_*) or
|
||||
* from the <element> tag inside the manifest.
|
||||
*/
|
||||
private function detectJoomla(string $root, ?string $srcDir): ?array
|
||||
{
|
||||
$searchDirs = [$root];
|
||||
if ($srcDir !== null) {
|
||||
$searchDirs[] = "{$root}/{$srcDir}";
|
||||
}
|
||||
|
||||
foreach ($searchDirs as $dir) {
|
||||
$xmlFiles = glob("{$dir}/*.xml") ?: [];
|
||||
foreach ($xmlFiles as $xmlFile) {
|
||||
$content = @file_get_contents($xmlFile);
|
||||
if ($content === false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Match <extension type="component|module|plugin|package|template|file|library">
|
||||
if (!preg_match('/<extension\s+[^>]*type="([^"]+)"/', $content, $typeMatch)) {
|
||||
// Also try legacy <install type="...">
|
||||
if (!preg_match('/<install\s+[^>]*type="([^"]+)"/', $content, $typeMatch)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$extType = strtolower($typeMatch[1]);
|
||||
$basename = pathinfo($xmlFile, PATHINFO_FILENAME);
|
||||
|
||||
// Try to extract element name from XML <element> tag
|
||||
$xml = @simplexml_load_string($content);
|
||||
$element = '';
|
||||
if ($xml !== false) {
|
||||
// Package manifests have <files><file ...>element</file></files>
|
||||
// Component/module manifests have <element> or use filename
|
||||
$element = (string) ($xml->element ?? '');
|
||||
if ($element === '') {
|
||||
$element = strtolower($basename);
|
||||
}
|
||||
} else {
|
||||
$element = strtolower($basename);
|
||||
}
|
||||
|
||||
// Derive display name
|
||||
$displayName = (string) ($xml->name ?? ucfirst(str_replace('_', ' ', $basename)));
|
||||
|
||||
return [
|
||||
'platform' => 'joomla',
|
||||
'extension_type' => $extType,
|
||||
'element_name' => $element,
|
||||
'display_name' => $displayName,
|
||||
'language' => 'PHP',
|
||||
'entry_point' => ($srcDir ?? '.') . '/',
|
||||
];
|
||||
}
|
||||
if (preg_match('/^standards_version:\s*(.+)/m', $content, $m)) {
|
||||
$fields['standards-version'] = trim($m[1], " \t\n\r\"'");
|
||||
|
||||
// Also check for pkg_*.xml pattern specifically
|
||||
$pkgFiles = glob("{$dir}/pkg_*.xml") ?: [];
|
||||
if (!empty($pkgFiles)) {
|
||||
$basename = pathinfo($pkgFiles[0], PATHINFO_FILENAME);
|
||||
return [
|
||||
'platform' => 'joomla',
|
||||
'extension_type' => 'package',
|
||||
'element_name' => strtolower($basename),
|
||||
'display_name' => ucfirst(str_replace('_', ' ', $basename)),
|
||||
'language' => 'PHP',
|
||||
'entry_point' => ($srcDir ?? '.') . '/',
|
||||
];
|
||||
}
|
||||
if (preg_match('/^governed_repo:\s*(.+)/m', $content, $m)) {
|
||||
$fields['name'] = trim($m[1], " \t\n\r\"'");
|
||||
}
|
||||
|
||||
// Check for com_*/manifest.xml pattern (component subdirectory)
|
||||
$comDirs = glob("{$root}/com_*", GLOB_ONLYDIR) ?: [];
|
||||
foreach ($comDirs as $comDir) {
|
||||
$comManifest = glob("{$comDir}/*.xml") ?: [];
|
||||
foreach ($comManifest as $xmlFile) {
|
||||
$content = @file_get_contents($xmlFile);
|
||||
if ($content && preg_match('/<extension\s+[^>]*type="component"/', $content)) {
|
||||
return [
|
||||
'platform' => 'joomla',
|
||||
'extension_type' => 'component',
|
||||
'element_name' => strtolower(basename($comDir)),
|
||||
'display_name' => ucfirst(str_replace('com_', '', basename($comDir))),
|
||||
'language' => 'PHP',
|
||||
'entry_point' => ($srcDir ?? '.') . '/',
|
||||
];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Register namespace for XPath (optional, simple path works without)
|
||||
$fields = [
|
||||
'name' => (string)($xml->identity->name ?? ''),
|
||||
'display-name' => (string)($xml->identity->{"display-name"} ?? ''),
|
||||
'org' => (string)($xml->identity->org ?? ''),
|
||||
'description' => (string)($xml->identity->description ?? ''),
|
||||
'license' => (string)($xml->identity->license ?? ''),
|
||||
'license-spdx' => (string)($xml->identity->license['spdx'] ?? ''),
|
||||
'platform' => (string)($xml->governance->platform ?? ''),
|
||||
'standards-version' => (string)($xml->governance->{"standards-version"} ?? ''),
|
||||
'standards-source' => (string)($xml->governance->{"standards-source"} ?? ''),
|
||||
'language' => (string)($xml->build->language ?? ''),
|
||||
'package-type' => (string)($xml->build->{"package-type"} ?? ''),
|
||||
'entry-point' => (string)($xml->build->{"entry-point"} ?? ''),
|
||||
'version' => (string)($xml->identity->version ?? ''),
|
||||
'source-dir' => (string)($xml->deploy->{"source-dir"} ?? ''),
|
||||
'remote-subdir' => (string)($xml->deploy->{"remote-subdir"} ?? ''),
|
||||
'excludes' => (string)($xml->deploy->excludes ?? ''),
|
||||
'dev-host' => (string)($xml->deploy->{"dev-host"} ?? ''),
|
||||
'demo-host' => (string)($xml->deploy->{"demo-host"} ?? ''),
|
||||
'manifest-file' => $manifestFile,
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect Dolibarr platform by scanning for module descriptor files.
|
||||
*/
|
||||
private function detectDolibarr(string $root): ?array
|
||||
{
|
||||
// Look for mod*.class.php containing DolibarrModules
|
||||
$searchPaths = [
|
||||
"{$root}/core/modules/mod*.class.php",
|
||||
"{$root}/*/core/modules/mod*.class.php",
|
||||
];
|
||||
|
||||
foreach ($searchPaths as $pattern) {
|
||||
$files = glob($pattern) ?: [];
|
||||
foreach ($files as $file) {
|
||||
$content = @file_get_contents($file);
|
||||
if ($content && str_contains($content, 'DolibarrModules')) {
|
||||
$modName = pathinfo($file, PATHINFO_FILENAME);
|
||||
// modMyModule.class → mymodule
|
||||
$element = strtolower(preg_replace('/^mod/', '', str_replace('.class', '', $modName)));
|
||||
|
||||
return [
|
||||
'platform' => 'dolibarr',
|
||||
'extension_type' => 'module',
|
||||
'element_name' => $element,
|
||||
'display_name' => ucfirst($element),
|
||||
'language' => 'PHP',
|
||||
'entry_point' => './',
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Secondary: check for update.txt (Dolibarr marker)
|
||||
if (file_exists("{$root}/update.txt")) {
|
||||
return [
|
||||
'platform' => 'dolibarr',
|
||||
'extension_type' => 'module',
|
||||
'element_name' => strtolower(basename($root)),
|
||||
'display_name' => basename($root),
|
||||
'language' => 'PHP',
|
||||
'entry_point' => './',
|
||||
];
|
||||
}
|
||||
|
||||
// Strip empty values for cleaner output
|
||||
$fields = array_filter($fields, fn($v) => $v !== '');
|
||||
return null;
|
||||
}
|
||||
|
||||
// -- Output --
|
||||
/**
|
||||
* Detect generic platform type (php, nodejs, python, etc.) from project files.
|
||||
*/
|
||||
private function detectGenericPlatform(string $root): string
|
||||
{
|
||||
if (file_exists("{$root}/composer.json")) {
|
||||
return 'php';
|
||||
}
|
||||
if (file_exists("{$root}/package.json")) {
|
||||
return 'nodejs';
|
||||
}
|
||||
if (file_exists("{$root}/pyproject.toml") || file_exists("{$root}/setup.py")) {
|
||||
return 'python';
|
||||
}
|
||||
if (file_exists("{$root}/go.mod")) {
|
||||
return 'go';
|
||||
}
|
||||
if (file_exists("{$root}/Cargo.toml")) {
|
||||
return 'rust';
|
||||
}
|
||||
return 'generic';
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect primary language from project files.
|
||||
*/
|
||||
private function detectLanguage(string $root): string
|
||||
{
|
||||
if (file_exists("{$root}/composer.json")) {
|
||||
return 'PHP';
|
||||
}
|
||||
if (file_exists("{$root}/tsconfig.json")) {
|
||||
return 'TypeScript';
|
||||
}
|
||||
if (file_exists("{$root}/package.json")) {
|
||||
return 'JavaScript';
|
||||
}
|
||||
if (file_exists("{$root}/pyproject.toml") || file_exists("{$root}/setup.py")) {
|
||||
return 'Python';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
// ── Org/repo resolution ──────────────────────────────────────────────
|
||||
|
||||
/**
|
||||
* Resolve org and repo name from environment or git remote.
|
||||
*
|
||||
* @return array{0: string, 1: string} [org, repo]
|
||||
*/
|
||||
private function resolveOrgRepo(string $root): array
|
||||
{
|
||||
// 1. GITHUB_REPOSITORY env (set in Gitea Actions / GitHub Actions)
|
||||
$envRepo = getenv('GITHUB_REPOSITORY') ?: '';
|
||||
if ($envRepo !== '' && str_contains($envRepo, '/')) {
|
||||
return explode('/', $envRepo, 2);
|
||||
}
|
||||
|
||||
// 2. Parse git remote origin URL
|
||||
$remoteUrl = trim((string) shell_exec(
|
||||
'git -C ' . escapeshellarg($root) . ' remote get-url origin 2>/dev/null'
|
||||
));
|
||||
|
||||
if ($remoteUrl !== '') {
|
||||
// SSH: git@host:Org/Repo.git or HTTPS: https://host/Org/Repo.git
|
||||
if (preg_match('#[/:]([^/]+)/([^/]+?)(?:\.git)?$#', $remoteUrl, $m)) {
|
||||
return [$m[1], $m[2]];
|
||||
}
|
||||
}
|
||||
|
||||
return ['', basename($root)];
|
||||
}
|
||||
|
||||
// ── Backward-compatible aliases ──────────────────────────────────────
|
||||
|
||||
/**
|
||||
* Add hyphenated aliases for underscore fields (backward compat with old manifest.xml consumers).
|
||||
* Also map old field names to new ones.
|
||||
*/
|
||||
private function addAliases(array $fields): array
|
||||
{
|
||||
// Map API field names → old manifest.xml hyphenated names
|
||||
$aliases = [
|
||||
'display_name' => 'display-name',
|
||||
'license_spdx' => 'license-spdx',
|
||||
'license_name' => 'license',
|
||||
'standards_version' => 'standards-version',
|
||||
'standards_source' => 'standards-source',
|
||||
'extension_type' => 'package-type',
|
||||
'entry_point' => 'entry-point',
|
||||
'element_name' => 'name',
|
||||
];
|
||||
|
||||
foreach ($aliases as $newKey => $oldKey) {
|
||||
if (isset($fields[$newKey]) && !isset($fields[$oldKey])) {
|
||||
$fields[$oldKey] = $fields[$newKey];
|
||||
}
|
||||
}
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
// ── Output ───────────────────────────────────────────────────────────
|
||||
|
||||
private function outputFields(array $fields, string $mode, string $field): int
|
||||
{
|
||||
switch ($mode) {
|
||||
case 'field':
|
||||
if ($field === '') {
|
||||
$this->log('ERROR', "Usage: manifest_read.php --path <dir> --field <name>");
|
||||
$this->log('ERROR', " manifest_read.php --path <dir> --all");
|
||||
$this->log('ERROR', " manifest_read.php --path <dir> --json");
|
||||
$this->log('ERROR', " manifest_read.php --path <dir> --github-output");
|
||||
$this->log('ERROR', "Usage: manifest:read --path <dir> --field <name>");
|
||||
$this->log('ERROR', " manifest:read --path <dir> --all");
|
||||
$this->log('ERROR', " manifest:read --path <dir> --json");
|
||||
$this->log('ERROR', " manifest:read --path <dir> --github-output");
|
||||
return 2;
|
||||
}
|
||||
echo ($fields[$field] ?? '') . "\n";
|
||||
@@ -142,22 +447,21 @@ class ManifestReadCli extends CliFramework
|
||||
break;
|
||||
|
||||
case 'github-output':
|
||||
$outputFile = getenv('GITHUB_OUTPUT');
|
||||
if ($outputFile === false || $outputFile === '') {
|
||||
$this->log('ERROR', 'GITHUB_OUTPUT not set — printing to stdout instead');
|
||||
foreach ($fields as $k => $v) {
|
||||
// Convert field-name to FIELD_NAME for env var style
|
||||
$envKey = str_replace('-', '_', $k);
|
||||
echo "{$envKey}={$v}\n";
|
||||
}
|
||||
$outputFile = getenv('GITHUB_OUTPUT') ?: getenv('GITEA_OUTPUT') ?: '';
|
||||
$lines = [];
|
||||
foreach ($fields as $k => $v) {
|
||||
$envKey = str_replace('-', '_', $k);
|
||||
$lines[$envKey] = "{$envKey}={$v}\n";
|
||||
}
|
||||
// Deduplicate (aliases may collide after underscore conversion)
|
||||
$output = implode('', $lines);
|
||||
|
||||
if ($outputFile === '') {
|
||||
$this->log('WARNING', 'GITHUB_OUTPUT not set — printing to stdout');
|
||||
echo $output;
|
||||
} else {
|
||||
$fh = fopen($outputFile, 'a');
|
||||
foreach ($fields as $k => $v) {
|
||||
$envKey = str_replace('-', '_', $k);
|
||||
fwrite($fh, "{$envKey}={$v}\n");
|
||||
}
|
||||
fclose($fh);
|
||||
$this->log('INFO', "Wrote " . count($fields) . " fields to GITHUB_OUTPUT");
|
||||
file_put_contents($outputFile, $output, FILE_APPEND);
|
||||
$this->log('INFO', "Wrote " . count($lines) . " fields to GITHUB_OUTPUT");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class PackageBuildCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class PlatformDetectCli extends CliFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleaseCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleaseBodyUpdateCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleaseCascadeCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class ReleaseCreateCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleaseManageCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleaseMirrorCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleaseNotesCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class ReleasePackageCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class ReleasePromoteCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleasePublishCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class ReleaseValidateCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ReleaseVerifyCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class ScaffoldClientCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -20,9 +20,9 @@ declare(strict_types=1);
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoEnterprise\Config;
|
||||
use MokoEnterprise\PlatformAdapterFactory;
|
||||
use MokoCli\CliFramework;
|
||||
use MokoCli\Config;
|
||||
use MokoCli\PlatformAdapterFactory;
|
||||
|
||||
class SyncRulesetsCli extends CliFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class ThemeLintCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class UpdatesXmlBuildCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class UpdatesXmlSyncCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class VersionAutoBumpCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class VersionBumpCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class VersionBumpRemoteCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class VersionCheckCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class VersionReadCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class VersionResetDevCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\{CliFramework, SourceResolver};
|
||||
use MokoCli\{CliFramework, SourceResolver};
|
||||
|
||||
class VersionSetPlatformCli extends CliFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class WikiSyncCli extends CliFramework
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||
|
||||
use MokoEnterprise\CliFramework;
|
||||
use MokoCli\CliFramework;
|
||||
|
||||
class WorkflowSyncCli extends CliFramework
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user