wordpress-agent-kit 0.4.0 → 0.6.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/.agents/skills/wp-bootstrap/SKILL.md +314 -0
- package/.agents/skills/wp-bootstrap/references/composer-setup.md +275 -0
- package/.agents/skills/wp-bootstrap/references/monorepo-patterns.md +184 -0
- package/.agents/skills/wp-bootstrap/scripts/bootstrap.sh +151 -0
- package/.agents/skills/wp-bootstrap/scripts/detect-structure.mjs +466 -0
- package/.agents/skills/wp-bootstrap/scripts/package-wp.sh +173 -0
- package/.agents/skills/wp-bootstrap/scripts/playground-start.sh +148 -0
- package/.agents/skills/wp-bootstrap/scripts/playground-verify.sh +165 -0
- package/.agents/skills/wp-bootstrap/scripts/setup-github.sh +417 -0
- package/{.github → .agents}/skills/wp-wpcli-and-ops/SKILL.md +11 -9
- package/.agents/skills/wp-wpengine/SKILL.md +462 -0
- package/.agents/skills/wp-wpengine/references/ci-gate.md +469 -0
- package/.agents/skills/wp-wpengine/references/github-actions-deploy.md +743 -0
- package/.agents/skills/wp-wpengine/scripts/ci-gate.sh +118 -0
- package/.agents/skills/wp-wpengine/scripts/wpe-check.sh +89 -0
- package/.agents/skills/wp-wpengine/scripts/wpe-preflight.sh +104 -0
- package/.github/agents/wp-architect.agent.md +1 -2
- package/.github/copilot-instructions.md +1 -1
- package/.github/instructions/wordpress-workflow.instructions.md +3 -3
- package/AGENTS.md +22 -10
- package/AGENTS.template.md +20 -10
- package/README.md +89 -85
- package/dist/cli.js +7 -1
- package/dist/commands/bootstrap.js +105 -0
- package/dist/commands/clean-skills.js +64 -0
- package/dist/commands/setup.js +6 -2
- package/dist/commands/sync-skills.js +3 -0
- package/dist/lib/api.js +165 -5
- package/dist/lib/bootstrap.js +352 -0
- package/dist/lib/installer.js +166 -2
- package/extensions/wp-agent-kit/index.ts +325 -10
- package/package.json +10 -14
- package/skills-custom/wp-bootstrap/SKILL.md +314 -0
- package/skills-custom/wp-bootstrap/references/composer-setup.md +275 -0
- package/skills-custom/wp-bootstrap/references/monorepo-patterns.md +184 -0
- package/skills-custom/wp-bootstrap/scripts/bootstrap.sh +151 -0
- package/skills-custom/wp-bootstrap/scripts/detect-structure.mjs +466 -0
- package/skills-custom/wp-bootstrap/scripts/package-wp.sh +173 -0
- package/skills-custom/wp-bootstrap/scripts/playground-start.sh +148 -0
- package/skills-custom/wp-bootstrap/scripts/playground-verify.sh +165 -0
- package/skills-custom/wp-bootstrap/scripts/setup-github.sh +417 -0
- package/skills-custom/wp-wpengine/SKILL.md +362 -27
- package/skills-custom/wp-wpengine/references/ci-gate.md +469 -0
- package/skills-custom/wp-wpengine/references/github-actions-deploy.md +743 -0
- package/skills-custom/wp-wpengine/scripts/ci-gate.sh +118 -0
- package/skills-custom/wp-wpengine/scripts/wpe-check.sh +89 -0
- package/skills-custom/wp-wpengine/scripts/wpe-preflight.sh +104 -0
- package/.github/skills/wp-wpengine/SKILL.md +0 -127
- package/.github/workflows/ci.yml +0 -44
- package/.husky/pre-commit +0 -7
- package/CLI_REVIEW.md +0 -250
- package/biome.json +0 -39
- /package/{.github → .agents}/skills/blueprint/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wordpress-router/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wordpress-router/references/decision-tree.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/delegate-helper-pattern.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/domain-vs-projection.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/error-code-vocabulary.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/grouping-heuristic.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/input-schema-gotchas.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/php-registration.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/plugin-family-patterns.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/rest-api.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-api/references/shared-core-service.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-audit/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-audit/references/audit-schema.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-audit/references/capability-gate-tracing.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-audit/references/controller-enumeration.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-verify/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-verify/references/annotation-correctness.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-verify/references/audit-schema-validation.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-verify/references/permission-roundtrip.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-verify/references/runtime-harness.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-verify/references/schema-lints.md +0 -0
- /package/{.github → .agents}/skills/wp-abilities-verify/references/static-enumeration.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/attributes-and-serialization.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/block-json.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/creating-new-blocks.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/debugging.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/deprecations.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/dynamic-rendering.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/inner-blocks.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/registration.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/supports-and-wrappers.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/references/tooling-and-testing.md +0 -0
- /package/{.github → .agents}/skills/wp-block-development/scripts/list_blocks.mjs +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/references/creating-new-block-theme.md +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/references/debugging.md +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/references/patterns.md +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/references/style-variations.md +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/references/templates-and-parts.md +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/references/theme-json.md +0 -0
- /package/{.github → .agents}/skills/wp-block-themes/scripts/detect_block_themes.mjs +0 -0
- /package/{.github → .agents}/skills/wp-interactivity-api/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-interactivity-api/references/debugging.md +0 -0
- /package/{.github → .agents}/skills/wp-interactivity-api/references/directives-quickref.md +0 -0
- /package/{.github → .agents}/skills/wp-interactivity-api/references/server-side-rendering.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/autoload-options.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/cron.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/database.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/http-api.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/measurement.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/object-cache.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/query-monitor-headless.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/server-timing.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/wp-cli-doctor.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/references/wp-cli-profile.md +0 -0
- /package/{.github → .agents}/skills/wp-performance/scripts/perf_inspect.mjs +0 -0
- /package/{.github → .agents}/skills/wp-phpstan/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-phpstan/references/configuration.md +0 -0
- /package/{.github → .agents}/skills/wp-phpstan/references/third-party-classes.md +0 -0
- /package/{.github → .agents}/skills/wp-phpstan/references/wordpress-annotations.md +0 -0
- /package/{.github → .agents}/skills/wp-phpstan/scripts/phpstan_inspect.mjs +0 -0
- /package/{.github → .agents}/skills/wp-playground/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-playground/references/blueprints.md +0 -0
- /package/{.github → .agents}/skills/wp-playground/references/cli-commands.md +0 -0
- /package/{.github → .agents}/skills/wp-playground/references/debugging.md +0 -0
- /package/{.github → .agents}/skills/wp-playground/references/e2e-playwright.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/references/data-and-cron.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/references/debugging.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/references/lifecycle.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/references/security.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/references/settings-api.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/references/structure.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-development/scripts/detect_plugins.mjs +0 -0
- /package/{.github → .agents}/skills/wp-plugin-directory-guidelines/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-directory-guidelines/references/gpl-compliance.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-directory-guidelines/references/guideline-review-checklist.md +0 -0
- /package/{.github → .agents}/skills/wp-plugin-directory-guidelines/references/naming-rules.md +0 -0
- /package/{.github → .agents}/skills/wp-project-triage/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-project-triage/references/triage.schema.json +0 -0
- /package/{.github → .agents}/skills/wp-project-triage/scripts/detect_wp_project.mjs +0 -0
- /package/{.github → .agents}/skills/wp-rest-api/SKILL.md +0 -0
- /package/{.github → .agents}/skills/wp-rest-api/references/authentication.md +0 -0
- /package/{.github → .agents}/skills/wp-rest-api/references/custom-content-types.md +0 -0
- /package/{.github → .agents}/skills/wp-rest-api/references/discovery-and-params.md +0 -0
- /package/{.github → .agents}/skills/wp-rest-api/references/responses-and-fields.md +0 -0
- /package/{.github → .agents}/skills/wp-rest-api/references/routes-and-endpoints.md +0 -0
- /package/{.github → .agents}/skills/wp-rest-api/references/schema.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/references/automation.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/references/cron-and-cache.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/references/debugging.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/references/multisite.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/references/packages-and-updates.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/references/safety.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/references/search-replace.md +0 -0
- /package/{.github → .agents}/skills/wp-wpcli-and-ops/scripts/wpcli_inspect.mjs +0 -0
- /package/{.github → .agents}/skills/wpds/SKILL.md +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ci-gate.sh — run the full CI gate locally before pushing.
|
|
3
|
+
#
|
|
4
|
+
# Mirrors what GitHub Actions ci-gate.yml runs. Use this before any push
|
|
5
|
+
# to a branch that triggers a WP Engine deploy.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# bash scripts/ci-gate.sh # run both gates
|
|
9
|
+
# bash scripts/ci-gate.sh --php-only # PHP gate only
|
|
10
|
+
# bash scripts/ci-gate.sh --js-only # JS/TS gate only
|
|
11
|
+
#
|
|
12
|
+
# Exit code: 0 = all passed, 1 = at least one check failed.
|
|
13
|
+
|
|
14
|
+
set -uo pipefail
|
|
15
|
+
root="$(git rev-parse --show-toplevel)"
|
|
16
|
+
cd "$root"
|
|
17
|
+
|
|
18
|
+
PHP_ONLY=false
|
|
19
|
+
JS_ONLY=false
|
|
20
|
+
for arg in "$@"; do
|
|
21
|
+
[[ "$arg" == "--php-only" ]] && PHP_ONLY=true
|
|
22
|
+
[[ "$arg" == "--js-only" ]] && JS_ONLY=true
|
|
23
|
+
done
|
|
24
|
+
|
|
25
|
+
PASS=0
|
|
26
|
+
FAIL=0
|
|
27
|
+
|
|
28
|
+
run() {
|
|
29
|
+
local label="$1"; shift
|
|
30
|
+
echo "▶ $label"
|
|
31
|
+
if "$@" 2>&1; then
|
|
32
|
+
echo " ✓ $label"
|
|
33
|
+
((PASS++))
|
|
34
|
+
else
|
|
35
|
+
echo " ✗ FAILED: $label"
|
|
36
|
+
((FAIL++))
|
|
37
|
+
return 1
|
|
38
|
+
fi
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# ── PHP gate ──────────────────────────────────────────────────────────────────
|
|
42
|
+
if ! $JS_ONLY; then
|
|
43
|
+
echo ""
|
|
44
|
+
echo "── PHP gate ──────────────────────────────────────────────────────────"
|
|
45
|
+
if command -v composer >/dev/null 2>&1 && [ -f composer.json ]; then
|
|
46
|
+
if [ ! -d vendor ]; then
|
|
47
|
+
echo "▶ composer install"
|
|
48
|
+
composer install --no-interaction --quiet
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
run "php -l (all tracked PHP files)" \
|
|
52
|
+
bash -c 'git ls-files "*.php" | xargs -P4 php -l > /dev/null'
|
|
53
|
+
|
|
54
|
+
if [ -x vendor/bin/phpcs ]; then
|
|
55
|
+
run "phpcs (WordPress coding standards)" composer run phpcs
|
|
56
|
+
else
|
|
57
|
+
echo " ⚠ phpcs not found — run: composer install"
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [ -x vendor/bin/phpstan ]; then
|
|
61
|
+
run "phpstan (static analysis)" composer run phpstan
|
|
62
|
+
else
|
|
63
|
+
echo " ⚠ phpstan not found — run: composer install"
|
|
64
|
+
fi
|
|
65
|
+
else
|
|
66
|
+
echo " ⚠ composer not available or no composer.json — skipping PHP gate"
|
|
67
|
+
fi
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# ── JS/TS gate ────────────────────────────────────────────────────────────────
|
|
71
|
+
if ! $PHP_ONLY; then
|
|
72
|
+
echo ""
|
|
73
|
+
echo "── JS/TS gate ────────────────────────────────────────────────────────"
|
|
74
|
+
if [ -f package.json ]; then
|
|
75
|
+
if [ ! -d node_modules ]; then
|
|
76
|
+
echo "▶ npm install"
|
|
77
|
+
npm install --silent
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
if [ -x node_modules/.bin/biome ]; then
|
|
81
|
+
run "biome check (lint + format)" npx biome check .
|
|
82
|
+
else
|
|
83
|
+
echo " ⚠ biome not installed — run: npm install"
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
if npm run typecheck --if-present 2>/dev/null; then
|
|
87
|
+
((PASS++))
|
|
88
|
+
elif command -v tsc >/dev/null 2>&1 || [ -x node_modules/.bin/tsc ]; then
|
|
89
|
+
run "tsc --noEmit (type check)" npx tsc --noEmit
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
if npm run test --if-present 2>/dev/null; then
|
|
93
|
+
((PASS++))
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
if npm run build --if-present 2>/dev/null; then
|
|
97
|
+
((PASS++))
|
|
98
|
+
fi
|
|
99
|
+
else
|
|
100
|
+
echo " ⚠ No package.json — skipping JS/TS gate"
|
|
101
|
+
fi
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
# ── Summary ───────────────────────────────────────────────────────────────────
|
|
105
|
+
echo ""
|
|
106
|
+
echo "── CI Gate Result ────────────────────────────────────────────────────"
|
|
107
|
+
echo " Passed : $PASS"
|
|
108
|
+
echo " Failed : $FAIL"
|
|
109
|
+
echo ""
|
|
110
|
+
|
|
111
|
+
if [[ "$FAIL" -eq 0 ]]; then
|
|
112
|
+
echo "✅ Gate green — safe to push."
|
|
113
|
+
exit 0
|
|
114
|
+
else
|
|
115
|
+
echo "❌ Gate failed — fix the issues above before pushing."
|
|
116
|
+
echo " --no-verify is not a valid workaround; CI will catch the same failures."
|
|
117
|
+
exit 1
|
|
118
|
+
fi
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# wpe-check.sh — verify SSH connectivity to all configured WP Engine environments.
|
|
3
|
+
#
|
|
4
|
+
# Reads installs from wp-cli.yml @aliases (ssh: field) or from WPE_INSTALLS env var.
|
|
5
|
+
# Useful after first-time machine setup or when debugging SSH issues.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# bash scripts/wpe-check.sh
|
|
9
|
+
# WPE_INSTALLS="mysite mysitestg mysitedev" bash scripts/wpe-check.sh
|
|
10
|
+
#
|
|
11
|
+
# Exit code: 0 = all connected, 1 = at least one failed.
|
|
12
|
+
|
|
13
|
+
set -uo pipefail
|
|
14
|
+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
15
|
+
cd "$root"
|
|
16
|
+
|
|
17
|
+
SSH_OPTS="-o BatchMode=yes -o ConnectTimeout=8 -o StrictHostKeyChecking=accept-new"
|
|
18
|
+
|
|
19
|
+
# ── Discover installs from wp-cli.yml @aliases ────────────────────────────────
|
|
20
|
+
declare -A ALIAS_MAP # install → alias label
|
|
21
|
+
CURRENT_ALIAS=""
|
|
22
|
+
|
|
23
|
+
if [ -f wp-cli.yml ]; then
|
|
24
|
+
while IFS= read -r line; do
|
|
25
|
+
if [[ "$line" =~ ^@([a-zA-Z0-9_-]+): ]]; then
|
|
26
|
+
CURRENT_ALIAS="${BASH_REMATCH[1]}"
|
|
27
|
+
elif [[ "$line" =~ ^[[:space:]]+ssh:[[:space:]]+([^@[:space:]]+)@[^[:space:]]+ && -n "$CURRENT_ALIAS" ]]; then
|
|
28
|
+
INSTALL="${BASH_REMATCH[1]}"
|
|
29
|
+
ALIAS_MAP["$INSTALL"]="@${CURRENT_ALIAS}"
|
|
30
|
+
CURRENT_ALIAS=""
|
|
31
|
+
fi
|
|
32
|
+
done < wp-cli.yml
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# Fallback: WPE_INSTALLS env var
|
|
36
|
+
if [ "${#ALIAS_MAP[@]}" -eq 0 ] && [ -n "${WPE_INSTALLS:-}" ]; then
|
|
37
|
+
for slug in $WPE_INSTALLS; do
|
|
38
|
+
ALIAS_MAP["$slug"]="$slug"
|
|
39
|
+
done
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
if [ "${#ALIAS_MAP[@]}" -eq 0 ]; then
|
|
43
|
+
echo "No WP Engine installs found."
|
|
44
|
+
echo ""
|
|
45
|
+
echo "Options:"
|
|
46
|
+
echo " 1. Add @aliases with 'ssh: <install>@<install>.ssh.wpengine.net' to wp-cli.yml"
|
|
47
|
+
echo " 2. Set WPE_INSTALLS='slug1 slug2 slug3' environment variable"
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
echo ""
|
|
52
|
+
echo "── WP Engine SSH connectivity ────────────────────────────────────────"
|
|
53
|
+
printf " %-25s %-15s %-12s %s\n" "Install" "Alias" "Status" "WP version"
|
|
54
|
+
echo " ─────────────────────────────────────────────────────────────────"
|
|
55
|
+
|
|
56
|
+
PASS=0
|
|
57
|
+
FAIL=0
|
|
58
|
+
|
|
59
|
+
for INSTALL in "${!ALIAS_MAP[@]}"; do
|
|
60
|
+
ALIAS="${ALIAS_MAP[$INSTALL]}"
|
|
61
|
+
SSH_HOST="${INSTALL}.ssh.wpengine.net"
|
|
62
|
+
|
|
63
|
+
WP_VERSION=$(ssh $SSH_OPTS "${INSTALL}@${SSH_HOST}" \
|
|
64
|
+
wp core version --skip-plugins --skip-themes 2>/dev/null || echo "")
|
|
65
|
+
|
|
66
|
+
if [ -n "$WP_VERSION" ]; then
|
|
67
|
+
printf " %-25s %-15s %-12s %s\n" "$INSTALL" "$ALIAS" "✓ connected" "$WP_VERSION"
|
|
68
|
+
((PASS++))
|
|
69
|
+
else
|
|
70
|
+
printf " %-25s %-15s %-12s %s\n" "$INSTALL" "$ALIAS" "✗ FAILED" "—"
|
|
71
|
+
((FAIL++))
|
|
72
|
+
fi
|
|
73
|
+
done
|
|
74
|
+
|
|
75
|
+
echo ""
|
|
76
|
+
echo " $PASS connected | $FAIL failed"
|
|
77
|
+
|
|
78
|
+
if [[ "$FAIL" -gt 0 ]]; then
|
|
79
|
+
echo ""
|
|
80
|
+
echo "Troubleshooting:"
|
|
81
|
+
echo " • Confirm key exists: ls -la ~/.ssh/wpengine_ed25519"
|
|
82
|
+
echo " • Confirm permissions: chmod 600 ~/.ssh/wpengine_ed25519"
|
|
83
|
+
echo " • Trust the host: ssh-keyscan -H ssh.wpengine.net >> ~/.ssh/known_hosts"
|
|
84
|
+
echo " • Check portal: https://my.wpengine.com/ssh_keys"
|
|
85
|
+
echo " • Verify git access: ssh git@git.wpengine.com info"
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
echo ""
|
|
89
|
+
[[ "$FAIL" -eq 0 ]] && exit 0 || exit 1
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# wpe-preflight.sh — pre-deploy sanity checks for a WP Engine environment.
|
|
3
|
+
#
|
|
4
|
+
# Verifies SSH access, WP-CLI, site URL consistency, HTTP health, and
|
|
5
|
+
# active plugin count before any deploy touches production or staging.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# INSTALL=mysite bash scripts/wpe-preflight.sh [staging|production]
|
|
9
|
+
# WPE_INSTALL=mysite bash scripts/wpe-preflight.sh production
|
|
10
|
+
#
|
|
11
|
+
# Exit code: 0 = all checks passed (safe to deploy), 1 = at least one failed.
|
|
12
|
+
|
|
13
|
+
set -uo pipefail
|
|
14
|
+
|
|
15
|
+
ENV="${1:-production}"
|
|
16
|
+
INSTALL="${WPE_INSTALL:-${INSTALL:-}}"
|
|
17
|
+
|
|
18
|
+
if [ -z "$INSTALL" ]; then
|
|
19
|
+
echo "❌ Usage: INSTALL=<slug> bash scripts/wpe-preflight.sh [staging|production]"
|
|
20
|
+
echo " The install slug is the WP Engine environment name (e.g., 'mysite', 'mysitestg')."
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
SSH_HOST="${INSTALL}.ssh.wpengine.net"
|
|
25
|
+
SSH_OPTS="-o BatchMode=yes -o ConnectTimeout=15 -o StrictHostKeyChecking=accept-new"
|
|
26
|
+
WP="ssh $SSH_OPTS ${INSTALL}@${SSH_HOST} wp"
|
|
27
|
+
|
|
28
|
+
PASS=0
|
|
29
|
+
FAIL=0
|
|
30
|
+
|
|
31
|
+
check() {
|
|
32
|
+
local label="$1"; shift
|
|
33
|
+
printf " %-50s" "$label"
|
|
34
|
+
local output
|
|
35
|
+
if output=$("$@" 2>&1); then
|
|
36
|
+
echo "✓ $output"
|
|
37
|
+
((PASS++))
|
|
38
|
+
else
|
|
39
|
+
echo "✗ FAILED"
|
|
40
|
+
echo " $output" >&2
|
|
41
|
+
((FAIL++))
|
|
42
|
+
fi
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
echo ""
|
|
46
|
+
echo "── WP Engine preflight: ${INSTALL} (${ENV}) ─────────────────────"
|
|
47
|
+
echo ""
|
|
48
|
+
|
|
49
|
+
# ── SSH ───────────────────────────────────────────────────────────────────────
|
|
50
|
+
echo "SSH"
|
|
51
|
+
check "SSH gateway reachable" \
|
|
52
|
+
ssh $SSH_OPTS "${INSTALL}@${SSH_HOST}" echo "connected"
|
|
53
|
+
|
|
54
|
+
check "WP-CLI available" \
|
|
55
|
+
$WP --info --skip-plugins --skip-themes
|
|
56
|
+
|
|
57
|
+
# ── WordPress ─────────────────────────────────────────────────────────────────
|
|
58
|
+
echo ""
|
|
59
|
+
echo "WordPress"
|
|
60
|
+
check "WP core version" \
|
|
61
|
+
$WP core version --skip-plugins --skip-themes
|
|
62
|
+
|
|
63
|
+
check "siteurl option readable" \
|
|
64
|
+
$WP option get siteurl --skip-plugins --skip-themes
|
|
65
|
+
|
|
66
|
+
check "Active plugins present (count > 0)" \
|
|
67
|
+
bash -c "COUNT=\$(${WP} plugin list --status=active --format=count --skip-plugins --skip-themes 2>&1); echo \"\$COUNT active\"; [[ \"\$COUNT\" -gt 0 ]]"
|
|
68
|
+
|
|
69
|
+
check "No pending DB upgrades" \
|
|
70
|
+
$WP core update-db --dry-run --skip-plugins --skip-themes
|
|
71
|
+
|
|
72
|
+
# ── HTTP health ───────────────────────────────────────────────────────────────
|
|
73
|
+
echo ""
|
|
74
|
+
echo "HTTP health"
|
|
75
|
+
SITE_URL=$(ssh $SSH_OPTS "${INSTALL}@${SSH_HOST}" \
|
|
76
|
+
wp option get home --skip-plugins --skip-themes 2>/dev/null || echo "")
|
|
77
|
+
|
|
78
|
+
if [ -n "$SITE_URL" ]; then
|
|
79
|
+
check "Homepage returns 2xx/3xx" \
|
|
80
|
+
bash -c "STATUS=\$(curl -s -o /dev/null -w '%{http_code}' -L --max-time 15 '${SITE_URL}'); echo \"HTTP \$STATUS\"; [[ \"\$STATUS\" -ge 200 && \"\$STATUS\" -lt 400 ]]"
|
|
81
|
+
|
|
82
|
+
check "No PHP errors in homepage body" \
|
|
83
|
+
bash -c "BODY=\$(curl -sL --max-time 15 '${SITE_URL}'); echo \"\${#BODY} chars\"; ! echo \"\$BODY\" | grep -qi 'fatal error\|parse error\|warning: '"
|
|
84
|
+
|
|
85
|
+
check "wp-json REST API responds" \
|
|
86
|
+
bash -c "STATUS=\$(curl -s -o /dev/null -w '%{http_code}' --max-time 10 '${SITE_URL}/wp-json/wp/v2/'); echo \"HTTP \$STATUS\"; [[ \"\$STATUS\" -ge 200 && \"\$STATUS\" -lt 400 ]]"
|
|
87
|
+
else
|
|
88
|
+
echo " ⚠ Could not retrieve site URL — skipping HTTP checks"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# ── Result ────────────────────────────────────────────────────────────────────
|
|
92
|
+
echo ""
|
|
93
|
+
echo "── Preflight result ──────────────────────────────────────────────────"
|
|
94
|
+
echo " Passed : $PASS"
|
|
95
|
+
echo " Failed : $FAIL"
|
|
96
|
+
echo ""
|
|
97
|
+
|
|
98
|
+
if [[ "$FAIL" -eq 0 ]]; then
|
|
99
|
+
echo "✅ All checks passed — safe to deploy to ${ENV}."
|
|
100
|
+
exit 0
|
|
101
|
+
else
|
|
102
|
+
echo "❌ Preflight failed — resolve the issues above before deploying to ${ENV}."
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wp-wpengine
|
|
3
|
-
description: "Optional: Use for WP Engine hosting workflows — SSH-based git push to WP Engine environments, managing installs/domains/cache/backups via the wpe-labs Claude Code skills, and WP Engine API access. Requires WPE_USERNAME and WPE_PASSWORD env vars."
|
|
4
|
-
license: GPL-2.0-or-later
|
|
5
|
-
optional: true
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# WP Engine
|
|
9
|
-
|
|
10
|
-
## When to use
|
|
11
|
-
|
|
12
|
-
- Deploy WordPress code to a WP Engine environment via `git push`.
|
|
13
|
-
- Manage WP Engine installs, domains, cache, backups, or users through natural language.
|
|
14
|
-
- Generate monthly usage/bandwidth reports across WP Engine accounts.
|
|
15
|
-
- Manage LargeFS media offload configuration.
|
|
16
|
-
|
|
17
|
-
## Prerequisites
|
|
18
|
-
|
|
19
|
-
- SSH key for WP Engine git push stored in 1Password (`Employee` vault, item `wpengine_ed25519`).
|
|
20
|
-
- WP Engine API credentials in 1Password (`Employee` vault, item `WP Engine API`).
|
|
21
|
-
- `op` CLI authenticated (`op whoami` works).
|
|
22
|
-
- The `wpe-labs` Claude Code skills installed (`~/.claude/skills/wpe-labs:*`).
|
|
23
|
-
|
|
24
|
-
## Procedure
|
|
25
|
-
|
|
26
|
-
### 1) First-time SSH setup on a new machine
|
|
27
|
-
|
|
28
|
-
Pull the private key from 1Password and configure SSH:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
op read "op://Employee/wpengine_ed25519/private key" > ~/.ssh/wpengine_ed25519
|
|
32
|
-
chmod 600 ~/.ssh/wpengine_ed25519
|
|
33
|
-
ssh-keyscan git.wpengine.com >> ~/.ssh/known_hosts
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Add to `~/.ssh/config` (before any `Host *` block):
|
|
37
|
-
```
|
|
38
|
-
Host git.wpengine.com
|
|
39
|
-
User git
|
|
40
|
-
IdentityFile ~/.ssh/wpengine_ed25519
|
|
41
|
-
IdentitiesOnly yes
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Verify:
|
|
45
|
-
```bash
|
|
46
|
-
ssh git@git.wpengine.com info
|
|
47
|
-
# Expected: hello <username> / R W <install-name>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
The public key is already registered on WP Engine — no portal action needed on new machines.
|
|
51
|
-
|
|
52
|
-
### 2) Add a WP Engine git remote
|
|
53
|
-
|
|
54
|
-
Find the remote URL on the WP Engine portal: `https://my.wpengine.com/installs/<ENV>/git_push`
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
git remote add wpengine git@git.wpengine.com:<install-name>.git
|
|
58
|
-
# Example for staging:
|
|
59
|
-
git remote add wpengine-staging git@git.wpengine.com:<install-name>stg.git
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### 3) Deploy via git push
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
git push wpengine main
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
- WP Engine deploys the pushed branch automatically.
|
|
69
|
-
- Only the WordPress files are pushed (not `node_modules`, build artifacts, etc.).
|
|
70
|
-
- After push, WP Engine may take 1–2 min to propagate the deploy.
|
|
71
|
-
|
|
72
|
-
### 4) wpe-labs skills (natural language management)
|
|
73
|
-
|
|
74
|
-
Load API credentials, then use any `/wpe-labs:*` skill:
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
# Load credentials from 1Password for the session
|
|
78
|
-
eval $(op run --env-file ~/.config/op-ssh/.env.1pass -- env | grep ^WPE | sed 's/^/export /')
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Available skills:
|
|
82
|
-
|
|
83
|
-
| Skill | What it does | Risk |
|
|
84
|
-
|---|---|---|
|
|
85
|
-
| `/wpe-labs:account-usage` | Bandwidth, visits, storage across accounts | 🟢 Read-only |
|
|
86
|
-
| `/wpe-labs:monthly-report` | Client-ready monthly usage report | 🟢 Read-only |
|
|
87
|
-
| `/wpe-labs:backups` | On-demand backups + progress monitoring | 🟡 Write |
|
|
88
|
-
| `/wpe-labs:cache` | Purge object/page/CDN cache | 🟡 Write |
|
|
89
|
-
| `/wpe-labs:users` | List, invite, update roles, remove users | 🟡/🔴 |
|
|
90
|
-
| `/wpe-labs:domains` | Manage domains, DNS, SSL | 🟡/🔴 |
|
|
91
|
-
| `/wpe-labs:installs` | List, create, copy WordPress installs | 🟡/🔴 |
|
|
92
|
-
| `/wpe-labs:offload` | LargeFS media offload config | 🟡 Write |
|
|
93
|
-
|
|
94
|
-
Example prompts:
|
|
95
|
-
```
|
|
96
|
-
/wpe-labs:account-usage which accounts are closest to their bandwidth limit?
|
|
97
|
-
/wpe-labs:cache purge all cache for uofdev production
|
|
98
|
-
/wpe-labs:backups back up uofdev production before deployment
|
|
99
|
-
/wpe-labs:installs copy uofdev production to staging
|
|
100
|
-
/wpe-labs:monthly-report last month
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### 5) Re-installing wpe-labs skills
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
curl -fsSL https://raw.githubusercontent.com/wpengine/wpe-labs-platform-skills/main/install.sh | bash
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Verification
|
|
110
|
-
|
|
111
|
-
- SSH: `ssh git@git.wpengine.com info` — should return `hello <username> / R W <install>`
|
|
112
|
-
- API: `op run --env-file ~/.config/op-ssh/.env.1pass -- bash -c 'curl -s -u "$WPE_USERNAME:$WPE_PASSWORD" https://api.wpengineapi.com/v1/user | jq .email'`
|
|
113
|
-
|
|
114
|
-
## Failure modes
|
|
115
|
-
|
|
116
|
-
- **SSH: Host key verification failed** — re-run `ssh-keyscan git.wpengine.com >> ~/.ssh/known_hosts`
|
|
117
|
-
- **SSH: Permission denied** — confirm the key is at `~/.ssh/wpengine_ed25519` with `chmod 600`
|
|
118
|
-
- **git push rejected** — verify the remote URL matches the install name exactly
|
|
119
|
-
- **wpe-labs: 401 Unauthorized** — regenerate API credentials at `https://my.wpengine.com/api_access` and update the `WP Engine API` item in 1Password
|
|
120
|
-
- **wpe-labs: storage shows zero** — ask Claude to "refresh storage" (async recalculation, ~30–60s)
|
|
121
|
-
|
|
122
|
-
## References
|
|
123
|
-
|
|
124
|
-
- WP Engine git push portal: `https://my.wpengine.com/installs/<ENV>/git_push`
|
|
125
|
-
- WP Engine API access: `https://my.wpengine.com/api_access`
|
|
126
|
-
- wpe-labs skills source: `https://github.com/wpengine/wpe-labs-platform-skills`
|
|
127
|
-
- SSH setup log (first machine): gist `602d6a16ddfea438c0611a8e5cc31d5e`
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main, master]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main, master]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
lint-and-test:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
steps:
|
|
13
|
-
- name: Checkout repository
|
|
14
|
-
uses: actions/checkout@v4
|
|
15
|
-
|
|
16
|
-
- name: Setup pnpm
|
|
17
|
-
uses: pnpm/action-setup@v4
|
|
18
|
-
with:
|
|
19
|
-
version: 9
|
|
20
|
-
run_install: false
|
|
21
|
-
|
|
22
|
-
- name: Setup Node.js
|
|
23
|
-
uses: actions/setup-node@v4
|
|
24
|
-
with:
|
|
25
|
-
node-version: '22'
|
|
26
|
-
cache: 'pnpm'
|
|
27
|
-
|
|
28
|
-
- name: Install dependencies
|
|
29
|
-
run: pnpm install --frozen-lockfile
|
|
30
|
-
|
|
31
|
-
- name: Check formatting
|
|
32
|
-
run: pnpm run format:check
|
|
33
|
-
|
|
34
|
-
- name: Run lint
|
|
35
|
-
run: pnpm run lint:check
|
|
36
|
-
|
|
37
|
-
- name: Type check
|
|
38
|
-
run: pnpm run check
|
|
39
|
-
|
|
40
|
-
- name: Run tests
|
|
41
|
-
run: pnpm run test:run
|
|
42
|
-
|
|
43
|
-
- name: Build
|
|
44
|
-
run: pnpm run build
|