outrank-cli 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,20 +4,20 @@ Agent-first CLI for the Outrank agent API.
4
4
 
5
5
  ## Install
6
6
 
7
- Requires Node.js 18+.
7
+ Requires Node.js 18+. Works on macOS, Linux, and Windows.
8
8
 
9
- ```powershell
9
+ ```bash
10
10
  npm install -g outrank-cli
11
11
  outrank-cli --help
12
12
  ```
13
13
 
14
14
  Or run it from a clone without installing globally:
15
15
 
16
- ```powershell
16
+ ```bash
17
17
  git clone https://github.com/Outrank-SAS/outrank-cli.git
18
18
  cd outrank-cli
19
19
  npm install
20
- node .\src\index.js --help
20
+ node ./src/index.js --help
21
21
  ```
22
22
 
23
23
  ## Get an API key
@@ -35,10 +35,19 @@ This repo currently targets the agent endpoints that already exist in `outrank`:
35
35
 
36
36
  - `auth whoami`
37
37
  - `products list|get|create|update|pause|resume`
38
+ - `products integrations providers|prepare|connect|poll|validate|list|create|get|update|test|delete`
39
+ - `products integrations notion databases|schema`
40
+ - `products integrations framer collections|fields`
41
+ - `products integrations webflow sites|collections|fields|items`
38
42
  - `products output-settings get|update` for product article settings
39
43
  - `products target-audiences list|replace`
40
44
  - `products competitors list|replace`
41
45
  - `products gsc status|connect|poll|reconnect|disconnect|accounts|properties|set-property|performance|search-analytics|inspect-url|cannibalization`
46
+ - `products linking sources get|update`
47
+ - `products linking detect`
48
+ - `products linking target-config get|update`
49
+ - `products linking targets list|add-manual|upsert|clear-customizations|delete`
50
+ - `products backlinks get|update|credits|earned|unverified|check-removal|reverify|subscription|subscribe-quote`
42
51
  - `keywords list|get|export|generation-status|add|suggest|generate|reschedule|bulk-reschedule|delete|bulk-delete`
43
52
  - `articles list|get|get-content|update|update-content|replace|bulk-replace|upload-image|upload-featured-image|retry-publish|delete|precreate|generate`
44
53
  - `subscription status`
@@ -58,29 +67,31 @@ The CLI reads credentials in this order of precedence:
58
67
 
59
68
  Pick one. For interactive use on your own machine, `auth login` is simplest. For CI / ephemeral environments, prefer the env var.
60
69
 
61
- ```powershell
70
+ ```bash
62
71
  # One-time persistent setup
63
72
  outrank-cli auth login outr_live_xxx
64
73
  outrank-cli auth status # confirms the key is stored
65
74
  outrank-cli auth whoami # round-trips it against the server
66
75
 
67
76
  # OR per-shell env var (no config file written)
68
- $env:OUTRANK_API_KEY = "outr_live_xxx"
77
+ export OUTRANK_API_KEY="outr_live_xxx" # macOS / Linux (bash, zsh)
69
78
  outrank-cli auth whoami
70
79
 
71
80
  # OR per-call (useful in scripts)
72
81
  outrank-cli auth whoami --api-key outr_live_xxx
73
82
  ```
74
83
 
84
+ On Windows PowerShell, set the env var with `$env:OUTRANK_API_KEY = "outr_live_xxx"`. On Windows `cmd.exe`, use `set OUTRANK_API_KEY=outr_live_xxx`.
85
+
75
86
  Sign out / rotate:
76
87
 
77
- ```powershell
88
+ ```bash
78
89
  outrank-cli auth logout # clears apiKey from ~/.outrank/config.json
79
90
  ```
80
91
 
81
92
  ## Examples
82
93
 
83
- ```powershell
94
+ ```bash
84
95
  outrank-cli auth login outr_live_xxx
85
96
  outrank-cli auth status
86
97
  outrank-cli auth whoami
@@ -92,8 +103,8 @@ outrank-cli articles get 00000000-0000-0000-0000-000000000000
92
103
  outrank-cli articles get-content 00000000-0000-0000-0000-000000000000 --format html
93
104
  outrank-cli articles update 00000000-0000-0000-0000-000000000000 --json '{"title":"New title"}'
94
105
  outrank-cli articles update 00000000-0000-0000-0000-000000000000 --json '{"image_url":"https://example.com/featured.jpg"}'
95
- outrank-cli articles upload-image --file .\diagram.png --article 00000000-0000-0000-0000-000000000000
96
- outrank-cli articles upload-featured-image 00000000-0000-0000-0000-000000000000 --file .\hero.jpg
106
+ outrank-cli articles upload-image --file ./diagram.png --article 00000000-0000-0000-0000-000000000000
107
+ outrank-cli articles upload-featured-image 00000000-0000-0000-0000-000000000000 --file ./hero.jpg
97
108
  outrank-cli articles replace 00000000-0000-0000-0000-000000000000 --json '{"find":"Old brand","replace_with":"New brand","preview_only":true}'
98
109
  outrank-cli articles retry-publish 00000000-0000-0000-0000-000000000000
99
110
  outrank-cli articles precreate 00000000-0000-0000-0000-000000000000
@@ -101,17 +112,54 @@ outrank-cli articles generate 00000000-0000-0000-0000-000000000000
101
112
  outrank-cli subscription status
102
113
  outrank-cli usage stats
103
114
  outrank-cli products get 00000000-0000-0000-0000-000000000000
