Public Access
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c31771037 | |||
| 8de72a386d | |||
| 05aafbac61 | |||
| 3c57e87066 | |||
| e37443774b | |||
| e6b9a3b4f6 | |||
| d0200c28f0 | |||
| 1f946c0b75 | |||
| d4e2d36301 | |||
| a2c1a61759 |
@@ -5,7 +5,7 @@
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: mokoplatform.Automation
|
# INGROUP: mokoplatform.Automation
|
||||||
# VERSION: 09.26.00
|
# VERSION: 09.29.00
|
||||||
# BRIEF: Auto-create feature branch when an issue is opened
|
# BRIEF: Auto-create feature branch when an issue is opened
|
||||||
|
|
||||||
name: "Universal: Issue Branch"
|
name: "Universal: Issue Branch"
|
||||||
|
|||||||
+6
-16
@@ -12,6 +12,12 @@ BRIEF: Release changelog
|
|||||||
# Changelog
|
# Changelog
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [09.29.00] --- 2026-06-09
|
||||||
|
|
||||||
|
## [09.28.00] --- 2026-06-07
|
||||||
|
|
||||||
|
## [09.27.00] --- 2026-06-07
|
||||||
|
|
||||||
## [09.26.00] --- 2026-06-07
|
## [09.26.00] --- 2026-06-07
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -35,19 +41,3 @@ BRIEF: Release changelog
|
|||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- `mcp/servers/mokowaas_api/` — consolidated into mcp-mokowaas-api repo
|
- `mcp/servers/mokowaas_api/` — consolidated into mcp-mokowaas-api repo
|
||||||
|
|
||||||
## [09.25.00] --- 2026-06-04
|
|
||||||
|
|
||||||
## [09.23] --- 2026-05-31
|
|
||||||
|
|
||||||
## [09.22] --- 2026-05-31
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- **refactor(cli):** migrate 64 legacy scripts to CliFramework (#235) — all tools in cli/, automation/, maintenance/, deploy/, release/ now extend CliFramework with free --help, --verbose, --quiet, --dry-run, --json, banners, and coloured logging
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- fix: auto-detect org/repo in updates_xml_build from manifest and git remote
|
|
||||||
- fix: restore hyphen in version suffixes
|
|
||||||
- fix: release names use standardized format
|
|
||||||
- fix: remove lesser stream copies, each stream updates independently
|
|
||||||
- fix: sort updates.xml entries dev first, stable last
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ DEFGROUP: MokoPlatform.Root
|
|||||||
INGROUP: MokoPlatform
|
INGROUP: MokoPlatform
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
PATH: /README.md
|
PATH: /README.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Project overview and documentation
|
BRIEF: Project overview and documentation
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/branch_rename.php
|
* PATH: /cli/branch_rename.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Rename a git branch via Gitea API (create new, update PR, delete old)
|
* BRIEF: Rename a git branch via Gitea API (create new, update PR, delete old)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/bulk_workflow_push.php
|
* PATH: /cli/bulk_workflow_push.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Push a workflow file to all governed repos via the Gitea Contents API
|
* BRIEF: Push a workflow file to all governed repos via the Gitea Contents API
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/bulk_workflow_trigger.php
|
* PATH: /cli/bulk_workflow_trigger.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Trigger a workflow across multiple repos at once
|
* BRIEF: Trigger a workflow across multiple repos at once
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/client_dashboard.php
|
* PATH: /cli/client_dashboard.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Generate unified client dashboard HTML
|
* BRIEF: Generate unified client dashboard HTML
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/client_inventory.php
|
* PATH: /cli/client_inventory.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Discover and list all client-waas repos with their server configuration status
|
* BRIEF: Discover and list all client-waas repos with their server configuration status
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/client_provision.php
|
* PATH: /cli/client_provision.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Provision a new client environment end-to-end
|
* BRIEF: Provision a new client environment end-to-end
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/grafana_dashboard.php
|
* PATH: /cli/grafana_dashboard.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Manage Grafana dashboards via API
|
* BRIEF: Manage Grafana dashboards via API
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/joomla_build.php
|
* PATH: /cli/joomla_build.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Build a Joomla extension ZIP from manifest — all types supported
|
* BRIEF: Build a Joomla extension ZIP from manifest — all types supported
|
||||||
* NOTE: Called by pre-release and auto-release workflows.
|
* NOTE: Called by pre-release and auto-release workflows.
|
||||||
*/
|
*/
|
||||||
|
|||||||
+44
-11
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/manifest_detect.php
|
* PATH: /cli/manifest_detect.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Auto-detect manifest fields from source files and optionally push to API
|
* BRIEF: Auto-detect manifest fields from source files and optionally push to API
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -161,15 +161,18 @@ class ManifestDetectCli extends CliFramework
|
|||||||
$platform = $this->detectPlatform($root);
|
$platform = $this->detectPlatform($root);
|
||||||
|
|
||||||
$fields = [
|
$fields = [
|
||||||
'platform' => $platform,
|
'platform' => $platform,
|
||||||
'name' => '',
|
'name' => '',
|
||||||
'description' => '',
|
'description' => '',
|
||||||
'version' => '',
|
'version' => '',
|
||||||
'element_name' => '',
|
'element_name' => '',
|
||||||
'package_type' => '',
|
'package_type' => '',
|
||||||
'language' => '',
|
'language' => '',
|
||||||
'entry_point' => '',
|
'entry_point' => '',
|
||||||
'license_spdx' => '',
|
'license_spdx' => '',
|
||||||
|
'display_name' => '',
|
||||||
|
'target_version' => '',
|
||||||
|
'php_minimum' => '',
|
||||||
];
|
];
|
||||||
|
|
||||||
switch ($platform) {
|
switch ($platform) {
|
||||||
@@ -316,7 +319,13 @@ class ManifestDetectCli extends CliFramework
|
|||||||
];
|
];
|
||||||
if (isset($prefixMap[$extType])) {
|
if (isset($prefixMap[$extType])) {
|
||||||
$prefix = $prefixMap[$extType];
|
$prefix = $prefixMap[$extType];
|
||||||
if (strpos($element, $prefix) !== 0 && strpos($element, '_') === false) {
|
// Only add prefix if not already present (check all known prefixes)
|
||||||
|
$hasPrefix = false;
|
||||||
|
foreach ($prefixMap as $p) {
|
||||||
|
if (strpos($element, $p) === 0) { $hasPrefix = true; break; }
|
||||||
|
}
|
||||||
|
if (strpos($element, 'plg_') === 0) { $hasPrefix = true; }
|
||||||
|
if (!$hasPrefix) {
|
||||||
$element = $prefix . $element;
|
$element = $prefix . $element;
|
||||||
}
|
}
|
||||||
} elseif ($extType === 'plugin') {
|
} elseif ($extType === 'plugin') {
|
||||||
@@ -349,6 +358,30 @@ class ManifestDetectCli extends CliFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Display name for update feeds
|
||||||
|
if (!empty($fields['name'])) {
|
||||||
|
$name = $fields['name'];
|
||||||
|
// If name already has "Type - " prefix, use as-is
|
||||||
|
if (preg_match('/^(Package|Component|Module|Plugin|Template|Library)\s*-\s*/i', $name)) {
|
||||||
|
$fields['display_name'] = $name;
|
||||||
|
} elseif (!empty($extType)) {
|
||||||
|
$fields['display_name'] = ucfirst($extType) . ' - ' . $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Target Joomla version
|
||||||
|
if (preg_match('/<targetplatform\s[^>]*version="([^"]+)"/', $xml, $m)) {
|
||||||
|
$fields['target_version'] = trim($m[1]);
|
||||||
|
} else {
|
||||||
|
// Default for Joomla 5/6
|
||||||
|
$fields['target_version'] = '(5|6)\..*';
|
||||||
|
}
|
||||||
|
|
||||||
|
// PHP minimum
|
||||||
|
if (preg_match('/<php_minimum>([^<]+)<\/php_minimum>/', $xml, $m)) {
|
||||||
|
$fields['php_minimum'] = trim($m[1]);
|
||||||
|
}
|
||||||
|
|
||||||
// License
|
// License
|
||||||
if (preg_match('/<license>([^<]+)<\/license>/', $xml, $m)) {
|
if (preg_match('/<license>([^<]+)<\/license>/', $xml, $m)) {
|
||||||
$fields['license_spdx'] = $this->normalizeLicense(trim($m[1]));
|
$fields['license_spdx'] = $this->normalizeLicense(trim($m[1]));
|
||||||
|
|||||||
@@ -0,0 +1,564 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*
|
||||||
|
* FILE INFORMATION
|
||||||
|
* DEFGROUP: mokoplatform.CLI
|
||||||
|
* INGROUP: mokoplatform
|
||||||
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
|
* PATH: /cli/manifest_integrity.php
|
||||||
|
* VERSION: 09.29.00
|
||||||
|
* BRIEF: Cross-check manifest API fields against repo contents across the org
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../lib/Enterprise/CliFramework.php';
|
||||||
|
|
||||||
|
use MokoEnterprise\CliFramework;
|
||||||
|
|
||||||
|
class ManifestIntegrityCli extends CliFramework
|
||||||
|
{
|
||||||
|
protected function configure(): void
|
||||||
|
{
|
||||||
|
$this->setDescription('Cross-check manifest fields against repo contents across the org');
|
||||||
|
$this->addArgument('--path', 'Single repo path (local mode)', '');
|
||||||
|
$this->addArgument('--org', 'Gitea org (bulk mode)', 'MokoConsulting');
|
||||||
|
$this->addArgument('--repo', 'Single repo name (remote mode)', '');
|
||||||
|
$this->addArgument('--token', 'Gitea API token (or GITEA_TOKEN env)', '');
|
||||||
|
$this->addArgument('--api-base', 'Gitea API base URL', 'https://git.mokoconsulting.tech/api/v1');
|
||||||
|
$this->addArgument('--fix', 'Push fixes for detected drift', false);
|
||||||
|
$this->addArgument('--json', 'Output as JSON', false);
|
||||||
|
$this->addArgument('--quiet', 'Only show repos with issues', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function run(): int
|
||||||
|
{
|
||||||
|
$path = $this->getArgument('--path');
|
||||||
|
$org = $this->getArgument('--org');
|
||||||
|
$repoName = $this->getArgument('--repo');
|
||||||
|
$token = $this->getArgument('--token') ?: getenv('GITEA_TOKEN') ?: '';
|
||||||
|
$apiBase = rtrim($this->getArgument('--api-base'), '/');
|
||||||
|
$fixMode = (bool) $this->getArgument('--fix');
|
||||||
|
$jsonMode = (bool) $this->getArgument('--json');
|
||||||
|
$quiet = (bool) $this->getArgument('--quiet');
|
||||||
|
|
||||||
|
if ($token === '') {
|
||||||
|
$this->log('ERROR', 'API token required (use --token or GITEA_TOKEN env)');
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Mode selection ──────────────────────────────────────────
|
||||||
|
if ($path !== '') {
|
||||||
|
// Local mode: detect from source + compare to API
|
||||||
|
return $this->checkLocal($path, $org, $repoName, $token, $apiBase, $fixMode, $jsonMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($repoName !== '') {
|
||||||
|
// Single remote repo
|
||||||
|
return $this->checkRemoteRepo($org, $repoName, $token, $apiBase, $fixMode, $jsonMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bulk mode: all repos in org
|
||||||
|
return $this->checkOrg($org, $token, $apiBase, $fixMode, $jsonMode, $quiet);
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Local mode — detect from source, compare to API
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
private function checkLocal(string $path, string $org, string $repoName, string $token, string $apiBase, bool $fix, bool $json): int
|
||||||
|
{
|
||||||
|
$root = realpath($path) ?: $path;
|
||||||
|
if (!is_dir($root)) {
|
||||||
|
$this->log('ERROR', "Path does not exist: {$path}");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($repoName === '') {
|
||||||
|
$repoName = $this->detectRepoName($root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run manifest_detect logic
|
||||||
|
$detected = $this->runDetect($root, $repoName);
|
||||||
|
$current = $this->fetchManifest($apiBase, $org, $repoName, $token);
|
||||||
|
|
||||||
|
if ($current === null) {
|
||||||
|
$this->log('ERROR', "Failed to fetch manifest for {$org}/{$repoName}");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$issues = $this->validate($current, $detected, $repoName);
|
||||||
|
|
||||||
|
if ($json) {
|
||||||
|
echo json_encode(['repo' => $repoName, 'issues' => $issues], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
|
||||||
|
} else {
|
||||||
|
$this->printIssues($repoName, $issues);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($fix && !empty($issues)) {
|
||||||
|
return $this->applyFixes($apiBase, $org, $repoName, $token, $current, $issues);
|
||||||
|
}
|
||||||
|
|
||||||
|
return empty($issues) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Remote single repo mode — fetch source files via API
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
private function checkRemoteRepo(string $org, string $repoName, string $token, string $apiBase, bool $fix, bool $json): int
|
||||||
|
{
|
||||||
|
$current = $this->fetchManifest($apiBase, $org, $repoName, $token);
|
||||||
|
if ($current === null) {
|
||||||
|
$this->log('ERROR', "Failed to fetch manifest for {$org}/{$repoName}");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$issues = $this->validateManifestOnly($current, $repoName);
|
||||||
|
|
||||||
|
if ($json) {
|
||||||
|
echo json_encode(['repo' => $repoName, 'issues' => $issues], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
|
||||||
|
} else {
|
||||||
|
$this->printIssues($repoName, $issues);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($fix && !empty($issues)) {
|
||||||
|
return $this->applyFixes($apiBase, $org, $repoName, $token, $current, $issues);
|
||||||
|
}
|
||||||
|
|
||||||
|
return empty($issues) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Bulk org mode — check all repos
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
private function checkOrg(string $org, string $token, string $apiBase, bool $fix, bool $json, bool $quiet): int
|
||||||
|
{
|
||||||
|
$repos = $this->fetchOrgRepos($apiBase, $org, $token);
|
||||||
|
if ($repos === null) {
|
||||||
|
$this->log('ERROR', "Failed to fetch repos for org {$org}");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->log('INFO', "Manifest Integrity Check — {$org} (" . count($repos) . " repos)");
|
||||||
|
|
||||||
|
$allResults = [];
|
||||||
|
$totalIssues = 0;
|
||||||
|
$reposWithIssues = 0;
|
||||||
|
|
||||||
|
foreach ($repos as $repo) {
|
||||||
|
$name = $repo['name'];
|
||||||
|
$manifest = $this->fetchManifest($apiBase, $org, $name, $token);
|
||||||
|
|
||||||
|
if ($manifest === null) {
|
||||||
|
if (!$quiet) {
|
||||||
|
$this->log('WARN', "{$name}: no manifest");
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$issues = $this->validateManifestOnly($manifest, $name);
|
||||||
|
|
||||||
|
if (!empty($issues)) {
|
||||||
|
$reposWithIssues++;
|
||||||
|
$totalIssues += count($issues);
|
||||||
|
|
||||||
|
if ($json) {
|
||||||
|
$allResults[] = ['repo' => $name, 'issues' => $issues];
|
||||||
|
} else {
|
||||||
|
$this->printIssues($name, $issues);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($fix) {
|
||||||
|
$this->applyFixes($apiBase, $org, $name, $token, $manifest, $issues);
|
||||||
|
}
|
||||||
|
} elseif (!$quiet && !$json) {
|
||||||
|
$this->log('OK', "{$name}: clean");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($json) {
|
||||||
|
echo json_encode($allResults, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
|
||||||
|
} else {
|
||||||
|
echo "\n";
|
||||||
|
$level = $reposWithIssues > 0 ? 'WARN' : 'OK';
|
||||||
|
$this->log($level, sprintf(
|
||||||
|
'Summary: %d repos checked, %d with issues (%d total issues)',
|
||||||
|
count($repos),
|
||||||
|
$reposWithIssues,
|
||||||
|
$totalIssues
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $reposWithIssues > 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Validation rules
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Full validation: compare API manifest against locally-detected fields.
|
||||||
|
*/
|
||||||
|
private function validate(array $current, array $detected, string $repoName): array
|
||||||
|
{
|
||||||
|
$issues = [];
|
||||||
|
|
||||||
|
// Required fields that should never be empty
|
||||||
|
$required = ['platform', 'name', 'version', 'package_type', 'language', 'entry_point'];
|
||||||
|
foreach ($required as $field) {
|
||||||
|
if (empty($current[$field])) {
|
||||||
|
$fix = $detected[$field] ?? null;
|
||||||
|
$issues[] = [
|
||||||
|
'field' => $field,
|
||||||
|
'severity' => 'error',
|
||||||
|
'message' => 'Missing required field',
|
||||||
|
'current' => '',
|
||||||
|
'fix' => $fix,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Drift detection: detected value differs from API
|
||||||
|
foreach ($detected as $field => $detectedValue) {
|
||||||
|
$currentValue = $current[$field] ?? '';
|
||||||
|
if ($detectedValue !== '' && $currentValue !== '' && $detectedValue !== $currentValue) {
|
||||||
|
// Version drift is expected on dev branches (suffix)
|
||||||
|
if ($field === 'version' && strpos($detectedValue, $currentValue) === 0) {
|
||||||
|
continue; // e.g., detected "02.34.50-dev" vs API "02.34.50"
|
||||||
|
}
|
||||||
|
if ($field === 'version' && strpos($currentValue, $detectedValue) === 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$issues[] = [
|
||||||
|
'field' => $field,
|
||||||
|
'severity' => 'warn',
|
||||||
|
'message' => 'Drift: source differs from manifest',
|
||||||
|
'current' => $currentValue,
|
||||||
|
'fix' => $detectedValue,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Platform-specific structure validation
|
||||||
|
$platform = $current['platform'] ?? '';
|
||||||
|
$issues = array_merge($issues, $this->validatePlatformStructure($platform, $current, $repoName));
|
||||||
|
|
||||||
|
return $issues;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API-only validation: check manifest fields for completeness and consistency
|
||||||
|
* without access to source files.
|
||||||
|
*/
|
||||||
|
private function validateManifestOnly(array $manifest, string $repoName): array
|
||||||
|
{
|
||||||
|
$issues = [];
|
||||||
|
|
||||||
|
// Required fields
|
||||||
|
$required = ['platform', 'name', 'version', 'language'];
|
||||||
|
foreach ($required as $field) {
|
||||||
|
if (empty($manifest[$field])) {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => $field,
|
||||||
|
'severity' => 'error',
|
||||||
|
'message' => 'Missing required field',
|
||||||
|
'current' => '',
|
||||||
|
'fix' => null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recommended fields
|
||||||
|
$recommended = ['package_type', 'entry_point', 'license_spdx', 'description'];
|
||||||
|
foreach ($recommended as $field) {
|
||||||
|
if (empty($manifest[$field])) {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => $field,
|
||||||
|
'severity' => 'info',
|
||||||
|
'message' => 'Recommended field is empty',
|
||||||
|
'current' => '',
|
||||||
|
'fix' => null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Platform-specific checks
|
||||||
|
$platform = $manifest['platform'] ?? '';
|
||||||
|
$issues = array_merge($issues, $this->validatePlatformStructure($platform, $manifest, $repoName));
|
||||||
|
|
||||||
|
return $issues;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Platform-specific validation rules.
|
||||||
|
*/
|
||||||
|
private function validatePlatformStructure(string $platform, array $manifest, string $repoName): array
|
||||||
|
{
|
||||||
|
$issues = [];
|
||||||
|
|
||||||
|
switch ($platform) {
|
||||||
|
case 'joomla':
|
||||||
|
case 'waas-component':
|
||||||
|
// Joomla repos must have element_name
|
||||||
|
if (empty($manifest['element_name'])) {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => 'element_name',
|
||||||
|
'severity' => 'error',
|
||||||
|
'message' => 'Joomla repos require element_name',
|
||||||
|
'current' => '',
|
||||||
|
'fix' => null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// Language should be PHP
|
||||||
|
if (!empty($manifest['language']) && $manifest['language'] !== 'PHP') {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => 'language',
|
||||||
|
'severity' => 'warn',
|
||||||
|
'message' => 'Joomla repos should have language=PHP',
|
||||||
|
'current' => $manifest['language'],
|
||||||
|
'fix' => 'PHP',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'dolibarr':
|
||||||
|
case 'crm-module':
|
||||||
|
if (!empty($manifest['language']) && $manifest['language'] !== 'PHP') {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => 'language',
|
||||||
|
'severity' => 'warn',
|
||||||
|
'message' => 'Dolibarr repos should have language=PHP',
|
||||||
|
'current' => $manifest['language'],
|
||||||
|
'fix' => 'PHP',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'go':
|
||||||
|
if (!empty($manifest['language']) && $manifest['language'] !== 'Go') {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => 'language',
|
||||||
|
'severity' => 'warn',
|
||||||
|
'message' => 'Go repos should have language=Go',
|
||||||
|
'current' => $manifest['language'],
|
||||||
|
'fix' => 'Go',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'mcp':
|
||||||
|
if (!empty($manifest['language']) && !in_array($manifest['language'], ['TypeScript', 'JavaScript'], true)) {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => 'language',
|
||||||
|
'severity' => 'warn',
|
||||||
|
'message' => 'MCP repos should have language=TypeScript or JavaScript',
|
||||||
|
'current' => $manifest['language'],
|
||||||
|
'fix' => null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Version format check: should be XX.YY.ZZ
|
||||||
|
$version = $manifest['version'] ?? '';
|
||||||
|
if ($version !== '' && !preg_match('/^\d{2}\.\d{2}\.\d{2}/', $version)) {
|
||||||
|
// Allow semver for node/go repos
|
||||||
|
if (!in_array($platform, ['mcp', 'node', 'go'], true)) {
|
||||||
|
$issues[] = [
|
||||||
|
'field' => 'version',
|
||||||
|
'severity' => 'info',
|
||||||
|
'message' => 'Version does not match XX.YY.ZZ format',
|
||||||
|
'current' => $version,
|
||||||
|
'fix' => null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $issues;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Output
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
private function printIssues(string $repoName, array $issues): void
|
||||||
|
{
|
||||||
|
if (empty($issues)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$errors = count(array_filter($issues, fn($i) => $i['severity'] === 'error'));
|
||||||
|
$warns = count(array_filter($issues, fn($i) => $i['severity'] === 'warn'));
|
||||||
|
$infos = count($issues) - $errors - $warns;
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
$summary = [];
|
||||||
|
if ($errors > 0) $summary[] = "{$errors} error(s)";
|
||||||
|
if ($warns > 0) $summary[] = "{$warns} warning(s)";
|
||||||
|
if ($infos > 0) $summary[] = "{$infos} info";
|
||||||
|
$this->log($errors > 0 ? 'ERROR' : 'WARN', "{$repoName} — " . implode(', ', $summary));
|
||||||
|
|
||||||
|
foreach ($issues as $issue) {
|
||||||
|
$icon = match ($issue['severity']) {
|
||||||
|
'error' => 'ERROR',
|
||||||
|
'warn' => 'WARN',
|
||||||
|
default => 'INFO',
|
||||||
|
};
|
||||||
|
$msg = sprintf(' %-18s %s', $issue['field'], $issue['message']);
|
||||||
|
if ($issue['current'] !== '') {
|
||||||
|
$msg .= " (current: {$issue['current']})";
|
||||||
|
}
|
||||||
|
if ($issue['fix'] !== null) {
|
||||||
|
$msg .= " → fix: {$issue['fix']}";
|
||||||
|
}
|
||||||
|
$this->log($icon, $msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Fix application
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
private function applyFixes(string $apiBase, string $org, string $repo, string $token, array $current, array $issues): int
|
||||||
|
{
|
||||||
|
$fixes = [];
|
||||||
|
foreach ($issues as $issue) {
|
||||||
|
if ($issue['fix'] !== null && $issue['fix'] !== '') {
|
||||||
|
$fixes[$issue['field']] = $issue['fix'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($fixes)) {
|
||||||
|
$this->log('INFO', "{$repo}: no auto-fixable issues");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$merged = array_merge($current, $fixes);
|
||||||
|
$url = "{$apiBase}/repos/{$org}/{$repo}/manifest";
|
||||||
|
$payload = json_encode($merged);
|
||||||
|
|
||||||
|
$ctx = stream_context_create([
|
||||||
|
'http' => [
|
||||||
|
'method' => 'PUT',
|
||||||
|
'header' => "Authorization: token {$token}\r\nContent-Type: application/json\r\nAccept: application/json\r\n",
|
||||||
|
'content' => $payload,
|
||||||
|
'timeout' => 10,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$body = @file_get_contents($url, false, $ctx);
|
||||||
|
if ($body === false) {
|
||||||
|
$this->log('ERROR', "{$repo}: failed to push fixes");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->log('OK', "{$repo}: fixed " . implode(', ', array_keys($fixes)));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// API helpers
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
private function fetchManifest(string $apiBase, string $org, string $repo, string $token): ?array
|
||||||
|
{
|
||||||
|
$url = "{$apiBase}/repos/{$org}/{$repo}/manifest";
|
||||||
|
$ctx = stream_context_create([
|
||||||
|
'http' => [
|
||||||
|
'header' => "Authorization: token {$token}\r\nAccept: application/json\r\n",
|
||||||
|
'timeout' => 10,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$body = @file_get_contents($url, false, $ctx);
|
||||||
|
if ($body === false) return null;
|
||||||
|
|
||||||
|
$data = json_decode($body, true);
|
||||||
|
return is_array($data) ? $data : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function fetchOrgRepos(string $apiBase, string $org, string $token): ?array
|
||||||
|
{
|
||||||
|
$allRepos = [];
|
||||||
|
$page = 1;
|
||||||
|
$limit = 50;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
$url = "{$apiBase}/orgs/{$org}/repos?page={$page}&limit={$limit}";
|
||||||
|
$ctx = stream_context_create([
|
||||||
|
'http' => [
|
||||||
|
'header' => "Authorization: token {$token}\r\nAccept: application/json\r\n",
|
||||||
|
'timeout' => 15,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$body = @file_get_contents($url, false, $ctx);
|
||||||
|
if ($body === false) return null;
|
||||||
|
|
||||||
|
$repos = json_decode($body, true);
|
||||||
|
if (!is_array($repos) || empty($repos)) break;
|
||||||
|
|
||||||
|
$allRepos = array_merge($allRepos, $repos);
|
||||||
|
|
||||||
|
if (count($repos) < $limit) break;
|
||||||
|
$page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter out archived and empty repos
|
||||||
|
return array_filter($allRepos, fn($r) => !($r['archived'] ?? false) && !($r['empty'] ?? false));
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Detection (delegates to manifest_detect logic)
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
private function runDetect(string $root, string $repoName): array
|
||||||
|
{
|
||||||
|
$script = __DIR__ . '/manifest_detect.php';
|
||||||
|
$redirect = PHP_OS_FAMILY === 'Windows' ? '2>NUL' : '2>/dev/null';
|
||||||
|
$cmd = sprintf(
|
||||||
|
'php %s --path %s --repo %s --json --quiet %s',
|
||||||
|
escapeshellarg($script),
|
||||||
|
escapeshellarg($root),
|
||||||
|
escapeshellarg($repoName),
|
||||||
|
$redirect
|
||||||
|
);
|
||||||
|
|
||||||
|
$output = shell_exec($cmd) ?? '';
|
||||||
|
|
||||||
|
// Extract JSON object from output (skip banner/log lines)
|
||||||
|
if (preg_match('/\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}/s', $output, $m)) {
|
||||||
|
$data = json_decode($m[0], true);
|
||||||
|
if (is_array($data)) {
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function detectRepoName(string $root): string
|
||||||
|
{
|
||||||
|
$gitConfig = "{$root}/.git/config";
|
||||||
|
if (!file_exists($gitConfig)) {
|
||||||
|
return basename($root);
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = file_get_contents($gitConfig);
|
||||||
|
if (preg_match('/url\s*=\s*.*\/([^\/\s]+?)(?:\.git)?\s*$/m', $content, $m)) {
|
||||||
|
return $m[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return basename($root);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$app = new ManifestIntegrityCli();
|
||||||
|
exit($app->execute());
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/manifest_licensing.php
|
* PATH: /cli/manifest_licensing.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Ensure licensing tags (updateservers, dlid) in Joomla extension manifests
|
* BRIEF: Ensure licensing tags (updateservers, dlid) in Joomla extension manifests
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/manifest_read.php
|
* PATH: /cli/manifest_read.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Parse .manifest.xml and output requested field(s) for CI consumption
|
* BRIEF: Parse .manifest.xml and output requested field(s) for CI consumption
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/platform_detect.php
|
* PATH: /cli/platform_detect.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Auto-detect repository platform type and optionally update manifest
|
* BRIEF: Auto-detect repository platform type and optionally update manifest
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/release_cascade.php
|
* PATH: /cli/release_cascade.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: DEPRECATED — cascade behavior removed. Each release stream is independent.
|
* BRIEF: DEPRECATED — cascade behavior removed. Each release stream is independent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/release_publish.php
|
* PATH: /cli/release_publish.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Publish a release and create copies for all lesser stability streams.
|
* BRIEF: Publish a release and create copies for all lesser stability streams.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/scaffold_client.php
|
* PATH: /cli/scaffold_client.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Scaffold a new client-waas repo from Template-Client-WaaS with pre-configured settings
|
* BRIEF: Scaffold a new client-waas repo from Template-Client-WaaS with pre-configured settings
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/updates_xml_sync.php
|
* PATH: /cli/updates_xml_sync.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Sync updates.xml to target branches via Gitea API
|
* BRIEF: Sync updates.xml to target branches via Gitea API
|
||||||
* NOTE: Called by pre-release and auto-release workflows after updates.xml
|
* NOTE: Called by pre-release and auto-release workflows after updates.xml
|
||||||
* is modified on the current branch. Pushes the file to other branches
|
* is modified on the current branch. Pushes the file to other branches
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/version_auto_bump.php
|
* PATH: /cli/version_auto_bump.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Auto patch-bump, set stability suffix, and commit — single CLI replacing inline workflow bash
|
* BRIEF: Auto patch-bump, set stability suffix, and commit — single CLI replacing inline workflow bash
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
+17
-1
@@ -232,9 +232,25 @@ class VersionBumpCli extends CliFramework
|
|||||||
$pkgContent
|
$pkgContent
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if ($updatedPkg !== $pkgContent) {
|
if ($updatedPkg !== $pkgContent && $updatedPkg !== null) {
|
||||||
file_put_contents($packageJsonFile, $updatedPkg);
|
file_put_contents($packageJsonFile, $updatedPkg);
|
||||||
fwrite(STDERR, "Updated package.json\n");
|
fwrite(STDERR, "Updated package.json\n");
|
||||||
|
} elseif (preg_match('/("version"\s*:\s*")(\d+)\.(\d+)\.(\d+)(")/m', $pkgContent, $semM)) {
|
||||||
|
// Semver fallback: bump standard x.y.z version when XX.YY.ZZ pattern didn't match
|
||||||
|
$sMajor = (int)$semM[2];
|
||||||
|
$sMinor = (int)$semM[3];
|
||||||
|
$sPatch = (int)$semM[4];
|
||||||
|
switch ($type) {
|
||||||
|
case 'major': $sMajor++; $sMinor = 0; $sPatch = 0; break;
|
||||||
|
case 'minor': $sMinor++; $sPatch = 0; break;
|
||||||
|
default: $sPatch++; break;
|
||||||
|
}
|
||||||
|
$semNew = "{$sMajor}.{$sMinor}.{$sPatch}";
|
||||||
|
$semUpdated = preg_replace('/("version"\s*:\s*")\d+\.\d+\.\d+(")/m', '${1}' . $semNew . '${2}', $pkgContent);
|
||||||
|
if ($semUpdated !== $pkgContent) {
|
||||||
|
file_put_contents($packageJsonFile, $semUpdated);
|
||||||
|
fwrite(STDERR, "Updated package.json (semver: {$semM[2]}.{$semM[3]}.{$semM[4]} -> $semNew)\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$pyprojectFile = "{$root}/pyproject.toml";
|
$pyprojectFile = "{$root}/pyproject.toml";
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/version_check.php
|
* PATH: /cli/version_check.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Validate version consistency across README, manifests, and sub-packages
|
* BRIEF: Validate version consistency across README, manifests, and sub-packages
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: mokoplatform
|
* INGROUP: mokoplatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /cli/wiki_sync.php
|
* PATH: /cli/wiki_sync.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Sync select wiki pages from mokoplatform to all template repos
|
* BRIEF: Sync select wiki pages from mokoplatform to all template repos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: moko-platform
|
* INGROUP: moko-platform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
|
||||||
* PATH: /cli/workflow_sync.php
|
* PATH: /cli/workflow_sync.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Sync workflows from Generic → platform templates → live repos based on manifest.platform
|
* BRIEF: Sync workflows from Generic → platform templates → live repos based on manifest.platform
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: MokoPlatform
|
* INGROUP: MokoPlatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /deploy/backup-before-deploy.php
|
* PATH: /deploy/backup-before-deploy.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Snapshot Joomla directories before deployment for rollback capability
|
* BRIEF: Snapshot Joomla directories before deployment for rollback capability
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: MokoPlatform
|
* INGROUP: MokoPlatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /deploy/deploy-dolibarr.php
|
* PATH: /deploy/deploy-dolibarr.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Deploy Dolibarr module files to a remote server via SFTP/rsync
|
* BRIEF: Deploy Dolibarr module files to a remote server via SFTP/rsync
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: MokoPlatform
|
* INGROUP: MokoPlatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /deploy/health-check.php
|
* PATH: /deploy/health-check.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Post-deploy health check — verify a Joomla site is responding correctly
|
* BRIEF: Post-deploy health check — verify a Joomla site is responding correctly
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: MokoPlatform
|
* INGROUP: MokoPlatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /deploy/rollback-joomla.php
|
* PATH: /deploy/rollback-joomla.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Rollback a Joomla deployment by restoring from a pre-deploy snapshot
|
* BRIEF: Rollback a Joomla deployment by restoring from a pre-deploy snapshot
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: MokoPlatform
|
* INGROUP: MokoPlatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /deploy/sync-joomla.php
|
* PATH: /deploy/sync-joomla.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Sync Joomla site directories between two servers via rsync over SSH
|
* BRIEF: Sync Joomla site directories between two servers via rsync over SSH
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ src/
|
|||||||
├── config.ts # Loads ~/.mcp_mokobackup.json, resolves targets
|
├── config.ts # Loads ~/.mcp_mokobackup.json, resolves targets
|
||||||
├── client.ts # Backup execution logic
|
├── client.ts # Backup execution logic
|
||||||
├── akeeba.ts # Akeeba Backup API integration (Joomla sites)
|
├── akeeba.ts # Akeeba Backup API integration (Joomla sites)
|
||||||
├── mokobackup.ts # MokoJoomBackup REST API integration
|
├── mokobackup.ts # MokoSuite Backup REST API integration
|
||||||
└── types.ts # BackupConfig, BackupTarget types
|
└── types.ts # BackupConfig, BackupTarget types
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import type { BackupTarget, BackupResult, AkeebaBackupRecord } from './types.js'
|
|||||||
const TIMEOUT_MS = 300_000; // 5 min for backup operations
|
const TIMEOUT_MS = 300_000; // 5 min for backup operations
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MokoJoomBackup client using Joomla Web Services API
|
* MokoSuite Backup client using Joomla Web Services API
|
||||||
* Endpoint: /api/index.php/v1/mokobackup/*
|
* Endpoint: /api/index.php/v1/mokobackup/*
|
||||||
* Auth: Bearer token (Joomla API token)
|
* Auth: Bearer token (Joomla API token)
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP: dolibarr-api-mcp.Documentation
|
DEFGROUP: dolibarr-api-mcp.Documentation
|
||||||
INGROUP: dolibarr-api-mcp
|
INGROUP: dolibarr-api-mcp
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/dolibarr-api-mcp
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/dolibarr-api-mcp
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CONTRIBUTING.md
|
PATH: ./CONTRIBUTING.md
|
||||||
BRIEF: Contribution guidelines for the project
|
BRIEF: Contribution guidelines for the project
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ DEFGROUP: dolibarr-api-mcp.Documentation
|
|||||||
INGROUP: dolibarr-api-mcp
|
INGROUP: dolibarr-api-mcp
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/dolibarr-api-mcp
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/dolibarr-api-mcp
|
||||||
PATH: /SECURITY.md
|
PATH: /SECURITY.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Security vulnerability reporting and handling policy
|
BRIEF: Security vulnerability reporting and handling policy
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP:
|
DEFGROUP:
|
||||||
INGROUP: Project.Documentation
|
INGROUP: Project.Documentation
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Generic
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Generic
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CONTRIBUTING.md
|
PATH: ./CONTRIBUTING.md
|
||||||
BRIEF: Contribution guidelines for the project
|
BRIEF: Contribution guidelines for the project
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ DEFGROUP: [PROJECT_NAME]
|
|||||||
INGROUP: [PROJECT_NAME].Documentation
|
INGROUP: [PROJECT_NAME].Documentation
|
||||||
REPO: [REPOSITORY_URL]
|
REPO: [REPOSITORY_URL]
|
||||||
PATH: /SECURITY.md
|
PATH: /SECURITY.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Security vulnerability reporting and handling policy
|
BRIEF: Security vulnerability reporting and handling policy
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: mokoplatform.Automation
|
# INGROUP: mokoplatform.Automation
|
||||||
# VERSION: 09.26.00
|
# VERSION: 09.29.00
|
||||||
# BRIEF: Auto-create feature branch when an issue is opened
|
# BRIEF: Auto-create feature branch when an issue is opened
|
||||||
|
|
||||||
name: "Universal: Issue Branch"
|
name: "Universal: Issue Branch"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP:
|
DEFGROUP:
|
||||||
INGROUP: Project.Documentation
|
INGROUP: Project.Documentation
|
||||||
REPO: mokoconsulting-tech/MokoStandards-Template-Generic
|
REPO: mokoconsulting-tech/MokoStandards-Template-Generic
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CODE_OF_CONDUCT.md
|
PATH: ./CODE_OF_CONDUCT.md
|
||||||
BRIEF: Contributor Covenant Code of Conduct version 1.3.0
|
BRIEF: Contributor Covenant Code of Conduct version 1.3.0
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP:
|
DEFGROUP:
|
||||||
INGROUP: Project.Documentation
|
INGROUP: Project.Documentation
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Generic
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Generic
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CONTRIBUTING.md
|
PATH: ./CONTRIBUTING.md
|
||||||
BRIEF: Contribution guidelines for the project
|
BRIEF: Contribution guidelines for the project
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: mokoplatform.Automation
|
# INGROUP: mokoplatform.Automation
|
||||||
# VERSION: 09.26.00
|
# VERSION: 09.29.00
|
||||||
# BRIEF: Auto-create feature branch when an issue is opened
|
# BRIEF: Auto-create feature branch when an issue is opened
|
||||||
|
|
||||||
name: "Universal: Issue Branch"
|
name: "Universal: Issue Branch"
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
DEFGROUP: mokoconsulting-tech.MokoStandards-Template-Dolibarr
|
DEFGROUP: mokoconsulting-tech.MokoStandards-Template-Dolibarr
|
||||||
INGROUP: MokoStandards.Governance
|
INGROUP: MokoStandards.Governance
|
||||||
REPO: https://github.com/mokoconsulting-tech/MokoStandards-Template-Dolibarr
|
REPO: https://github.com/mokoconsulting-tech/MokoStandards-Template-Dolibarr
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: /GOVERNANCE.md
|
PATH: /GOVERNANCE.md
|
||||||
BRIEF: Project governance rules, roles, and decision process for MokoStandards-Template-Dolibarr
|
BRIEF: Project governance rules, roles, and decision process for MokoStandards-Template-Dolibarr
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ DEFGROUP: MokoStandards-Template-Dolibarr.Documentation
|
|||||||
INGROUP: MokoStandards.Templates
|
INGROUP: MokoStandards.Templates
|
||||||
REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/MokoStandards-Template-Dolibarr
|
REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/MokoStandards-Template-Dolibarr
|
||||||
PATH: /docs/update-server.md
|
PATH: /docs/update-server.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: How this module's update server file (update.txt) is managed
|
BRIEF: How this module's update server file (update.txt) is managed
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: mokoplatform.Automation
|
# INGROUP: mokoplatform.Automation
|
||||||
# VERSION: 09.26.00
|
# VERSION: 09.29.00
|
||||||
# BRIEF: Auto-create feature branch when an issue is opened
|
# BRIEF: Auto-create feature branch when an issue is opened
|
||||||
|
|
||||||
name: "Universal: Issue Branch"
|
name: "Universal: Issue Branch"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP:
|
DEFGROUP:
|
||||||
INGROUP: Project.Documentation
|
INGROUP: Project.Documentation
|
||||||
REPO: mokoconsulting-tech/MokoStandards-Template-Generic
|
REPO: mokoconsulting-tech/MokoStandards-Template-Generic
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CODE_OF_CONDUCT.md
|
PATH: ./CODE_OF_CONDUCT.md
|
||||||
BRIEF: Contributor Covenant Code of Conduct version 1.3.0
|
BRIEF: Contributor Covenant Code of Conduct version 1.3.0
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ DEFGROUP: [PROJECT_NAME]
|
|||||||
INGROUP: [PROJECT_NAME].Documentation
|
INGROUP: [PROJECT_NAME].Documentation
|
||||||
REPO: [REPOSITORY_URL]
|
REPO: [REPOSITORY_URL]
|
||||||
PATH: /SECURITY.md
|
PATH: /SECURITY.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Security vulnerability reporting and handling policy
|
BRIEF: Security vulnerability reporting and handling policy
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
|
|
||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
PATH: /docs/INSTALLATION.md
|
PATH: /docs/INSTALLATION.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Installation and setup instructions for [PROJECT_NAME]
|
BRIEF: Installation and setup instructions for [PROJECT_NAME]
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP:
|
DEFGROUP:
|
||||||
INGROUP: Project.Documentation
|
INGROUP: Project.Documentation
|
||||||
REPO:
|
REPO:
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./README.md
|
PATH: ./README.md
|
||||||
BRIEF: Reference + packaging repo for Moko Consulting Developer GPT Other Default
|
BRIEF: Reference + packaging repo for Moko Consulting Developer GPT Other Default
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: mokoplatform.Automation
|
# INGROUP: mokoplatform.Automation
|
||||||
# VERSION: 09.26.00
|
# VERSION: 09.29.00
|
||||||
# BRIEF: Auto-create feature branch when an issue is opened
|
# BRIEF: Auto-create feature branch when an issue is opened
|
||||||
|
|
||||||
name: "Universal: Issue Branch"
|
name: "Universal: Issue Branch"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP: MokoStandards-Template-Joomla-Plugin
|
DEFGROUP: MokoStandards-Template-Joomla-Plugin
|
||||||
INGROUP: MokoStandards-Template-Joomla-Plugin.Documentation
|
INGROUP: MokoStandards-Template-Joomla-Plugin.Documentation
|
||||||
REPO: https://github.com/mokoconsulting-tech/MokoStandards-Template-Joomla-Plugin/
|
REPO: https://github.com/mokoconsulting-tech/MokoStandards-Template-Joomla-Plugin/
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CODE_OF_CONDUCT.md
|
PATH: ./CODE_OF_CONDUCT.md
|
||||||
BRIEF: Community expectations and enforcement guidelines
|
BRIEF: Community expectations and enforcement guidelines
|
||||||
NOTE: Adapted with attribution from the Contributor Covenant v2.1
|
NOTE: Adapted with attribution from the Contributor Covenant v2.1
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
DEFGROUP: mokoconsulting-tech.MokoStandards-Template-Joomla-Plugin
|
DEFGROUP: mokoconsulting-tech.MokoStandards-Template-Joomla-Plugin
|
||||||
INGROUP: MokoStandards.Governance
|
INGROUP: MokoStandards.Governance
|
||||||
REPO: https://github.com/mokoconsulting-tech/MokoStandards-Template-Joomla-Plugin
|
REPO: https://github.com/mokoconsulting-tech/MokoStandards-Template-Joomla-Plugin
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: /GOVERNANCE.md
|
PATH: /GOVERNANCE.md
|
||||||
BRIEF: Project governance rules, roles, and decision process for MokoStandards-Template-Joomla-Plugin
|
BRIEF: Project governance rules, roles, and decision process for MokoStandards-Template-Joomla-Plugin
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -2,14 +2,15 @@
|
|||||||
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
#
|
#
|
||||||
# MokoJoomGallery — Photo gallery management for Joomla
|
# MokoSuite — Joomla extension template
|
||||||
|
# Replace EXTENSION_NAME with your extension's element name.
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION - Customize these for your extension
|
# CONFIGURATION - Customize these for your extension
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|
||||||
# Extension Configuration
|
# Extension Configuration
|
||||||
EXTENSION_NAME := mokojoomgallery
|
EXTENSION_NAME := mokosuite
|
||||||
EXTENSION_TYPE := package
|
EXTENSION_TYPE := package
|
||||||
# Options: module, plugin, component, package, template
|
# Options: module, plugin, component, package, template
|
||||||
EXTENSION_VERSION := 1.0.0
|
EXTENSION_VERSION := 1.0.0
|
||||||
@@ -132,11 +133,11 @@ build: clean minify ## Build extension package
|
|||||||
|
|
||||||
@# --- Build the outer package ZIP ---
|
@# --- Build the outer package ZIP ---
|
||||||
@echo " Assembling pkg_$(EXTENSION_NAME)..."
|
@echo " Assembling pkg_$(EXTENSION_NAME)..."
|
||||||
@cp $(SRC_DIR)/pkg_mokojoomgallery.xml $(BUILD_DIR)/pkg_mokojoomgallery.xml
|
@cp $(SRC_DIR)/pkg_$(EXTENSION_NAME).xml $(BUILD_DIR)/pkg_$(EXTENSION_NAME).xml
|
||||||
@cp $(SRC_DIR)/script.php $(BUILD_DIR)/script.php
|
@cp $(SRC_DIR)/script.php $(BUILD_DIR)/script.php
|
||||||
@[ -d "$(SRC_DIR)/language" ] && cp -r $(SRC_DIR)/language $(BUILD_DIR)/language || true
|
@[ -d "$(SRC_DIR)/language" ] && cp -r $(SRC_DIR)/language $(BUILD_DIR)/language || true
|
||||||
@cd $(BUILD_DIR) && $(ZIP) -r "$(CURDIR)/$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" \
|
@cd $(BUILD_DIR) && $(ZIP) -r "$(CURDIR)/$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" \
|
||||||
pkg_mokojoomgallery.xml script.php language/ packages/
|
pkg_$(EXTENSION_NAME).xml script.php language/ packages/
|
||||||
|
|
||||||
@echo "$(COLOR_GREEN)✓ Package created: $(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip$(COLOR_RESET)"
|
@echo "$(COLOR_GREEN)✓ Package created: $(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip$(COLOR_RESET)"
|
||||||
@echo " Contents:"
|
@echo " Contents:"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ DEFGROUP: MokoStandards-Template-Joomla-Plugin
|
|||||||
INGROUP: MokoStandards-Template-Joomla-Plugin.Documentation
|
INGROUP: MokoStandards-Template-Joomla-Plugin.Documentation
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Joomla-Plugin
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Joomla-Plugin
|
||||||
PATH: /SECURITY.md
|
PATH: /SECURITY.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Security vulnerability reporting and handling policy
|
BRIEF: Security vulnerability reporting and handling policy
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mokoconsulting/mokojoomgallery",
|
"name": "mokoconsulting/mokosuite",
|
||||||
"description": "Photo gallery management for Joomla — galleries, images, thumbnails, lightbox, and frontend display",
|
"description": "Joomla extension — replace with your extension description",
|
||||||
"type": "joomla-package",
|
"type": "joomla-package",
|
||||||
"version": "01.00.00",
|
"version": "01.00.00",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "GPL-3.0-or-later",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: mokoplatform.Automation
|
# INGROUP: mokoplatform.Automation
|
||||||
# VERSION: 09.26.00
|
# VERSION: 09.29.00
|
||||||
# BRIEF: Auto-create feature branch when an issue is opened
|
# BRIEF: Auto-create feature branch when an issue is opened
|
||||||
|
|
||||||
name: "Universal: Issue Branch"
|
name: "Universal: Issue Branch"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP:
|
DEFGROUP:
|
||||||
INGROUP: Project.Documentation
|
INGROUP: Project.Documentation
|
||||||
REPO: mokoconsulting-tech/MokoStandards-Template-Generic
|
REPO: mokoconsulting-tech/MokoStandards-Template-Generic
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CODE_OF_CONDUCT.md
|
PATH: ./CODE_OF_CONDUCT.md
|
||||||
BRIEF: Contributor Covenant Code of Conduct version 1.3.0
|
BRIEF: Contributor Covenant Code of Conduct version 1.3.0
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
DEFGROUP:
|
DEFGROUP:
|
||||||
INGROUP: Project.Documentation
|
INGROUP: Project.Documentation
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Generic
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-Template-Generic
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
PATH: ./CONTRIBUTING.md
|
PATH: ./CONTRIBUTING.md
|
||||||
BRIEF: Contribution guidelines for the project
|
BRIEF: Contribution guidelines for the project
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
DEFGROUP: {{PROJECT_NAME}}.Documentation
|
DEFGROUP: {{PROJECT_NAME}}.Documentation
|
||||||
PATH: /docs/API.md
|
PATH: /docs/API.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: MCP tool reference documentation
|
BRIEF: MCP tool reference documentation
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
DEFGROUP: {{PROJECT_NAME}}.Documentation
|
DEFGROUP: {{PROJECT_NAME}}.Documentation
|
||||||
PATH: /docs/ARCHITECTURE.md
|
PATH: /docs/ARCHITECTURE.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Architecture overview and design decisions
|
BRIEF: Architecture overview and design decisions
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
DEFGROUP: {{PROJECT_NAME}}.Documentation
|
DEFGROUP: {{PROJECT_NAME}}.Documentation
|
||||||
PATH: /docs/INSTALLATION.md
|
PATH: /docs/INSTALLATION.md
|
||||||
VERSION: 09.26.00
|
VERSION: 09.29.00
|
||||||
BRIEF: Installation and setup instructions
|
BRIEF: Installation and setup instructions
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class VersionBumpTest extends TestCase
|
|||||||
{
|
{
|
||||||
file_put_contents(
|
file_put_contents(
|
||||||
"{$this->tmpDir}/README.md",
|
"{$this->tmpDir}/README.md",
|
||||||
"<!-- VERSION: 09.26.00 -->\nSome content\n"
|
"<!-- VERSION: 09.29.00 -->\nSome content\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->execute();
|
$this->execute();
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class VersionReadTest extends TestCase
|
|||||||
{
|
{
|
||||||
file_put_contents(
|
file_put_contents(
|
||||||
"{$this->tmpDir}/README.md",
|
"{$this->tmpDir}/README.md",
|
||||||
"# Test\n<!-- VERSION: 09.26.00 -->\n"
|
"# Test\n<!-- VERSION: 09.29.00 -->\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertSame('02.03.04', trim($this->runScript()));
|
$this->assertSame('02.03.04', trim($this->runScript()));
|
||||||
@@ -68,7 +68,7 @@ class VersionReadTest extends TestCase
|
|||||||
{
|
{
|
||||||
file_put_contents(
|
file_put_contents(
|
||||||
"{$this->tmpDir}/README.md",
|
"{$this->tmpDir}/README.md",
|
||||||
"<!-- VERSION: 09.26.00 -->\n"
|
"<!-- VERSION: 09.29.00 -->\n"
|
||||||
);
|
);
|
||||||
mkdir("{$this->tmpDir}/src", 0755, true);
|
mkdir("{$this->tmpDir}/src", 0755, true);
|
||||||
file_put_contents(
|
file_put_contents(
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
* INGROUP: MokoPlatform
|
* INGROUP: MokoPlatform
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
||||||
* PATH: /validate/check_file_integrity.php
|
* PATH: /validate/check_file_integrity.php
|
||||||
* VERSION: 09.26.00
|
* VERSION: 09.29.00
|
||||||
* BRIEF: Compare deployed files on a remote server against the local repository to detect drift
|
* BRIEF: Compare deployed files on a remote server against the local repository to detect drift
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user