From 1cf076f088f5b08ee55e08e199a35095e5a35f52 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 20 Jun 2026 23:33:19 -0500 Subject: [PATCH 1/3] feat: interactive repo configuration wizard (#145) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `repo:wizard` command — walks through platform selection, generates config files (phpcs, phpstan, eslint, tsconfig, composer/package.json, .editorconfig, README, CHANGELOG, .gitignore, workflows), and optionally creates the repo on Gitea via API. Supports --dry-run, --non-interactive, and --create-remote flags. --- bin/moko | 1 + cli/repo_wizard.php | 411 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 412 insertions(+) create mode 100644 cli/repo_wizard.php diff --git a/bin/moko b/bin/moko index dd449b8..d484dff 100644 --- a/bin/moko +++ b/bin/moko @@ -178,6 +178,7 @@ const COMMAND_MAP = [ 'repo:archive' => 'cli/archive_repo.php', 'repo:scaffold-client' => 'cli/scaffold_client.php', 'repo:provision' => 'cli/client_provision.php', + 'repo:wizard' => 'cli/repo_wizard.php', 'repo:rename-branch' => 'cli/branch_rename.php', 'repo:reset-dev' => 'cli/dev_branch_reset.php', diff --git a/cli/repo_wizard.php b/cli/repo_wizard.php new file mode 100644 index 0000000..5dc612d --- /dev/null +++ b/cli/repo_wizard.php @@ -0,0 +1,411 @@ +#!/usr/bin/env php + + * SPDX-License-Identifier: GPL-3.0-or-later + * FILE INFORMATION + * DEFGROUP: mokocli.CLI + * INGROUP: mokocli + * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli + * PATH: /cli/repo_wizard.php + * BRIEF: Interactive configuration wizard for new repositories + */ + +declare(strict_types=1); + +require_once __DIR__ . '/../vendor/autoload.php'; +require_once __DIR__ . '/../lib/Enterprise/CliFramework.php'; + +use MokoCli\{CliFramework, Config, PlatformAdapterFactory}; + +/** + * Interactive repo setup wizard. + * + * Walks through platform selection, generates config files, workflows, + * and optionally creates the repo on Gitea via API. + * + * @see https://git.mokoconsulting.tech/MokoConsulting/mokocli/issues/145 + */ +class RepoWizard extends CliFramework +{ + private const PLATFORMS = [ + 'joomla' => 'Joomla extension (component, module, plugin, package)', + 'dolibarr' => 'Dolibarr ERP module', + 'nodejs' => 'Node.js / TypeScript project', + 'python' => 'Python project', + 'mcp-server' => 'MCP server (Model Context Protocol)', + 'generic' => 'Generic PHP or multi-language project', + ]; + + private const LICENSES = [ + 'GPL-3.0-or-later' => 'GNU General Public License v3', + 'MIT' => 'MIT License', + 'Apache-2.0' => 'Apache License 2.0', + 'proprietary' => 'Proprietary / All rights reserved', + ]; + + /** Collected wizard answers. */ + private array $answers = []; + + protected function configure(): void + { + $this->setDescription('Interactive configuration wizard for new repositories'); + $this->addArgument('--path', 'Directory to generate files in', '.'); + $this->addArgument('--create-remote', 'Create repo on Gitea via API', false); + $this->addArgument('--non-interactive', 'Use defaults (no prompts)', false); + } + + protected function run(): int + { + $targetPath = realpath($this->getArgument('--path', '.')) ?: $this->getArgument('--path', '.'); + + $this->section('MokoCli Repository Wizard'); + + // ── Gather info ────────────────────────────────────────────── + $this->answers['name'] = $this->input('Repository name', basename($targetPath)); + $this->answers['platform'] = $this->menu('Platform type', self::PLATFORMS, 'generic'); + $this->answers['org'] = $this->input('Organization', 'MokoConsulting'); + $this->answers['description'] = $this->input('Description', ''); + $this->answers['license'] = $this->menu('License', self::LICENSES, 'GPL-3.0-or-later'); + + // ── Confirm ────────────────────────────────────────────────── + $this->section('Configuration Summary'); + foreach ($this->answers as $key => $value) { + $this->log('INFO', sprintf(' %-12s %s', $key . ':', $value)); + } + + if (!$this->confirm('Proceed with these settings?', true)) { + $this->log('INFO', 'Wizard cancelled'); + return 0; + } + + // ── Generate files ─────────────────────────────────────────── + $this->section('Generating files'); + $generated = $this->generateFiles($targetPath); + + foreach ($generated as $file) { + $this->status(true, $file); + } + + // ── Create remote repo ─────────────────────────────────────── + if ($this->getArgument('--create-remote', false)) { + $this->section('Creating remote repository'); + $this->createRemoteRepo(); + } + + $this->log('INFO', ''); + $this->log('INFO', "Generated {$this->count($generated)} files in {$targetPath}"); + $this->log('INFO', 'Next: git init && git add -A && git commit -m "chore: initial scaffold"'); + + return 0; + } + + // ── File generation ────────────────────────────────────────────── + + private function generateFiles(string $path): array + { + $platform = $this->answers['platform']; + $name = $this->answers['name']; + $generated = []; + + // .editorconfig + $generated[] = $this->writeFile($path, '.editorconfig', $this->editorconfig()); + + // README.md + $generated[] = $this->writeFile($path, 'README.md', $this->readme()); + + // CHANGELOG.md + $generated[] = $this->writeFile($path, 'CHANGELOG.md', $this->changelog()); + + // LICENSE + if ($this->answers['license'] !== 'proprietary') { + $generated[] = $this->writeFile($path, 'LICENSE', "See SPDX: {$this->answers['license']}"); + } + + // Platform-specific configs + switch ($platform) { + case 'joomla': + case 'dolibarr': + case 'generic': + $generated[] = $this->writeFile($path, 'phpcs.xml', $this->phpcsXml()); + $generated[] = $this->writeFile($path, 'phpstan.neon', $this->phpstanNeon()); + $generated[] = $this->writeFile($path, 'composer.json', $this->composerJson()); + break; + case 'nodejs': + case 'mcp-server': + $generated[] = $this->writeFile($path, 'package.json', $this->packageJson()); + $generated[] = $this->writeFile($path, 'tsconfig.json', $this->tsconfigJson()); + $generated[] = $this->writeFile($path, '.eslintrc.json', $this->eslintrc()); + break; + case 'python': + $generated[] = $this->writeFile($path, 'pyproject.toml', $this->pyprojectToml()); + $generated[] = $this->writeFile($path, 'requirements.txt', ''); + break; + } + + // .mokogitea/workflows + $generated[] = $this->writeFile($path, '.mokogitea/workflows/pr-check.yml', + "# PR check workflow — synced from mokocli templates\n# Run: moko sync to update\n"); + + // .gitignore + $generated[] = $this->writeFile($path, '.gitignore', $this->gitignore($platform)); + + // Source directory + $srcDir = in_array($platform, ['joomla', 'dolibarr', 'generic']) ? 'source' : 'src'; + if (!is_dir("{$path}/{$srcDir}")) { + @mkdir("{$path}/{$srcDir}", 0755, true); + $generated[] = "{$srcDir}/"; + } + + return array_filter($generated); + } + + private function writeFile(string $basePath, string $relativePath, string $content): ?string + { + $fullPath = $basePath . '/' . $relativePath; + $dir = dirname($fullPath); + + if (file_exists($fullPath)) { + $this->log('DEBUG', " SKIP {$relativePath} (already exists)"); + return null; + } + + if ($this->dryRun) { + $this->log('INFO', "[dry-run] Would create {$relativePath}"); + return $relativePath; + } + + if (!is_dir($dir)) { + @mkdir($dir, 0755, true); + } + + file_put_contents($fullPath, $content); + return $relativePath; + } + + // ── Remote repo creation ───────────────────────────────────────── + + private function createRemoteRepo(): void + { + try { + $config = Config::load(); + $adapter = PlatformAdapterFactory::create($config); + $org = $this->answers['org']; + + if ($this->dryRun) { + $this->log('INFO', "[dry-run] Would create {$org}/{$this->answers['name']} on Gitea"); + return; + } + + $result = $adapter->createRepository($org, $this->answers['name'], [ + 'description' => $this->answers['description'], + 'private' => false, + ]); + + $url = $result['html_url'] ?? "{$org}/{$this->answers['name']}"; + $this->log('INFO', "Created: {$url}"); + } catch (\Exception $e) { + $this->log('ERROR', "Failed to create remote repo: {$e->getMessage()}"); + } + } + + private function count(array $arr): int { return \count($arr); } + + // ── Template content ───────────────────────────────────────────── + + private function editorconfig(): string + { + return <<<'CONF' +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false +CONF; + } + + private function readme(): string + { + $name = $this->answers['name']; + $desc = $this->answers['description'] ?: 'A Moko Consulting project.'; + $license = $this->answers['license']; + + return <<answers['name']); + $desc = $this->answers['description'] ?: $this->answers['name']; + $license = $this->answers['license']; + + return <<=8.1" + }, + "autoload": { + "psr-4": {} + } +} +JSON; + } + + private function phpcsXml(): string + { + return <<<'XML' + + + + source/ + vendor/* + +XML; + } + + private function phpstanNeon(): string + { + return <<<'NEON' +parameters: + level: 6 + paths: + - source/ +NEON; + } + + private function packageJson(): string + { + $name = strtolower($this->answers['name']); + $desc = $this->answers['description'] ?: $this->answers['name']; + + return <<answers['name']); + $desc = $this->answers['description'] ?: $this->answers['name']; + + return <<=68.0"] +build-backend = "setuptools.build_meta" +TOML; + } + + private function gitignore(string $platform): string + { + $common = <<<'GI' +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db +desktop.ini + +# Logs +*.log +GI; + + $extra = match ($platform) { + 'joomla', 'dolibarr', 'generic' => "\n# PHP\nvendor/\n.phpunit.result.cache\n", + 'nodejs', 'mcp-server' => "\n# Node\nnode_modules/\ndist/\n*.tsbuildinfo\n", + 'python' => "\n# Python\n__pycache__/\n*.pyc\n.venv/\n*.egg-info/\n", + default => '', + }; + + return $common . $extra; + } +} + +$app = new RepoWizard('repo_wizard', 'Interactive configuration wizard for new repositories'); +exit($app->execute()); -- 2.52.0 From 558cd6043d379354f8185ea84c6cba7edc934e45 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 20 Jun 2026 23:38:45 -0500 Subject: [PATCH 2/3] fix: address review findings in repo_wizard.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix #1: replace nonexistent menu() with choose() using select() - Fix #2: constructor — pass name only, not description as version - Fix #3: respect --non-interactive flag (skip prompts, use defaults) - Fix #4: use json_encode for composer/package.json (prevent injection) - Fix #5: remove pointless count() wrapper - Fix #6: validate --path exists or can be created before proceeding - Fix TOML description escaping --- cli/repo_wizard.php | 110 ++++++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 46 deletions(-) diff --git a/cli/repo_wizard.php b/cli/repo_wizard.php index 5dc612d..9268f48 100644 --- a/cli/repo_wizard.php +++ b/cli/repo_wizard.php @@ -47,6 +47,9 @@ class RepoWizard extends CliFramework /** Collected wizard answers. */ private array $answers = []; + /** When true, skip all interactive prompts and use defaults. */ + private bool $nonInteractive = false; + protected function configure(): void { $this->setDescription('Interactive configuration wizard for new repositories'); @@ -57,16 +60,25 @@ class RepoWizard extends CliFramework protected function run(): int { - $targetPath = realpath($this->getArgument('--path', '.')) ?: $this->getArgument('--path', '.'); + $rawPath = $this->getArgument('--path', '.'); + $targetPath = realpath($rawPath) ?: $rawPath; + $this->nonInteractive = (bool) $this->getArgument('--non-interactive', false); + + // Validate target path + if (!is_dir($targetPath) && !@mkdir($targetPath, 0755, true)) { + $this->log('ERROR', "Target path does not exist and cannot be created: {$targetPath}"); + return self::EXIT_USAGE; + } + $targetPath = realpath($targetPath) ?: $targetPath; $this->section('MokoCli Repository Wizard'); // ── Gather info ────────────────────────────────────────────── - $this->answers['name'] = $this->input('Repository name', basename($targetPath)); - $this->answers['platform'] = $this->menu('Platform type', self::PLATFORMS, 'generic'); - $this->answers['org'] = $this->input('Organization', 'MokoConsulting'); - $this->answers['description'] = $this->input('Description', ''); - $this->answers['license'] = $this->menu('License', self::LICENSES, 'GPL-3.0-or-later'); + $this->answers['name'] = $this->ask('Repository name', basename($targetPath)); + $this->answers['platform'] = $this->choose('Platform type', self::PLATFORMS, 'generic'); + $this->answers['org'] = $this->ask('Organization', 'MokoConsulting'); + $this->answers['description'] = $this->ask('Description', ''); + $this->answers['license'] = $this->choose('License', self::LICENSES, 'GPL-3.0-or-later'); // ── Confirm ────────────────────────────────────────────────── $this->section('Configuration Summary'); @@ -94,7 +106,7 @@ class RepoWizard extends CliFramework } $this->log('INFO', ''); - $this->log('INFO', "Generated {$this->count($generated)} files in {$targetPath}"); + $this->log('INFO', 'Generated ' . count($generated) . " files in {$targetPath}"); $this->log('INFO', 'Next: git init && git add -A && git commit -m "chore: initial scaffold"'); return 0; @@ -209,7 +221,31 @@ class RepoWizard extends CliFramework } } - private function count(array $arr): int { return \count($arr); } + // ── Interactive helpers (respect --non-interactive) ───────────── + + private function ask(string $prompt, string $default): string + { + if ($this->nonInteractive) { + return $default; + } + return $this->input($prompt, $default); + } + + private function choose(string $prompt, array $options, string $default): string + { + if ($this->nonInteractive) { + return $default; + } + $keys = array_keys($options); + $labels = []; + foreach ($options as $key => $desc) { + $labels[] = "{$key} — {$desc}"; + } + $chosen = $this->select($prompt, $labels); + // Extract the key from "key — description" + $chosenKey = explode(' — ', $chosen, 2)[0] ?? $default; + return in_array($chosenKey, $keys, true) ? $chosenKey : $default; + } // ── Template content ───────────────────────────────────────────── @@ -266,24 +302,15 @@ MD; private function composerJson(): string { - $name = strtolower($this->answers['name']); - $desc = $this->answers['description'] ?: $this->answers['name']; - $license = $this->answers['license']; - - return <<=8.1" - }, - "autoload": { - "psr-4": {} - } -} -JSON; + $data = [ + 'name' => 'mokoconsulting/' . strtolower($this->answers['name']), + 'description' => $this->answers['description'] ?: $this->answers['name'], + 'type' => 'library', + 'license' => $this->answers['license'], + 'require' => ['php' => '>=8.1'], + 'autoload' => ['psr-4' => new \stdClass()], + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n"; } private function phpcsXml(): string @@ -310,24 +337,15 @@ NEON; private function packageJson(): string { - $name = strtolower($this->answers['name']); - $desc = $this->answers['description'] ?: $this->answers['name']; - - return << '@mokoconsulting/' . strtolower($this->answers['name']), + 'version' => '0.1.0', + 'description' => $this->answers['description'] ?: $this->answers['name'], + 'type' => 'module', + 'scripts' => ['build' => 'tsc', 'start' => 'node dist/index.js'], + 'devDependencies' => ['typescript' => '^5.0'], + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n"; } private function tsconfigJson(): string @@ -363,7 +381,7 @@ JSON; private function pyprojectToml(): string { $name = strtolower($this->answers['name']); - $desc = $this->answers['description'] ?: $this->answers['name']; + $desc = str_replace(['\\', '"'], ['\\\\', '\\"'], $this->answers['description'] ?: $this->answers['name']); return <<execute()); -- 2.52.0 From 632d8486b85804696dd39b83116107448e830ba7 Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Sun, 21 Jun 2026 05:25:14 +0000 Subject: [PATCH 3/3] chore(version): auto-bump patch 09.36.01-dev [skip ci] --- .mokogitea/workflows/issue-branch.yml | 2 +- README.md | 2 +- automation/update_dependencies.php | 2 +- cli/branch_rename.php | 2 +- cli/bulk_workflow_push.php | 2 +- cli/bulk_workflow_trigger.php | 2 +- cli/client_dashboard.php | 2 +- cli/client_inventory.php | 2 +- cli/client_provision.php | 2 +- cli/grafana_dashboard.php | 2 +- cli/joomla_build.php | 2 +- cli/joomla_metadata_validate.php | 2 +- cli/manifest_detect.php | 2 +- cli/manifest_integrity.php | 2 +- cli/manifest_licensing.php | 2 +- cli/manifest_read.php | 2 +- cli/platform_detect.php | 2 +- cli/release_cascade.php | 2 +- cli/release_publish.php | 2 +- cli/scaffold_client.php | 2 +- cli/updates_xml_sync.php | 2 +- cli/version_auto_bump.php | 2 +- cli/version_bump.php | 2 +- cli/version_check.php | 2 +- cli/wiki_sync.php | 2 +- cli/workflow_sync.php | 2 +- deploy/backup-before-deploy.php | 2 +- deploy/deploy-dolibarr.php | 2 +- deploy/health-check.php | 2 +- deploy/rollback-joomla.php | 2 +- deploy/sync-joomla.php | 2 +- mcp/servers/mokocrm_api/CONTRIBUTING.md | 2 +- mcp/servers/mokocrm_api/SECURITY.md | 2 +- mcp/servers/mokosuite_api/CONTRIBUTING.md | 2 +- mcp/servers/mokosuite_api/SECURITY.md | 2 +- tests/Unit/VersionBumpTest.php | 2 +- tests/Unit/VersionReadTest.php | 4 ++-- validate/check_file_integrity.php | 2 +- 38 files changed, 39 insertions(+), 39 deletions(-) diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml index 75a6963..82ef6a3 100644 --- a/.mokogitea/workflows/issue-branch.yml +++ b/.mokogitea/workflows/issue-branch.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: Gitea.Workflow # INGROUP: mokocli.Automation -# VERSION: 01.00.00 +# VERSION: 09.36.01 # BRIEF: Auto-create feature branch when an issue is opened name: "Universal: Issue Branch" diff --git a/README.md b/README.md index 38b7a71..2485b2d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ DEFGROUP: MokoPlatform.Root INGROUP: MokoPlatform REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform PATH: /README.md -VERSION: 09.36.00 +VERSION: 09.36.01 BRIEF: Project overview and documentation --> diff --git a/automation/update_dependencies.php b/automation/update_dependencies.php index e5f67d7..5d4240f 100644 --- a/automation/update_dependencies.php +++ b/automation/update_dependencies.php @@ -13,7 +13,7 @@ * INGROUP: MokoPlatform.Scripts * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli * PATH: /automation/update_dependencies.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Cross-repo dependency update automation — scan, update, PR, auto-merge */ diff --git a/cli/branch_rename.php b/cli/branch_rename.php index 4fb60c0..7234af4 100644 --- a/cli/branch_rename.php +++ b/cli/branch_rename.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/branch_rename.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Rename a git branch via Gitea API (create new, update PR, delete old) */ diff --git a/cli/bulk_workflow_push.php b/cli/bulk_workflow_push.php index eb3b4f1..439e652 100644 --- a/cli/bulk_workflow_push.php +++ b/cli/bulk_workflow_push.php @@ -12,7 +12,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/bulk_workflow_push.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Push a workflow file to all governed repos via the Gitea Contents API */ diff --git a/cli/bulk_workflow_trigger.php b/cli/bulk_workflow_trigger.php index 49db5e2..4557f42 100644 --- a/cli/bulk_workflow_trigger.php +++ b/cli/bulk_workflow_trigger.php @@ -12,7 +12,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/bulk_workflow_trigger.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Trigger a workflow across multiple repos at once */ diff --git a/cli/client_dashboard.php b/cli/client_dashboard.php index 0c72460..faf9112 100644 --- a/cli/client_dashboard.php +++ b/cli/client_dashboard.php @@ -12,7 +12,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/client_dashboard.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Generate unified client dashboard HTML */ diff --git a/cli/client_inventory.php b/cli/client_inventory.php index 665fb7d..081f3b9 100644 --- a/cli/client_inventory.php +++ b/cli/client_inventory.php @@ -12,7 +12,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/client_inventory.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Discover and list all client-waas repos with their server configuration status */ diff --git a/cli/client_provision.php b/cli/client_provision.php index 8a5e95e..7f208a2 100644 --- a/cli/client_provision.php +++ b/cli/client_provision.php @@ -12,7 +12,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/client_provision.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Provision a new client environment end-to-end */ diff --git a/cli/grafana_dashboard.php b/cli/grafana_dashboard.php index e71c7dc..0b0d812 100644 --- a/cli/grafana_dashboard.php +++ b/cli/grafana_dashboard.php @@ -12,7 +12,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/grafana_dashboard.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Manage Grafana dashboards via API */ diff --git a/cli/joomla_build.php b/cli/joomla_build.php index ad00fe2..a65e1c3 100644 --- a/cli/joomla_build.php +++ b/cli/joomla_build.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/joomla_build.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Build a Joomla extension ZIP from manifest — all types supported * NOTE: Called by pre-release and auto-release workflows. */ diff --git a/cli/joomla_metadata_validate.php b/cli/joomla_metadata_validate.php index 4fdc442..0cf8cc5 100644 --- a/cli/joomla_metadata_validate.php +++ b/cli/joomla_metadata_validate.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/joomla_metadata_validate.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Validate MokoGitea repo metadata against Joomla extension manifest XML */ diff --git a/cli/manifest_detect.php b/cli/manifest_detect.php index 76c37ec..ce5e3e4 100644 --- a/cli/manifest_detect.php +++ b/cli/manifest_detect.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/manifest_detect.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Auto-detect manifest fields from source files and optionally push to API */ diff --git a/cli/manifest_integrity.php b/cli/manifest_integrity.php index 4bfc0df..72dde92 100644 --- a/cli/manifest_integrity.php +++ b/cli/manifest_integrity.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/manifest_integrity.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Cross-check manifest API fields against repo contents across the org */ diff --git a/cli/manifest_licensing.php b/cli/manifest_licensing.php index 832db1e..cf01795 100644 --- a/cli/manifest_licensing.php +++ b/cli/manifest_licensing.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/manifest_licensing.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Ensure licensing tags (updateservers, dlid) in Joomla extension manifests */ diff --git a/cli/manifest_read.php b/cli/manifest_read.php index 18f89c9..7386bdb 100644 --- a/cli/manifest_read.php +++ b/cli/manifest_read.php @@ -10,7 +10,7 @@ * INGROUP: mokocli * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli * PATH: /cli/manifest_read.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Read repo metadata from Gitea manifest API, auto-detect the rest */ diff --git a/cli/platform_detect.php b/cli/platform_detect.php index d97e562..5fb6877 100644 --- a/cli/platform_detect.php +++ b/cli/platform_detect.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/platform_detect.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Auto-detect repository platform type and optionally update manifest */ diff --git a/cli/release_cascade.php b/cli/release_cascade.php index e3cca4f..5d5055e 100644 --- a/cli/release_cascade.php +++ b/cli/release_cascade.php @@ -10,7 +10,7 @@ * INGROUP: mokocli * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli * PATH: /cli/release_cascade.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Cascade release zip to all lower stability channels */ diff --git a/cli/release_publish.php b/cli/release_publish.php index ae5fe9f..84766a4 100644 --- a/cli/release_publish.php +++ b/cli/release_publish.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/release_publish.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Publish a release and create copies for all lesser stability streams. */ diff --git a/cli/scaffold_client.php b/cli/scaffold_client.php index df03377..34bb055 100644 --- a/cli/scaffold_client.php +++ b/cli/scaffold_client.php @@ -12,7 +12,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/scaffold_client.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Scaffold a new client-waas repo from Template-Client-WaaS with pre-configured settings */ diff --git a/cli/updates_xml_sync.php b/cli/updates_xml_sync.php index d4cae46..f6f88a4 100644 --- a/cli/updates_xml_sync.php +++ b/cli/updates_xml_sync.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/updates_xml_sync.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Sync updates.xml to target branches via Gitea API * NOTE: Called by pre-release and auto-release workflows after updates.xml * is modified on the current branch. Pushes the file to other branches diff --git a/cli/version_auto_bump.php b/cli/version_auto_bump.php index 87a5e09..5301250 100644 --- a/cli/version_auto_bump.php +++ b/cli/version_auto_bump.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/version_auto_bump.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Auto patch-bump, set stability suffix, and commit — single CLI replacing inline workflow bash */ diff --git a/cli/version_bump.php b/cli/version_bump.php index 64e9b94..9efc410 100644 --- a/cli/version_bump.php +++ b/cli/version_bump.php @@ -370,7 +370,7 @@ class VersionBumpCli extends CliFramework /** * Scan git release tags for the highest version across all channels. * - * Checks release names like "MokoSuiteClient (VERSION: 09.36.00)" in + * Checks release names like "MokoSuiteClient (VERSION: 09.36.01)" in * git tags (stable, release-candidate, development, etc.) to find the * highest version that has been released on any channel. */ diff --git a/cli/version_check.php b/cli/version_check.php index e162b57..1b9af54 100644 --- a/cli/version_check.php +++ b/cli/version_check.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/version_check.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Validate version consistency across README, manifests, and sub-packages */ diff --git a/cli/wiki_sync.php b/cli/wiki_sync.php index efcc6de..e0d2023 100644 --- a/cli/wiki_sync.php +++ b/cli/wiki_sync.php @@ -10,7 +10,7 @@ * INGROUP: mokoplatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /cli/wiki_sync.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Sync select wiki pages from mokoplatform to all template repos */ diff --git a/cli/workflow_sync.php b/cli/workflow_sync.php index 126299a..f819bf9 100644 --- a/cli/workflow_sync.php +++ b/cli/workflow_sync.php @@ -10,7 +10,7 @@ * INGROUP: moko-platform * REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform * PATH: /cli/workflow_sync.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Sync workflows from Generic → platform templates → live repos based on manifest.platform */ diff --git a/deploy/backup-before-deploy.php b/deploy/backup-before-deploy.php index c6fc865..4cb6a95 100644 --- a/deploy/backup-before-deploy.php +++ b/deploy/backup-before-deploy.php @@ -12,7 +12,7 @@ * INGROUP: MokoPlatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /deploy/backup-before-deploy.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Snapshot Joomla directories before deployment for rollback capability */ diff --git a/deploy/deploy-dolibarr.php b/deploy/deploy-dolibarr.php index a84a34b..44332eb 100644 --- a/deploy/deploy-dolibarr.php +++ b/deploy/deploy-dolibarr.php @@ -12,7 +12,7 @@ * INGROUP: MokoPlatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /deploy/deploy-dolibarr.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Deploy Dolibarr module files to a remote server via SFTP/rsync */ diff --git a/deploy/health-check.php b/deploy/health-check.php index 82d0c20..621a06e 100644 --- a/deploy/health-check.php +++ b/deploy/health-check.php @@ -12,7 +12,7 @@ * INGROUP: MokoPlatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /deploy/health-check.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Post-deploy health check — verify a Joomla site is responding correctly */ diff --git a/deploy/rollback-joomla.php b/deploy/rollback-joomla.php index 1d6df71..56726ca 100644 --- a/deploy/rollback-joomla.php +++ b/deploy/rollback-joomla.php @@ -12,7 +12,7 @@ * INGROUP: MokoPlatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /deploy/rollback-joomla.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Rollback a Joomla deployment by restoring from a pre-deploy snapshot */ diff --git a/deploy/sync-joomla.php b/deploy/sync-joomla.php index 716cca7..d04d785 100644 --- a/deploy/sync-joomla.php +++ b/deploy/sync-joomla.php @@ -12,7 +12,7 @@ * INGROUP: MokoPlatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /deploy/sync-joomla.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Sync Joomla site directories between two servers via rsync over SSH */ diff --git a/mcp/servers/mokocrm_api/CONTRIBUTING.md b/mcp/servers/mokocrm_api/CONTRIBUTING.md index 39695d4..d153bfb 100644 --- a/mcp/servers/mokocrm_api/CONTRIBUTING.md +++ b/mcp/servers/mokocrm_api/CONTRIBUTING.md @@ -14,7 +14,7 @@ DEFGROUP: dolibarr-api-mcp.Documentation INGROUP: dolibarr-api-mcp REPO: https://git.mokoconsulting.tech/MokoConsulting/dolibarr-api-mcp - VERSION: 09.36.00 + VERSION: 09.36.01 PATH: ./CONTRIBUTING.md BRIEF: Contribution guidelines for the project --> diff --git a/mcp/servers/mokocrm_api/SECURITY.md b/mcp/servers/mokocrm_api/SECURITY.md index b078206..1512566 100644 --- a/mcp/servers/mokocrm_api/SECURITY.md +++ b/mcp/servers/mokocrm_api/SECURITY.md @@ -10,7 +10,7 @@ DEFGROUP: dolibarr-api-mcp.Documentation INGROUP: dolibarr-api-mcp REPO: https://git.mokoconsulting.tech/MokoConsulting/dolibarr-api-mcp PATH: /SECURITY.md -VERSION: 09.36.00 +VERSION: 09.36.01 BRIEF: Security vulnerability reporting and handling policy --> diff --git a/mcp/servers/mokosuite_api/CONTRIBUTING.md b/mcp/servers/mokosuite_api/CONTRIBUTING.md index ba615f3..8249a15 100644 --- a/mcp/servers/mokosuite_api/CONTRIBUTING.md +++ b/mcp/servers/mokosuite_api/CONTRIBUTING.md @@ -14,7 +14,7 @@ DEFGROUP: INGROUP: Project.Documentation REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCli-Template-Generic - VERSION: 09.36.00 + VERSION: 09.36.01 PATH: ./CONTRIBUTING.md BRIEF: Contribution guidelines for the project --> diff --git a/mcp/servers/mokosuite_api/SECURITY.md b/mcp/servers/mokosuite_api/SECURITY.md index 2cfc703..785a90a 100644 --- a/mcp/servers/mokosuite_api/SECURITY.md +++ b/mcp/servers/mokosuite_api/SECURITY.md @@ -23,7 +23,7 @@ DEFGROUP: [PROJECT_NAME] INGROUP: [PROJECT_NAME].Documentation REPO: [REPOSITORY_URL] PATH: /SECURITY.md -VERSION: 09.36.00 +VERSION: 09.36.01 BRIEF: Security vulnerability reporting and handling policy --> diff --git a/tests/Unit/VersionBumpTest.php b/tests/Unit/VersionBumpTest.php index 309f91d..dde2bfc 100644 --- a/tests/Unit/VersionBumpTest.php +++ b/tests/Unit/VersionBumpTest.php @@ -63,7 +63,7 @@ class VersionBumpTest extends TestCase { file_put_contents( "{$this->tmpDir}/README.md", - "\nSome content\n" + "\nSome content\n" ); $this->execute(); diff --git a/tests/Unit/VersionReadTest.php b/tests/Unit/VersionReadTest.php index 13b910a..9b405cc 100644 --- a/tests/Unit/VersionReadTest.php +++ b/tests/Unit/VersionReadTest.php @@ -34,7 +34,7 @@ class VersionReadTest extends TestCase { file_put_contents( "{$this->tmpDir}/README.md", - "# Test\n\n" + "# Test\n\n" ); $this->assertSame('02.03.04', trim($this->runScript())); @@ -68,7 +68,7 @@ class VersionReadTest extends TestCase { file_put_contents( "{$this->tmpDir}/README.md", - "\n" + "\n" ); mkdir("{$this->tmpDir}/src", 0755, true); file_put_contents( diff --git a/validate/check_file_integrity.php b/validate/check_file_integrity.php index 7f499c6..47e3ba4 100644 --- a/validate/check_file_integrity.php +++ b/validate/check_file_integrity.php @@ -12,7 +12,7 @@ * INGROUP: MokoPlatform * REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform * PATH: /validate/check_file_integrity.php - * VERSION: 09.36.00 + * VERSION: 09.36.01 * BRIEF: Compare deployed files on a remote server against the local repository to detect drift */ -- 2.52.0