115
+ outrank-cli products integrations providers
116
+ outrank-cli products integrations prepare wordpress-plugin 00000000-0000-0000-0000-000000000000
117
+ outrank-cli products integrations connect wordpress-com 00000000-0000-0000-0000-000000000000 --json '{"name":"Main WordPress.com","publish_status":"publish"}'
118
+ outrank-cli products integrations connect notion 00000000-0000-0000-0000-000000000000
119
+ outrank-cli products integrations poll wordpress-com 00000000-0000-0000-0000-000000000000 --attempt-id <attempt-id>
120
+ outrank-cli products integrations poll notion 00000000-0000-0000-0000-000000000000 --attempt-id <attempt-id>
121
+ outrank-cli products integrations notion databases 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111
122
+ outrank-cli products integrations notion schema 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
123
+ outrank-cli products integrations framer collections --json '{"project_url":"https://framer.com/projects/your-project","server_api_key":"framer_server_key"}'
124
+ outrank-cli products integrations framer fields --json '{"project_url":"https://framer.com/projects/your-project","server_api_key":"framer_server_key","collection_id":"collection_id"}'
125
+ outrank-cli products integrations webflow sites --json-file webflow-sites.json
126
+ outrank-cli products integrations webflow collections --json '{"api_token":"wf_token","site_id":"site_id"}'
127
+ outrank-cli products integrations webflow fields --json '{"api_token":"wf_token","collection_id":"collection_id"}'
128
+ outrank-cli products integrations webflow items --json '{"api_token":"wf_token","collection_id":"collection_id"}'
129
+ outrank-cli products integrations validate webhook --json '{"endpoint":"https://api.example.com/webhook","access_token":"secret"}'
130
+ outrank-cli products integrations validate framer --json '{"project_url":"https://framer.com/projects/your-project","server_api_key":"framer_server_key"}'
131
+ outrank-cli products integrations validate shopify --json '{"access_token":"shpat_xxx"}'
132
+ outrank-cli products integrations validate webflow --json '{"api_token":"wf_token"}'
133
+ outrank-cli products integrations validate wix --json '{"site_id":"00000000-0000-0000-0000-000000000000","api_key":"wix_api_key"}'
134
+ outrank-cli products integrations validate wordpress-plugin --json '{"domain":"https://example.com","api_key":"secret-token"}'
135
+ outrank-cli products integrations validate ghost --json '{"url":"https://example.ghost.io","api_key":"abcdef1234567890:abcdef1234567890abcdef1234567890"}'
136
+ outrank-cli products integrations list 00000000-0000-0000-0000-000000000000
137
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json '{"provider":"webhook","name":"Main Webhook","endpoint":"https://api.example.com/webhook","access_token":"secret"}'
138
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json '{"provider":"framer","name":"Main Framer","project_url":"https://framer.com/projects/your-project","server_api_key":"framer_server_key","author_name":"Outrank AI","publish_mode":"deploy","collection_setup_mode":"create"}'
139
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json '{"provider":"shopify","name":"Main Shopify","access_token":"shpat_xxx","blog_id":"123456789","author_name":"Outrank","publish_status":"publish"}'
140
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json '{"provider":"wix","name":"Main Wix","site_id":"00000000-0000-0000-0000-000000000000","api_key":"wix_api_key","publish_status":"publish"}'
141
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json-file webflow-create.json
142
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json '{"provider":"wordpress-plugin","domain":"https://example.com","api_key":"secret-token"}'
143
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json '{"provider":"ghost","name":"Main Ghost","url":"https://example.ghost.io","api_key":"abcdef1234567890:abcdef1234567890abcdef1234567890","publish_status":"draft"}'
144
+ outrank-cli products integrations create 00000000-0000-0000-0000-000000000000 --json '{"provider":"nextjs-blog"}'
145
+ outrank-cli products integrations get 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111
146
+ outrank-cli products integrations update 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111 --json '{"endpoint":"https://api.example.com/webhook-v2"}'
147
+ outrank-cli products integrations update 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111 --json '{"publish_status":"draft"}'
148
+ outrank-cli products integrations update 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111 --json-file webflow-update.json
149
+ outrank-cli products integrations update 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111 --json '{"domain":"https://example.com/blog","api_key":"new-secret-token"}'
150
+ outrank-cli products integrations update 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111 --json '{"publish_status":"published"}'
151
+ outrank-cli products integrations test 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111
104
152
  outrank-cli keywords suggest --product 00000000-0000-0000-0000-000000000000 --theme "email marketing"
105
153
  outrank-cli keywords generate --product 00000000-0000-0000-0000-000000000000 --count 10 --source both
106
- outrank-cli keywords add --product 00000000-0000-0000-0000-000000000000 --json-file .\keywords.json
154
+ outrank-cli keywords add --product 00000000-0000-0000-0000-000000000000 --json-file ./keywords.json
107
155
  outrank-cli keywords export --product 00000000-0000-0000-0000-000000000000
108
- outrank-cli products create --json-file .\product.json
156
+ outrank-cli products create --json-file ./product.json
109
157
  # products create now auto-queues the initial ~30-day keyword plan; poll with keywords generation-status / keywords list
110
158
  outrank-cli billing portal-url
111
159
  outrank-cli products update 00000000-0000-0000-0000-000000000000 --json '{"daily_article_count":2}'
112
- outrank-cli products output-settings update 00000000-0000-0000-0000-000000000000 --json-file .\output-settings.json
113
- outrank-cli products target-audiences replace 00000000-0000-0000-0000-000000000000 --json-file .\target-audiences.json
114
- outrank-cli products competitors replace 00000000-0000-0000-0000-000000000000 --json-file .\competitors.json
160
+ outrank-cli products output-settings update 00000000-0000-0000-0000-000000000000 --json-file ./output-settings.json
161
+ outrank-cli products target-audiences replace 00000000-0000-0000-0000-000000000000 --json-file ./target-audiences.json
162
+ outrank-cli products competitors replace 00000000-0000-0000-0000-000000000000 --json-file ./competitors.json
115
163
  outrank-cli products gsc status 00000000-0000-0000-0000-000000000000
116
164
  outrank-cli products gsc connect 00000000-0000-0000-0000-000000000000
117
165
  outrank-cli products gsc poll 00000000-0000-0000-0000-000000000000 --attempt-id <attempt-id>
@@ -122,6 +170,24 @@ outrank-cli products gsc performance 00000000-0000-0000-0000-000000000000 --mont
122
170
  outrank-cli products gsc search-analytics 00000000-0000-0000-0000-000000000000 --dimensions query,page --limit 50 --query "brand"
123
171
  outrank-cli products gsc inspect-url 00000000-0000-0000-0000-000000000000 --url https://example.com/blog/post
124
172
  outrank-cli products gsc cannibalization 00000000-0000-0000-0000-000000000000
