CLAUDE.md · git:20260706.5298452 · 2026-07-06 · sha256 5c93cc22e1fb2c4d
CLAUDE.md git:20260706.5298452A
Immutable. This exact content never changes and is served at /api/v1/blob/5c93cc22e1fb2c4d.
# CLAUDE.md — WordPress Malware Removal > Project context for Claude Code. Authoritative for this project. Global rules from `~/.claude/CLAUDE.md` still apply; this file specializes and overrides where noted. <!-- No domain-rule import: this is a standalone Python security tool + Claude skill, NOT a WP.org-bound plugin. Do not add @~/.claude/rules/wp-org-plugins.md here. --> --- ## 1. Identity | Attribute | Value | |---|---| | Product | WordPress Malware Removal — agent-driven WP security tool (3 modes: **Audit · Remove · Harden**) | | Brand | Aditya personal (adityaarsharma.com) | | Repo | https://github.com/adityaarsharma/wordpress-malware-removal (PUBLIC, AGPL-3.0-or-later) | | Local folder | `~/Claude Projects/wp-malware-hunter/` — **NOTE: folder name ≠ repo/skill name** (see §6) | | Skill install path | `~/.claude/skills/wordpress-malware-removal` | | Status | Remove ✅ shipped · Audit ✅ shipped · Harden 🟡 protocol only (actions not yet scripted) · CI green | | Brain routing | `brain-aditya` (hard wall — never cross). **Do NOT write this project to the POSIMYTH brain.** | | GitHub auth | `gh` logged in as **adityaarsharma** (repo scope) | --- ## 2. Stack & versions | Layer | Choice + version | |---|---| | Language | Python 3 — **standard library ONLY** (argparse, json, re, hashlib, urllib, ssl, socket, shutil, datetime). Zero pip deps. | | Framework | None. Runs over any WordPress MCP gateway (SproutOS recommended) or SSH+WP-CLI, or standalone CLI. | | Database | None (reads target site's DB via the gateway; nothing local) | | Package manager | None — must stay dependency-free (see §5) | | Build / bundle | None | | Tests | Custom harness: `tests/run_corpus.py` (malware) + `tests/run_audit_corpus.py` (code audit). NOT pytest. | | Lint | None configured | | Typecheck | None configured | | Deploy | Push to GitHub `main` → skill consumed via `~/.claude/skills/`. No package registry. | --- ## 3. Verification commands (Claude MUST run before claiming "done") ```bash cd "/Users/adityasharma/Claude Projects/wp-malware-hunter" python3 -m py_compile scripts/*.py tests/*.py # compiles clean python3 tests/run_corpus.py # malware corpus: all malicious caught, clean silent python3 tests/run_audit_corpus.py # audit corpus: vulnerable caught, secure silent gh run list --repo adityaarsharma/wordpress-malware-removal --limit 1 # CI must be "completed success" ``` Exit code 0 = pass. Any other exit code = NOT DONE. Paste the exit code in your "done" message. CI (`.github/workflows/ci.yml`) runs on every push + weekly: validates JSON + regex compiles + skill tags, `py_compile`, then both corpora. Do not push red. --- ## 4. Project structure & source of truth ``` wp-malware-hunter/ ├── SKILL.md — the methodology (3 modes). name: wordpress-malware-removal. SOURCE OF TRUTH for behavior. ├── SPEC.md — requirements, edge cases, non-goals ├── ROADMAP.md — next steps; §Harden-actions is the #1 open TODO ├── README.md — public value-first sales copy (agent-agnostic) ├── LICENSE — AGPL-3.0-or-later ├── scripts/ — pure-Python engine: │ ├── scan_patterns.py + signatures.json — 38 malware families │ ├── code_auditor.py + audit_rules.json — 10 vuln classes │ ├── cloaking_diff.py — fetch-as-Googlebot vs browser │ ├── safety_gate.py — REQUIRES a user-supplied backup (never creates one) → quarantine/rollback │ ├── reinstall_clean.py, hardening_audit.py, posture_score.py, wordfence_client.py ├── tests/ — run_corpus.py + run_audit_corpus.py ├── references/ — 10 playbooks (detection, remediation, cloaking, families, edge-cases, gateways, wordfence, growing-db, case-study) └── .github/workflows/ci.yml ``` Source-of-truth files: `SKILL.md` (behavior), `SPEC.md` (requirements), `scripts/signatures.json` + `scripts/audit_rules.json` (detection data). --- ## 5. Conventions Claude cannot infer from code - **Dependency-free is a hard constraint.** CI has no `pip install` step. Never add a third-party import to `scripts/`. Optional enhancements (e.g. Playwright headless cloaking) must degrade gracefully when absent — never a hard import at module top. - **All destructive actions route through `safety_gate.py`** — backup → quarantine (never delete in place) → rollback. Do not add a file-mutating path that bypasses it. - **Detection data lives in JSON, not Python.** New malware families go in `signatures.json`, new vuln classes in `audit_rules.json` — then a corpus sample must be added proving catch + no false positive on clean code. - **Mode names are deliberately plain**: Clean/Remove · Harden · Audit. No cutesy/marketing names in user-facing strings — the r/ProWordPress audience rejects AI-slop naming. - **Harden policy**: auto-apply safe/reversible fixes, ASK before risky ones (XML-RPC off, REST restriction, 2FA enforcement) — all via `safety_gate.py`. - **Backup policy**: the tool does NOT create backups. `safety_gate.py` *requires* a fresh (<24h) user/host-supplied backup and refuses every destructive step without one. Read-only Audit/Review never need it. Before any Clean, the agent must **hard-remind the user to take a full off-site backup** — never imply the tool took care of it. - **Three focuses** (user-facing framing): Review/Audit (read-only) · Clean (Remove) · Harden. "Remove" and "Clean" are the same focus. - **Delivery model**: any WP MCP gateway or SSH — this is NOT a standalone WordPress plugin, and must not become one. --- ## 6. Critical gotchas (real bugs you don't want repeated) - **Folder name ≠ repo/skill name.** Local dir is `wp-malware-hunter`; git repo, skill `name:`, and install path are all `wordpress-malware-removal`. Keep the three canonical names (`wordpress-malware-removal`) consistent in SKILL.md, README, and CI; the local folder is the only place the old `wp-malware-hunter` name survives. - **`heuristic`-tagged signatures are not yet validated against a real-malware corpus** — flagged in ROADMAP as a TODO. Treat their hits as lower-confidence until corpus-backed. - Session cwd `~/Claude Projects/WordPress Malware Removal/` is an empty stray auto-created folder, NOT the project. Work in `wp-malware-hunter/`. --- ## 7. Pro / monetization Pattern: **N/A** — open-source AGPL-3.0-or-later (chosen to close the SaaS loophole). No Free/Pro split. SproutOS (a POSIMYTH product) is the recommended gateway and the planned 1-click playbook host, but this tool itself stays free/OSS. --- ## 8. Outstanding decisions - [ ] **Harden actions as scripts** (#1 gap, per ROADMAP) — idempotent, per-action-rollback fixers: REST user-enum, author enum, public `debug.log`, 2FA guidance, file perms, salts, headers, uploads PHP-block. Make Harden as deterministic as Remove. - [ ] Headless-browser cloaking check (optional Playwright, graceful fallback). - [ ] Real-malware corpus validation for `heuristic` signatures. - [ ] SproutOS Playbook — 1-click Audit/Remove/Harden across many sites (agency). - [ ] Reconcile local folder name with repo name, or leave as-is (documented in §6). --- ## 9. Quick-reference URLs | Resource | URL | |---|---| | Repo | https://github.com/adityaarsharma/wordpress-malware-removal | | Live audit finding (real) | `python3 scripts/hardening_audit.py https://nexterwp.com` — REST/author enum + public debug.log exposure | <!-- Maintainer notes: target ≤200 lines. Cut quarterly. Detection data → JSON, not this file. -->