Files
shopify-ai-backup/EXTERNAL_WP_CLI_TESTING_SETUP.md
2026-02-08 20:15:38 +00:00

1094 lines
28 KiB
Markdown

# External WP-CLI Testing Setup Guide
Complete step-by-step guide to set up External WP-CLI Testing for PluginCompass. This system uses an externally hosted WordPress **Multisite** installation with WP-CLI to verify plugin functionality in isolated subsite environments, supporting 20+ concurrent tests.
---
## Table of Contents
1. [Overview](#overview)
2. [Architecture](#architecture)
3. [Prerequisites](#prerequisites)
4. [Part 1: Setting Up WordPress Multisite](#part-1-setting-up-wordpress-multisite)
5. [Part 2: Installing and Configuring WP-CLI](#part-2-installing-and-configuring-wp-cli)
6. [Part 3: Configuring SSH Access](#part-3-configuring-ssh-access)
7. [Part 4: Configuring Environment Variables](#part-4-configuring-environment-variables)
8. [Part 5: Testing the Connection](#part-5-testing-the-connection)
9. [Part 6: Enabling in Builder](#part-6-enabling-in-builder)
10. [Part 7: Using the Tools](#part-7-using-the-tools)
11. [Troubleshooting](#troubleshooting)
---
## Overview
### What This System Does
- **Isolated Testing**: Each test session runs in its own WordPress subsite (no cross-contamination)
- **High Concurrency**: Supports 20+ simultaneous tests via multisite subsites
- **Automated Provisioning**: Automatically creates/deletes test subsites
- **CLI Testing Mode**: Fast, deterministic WP-CLI based verification
- **Gated Tools**: Tools only load in OpenCode when Builder toggle is enabled
### Architecture Diagram
```
┌─────────────────────────────────────────────────────────────────┐
│ PluginCompass Chat Server (Your Server) │
│ - Runs Node.js chat app │
│ - Spawns OpenCode with env vars when toggle enabled │
└─────────────────────────────────────────────────────────────────┘
│ SSH + WP-CLI commands
┌─────────────────────────────────────────────────────────────────┐
│ External WordPress Multisite Test Server │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Session 1 │ │ Session 2 │ │ Session N │ │
│ │ Subsite │ │ Subsite │ │ Subsite │ │
│ │ /test-abc │ │ /test-def │ │ /test-xyz │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ Shared: Core WP, WP-CLI (isolated content/options per subsite)│
└─────────────────────────────────────────────────────────────────┘
```
### How It Works
1. User enables "External WP CLI testing" toggle in Builder
2. Chat server sets `OPENCODE_EXTRA_MCP_SERVERS` env var when spawning OpenCode
3. OpenCode loads the `wp-cli-testing` MCP server with tools:
- `test_plugin_external_wp` - Runs tests on external WP
- `external_wp_testing_config` - Validates configuration
4. When AI calls the tool:
- SSH connection established to WordPress server
- New subsite created via WP-CLI (`wp site create`)
- Plugin uploaded and activated
- Test scenarios executed via WP-CLI
- Results returned to AI
- Subsite cleaned up after delay
---
## Prerequisites
### Required Infrastructure
1. **A Linux server** (Ubuntu 20.04+ or Debian 11+ recommended)
- Minimum: 2GB RAM, 20GB disk, 2 CPU cores
- Recommended for production: 4GB RAM, 50GB disk, 4 CPU cores
2. **SSH access** with sudo privileges
3. **Domain or subdomain** pointing to the server
4. **LAMP/LEMP stack** installed (Linux, Apache/Nginx, MySQL, PHP)
### Software Requirements
- **PHP 7.4+** (PHP 8.0+ recommended)
- **MySQL 5.7+** or **MariaDB 10.3+**
- **WP-CLI** 2.6+
- **WordPress 6.0+**
- **SSH server** (OpenSSH)
---
## Part 1: Setting Up WordPress Multisite
### Step 1.1: Install Base WordPress
If you don't have WordPress installed yet:
```bash
# SSH into your test server
ssh user@wp-test.example.com
# Navigate to web root
cd /var/www/html
# Download WordPress
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xzf latest.tar.gz
sudo mv wordpress/* .
sudo rm -rf wordpress latest.tar.gz
# Set permissions
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
# Create database
sudo mysql -u root -p
```
In MySQL:
```sql
CREATE DATABASE wordpress_test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'strong_password_here';
GRANT ALL PRIVILEGES ON wordpress_test.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
Complete WordPress installation via browser at `http://your-domain.com/wp-admin/install.php`
### Step 1.2: Enable WordPress Multisite
**Important**: Backup your site before enabling multisite.
```bash
# SSH into server
ssh user@wp-test.example.com
# Edit wp-config.php
sudo nano /var/www/html/wp-config.php
```
Add these lines **before** `/* That's all, stop editing! */`:
```php
/* Multisite */
define('WP_ALLOW_MULTISITE', true);
```
Save and exit (`Ctrl+X`, `Y`, `Enter`).
### Step 1.3: Run Multisite Setup
1. Go to `http://your-domain.com/wp-admin/network-setup.php` in your browser
2. Choose **Subdirectories** (recommended for easier setup)
3. Fill in:
- **Network Title**: `PluginCompass Test Network`
- **Admin Email**: Your email
4. Click **Install**
### Step 1.4: Complete Network Configuration
WordPress will show you code to add. Follow these steps:
**A. Update wp-config.php:**
```bash
sudo nano /var/www/html/wp-config.php
```
Add the provided multisite configuration (it will look like this):
```php
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'wp-test.example.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
```
**B. Update .htaccess:**
```bash
sudo nano /var/www/html/.htaccess
```
Replace contents with the provided rewrite rules (similar to):
```apache
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
```
**C. Set Permissions:**
```bash
sudo chown www-data:www-data /var/www/html/.htaccess
sudo chmod 644 /var/www/html/.htaccess
```
### Step 1.5: Verify Multisite Installation
1. Log out and log back in to WordPress admin
2. You should now see **"My Sites"** in the admin bar
3. Navigate to **Network Admin → Sites** to see your network
**Test subsite creation manually:**
```bash
# You'll configure WP-CLI next, but this is the command pattern we'll use
wp site create --slug=test-manual --title="Test Site" --email="admin@example.com"
```
---
## Part 2: Installing and Configuring WP-CLI
### Step 2.1: Install WP-CLI
```bash
# SSH into server
ssh user@wp-test.example.com
# Download WP-CLI
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
# Test it works
php wp-cli.phar --info
# Make it executable and move to system path
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
# Verify installation
wp --info
```
Expected output:
```
OS: Linux 5.4.0-100-generic #113-Ubuntu SMP ...
Shell: /bin/bash
PHP binary: /usr/bin/php7.4
PHP version: 7.4.28
php.ini used: /etc/php/7.4/cli/php.ini
MySQL binary: /usr/bin/mysql
MySQL version: mysql Ver 15.1 Distrib 10.3.32-MariaDB
SQL modes:
WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir: phar://wp-cli.phar/vendor
WP_CLI phar path: /home/user
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 2.8.1
```
### Step 2.2: Configure WP-CLI for Web Server User
The chat server will run WP-CLI commands as the SSH user. We need to ensure it works:
```bash
# Test basic WP-CLI command
cd /var/www/html
wp --path=/var/www/html option get siteurl
# If you get permission errors, fix ownership
sudo chown -R www-data:www-data /var/www/html
# Add your SSH user to www-data group (replace 'wordpress' with your username)
sudo usermod -a -G www-data wordpress
# Set proper directory permissions
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
# Log out and back in for group changes to take effect
exit
ssh user@wp-test.example.com
```
### Step 2.3: Test Multisite Operations with WP-CLI
```bash
cd /var/www/html
# Test creating a subsite
wp site create --slug=test-cli-check --title="Test Subsite" --email="admin@example.com"
# Verify it was created
wp site list
# Test plugin operations on the subsite
wp --url=https://wp-test.example.com/test-cli-check plugin list
# Delete the test subsite
wp site delete --slug=test-cli-check --yes
# Confirm deletion
wp site list
```
If all commands succeed, WP-CLI is configured correctly.
---
## Part 3: Configuring SSH Access
### Step 3.1: Create SSH User for Testing
For security, create a dedicated user for the testing system:
```bash
# On the WordPress test server
sudo adduser wordpress
# Set a strong password when prompted
# Add to www-data group for file access
sudo usermod -a -G www-data wordpress
# Grant sudo privileges for WP-CLI (if needed)
sudo usermod -a -G sudo wordpress
```
**Alternative:** Use an existing user with appropriate permissions.
### Step 3.2: Generate SSH Key Pair
On your **PluginCompass chat server** (not the WordPress server):
```bash
# Generate SSH key pair
ssh-keygen -t ed25519 -C "plugincompass-wp-testing" -f ~/.ssh/wp-test-key
# This creates:
# - ~/.ssh/wp-test-key (private key - KEEP SECRET)
# - ~/.ssh/wp-test-key.pub (public key - safe to share)
# Set correct permissions
chmod 600 ~/.ssh/wp-test-key
chmod 644 ~/.ssh/wp-test-key.pub
# Display the public key (you'll need this for the next step)
cat ~/.ssh/wp-test-key.pub
```
**On Windows:**
```powershell
# Using PowerShell
ssh-keygen -t ed25519 -C "plugincompass-wp-testing" -f C:\keys\wp-test-key
# Set permissions
icacls "C:\keys\wp-test-key" /inheritance:r
icacls "C:\keys\wp-test-key" /grant:r "%USERNAME%:F"
# Display public key
type C:\keys\wp-test-key.pub
```
### Step 3.3: Install Public Key on WordPress Server
Copy the public key content, then on the **WordPress server**:
```bash
# Switch to the wordpress user (or your SSH user)
sudo su - wordpress
# Create .ssh directory if it doesn't exist
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Add the public key
nano ~/.ssh/authorized_keys
# Paste the public key (from wp-test-key.pub)
# Save and exit (Ctrl+X, Y, Enter)
# Set correct permissions
chmod 600 ~/.ssh/authorized_keys
# Exit back to your original user
exit
```
### Step 3.4: Test SSH Connection
From your **PluginCompass chat server**:
```bash
# Test SSH connection with the key
ssh -i ~/.ssh/wp-test-key wordpress@wp-test.example.com
# If successful, you should be logged in without a password
# Test WP-CLI works over SSH
cd /var/www/html && wp site list
# Exit
exit
```
**On Windows:**
```powershell
ssh -i C:\keys\wp-test-key wordpress@wp-test.example.com
```
### Step 3.5: Disable Strict Host Key Checking (Optional, for Testing)
For automated testing, you may want to disable strict host key checking:
On your **PluginCompass chat server**, create/edit SSH config:
```bash
nano ~/.ssh/config
```
Add:
```
Host wp-test.example.com
HostName wp-test.example.com
User wordpress
IdentityFile ~/.ssh/wp-test-key
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
```
**Security Note:** Only do this on trusted networks. For production, keep strict checking enabled and add the host to known_hosts properly.
---
## Part 4: Configuring Environment Variables
### Step 4.1: Locate Your Environment Configuration
Environment variables should be set where your **chat server** runs. Options:
**A. Using .env file (development):**
```bash
# In your chat server directory
nano .env
```
**B. Using systemd service (production):**
```bash
sudo nano /etc/systemd/system/plugincompass-chat.service
```
Add under `[Service]` section:
```
Environment="TEST_WP_HOST=wp-test.example.com"
Environment="TEST_WP_SSH_USER=wordpress"
...
```
**C. Using PM2 ecosystem file:**
```bash
nano ecosystem.config.js
```
Add to `env`:
```javascript
env: {
TEST_WP_HOST: 'wp-test.example.com',
TEST_WP_SSH_USER: 'wordpress',
...
}
```
### Step 4.2: Required Environment Variables
Add these variables (adjust paths for your setup):
```bash
# Core Connection Settings
TEST_WP_HOST=wp-test.example.com
TEST_WP_SSH_USER=wordpress
TEST_WP_SSH_KEY=/home/user/.ssh/wp-test-key
TEST_WP_PATH=/var/www/html
# Base URL (must match your WordPress installation)
TEST_WP_BASE_URL=https://wp-test.example.com
# Multisite Configuration
TEST_WP_MULTISITE=true
TEST_WP_SUBSITE_MODE=subdirectory
TEST_WP_SUBSITE_PREFIX=test
TEST_WP_SUBSITE_DOMAIN=wp-test.example.com
# Testing Configuration
TEST_MAX_CONCURRENT=20
TEST_TIMEOUT=600000
TEST_QUEUE_TIMEOUT=300000
# Cleanup Settings
TEST_AUTO_CLEANUP=true
TEST_CLEANUP_DELAY=3600000
# Error Logging (adjust to your log location)
TEST_WP_ERROR_LOG=/var/log/wp-errors.log
# SSH Settings
TEST_SSH_STRICT=false
```
**Windows paths example:**
```bash
TEST_WP_SSH_KEY=C:\\keys\\wp-test-key
```
### Step 4.3: Alternative Environment Variable Names
The system supports alternative names (useful if you have existing vars):
- `TEST_WP_HOST` or `EXTERNAL_WP_HOST`
- `TEST_WP_SSH_USER` or `EXTERNAL_WP_SSH_USER`
- `TEST_WP_SSH_KEY` or `EXTERNAL_WP_SSH_KEY` or `TEST_WP_SSH_KEY_PATH`
- `TEST_WP_PATH` or `EXTERNAL_WP_PATH`
- `TEST_WP_BASE_URL` or `EXTERNAL_WP_BASE_URL`
- etc.
### Step 4.4: Apply Environment Variables
**If using .env:**
```bash
# Restart your chat server
npm run restart
# or
pm2 restart chat-server
```
**If using systemd:**
```bash
sudo systemctl daemon-reload
sudo systemctl restart plugincompass-chat
```
---
## Part 5: Testing the Connection
### Step 5.1: Verify Environment Variables
Check that variables are loaded:
```bash
# If using Node.js directly
node -e "console.log(process.env.TEST_WP_HOST)"
# Should output: wp-test.example.com
# If using PM2
pm2 env 0 | grep TEST_WP
```
### Step 5.2: Test SSH Connection from Chat Server
From your chat server, verify SSH works:
```bash
ssh -i $TEST_WP_SSH_KEY $TEST_WP_SSH_USER@$TEST_WP_HOST "wp site list"
```
Expected output: List of sites in your multisite network.
### Step 5.3: Test Direct Tool Invocation
Create a test script to verify the external-wp-testing module:
```javascript
// test-wp-connection.js
const { createExternalWpTester, getExternalTestingConfig } = require('./chat/external-wp-testing.js');
async function test() {
// 1. Check config
console.log('1. Checking configuration...');
const config = getExternalTestingConfig();
console.log('Config:', JSON.stringify(config, null, 2));
const missing = [];
if (!config.wpHost) missing.push('TEST_WP_HOST');
if (!config.wpSshUser) missing.push('TEST_WP_SSH_USER');
if (!config.wpSshKey) missing.push('TEST_WP_SSH_KEY');
if (missing.length > 0) {
console.error('❌ Missing required environment variables:', missing);
process.exit(1);
}
console.log('✅ Configuration valid\n');
// 2. Test connection by running a simple WP-CLI command
console.log('2. Testing SSH + WP-CLI connection...');
const tester = createExternalWpTester({});
// This would normally upload a plugin, but we'll just test the infrastructure
console.log('Configuration loaded successfully. SSH credentials are set.');
console.log('✅ Ready for testing\n');
}
test().catch(console.error);
```
Run it:
```bash
node test-wp-connection.js
```
### Step 5.4: Test Subsite Creation (Manual)
SSH into your WordPress server and manually test the subsite flow:
```bash
ssh -i ~/.ssh/wp-test-key wordpress@wp-test.example.com
cd /var/www/html
# Create test subsite
wp site create --slug=test-manual-abc --title="Manual Test" --email="admin@example.com"
# Verify it exists
wp site list | grep test-manual-abc
# Check URL is accessible
curl -I https://wp-test.example.com/test-manual-abc/
# Clean up
wp site delete --slug=test-manual-abc --yes
exit
```
If all steps succeed, your infrastructure is ready!
---
## Part 6: Enabling in Builder
### Step 6.1: Access Builder Settings
1. Open PluginCompass Builder in your browser
2. Look for the **"External WP CLI testing"** toggle
3. It may show usage information (e.g., "0 / 10 tests used")
### Step 6.2: Enable the Toggle
1. Click the toggle to enable it
2. You may see a confirmation: "External WP tests run a series of WP-CLI checks on an external WordPress site. Tests are counted against your monthly allowance."
3. Click **OK** or **Confirm**
### Step 6.3: Verify Toggle State
The toggle should:
- Show as **ON/enabled** (blue/green indicator)
- Display current usage stats
- Be persistent across page refreshes
**Behind the scenes**: When enabled:
- `builderState.externalTestingEnabled = true`
- When a message is sent, `externalTestingEnabled: true` is included in the payload
- Chat server sets `OPENCODE_EXTRA_MCP_SERVERS` env var when spawning OpenCode
- OpenCode loads the `wp-cli-testing` MCP server
- Tools `test_plugin_external_wp` and `external_wp_testing_config` become available to AI
**When disabled**: Tools are NOT loaded into OpenCode (gated at the environment variable level).
---
## Part 7: Using the Tools
### How Tests Work
1. **User Request**: User asks AI to create a plugin in Builder
2. **AI Generates Code**: AI creates plugin files in the workspace
3. **AI Calls Test Tool**: AI invokes `test_plugin_external_wp` with plugin path
4. **Automated Flow**:
- Subsite created: `wp site create --slug=test-<sessionid>`
- Plugin uploaded via SSH/SFTP
- Plugin activated: `wp plugin activate <plugin-slug>`
- Test scenarios executed via WP-CLI
- Results returned to AI
- Subsite scheduled for cleanup (after 1 hour by default)
### Tool 1: test_plugin_external_wp
**Purpose**: Run automated CLI tests on a real WordPress installation
**Example AI Usage**:
```javascript
{
"plugin_path": "/workspace/session-abc/my-custom-plugin",
"plugin_slug": "my-custom-plugin",
"test_mode": "cli",
"required_plugins": [
{
"plugin_slug": "woocommerce",
"activate": true
}
],
"test_scenarios": [
{
"name": "Plugin activates without errors",
"type": "custom",
"wp_cli_command": "plugin activate my-custom-plugin",
"assertions": {
"wp_cli_success": true,
"not_contains": ["Fatal error", "Parse error"]
}
},
{
"name": "Custom endpoint responds",
"type": "endpoint",
"url": "/custom-endpoint",
"assertions": {
"status_code": 200,
"contains": ["success"]
}
}
]
}
```
**Return Value**:
```json
{
"ok": true,
"session_id": "abc123",
"subsite_url": "https://wp-test.example.com/test-abc123",
"test_results": {
"mode": "cli",
"cli_tests": {
"passed": 2,
"failed": 0,
"results": [
{
"name": "Plugin activates without errors",
"status": "passed",
"command": "wp plugin activate my-custom-plugin",
"output": "Success: Activated 1 of 1 plugins.",
"duration": 1234
}
]
}
},
"installed_plugins": [
{ "slug": "woocommerce", "status": "active" },
{ "slug": "my-custom-plugin", "status": "active" }
],
"errors": [],
"warnings": [],
"duration": 15230,
"cleanup_scheduled": "2026-02-08T11:30:00Z"
}
```
### Tool 2: external_wp_testing_config
**Purpose**: Validate configuration without running tests
**Example AI Usage**:
```javascript
{}
// or
{ "config_overrides": {} }
```
**Return Value**:
```json
{
"ok": true,
"missing": [],
"config": {
"wpHost": "wp-test.example.com",
"wpSshUser": "wordpress",
"wpSshKey": "/home/user/.ssh/wp-test-key",
"wpPath": "/var/www/html",
"wpBaseUrl": "https://wp-test.example.com",
"enableMultisite": true,
"subsiteMode": "subdirectory",
"subsitePrefix": "test",
"maxConcurrentTests": 20
}
}
```
**If configuration is invalid**:
```json
{
"ok": false,
"missing": ["TEST_WP_HOST", "TEST_WP_SSH_KEY"],
"config": { ... }
}
```
### Default Test Scenarios
If `test_scenarios` is not provided, the system generates default tests:
1. **Plugin Activation Test**
- Command: `wp plugin activate <plugin-slug>`
- Asserts: No fatal errors, no parse errors
2. **Plugin Status Check**
- Command: `wp plugin status <plugin-slug>`
- Asserts: Plugin listed as "Active"
3. **Error Log Scan**
- Command: `tail -n 200 /var/log/wp-errors.log | grep <plugin-slug>`
- Asserts: No fatal/parse errors related to plugin
### Example Builder Workflow
1. User: "Create a plugin that adds a custom /vendor-login endpoint"
2. AI generates plugin code
3. Builder shows "Proceed with Build" button
4. User clicks → AI calls OpenCode
5. OpenCode processes build, then:
```javascript
// AI calls test tool
test_plugin_external_wp({
plugin_path: "/workspace/vendor-login-plugin",
plugin_slug: "vendor-login",
test_scenarios: [
{
name: "Login endpoint accessible",
type: "endpoint",
url: "/vendor-login",
assertions: {
status_code: 200,
contains: ["<form", "name=\"log\""]
}
}
]
})
```
6. Results shown to user:
```
✅ External WP CLI Testing
Status: Passed
CLI Tests: 3 passed, 0 failed
Subsite: https://wp-test.example.com/test-a3f7d2
```
---
## Troubleshooting
### Issue: "SSH key not found"
**Error**: `External WordPress test host SSH key is missing or invalid`
**Solutions**:
1. Check environment variable path:
```bash
echo $TEST_WP_SSH_KEY
ls -la $TEST_WP_SSH_KEY
```
2. Ensure file permissions:
```bash
chmod 600 ~/.ssh/wp-test-key
```
3. Use absolute path in env var (not `~`)
### Issue: "Permission denied (publickey)"
**Error**: SSH connection fails
**Solutions**:
1. Verify public key is in `authorized_keys`:
```bash
ssh wordpress@wp-test.example.com
cat ~/.ssh/authorized_keys | grep "plugincompass"
```
2. Check SSH key permissions on client:
```bash
ls -la ~/.ssh/wp-test-key
# Should show: -rw------- (600)
```
3. Test connection manually:
```bash
ssh -i ~/.ssh/wp-test-key -v wordpress@wp-test.example.com
# -v flag shows verbose debug info
```
### Issue: "WP-CLI command not found"
**Error**: `wp: command not found` over SSH
**Solutions**:
1. Verify WP-CLI installed:
```bash
ssh wordpress@wp-test.example.com "which wp"
# Should output: /usr/local/bin/wp
```
2. Add to PATH in .bashrc:
```bash
echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc
source ~/.bashrc
```
3. Use full path in commands:
```bash
/usr/local/bin/wp site list
```
### Issue: "Error establishing database connection"
**Error**: Subsites show database error
**Solutions**:
1. Check WordPress database credentials in `wp-config.php`
2. Verify MySQL/MariaDB is running:
```bash
sudo systemctl status mysql
```
3. Test database connection:
```bash
wp db check
```
### Issue: "Subsite creation fails"
**Error**: `wp site create` returns error
**Solutions**:
1. Verify multisite is enabled:
```bash
wp eval "echo MULTISITE ? 'yes' : 'no';"
# Should output: yes
```
2. Check network setup:
```bash
wp site list
```
3. Ensure `.htaccess` has correct rewrite rules (see Part 1.4)
4. Check Apache mod_rewrite is enabled:
```bash
sudo a2enmod rewrite
sudo systemctl restart apache2
```
### Issue: "Plugin upload fails"
**Error**: Cannot copy plugin files to server
**Solutions**:
1. Check directory permissions:
```bash
ls -la /var/www/html/wp-content/plugins/
# Should be writable by SSH user or www-data
```
2. Fix ownership:
```bash
sudo chown -R www-data:www-data /var/www/html/wp-content/plugins
sudo chmod -R 755 /var/www/html/wp-content/plugins
```
3. Add SSH user to www-data group:
```bash
sudo usermod -a -G www-data wordpress
```
### Issue: "Tools not appearing in OpenCode"
**Error**: AI says tools are not available
**Solutions**:
1. **Check Builder toggle is enabled**
- Open Builder settings
- Verify "External WP CLI testing" is ON
2. **Verify environment variables in chat server**:
```bash
# Check if vars are set
node -e "console.log(process.env.TEST_WP_HOST)"
```
3. **Check server logs**:
```bash
# Look for "Enabling WP CLI Testing MCP server"
tail -f logs/chat-server.log
```
4. **Restart chat server**:
```bash
pm2 restart chat-server
# or
npm run restart
```
5. **Verify MCP server file exists**:
```bash
ls -la opencode/mcp-servers/wp-cli-testing/index.js
```
### Issue: "Tests timeout"
**Error**: Tests take too long and fail
**Solutions**:
1. Increase timeout in env vars:
```bash
TEST_TIMEOUT=900000 # 15 minutes
```
2. Check network latency:
```bash
ping wp-test.example.com
```
3. Verify WordPress server resources:
```bash
ssh wordpress@wp-test.example.com "free -h && df -h"
```
### Issue: "Subsites not cleaning up"
**Error**: Old test subsites accumulate
**Solutions**:
1. Check cleanup is enabled:
```bash
TEST_AUTO_CLEANUP=true
TEST_CLEANUP_DELAY=3600000 # 1 hour
```
2. Manually list and delete:
```bash
ssh wordpress@wp-test.example.com
wp site list | grep "test-"
# Delete old subsites
wp site delete --slug=test-abc123 --yes
```
3. Create cleanup cron job:
```bash
# On WordPress server
crontab -e
# Add line to run daily cleanup:
0 2 * * * cd /var/www/html && wp site list --field=url | grep "/test-" | xargs -I {} wp site delete --url={} --yes
```
### Getting Help
If issues persist:
1. **Check logs**:
- Chat server logs: `tail -f logs/chat-server.log`
- WordPress error log: `tail -f /var/log/wp-errors.log`
- Apache/Nginx error log: `tail -f /var/log/apache2/error.log`
2. **Test components individually**:
- SSH: `ssh -v -i <key> user@host`
- WP-CLI: `wp site list`
- Subsite: `curl -I https://wp-test.example.com/test-abc/`
3. **Verify configuration**:
- Run `external_wp_testing_config` tool via AI
- Check all required env vars are set
- Confirm SSH key has correct permissions
---
## Summary
You've now set up:
**WordPress Multisite** with subdirectory subsites
**WP-CLI** for command-line control
**SSH key authentication** for secure access
**Environment variables** configured in chat server
**Gated MCP tools** that only load when Builder toggle is enabled
**Isolated testing** via automatic subsite provisioning
**Next Steps**:
- Enable toggle in Builder
- Ask AI to create a plugin
- Watch as it automatically tests on your external WordPress installation
- Review test results in the chat
The system supports **20+ concurrent tests** through multisite subsite isolation, with automatic cleanup and comprehensive CLI-based verification.