173
+ outrank-cli products linking sources get 00000000-0000-0000-0000-000000000000
174
+ outrank-cli products linking sources update 00000000-0000-0000-0000-000000000000 --json-file ./linking-sources.json
175
+ outrank-cli products linking detect 00000000-0000-0000-0000-000000000000
176
+ outrank-cli products linking target-config update 00000000-0000-0000-0000-000000000000 --json '{"only_prioritized":true}'
177
+ outrank-cli products linking targets list 00000000-0000-0000-0000-000000000000
178
+ outrank-cli products linking targets add-manual 00000000-0000-0000-0000-000000000000 --json-file ./manual-target.json
179
+ outrank-cli products linking targets upsert 00000000-0000-0000-0000-000000000000 --json-file ./target-upsert.json
180
+ outrank-cli products linking targets clear-customizations 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111
181
+ outrank-cli products linking targets delete 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111
182
+ outrank-cli products backlinks get 00000000-0000-0000-0000-000000000000
183
+ outrank-cli products backlinks update 00000000-0000-0000-0000-000000000000 --json '{"enabled":true,"min_domain_rating":10}'
184
+ outrank-cli products backlinks credits 00000000-0000-0000-0000-000000000000
185
+ outrank-cli products backlinks earned 00000000-0000-0000-0000-000000000000 --limit 10 --include-article
186
+ outrank-cli products backlinks unverified 00000000-0000-0000-0000-000000000000 --limit 10
187
+ outrank-cli products backlinks check-removal 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111
188
+ outrank-cli products backlinks reverify 00000000-0000-0000-0000-000000000000 11111111-1111-1111-1111-111111111111
189
+ outrank-cli products backlinks subscription 00000000-0000-0000-0000-000000000000
190
+ outrank-cli products backlinks subscribe-quote 00000000-0000-0000-0000-000000000000 --plan premium
125
191
  outrank-cli keywords reschedule 00000000-0000-0000-0000-000000000000 --scheduled-for 2026-05-20
126
192
  outrank-cli billing purchase-products quote --additional-products 2
