feat: Initialize MediaWiki project with accessibility-focused workflow

- Added package.json to manage project dependencies and scripts for initialization, setup, and accessibility testing.
- Created scripts for initializing MediaWiki, installing dependencies, and starting a development server.
- Implemented accessibility testing configurations using Pa11y and Lighthouse.
- Added configuration files for accessibility testing with Pa11y and Lighthouse.
This commit is contained in:
Sascha 2026-05-22 16:36:59 +02:00
commit 277e289c45
13 changed files with 5395 additions and 0 deletions

View File

@ -0,0 +1,22 @@
---
name: accessibility-reviewer
description: Reviews MediaWiki changes for WCAG 2.1 AA conformance
model: GPT-5.3-Codex
tools:
- read_file
- grep_search
- semantic_search
---
You are an accessibility-focused code reviewer for this repository.
Objectives:
- Enforce WCAG 2.1 AA baseline for any UI or template change.
- Treat AAA improvements as best-effort enhancements.
- Return findings ordered by severity.
When reviewing:
1. Identify violations affecting keyboard, semantics, labels, focus, contrast, and error handling.
2. Reference likely WCAG criteria in plain language.
3. Propose concrete code-level fixes.
4. Flag missing automated tests where relevant.

View File

@ -0,0 +1,26 @@
---
applyTo:
- "mediawiki/skins/**/*.mustache"
- "mediawiki/skins/**/*.css"
- "mediawiki/skins/**/*.less"
- "mediawiki/extensions/**/*.php"
- "mediawiki/extensions/**/*.js"
---
# Accessibility Rules For This Repository
Treat WCAG 2.1 AA as required and AAA as best effort.
## Required checks in code changes
- Use semantic elements for page landmarks and structure.
- Ensure all controls are keyboard operable.
- Keep visible focus indicators.
- Provide labels for form controls and clear error messages.
- Keep meaningful alt text on informative images.
- Avoid color-only communication.
- Maintain AA contrast ratios for text and UI components.
## Review behavior
- Call out WCAG failures with exact remediation.
- Prefer MediaWiki/Codex conventions over custom inaccessible patterns.
- Recommend tests for any UI change that can regress accessibility.

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
node_modules/
mediawiki/
composer.phar
mediawiki/cache/
mediawiki/images/
mediawiki/vendor/
mediawiki/LocalSettings.php
.lighthouseci/

57
README.md Normal file
View File

@ -0,0 +1,57 @@
# GPLX MediaWiki
Local-first MediaWiki bootstrap for Windows with an accessibility-focused workflow.
## Quick start
1. Install prerequisites:
- Git
- Node.js 20+
- PHP 8.1+ (XAMPP/WampServer or standalone)
2. Install Node tooling:
```bash
npm install
```
3. Initialize MediaWiki core:
```bash
npm run mw:init
```
4. Install MediaWiki PHP dependencies:
```bash
npm run mw:deps
```
Or run both steps with one command:
```bash
npm run mw:setup
```
5. Start local dev server:
```bash
npm run dev
```
Then open: http://127.0.0.1:8080 and continue setup at /mw-config/index.php
## Accessibility checks
Run static/runtime checks against local pages:
```bash
npm run a11y:all
```
## Notes
- This setup runs without Docker.
- WCAG AA is the required baseline.
- AAA improvements are tracked as best effort.

View File

@ -0,0 +1,33 @@
# Accessibility Workflow
## Policy
- Baseline: WCAG 2.1 AA required
- Stretch target: AAA where practical
## Agent usage
- Use repository instructions in .github/instructions/accessibility.instructions.md
- Use dedicated reviewer in .github/agents/accessibility-reviewer.agent.md
## Developer checklist
- Keyboard-only interaction works for all interactive elements
- Focus state remains visible in every state
- Forms have programmatic labels and useful error hints
- Landmarks and heading order are logical
- Contrast meets AA ratios
- Content is understandable without color cues alone
## Tooling
- Pa11y CI with WCAG2AA profile
- Lighthouse accessibility scoring
## Local command
```bash
npm run a11y:all
```
Run after any template, style, or interaction change.

View File

@ -0,0 +1,42 @@
# Windows Installation (No Docker)
## 1. Install prerequisites
- Git
- Node.js 20+
- PHP 8.1+ with required extensions for MediaWiki
- One database option:
- SQLite for fast local tests, or
- MariaDB/MySQL for production-like behavior
## 2. Install project dependencies
```bash
npm install
```
## 3. Fetch MediaWiki source
```bash
npm run mw:init
```
Default branch is REL1_43 in scripts/mw-init.ps1. Adjust if needed.
## 4. Start local server
```bash
npm run dev
```
Open http://127.0.0.1:8080 and complete the MediaWiki web installer.
## 5. Save LocalSettings.php
After installer completion, place generated LocalSettings.php in mediawiki/.
## 6. Run accessibility checks
```bash
npm run a11y:all
```

5024
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

22
package.json Normal file
View File

@ -0,0 +1,22 @@
{
"name": "gplx-mediawiki",
"private": true,
"version": "0.1.0",
"description": "Local MediaWiki project with accessibility-focused workflow",
"scripts": {
"mw:init": "pwsh -ExecutionPolicy Bypass -File ./scripts/mw-init.ps1",
"mw:deps": "pwsh -ExecutionPolicy Bypass -File ./scripts/mw-deps.ps1",
"mw:setup": "npm run mw:init && npm run mw:deps",
"dev": "pwsh -ExecutionPolicy Bypass -File ./scripts/dev.ps1",
"a11y:pa11y": "pa11y-ci --config ./tests/accessibility/pa11y.config.json",
"a11y:lighthouse": "lhci autorun --config=./tests/accessibility/lighthouserc.json",
"a11y:all": "npm run a11y:pa11y && npm run a11y:lighthouse"
},
"devDependencies": {
"@lhci/cli": "^0.14.0",
"pa11y-ci": "^3.1.0"
},
"engines": {
"node": ">=20"
}
}

