AI Content Signals — Full changelog

For each release, see the entries below. The latest version is always at the top.
The current release notes also live in readme.txt under "== Changelog ==".

= 1.3.3 =
* Improved: The admin JavaScript that builds a custom bot row now escapes every value it writes into the markup, with a dedicated helper for each context: escAttr() for attributes, which encodes quotes, and escHtml() for text. The values come from the plugin own translatable strings, so nothing was exploitable, but a translation containing a double quote would have broken out of the placeholder attribute.
* Fix: On a multisite network, the administrator of any subsite could create or rewrite the physical robots.txt at the root of the install, the single file every site on the network is served from, just by saving the plugin settings. The plugin settings are stored per site, but the file is shared, so a subsite could set the AI policy and the Sitemap line for the whole network, including sites where the plugin was not even active. Writing that file now requires network administrator rights, and the settings page says so instead of failing silently. Each subsite keeps full control of its own virtual robots.txt, and single sites behave exactly as before.
* Fix: Notices raised on the settings page are now displayed. Import and restore errors were registered but never printed, so an invalid import file failed with nothing on screen.

= 1.3.2 =
* Improved: Compatible with WordPress 7.1.
* Improved: Signal values are now validated against the Content Signals vocabulary (yes, no, or not specified) both when settings are saved and when they are written out, so only valid values can reach robots.txt, the HTTP header, the meta tag or the TDMRep manifest.

= 1.3.1 =
* Fix: Removing or regenerating the Content Signals block no longer joins the line before the block with the line after it. When the block sat between blocks written by other plugins, that join could turn a neighbouring comment into part of a directive, so a stray "Disallow: /" ended up applying to the whole site.
* Fix: robots.txt is now always left with a single newline at the end, so the next plugin that appends to it starts on its own line.
* Fix: Uninstalling the plugin no longer leaves an empty robots.txt behind when the file held nothing but the Content Signals block. A web server serves a physical robots.txt even when it is empty, which shadowed the virtual one WordPress generates, so the site quietly lost its core directives and its Sitemap line. The file is now deleted instead.

= 1.3.0 =
* New: Output surfaces beyond robots.txt. Optionally emit a robots meta tag with noai, noimageai in the page head when AI training is blocked.
* New: Optionally send an X-Robots-Tag: noai, noimageai HTTP response header on the front-end.
* New: Optionally serve a W3C TDMRep manifest at /.well-known/tdmrep.json to reserve text and data mining rights.
* Improved: Added a settings-page notice explaining how AI Content Signals and VigIA complement each other.
* Improved: Refreshed the recommended plugins shown in the promotional banner.

= 1.2.2 =
* Fix: Fixed promotional banner button alignment on WordPress 7.0 due to core CSS specificity changes

= 1.2.1 =
Tested up to WordPress 7.0

= 1.2.0 =
* New: Added export/import settings feature (JSON) for easy migration between sites
* New: Added restore defaults button to reset all settings
* New: Added 3 new AI bots: DeepSeekBot, GrokBot (xAI), and PanguBot (Huawei)
* New: Added `ayudawp_acs_predefined_bots` filter hook for developers to extend the bots list
* New: Added sticky table headers for the bots table on scroll
* New: Added dashicon-flag to settings page title
* Improved: Added new recommendation to promotional banner services
* Fix: Fixed checkbox sanitization to work correctly with JSON imports
* Improved: Refactored uninstall.php file to follow WordPress Coding Standards
* Improved: Code organization with new export-import.php file

= 1.1.0 =
* Added 8 new AI bots: OAI-SearchBot, Perplexity-User, Amazonbot, meta-externalagent, DuckAssistBot, AI2Bot, MistralAI-User, and Timpibot
* Replaced static promotional box with dynamic banner showing random AyudaWP plugins and services
* Improved code quality: replaced echo esc_html__() with esc_html_e() throughout
* Removed inline styles in favor of CSS classes
* Added capability check to admin notices
* Unified null coalescing operator usage across all files
* Removed unnecessary Domain Path header
* General code cleanup and WordPress Coding Standards improvements

= 1.0.1 =
* Tested up to WordPress 6.9

= 1.0.0 =
* Initial release
* Global Content Signals settings
* Bot-specific configuration for 17 predefined AI crawlers
* Custom bot support
* Physical and virtual robots.txt handling
* Option to create physical robots.txt with basic WordPress rules
* Automatic sitemap detection and inclusion
* Legal text option with EU Directive reference
* Live preview of robots.txt output
* Status notifications for file permissions