127
193
  ```
@@ -140,6 +206,69 @@ outrank-cli billing purchase-products quote --additional-products 2
140
206
  - Analyze overlapping-query cannibalization with `outrank-cli products gsc cannibalization <product-id>`.
141
207
  - Use `reconnect` when the token is expired and `disconnect` to remove the product connection.
142
208
 
209
+ ## Linking workflow
210
+
211
+ - Inspect current source selection with `outrank-cli products linking sources get <product-id>`.
212
+ - Update the primary or additional sources with `outrank-cli products linking sources update <product-id> --json-file linking-sources.json`.
213
+ - Re-run discovery with `outrank-cli products linking detect <product-id>`.
214
+ - List saved targets with `outrank-cli products linking targets list <product-id>`.
215
+ - Add a manual on-domain URL with `outrank-cli products linking targets add-manual <product-id> --json-file manual-target.json`.
216
+ - Create or update a saved target with `outrank-cli products linking targets upsert <product-id> --json-file target-upsert.json`.
217
+ - Inspect or update product-wide behavior with `outrank-cli products linking target-config get|update <product-id>`.
218
+ - Clear custom anchor text with `outrank-cli products linking targets clear-customizations <product-id> <target-id>`.
219
+ - Remove a stale target with `outrank-cli products linking targets delete <product-id> <target-id>`.
220
+
221
+ Example payloads:
222
+
223
+ ```json
224
+ {
225
+ "source_type": "sitemap",
226
+ "source_url": "https://example.com/sitemap.xml",
227
+ "additional_linking_sources": [
228
+ {
229
+ "id": "docs-root",
230
+ "source_type": "root_url",
231
+ "source_url": "https://docs.example.com/blog",
232
+ "purpose": "linking"
233
+ }
234
+ ]
235
+ }
236
+ ```
237
+
238
+ ```json
239
+ {
240
+ "url": "https://example.com/blog/best-page",
241
+ "title": "Best Page",
242
+ "is_prioritized": true,
243
+ "anchor_texts": [
244
+ "best page",
245
+ "example guide"
246
+ ]
247
+ }
248
+ ```
249
+
250
+ ## Backlinks workflow
251
+
252
+ - Inspect current backlink settings with `outrank-cli products backlinks get <product-id>`.
253
+ - Update backlink settings with `outrank-cli products backlinks update <product-id> --json-file backlinks.json`.
254
+ - Inspect current credits with `outrank-cli products backlinks credits <product-id>`.
255
+ - Review earned backlinks with `outrank-cli products backlinks earned <product-id> --limit 20`.
256
+ - Add `--include-article` or `--include-summary` when the human needs article context in the earned list.
257
+ - Review the unverified queue with `outrank-cli products backlinks unverified <product-id> --limit 20`.
258
+ - Trigger a live removal check with `outrank-cli products backlinks check-removal <product-id> <backlink-id>`.
259
+ - Trigger manual reverification with `outrank-cli products backlinks reverify <product-id> <backlink-id>`.
260
+ - Inspect the current backlink subscription state with `outrank-cli products backlinks subscription <product-id>`.
261
+ - Quote a dashboard-equivalent subscription plan with `outrank-cli products backlinks subscribe-quote <product-id> --plan premium`.
262
+
263
+ Example payload:
264
+
265
+ ```json
266
+ {
267
+ "enabled": true,
268
+ "min_domain_rating": 10
269
+ }
270
+ ```
271
+
143
272
  ## Keyword mutation rules
144
273
 
145
274
  - Run `outrank-cli keywords generation-status --product <product-id>` before keyword writes when you are not sure the product is writable.
@@ -157,22 +286,72 @@ outrank-cli billing purchase-products quote --additional-products 2
157
286
  - Featured image can be updated either by hosted URL through `articles update --json '{"image_url":"..."}'` or by local-file upload through `articles upload-featured-image`.
158
287
  - In-content images can be uploaded from a local file with `articles upload-image`; the command returns the hosted URL plus generated alt text so the agent can insert or replace the markdown image reference.
159
288
  - Per-article instructions are stored on the linked scheduled keyword, so `articles update --json '{"instructions":"..."}'` only works for articles that still have a linked planner keyword.
289
+ - `articles update --json '{"status":"published"}'` now attempts a real publish through the product's active integration for eligible attached articles; it is not just a local status flip.
160
290
  - Slug is returned for read-only reference but cannot be changed through the agent API.
161
291
  - `articles generate <keyword-id>` is only valid for scheduled keywords due today; it mirrors the dashboard's create-and-publish action.
162
292
  - `articles precreate <keyword-id>` is only valid for eligible future scheduled keywords, is unavailable on trial subscriptions, and should be polled through the keyword state afterward.
163
293
  - `articles update --json '{"status":"published"}'` cannot be used to manually publish a future scheduled article before its due date.
164
294
  - `articles retry-publish <article-id>` is only valid for generated articles with a publish error.
165
295
 
296
+ ## Linking behavior notes
297
+
298
+ - Linking writes are blocked unless the product has an active backlink subscription.
299
+ - `products linking sources update` accepts `source_type` values `sitemap`, `root_url`, or `integration`.
300
+ - When `source_type` is `sitemap` or `root_url`, `source_url` is required.
301
+ - `additional_linking_sources` is a full replacement list. Each item needs `id`, `source_type`, `source_url`, and `purpose`.
302
+ - `products linking detect` refreshes discovered article URLs from the saved primary source.
303
+ - `products linking targets add-manual` and `upsert` only accept URLs on the product's own domain.
304
+ - `products linking target-config update --json '{"only_prioritized":true}'` requires enough prioritized targets; if not, the API returns a conflict with guidance.
305
+
306
+ ## Backlink behavior notes
307
+
308
+ - Use `products backlinks update`, not `products update`, for backlink exchange settings.
309
+ - Backlink writes are blocked when the product is hidden for inappropriate content, but reads still work.
310
+ - Setting `min_domain_rating` requires an active backlink subscription.
311
+ - `products backlinks subscribe-quote` is read-only. Purchasing or changing the add-on still requires the dashboard checkout flow.
312
+ - `products backlinks earned` uses cursor pagination through `data.next_cursor`.
313
+ - `products backlinks unverified` is the deduped article-level manual-review stream.
314
+
315
+ ## Integrations workflow
316
+
317
+ - Inspect connected publishing integrations with `outrank-cli products integrations list <product-id>`.
318
+ - Inspect provider availability with `outrank-cli products integrations providers`.
319
+ - Webhook uses `endpoint` plus `access_token`. Outrank sends `Authorization: Bearer <access_token>` on each request. HMAC signing is not implemented in the current webhook integration.
320
+ - WordPress Plugin uses `domain` plus `api_key`. The Outrank plugin must already be installed and configured on the target site.
321
+ - Start WordPress Plugin setup with `outrank-cli products integrations prepare wordpress-plugin <product-id>`. That mirrors the dashboard flow by generating the integration token first, before validate/create.
322
+ - WordPress.com uses OAuth instead of direct credentials. Start with `outrank-cli products integrations connect wordpress-com <product-id> --json-file wordpress-com-connect.json`, have the human open the returned `connect_url`, then poll with `outrank-cli products integrations poll wordpress-com <product-id> --attempt-id <attempt-id>` until the handoff completes.
323
+ - Notion uses OAuth plus a second configuration step. Start with `outrank-cli products integrations connect notion <product-id>`, have the human open the returned `connect_url`, then poll with `outrank-cli products integrations poll notion <product-id> --attempt-id <attempt-id>`. After OAuth completes, use `outrank-cli products integrations notion databases <product-id> <integration-id>` and `... notion schema <product-id> <integration-id> <database-id>` before `update` to save `name`, `database_id`, and `fields`.
324
+ - Framer uses the newer Server API flow, not the older plugin flow. Start with `outrank-cli products integrations validate framer --json '{"project_url":"https://framer.com/projects/your-project","server_api_key":"framer_server_key"}'`. If you want to publish into an existing user-owned collection, then use `framer collections` and `framer fields` before `create`; otherwise use `collection_setup_mode: "create"` and let Outrank create the collection automatically.
325
+ - Shopify uses a direct app access token. Start with `outrank-cli products integrations validate shopify --json '{"access_token":"shpat_xxx"}'`; the response returns `shop_name` and the available blogs you can use in the create payload, so the human does not need to provide the store name separately.
326
+ - Webflow uses a direct API token plus pre-save discovery. Start with `outrank-cli products integrations validate webflow --json-file webflow-sites.json`, then use `webflow sites`, `webflow collections`, `webflow fields`, and `webflow items` to build the exact create or update payload for the chosen CMS collection.
327
+ - Wix is a direct credential flow using `site_id`, `api_key`, and `publish_status`. Validate first, then create or update directly; there is no OAuth or prepare step.
328
+ - Next.js Blog is a one-step create flow. Run `outrank-cli products integrations create <product-id> --json '{"provider":"nextjs-blog"}'` and store the returned `data.secrets.api_key` immediately because it is not readable later.
329
+ - Validate unsaved webhook, Ghost, Framer, Shopify, Webflow, Wix, or WordPress Plugin credentials with `outrank-cli products integrations validate <provider> --json-file integration.json`.
330
+ - Create a webhook, Ghost, Framer, Shopify, Webflow, Wix, WordPress Plugin, or Next.js Blog integration with `outrank-cli products integrations create <product-id> --json-file integration-create.json`.
331
+ - Inspect one integration with `outrank-cli products integrations get <product-id> <integration-id>`.
332
+ - Update a saved webhook, Ghost, Shopify, Webflow, Wix, WordPress Plugin, or Notion integration with `outrank-cli products integrations update <product-id> <integration-id> --json-file integration-update.json`.
333
+ - Test a saved webhook, Ghost, Framer, Shopify, Webflow, Wix, WordPress Plugin, or Notion integration with `outrank-cli products integrations test <product-id> <integration-id>`.
334
+ - Delete a stale integration with `outrank-cli products integrations delete <product-id> <integration-id>`.
335
+
336
+ Current scope note:
337
+
338
+ - Webhook, Ghost, Shopify, Webflow, and Wix support direct validate/create/update/test. Framer supports validate, provider-specific discovery, create, and test for the newer Server API flow. WordPress Plugin supports prepare plus validate/create/update/test. Next.js Blog supports one-step create plus the shared list|get|delete surface, returning a one-time API key on create. WordPress.com supports OAuth connect plus poll, then the shared list|get|delete surface. Notion supports OAuth connect plus poll, provider-specific database/schema discovery, then update/test on the saved row.
339
+ - V2 products are intended to keep one publishing integration. If `list` returns multiple rows, that usually means legacy V1 residue and stale rows should be reviewed and deleted.
340
+ - Backlink exchange management now covers configuration, status reads, earned/unverified review queues, and reverification actions. Purchasing or changing backlink add-ons still requires the dashboard checkout flow.
341
+ - Other providers are still mostly read/delete only while create, update, test, and provider-specific discovery are added one by one.
342
+
166
343
  ## Custom API target (advanced)
167
344
 
168
345
  The CLI talks to `https://www.outrank.so` by default and you should not need to change that. The override below exists only for Outrank staff debugging against a staging deployment.
169
346
 
170
- ```powershell
171
- $env:OUTRANK_BASE_URL="https://staging.example"
347
+ ```bash
348
+ export OUTRANK_BASE_URL="https://staging.example" # macOS / Linux
172
349
  outrank-cli auth whoami