46
scripts/dev.ps1 Normal file
View File

@ -0,0 +1,46 @@
param(
[int]$Port = 8080,
[string]$HostName = "127.0.0.1"
)
$ErrorActionPreference = "Stop"
function Resolve-PhpCommand {
$phpCommand = Get-Command php -ErrorAction SilentlyContinue
if ($phpCommand) {
return "php"
}
$candidates = @(
"D:\\xampp\\php\\php.exe",
"C:\\xampp\\php\\php.exe",
"C:\\wamp64\\bin\\php\\php8.3.0\\php.exe",
"C:\\wamp64\\bin\\php\\php8.2.0\\php.exe",
"C:\\wamp64\\bin\\php\\php8.1.0\\php.exe"
)
foreach ($candidate in $candidates) {
if (Test-Path $candidate) {
return $candidate
}
}
return $null
}
$php = Resolve-PhpCommand
if (-not $php) {
Write-Error "PHP is not available in PATH and no common XAMPP/Wamp PHP executable was found. Install PHP or add php.exe to PATH."
}
if (-not (Test-Path "./mediawiki")) {
Write-Error "Missing ./mediawiki. Run 'npm run mw:init' first."
}
if (-not (Test-Path "./mediawiki/index.php")) {
Write-Error "./mediawiki does not look like a valid MediaWiki core directory."
}
Write-Host "Starting MediaWiki dev server at http://$HostName`:$Port"
Write-Host "Use Ctrl+C to stop."
& $php -S "$HostName`:$Port" -t "./mediawiki"

63
scripts/mw-deps.ps1 Normal file
View File

@ -0,0 +1,63 @@
$ErrorActionPreference = "Stop"
function Resolve-PhpCommand {
$phpCommand = Get-Command php -ErrorAction SilentlyContinue
if ($phpCommand) {
return "php"
}
$candidates = @(
"D:\\xampp\\php\\php.exe",
"C:\\xampp\\php\\php.exe",
"C:\\wamp64\\bin\\php\\php8.3.0\\php.exe",
"C:\\wamp64\\bin\\php\\php8.2.0\\php.exe",
"C:\\wamp64\\bin\\php\\php8.1.0\\php.exe"
)
foreach ($candidate in $candidates) {
if (Test-Path $candidate) {
return $candidate
}
}
return $null
}
if (-not (Test-Path "./mediawiki/composer.json")) {
Write-Error "Missing ./mediawiki/composer.json. Run 'npm run mw:init' first."
}
$php = Resolve-PhpCommand
if (-not $php) {
Write-Error "PHP executable not found. Install XAMPP/WampServer or add php.exe to PATH."
}
if (-not (Test-Path "./composer.phar")) {
Write-Host "Downloading Composer locally (composer.phar)..."
& $php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
if (-not (Test-Path "./composer-setup.php")) {
Write-Error "Could not download Composer installer."
}
& $php .\composer-setup.php --filename=composer.phar
Remove-Item .\composer-setup.php -ErrorAction SilentlyContinue
}
Write-Host "Checking required PHP extensions..."
$loadedExtensions = (& $php -m) | ForEach-Object { $_.Trim().ToLower() }
$requiredExtensions = @("intl")
$missing = @()
foreach ($ext in $requiredExtensions) {
if ($loadedExtensions -notcontains $ext) {
$missing += $ext
}
}
if ($missing.Count -gt 0) {
Write-Error "Missing PHP extension(s): $($missing -join ', '). Enable them in php.ini and restart dev server."
}
Write-Host "Installing MediaWiki Composer dependencies..."
& $php .\composer.phar --working-dir=mediawiki install --no-dev --prefer-dist --optimize-autoloader
Write-Host "MediaWiki dependencies are installed."

17
scripts/mw-init.ps1 Normal file
View File

@ -0,0 +1,17 @@
param(
[string]$Branch = "REL1_43",
[string]$RepoUrl = "https://gerrit.wikimedia.org/r/mediawiki/core.git"
)
$ErrorActionPreference = "Stop"
if (Test-Path "./mediawiki") {
Write-Host "mediawiki directory already exists. Skip clone."
exit 0
}
Write-Host "Cloning MediaWiki branch $Branch..."
git clone --depth 1 --branch $Branch $RepoUrl mediawiki
Write-Host "MediaWiki source ready in ./mediawiki"
Write-Host "Next: run 'npm run dev' to start local server."

View File

@ -0,0 +1,24 @@
{
"ci": {
"collect": {
"numberOfRuns": 1,
"url": [
"http://127.0.0.1:8080/",
"http://127.0.0.1:8080/index.php/Main_Page"
]
},
"assert": {
"assertions": {
"categories:accessibility": [
"warn",
{
"minScore": 0.9
}
]
}
},
"upload": {
"target": "temporary-public-storage"
}
}
}

View File

@ -0,0 +1,11 @@
{
"defaults": {
"standard": "WCAG2AA",
"timeout": 60000,
"wait": 1000
},
"urls": [
"http://127.0.0.1:8080/",
"http://127.0.0.1:8080/index.php/Main_Page"
]
}