wordpress-agent-kit 0.3.2 → 0.5.1
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/blueprint/SKILL.md +418 -0
- package/.agents/skills/wordpress-router/SKILL.md +52 -0
- package/.agents/skills/wordpress-router/references/decision-tree.md +55 -0
- package/.agents/skills/wp-abilities-api/SKILL.md +108 -0
- package/.agents/skills/wp-abilities-api/references/delegate-helper-pattern.md +241 -0
- package/.agents/skills/wp-abilities-api/references/domain-vs-projection.md +113 -0
- package/.agents/skills/wp-abilities-api/references/error-code-vocabulary.md +123 -0
- package/.agents/skills/wp-abilities-api/references/grouping-heuristic.md +89 -0
- package/.agents/skills/wp-abilities-api/references/input-schema-gotchas.md +265 -0
- package/.agents/skills/wp-abilities-api/references/php-registration.md +94 -0
- package/.agents/skills/wp-abilities-api/references/plugin-family-patterns.md +233 -0
- package/.agents/skills/wp-abilities-api/references/rest-api.md +13 -0
- package/.agents/skills/wp-abilities-api/references/shared-core-service.md +184 -0
- package/.agents/skills/wp-abilities-audit/SKILL.md +199 -0
- package/.agents/skills/wp-abilities-audit/references/audit-schema.md +300 -0
- package/.agents/skills/wp-abilities-audit/references/capability-gate-tracing.md +197 -0
- package/.agents/skills/wp-abilities-audit/references/controller-enumeration.md +116 -0
- package/.agents/skills/wp-abilities-verify/SKILL.md +215 -0
- package/.agents/skills/wp-abilities-verify/references/annotation-correctness.md +154 -0
- package/.agents/skills/wp-abilities-verify/references/audit-schema-validation.md +131 -0
- package/.agents/skills/wp-abilities-verify/references/permission-roundtrip.md +190 -0
- package/.agents/skills/wp-abilities-verify/references/runtime-harness.md +462 -0
- package/.agents/skills/wp-abilities-verify/references/schema-lints.md +118 -0
- package/.agents/skills/wp-abilities-verify/references/static-enumeration.md +126 -0
- package/.agents/skills/wp-block-development/SKILL.md +175 -0
- package/.agents/skills/wp-block-development/references/attributes-and-serialization.md +22 -0
- package/.agents/skills/wp-block-development/references/block-json.md +49 -0
- package/.agents/skills/wp-block-development/references/creating-new-blocks.md +46 -0
- package/.agents/skills/wp-block-development/references/debugging.md +36 -0
- package/.agents/skills/wp-block-development/references/deprecations.md +24 -0
- package/.agents/skills/wp-block-development/references/dynamic-rendering.md +23 -0
- package/.agents/skills/wp-block-development/references/inner-blocks.md +25 -0
- package/.agents/skills/wp-block-development/references/registration.md +30 -0
- package/.agents/skills/wp-block-development/references/supports-and-wrappers.md +18 -0
- package/.agents/skills/wp-block-development/references/tooling-and-testing.md +21 -0
- package/.agents/skills/wp-block-development/scripts/list_blocks.mjs +121 -0
- package/.agents/skills/wp-block-themes/SKILL.md +117 -0
- package/.agents/skills/wp-block-themes/references/creating-new-block-theme.md +37 -0
- package/.agents/skills/wp-block-themes/references/debugging.md +24 -0
- package/.agents/skills/wp-block-themes/references/patterns.md +18 -0
- package/.agents/skills/wp-block-themes/references/style-variations.md +14 -0
- package/.agents/skills/wp-block-themes/references/templates-and-parts.md +16 -0
- package/.agents/skills/wp-block-themes/references/theme-json.md +59 -0
- package/.agents/skills/wp-block-themes/scripts/detect_block_themes.mjs +117 -0
- package/.agents/skills/wp-interactivity-api/SKILL.md +180 -0
- package/.agents/skills/wp-interactivity-api/references/debugging.md +29 -0
- package/.agents/skills/wp-interactivity-api/references/directives-quickref.md +30 -0
- package/.agents/skills/wp-interactivity-api/references/server-side-rendering.md +310 -0
- package/.agents/skills/wp-performance/SKILL.md +147 -0
- package/.agents/skills/wp-performance/references/autoload-options.md +24 -0
- package/.agents/skills/wp-performance/references/cron.md +20 -0
- package/.agents/skills/wp-performance/references/database.md +20 -0
- package/.agents/skills/wp-performance/references/http-api.md +15 -0
- package/.agents/skills/wp-performance/references/measurement.md +21 -0
- package/.agents/skills/wp-performance/references/object-cache.md +24 -0
- package/.agents/skills/wp-performance/references/query-monitor-headless.md +38 -0
- package/.agents/skills/wp-performance/references/server-timing.md +22 -0
- package/.agents/skills/wp-performance/references/wp-cli-doctor.md +24 -0
- package/.agents/skills/wp-performance/references/wp-cli-profile.md +32 -0
- package/.agents/skills/wp-performance/scripts/perf_inspect.mjs +128 -0
- package/.agents/skills/wp-phpstan/SKILL.md +98 -0
- package/.agents/skills/wp-phpstan/references/configuration.md +52 -0
- package/.agents/skills/wp-phpstan/references/third-party-classes.md +76 -0
- package/.agents/skills/wp-phpstan/references/wordpress-annotations.md +124 -0
- package/.agents/skills/wp-phpstan/scripts/phpstan_inspect.mjs +263 -0
- package/.agents/skills/wp-playground/SKILL.md +233 -0
- package/.agents/skills/wp-playground/references/blueprints.md +36 -0
- package/.agents/skills/wp-playground/references/cli-commands.md +39 -0
- package/.agents/skills/wp-playground/references/debugging.md +16 -0
- package/.agents/skills/wp-playground/references/e2e-playwright.md +115 -0
- package/.agents/skills/wp-plugin-development/SKILL.md +113 -0
- package/.agents/skills/wp-plugin-development/references/data-and-cron.md +19 -0
- package/.agents/skills/wp-plugin-development/references/debugging.md +19 -0
- package/.agents/skills/wp-plugin-development/references/lifecycle.md +33 -0
- package/.agents/skills/wp-plugin-development/references/security.md +29 -0
- package/.agents/skills/wp-plugin-development/references/settings-api.md +22 -0
- package/.agents/skills/wp-plugin-development/references/structure.md +16 -0
- package/.agents/skills/wp-plugin-development/scripts/detect_plugins.mjs +122 -0
- package/.agents/skills/wp-plugin-directory-guidelines/SKILL.md +133 -0
- package/.agents/skills/wp-plugin-directory-guidelines/references/gpl-compliance.md +217 -0
- package/.agents/skills/wp-plugin-directory-guidelines/references/guideline-review-checklist.md +592 -0
- package/.agents/skills/wp-plugin-directory-guidelines/references/naming-rules.md +121 -0
- package/.agents/skills/wp-project-triage/SKILL.md +39 -0
- package/.agents/skills/wp-project-triage/references/triage.schema.json +143 -0
- package/.agents/skills/wp-project-triage/scripts/detect_wp_project.mjs +610 -0
- package/.agents/skills/wp-rest-api/SKILL.md +115 -0
- package/.agents/skills/wp-rest-api/references/authentication.md +18 -0
- package/.agents/skills/wp-rest-api/references/custom-content-types.md +20 -0
- package/.agents/skills/wp-rest-api/references/discovery-and-params.md +20 -0
- package/.agents/skills/wp-rest-api/references/responses-and-fields.md +30 -0
- package/.agents/skills/wp-rest-api/references/routes-and-endpoints.md +36 -0
- package/.agents/skills/wp-rest-api/references/schema.md +22 -0
- package/.agents/skills/wp-wpcli-and-ops/SKILL.md +126 -0
- package/.agents/skills/wp-wpcli-and-ops/references/automation.md +30 -0
- package/.agents/skills/wp-wpcli-and-ops/references/cron-and-cache.md +23 -0
- package/.agents/skills/wp-wpcli-and-ops/references/debugging.md +17 -0
- package/.agents/skills/wp-wpcli-and-ops/references/multisite.md +22 -0
- package/.agents/skills/wp-wpcli-and-ops/references/packages-and-updates.md +22 -0
- package/.agents/skills/wp-wpcli-and-ops/references/safety.md +30 -0
- package/.agents/skills/wp-wpcli-and-ops/references/search-replace.md +40 -0
- package/.agents/skills/wp-wpcli-and-ops/scripts/wpcli_inspect.mjs +90 -0
- package/.agents/skills/wp-wpengine/SKILL.md +398 -0
- package/.agents/skills/wp-wpengine/references/ci-gate.md +469 -0
- package/.agents/skills/wp-wpengine/references/github-actions-deploy.md +736 -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/.agents/skills/wpds/SKILL.md +59 -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/.github/skills/wp-playground/SKILL.md +132 -1
- package/.github/skills/wp-playground/references/e2e-playwright.md +115 -0
- package/.github/skills/wp-wpengine/SKILL.md +127 -0
- package/AGENTS.md +22 -10
- package/AGENTS.template.md +20 -10
- package/README.md +93 -86
- package/dist/cli.js +5 -1
- 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 +176 -4
- package/dist/lib/installer.js +166 -2
- package/extensions/wp-agent-kit/index.ts +185 -10
- package/package.json +10 -14
- package/skills-custom/wp-wpengine/SKILL.md +398 -0
- package/skills-custom/wp-wpengine/references/ci-gate.md +469 -0
- package/skills-custom/wp-wpengine/references/github-actions-deploy.md +736 -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/workflows/ci.yml +0 -44
- package/.husky/pre-commit +0 -7
- package/CLI_REVIEW.md +0 -250
- package/biome.json +0 -39
|
@@ -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
|
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
|
package/.husky/pre-commit
DELETED
package/CLI_REVIEW.md
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
# WordPress Agent Kit CLI - Accessibility & Agent-Friendly Review
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-06-08
|
|
4
|
-
**Version**: 0.2.1
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Executive Summary
|
|
9
|
-
|
|
10
|
-
The current CLI is functional for **human developers** using interactive prompts (`@clack/prompts`), but lacks features for **programmatic/agent usage**:
|
|
11
|
-
|
|
12
|
-
- ❌ No JSON output mode
|
|
13
|
-
- ❌ No machine-readable result objects
|
|
14
|
-
- ❌ No programmatic API (only CLI entrypoint)
|
|
15
|
-
- ❌ No non-interactive "headless" mode for all commands
|
|
16
|
-
- ❌ No structured logging/event streaming
|
|
17
|
-
- ❌ Exit codes not consistently semantic
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Current Architecture
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
src/
|
|
25
|
-
├── cli.ts # Entry point, Commander setup
|
|
26
|
-
├── commands/
|
|
27
|
-
│ ├── install.ts # Non-interactive (args + flags only) ✓
|
|
28
|
-
│ ├── setup.ts # Interactive (prompts only) ✗
|
|
29
|
-
│ ├── sync-skills.ts # Non-interactive (args + flags only) ✓
|
|
30
|
-
│ └── run-playground.ts # Non-interactive ✓
|
|
31
|
-
├── lib/
|
|
32
|
-
│ ├── installer.ts # Core logic (pure functions) ✓
|
|
33
|
-
│ └── triage-mapper.ts # Pure mappers ✓
|
|
34
|
-
└── utils/
|
|
35
|
-
├── paths.ts # Path resolution
|
|
36
|
-
└── run.ts # Command runner
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Good**: Core logic (`installKit`, mappers) is pure and testable.
|
|
40
|
-
**Gap**: `setup.ts` couples interactive prompts with business logic.
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Recommendations
|
|
45
|
-
|
|
46
|
-
### 1. Add JSON Output Mode (--json)
|
|
47
|
-
|
|
48
|
-
**Goal**: Every command outputs structured JSON to stdout when requested.
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
# Success
|
|
52
|
-
wp-agent-kit install /path/to/project --platform github --json
|
|
53
|
-
# {"success":true,"targetDir":"/path/to/project","platform":"github","filesCopied":["AGENTS.md",".github/..."],"durationMs":142}
|
|
54
|
-
|
|
55
|
-
# Failure
|
|
56
|
-
wp-agent-kit install /nonexistent --json
|
|
57
|
-
# {"success":false,"error":"E_NOT_FOUND","message":"Target directory does not exist","code":"ENOENT"}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**Implementation**:
|
|
61
|
-
- Add `--json` / `--output json` global flag in `cli.ts`
|
|
62
|
-
- Create `OutputFormatter` utility: `json`, `human`, `quiet`
|
|
63
|
-
- Return structured result objects from all command actions
|
|
64
|
-
- Separate stdout (JSON) from stderr (human diagnostics)
|
|
65
|
-
|
|
66
|
-
### 2. Add Machine-Readable Exit Codes
|
|
67
|
-
|
|
68
|
-
| Code | Meaning |
|
|
69
|
-
|------|---------|
|
|
70
|
-
| 0 | Success |
|
|
71
|
-
| 1 | General error |
|
|
72
|
-
| 2 | Invalid arguments / usage |
|
|
73
|
-
| 3 | Target not found / ENOENT |
|
|
74
|
-
| 4 | Permission denied / EACCES |
|
|
75
|
-
| 5 | Already exists (without --force) |
|
|
76
|
-
| 6 | Git/submodule error |
|
|
77
|
-
| 7 | Network/fetch error |
|
|
78
|
-
| 8 | Validation failed |
|
|
79
|
-
| 130 | Cancelled (SIGINT) |
|
|
80
|
-
|
|
81
|
-
### 3. Extract Programmatic API
|
|
82
|
-
|
|
83
|
-
Expose core functions for direct import by agents/scripts:
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
// src/api.ts (new)
|
|
87
|
-
export interface InstallOptions {
|
|
88
|
-
targetDir: string;
|
|
89
|
-
platform: Platform;
|
|
90
|
-
force?: boolean;
|
|
91
|
-
dryRun?: boolean;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export interface InstallResult {
|
|
95
|
-
success: boolean;
|
|
96
|
-
targetDir: string;
|
|
97
|
-
platform: Platform;
|
|
98
|
-
filesCreated: string[];
|
|
99
|
-
filesSkipped: string[];
|
|
100
|
-
errors: string[];
|
|
101
|
-
durationMs: number;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export async function installKit(options: InstallOptions): Promise<InstallResult>;
|
|
105
|
-
export async function syncSkills(options: SyncOptions): Promise<SyncResult>;
|
|
106
|
-
export async function runTriage(targetDir: string): Promise<TriageResult>;
|
|
107
|
-
export async function configureAgentsMd(options: ConfigureOptions): Promise<ConfigureResult>;
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Benefits**:
|
|
111
|
-
- Agents can import and call directly: `import { installKit } from 'wordpress-agent-kit'`
|
|
112
|
-
- No subprocess overhead
|
|
113
|
-
- Full TypeScript types
|
|
114
|
-
- Testable in isolation
|
|
115
|
-
|
|
116
|
-
### 4. Make `setup` Command Headless-Capable
|
|
117
|
-
|
|
118
|
-
Current `setup.ts` is prompt-driven. Add non-interactive mode:
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
# Full non-interactive (requires all flags)
|
|
122
|
-
wp-agent-kit setup /path/to/project \
|
|
123
|
-
--project-type plugin \
|
|
124
|
-
--tech-stack gutenberg,rest-api,composer \
|
|
125
|
-
--platform github \
|
|
126
|
-
--yes \
|
|
127
|
-
--json
|
|
128
|
-
|
|
129
|
-
# Hybrid: run triage, apply detected values, no prompts
|
|
130
|
-
wp-agent-kit setup /path/to/project --auto --json
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**Flag Matrix for `setup`**:
|
|
134
|
-
| Flag | Description |
|
|
135
|
-
|------|-------------|
|
|
136
|
-
| `--project-type <type>` | plugin \| theme \| block-theme \| site \| blocks \| other |
|
|
137
|
-
| `--tech-stack <list>` | Comma-separated: gutenberg,interactivity,rest-api,wpcli,composer,phpstan,npm,playground |
|
|
138
|
-
| `--platform <platform>` | github \| cursor \| claude \| agent \| pi |
|
|
139
|
-
| `--package-manager <pm>` | npm \| pnpm \| yarn |
|
|
140
|
-
| `--auto` | Run triage, apply detected values, skip prompts |
|
|
141
|
-
| `--yes` / `-y` | Accept all confirmations (requires other flags) |
|
|
142
|
-
| `--reset` | Overwrite existing |
|
|
143
|
-
| `--dry-run` | Show what would be done |
|
|
144
|
-
|
|
145
|
-
### 5. Add Structured Logging / Event Stream
|
|
146
|
-
|
|
147
|
-
For long-running operations (sync-skills, playground), emit NDJSON events:
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
wp-agent-kit sync-skills --json-stream
|
|
151
|
-
# {"event":"start","phase":"clone","timestamp":"..."}
|
|
152
|
-
# {"event":"progress","phase":"fetch","message":"Fetching tags...","timestamp":"..."}
|
|
153
|
-
# {"event":"complete","phase":"install","result":{"skillsSynced":42,"timestamp":"..."}}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
**Events**: `start`, `progress`, `phase-change`, `warning`, `complete`, `error`
|
|
157
|
-
|
|
158
|
-
### 6. Add Dry-Run / Preview Mode
|
|
159
|
-
|
|
160
|
-
```bash
|
|
161
|
-
wp-agent-kit install /path --dry-run --json
|
|
162
|
-
# {"wouldCopy":[{"src":"AGENTS.template.md","dest":"/path/AGENTS.md"},{"src":".github/...","dest":"/path/.github/..."}],"wouldCreateDirs":[]}
|
|
163
|
-
|
|
164
|
-
wp-agent-kit setup /path --dry-run --auto --json
|
|
165
|
-
# {"wouldInstall":true,"detectedType":"plugin","detectedTech":["gutenberg","npm"],"wouldModify":["AGENTS.md"]}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### 7. Add Shell Completion (Modern CLI Standard)
|
|
169
|
-
|
|
170
|
-
```bash
|
|
171
|
-
# Generate completion scripts
|
|
172
|
-
wp-agent-kit completion bash > /etc/bash_completion.d/wp-agent-kit
|
|
173
|
-
wp-agent-kit completion zsh > ~/.zsh/completions/_wp-agent-kit
|
|
174
|
-
wp-agent-kit completion fish > ~/.config/fish/completions/wp-agent-kit.fish
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
Commander.js supports this natively: `program.enablePositionalOptions().addHelpCommand().configureOutput({ writeOut: ... })`
|
|
178
|
-
|
|
179
|
-
### 8. Add `--version` JSON Output
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
wp-agent-kit --version --json
|
|
183
|
-
# {"name":"wp-agent-kit","version":"0.2.1","node":"20.18.0","platform":"linux"}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## Priority Matrix
|
|
189
|
-
|
|
190
|
-
| Priority | Feature | Effort | Impact |
|
|
191
|
-
|----------|---------|--------|--------|
|
|
192
|
-
| **P0** | JSON output (`--json`) | Low | High |
|
|
193
|
-
| **P0** | Semantic exit codes | Low | High |
|
|
194
|
-
| **P0** | Programmatic API export | Medium | High |
|
|
195
|
-
| **P1** | Headless `setup` mode | Medium | High |
|
|
196
|
-
| **P1** | Dry-run/preview | Low | Medium |
|
|
197
|
-
| **P2** | NDJSON event streaming | Medium | Medium |
|
|
198
|
-
| **P2** | Shell completions | Low | Medium |
|
|
199
|
-
| **P3** | Man page generation | Low | Low |
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## Example: Agent-Friendly Workflow
|
|
204
|
-
|
|
205
|
-
```bash
|
|
206
|
-
# 1. Agent detects WordPress project
|
|
207
|
-
wp-agent-kit setup /workspace/my-plugin --auto --json
|
|
208
|
-
# {"success":true,"applied":{"projectType":"plugin","techStack":["gutenberg","npm"]},"filesModified":["AGENTS.md"]}
|
|
209
|
-
|
|
210
|
-
# 2. Agent syncs latest skills
|
|
211
|
-
wp-agent-kit sync-skills --json
|
|
212
|
-
# {"success":true,"skillsSynced":47,"source":"WordPress/agent-skills@trunk"}
|
|
213
|
-
|
|
214
|
-
# 3. Agent installs for specific platform (e.g., Cursor)
|
|
215
|
-
wp-agent-kit install /workspace/my-plugin --platform cursor --json
|
|
216
|
-
# {"success":true,"platform":"cursor","targetDir":"/workspace/my-plugin","filesCreated":[".cursor/...","AGENTS.md"]}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## Implementation Notes
|
|
222
|
-
|
|
223
|
-
### Minimal Changes for P0
|
|
224
|
-
|
|
225
|
-
1. **cli.ts**: Add global `--json` flag, result formatter
|
|
226
|
-
2. **commands/*.ts**: Return structured results instead of `process.exit()`
|
|
227
|
-
3. **lib/installer.ts**: Return `InstallResult` object (already close)
|
|
228
|
-
4. **package.json**: Add `"exports": { ".": "./dist/cli.js", "./api": "./dist/api.js" }`
|
|
229
|
-
|
|
230
|
-
### Testing Strategy
|
|
231
|
-
|
|
232
|
-
```typescript
|
|
233
|
-
// tests/api/install.api.test.ts
|
|
234
|
-
import { installKit } from '../../src/api.js';
|
|
235
|
-
|
|
236
|
-
it('returns structured result on success', async () => {
|
|
237
|
-
const result = await installKit({ targetDir: '/tmp/test', platform: 'github' });
|
|
238
|
-
expect(result.success).toBe(true);
|
|
239
|
-
expect(result.filesCreated).toContain('AGENTS.md');
|
|
240
|
-
});
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## References
|
|
246
|
-
|
|
247
|
-
- [Commander.js JSON output patterns](https://github.com/tj/commander.js/blob/master/Examples/options-json.ts)
|
|
248
|
-
- [CLI Guidelines - Output](https://clig.dev/#output)
|
|
249
|
-
- [12-factor CLI apps](https://medium.com/@jdxcode/12-factor-cli-apps-dd3c227a0e46)
|
|
250
|
-
- [GitHub CLI `gh` JSON patterns](https://cli.github.com/manual/gh_help_formatting)
|
package/biome.json
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
|
3
|
-
"vcs": {
|
|
4
|
-
"enabled": true,
|
|
5
|
-
"clientKind": "git",
|
|
6
|
-
"useIgnoreFile": true
|
|
7
|
-
},
|
|
8
|
-
"files": {
|
|
9
|
-
"include": ["src/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "extensions/**/*.ts"],
|
|
10
|
-
"ignoreUnknown": true
|
|
11
|
-
},
|
|
12
|
-
"organizeImports": {
|
|
13
|
-
"enabled": true
|
|
14
|
-
},
|
|
15
|
-
"linter": {
|
|
16
|
-
"enabled": true,
|
|
17
|
-
"rules": {
|
|
18
|
-
"recommended": true,
|
|
19
|
-
"suspicious": {
|
|
20
|
-
"noExplicitAny": "warn"
|
|
21
|
-
},
|
|
22
|
-
"correctness": {
|
|
23
|
-
"noUnusedVariables": "error"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
"formatter": {
|
|
28
|
-
"enabled": true,
|
|
29
|
-
"indentStyle": "tab",
|
|
30
|
-
"lineWidth": 100
|
|
31
|
-
},
|
|
32
|
-
"javascript": {
|
|
33
|
-
"formatter": {
|
|
34
|
-
"quoteStyle": "single",
|
|
35
|
-
"trailingCommas": "es5",
|
|
36
|
-
"semicolons": "always"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|