173
350
  ```
174
351
 
175
- `--base-url <url>` is the per-command form.
352
+ On Windows PowerShell, use `$env:OUTRANK_BASE_URL = "https://staging.example"`. On Windows `cmd.exe`, use `set OUTRANK_BASE_URL=https://staging.example`.
353
+
354
+ `--base-url <url>` is the per-command form and works on every platform.
176
355
 
177
356
  The agent API expects product UUIDs, not numeric ids like `88`.
178
357
 
@@ -182,8 +361,8 @@ The agent API expects product UUIDs, not numeric ids like `88`.
182
361
 
183
362
  If you do not want a global link yet, you can run the CLI directly from this repo:
184
363
 
185
- ```powershell
186
- node .\src\index.js auth whoami --api-key outr_live_xxx
364
+ ```bash
365
+ node ./src/index.js auth whoami --api-key outr_live_xxx
187
366
  ```
188
367
 
189
368
  ## JSON-first contract
@@ -198,7 +377,7 @@ This makes the CLI easier for AI agents to drive reliably.
198
377
 
199
378
  ## Using the agent skill (`SKILL.md`)
200
379
 
201
- `SKILL.md` ships alongside this CLI as a Claude Code skill. It tells an AI agent how to drive `outrank-cli` end-to-end — when to inspect before writing, how to interpret `agent_guidance`, the new-product preflight, the GSC flow, keyword/article rules, and how to handle 401/402/403/409 errors.
380
+ `SKILL.md` ships alongside this CLI as a Claude Code skill. It tells an AI agent how to drive `outrank-cli` end-to-end — when to inspect before writing, how to interpret `agent_guidance`, the new-product preflight, the GSC flow, the linking flow, keyword/article rules, and how to handle 401/402/403/409 errors.
202
381
 
203
382
  You do not need it if you are using the CLI by hand from a terminal. You want it when you are letting an AI assistant operate the CLI for you.
204
383
 
package/SKILL.md CHANGED
@@ -1,15 +1,16 @@
1
1
  ---
2
2
  name: outrank
3
- description: Drive the Outrank agent API from the terminal via outrank-cli. Use when the user asks to list/create/update Outrank products, inspect or manage keyword plans, inspect or edit articles, manage article settings, target audiences, competitors, Google Search Console connections, or quote/buy product slots. Requires outrank-cli on PATH and an Outrank API key (env OUTRANK_API_KEY or stored via auth login).
3
+ description: Drive the Outrank agent API from the terminal via outrank-cli. Use when the user asks to list/create/update Outrank products, inspect or manage publishing integrations, inspect or manage keyword plans, inspect or edit articles, manage article settings, target audiences, competitors, Google Search Console connections, internal linking configuration, or quote/buy product slots. Requires outrank-cli on PATH and an Outrank API key (env OUTRANK_API_KEY or stored via auth login).
4
4
  ---
5
5
 
6
6
  # Outrank Skill
7
7
 
8
8
  Use `outrank-cli` to drive Outrank from the terminal. The CLI is JSON-first and every command returns `agent_guidance`, so read that field after each step and let it steer the next call.
9
9
 
10
- In human-facing responses, call `products get` / `products update` the product's General settings. These cover the non-editorial product basics such as name, URL, description, sitemap URL, blog root URL, publishing cadence, backlink toggles, and similar core product fields.
11
-
12
- In human-facing responses, call product `output-settings` article settings or article preferences. Use `output-settings` only when you are quoting the literal CLI command or API path.
10
+ In human-facing responses, call `products get` / `products update` the product's General settings. These cover the non-editorial product basics such as name, URL, description, sitemap URL, blog root URL, publishing cadence, and similar core product fields.
11
+
12
+ In human-facing responses, call product `output-settings` article settings or article preferences. Use `output-settings` only when you are quoting the literal CLI command or API path.
13
+ Use `products backlinks ...` for backlink exchange settings, credits, review queues, and reverification actions.
13
14
 
14
15
  ## Setup
15
16
 
@@ -49,9 +50,33 @@ Prefer inspecting before mutating:
49
50
  - `outrank-cli keywords export --product <productId>`
50
51
  - `outrank-cli products target-audiences list <productId>`
51
52
  - `outrank-cli products competitors list <productId>`
53
+ - `outrank-cli products integrations providers`
54
+ - `outrank-cli products integrations list <productId>`
55
+ - `outrank-cli products integrations get <productId> <integrationId>`
56
+ - `outrank-cli products integrations prepare wordpress-plugin <productId>`
57
+ - `outrank-cli products integrations connect wordpress-com <productId> --json-file wordpress-com-connect.json`
58
+ - `outrank-cli products integrations connect notion <productId>`
59
+ - `outrank-cli products integrations poll wordpress-com <productId> --attempt-id <attempt-id>`
60
+ - `outrank-cli products integrations poll notion <productId> --attempt-id <attempt-id>`
61
+ - `outrank-cli products integrations notion databases <productId> <integrationId>`
62
+ - `outrank-cli products integrations notion schema <productId> <integrationId> <databaseId>`
63
+ - `outrank-cli products integrations webflow sites --json-file webflow-sites.json`
64
+ - `outrank-cli products integrations webflow collections --json-file webflow-collections.json`
65
+ - `outrank-cli products integrations webflow fields --json-file webflow-fields.json`
66
+ - `outrank-cli products integrations webflow items --json-file webflow-items.json`
67
+ - `outrank-cli products integrations framer collections --json-file framer-collections.json`
68
+ - `outrank-cli products integrations framer fields --json-file framer-fields.json`
52
69
  - `outrank-cli products gsc status <productId>`
53
70
  - `outrank-cli products gsc accounts <productId>`
54
71
  - `outrank-cli products gsc performance <productId>`
72
+ - `outrank-cli products linking sources get <productId>`
73
+ - `outrank-cli products linking targets list <productId>`
74
+ - `outrank-cli products linking target-config get <productId>`
75
+ - `outrank-cli products backlinks get <productId>`
76
+ - `outrank-cli products backlinks credits <productId>`
77
+ - `outrank-cli products backlinks earned <productId>`
78
+ - `outrank-cli products backlinks unverified <productId>`
79
+ - `outrank-cli products backlinks subscription <productId>`
55
80
  - `outrank-cli subscription status`
56
81
  - `outrank-cli usage stats`
57
82
 
@@ -77,6 +102,23 @@ Write commands currently supported:
77
102
  - `outrank-cli products output-settings update <productId> --json-file output-settings.json`
78
103
  - `outrank-cli products target-audiences replace <productId> --json-file target-audiences.json`
79
104
  - `outrank-cli products competitors replace <productId> --json-file competitors.json`
105
+ - `outrank-cli products integrations validate <provider> --json-file integration.json`
106
+ - `outrank-cli products integrations create <productId> --json-file integration-create.json`
107
+ - `outrank-cli products integrations update <productId> <integrationId> --json-file integration-update.json`
108
+ - `outrank-cli products integrations test <productId> <integrationId>`
109
+ - `outrank-cli products integrations delete <productId> <integrationId>`
110
+ - `outrank-cli products integrations connect wordpress-com <productId> --json-file wordpress-com-connect.json`
111
+ - `outrank-cli products integrations poll wordpress-com <productId> --attempt-id <attempt-id>`
112
+ - `outrank-cli products integrations connect notion <productId>`
113
+ - `outrank-cli products integrations poll notion <productId> --attempt-id <attempt-id>`
114
+ - `outrank-cli products integrations notion databases <productId> <integrationId>`
115
+ - `outrank-cli products integrations notion schema <productId> <integrationId> <databaseId>`
116
+ - `outrank-cli products integrations webflow sites --json-file webflow-sites.json`
117
+ - `outrank-cli products integrations webflow collections --json-file webflow-collections.json`
118
+ - `outrank-cli products integrations webflow fields --json-file webflow-fields.json`
119
+ - `outrank-cli products integrations webflow items --json-file webflow-items.json`
120
+ - `outrank-cli products integrations framer collections --json-file framer-collections.json`
121
+ - `outrank-cli products integrations framer fields --json-file framer-fields.json`
80
122
  - `outrank-cli products gsc connect <productId>`
81
123
  - `outrank-cli products gsc reconnect <productId>`
82
124
  - `outrank-cli products gsc disconnect <productId>`
@@ -84,9 +126,20 @@ Write commands currently supported:
84
126
  - `outrank-cli products gsc search-analytics <productId> --dimensions query,page --limit 50`
85
127
  - `outrank-cli products gsc inspect-url <productId> --url https://example.com/blog/post`
