Skip to content

Commit 6a83405

Browse files
jeffpauldkotter
andauthored
Merge pull request #327 from WordPress/release/0.6.0
Release/0.6.0 Co-authored-by: dkotter <dkotter@git.wordpress.org>
2 parents b0fdee8 + 6d55cbe commit 6a83405

28 files changed

+186
-131
lines changed

CHANGELOG.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,35 @@ All notable changes to this project will be documented in this file, per [the Ke
44

55
## [Unreleased] - TBD
66

7+
## [0.6.0] - 2026-03-20
8+
**There are Breaking Changes in this release.**
9+
10+
### Breaking Changes
11+
- Refactor `Experiments` to be a type of `Feature`, improving how functionality is organized and surfaced ([#316](https://github.com/WordPress/ai/pull/316)).
12+
13+
The following classes have been removed. Anyone that was directly using these will need to make updates to utilize the correct replacements: `Abstract_Experiment`, `Invalid_Experiment_Metadata_Exception`, `Invalid_Experiment_Exception`, `Experiment_Loader`, `Experiment_Registry`.
14+
15+
- Standardize the Title Generation Ability to align with other registered Abilities ([#227](https://github.com/WordPress/ai/pull/227)).
16+
17+
The `ai/title-generation` Ability now uses a `context` argument instead of a `post_id` argument in the `input_schema`. Anyone directly using this Ability will need to make updates to account for that.
18+
19+
### Added
20+
- New Experiment: Image Editing via prompt-based image refining in the Post Editor and Media Library ([#292](https://github.com/WordPress/ai/pull/292)).
21+
- New Experiment: Image Editing via expanding or removing background and removing or replacing items in the Media Libary ([#305](https://github.com/WordPress/ai/pull/305), [#312](https://github.com/WordPress/ai/pull/312)).
22+
23+
### Changed
24+
- Rename the plugin from "AI Experiments" to "AI" ([#287](https://github.com/WordPress/ai/pull/287)).
25+
- Replace `Invalid_Experiment_Exception` with `_doing_it_wrong()` ([#303](https://github.com/WordPress/ai/pull/303)).
26+
- Rename hook prefixes in `helpers.php` ([#315](https://github.com/WordPress/ai/pull/315)).
27+
- Rename plugin constants to `WPAI_*` ([#317](https://github.com/WordPress/ai/pull/317)).
28+
- Refactor the upgrade routine and add v0.6.0 migrations ([#321](https://github.com/WordPress/ai/pull/321)).
29+
- Move the Generate Alt Text button to the new Content tab for improved discoverability ([#306](https://github.com/WordPress/ai/pull/306)).
30+
- Remove stray "AI" references from UI for improved consistency ([#320](https://github.com/WordPress/ai/pull/320)).
31+
- Update documentation ([#314](https://github.com/WordPress/ai/pull/314)).
32+
33+
### Fixed
34+
- Remove duplicate error display in the Generate Alt Text flow ([#255](https://github.com/WordPress/ai/pull/255)).
35+
736
## [0.5.0] - 2026-03-12
837
**Note this version bumps the WordPress minimum supported version from 6.9 to 7.0.**
938

CREDITS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ The following individuals are responsible for curating the list of issues, respo
1212

1313
Thank you to all the people who have already contributed to this repository via bug reports, code, design, ideas, project management, translation, testing, etc.
1414

15-
[Darin Kotter (@dkotter)](https://github.com/dkotter), [Jeffrey Paul (@jeffpaul)](https://github.com/jeffpaul), [Jason Adams (@JasonTheAdams)](https://github.com/JasonTheAdams), [Dovid Levine (@justlevine)](https://github.com/justlevine),[Md Aminul Islam (@theaminuli)](https://github.com/theaminuli), [Felix Arntz (@felixarntz)](https://github.com/felixarntz), [Jonathan Desrosiers (@desrosj)](https://github.com/desrosj), [Mohamed Khaled (@Ref34t)](https://github.com/Ref34t), [Iqbal Hossain (iqbal-web)](https://github.com/iqbal-web), [Lina Wiezkowiak (@linawiezkowiak)](https://github.com/linawiezkowiak), [Rachael Cortellessa (@rachaelcortellessa)](https://github.com/rachaelcortellessa), [James LePage (@Jameswlepage)](https://github.com/Jameswlepage), [Tammie Lister (@karmatosed)](https://github.com/karmatosed), [Aki Hamano (@t-hamano)](https://github.com/t-hamano), [Blake Bertuccelli-Booth (@bbertucc)](https://github.com/bbertucc), [Mujeebu Rahman (@mujuonly)](https://github.com/mujuonly), [Mukesh Panchal (@mukeshpanchal27)](https://github.com/mukeshpanchal27), [Pascal Birchler (@swissspidy)](https://github.com/swissspidy), [Dhruvang Shah (@dhruvang21)](https://github.com/dhruvang21), [Aslam Doctor (@aslamdoctor)](https://github.com/aslamdoctor), [John Parris (@mindctrl)](https://github.com/mindctrl), [James Morrison (@jamesmorrison)](https://github.com/jamesmorrison), [Paul Bearne (@pbearne)](https://github.com/pbearne), [Matt Cromwell (@mathetos)](https://github.com/mathetos), [Huzaifa Al Mesbah (@huzaifaalmesbah)](https://github.com/huzaifaalmesbah), [Mehraz Morshed (@mehrazmorshed)](https://github.com/mehrazmorshed), [JuanMa Garrido (@juanmaguitar)](https://github.com/juanmaguitar), [Adam Zieliński (@adamziel)](https://github.com/adamziel), [Weston Ruter (@westonruter)](https://github.com/westonruter), [Jonathan Bossenger (@jonathanbossenger)](https://github.com/jonathanbossenger), [Juan Aldasoro (@juanfra)](https://github.com/juanfra), [Casey Manos (@caseymanos)](https://github.com/caseymanos), [Stephanie Walters (@PypWalters)](https://github.com/PypWalters), [prabinjha (@prabinjha)](https://github.com/prabinjha), [Kurt Rank (@kurtrank)](https://github.com/kurtrank), [Lauren Woodmansee (@lwoodmansee)](https://github.com/lwoodmansee), [Andrew Palmer (@hellobertha)](https://github.com/hellobertha), [Md Aminul Islam (@theaminulai)](https://github.com/theaminulai), [Joe Dolson (@joedolson)](https://github.com/joedolson), [Andrei Zanouski (@andreizanik)](https://github.com/andreizanik), [Om vataliya (@Omcodes23)](https://github.com/Omcodes23), [Greg Ziółkowski (@gziolo)](https://github.com/gziolo), [Sapayth Hossain (@sapayth)](https://github.com/sapayth), [Ryuji Yasukochi (@Ryujiyasu)](https://github.com/Ryujiyasu), [Nischay (@zeus2611)](https://github.com/zeus2611).
15+
[Darin Kotter (@dkotter)](https://github.com/dkotter), [Jeffrey Paul (@jeffpaul)](https://github.com/jeffpaul), [Jason Adams (@JasonTheAdams)](https://github.com/JasonTheAdams), [Dovid Levine (@justlevine)](https://github.com/justlevine),[Md Aminul Islam (@theaminuli)](https://github.com/theaminuli), [Felix Arntz (@felixarntz)](https://github.com/felixarntz), [Jonathan Desrosiers (@desrosj)](https://github.com/desrosj), [Mohamed Khaled (@Ref34t)](https://github.com/Ref34t), [Iqbal Hossain (iqbal-web)](https://github.com/iqbal-web), [Lina Wiezkowiak (@linawiezkowiak)](https://github.com/linawiezkowiak), [Rachael Cortellessa (@rachaelcortellessa)](https://github.com/rachaelcortellessa), [James LePage (@Jameswlepage)](https://github.com/Jameswlepage), [Tammie Lister (@karmatosed)](https://github.com/karmatosed), [Aki Hamano (@t-hamano)](https://github.com/t-hamano), [Blake Bertuccelli-Booth (@bbertucc)](https://github.com/bbertucc), [Mujeebu Rahman (@mujuonly)](https://github.com/mujuonly), [Mukesh Panchal (@mukeshpanchal27)](https://github.com/mukeshpanchal27), [Pascal Birchler (@swissspidy)](https://github.com/swissspidy), [Dhruvang Shah (@dhruvang21)](https://github.com/dhruvang21), [Aslam Doctor (@aslamdoctor)](https://github.com/aslamdoctor), [John Parris (@mindctrl)](https://github.com/mindctrl), [James Morrison (@jamesmorrison)](https://github.com/jamesmorrison), [Paul Bearne (@pbearne)](https://github.com/pbearne), [Matt Cromwell (@mathetos)](https://github.com/mathetos), [Huzaifa Al Mesbah (@huzaifaalmesbah)](https://github.com/huzaifaalmesbah), [Mehraz Morshed (@mehrazmorshed)](https://github.com/mehrazmorshed), [JuanMa Garrido (@juanmaguitar)](https://github.com/juanmaguitar), [Adam Zieliński (@adamziel)](https://github.com/adamziel), [Weston Ruter (@westonruter)](https://github.com/westonruter), [Jonathan Bossenger (@jonathanbossenger)](https://github.com/jonathanbossenger), [Juan Aldasoro (@juanfra)](https://github.com/juanfra), [Casey Manos (@caseymanos)](https://github.com/caseymanos), [Stephanie Walters (@PypWalters)](https://github.com/PypWalters), [prabinjha (@prabinjha)](https://github.com/prabinjha), [Kurt Rank (@kurtrank)](https://github.com/kurtrank), [Lauren Woodmansee (@lwoodmansee)](https://github.com/lwoodmansee), [Andrew Palmer (@hellobertha)](https://github.com/hellobertha), [Md Aminul Islam (@theaminulai)](https://github.com/theaminulai), [Joe Dolson (@joedolson)](https://github.com/joedolson), [Andrei Zanouski (@andreizanik)](https://github.com/andreizanik), [Om vataliya (@Omcodes23)](https://github.com/Omcodes23), [Greg Ziółkowski (@gziolo)](https://github.com/gziolo), [Sapayth Hossain (@sapayth)](https://github.com/sapayth), [Ryuji Yasukochi (@Ryujiyasu)](https://github.com/Ryujiyasu), [Nischay (@zeus2611)](https://github.com/zeus2611), [Deepak Gupta (@raftaar1191)](https://github.com/raftaar1191), [George Mamadashvili (@Mamaduka)](https://github.com/Mamaduka).

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ This [Canonical Plugin](https://make.wordpress.org/core/2022/09/11/canonical-plu
3838
* **[Content Summarization](docs/experiments/summarization.md)** - Summarizes long-form content into digestible overviews.
3939
* **[Excerpt Generation](docs/experiments/excerpt-generation.md)** - Generates excerpt suggestions from content.
4040
* **Experiment Framework** - Opt-in system that lets you enable only the AI features you want to use.
41-
* **[Image Generation](docs/experiments/image-generation.md)** - Create images from post content in the editor, also via the Media Library.
41+
* **[Image Generation and Editing](docs/experiments/image-generation.md)** - Create and edit images from post content in the editor, also via the Media Library.
4242
* **Multi-Provider Support** - Works with popular AI providers like OpenAI, Google, and Anthropic.
4343
* **Review Notes** - Reviews post content block-by-block and adds Notes with suggestions for Accessibility, Readability, Grammar, and SEO.
4444
* **Title Generation** - Generates title suggestions from content.

ai.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Plugin Name: AI
1212
* Plugin URI: https://github.com/WordPress/ai
1313
* Description: AI features, experiments and capabilities for WordPress.
14-
* Version: 0.5.0
14+
* Version: 0.6.0
1515
* Requires at least: 7.0
1616
* Requires PHP: 7.4
1717
* Author: WordPress.org Contributors

includes/Abilities/Image/Generate_Image.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ protected function generate_image( string $prompt, ?string $reference_image = nu
229229
/**
230230
* Gets a prompt builder for generating an image.
231231
*
232-
* @since x.x.x
232+
* @since 0.6.0
233233
*
234234
* @param string $prompt The prompt to generate an image from.
235235
* @param string|null $reference_image Optional base64-encoded image to use as a reference for edits.

includes/Abstracts/Abstract_Feature.php

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,45 +19,45 @@
1919
*
2020
* Provides common functionality for all features including enable/disable state.
2121
*
22-
* @since x.x.x
22+
* @since 0.6.0
2323
*/
2424
abstract class Abstract_Feature implements Feature {
2525
/**
2626
* Feature identifier.
2727
*
28-
* @since x.x.x
28+
* @since 0.6.0
2929
* @var non-empty-string
3030
*/
3131
protected string $id;
3232

3333
/**
3434
* Feature label.
3535
*
36-
* @since x.x.x
36+
* @since 0.6.0
3737
* @var non-empty-string
3838
*/
3939
protected string $label;
4040

4141
/**
4242
* Feature description.
4343
*
44-
* @since x.x.x
44+
* @since 0.6.0
4545
* @var non-empty-string
4646
*/
4747
protected string $description;
4848

4949
/**
5050
* Feature category.
5151
*
52-
* @since x.x.x
52+
* @since 0.6.0
5353
* @var non-empty-string
5454
*/
5555
protected string $category;
5656

5757
/**
5858
* Cache for this feature's enabled status.
5959
*
60-
* @since x.x.x
60+
* @since 0.6.0
6161
* @var bool|null
6262
*/
6363
private ?bool $enabled_cache = null;
@@ -73,7 +73,7 @@ abstract class Abstract_Feature implements Feature {
7373
*
7474
* Loads feature metadata and initializes properties.
7575
*
76-
* @since x.x.x
76+
* @since 0.6.0
7777
*
7878
* @throws \InvalidArgumentException If feature metadata is invalid.
7979
*/
@@ -114,7 +114,7 @@ final public function __construct() {
114114
* Must return an array with keys: label, description.
115115
* Optionally includes: category, stability.
116116
*
117-
* @since x.x.x
117+
* @since 0.6.0
118118
*
119119
* @return array{
120120
* label: string,
@@ -172,7 +172,7 @@ final public function is_enabled(): bool {
172172
$is_enabled = (bool) apply_filters_deprecated(
173173
"ai_experiments_experiment_{$this->id}_enabled",
174174
array( $feature_enabled ),
175-
'x.x.x',
175+
'0.6.0',
176176
"wpai_feature_{$this->id}_enabled",
177177
esc_html__( 'This will be removed in v1.0', 'ai' )
178178
);
@@ -182,7 +182,7 @@ final public function is_enabled(): bool {
182182
*
183183
* The dynamic portion of the hook name, `$this->id`, refers to the feature ID.
184184
*
185-
* @since x.x.x
185+
* @since 0.6.0
186186
*
187187
* @param bool $feature_enabled Whether the feature is enabled.
188188
*/
@@ -207,7 +207,7 @@ final public function get_stability(): string {
207207
* Override this method in child classes to register custom settings options
208208
* using WordPress Settings API (register_setting).
209209
*
210-
* @since x.x.x
210+
* @since 0.6.0
211211
*
212212
* @return void
213213
*/
@@ -223,7 +223,7 @@ public function register_settings(): void {
223223
* that will appear within the feature's card on the settings page.
224224
* This is called after the feature's main toggle control.
225225
*
226-
* @since x.x.x
226+
* @since 0.6.0
227227
*
228228
* @return void
229229
*/
@@ -239,7 +239,7 @@ public function render_settings_fields(): void {
239239
* Use this when registering and rendering custom settings fields to ensure
240240
* consistent naming across the plugin.
241241
*
242-
* @since x.x.x
242+
* @since 0.6.0
243243
*
244244
* @param string $option_name The base option name (e.g., 'api_key', 'temperature').
245245
* @return string The fully namespaced option name.

includes/Admin/Activation.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Runs on plugin activation.
44
*
55
* @package WordPress\AI\Admin
6-
* @since x.x.x
6+
* @since 0.6.0
77
*/
88

99
declare( strict_types=1 );
@@ -18,13 +18,13 @@
1818
*
1919
* @internal
2020
*
21-
* @since x.x.x
21+
* @since 0.6.0
2222
*/
2323
final class Activation {
2424
/**
2525
* Runs on plugin activation.
2626
*
27-
* @since x.x.x
27+
* @since 0.6.0
2828
*/
2929
public static function activation_callback(): void {
3030
// Check and run any pending upgrades.

includes/Admin/Upgrades.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Handles any routines or migrations necessary when upgrading to a new version of the plugin.
44
*
55
* @package WordPress\AI\Admin
6-
* @since x.x.x
6+
* @since 0.6.0
77
*/
88

99
declare( strict_types=1 );
@@ -21,20 +21,20 @@
2121
*
2222
* @internal
2323
*
24-
* @since x.x.x
24+
* @since 0.6.0
2525
*/
2626
final class Upgrades {
2727
/**
2828
* The key to store the version.
2929
*
30-
* @since x.x.x
30+
* @since 0.6.0
3131
*/
3232
private const VERSION_OPTION_KEY = 'wpai_version';
3333

3434
/**
3535
* The key to store failed upgrade information for the admin notice.
3636
*
37-
* @since x.x.x
37+
* @since 0.6.0
3838
*/
3939
private const FAILED_UPGRADE_OPTION_KEY = 'wpai_failed_upgrade_message';
4040

@@ -43,7 +43,7 @@ final class Upgrades {
4343
*
4444
* New upgrade routine classes should be added here, in order of oldest to newest.
4545
*
46-
* @since x.x.x
46+
* @since 0.6.0
4747
*
4848
* @var class-string<\WordPress\AI\Admin\Upgrades\Abstract_Upgrade>[]
4949
*/
@@ -55,7 +55,7 @@ final class Upgrades {
5555
/**
5656
* Initialize the class.
5757
*
58-
* @since x.x.x
58+
* @since 0.6.0
5959
*/
6060
public function init(): void {
6161
// Runs as a fallback, in case the activation hook is missed.
@@ -67,7 +67,7 @@ public function init(): void {
6767
/**
6868
* Checks for and runs any pending upgrades.
6969
*
70-
* @since x.x.x
70+
* @since 0.6.0
7171
*/
7272
public static function do_upgrades(): void {
7373
$db_version = get_option( self::VERSION_OPTION_KEY, '' );
@@ -107,7 +107,7 @@ public static function do_upgrades(): void {
107107
/**
108108
* Displays an admin notice if a plugin upgrade failed, with the error message.
109109
*
110-
* @since x.x.x
110+
* @since 0.6.0
111111
*/
112112
public function failed_upgrade_notice(): void {
113113
// Skip if there's no failures.

includes/Admin/Upgrades/Abstract_Upgrade.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Error are caught during the upgrade routine and stored in an option for use in an admin notice.
88
*
99
* @package WordPress\AI\Admin\Upgrades
10-
* @since x.x.x
10+
* @since 0.6.0
1111
*/
1212

1313
declare( strict_types=1 );
@@ -22,7 +22,7 @@
2222
*
2323
* @internal
2424
*
25-
* @since x.x.x
25+
* @since 0.6.0
2626
*/
2727
abstract class Abstract_Upgrade {
2828

@@ -31,7 +31,7 @@ abstract class Abstract_Upgrade {
3131
*
3232
* This should be overloaded
3333
*
34-
* @since x.x.x
34+
* @since 0.6.0
3535
*
3636
* @var string
3737
*/
@@ -42,7 +42,7 @@ abstract class Abstract_Upgrade {
4242
*
4343
* This is the version we're migrating from.
4444
*
45-
* @since x.x.x
45+
* @since 0.6.0
4646
*
4747
* @var string
4848
*/
@@ -51,7 +51,7 @@ abstract class Abstract_Upgrade {
5151
/**
5252
* Constructor.
5353
*
54-
* @since x.x.x
54+
* @since 0.6.0
5555
*
5656
* @param string $db_version The version of the plugin in the database.
5757
*
@@ -69,7 +69,7 @@ public function __construct( string $db_version ) {
6969
/**
7070
* Performs the upgrade routine.
7171
*
72-
* @since x.x.x
72+
* @since 0.6.0
7373
*
7474
* @return true|\WP_Error True on success, or a WP_Error on failure.
7575
*/

includes/Admin/Upgrades/V0_5_0.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Originally this file was located in `includes/Migrations/Credential_Migration.php`, which is why the since tags don't match.
66
*
77
* @package WordPress\AI\Admin\Upgrades
8-
* @since x.x.x
8+
* @since 0.6.0
99
*/
1010

1111
declare( strict_types=1 );
@@ -18,14 +18,14 @@
1818
/**
1919
* Upgrade routine for migrating provider credentials to the new Connectors-based storage format.
2020
*
21-
* @since x.x.x
21+
* @since 0.6.0
2222
* @internal
2323
*/
2424
class V0_5_0 extends Abstract_Upgrade {
2525
/**
2626
* The legacy option that stored all provider credentials as an array.
2727
*
28-
* @since x.x.x
28+
* @since 0.6.0
2929
* @var string
3030
*/
3131
private const OLD_OPTION = 'wp_ai_client_provider_credentials';
@@ -42,7 +42,7 @@ class V0_5_0 extends Abstract_Upgrade {
4242
/**
4343
* {@inheritDoc}
4444
*
45-
* @since x.x.x
45+
* @since 0.6.0
4646
*/
4747
public static string $version = '0.5.0';
4848

@@ -54,7 +54,7 @@ class V0_5_0 extends Abstract_Upgrade {
5454
* Reads the old combined credentials option and, for each known provider,
5555
* copies the credential to the new option only when the new option is empty.
5656
*
57-
* @since x.x.x
57+
* @since 0.6.0
5858
*/
5959
protected function upgrade(): void {
6060
$old_credentials = get_option( self::OLD_OPTION, array() );

0 commit comments

Comments
 (0)