diff --git a/.buildignore b/.buildignore index eda84ba8f..1266cba5c 100644 --- a/.buildignore +++ b/.buildignore @@ -4,6 +4,7 @@ .gitignore .github/ .datamachine/ +artifacts/ AGENTS.md .DS_Store **/.DS_Store @@ -19,7 +20,10 @@ build.sh # Testing bin/install-wp-tests.sh tests/ +bench/ phpunit.xml +phpunit.xml.dist +phpunit.sqlite.xml.dist coverage/ # Development dependencies (handled by composer --no-dev) @@ -36,6 +40,12 @@ vendor/php-stubs/ # Composer development files composer.lock +# Development configuration +eslint.config.js +jsconfig.json +phpstan-baseline.neon +webpack.config.js + # Node.js (if any) node_modules/ package-lock.json @@ -51,6 +61,45 @@ README.md docs/ extensions/ +# Bundled dependency development files +vendor/wordpress/agents-api/.github/ +vendor/wordpress/agents-api/.gitignore +vendor/wordpress/agents-api/CHANGELOG.md +vendor/wordpress/agents-api/composer.json +vendor/wordpress/agents-api/composer.lock +vendor/wordpress/agents-api/docs/ +vendor/wordpress/agents-api/homeboy.json +vendor/wordpress/agents-api/phpstan.neon.dist +vendor/wordpress/agents-api/phpunit.xml.dist +vendor/wordpress/agents-api/README.md +vendor/wordpress/agents-api/stubs/ +vendor/wordpress/agents-api/tests/ +vendor/automattic/blocks-engine-php-transformer/.git/ +vendor/automattic/blocks-engine-php-transformer/.github/ +vendor/automattic/blocks-engine-php-transformer/.gitignore +vendor/automattic/blocks-engine-php-transformer/CONTEXT.md +vendor/automattic/blocks-engine-php-transformer/CONTRIBUTING.md +vendor/automattic/blocks-engine-php-transformer/docs/ +vendor/automattic/blocks-engine-php-transformer/figma-transformer/ +vendor/automattic/blocks-engine-php-transformer/fixtures/ +vendor/automattic/blocks-engine-php-transformer/packages/ +vendor/automattic/blocks-engine-php-transformer/README.md +vendor/automattic/blocks-engine-php-transformer/scripts/ +vendor/automattic/blocks-engine-php-transformer/tests/ +vendor/automattic/blocks-engine-php-transformer/php-transformer/.gitattributes +vendor/automattic/blocks-engine-php-transformer/php-transformer/.gitignore +vendor/automattic/blocks-engine-php-transformer/php-transformer/CHANGELOG.md +vendor/automattic/blocks-engine-php-transformer/php-transformer/composer.json +vendor/automattic/blocks-engine-php-transformer/php-transformer/composer.lock +vendor/automattic/blocks-engine-php-transformer/php-transformer/docs/ +vendor/automattic/blocks-engine-php-transformer/php-transformer/homeboy.json +vendor/automattic/blocks-engine-php-transformer/php-transformer/README.md +vendor/automattic/blocks-engine-php-transformer/php-transformer/tests/ +vendor/automattic/blocks-engine-php-transformer/php-transformer/tools/ +vendor/**/phpstan.neon.dist +vendor/**/psalm.xml +vendor/**/phpcs.xml.dist + # Temporary and cache files *.tmp *.cache diff --git a/THIRD-PARTY-NOTICES.txt b/THIRD-PARTY-NOTICES.txt new file mode 100644 index 000000000..c8a5f2f40 --- /dev/null +++ b/THIRD-PARTY-NOTICES.txt @@ -0,0 +1,39 @@ +# Third-Party Notices + +Data Machine bundles production PHP dependencies and compiled browser assets so the WordPress plugin can run without Composer or npm on the destination site. Exact resolved versions, sources, integrity hashes, and transitive dependency metadata are recorded in `composer.lock` and `package-lock.json` in the source repository. + +## PHP Runtime Dependencies + +| Dependency | License | Source | +| --- | --- | --- | +| Automattic Blocks Engine PHP Transformer | GPL-3.0 | https://github.com/Automattic/blocks-engine | +| WordPress Agents API | GPL-2.0-or-later | https://github.com/Automattic/agents-api | +| WooCommerce Action Scheduler | GPL-3.0-or-later | https://actionscheduler.org/ | +| league/commonmark | BSD-3-Clause | https://github.com/thephpleague/commonmark | +| league/config | BSD-3-Clause | https://github.com/thephpleague/config | +| league/html-to-markdown | MIT | https://github.com/thephpleague/html-to-markdown | +| dflydev/dot-access-data | MIT | https://github.com/dflydev/dflydev-dot-access-data | +| nette/schema | BSD-3-Clause, GPL-2.0-only, or GPL-3.0-only | https://github.com/nette/schema | +| nette/utils | BSD-3-Clause, GPL-2.0-only, or GPL-3.0-only | https://github.com/nette/utils | +| psr/event-dispatcher | MIT | https://github.com/php-fig/event-dispatcher | +| symfony/deprecation-contracts | MIT | https://github.com/symfony/deprecation-contracts | +| symfony/polyfill-php80 | MIT | https://github.com/symfony/polyfill | + +Applicable dependency license files are retained in the package. Blocks Engine is pinned to commit `d8842683cb7928a0ae1f56878de93cf0bc8b7343`; its GPL-3.0 license is retained at `vendor/automattic/blocks-engine-php-transformer/LICENSE`. + +## Browser Build Inputs + +The compiled JavaScript includes these direct production packages or consumes them from WordPress at runtime: + +| Dependency | License | Packaging | +| --- | --- | --- | +| `@extrachill/chat` | GPL-2.0-or-later | Compiled into Data Machine browser assets; source at https://github.com/Extra-Chill/chat | +| `@tanstack/react-query` | MIT | Compiled into Data Machine browser assets; source at https://github.com/TanStack/query | +| `react-markdown` and its unified/remark/unist dependencies | MIT | Compiled into Data Machine browser assets; source at https://github.com/remarkjs/react-markdown | +| `zustand` | MIT | Compiled into Data Machine browser assets; source at https://github.com/pmndrs/zustand | +| `@wordpress/api-fetch`, `components`, `data`, `dom-ready`, `element`, `hooks`, `i18n`, and `notices` | GPL-2.0-or-later | Build/runtime dependencies externalized to WordPress-provided script handles; source at https://github.com/WordPress/gutenberg | +| React and React DOM peer dependencies | MIT | Externalized to the WordPress element runtime; source at https://github.com/facebook/react | + +Transitive permissive browser dependencies use MIT, ISC, BSD, Apache-2.0, or Unicode licenses as recorded per package in `package-lock.json`. GPL dependencies are listed explicitly above and are compatible with Data Machine's GPL-2.0-or-later license. + +Data Machine source: https://github.com/Extra-Chill/data-machine diff --git a/composer.json b/composer.json index 25bf98137..2fa5b3412 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,6 @@ { "name": "chubes/datamachine", "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", diff --git a/composer.lock b/composer.lock index ac7538fc4..080e15277 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": "c5a6d0a68e649d3643d26e66efea0cf8", + "content-hash": "ba6789360b94a464d6a964024ee957bc", "packages": [ { "name": "automattic/blocks-engine-php-transformer", diff --git a/docs/plugin-check-wordpress-org-candidate.json b/docs/plugin-check-wordpress-org-candidate.json new file mode 100644 index 000000000..7c85d99a6 --- /dev/null +++ b/docs/plugin-check-wordpress-org-candidate.json @@ -0,0 +1,42 @@ +{ + "schema": "data-machine/plugin-check-unescaped-parameter-map/v1", + "package_sha256": "fb0f4164717d6f8519b4aadc57cf3e8111f4f97144e7788c188a47fd22941558", + "command": "wordpress.plugin-check", + "wordpress_version": "7.1", + "plugin_check": { + "exit_code": 0, + "status": "passed", + "summary": { + "total": 222, + "errors": 0, + "warnings": 222, + "notices": 0, + "info": 0, + "unknown": 0 + } + }, + "rule": "PluginCheck.Security.DirectDB.UnescapedDBParameter", + "total": 83, + "files": [ + { "file": "inc/Abilities/Job/RecoverStuckJobsAbility.php", "count": 9, "locations": ["341:25", "450:29", "953:23", "975:18", "1018:19", "1059:23", "1268:17", "1334:22", "1382:27"] }, + { "file": "inc/Cli/Commands/ProcessedItemsCommand.php", "count": 8, "locations": ["101:21", "385:25", "429:21", "497:25", "520:21", "594:25", "621:18", "704:21"] }, + { "file": "inc/Core/ActionScheduler/ClaimIndexMigration.php", "count": 1, "locations": ["221:32"] }, + { "file": "inc/Core/ActionScheduler/PathlessBatchRecovery.php", "count": 1, "locations": ["118:21"] }, + { "file": "inc/Core/ActionScheduler/ScopedDrainService.php", "count": 10, "locations": ["212:29", "224:29", "238:29", "456:20", "492:23", "939:23", "987:24", "1008:23", "1059:18", "1095:18"] }, + { "file": "inc/Core/Admin/FlowFormatter.php", "count": 1, "locations": ["225:18"] }, + { "file": "inc/Core/Database/BaseRepository.php", "count": 1, "locations": ["131:29"] }, + { "file": "inc/Core/Database/BatchItems/BatchItems.php", "count": 1, "locations": ["156:23"] }, + { "file": "inc/Core/Database/Chat/Chat.php", "count": 6, "locations": ["399:25", "1330:22", "1748:22", "1856:19", "1885:23", "1959:21"] }, + { "file": "inc/Core/Database/Flows/Flows.php", "count": 4, "locations": ["427:25", "641:25", "684:25", "723:25"] }, + { "file": "inc/Core/Database/Jobs/Jobs.php", "count": 12, "locations": ["772:23", "867:25", "921:25", "1068:37", "1092:24", "1116:24", "1155:24", "1186:25", "1400:27", "1791:30", "1832:30", "4369:20"] }, + { "file": "inc/Core/Database/Logs/LogRepository.php", "count": 3, "locations": ["185:32", "193:32", "199:25"] }, + { "file": "inc/Core/Database/Pipelines/Pipelines.php", "count": 12, "locations": ["272:27", "337:27", "368:27", "625:25", "659:20", "660:20", "662:20", "663:20", "665:20", "666:20", "668:20", "669:20"] }, + { "file": "inc/Core/Database/PostIdentityIndex/PostIdentityIndex.php", "count": 1, "locations": ["127:26"] }, + { "file": "inc/Core/Database/ProcessedItems/ProcessedItemDeferrals.php", "count": 2, "locations": ["198:11", "208:11"] }, + { "file": "inc/Core/Database/ProcessedItems/ProcessedItems.php", "count": 1, "locations": ["892:32"] }, + { "file": "inc/Core/Database/RunMetadata/RunMetadata.php", "count": 2, "locations": ["151:24", "195:25"] }, + { "file": "inc/Core/Database/TrackedItems/TrackedItems.php", "count": 2, "locations": ["149:24", "166:24"] }, + { "file": "inc/Core/Database/TransactionScope.php", "count": 4, "locations": ["41:26", "62:40", "82:32", "86:32"] }, + { "file": "inc/Engine/AI/Actions/PendingActionStore.php", "count": 2, "locations": ["650:18", "730:18"] } + ] +} diff --git a/docs/wordpress-org-submission.md b/docs/wordpress-org-submission.md new file mode 100644 index 000000000..1e6237bde --- /dev/null +++ b/docs/wordpress-org-submission.md @@ -0,0 +1,36 @@ +# WordPress.org Submission Checklist + +This document is a preparatory checklist. Issue #2424 remains open until release automation builds the exact 1.0.0 bytes and the package hash, Plugin Check, network activation, full lint, and approved artwork gates all pass. Do not manually bump 1.0 versions. + +The WordPress.org package must be the exact Data Machine release package produced by Homeboy. Do not rebuild or edit files in SVN after release packaging. + +## Candidate Gate + +1. Confirm the release commit is clean, pushed, and is the intended tag commit. +2. Build through Homeboy's WordPress release package path. `.buildignore` is the authoritative package exclusion file; `.distignore` is not used by this repository-supported path. +3. Record the ZIP path, SHA256, uncompressed inventory, entry count, and version from `data-machine.php` and `readme.txt`. +4. Reject packages containing tests, fixtures, PHPUnit files, development configuration, nested archives, local paths, secrets, private domains, identities, endpoints, or runtime assumptions. Project names and public source provenance are allowed. +5. Run Plugin Check against the installed ZIP on the `Tested up to` WordPress version. Resolve all errors and record every warning code, count, and disposition. + Preserve the exact report or a package-hash-bound machine-readable location map such as `plugin-check-wordpress-org-candidate.json`. +6. Run clean single-site activation, deactivation, and reactivation. Confirm missing requirements fail with WordPress's normal plugin requirement message and no fatal error. +7. Run network activation on multisite, verify Data Machine loads on at least two sites, then network-deactivate cleanly. +8. Run the full Homeboy audit, lint, build, and test gates without skipped checks. +9. Run `composer validate --strict`, `composer audit --no-dev`, and `npm audit --omit=dev`; review `THIRD-PARTY-NOTICES.txt` against the final lockfiles. +10. Confirm plugin headers and `readme.txt` agree on Requires WordPress, Requires PHP, stable tag, and license. Verify description, installation, FAQ, external services, source, support, and changelog links. + +## Directory Assets + +WordPress.org directory banners, icons, and screenshots belong in the SVN repository's top-level `assets/` directory and must not be added to the plugin ZIP. This Git repository does not currently contain approved directory artwork. Obtain maintainer-approved assets before submission; do not invent or generate replacements during packaging. + +## SVN Staging + +1. Check out the assigned WordPress.org SVN repository into a clean temporary directory. +2. Copy the exact contents of the verified ZIP's `data-machine/` directory into `trunk/`. +3. Copy the same contents into `tags//`; do not run Composer, npm, formatters, or text replacement in SVN. +4. Add maintainer-approved directory artwork to top-level `assets/` only. +5. Review `svn status`, reject unexpected deletions or unversioned files, and compare a deterministic file-hash inventory of `trunk/` and `tags//` with the extracted ZIP. +6. Re-run readme validation and inspect the local SVN diff. +7. Obtain maintainer approval for the exact diff and package hash before `svn commit`. +8. After commit, verify the public directory page, download ZIP hash/content, readme rendering, assets, and installation on a clean site. + +Tagging, releasing, WordPress.org submission, SVN commit, and deployment remain explicit maintainer actions. diff --git a/inc/Abilities/AgentAbilities.php b/inc/Abilities/AgentAbilities.php index 321809de6..31f2ce483 100644 --- a/inc/Abilities/AgentAbilities.php +++ b/inc/Abilities/AgentAbilities.php @@ -854,7 +854,7 @@ public function registerAbilities(): void { ), 'principal_id' => array( 'type' => 'string', - 'description' => 'Principal identifier, such as public or automattician.', + 'description' => 'Principal identifier, such as public or organization-member.', ), 'role' => array( 'type' => 'string', diff --git a/inc/Abilities/AgentRemoteCall/AgentRemoteCallAbility.php b/inc/Abilities/AgentRemoteCall/AgentRemoteCallAbility.php index 35e8e022b..1de1b8699 100644 --- a/inc/Abilities/AgentRemoteCall/AgentRemoteCallAbility.php +++ b/inc/Abilities/AgentRemoteCall/AgentRemoteCallAbility.php @@ -40,7 +40,7 @@ private function registerAbility(): void { 'properties' => array( 'remote_site' => array( 'type' => 'string', - 'description' => __( 'Remote site domain (e.g., "chubes.net"). Scheme optional.', 'data-machine' ), + 'description' => __( 'Remote site domain (e.g., "remote.example"). Scheme optional.', 'data-machine' ), ), 'agent_slug' => array( 'type' => 'string', diff --git a/inc/Abilities/AgentTokenAbilities.php b/inc/Abilities/AgentTokenAbilities.php index cc533842e..4c4b9c3db 100644 --- a/inc/Abilities/AgentTokenAbilities.php +++ b/inc/Abilities/AgentTokenAbilities.php @@ -56,7 +56,7 @@ private function registerCreateToken(): void { ), 'label' => array( 'type' => 'string', - 'description' => __( 'Human-readable label (e.g., "kimaki-prod", "ci-pipeline")', 'data-machine' ), + 'description' => __( 'Human-readable label (e.g., "desktop-client", "ci-pipeline")', 'data-machine' ), ), 'capabilities' => array( 'type' => 'array', diff --git a/inc/Api/Agents.php b/inc/Api/Agents.php index 114ff8208..88526a601 100644 --- a/inc/Api/Agents.php +++ b/inc/Api/Agents.php @@ -285,7 +285,7 @@ public static function register_routes(): void { 'type' => 'string', 'required' => false, 'default' => '', - 'description' => __( 'Human-readable label (e.g., "kimaki-prod").', 'data-machine' ), + 'description' => __( 'Human-readable label (e.g., "desktop-client").', 'data-machine' ), 'sanitize_callback' => 'sanitize_text_field', ), 'capabilities' => array( diff --git a/inc/Api/ProcessedItems.php b/inc/Api/ProcessedItems.php index eba20327a..d66d9a81e 100644 --- a/inc/Api/ProcessedItems.php +++ b/inc/Api/ProcessedItems.php @@ -84,6 +84,11 @@ public static function handle_clear( $request ) { $clear_type = $request->get_param( 'clear_type' ); $target_id = (int) $request->get_param( 'target_id' ); + $registry = \WP_Abilities_Registry::get_instance(); + if ( ! $registry->is_registered( 'datamachine/clear-processed-items' ) ) { + return new \WP_Error( 'ability_not_found', __( 'Ability not found', 'data-machine' ), array( 'status' => 500 ) ); + } + $ability = wp_get_ability( 'datamachine/clear-processed-items' ); if ( ! $ability ) { return new \WP_Error( 'ability_not_found', __( 'Ability not found', 'data-machine' ), array( 'status' => 500 ) ); diff --git a/inc/Cli/Commands/AgentsCommand.php b/inc/Cli/Commands/AgentsCommand.php index 1a3086523..990351a92 100644 --- a/inc/Cli/Commands/AgentsCommand.php +++ b/inc/Cli/Commands/AgentsCommand.php @@ -257,8 +257,8 @@ public function list_agents( array $args, array $assoc_args ): void { * * ## EXAMPLES * - * wp datamachine agents rename chubesextrachill-com chubes-bot - * wp datamachine agents rename chubesextrachill-com chubes-bot --dry-run + * wp datamachine agents rename old-agent content-agent + * wp datamachine agents rename old-agent content-agent --dry-run * * @subcommand rename */ @@ -327,7 +327,7 @@ public function rename( array $args, array $assoc_args ): void { * ## EXAMPLES * * wp datamachine agents create analytics-bot --name="Analytics Bot" --owner=1 - * wp datamachine agents create content-bot --owner=chubes + * wp datamachine agents create content-agent --owner=editor * * @subcommand create */ @@ -416,7 +416,7 @@ public function create( array $args, array $assoc_args ): void { * * ## EXAMPLES * - * wp datamachine agents show chubes-bot + * wp datamachine agents show content-agent * wp datamachine agents show 1 --format=json * * @subcommand show @@ -672,11 +672,11 @@ public function prune( array $args, array $assoc_args ): void { * * ## EXAMPLES * - * wp datamachine agents access grant chubes-bot 2 --role=admin - * wp datamachine agents access grant-audience chubes-bot audience:automattician --role=operator - * wp datamachine agents access revoke chubes-bot 2 - * wp datamachine agents access revoke-audience chubes-bot audience:automattician - * wp datamachine agents access list chubes-bot + * wp datamachine agents access grant content-agent 2 --role=admin + * wp datamachine agents access grant-audience content-agent audience:editors --role=operator + * wp datamachine agents access revoke content-agent 2 + * wp datamachine agents access revoke-audience content-agent audience:editors + * wp datamachine agents access list content-agent * * @subcommand access */ @@ -843,7 +843,7 @@ private function resolveAudiencePrincipal( string $audience ): array { $id = sanitize_title( $id ); if ( '' === $type || '' === $id || 'user' === $type ) { - WP_CLI::error( 'Audience principal must be a non-user value such as audience:automattician.' ); + WP_CLI::error( 'Audience principal must be a non-user value such as audience:editors.' ); } return array( $type, $id ); @@ -884,19 +884,19 @@ private function resolveAudiencePrincipal( string $audience ): array { * ## EXAMPLES * * # Create a token for an agent - * wp datamachine agents token create chubes-bot --label="kimaki-prod" + * wp datamachine agents token create content-agent --label="desktop-client" * * # Create a token with 90-day expiry - * wp datamachine agents token create chubes-bot --label="ci" --expires-in=7776000 + * wp datamachine agents token create content-agent --label="ci" --expires-in=7776000 * * # Create a token with restricted capabilities - * wp datamachine agents token create chubes-bot --capabilities='["datamachine_chat","datamachine_use_tools"]' + * wp datamachine agents token create content-agent --capabilities='["datamachine_chat","datamachine_use_tools"]' * * # List tokens for an agent - * wp datamachine agents token list chubes-bot + * wp datamachine agents token list content-agent * * # Revoke a token - * wp datamachine agents token revoke chubes-bot 3 + * wp datamachine agents token revoke content-agent 3 * * @subcommand token */ @@ -1123,20 +1123,20 @@ private function tokenRevoke( $abilities, int $agent_id, int $token_id ): void { * ## EXAMPLES * * # View agent config - * wp datamachine agents config sarai + * wp datamachine agents config content-agent * * # Set allowed redirect URIs - * wp datamachine agents config sarai --set='allowed_redirect_uris=["example.com","https://example.com/*"]' + * wp datamachine agents config content-agent --set='allowed_redirect_uris=["example.com","https://example.com/*"]' * * # Set a single key - * wp datamachine agents config sarai --set='model=gpt-4o' + * wp datamachine agents config content-agent --set='model=example-model' * * # Remove a key - * wp datamachine agents config sarai --unset=model + * wp datamachine agents config content-agent --unset=model * * # Set site_scope (special: updates the agent column directly) - * wp datamachine agents config sarai --set='site_scope=7' - * wp datamachine agents config sarai --set='site_scope=null' + * wp datamachine agents config content-agent --set='site_scope=7' + * wp datamachine agents config content-agent --set='site_scope=null' * * @subcommand config */ @@ -1473,7 +1473,7 @@ public function export( array $args, array $assoc_args ): void { * wp datamachine agents import mattic-agent-bundle.zip --slug=my-agent * * # Import with specific owner - * wp datamachine agents import mattic-agent-bundle.json --owner=chubes + * wp datamachine agents import content-agent-bundle.json --owner=editor * * # Dry run to preview * wp datamachine agents import mattic-agent-bundle.zip --dry-run diff --git a/inc/Cli/Commands/BlocksCommand.php b/inc/Cli/Commands/BlocksCommand.php index 990f08ba4..643fd6903 100644 --- a/inc/Cli/Commands/BlocksCommand.php +++ b/inc/Cli/Commands/BlocksCommand.php @@ -488,6 +488,7 @@ private static function bulkQueryArgs( array $post_types, $post_status, int $lim 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'lazy_load_term_meta' => false, + // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters -- Destructive repair inventory must bypass site query filters so matching posts cannot be hidden. 'suppress_filters' => true, ); } diff --git a/inc/Cli/Commands/ExternalCommand.php b/inc/Cli/Commands/ExternalCommand.php index fa07b53a3..b78cc52c0 100644 --- a/inc/Cli/Commands/ExternalCommand.php +++ b/inc/Cli/Commands/ExternalCommand.php @@ -37,7 +37,7 @@ class ExternalCommand extends BaseCommand { * ## OPTIONS * * - * : Remote site domain (e.g., extrachill.com). + * : Remote site domain (e.g., remote.example). * * * : Agent slug on the remote site. @@ -54,13 +54,13 @@ class ExternalCommand extends BaseCommand { * ## EXAMPLES * * # Register with inline token - * wp datamachine external add extrachill.com sarai --token="datamachine_sarai_abc123..." + * wp datamachine external add remote.example content-agent --token="datamachine_example_abc123..." * * # Register with token from STDIN (for piping) - * echo "datamachine_sarai_abc123..." | wp datamachine external add extrachill.com sarai + * echo "datamachine_example_abc123..." | wp datamachine external add remote.example content-agent * * # Register and verify the token works - * wp datamachine external add extrachill.com sarai --token="..." --verify + * wp datamachine external add remote.example content-agent --token="..." --verify * * @subcommand add */ @@ -189,15 +189,15 @@ public function list_sites( array $args, array $assoc_args ): void { * ## OPTIONS * * - * : Connection key (site/agent_slug, e.g., "extrachill.com/sarai"). + * : Connection key (site/agent_slug, e.g., "remote.example/content-agent"). * * [--yes] * : Skip confirmation prompt. * * ## EXAMPLES * - * wp datamachine external remove extrachill.com/sarai - * wp datamachine external remove extrachill.com/sarai --yes + * wp datamachine external remove remote.example/content-agent + * wp datamachine external remove remote.example/content-agent --yes * * @subcommand remove */ @@ -232,15 +232,15 @@ public function remove( array $args, array $assoc_args ): void { * ## OPTIONS * * - * : Connection key (site/agent_slug, e.g., "extrachill.com/sarai"). + * : Connection key (site/agent_slug, e.g., "remote.example/content-agent"). * * [--show-token] * : Display the bearer token value (hidden by default). * * ## EXAMPLES * - * wp datamachine external show extrachill.com/sarai - * wp datamachine external show extrachill.com/sarai --show-token + * wp datamachine external show remote.example/content-agent + * wp datamachine external show remote.example/content-agent --show-token * * @subcommand show */ @@ -281,11 +281,11 @@ public function show( array $args, array $assoc_args ): void { * ## OPTIONS * * - * : Connection key (site/agent_slug, e.g., "extrachill.com/sarai"). + * : Connection key (site/agent_slug, e.g., "remote.example/content-agent"). * * ## EXAMPLES * - * wp datamachine external test extrachill.com/sarai + * wp datamachine external test remote.example/content-agent * * @subcommand test */ @@ -354,10 +354,10 @@ public function test( array $args, array $assoc_args ): void { * ## OPTIONS * * - * : Remote site domain (e.g., chubes.net). + * : Remote site domain (e.g., remote.example). * * - * : Agent slug on the remote site (e.g., chubes-bot). + * : Agent slug on the remote site (e.g., content-agent). * * [--label=