86
128
  - `outrank-cli products gsc cannibalization <productId>`
129
+ - `outrank-cli products linking sources update <productId> --json-file linking-sources.json`
130
+ - `outrank-cli products linking detect <productId>`
131
+ - `outrank-cli products linking target-config update <productId> --json-file target-config.json`
132
+ - `outrank-cli products linking targets add-manual <productId> --json-file manual-target.json`
133
+ - `outrank-cli products linking targets upsert <productId> --json-file target-upsert.json`
134
+ - `outrank-cli products linking targets clear-customizations <productId> <targetId>`
135
+ - `outrank-cli products linking targets delete <productId> <targetId>`
136
+ - `outrank-cli products backlinks update <productId> --json-file backlinks.json`
137
+ - `outrank-cli products backlinks check-removal <productId> <backlinkId>`
138
+ - `outrank-cli products backlinks reverify <productId> <backlinkId>`
139
+ - `outrank-cli products backlinks subscribe-quote <productId> --plan premium|enterprise`
87
140
  - `outrank-cli keywords add --product <productId> --json-file keywords.json`
88
- - `outrank-cli keywords bulk-reschedule --json-file keyword-reschedule.json`
89
- - `outrank-cli keywords bulk-delete --json-file keyword-delete.json`
141
+ - `outrank-cli keywords bulk-reschedule --json-file keyword-reschedule.json`
142
+ - `outrank-cli keywords bulk-delete --json-file keyword-delete.json`
90
143
  - `outrank-cli articles update <articleId> --json-file article-patch.json`
91
144
  - `outrank-cli articles update-content <articleId> --json-file article-content.json`
92
145
  - `outrank-cli articles replace <articleId> --json-file replace.json`
@@ -158,7 +211,7 @@ If the live API or current repo context does not expose the full allowed option
158
211
  - if helpful, show the current value from an existing product as a reference point
159
212
  - say clearly when the CLI exposes the field's current value but not the full enum catalog
160
213
 
161
- Business-critical settings that may matter even if the current CLI surface cannot set them yet:
214
+ Business-critical settings that may matter before article generation:
162
215
 
163
216
  - blog URL or publishing destination
164
217
  - internal linking preferences
@@ -166,7 +219,7 @@ Business-critical settings that may matter even if the current CLI surface canno
166
219
  - article examples or brand-writing examples
167
220
  - publishing workflow preferences such as draft-first vs direct publish
168
221
 
169
- If the human has not provided those business-critical settings yet, say so clearly. Explain which of them are currently exposed by `outrank-cli` and which are not. For settings that are not yet supported by the current CLI surface, do not invent commands. Instead, ask the human whether to:
222
+ If the human has not provided those business-critical settings yet, say so clearly. Explain which of them are currently exposed by `outrank-cli` and which are not. Internal linking is now exposed through the `products linking ...` subtree. For settings that are not yet supported by the current CLI surface, do not invent commands. Instead, ask the human whether to:
170
223
 
171
224
  - proceed with existing/default Outrank settings for now, or
172
225
  - stop product creation until those settings are provided and/or configured elsewhere
@@ -223,8 +276,101 @@ Important behavior:
223
276
  - `cannibalization` highlights queries where multiple pages from the same site compete against each other.
224
277
  - Use `reconnect` when the status shows an expired token or refresh failure.
225
278
  - Use `disconnect` to remove the product's Search Console connection.
