Files
mokoplatform/validate/check_wiki_health.php
Jonathan Miller b73c1eba25
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Generic: Project CI / Tests (pull_request) Has been cancelled
Platform: mokoplatform CI / Gate 2: Unit Tests (8.1) (pull_request) Has been cancelled
Platform: mokoplatform CI / Gate 2: Unit Tests (8.2) (pull_request) Has been cancelled
Platform: mokoplatform CI / Gate 2: Unit Tests (8.3) (pull_request) Has been cancelled
Platform: mokoplatform CI / Gate 3: Self-Health Check (pull_request) Has been cancelled
Platform: mokoplatform CI / Gate 4: Governance (pull_request) Has been cancelled
Platform: mokoplatform CI / Gate 5: Template Integrity (pull_request) Has been cancelled
Platform: mokoplatform CI / CI Summary (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Generic: Repo Health / Site Health (pull_request) Has been cancelled
Universal: PR Check / Branch Policy (pull_request) Has been cancelled
Generic: Repo Health / Access control (pull_request) Has been cancelled
Universal: Build & Release / Promote to RC (pull_request) Has been cancelled
RC Revert / Rename rc/ back to dev/ (pull_request) Has been cancelled
Universal: Security Audit / Dependency Audit (pull_request) Has been cancelled
Branch Cleanup / Delete merged branch (pull_request) Has been cancelled
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Has been cancelled
Universal: PR Check / Validate PR (pull_request) Has been cancelled
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been cancelled
Generic: Project CI / Lint & Validate (pull_request) Has been cancelled
Platform: mokoplatform CI / Gate 1: Code Quality (pull_request) Has been cancelled
feat: add manifest_detect.php CLI tool for auto-detecting manifest fields
Scans source files to detect platform, name, version, element_name,
package_type, language, entry_point, description, and license_spdx.
Supports Joomla, Dolibarr, Go, MCP/Node, and generic platforms.

Includes --diff and --update modes for comparing against and pushing
to the Gitea manifest API. Warns on missing core fields.

Also removes deprecated mcp/servers/mokowaas_api (consolidated to
separate repo) and syncs dev branch changes.
2026-06-07 15:37:24 -05:00

161 lines
5.2 KiB
PHP

#!/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.Validate
* INGROUP: MokoPlatform
* REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
* PATH: /validate/check_wiki_health.php
* BRIEF: Validate wiki health — checks Home page exists, has mokoplatform link, pages are indexed
*/
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use MokoEnterprise\CliFramework;
/**
* Wiki Health Checker
*
* Validates Gitea wiki structure and content for a repository,
* checking for required pages, broken links, and formatting issues.
*
* @since 04.00.00
*/
class CheckWikiHealth extends CliFramework
{
protected function configure(): void
{
$this->setDescription('Validate wiki health for a repository');
$this->addArgument('--path', 'Repository path (default: current directory)', '.');
$this->addArgument('--gitea-url', 'Gitea base URL', 'https://git.mokoconsulting.tech');
$this->addArgument('--token', 'Gitea API token (or set GITEA_TOKEN env var)', '');
$this->addArgument('--json', 'Output as JSON', false);
}
protected function run(): int
{
$repoPath = realpath($this->getArgument('--path', '.')) ?: '.';
$giteaUrl = $this->getArgument('--gitea-url', 'https://git.mokoconsulting.tech');
$token = $this->getArgument('--token', getenv('GITEA_TOKEN') ?: '');
// Detect repo owner/name from git config
$configFile = $repoPath . '/.git/config';
$remote = '';
if (is_file($configFile)) {
$config = file_get_contents($configFile);
if (preg_match('/url\s*=\s*(.+)/', $config, $m)) {
$remote = trim($m[1]);
}
}
if (empty($remote)) {
$this->log('Cannot determine git remote — skipping wiki check', 'WARNING');
return 0;
}
// Parse owner/repo from remote URL
if (preg_match('#[:/]([^/]+)/([^/.]+?)(?:\.git)?$#', $remote, $m)) {
$owner = $m[1];
$repo = $m[2];
} else {
$this->log("Cannot parse owner/repo from remote: {$remote}", 'WARNING');
return 0;
}
$this->log("Checking wiki: {$owner}/{$repo}");
$issues = 0;
// Check wiki pages via API
$apiUrl = "{$giteaUrl}/api/v1/repos/{$owner}/{$repo}/wiki/pages";
$headers = $token ? ["Authorization: token {$token}"] : [];
$pages = $this->apiGet($apiUrl, $headers);
if ($pages === null) {
$this->log(' No wiki found or API error', 'WARNING');
$issues++;
if ($this->getArgument("--json", false)) {
echo json_encode(['status' => 'no_wiki', 'issues' => $issues]);
}
return 0;
}
$pageCount = count($pages);
$this->log(" Found {$pageCount} wiki page(s)");
// Check Home exists
$hasHome = false;
$pageTitles = [];
foreach ($pages as $page) {
$title = $page['title'] ?? '';
$pageTitles[] = $title;
if (strtolower($title) === 'home') {
$hasHome = true;
}
}
if (!$hasHome) {
$this->log(' FAIL: No Home page', 'ERROR');
$issues++;
} else {
$this->log(' OK: Home page exists');
}
// Check Home has mokoplatform link
if ($hasHome) {
$homeUrl = "{$giteaUrl}/api/v1/repos/{$owner}/{$repo}/wiki/page/Home";
$home = $this->apiGet($homeUrl, $headers);
if ($home) {
$content = base64_decode($home['content_base64'] ?? '');
if (stripos($content, 'mokoplatform/wiki') !== false || stripos($content, 'mokoplatform') !== false) {
$this->log(' OK: Has mokoplatform reference');
} else {
$this->log(' WARN: Home page missing mokoplatform reference', 'WARNING');
$issues++;
}
}
}
if ($this->getArgument("--json", false)) {
echo json_encode([
'repo' => "{$owner}/{$repo}",
'pages' => $pageCount,
'has_home' => $hasHome,
'issues' => $issues,
'page_titles' => $pageTitles,
], JSON_PRETTY_PRINT);
}
return $issues > 0 ? 1 : 0;
}
private function apiGet(string $url, array $headers = []): ?array
{
$ctx = stream_context_create([
'http' => [
'method' => 'GET',
'header' => array_merge(['Accept: application/json'], $headers),
'timeout' => 10,
'ignore_errors' => true,
],
'ssl' => ['verify_peer' => false],
]);
$response = @file_get_contents($url, false, $ctx);
if ($response === false) {
return null;
}
$data = json_decode($response, true);
return is_array($data) ? $data : null;
}
}
$app = new CheckWikiHealth();
exit($app->execute());