From b04254b4154bfe29aba897ca2d8dedb974c67eea Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Wed, 4 Mar 2026 05:16:14 +0000 Subject: [PATCH 1/6] fix: allow nullable types in create-pipeline and create-flow output schemas Both abilities return different fields depending on the execution path (single vs bulk, with/without flow). Fields like flow_id are null when no flow_config is provided, but the output schema declared them as strict 'integer', causing WP_Ability::validate_output() to reject the result with ability_invalid_output. Use array('integer', 'null') union types per JSON Schema spec to allow null values. --- inc/Abilities/Flow/CreateFlowAbility.php | 24 ++++++++-------- .../Pipeline/CreatePipelineAbility.php | 28 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/inc/Abilities/Flow/CreateFlowAbility.php b/inc/Abilities/Flow/CreateFlowAbility.php index 18b6495f..fa571856 100644 --- a/inc/Abilities/Flow/CreateFlowAbility.php +++ b/inc/Abilities/Flow/CreateFlowAbility.php @@ -84,18 +84,18 @@ private function registerAbility(): void { 'type' => 'object', 'properties' => array( 'success' => array( 'type' => 'boolean' ), - 'flow_id' => array( 'type' => 'integer' ), - 'flow_name' => array( 'type' => 'string' ), - 'pipeline_id' => array( 'type' => 'integer' ), - 'synced_steps' => array( 'type' => 'integer' ), - 'flow_data' => array( 'type' => 'object' ), - 'created_count' => array( 'type' => 'integer' ), - 'failed_count' => array( 'type' => 'integer' ), - 'created' => array( 'type' => 'array' ), - 'errors' => array( 'type' => 'array' ), - 'partial' => array( 'type' => 'boolean' ), - 'message' => array( 'type' => 'string' ), - 'error' => array( 'type' => 'string' ), + 'flow_id' => array( 'type' => array( 'integer', 'null' ) ), + 'flow_name' => array( 'type' => array( 'string', 'null' ) ), + 'pipeline_id' => array( 'type' => array( 'integer', 'null' ) ), + 'synced_steps' => array( 'type' => array( 'integer', 'null' ) ), + 'flow_data' => array( 'type' => array( 'object', 'null' ) ), + 'created_count' => array( 'type' => array( 'integer', 'null' ) ), + 'failed_count' => array( 'type' => array( 'integer', 'null' ) ), + 'created' => array( 'type' => array( 'array', 'null' ) ), + 'errors' => array( 'type' => array( 'array', 'null' ) ), + 'partial' => array( 'type' => array( 'boolean', 'null' ) ), + 'message' => array( 'type' => array( 'string', 'null' ) ), + 'error' => array( 'type' => array( 'string', 'null' ) ), ), ), 'execute_callback' => array( $this, 'execute' ), diff --git a/inc/Abilities/Pipeline/CreatePipelineAbility.php b/inc/Abilities/Pipeline/CreatePipelineAbility.php index 41746fb0..c0759254 100644 --- a/inc/Abilities/Pipeline/CreatePipelineAbility.php +++ b/inc/Abilities/Pipeline/CreatePipelineAbility.php @@ -69,20 +69,20 @@ private function registerAbility(): void { 'type' => 'object', 'properties' => array( 'success' => array( 'type' => 'boolean' ), - 'pipeline_id' => array( 'type' => 'integer' ), - 'pipeline_name' => array( 'type' => 'string' ), - 'flow_id' => array( 'type' => 'integer' ), - 'flow_name' => array( 'type' => 'string' ), - 'steps_created' => array( 'type' => 'integer' ), - 'flow_step_ids' => array( 'type' => 'array' ), - 'creation_mode' => array( 'type' => 'string' ), - 'created_count' => array( 'type' => 'integer' ), - 'failed_count' => array( 'type' => 'integer' ), - 'created' => array( 'type' => 'array' ), - 'errors' => array( 'type' => 'array' ), - 'partial' => array( 'type' => 'boolean' ), - 'message' => array( 'type' => 'string' ), - 'error' => array( 'type' => 'string' ), + 'pipeline_id' => array( 'type' => array( 'integer', 'null' ) ), + 'pipeline_name' => array( 'type' => array( 'string', 'null' ) ), + 'flow_id' => array( 'type' => array( 'integer', 'null' ) ), + 'flow_name' => array( 'type' => array( 'string', 'null' ) ), + 'steps_created' => array( 'type' => array( 'integer', 'null' ) ), + 'flow_step_ids' => array( 'type' => array( 'array', 'null' ) ), + 'creation_mode' => array( 'type' => array( 'string', 'null' ) ), + 'created_count' => array( 'type' => array( 'integer', 'null' ) ), + 'failed_count' => array( 'type' => array( 'integer', 'null' ) ), + 'created' => array( 'type' => array( 'array', 'null' ) ), + 'errors' => array( 'type' => array( 'array', 'null' ) ), + 'partial' => array( 'type' => array( 'boolean', 'null' ) ), + 'message' => array( 'type' => array( 'string', 'null' ) ), + 'error' => array( 'type' => array( 'string', 'null' ) ), ), ), 'execute_callback' => array( $this, 'execute' ), From c192d6def457708babf82287ae8ddbad430a6ff6 Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Tue, 3 Mar 2026 23:20:28 +0000 Subject: [PATCH 2/6] feat: directives resolve user_id from execution context for multi-agent (#565) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 2 of multi-agent support: directives now read the correct agent's files based on user_id from the execution context. Pipeline path: - RunFlowAbility propagates flow's user_id to job record and engine snapshot - AIStep extracts user_id from engine snapshot into payload Chat path: - ChatOrchestrator threads user_id through options into loop_context - All three callers (processChat, processContinue, processPing) pass user_id Directives: - CoreMemoryFilesDirective resolves user_id from payload, passes to DirectoryManager::get_agent_directory() - MemoryFilesReader::read() accepts user_id param (default 0 for compat) - PipelineMemoryFilesDirective and FlowMemoryFilesDirective pass user_id through to MemoryFilesReader All changes default to user_id=0 — existing single-agent installs keep working without configuration. Refs: #565, #560 --- inc/Abilities/Engine/RunFlowAbility.php | 2 ++ inc/Api/Chat/ChatOrchestrator.php | 13 +++++++++++-- inc/Core/Steps/AI/AIStep.php | 5 +++++ .../AI/Directives/FlowMemoryFilesDirective.php | 4 +++- .../AI/Directives/PipelineMemoryFilesDirective.php | 3 ++- .../AI/Directives/CoreMemoryFilesDirective.php | 4 ++-- inc/Engine/AI/Directives/MemoryFilesReader.php | 9 ++++++--- 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/inc/Abilities/Engine/RunFlowAbility.php b/inc/Abilities/Engine/RunFlowAbility.php index beff7906..82a310cd 100644 --- a/inc/Abilities/Engine/RunFlowAbility.php +++ b/inc/Abilities/Engine/RunFlowAbility.php @@ -120,6 +120,7 @@ public function execute( array $input ): array { 'flow_id' => $flow_id, 'source' => 'pipeline', 'label' => $flow['flow_name'] ?? null, + 'user_id' => (int) ( $flow['user_id'] ?? 0 ), ) ); if ( ! $job_id ) { @@ -167,6 +168,7 @@ public function execute( array $input ): array { 'job_id' => $job_id, 'flow_id' => $flow_id, 'pipeline_id' => $pipeline_id, + 'user_id' => (int) ( $flow['user_id'] ?? 0 ), 'created_at' => current_time( 'mysql', true ), ), 'flow' => array( diff --git a/inc/Api/Chat/ChatOrchestrator.php b/inc/Api/Chat/ChatOrchestrator.php index b4f8fad7..18810d25 100644 --- a/inc/Api/Chat/ChatOrchestrator.php +++ b/inc/Api/Chat/ChatOrchestrator.php @@ -158,6 +158,7 @@ public static function processChat( 'max_turns' => $max_turns, 'selected_pipeline_id' => $selected_pipeline_id ? $selected_pipeline_id : null, 'agent_type' => AgentType::CHAT, + 'user_id' => $user_id, ) ); @@ -289,6 +290,7 @@ public static function processContinue( string $session_id, int $user_id ): arra 'max_turns' => $max_turns, 'selected_pipeline_id' => $selected_pipeline_id, 'agent_type' => AgentType::CHAT, + 'user_id' => (int) ( $session['user_id'] ?? 0 ), ) ); @@ -389,7 +391,10 @@ public static function processPing( string $message, string $provider, string $m $messages, $provider, $model, - array( 'agent_type' => AgentType::CHAT ) + array( + 'agent_type' => AgentType::CHAT, + 'user_id' => $user_id, + ) ); if ( is_wp_error( $result ) ) { @@ -544,7 +549,11 @@ public static function executeConversationTurn( $tool_manager = new ToolManager(); $all_tools = $tool_manager->getAvailableToolsForChat(); - $loop_context = array( 'session_id' => $session_id ); + $user_id = $options['user_id'] ?? 0; + $loop_context = array( + 'session_id' => $session_id, + 'user_id' => $user_id, + ); if ( $selected_pipeline_id ) { $loop_context['selected_pipeline_id'] = $selected_pipeline_id; } diff --git a/inc/Core/Steps/AI/AIStep.php b/inc/Core/Steps/AI/AIStep.php index 720b3a4d..7317f18f 100644 --- a/inc/Core/Steps/AI/AIStep.php +++ b/inc/Core/Steps/AI/AIStep.php @@ -176,12 +176,17 @@ protected function executeStep(): array { $max_turns = PluginSettings::get( 'max_turns', 12 ); + // Resolve user_id from engine snapshot (set by RunFlowAbility). + $job_snapshot = $this->engine->get( 'job' ); + $user_id = (int) ( $job_snapshot['user_id'] ?? 0 ); + $payload = array( 'job_id' => $this->job_id, 'flow_step_id' => $this->flow_step_id, 'step_id' => $pipeline_step_id, 'data' => $this->dataPackets, 'engine' => $this->engine, + 'user_id' => $user_id, ); $navigator = new \DataMachine\Engine\StepNavigator(); diff --git a/inc/Core/Steps/AI/Directives/FlowMemoryFilesDirective.php b/inc/Core/Steps/AI/Directives/FlowMemoryFilesDirective.php index 3aed9c16..0c76422a 100644 --- a/inc/Core/Steps/AI/Directives/FlowMemoryFilesDirective.php +++ b/inc/Core/Steps/AI/Directives/FlowMemoryFilesDirective.php @@ -54,7 +54,9 @@ public static function get_outputs( string $provider_name, array $tools, ?string $db_flows = new Flows(); $memory_files = $db_flows->get_flow_memory_files( $flow_id ); - return MemoryFilesReader::read( $memory_files, 'Flow', $flow_id ); + $user_id = (int) ( $payload['user_id'] ?? 0 ); + + return MemoryFilesReader::read( $memory_files, 'Flow', $flow_id, $user_id ); } } diff --git a/inc/Core/Steps/AI/Directives/PipelineMemoryFilesDirective.php b/inc/Core/Steps/AI/Directives/PipelineMemoryFilesDirective.php index 63878979..ac7d3d83 100644 --- a/inc/Core/Steps/AI/Directives/PipelineMemoryFilesDirective.php +++ b/inc/Core/Steps/AI/Directives/PipelineMemoryFilesDirective.php @@ -50,8 +50,9 @@ public static function get_outputs( string $provider_name, array $tools, ?string } $memory_files = $db_pipelines->get_pipeline_memory_files( (int) $pipeline_id ); + $user_id = (int) ( $payload['user_id'] ?? 0 ); - return MemoryFilesReader::read( $memory_files, 'Pipeline', (int) $pipeline_id ); + return MemoryFilesReader::read( $memory_files, 'Pipeline', (int) $pipeline_id, $user_id ); } } diff --git a/inc/Engine/AI/Directives/CoreMemoryFilesDirective.php b/inc/Engine/AI/Directives/CoreMemoryFilesDirective.php index 7e9fd15e..4f894b20 100644 --- a/inc/Engine/AI/Directives/CoreMemoryFilesDirective.php +++ b/inc/Engine/AI/Directives/CoreMemoryFilesDirective.php @@ -49,8 +49,8 @@ public static function get_outputs( string $provider_name, array $tools, ?string DirectoryManager::ensure_agent_files(); $directory_manager = new DirectoryManager(); - // TODO: Multi-agent Phase 2 — resolve user_id from execution context (#565). - $agent_dir = $directory_manager->get_agent_directory(); + $user_id = (int) ( $payload['user_id'] ?? 0 ); + $agent_dir = $directory_manager->get_agent_directory( $user_id ); $outputs = array(); foreach ( $filenames as $filename ) { diff --git a/inc/Engine/AI/Directives/MemoryFilesReader.php b/inc/Engine/AI/Directives/MemoryFilesReader.php index 665aab7d..4e7243cc 100644 --- a/inc/Engine/AI/Directives/MemoryFilesReader.php +++ b/inc/Engine/AI/Directives/MemoryFilesReader.php @@ -23,16 +23,19 @@ class MemoryFilesReader { * @param array $memory_files Array of memory filenames. * @param string $scope_label Label for logging (e.g. 'Pipeline', 'Flow'). * @param int $scope_id Entity ID for logging (e.g. pipeline_id, flow_id). + * @param int $user_id WordPress user ID. 0 = legacy shared directory. * @return array Array of directive outputs (type => system_text, content => ...). */ - public static function read( array $memory_files, string $scope_label, int $scope_id ): array { + /** + * @since 0.37.0 Added $user_id parameter for multi-agent partitioning. + */ + public static function read( array $memory_files, string $scope_label, int $scope_id, int $user_id = 0 ): array { if ( empty( $memory_files ) ) { return array(); } $directory_manager = new DirectoryManager(); - // TODO: Multi-agent Phase 2 — resolve user_id from execution context (#565). - $agent_dir = $directory_manager->get_agent_directory(); + $agent_dir = $directory_manager->get_agent_directory( $user_id ); $outputs = array(); foreach ( $memory_files as $filename ) { From e3251dfff804a7b6150b7ce39e2b81b140092be7 Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Wed, 4 Mar 2026 00:31:49 +0000 Subject: [PATCH 3/6] =?UTF-8?q?ci:=20pin=20homeboy=20to=20v0.53.0=20?= =?UTF-8?q?=E2=80=94=20latest=20releases=20have=20no=20binaries?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/homeboy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/homeboy.yml b/.github/workflows/homeboy.yml index c7c6be8f..c906984f 100644 --- a/.github/workflows/homeboy.yml +++ b/.github/workflows/homeboy.yml @@ -17,6 +17,7 @@ jobs: - uses: Extra-Chill/homeboy-action@v1 with: + version: '0.53.0' extension: wordpress commands: lint,test,audit component: data-machine From 8f0243d729fb0e73660b2362d5635c96914ad43f Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Wed, 4 Mar 2026 00:50:57 +0000 Subject: [PATCH 4/6] =?UTF-8?q?ci:=20add=20composer=20install=20before=20h?= =?UTF-8?q?omeboy=20=E2=80=94=20project=20needs=20its=20own=20autoloader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Homeboy's WP test bootstrap loads the plugin on plugins_loaded, but the plugin requires vendor/autoload.php (PSR-4 autoloader). Without running composer install, no DataMachine classes are autoloadable, causing 'Class not found' fatals in PHPUnit. --- .github/workflows/homeboy.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/homeboy.yml b/.github/workflows/homeboy.yml index c906984f..295c28f2 100644 --- a/.github/workflows/homeboy.yml +++ b/.github/workflows/homeboy.yml @@ -15,6 +15,17 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + extensions: mbstring, intl, pdo_sqlite, mysqli + tools: composer:v2 + coverage: none + + - name: Install project dependencies + run: composer install --no-interaction --prefer-dist + - uses: Extra-Chill/homeboy-action@v1 with: version: '0.53.0' From a521afb2f0d002b530b7084502f95a19c8b04629 Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Wed, 4 Mar 2026 01:28:43 +0000 Subject: [PATCH 5/6] fix: add wp-cli/wp-cli as dev dep for CLI command tests BaseCommand extends WP_CLI_Command, which isn't available in the test environment without this dependency. WordPress core doesn't include WP-CLI. --- composer.json | 3 +- composer.lock | 305 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 306 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index e4bb1a51..03f5006e 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,8 @@ "php-stubs/wordpress-stubs": "^6.9", "wp-coding-standards/wpcs": "^3.1", "phpcsstandards/phpcsutils": "^1.0", - "phpcompatibility/phpcompatibility-wp": "^2.1" + "phpcompatibility/phpcompatibility-wp": "^2.1", + "wp-cli/wp-cli": "^2.12" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 48a9a7b0..0895070f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "415ed07056e1cf07db4c3d0e3d5e2827", + "content-hash": "acb6cf491129e50ca30106c457029ff7", "packages": [ { "name": "chubes4/ai-http-client", @@ -879,6 +879,309 @@ ], "time": "2025-11-04T16:30:35+00:00" }, + { + "name": "symfony/finder", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-29T09:40:50+00:00" + }, + { + "name": "wp-cli/mustache", + "version": "v2.14.99", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/mustache.php.git", + "reference": "ca23b97ac35fbe01c160549eb634396183d04a59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/mustache.php/zipball/ca23b97ac35fbe01c160549eb634396183d04a59", + "reference": "ca23b97ac35fbe01c160549eb634396183d04a59", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "replace": { + "mustache/mustache": "^2.14.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.19.3", + "yoast/phpunit-polyfills": "^2.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "source": "https://github.com/wp-cli/mustache.php/tree/v2.14.99" + }, + "time": "2025-05-06T16:15:37+00:00" + }, + { + "name": "wp-cli/mustangostang-spyc", + "version": "0.6.3", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/spyc.git", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + }, + "autoload": { + "files": [ + "includes/functions.php" + ], + "psr-4": { + "Mustangostang\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "mustangostang", + "email": "vlad.andersen@gmail.com" + } + ], + "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", + "homepage": "https://github.com/mustangostang/spyc/", + "support": { + "source": "https://github.com/wp-cli/spyc/tree/autoload" + }, + "time": "2017-04-25T11:26:20+00:00" + }, + { + "name": "wp-cli/php-cli-tools", + "version": "v0.12.7", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/php-cli-tools.git", + "reference": "5cc6ef2e93cfcd939813eb420ae23bc116d9be2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/5cc6ef2e93cfcd939813eb420ae23bc116d9be2a", + "reference": "5cc6ef2e93cfcd939813eb420ae23bc116d9be2a", + "shasum": "" + }, + "require": { + "php": ">= 7.2.24" + }, + "require-dev": { + "roave/security-advisories": "dev-latest", + "wp-cli/wp-cli-tests": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "lib/cli/cli.php" + ], + "psr-0": { + "cli": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@handbuilt.co", + "role": "Maintainer" + }, + { + "name": "James Logsdon", + "email": "jlogsdon@php.net", + "role": "Developer" + } + ], + "description": "Console utilities for PHP", + "homepage": "http://github.com/wp-cli/php-cli-tools", + "keywords": [ + "cli", + "console" + ], + "support": { + "issues": "https://github.com/wp-cli/php-cli-tools/issues", + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.12.7" + }, + "time": "2026-01-20T20:31:49+00:00" + }, + { + "name": "wp-cli/wp-cli", + "version": "v2.12.0", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/wp-cli.git", + "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/03d30d4138d12b4bffd8b507b82e56e129e0523f", + "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": "^5.6 || ^7.0 || ^8.0", + "symfony/finder": ">2.7", + "wp-cli/mustache": "^2.14.99", + "wp-cli/mustangostang-spyc": "^0.6.3", + "wp-cli/php-cli-tools": "~0.12.4" + }, + "require-dev": { + "wp-cli/db-command": "^1.3 || ^2", + "wp-cli/entity-command": "^1.2 || ^2", + "wp-cli/extension-command": "^1.1 || ^2", + "wp-cli/package-command": "^1 || ^2", + "wp-cli/wp-cli-tests": "^4.3.10" + }, + "suggest": { + "ext-readline": "Include for a better --prompt implementation", + "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates" + }, + "bin": [ + "bin/wp", + "bin/wp.bat" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.12.x-dev" + } + }, + "autoload": { + "psr-0": { + "WP_CLI\\": "php/" + }, + "classmap": [ + "php/class-wp-cli.php", + "php/class-wp-cli-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WP-CLI framework", + "homepage": "https://wp-cli.org", + "keywords": [ + "cli", + "wordpress" + ], + "support": { + "docs": "https://make.wordpress.org/cli/handbook/", + "issues": "https://github.com/wp-cli/wp-cli/issues", + "source": "https://github.com/wp-cli/wp-cli" + }, + "time": "2025-05-07T01:16:12+00:00" + }, { "name": "wp-coding-standards/wpcs", "version": "3.3.0", From fd967c19bc7c1c0f1fedb26de42660a60918b6e2 Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Wed, 4 Mar 2026 02:15:31 +0000 Subject: [PATCH 6/6] =?UTF-8?q?revert:=20remove=20wp-cli/wp-cli=20dev=20de?= =?UTF-8?q?p=20=E2=80=94=20now=20provided=20by=20homeboy-extensions=20(#77?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 15 ++- composer.lock | 305 +------------------------------------------------- 2 files changed, 8 insertions(+), 312 deletions(-) diff --git a/composer.json b/composer.json index 03f5006e..eba45406 100644 --- a/composer.json +++ b/composer.json @@ -3,18 +3,17 @@ "description": "WordPress plugin for automated data collection, AI processing, and multi-platform publishing", "version": "0.10.2", "license": "GPL-2.0-or-later", - "require": { - "php": ">=8.2", - "monolog/monolog": "^3.9", - "woocommerce/action-scheduler": "^3.9", - "chubes4/ai-http-client": "^2.0.13" - }, + "require": { + "php": ">=8.2", + "monolog/monolog": "^3.9", + "woocommerce/action-scheduler": "^3.9", + "chubes4/ai-http-client": "^2.0.13" + }, "require-dev": { "php-stubs/wordpress-stubs": "^6.9", "wp-coding-standards/wpcs": "^3.1", "phpcsstandards/phpcsutils": "^1.0", - "phpcompatibility/phpcompatibility-wp": "^2.1", - "wp-cli/wp-cli": "^2.12" + "phpcompatibility/phpcompatibility-wp": "^2.1" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 0895070f..48a9a7b0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "acb6cf491129e50ca30106c457029ff7", + "content-hash": "415ed07056e1cf07db4c3d0e3d5e2827", "packages": [ { "name": "chubes4/ai-http-client", @@ -879,309 +879,6 @@ ], "time": "2025-11-04T16:30:35+00:00" }, - { - "name": "symfony/finder", - "version": "v7.4.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-01-29T09:40:50+00:00" - }, - { - "name": "wp-cli/mustache", - "version": "v2.14.99", - "source": { - "type": "git", - "url": "https://github.com/wp-cli/mustache.php.git", - "reference": "ca23b97ac35fbe01c160549eb634396183d04a59" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/wp-cli/mustache.php/zipball/ca23b97ac35fbe01c160549eb634396183d04a59", - "reference": "ca23b97ac35fbe01c160549eb634396183d04a59", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "replace": { - "mustache/mustache": "^2.14.2" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.19.3", - "yoast/phpunit-polyfills": "^2.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Mustache": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "A Mustache implementation in PHP.", - "homepage": "https://github.com/bobthecow/mustache.php", - "keywords": [ - "mustache", - "templating" - ], - "support": { - "source": "https://github.com/wp-cli/mustache.php/tree/v2.14.99" - }, - "time": "2025-05-06T16:15:37+00:00" - }, - { - "name": "wp-cli/mustangostang-spyc", - "version": "0.6.3", - "source": { - "type": "git", - "url": "https://github.com/wp-cli/spyc.git", - "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", - "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "phpunit/phpunit": "4.3.*@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5.x-dev" - } - }, - "autoload": { - "files": [ - "includes/functions.php" - ], - "psr-4": { - "Mustangostang\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "mustangostang", - "email": "vlad.andersen@gmail.com" - } - ], - "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", - "homepage": "https://github.com/mustangostang/spyc/", - "support": { - "source": "https://github.com/wp-cli/spyc/tree/autoload" - }, - "time": "2017-04-25T11:26:20+00:00" - }, - { - "name": "wp-cli/php-cli-tools", - "version": "v0.12.7", - "source": { - "type": "git", - "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "5cc6ef2e93cfcd939813eb420ae23bc116d9be2a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/5cc6ef2e93cfcd939813eb420ae23bc116d9be2a", - "reference": "5cc6ef2e93cfcd939813eb420ae23bc116d9be2a", - "shasum": "" - }, - "require": { - "php": ">= 7.2.24" - }, - "require-dev": { - "roave/security-advisories": "dev-latest", - "wp-cli/wp-cli-tests": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.12.x-dev" - } - }, - "autoload": { - "files": [ - "lib/cli/cli.php" - ], - "psr-0": { - "cli": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Bachhuber", - "email": "daniel@handbuilt.co", - "role": "Maintainer" - }, - { - "name": "James Logsdon", - "email": "jlogsdon@php.net", - "role": "Developer" - } - ], - "description": "Console utilities for PHP", - "homepage": "http://github.com/wp-cli/php-cli-tools", - "keywords": [ - "cli", - "console" - ], - "support": { - "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.12.7" - }, - "time": "2026-01-20T20:31:49+00:00" - }, - { - "name": "wp-cli/wp-cli", - "version": "v2.12.0", - "source": { - "type": "git", - "url": "https://github.com/wp-cli/wp-cli.git", - "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/03d30d4138d12b4bffd8b507b82e56e129e0523f", - "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": "^5.6 || ^7.0 || ^8.0", - "symfony/finder": ">2.7", - "wp-cli/mustache": "^2.14.99", - "wp-cli/mustangostang-spyc": "^0.6.3", - "wp-cli/php-cli-tools": "~0.12.4" - }, - "require-dev": { - "wp-cli/db-command": "^1.3 || ^2", - "wp-cli/entity-command": "^1.2 || ^2", - "wp-cli/extension-command": "^1.1 || ^2", - "wp-cli/package-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^4.3.10" - }, - "suggest": { - "ext-readline": "Include for a better --prompt implementation", - "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates" - }, - "bin": [ - "bin/wp", - "bin/wp.bat" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.12.x-dev" - } - }, - "autoload": { - "psr-0": { - "WP_CLI\\": "php/" - }, - "classmap": [ - "php/class-wp-cli.php", - "php/class-wp-cli-command.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "WP-CLI framework", - "homepage": "https://wp-cli.org", - "keywords": [ - "cli", - "wordpress" - ], - "support": { - "docs": "https://make.wordpress.org/cli/handbook/", - "issues": "https://github.com/wp-cli/wp-cli/issues", - "source": "https://github.com/wp-cli/wp-cli" - }, - "time": "2025-05-07T01:16:12+00:00" - }, { "name": "wp-coding-standards/wpcs", "version": "3.3.0",