226
-
227
- ## Keyword workflow
279
+
280
+ ## Linking workflow
281
+
282
+ Use the product-scoped linking commands when the human needs to define where Outrank should discover internal-link candidates, inspect detected URLs, save a priority list, or constrain linking behavior.
283
+
284
+ Recommended flow:
285
+
286
+ 1. Inspect current source settings with `outrank-cli products linking sources get <productId>`.
287
+ 2. Save or change the primary source with `outrank-cli products linking sources update <productId> --json-file linking-sources.json`.
288
+ 3. Re-run discovery with `outrank-cli products linking detect <productId>`.
289
+ 4. Review saved targets with `outrank-cli products linking targets list <productId>`.
290
+ 5. Add missing on-domain URLs with `outrank-cli products linking targets add-manual <productId> --json-file manual-target.json`.
291
+ 6. Prioritize or add anchor text with `outrank-cli products linking targets upsert <productId> --json-file target-upsert.json`.
292
+ 7. Inspect product-wide behavior with `outrank-cli products linking target-config get <productId>`.
293
+ 8. Enable or relax priority-only behavior with `outrank-cli products linking target-config update <productId> --json-file target-config.json`.
294
+ 9. Clear stale anchor-text overrides with `outrank-cli products linking targets clear-customizations <productId> <targetId>`.
295
+ 10. Delete stale targets with `outrank-cli products linking targets delete <productId> <targetId>`.
296
+
297
+ Important behavior:
298
+
299
+ - Linking writes are gated by the product's backlink subscription. If the API returns `subscription_management_url`, stop retrying and ask the human to manage that billing change in the dashboard.
300
+ - `source_type` is not free-form. Use the exact backend values: `sitemap`, `root_url`, or `integration`.
301
+ - `additional_linking_sources` is a replacement list, not a patch. Keep existing items you still want.
302
+ - Manual and upserted target URLs must stay on the product's own domain.
303
+ - `only_prioritized` may fail until enough prioritized targets exist. If the API returns a conflict, add or prioritize more URLs first.
304
+ - `clear-customizations` only clears custom anchor text. It does not delete the target.
305
+
306
+ ## Backlinks workflow
307
+
308
+ Use the product-scoped backlink commands when the human needs to inspect or change backlink exchange participation, review earned placements, work through unverified items, or inspect subscription state.
309
+
310
+ Recommended flow:
311
+
312
+ 1. Inspect current settings with `outrank-cli products backlinks get <productId>`.
313
+ 2. Inspect credits with `outrank-cli products backlinks credits <productId>`.
314
+ 3. Review earned backlinks with `outrank-cli products backlinks earned <productId> --limit 20`.
315
+ 4. Add `--include-article` or `--include-summary` on the earned list when the human needs more article context.
316
+ 5. Review the unverified queue with `outrank-cli products backlinks unverified <productId> --limit 20`.
317
+ 6. Update settings with `outrank-cli products backlinks update <productId> --json-file backlinks.json`.
318
+ 7. Trigger a removal check with `outrank-cli products backlinks check-removal <productId> <backlinkId>`.
319
+ 8. Trigger a reverification with `outrank-cli products backlinks reverify <productId> <backlinkId>`.
320
+ 9. Inspect the current backlink subscription with `outrank-cli products backlinks subscription <productId>`.
321
+ 10. Quote a plan with `outrank-cli products backlinks subscribe-quote <productId> --plan premium|enterprise`.
322
+
323
+ Important behavior:
324
+
325
+ - Do not use `products update` for `backlinks_enabled` or `min_backlink_domain_rating`.
326
+ - Backlink writes are blocked when the product is hidden for inappropriate content, but reads still work.
327
+ - Setting `min_domain_rating` requires an active backlink subscription.
328
+ - `subscribe-quote` is read-only. Purchasing or changing the add-on still requires dashboard checkout.
329
+ - `earned` uses cursor pagination through `data.next_cursor`.
330
+ - `unverified` is the deduped article-level manual-review stream.
331
+
332
+ ## Integrations workflow
333
+
334
+ Use the current integrations commands when the human needs to inspect connected publishing integrations, validate direct credentials, run the WordPress.com or Notion OAuth handoff, inspect discovery data for Notion, Webflow, or Framer, test a saved integration row, or remove a stale one.
335
+
336
+ Recommended flow:
337
+
338
+ 1. Inspect connected integrations with `outrank-cli products integrations list <productId>`.
339
+ 2. Inspect provider availability with `outrank-cli products integrations providers`.
340
+ 3. For webhook, ask only for `endpoint` and `access_token`. Outrank sends `Authorization: Bearer <access_token>` on each request. Do not ask for an HMAC secret because the current webhook integration does not implement HMAC signing.
341
+ 4. For WordPress Plugin, do not ask the human to invent or provide an `api_key`. Start with `outrank-cli products integrations prepare wordpress-plugin <productId>` to generate the integration token, then tell the human to paste that token into the installed plugin and save it in WordPress.
342
+ 5. For WordPress.com, start with `outrank-cli products integrations connect wordpress-com <productId> --json-file wordpress-com-connect.json`, tell the human to open the returned `connect_url`, then poll with `outrank-cli products integrations poll wordpress-com <productId> --attempt-id <attempt-id>` until the handoff completes.
343
+ 6. For Notion, start with `outrank-cli products integrations connect notion <productId>`, tell the human to open the returned `connect_url`, then poll with `outrank-cli products integrations poll notion <productId> --attempt-id <attempt-id>` until the handoff completes.
344
+ 7. After Notion OAuth completes, list databases with `outrank-cli products integrations notion databases <productId> <integrationId>`, inspect one schema with `... notion schema <productId> <integrationId> <databaseId>`, then update the saved integration row with `name`, `database_id`, and `fields`.
345
+ 8. For Shopify, start with `outrank-cli products integrations validate shopify --json '{"access_token":"shpat_xxx"}'`. The response returns `shop_name` and the available blogs, which the agent should use to build the create payload instead of guessing them or asking the human for the store name first.
346
+ 9. For Webflow, start with `outrank-cli products integrations validate webflow --json-file webflow-sites.json`, then use `webflow sites`, `webflow collections`, `webflow fields`, and `webflow items` to build the exact create or update payload for the chosen CMS collection.
347
+ 10. For Framer, use only the newer Server API flow. Start with `outrank-cli products integrations validate framer --json-file framer-validate.json`, then use `framer collections` and `framer fields` when the human wants to publish into an existing editable collection. Do not use or mention the older plugin-based setup.
348
+ 11. For Next.js Blog, do not ask the human for credentials first. Run `outrank-cli products integrations create <productId> --json '{"provider":"nextjs-blog"}'` and treat the returned `data.secrets.api_key` as a one-time secret that must be saved immediately.
349
+ 12. For Wix, use a direct credential flow with `site_id`, `api_key`, and `publish_status`. Validate first, then create or update directly; there is no OAuth or prepare step.
350
+ 13. Validate webhook, Ghost, Shopify, Webflow, Wix, Framer, or WordPress Plugin credentials before saving with `outrank-cli products integrations validate <provider> --json-file integration.json`.
351
+ 14. Create a webhook, Ghost, Shopify, Webflow, Wix, Framer, WordPress Plugin, or Next.js Blog integration with `outrank-cli products integrations create <productId> --json-file integration-create.json`.
352
+ 14. Inspect one row with `outrank-cli products integrations get <productId> <integrationId>`.
353
+ 15. Update a saved webhook, Ghost, Shopify, Webflow, Wix, WordPress Plugin, or Notion integration with `outrank-cli products integrations update <productId> <integrationId> --json-file integration-update.json`.
354
+ 16. Test a saved webhook, Ghost, Shopify, Webflow, Wix, Framer, WordPress Plugin, or Notion integration with `outrank-cli products integrations test <productId> <integrationId>`.
355
+ 17. If the integration is stale or wrong, remove it with `outrank-cli products integrations delete <productId> <integrationId>`.
356
+
357
+ Important behavior:
358
+
359
+ - V2 products are intended to keep exactly one publishing integration. If `list` returns multiple rows, treat the extras as likely legacy V1 leftovers and inspect before deleting.
360
+ - `create` currently supports `webhook`, `ghost`, `shopify`, `webflow`, `wix`, `wordpress-plugin`, and `nextjs-blog` first. Other providers may appear in `providers`, but if their create/update/test capabilities are absent there, do not invent those writes.
361
+ - `wordpress-plugin` should usually start with `prepare`, not with a question asking the human for an integration token. The prepare response includes the generated token plus suggested validate/create payloads.
362
+ - `wordpress-com` should use `connect` plus `poll`, not `create`. The connect payload mirrors the dashboard flow with `name` and `publish_status`, then the human completes browser OAuth.
363
+ - `notion` should use `connect` plus `poll`, not `create`. OAuth only stores the access token row. The agent still needs to list databases, inspect schema, and PATCH the saved row with `name`, `database_id`, and `fields` before the integration is publish-ready.
364
+ - `shopify` should start with validation. The agent should not ask the human to guess `shop_name` or `blog_id` before `validate` returns them.
365
+ - `webflow` should use validation plus discovery before create. The agent should not guess `site_id`, `collection_id`, or Webflow field mappings.
366
+ - `framer` should use the newer Server API flow only. The agent should not mention the older Framer plugin flow. Validate the project URL and Server API key first, then use `framer collections` and `framer fields` only when the human chooses an existing editable collection. There is no separate plugin-config step in the agent surface.
367
+ - `wix` uses direct validate/create/update/test with a site UUID plus API key. The agent should validate `site_id` and `api_key` before create or after credentials change.
368
+ - `nextjs-blog` create returns a one-time API key. The agent must surface and preserve it immediately because later reads only show that a hash exists, not the plain secret.
369
+ - deleting the current active integration clears the product integration fields automatically
370
+ - `validate` tests unsaved credentials without persisting a row, while `test` re-checks a saved integration row
371
+ - the current CLI surface still does not expose create, update, or test for some providers, and only WordPress.com and Notion currently expose an OAuth connect flow; if the human asks for unsupported operations, say they are not shipped in this CLI yet instead of inventing commands
372
+
373
+ ## Keyword workflow
228
374
 
