claude-plugin-wordpress-manager 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +2 -2
- package/CHANGELOG.md +30 -0
- package/agents/wp-content-strategist.md +30 -0
- package/agents/wp-monitoring-agent.md +50 -0
- package/docs/GUIDE.md +249 -15
- package/docs/plans/2026-02-28-wcop-strategic-assessment.md +220 -0
- package/hooks/hooks.json +9 -0
- package/package.json +6 -3
- package/servers/wp-rest-bridge/build/tools/index.d.ts +119 -0
- package/servers/wp-rest-bridge/build/tools/index.js +3 -0
- package/servers/wp-rest-bridge/build/tools/wc-webhooks.d.ts +129 -0
- package/servers/wp-rest-bridge/build/tools/wc-webhooks.js +142 -0
- package/servers/wp-rest-bridge/build/types.d.ts +12 -0
- package/skills/wordpress-router/references/decision-tree.md +7 -3
- package/skills/wp-content/SKILL.md +3 -0
- package/skills/wp-content-repurposing/SKILL.md +96 -0
- package/skills/wp-content-repurposing/references/content-atomization.md +117 -0
- package/skills/wp-content-repurposing/references/email-newsletter.md +136 -0
- package/skills/wp-content-repurposing/references/platform-specs.md +80 -0
- package/skills/wp-content-repurposing/references/social-formats.md +169 -0
- package/skills/wp-content-repurposing/scripts/repurposing_inspect.mjs +140 -0
- package/skills/wp-headless/SKILL.md +1 -0
- package/skills/wp-monitoring/SKILL.md +12 -2
- package/skills/wp-monitoring/references/fleet-monitoring.md +160 -0
- package/skills/wp-monitoring/scripts/monitoring_inspect.mjs +54 -1
- package/skills/wp-webhooks/SKILL.md +107 -0
- package/skills/wp-webhooks/references/integration-recipes.md +176 -0
- package/skills/wp-webhooks/references/payload-formats.md +134 -0
- package/skills/wp-webhooks/references/webhook-security.md +147 -0
- package/skills/wp-webhooks/references/woocommerce-webhooks.md +129 -0
- package/skills/wp-webhooks/references/wordpress-core-webhooks.md +162 -0
- package/skills/wp-webhooks/scripts/webhook_inspect.mjs +157 -0
- package/skills/wp-woocommerce/SKILL.md +1 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* repurposing_inspect.mjs — Detect content repurposing readiness for WordPress projects.
|
|
3
|
+
*
|
|
4
|
+
* Scans for existing content volume, social media plugins, and email marketing
|
|
5
|
+
* integrations to assess repurposing potential.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node repurposing_inspect.mjs [--cwd=/path/to/project]
|
|
9
|
+
*
|
|
10
|
+
* Exit codes:
|
|
11
|
+
* 0 — repurposing-relevant configuration found
|
|
12
|
+
* 1 — no relevant configuration found
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
16
|
+
import { join, resolve } from 'node:path';
|
|
17
|
+
import { argv, stdout, exit } from 'node:process';
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
function readFileSafe(filePath) {
|
|
24
|
+
try { return readFileSync(filePath, 'utf-8'); } catch { return null; }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function existsSafe(filePath) {
|
|
28
|
+
try { return existsSync(filePath); } catch { return false; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function globDir(dirPath) {
|
|
32
|
+
try { return readdirSync(dirPath); } catch { return []; }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Detectors
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
function detectSocialPlugins(cwd) {
|
|
40
|
+
const indicators = [];
|
|
41
|
+
const plugins = globDir(join(cwd, 'wp-content', 'plugins'));
|
|
42
|
+
const socialPlugins = [
|
|
43
|
+
'jetpack', 'blog2social', 'social-auto-poster', 'nextscripts-social',
|
|
44
|
+
'revive-old-posts', 'social-warfare', 'monarch', 'shareaholic',
|
|
45
|
+
'add-to-any', 'social-snap', 'novashare',
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
for (const plugin of plugins) {
|
|
49
|
+
if (socialPlugins.some(sp => plugin.toLowerCase().includes(sp))) {
|
|
50
|
+
indicators.push(`social_plugin: ${plugin}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return { found: indicators.length > 0, indicators };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function detectEmailPlugins(cwd) {
|
|
58
|
+
const indicators = [];
|
|
59
|
+
const plugins = globDir(join(cwd, 'wp-content', 'plugins'));
|
|
60
|
+
const emailPlugins = [
|
|
61
|
+
'mailchimp', 'newsletter', 'mailpoet', 'convertkit', 'sendinblue',
|
|
62
|
+
'brevo', 'constant-contact', 'hubspot', 'activecampaign', 'fluentcrm',
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
for (const plugin of plugins) {
|
|
66
|
+
if (emailPlugins.some(ep => plugin.toLowerCase().includes(ep))) {
|
|
67
|
+
indicators.push(`email_plugin: ${plugin}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return { found: indicators.length > 0, indicators };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function detectContentVolume(cwd) {
|
|
75
|
+
const indicators = [];
|
|
76
|
+
|
|
77
|
+
// Check for wp-content/themes (WordPress presence indicator)
|
|
78
|
+
if (existsSafe(join(cwd, 'wp-content', 'themes'))) {
|
|
79
|
+
indicators.push('wordpress_detected');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Check for XML export files (content volume indicator)
|
|
83
|
+
const rootFiles = globDir(cwd);
|
|
84
|
+
for (const file of rootFiles) {
|
|
85
|
+
if (/\.xml$/i.test(file) && /export|wordpress/i.test(file)) {
|
|
86
|
+
indicators.push(`xml_export: ${file}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return { found: indicators.length > 0, indicators };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Main
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
function main() {
|
|
98
|
+
const cwdArg = argv.find(a => a.startsWith('--cwd='));
|
|
99
|
+
const cwd = cwdArg ? resolve(cwdArg.split('=')[1]) : process.cwd();
|
|
100
|
+
|
|
101
|
+
const social = detectSocialPlugins(cwd);
|
|
102
|
+
const email = detectEmailPlugins(cwd);
|
|
103
|
+
const content = detectContentVolume(cwd);
|
|
104
|
+
|
|
105
|
+
const hasRelevantSetup = social.found || email.found || content.found;
|
|
106
|
+
|
|
107
|
+
const recommendations = [];
|
|
108
|
+
|
|
109
|
+
if (!social.found) {
|
|
110
|
+
recommendations.push('No social media plugins detected — consider Blog2Social or Jetpack Social for automated sharing');
|
|
111
|
+
}
|
|
112
|
+
if (!email.found) {
|
|
113
|
+
recommendations.push('No email marketing plugins detected — consider MailPoet or FluentCRM for newsletter integration');
|
|
114
|
+
}
|
|
115
|
+
if (content.found) {
|
|
116
|
+
recommendations.push('WordPress content detected — use wp-content-strategist agent to select and repurpose existing content');
|
|
117
|
+
}
|
|
118
|
+
if (social.found && email.found) {
|
|
119
|
+
recommendations.push('Social + email plugins detected — ideal setup for multi-channel content repurposing');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const report = {
|
|
123
|
+
tool: 'repurposing_inspect',
|
|
124
|
+
version: '1.0.0',
|
|
125
|
+
timestamp: new Date().toISOString(),
|
|
126
|
+
cwd,
|
|
127
|
+
found: hasRelevantSetup,
|
|
128
|
+
areas: {
|
|
129
|
+
social_plugins: social,
|
|
130
|
+
email_plugins: email,
|
|
131
|
+
content_volume: content,
|
|
132
|
+
},
|
|
133
|
+
recommendations,
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
137
|
+
exit(hasRelevantSetup ? 0 : 1);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
main();
|
|
@@ -166,3 +166,4 @@ Read: `references/webhooks.md`
|
|
|
166
166
|
- Astro WordPress integration: https://docs.astro.build/en/guides/cms/wordpress/
|
|
167
167
|
- For REST endpoint development, use the `wp-rest-api` skill
|
|
168
168
|
- For authentication security, use the `wp-security` skill
|
|
169
|
+
- For webhook configuration and management, use the `wp-webhooks` skill
|
|
@@ -3,8 +3,9 @@ name: wp-monitoring
|
|
|
3
3
|
description: This skill should be used when the user asks to "monitor my site", "set up
|
|
4
4
|
uptime checks", "performance baseline", "health report", "security scanning schedule",
|
|
5
5
|
"content integrity check", "alerting", "reporting", "trend analysis", "is my site up",
|
|
6
|
-
"site health over time",
|
|
7
|
-
|
|
6
|
+
"site health over time", "fleet monitoring", "all sites", "cross-site comparison",
|
|
7
|
+
"network health", or mentions any form of ongoing WordPress monitoring and
|
|
8
|
+
observability. Orchestrates uptime, performance, security, content, and fleet monitoring.
|
|
8
9
|
version: 1.0.0
|
|
9
10
|
---
|
|
10
11
|
|
|
@@ -40,6 +41,7 @@ Provides strategies and procedures for continuous WordPress monitoring across fi
|
|
|
40
41
|
- "content changed" / "broken links" / "spam" → Content integrity (Section 4)
|
|
41
42
|
- "alert me" / "notify" / "threshold" → Alerting strategies (Section 5)
|
|
42
43
|
- "report" / "weekly summary" / "dashboard" → Reporting templates (Section 6)
|
|
44
|
+
- "fleet" / "all sites" / "network health" / "cross-site" → Fleet monitoring (Section 7)
|
|
43
45
|
- "full monitoring" / "set up everything" → All sections, start with detection
|
|
44
46
|
|
|
45
47
|
2. **Run detection first:**
|
|
@@ -98,6 +100,13 @@ See `references/reporting-templates.md`
|
|
|
98
100
|
- Quarterly trend analysis
|
|
99
101
|
- Executive dashboard format
|
|
100
102
|
|
|
103
|
+
### Section 7: Fleet Monitoring
|
|
104
|
+
See `references/fleet-monitoring.md`
|
|
105
|
+
- Cross-site health iteration using `list_sites` + `switch_site`
|
|
106
|
+
- Fleet-wide pattern detection (correlated issues)
|
|
107
|
+
- Fleet comparison reports
|
|
108
|
+
- Site grouping and fleet baselines
|
|
109
|
+
|
|
101
110
|
## Reference Files
|
|
102
111
|
|
|
103
112
|
| File | Content |
|
|
@@ -108,6 +117,7 @@ See `references/reporting-templates.md`
|
|
|
108
117
|
| `references/content-integrity.md` | Change detection, link checking, spam |
|
|
109
118
|
| `references/alerting-strategies.md` | Thresholds, escalation, notification channels |
|
|
110
119
|
| `references/reporting-templates.md` | Daily/weekly/monthly report templates |
|
|
120
|
+
| `references/fleet-monitoring.md` | Fleet iteration, cross-site comparison, fleet reports |
|
|
111
121
|
|
|
112
122
|
## Recommended Agent
|
|
113
123
|
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Fleet Monitoring
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Fleet monitoring extends single-site health checks to multiple WordPress installations. Instead of monitoring one site at a time, fleet monitoring iterates over all configured sites, collects per-site metrics, and aggregates them into a unified fleet view for cross-site comparison and pattern detection.
|
|
6
|
+
|
|
7
|
+
## Core Concept
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
# Fleet iteration pattern using MCP tools
|
|
11
|
+
for site in $(list_sites); do
|
|
12
|
+
switch_site $site
|
|
13
|
+
# run monitoring procedures...
|
|
14
|
+
done
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The fleet approach enables:
|
|
18
|
+
- **Aggregate visibility** — see all sites' health at a glance
|
|
19
|
+
- **Cross-site comparison** — identify outliers and common issues
|
|
20
|
+
- **Pattern detection** — spot correlated problems across the fleet
|
|
21
|
+
- **Fleet baselines** — track fleet-wide averages over time
|
|
22
|
+
|
|
23
|
+
## Fleet Health Report Template
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
## Fleet Health Report
|
|
27
|
+
**Date:** [date] | **Sites:** [count] | **Scope:** [full / quick]
|
|
28
|
+
|
|
29
|
+
### Fleet Overview
|
|
30
|
+
| Site | Uptime | Performance | Security | Content | Overall |
|
|
31
|
+
|------|--------|-------------|----------|---------|---------|
|
|
32
|
+
| [site-1] | [pass/warn/fail] | [pass/warn/fail] | [pass/warn/fail] | [pass/warn/fail] | [pass/warn/fail] |
|
|
33
|
+
| [site-2] | [pass/warn/fail] | [pass/warn/fail] | [pass/warn/fail] | [pass/warn/fail] | [pass/warn/fail] |
|
|
34
|
+
|
|
35
|
+
### Fleet Summary
|
|
36
|
+
- **Healthy sites:** X/N
|
|
37
|
+
- **Degraded sites:** X/N (list)
|
|
38
|
+
- **Critical sites:** X/N (list)
|
|
39
|
+
|
|
40
|
+
### Cross-Site Patterns
|
|
41
|
+
[findings or "No cross-site patterns detected"]
|
|
42
|
+
|
|
43
|
+
### Fleet Recommendations (Priority Order)
|
|
44
|
+
1. [Fleet-wide action]
|
|
45
|
+
2. [Site-specific action]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Cross-Site Pattern Detection
|
|
49
|
+
|
|
50
|
+
Fleet monitoring's key advantage is detecting patterns invisible at the single-site level:
|
|
51
|
+
|
|
52
|
+
### Same Plugin Vulnerability Across Sites
|
|
53
|
+
- If a vulnerable plugin version appears on multiple sites, escalate as a fleet-wide P0
|
|
54
|
+
- Prioritize patching by exposure (public-facing sites first)
|
|
55
|
+
|
|
56
|
+
### Fleet-Wide Performance Regression
|
|
57
|
+
- Correlated TTFB spikes across sites on the same host suggest a hosting or CDN issue
|
|
58
|
+
- Compare performance deltas: if all sites regress simultaneously, root cause is likely shared infrastructure
|
|
59
|
+
|
|
60
|
+
### Identical Outdated WordPress Core Versions
|
|
61
|
+
- Track core version across the fleet
|
|
62
|
+
- Flag sites running the same outdated version for batch updates
|
|
63
|
+
|
|
64
|
+
### Common Configuration Drift
|
|
65
|
+
- Compare wp-config.php settings across sites
|
|
66
|
+
- Detect inconsistencies in debug settings, cron configuration, or security constants
|
|
67
|
+
- Flag sites that have drifted from the fleet baseline
|
|
68
|
+
|
|
69
|
+
## Fleet Baseline
|
|
70
|
+
|
|
71
|
+
### Capturing Baselines
|
|
72
|
+
|
|
73
|
+
Establish a baseline for each site individually, then compute fleet averages:
|
|
74
|
+
|
|
75
|
+
1. **Per-site baseline**: Run Procedures 3-6 for each site, recording all metrics with timestamps
|
|
76
|
+
2. **Fleet averages**: Calculate mean/median for key metrics (TTFB, LCP, plugin count, admin users)
|
|
77
|
+
3. **Fleet thresholds**: Set fleet-wide thresholds based on averages + acceptable deviation
|
|
78
|
+
|
|
79
|
+
### Tracking Fleet Averages
|
|
80
|
+
|
|
81
|
+
| Metric | Fleet Avg | Fleet Median | Best | Worst | Threshold |
|
|
82
|
+
|--------|-----------|--------------|------|-------|-----------|
|
|
83
|
+
| TTFB | Xms | Xms | [site] Xms | [site] Xms | < 600ms |
|
|
84
|
+
| LCP | X.Xs | X.Xs | [site] X.Xs | [site] X.Xs | < 2.5s |
|
|
85
|
+
| Active Plugins | X | X | [site] X | [site] X | < 20 |
|
|
86
|
+
| Admin Users | X | X | [site] X | [site] X | varies |
|
|
87
|
+
|
|
88
|
+
### Baseline Refresh
|
|
89
|
+
|
|
90
|
+
- Refresh individual site baselines monthly
|
|
91
|
+
- Recalculate fleet averages after each refresh
|
|
92
|
+
- Flag sites that deviate > 20% from fleet average
|
|
93
|
+
|
|
94
|
+
## Site Grouping Strategies
|
|
95
|
+
|
|
96
|
+
Organize fleet sites into logical groups for targeted monitoring and reporting:
|
|
97
|
+
|
|
98
|
+
### By Environment
|
|
99
|
+
| Group | Description | Monitoring Frequency |
|
|
100
|
+
|-------|-------------|---------------------|
|
|
101
|
+
| Production | Live customer-facing sites | Every 5 minutes (uptime), daily (full) |
|
|
102
|
+
| Staging | Pre-production testing | Hourly (uptime), weekly (full) |
|
|
103
|
+
| Development | Local/dev environments | On-demand only |
|
|
104
|
+
|
|
105
|
+
### By Purpose
|
|
106
|
+
| Group | Description | Focus Areas |
|
|
107
|
+
|-------|-------------|-------------|
|
|
108
|
+
| Blog | Content-heavy editorial sites | Content integrity, SEO health |
|
|
109
|
+
| Shop | WooCommerce e-commerce sites | Uptime, performance, security |
|
|
110
|
+
| Landing | Marketing landing pages | Uptime, performance |
|
|
111
|
+
| Corporate | Company information sites | Content integrity, security |
|
|
112
|
+
|
|
113
|
+
### By Hosting
|
|
114
|
+
| Group | Description | Pattern Detection |
|
|
115
|
+
|-------|-------------|-------------------|
|
|
116
|
+
| Shared Host A | Sites on same shared hosting | Correlated performance issues |
|
|
117
|
+
| VPS Cluster | Sites on same VPS | Resource contention detection |
|
|
118
|
+
| Managed WP | Sites on managed WordPress hosting | Provider-specific issue detection |
|
|
119
|
+
|
|
120
|
+
## Scheduling: Fleet Scan Frequency
|
|
121
|
+
|
|
122
|
+
| Scan Type | Frequency | Scope | Duration Estimate |
|
|
123
|
+
|-----------|-----------|-------|-------------------|
|
|
124
|
+
| Quick uptime | Every 5 min | HTTP status + response time | ~2s per site |
|
|
125
|
+
| Standard health | Daily | Uptime + performance + security | ~30s per site |
|
|
126
|
+
| Full fleet audit | Weekly | All procedures (3-6) per site | ~2min per site |
|
|
127
|
+
| Baseline refresh | Monthly | Full audit + baseline update | ~3min per site |
|
|
128
|
+
|
|
129
|
+
### Scheduling Recommendations
|
|
130
|
+
- Stagger scans to avoid overwhelming shared infrastructure
|
|
131
|
+
- Run quick uptime checks in parallel; full audits sequentially
|
|
132
|
+
- Schedule full audits during low-traffic windows
|
|
133
|
+
- Allow 10% buffer time for network delays
|
|
134
|
+
|
|
135
|
+
## Escalation: Fleet-Wide P0
|
|
136
|
+
|
|
137
|
+
A fleet-wide P0 is triggered when multiple sites are affected simultaneously:
|
|
138
|
+
|
|
139
|
+
### P0 Criteria
|
|
140
|
+
- **3+ production sites** with the same critical issue
|
|
141
|
+
- **All sites on a host** showing performance degradation > 50%
|
|
142
|
+
- **Known exploited vulnerability** present on any production site
|
|
143
|
+
- **Data breach indicators** on any site
|
|
144
|
+
|
|
145
|
+
### P0 Response Procedure
|
|
146
|
+
1. **Immediate**: Alert all stakeholders (do not wait for full fleet scan to complete)
|
|
147
|
+
2. **Triage**: Identify affected sites and group by root cause
|
|
148
|
+
3. **Isolate**: If security incident, recommend isolating affected sites
|
|
149
|
+
4. **Delegate**: Hand off to `wp-security-auditor` (security) or `wp-site-manager` (infrastructure)
|
|
150
|
+
5. **Track**: Monitor remediation progress across all affected sites
|
|
151
|
+
6. **Post-mortem**: After resolution, update fleet baselines and document findings
|
|
152
|
+
|
|
153
|
+
### Severity Matrix
|
|
154
|
+
| Affected Sites | Impact | Severity |
|
|
155
|
+
|----------------|--------|----------|
|
|
156
|
+
| 1 site, non-production | Low | P3 |
|
|
157
|
+
| 1 production site | Medium | P2 |
|
|
158
|
+
| 2 production sites | High | P1 |
|
|
159
|
+
| 3+ production sites | Critical | P0 |
|
|
160
|
+
| All sites (any env) | Critical | P0 |
|
|
@@ -193,6 +193,52 @@ function detectContentIntegrity(cwd) {
|
|
|
193
193
|
return indicators.length > 0 ? { found: true, indicators } : { found: false };
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
+
function detectFleetConfiguration() {
|
|
197
|
+
const indicators = [];
|
|
198
|
+
|
|
199
|
+
// Check WP_SITES_CONFIG environment variable
|
|
200
|
+
const sitesConfig = process.env.WP_SITES_CONFIG;
|
|
201
|
+
if (sitesConfig) {
|
|
202
|
+
try {
|
|
203
|
+
const sites = JSON.parse(sitesConfig);
|
|
204
|
+
if (Array.isArray(sites) && sites.length > 1) {
|
|
205
|
+
indicators.push(`multi_site_config: ${sites.length} sites`);
|
|
206
|
+
} else if (Array.isArray(sites) && sites.length === 1) {
|
|
207
|
+
indicators.push('single_site_config');
|
|
208
|
+
}
|
|
209
|
+
} catch {
|
|
210
|
+
// Not valid JSON, might be a file path
|
|
211
|
+
indicators.push('sites_config_present');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Check for sites.json file
|
|
216
|
+
if (existsSafe(join(process.cwd(), 'sites.json'))) {
|
|
217
|
+
const content = readFileSafe(join(process.cwd(), 'sites.json'));
|
|
218
|
+
if (content) {
|
|
219
|
+
try {
|
|
220
|
+
const sites = JSON.parse(content);
|
|
221
|
+
if (Array.isArray(sites) && sites.length > 1) {
|
|
222
|
+
indicators.push(`sites_json: ${sites.length} sites`);
|
|
223
|
+
}
|
|
224
|
+
} catch { /* ignore */ }
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const siteCount = indicators.find(i => i.startsWith('multi_site_config'))
|
|
229
|
+
? parseInt(indicators.find(i => i.startsWith('multi_site_config')).split(': ')[1])
|
|
230
|
+
: indicators.find(i => i.startsWith('sites_json'))
|
|
231
|
+
? parseInt(indicators.find(i => i.startsWith('sites_json')).split(': ')[1])
|
|
232
|
+
: 0;
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
found: indicators.length > 0,
|
|
236
|
+
indicators,
|
|
237
|
+
site_count: siteCount,
|
|
238
|
+
fleet_monitoring_possible: siteCount > 1,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
196
242
|
// ---------------------------------------------------------------------------
|
|
197
243
|
// Main
|
|
198
244
|
// ---------------------------------------------------------------------------
|
|
@@ -206,8 +252,9 @@ function main() {
|
|
|
206
252
|
const security = detectSecurityScanning(cwd);
|
|
207
253
|
const logging = detectLogging(cwd);
|
|
208
254
|
const contentIntegrity = detectContentIntegrity(cwd);
|
|
255
|
+
const fleet = detectFleetConfiguration();
|
|
209
256
|
|
|
210
|
-
const hasMonitoring = uptime.found || performance.found || security.found || logging.found || contentIntegrity.found;
|
|
257
|
+
const hasMonitoring = uptime.found || performance.found || security.found || logging.found || contentIntegrity.found || fleet.found;
|
|
211
258
|
|
|
212
259
|
const recommendations = [];
|
|
213
260
|
|
|
@@ -232,6 +279,11 @@ function main() {
|
|
|
232
279
|
if (logging.found && logging.indicators.includes('debug_log_exists')) {
|
|
233
280
|
recommendations.push('debug.log file exists — ensure it is not publicly accessible');
|
|
234
281
|
}
|
|
282
|
+
if (fleet.fleet_monitoring_possible) {
|
|
283
|
+
recommendations.push(`Fleet monitoring available — ${fleet.site_count} sites configured. Use Procedure 7 for cross-site health checks.`);
|
|
284
|
+
} else if (!fleet.found) {
|
|
285
|
+
recommendations.push('No multi-site configuration detected — configure WP_SITES_CONFIG with multiple sites for fleet monitoring');
|
|
286
|
+
}
|
|
235
287
|
if (!hasMonitoring) {
|
|
236
288
|
recommendations.push('No monitoring setup found — use wp-monitoring skill to establish a baseline');
|
|
237
289
|
}
|
|
@@ -248,6 +300,7 @@ function main() {
|
|
|
248
300
|
security,
|
|
249
301
|
logging,
|
|
250
302
|
content_integrity: contentIntegrity,
|
|
303
|
+
fleet,
|
|
251
304
|
},
|
|
252
305
|
recommendations,
|
|
253
306
|
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wp-webhooks
|
|
3
|
+
description: This skill should be used when the user asks to "set up webhooks",
|
|
4
|
+
"notify external service on publish", "connect WordPress to Zapier",
|
|
5
|
+
"webhook integration", "event notifications", "content sync webhook",
|
|
6
|
+
"WooCommerce webhook", "outbound notifications", or mentions automating
|
|
7
|
+
WordPress event propagation to external services.
|
|
8
|
+
version: 1.0.0
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# WordPress Webhooks Skill
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
WordPress webhooks are outbound HTTP notifications triggered by site events. When content is published, an order is placed, or a user registers, WordPress sends a JSON payload to a configured URL. This enables real-time integration with external services without polling.
|
|
16
|
+
|
|
17
|
+
## When to Use
|
|
18
|
+
|
|
19
|
+
- User wants WordPress to notify external services on content/order/user events
|
|
20
|
+
- User needs to connect WordPress to Zapier, Make (Integromat), or n8n
|
|
21
|
+
- User wants WooCommerce order/product event notifications
|
|
22
|
+
- User needs headless CMS revalidation webhooks
|
|
23
|
+
- User asks about webhook security (secrets, signatures)
|
|
24
|
+
|
|
25
|
+
## Webhooks vs REST API Polling
|
|
26
|
+
|
|
27
|
+
| Approach | Webhooks | Polling |
|
|
28
|
+
|----------|----------|---------|
|
|
29
|
+
| Trigger | Event-driven (push) | Schedule-driven (pull) |
|
|
30
|
+
| Latency | Near real-time | Depends on interval |
|
|
31
|
+
| Resource usage | Low (only on events) | High (constant requests) |
|
|
32
|
+
| Reliability | Needs retry logic | Simple but wasteful |
|
|
33
|
+
| Best for | Integrations, sync | Batch processing |
|
|
34
|
+
|
|
35
|
+
## Decision Tree
|
|
36
|
+
|
|
37
|
+
1. **What kind of webhook?**
|
|
38
|
+
- "WooCommerce webhook" / "order notification" / "product webhook" → WooCommerce webhooks (Section 1)
|
|
39
|
+
- "content published" / "post webhook" / "page updated" → WordPress core webhooks (Section 2)
|
|
40
|
+
- "headless revalidation" / "ISR trigger" / "cache invalidation" → Headless webhooks (Section 3)
|
|
41
|
+
- "Zapier" / "Make" / "n8n" / "Slack notification" → Integration recipes (Section 4)
|
|
42
|
+
- "webhook security" / "secret" / "signature" → Webhook security (Section 5)
|
|
43
|
+
|
|
44
|
+
2. **Run detection first:**
|
|
45
|
+
```bash
|
|
46
|
+
node skills/wp-webhooks/scripts/webhook_inspect.mjs [--cwd=/path/to/project]
|
|
47
|
+
```
|
|
48
|
+
This identifies existing webhook configurations and plugins.
|
|
49
|
+
|
|
50
|
+
## Webhook Areas
|
|
51
|
+
|
|
52
|
+
### Section 1: WooCommerce Webhooks
|
|
53
|
+
See `references/woocommerce-webhooks.md`
|
|
54
|
+
- WooCommerce webhook API (wc/v3/webhooks)
|
|
55
|
+
- Available topics: order.created, product.updated, customer.created, etc.
|
|
56
|
+
- MCP tools: `wc_list_webhooks`, `wc_create_webhook`, `wc_update_webhook`, `wc_delete_webhook`
|
|
57
|
+
- Webhook status management and delivery logs
|
|
58
|
+
|
|
59
|
+
### Section 2: WordPress Core Webhooks
|
|
60
|
+
See `references/wordpress-core-webhooks.md`
|
|
61
|
+
- Action hooks for outbound notifications (mu-plugin approach)
|
|
62
|
+
- Key hooks: `transition_post_status`, `edited_term`, `user_register`
|
|
63
|
+
- `wp_remote_post()` usage patterns
|
|
64
|
+
- wp-config.php constants for webhook URLs
|
|
65
|
+
|
|
66
|
+
### Section 3: Headless Webhooks
|
|
67
|
+
Cross-reference: `wp-headless` skill → `references/webhooks.md`
|
|
68
|
+
- ISR revalidation triggers
|
|
69
|
+
- Tag-based cache invalidation
|
|
70
|
+
- WPGraphQL Smart Cache integration
|
|
71
|
+
|
|
72
|
+
### Section 4: Integration Recipes
|
|
73
|
+
See `references/integration-recipes.md`
|
|
74
|
+
- Zapier, Make (Integromat), n8n workflows
|
|
75
|
+
- Slack channel notifications
|
|
76
|
+
- Email service triggers (Mailchimp, SendGrid)
|
|
77
|
+
- CDN purge (Cloudflare, Fastly)
|
|
78
|
+
- Search index updates (Algolia, Meilisearch)
|
|
79
|
+
|
|
80
|
+
### Section 5: Webhook Security
|
|
81
|
+
See `references/webhook-security.md`
|
|
82
|
+
- HMAC-SHA256 shared secret authentication
|
|
83
|
+
- WooCommerce webhook signature verification
|
|
84
|
+
- HTTPS enforcement and IP allowlisting
|
|
85
|
+
- Rate limiting and timeout configuration
|
|
86
|
+
|
|
87
|
+
## Payload Formats
|
|
88
|
+
See `references/payload-formats.md`
|
|
89
|
+
- Standard JSON payload structure
|
|
90
|
+
- WooCommerce payload examples
|
|
91
|
+
- Custom payload formatting
|
|
92
|
+
|
|
93
|
+
## Reference Files
|
|
94
|
+
|
|
95
|
+
| File | Content |
|
|
96
|
+
|------|---------|
|
|
97
|
+
| `references/woocommerce-webhooks.md` | WC webhook API, topics, MCP tools, delivery logs |
|
|
98
|
+
| `references/wordpress-core-webhooks.md` | Action hooks, mu-plugin, wp_remote_post patterns |
|
|
99
|
+
| `references/integration-recipes.md` | Zapier, Make, n8n, Slack, CDN purge recipes |
|
|
100
|
+
| `references/payload-formats.md` | JSON payloads, WC examples, custom formatting |
|
|
101
|
+
| `references/webhook-security.md` | HMAC-SHA256, signatures, HTTPS, rate limiting |
|
|
102
|
+
|
|
103
|
+
## Related Skills
|
|
104
|
+
|
|
105
|
+
- **`wp-headless`** — headless revalidation webhooks and ISR triggers
|
|
106
|
+
- **`wp-woocommerce`** — WooCommerce store operations (webhook source events)
|
|
107
|
+
- **`wp-cicd`** — CI/CD webhooks for deployment triggers
|