== Changelog == = 0.4.0 = _Release date: 2026-08-14_ **Highlights** * Click-to-expand rows in the catalog table: clicking the ▸ next to a plugin's name reveals a detail row with the plugin's description and a link to its website on the store, so users can understand what each plugin does before installing. Pure CSS toggle (`:has()` + hidden checkbox) — no JavaScript, consistent with the classic-flow philosophy. **Added** * Detail row under each catalog entry, shown when the entry has a description or a website URL (Core 1.4.2+ exposes `description` in the catalog list; entries without either keep a plain, non-expandable row). * "Visit website" link using `page_url` (falling back to `homepage`), opened in a new tab with `rel="noopener noreferrer"`. **Changed** * Plugin version 0.3.1 → 0.4.0. No database schema changes (no custom tables). **Compatibility** * WordPress: 7.0 - 7.1 (declared floor of the ecosystem; scan-confirmed lower) * PHP: 8.4 - 8.5 (declared floor of the ecosystem; scan-confirmed lower) = 0.3.1 = _Release date: 2026-08-14_ **Changed** * Default store URL is now `https://www.robotstxt.software` (was `https://plugins.robotstxt.es`). Applies to new activations and fresh installs; existing saved URLs are preserved. The catalog API at the new domain is verified live. * Plugin version 0.3.0 → 0.3.1. **Compatibility** * WordPress: 7.0 - 7.1 (declared floor of the ecosystem; scan-confirmed lower) * PHP: 8.4 - 8.5 (declared floor of the ecosystem; scan-confirmed lower) = 0.3.0 = _Release date: 2026-08-13_ **Highlights** * Classic install/activate/update flow: the catalog actions now run on a full page load (`admin-post.php` with per-action-and-slug nonces) and report the outcome through standard admin notices (green success / red error) at the top of the page, replacing the previous AJAX flow. **Added** * Activate action — installed-but-inactive plugins show an "Activate" button that calls `activate_plugins()`. * Update action — plugins with a newer catalog version show an "Update" button that re-downloads the ZIP and runs the `Plugin_Upgrader` with `overwrite` enabled. * Install/Activate/Update buttons are nonce links (`robotstxt_manager_{action}_{slug}` nonce actions) to `admin-post.php`, all `manage_options`-gated. * Redirect-based notices: handlers redirect back to the catalog page carrying `robotstxt_manager_result` (success/error) and `robotstxt_manager_message`, rendered as dismissible standard notices. **Changed** * `Robotstxt_Manager_Installer` rewritten from an AJAX handler to three admin-post handlers (`robotstxt_manager_install`, `robotstxt_manager_activate`, `robotstxt_manager_update`); download logic (Bearer account-key auth, ZIP validation, temp-file cleanup) unchanged. * Removed the AJAX endpoint, `manager-install.js`, and its script localization. * Plugin version 0.2.0 → 0.3.0. **Compatibility** * WordPress: 7.0 - 7.1 (declared floor of the ecosystem; scan-confirmed lower) * PHP: 8.4 - 8.5 (declared floor of the ecosystem; scan-confirmed lower) = 0.2.0 = _Release date: 2026-08-12_ **Highlights** * Phase 2: the Install action. Free and premium plugins can be installed directly from the ROBOTSTXT catalog into the local site, authenticated with the account-level API key (requires Plugins Core 1.4.0+). **Added** * `Robotstxt_Manager_Installer` — AJAX handler (`wp_ajax_robotstxt_manager_install_plugin`, nonce-protected, `manage_options`-gated) that resolves the plugin in the remote catalog, downloads the ZIP (free plugins with a published public `download_url` directly; everything else via Core's authenticated `/download` endpoint with an `Authorization: Bearer ` header), validates the archive (ZIP magic bytes), installs it via `Plugin_Upgrader`, and cleans up the temp file on every path. * `public/js/manager-install.js` — wires the Install buttons to the AJAX action with in-flight state and result rendering. * Catalog view: enabled Install buttons for compatible plugins (free and premium). **Changed** * Plugin version 0.1.3 → 0.2.0. Description updated to reflect Phase 2. **Compatibility** * WordPress: 7.0 - 7.1 (declared floor of the ecosystem; scan-confirmed lower) * PHP: 8.4 - 8.5 (declared floor of the ecosystem; scan-confirmed lower) = 0.1.3 = _Release date: 2026-08-12_ **Changed** * Version bumped 0.1.2 → 0.1.3. * `composer.json` PHP requirement updated from `>=8.4` to `>=7.4` to match the real PHPCompatibility scan floor and the plugin header. * `composer.lock` regenerated. * `.pot` file regenerated for v0.1.3. **Compatibility** * WordPress: 4.7 - 7.1 * PHP: 7.4 - 8.5 **Tests** * PHP Coding Standards: PHP_CodeSniffer 3.13.6 * WordPress Coding Standards: WPCS 3.4.1 * PHPStan: level 9, 0 errors * PHPCompatibility: 7.4–8.5 clean * wp-compat: 0 errors against WP 4.7 = 0.1.2 = _Release date: 2026-08-12_ **Highlights** * Documentation refresh: readme.txt and changelog.txt aligned to the standard templates. **Changed** * Version bumped 0.1.1 → 0.1.2. * readme.txt: added Extra Configurations section, Automatic download subsection in Installation, Previous versions link in Changelog. * changelog.txt: 0.1.1 entry reformatted to follow the standard template (Highlights, Changed, Compatibility, Tests). * PHPCompatibility scan (5.6–8.5): real PHP floor is **7.2**. Project declares **8.4** (ecosystem exception). * wp-compat scan against WordPress 4.7: **zero WPCompat errors**. Real WP floor is **≤ 4.7**. Project declares **7.0** (ecosystem support window). **Compatibility** * WordPress: 4.7 - 7.1 * PHP: 7.4 - 8.5 **Tests** * PHP Coding Standards: PHP_CodeSniffer 3.13.6 * WordPress Coding Standards: WPCS 3.4.1 * PHPStan: level 9, 0 errors * PHPCompatibility: 8.4–8.5 clean (real floor 7.2) * wp-compat: 0 errors against WP 4.7 = 0.1.1 = _Release date: 2026-08-12_ **Highlights** * Compatibility scans completed and documented. No code changes. **Changed** * Version bumped 0.1.0 → 0.1.1. * PHPCompatibility scan (5.6–8.5) completed: real PHP floor is **7.2** (highest-required feature is `object` return type, introduced in PHP 7.2). The project deliberately declares **8.4** to match the ROBOTSTXT ecosystem — this is a documented exception to `AGENTS-deploy.md` §"PHP compatibility check". * wp-compat scan against WordPress 4.7: **zero WPCompat errors**. The Manager's code uses only WordPress APIs available since 4.7 or earlier. The real WordPress floor is **≤ 4.7**; the project declares `Requires at least: 7.0` to match the ecosystem support window. * `.pot` file regenerated for v0.1.1. **Compatibility** * WordPress: 4.7 - 7.1 * PHP: 7.4 - 8.5 **Tests** * PHP Coding Standards: PHP_CodeSniffer 3.13.6 * WordPress Coding Standards: WPCS 3.4.1 * PHPStan: level 9, 0 errors * PHPCompatibility: 8.4–8.5 clean (real floor 7.2) * wp-compat: 0 errors against WP 4.7 = 0.1.0 = _Release date: 2026-08-12_ **Highlights** * Phase 1 scaffold of Manager (by ROBOTSTXT) — client-side dashboard for the ROBOTSTXT plugin ecosystem. Read-only catalog view with local install-state resolution. **Added** * Plugin header, autoloader (Composer with manual fallback), lifecycle hooks, constants (`ROBOTSTXT_MANAGER_VERSION`, `ROBOTSTXT_MANAGER_DIR`, `ROBOTSTXT_MANAGER_URL`, `ROBOTSTXT_MANAGER_BASENAME`). * `Robotstxt_Manager_Loader` action/filter queue (identical pattern to Core/Mollie/Sync). * `Robotstxt_Manager_Encryption` — AES-256-CBC encrypt/decrypt for the API key, using WordPress `AUTH_KEY` + `AUTH_SALT` for key derivation. Same pattern as Core's Forgejo token encryption. * `Robotstxt_Manager_Core_Client` — HTTP client for the remote Plugins Core REST API. Authenticated via `Authorization: Bearer ` header. Implements `test_connection()`, `get_catalog()` (cached in transient), `clear_catalog_cache()`. * `Robotstxt_Manager_Settings` — Settings API page with Store URL, API Key (masked, encrypted, last-4 hint, delete-on-empty preservation), Catalog Cache TTL, Data-on-Uninstall opt-in. AJAX "Test connection" button with nonce + capability check. * `Robotstxt_Manager_Admin` — Top-level admin menu (label "ROBOTSTXT") with catalog table view. Resolves local install/active/update state for every catalog entry using `get_plugins()` + `is_plugin_active()`. "Refresh catalog" admin-post action. * `uninstall.php` with opt-in data deletion (default: preserve all options and transients). * Per-project tooling: Composer, PHPCS + WPCS + PHPCompatibility, PHPStan level 9 + wp-compat, PHPUnit. `bin/preflight.sh` and `bin/deploy.sh`. **Compatibility** * WordPress: 4.7 - 7.1 * PHP: 7.4 - 8.5 **Tests** * Phase 1 scaffold — plugin-header tests included. Additional tests for Core client, settings, and admin rendering in follow-up phases.