229
375
  Keyword plans now have two buckets:
230
376
 
@@ -313,14 +459,15 @@ Inspect before mutating:
313
459
 
314
460
  Important behavior to remember:
315
461
 
316
- - article metadata and history mirror the current app behavior, including soft-delete instead of hard-delete
317
- - article bodies are markdown in the backend; `--format html` is rendered output, not the source of truth
318
- - featured image is separate from the markdown body and can be updated either through the normal article update payload via `image_url` or by local-file upload with `articles upload-featured-image`
319
- - in-content images can be uploaded from local files with `articles upload-image`; the command returns a hosted URL and alt text for markdown insertion or replacement
320
- - per-article instructions live on the linked scheduled keyword, so they are only editable while that planner relationship still exists and is writable
321
- - slug is readable for reference but read-only in the agent API
322
- - `articles generate <keywordId>` mirrors the current create-and-publish flow for a scheduled keyword
323
- - `articles precreate <keywordId>` mirrors the current pre-generation flow; after calling it, inspect the keyword state until it moves from `generating_article` to `pregenerated` or back to `scheduled`
462
+ - article metadata and history mirror the current app behavior, including soft-delete instead of hard-delete
463
+ - article bodies are markdown in the backend; `--format html` is rendered output, not the source of truth
464
+ - featured image is separate from the markdown body and can be updated either through the normal article update payload via `image_url` or by local-file upload with `articles upload-featured-image`
465
+ - in-content images can be uploaded from local files with `articles upload-image`; the command returns a hosted URL and alt text for markdown insertion or replacement
466
+ - per-article instructions live on the linked scheduled keyword, so they are only editable while that planner relationship still exists and is writable
467
+ - `articles update --json '{"status":"published"}'` attempts a real publish through the product's active integration for eligible attached articles; if the remote publish fails, inspect the returned error and the article's `publish_error`
468
+ - slug is readable for reference but read-only in the agent API
469
+ - `articles generate <keywordId>` mirrors the current create-and-publish flow for a scheduled keyword
470
+ - `articles precreate <keywordId>` mirrors the current pre-generation flow; after calling it, inspect the keyword state until it moves from `generating_article` to `pregenerated` or back to `scheduled`
324
471
  - `articles retry-publish <articleId>` only works for generated articles with a publish error
325
472
  - `articles bulk-replace` is preview-first; review the returned excerpts, then rerun with `"confirm": true` in the JSON payload to write changes
326
473
 
@@ -342,7 +489,7 @@ Do not ask for billing approval until you have already clarified the intended pr
342
489
  - For `403` or `409`, the guidance usually tells you whether to inspect state, pause another product, or ask the human to approve a billing step.
343
490
  - For `402`, stop retrying and ask the human to fix billing.
344
491
 
345
- ## Current limitation
346
-
347
- The implementation plan is broader than the current live API. Keywords and core article flows are now exposed in `outrank-cli`, but integrations, backlinks, and onboarding flows are still incomplete. If the user asks for something not present in `outrank-cli --help`, say that exact command surface is not shipped yet and do not invent unsupported commands.
492
+ ## Current limitation
493
+
494
+ The implementation plan is broader than the current live API. Keywords, core article flows, linking, backlink exchange management, and the current integration-management flows are now exposed in `outrank-cli`, including direct setup for webhook, Ghost, Shopify, Webflow, Wix, Framer, WordPress Plugin, and Next.js Blog, plus OAuth flows for WordPress.com and Notion. Purchasing or changing backlink add-ons and some onboarding flows still require the dashboard. If the user asks for something not present in `outrank-cli --help`, say that exact command surface is not shipped yet and do not invent unsupported commands.
348
495
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "outrank-cli",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Agent-first CLI for the Outrank agent API",
5
5
  "type": "module",
6
6
  "files": [