@ainyc/canonry 4.29.1 → 4.31.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.
Files changed (25) hide show
  1. package/README.md +15 -13
  2. package/assets/agent-workspace/skills/aero/SKILL.md +2 -2
  3. package/assets/agent-workspace/skills/aero/references/aeo-discovery.md +26 -17
  4. package/assets/agent-workspace/skills/aero/references/memory-patterns.md +9 -9
  5. package/assets/agent-workspace/skills/aero/references/orchestration.md +6 -6
  6. package/assets/agent-workspace/skills/aero/references/reporting.md +3 -3
  7. package/assets/agent-workspace/skills/canonry/SKILL.md +5 -3
  8. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +9 -9
  9. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +203 -200
  10. package/assets/agent-workspace/skills/canonry/references/indexing.md +35 -35
  11. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +18 -18
  12. package/assets/agent-workspace/skills/canonry/references/wordpress-integration.md +11 -11
  13. package/assets/assets/index-C4UBTDDS.js +302 -0
  14. package/assets/assets/{index-BnALDZI7.css → index-CNKAwZMB.css} +1 -1
  15. package/assets/index.html +2 -2
  16. package/dist/{chunk-GB3QJURO.js → chunk-5STLZRGB.js} +5 -3
  17. package/dist/{chunk-RLLFB3M3.js → chunk-HTNC6AWN.js} +44 -2
  18. package/dist/{chunk-HONTKYY7.js → chunk-PUTJHEVR.js} +130 -13
  19. package/dist/{chunk-UEV3HSRL.js → chunk-U3YKRV47.js} +1 -1
  20. package/dist/cli.js +55 -14
  21. package/dist/index.js +4 -4
  22. package/dist/{intelligence-service-O6KB6YAM.js → intelligence-service-CJONZ7ST.js} +2 -2
  23. package/dist/mcp.js +2 -2
  24. package/package.json +9 -8
  25. package/assets/assets/index-DC2S5T9p.js +0 -302
@@ -1,15 +1,17 @@
1
1
  # Canonry CLI Reference
2
2
 
3
+ The CLI is invoked as `cnry` (short form) or `canonry` — both ship with the `@ainyc/canonry` npm package and behave identically. This reference uses `cnry`.
4
+
3
5
  ## Server Management
4
6
 
5
7
  ```bash
6
- canonry init # interactive setup
7
- canonry bootstrap # non-interactive setup from env vars
8
- canonry start # start daemon
9
- canonry stop # stop daemon
10
- canonry serve # foreground mode
11
- canonry serve --host 0.0.0.0 --port 4100
12
- canonry --version
8
+ cnry init # interactive setup
9
+ cnry bootstrap # non-interactive setup from env vars
10
+ cnry start # start daemon
11
+ cnry stop # stop daemon
12
+ cnry serve # foreground mode
13
+ cnry serve --host 0.0.0.0 --port 4100
14
+ cnry --version
13
15
  ```
14
16
 
15
17
  Production managed by PM2:
@@ -22,12 +24,12 @@ pm2 restart canonry
22
24
  ## Project Management
23
25
 
24
26
  ```bash
25
- canonry project list # list all projects
26
- canonry project create <name> --domain <url> --country US --language en
27
- canonry project show <name> # project detail
28
- canonry project update <name> # update project settings
29
- canonry project delete <name> # delete a project
30
- canonry status <project> # citation summary + domain info
27
+ cnry project list # list all projects
28
+ cnry project create <name> --domain <url> --country US --language en
29
+ cnry project show <name> # project detail
30
+ cnry project update <name> # update project settings
31
+ cnry project delete <name> # delete a project
32
+ cnry status <project> # citation summary + domain info
31
33
  ```
32
34
 
33
35
  ### Locations
@@ -35,32 +37,32 @@ canonry status <project> # citation summary + domain in
35
37
  Projects support multi-region location context for geographically-aware sweeps:
36
38
 
37
39
  ```bash
38
- canonry project add-location <name> --label "NYC" --city "New York" --region NY --country US
39
- canonry project locations <name> # list configured locations
40
- canonry project set-default-location <name> <label>
41
- canonry project remove-location <name> <label>
40
+ cnry project add-location <name> --label "NYC" --city "New York" --region NY --country US
41
+ cnry project locations <name> # list configured locations
42
+ cnry project set-default-location <name> <label>
43
+ cnry project remove-location <name> <label>
42
44
  ```
43
45
 
44
46
  ## Sweeps
45
47
 
46
48
  ```bash
47
- canonry snapshot "Acme Corp" --domain acme.example.com # one-shot sales snapshot
48
- canonry snapshot "Acme Corp" --domain acme.example.com --md # save markdown report
49
- canonry snapshot "Acme Corp" --domain acme.example.com --output report.md # custom path
50
- canonry snapshot "Acme Corp" --domain acme.example.com --pdf # save PDF report
51
- canonry snapshot "Acme Corp" --domain acme.example.com --format json
52
-
53
- canonry run <project> # sweep all configured providers
54
- canonry run <project> --provider gemini # single provider only
55
- canonry run <project> --query "alpha" --query "beta" # scope sweep to a subset of tracked queries (repeatable)
56
- canonry run <project> --wait # block until complete
57
- canonry run <project> --location <label> # run with specific location context
58
- canonry run <project> --all-locations # run for every configured location
59
- canonry run <project> --no-location # explicitly skip location context
60
- canonry run --all --wait # all projects
61
- canonry run cancel <project> [run-id] # force-cancel stuck runs
62
- canonry runs <project> --limit 10 # list recent runs
63
- canonry run show <id> # show run details
49
+ cnry snapshot "Acme Corp" --domain acme.example.com # one-shot sales snapshot
50
+ cnry snapshot "Acme Corp" --domain acme.example.com --md # save markdown report
51
+ cnry snapshot "Acme Corp" --domain acme.example.com --output report.md # custom path
52
+ cnry snapshot "Acme Corp" --domain acme.example.com --pdf # save PDF report
53
+ cnry snapshot "Acme Corp" --domain acme.example.com --format json
54
+
55
+ cnry run <project> # sweep all configured providers
56
+ cnry run <project> --provider gemini # single provider only
57
+ cnry run <project> --query "alpha" --query "beta" # scope sweep to a subset of tracked queries (repeatable)
58
+ cnry run <project> --wait # block until complete
59
+ cnry run <project> --location <label> # run with specific location context
60
+ cnry run <project> --all-locations # run for every configured location
61
+ cnry run <project> --no-location # explicitly skip location context
62
+ cnry run --all --wait # all projects
63
+ cnry run cancel <project> [run-id] # force-cancel stuck runs
64
+ cnry runs <project> --limit 10 # list recent runs
65
+ cnry run show <id> # show run details
64
66
  ```
65
67
 
66
68
  Run statuses: `queued` → `running` → `completed` / `failed` / `partial`
@@ -72,12 +74,12 @@ Run statuses: `queued` → `running` → `completed` / `failed` / `partial`
72
74
  ## Citation Data
73
75
 
74
76
  ```bash
75
- canonry evidence <project> # per-query cited/not-cited
76
- canonry evidence <project> --format json # JSON output
77
- canonry history <project> # audit trail
78
- canonry export <project> --include-results # export as YAML
79
- canonry backfill answer-visibility # recompute answer visibility from stored answers
80
- canonry backfill answer-visibility --project <name> --format json
77
+ cnry evidence <project> # per-query cited/not-cited
78
+ cnry evidence <project> --format json # JSON output
79
+ cnry history <project> # audit trail
80
+ cnry export <project> --include-results # export as YAML
81
+ cnry backfill answer-visibility # recompute answer visibility from stored answers
82
+ cnry backfill answer-visibility --project <name> --format json
81
83
  ```
82
84
 
83
85
  Output shows:
@@ -88,9 +90,9 @@ Output shows:
88
90
  ## Reports
89
91
 
90
92
  ```bash
91
- canonry report <project> # write canonry-report-<project>-YYYY-MM-DD.html
92
- canonry report <project> --output dist/aeo.html # custom path
93
- canonry report <project> --format json # raw report payload to stdout
93
+ cnry report <project> # write canonry-report-<project>-YYYY-MM-DD.html
94
+ cnry report <project> --output dist/aeo.html # custom path
95
+ cnry report <project> --format json # raw report payload to stdout
94
96
  ```
95
97
 
96
98
  One-command client-facing AEO report. Bundles the latest visibility sweep, competitor landscape, AI citation sources, GSC + GA4 performance, social and AI referrals, indexing health, citations trend, prioritized insights, and recommended next steps into a self-contained HTML file (inline CSS + SVG charts, no network dependencies). Backed by `GET /api/v1/projects/<name>/report` and the `canonry_report` MCP tool.
@@ -106,56 +108,56 @@ Behavior to know when narrating numbers from the report:
106
108
  ## Analytics
107
109
 
108
110
  ```bash
109
- canonry analytics <project> # default analytics view
110
- canonry analytics <project> --feature metrics # citation rate trends
111
- canonry analytics <project> --feature gaps # brand gap analysis (cited/gap/uncited)
112
- canonry analytics <project> --feature sources # source breakdown by category
113
- canonry analytics <project> --window 7d # time window: 7d, 30d, 90d, all
111
+ cnry analytics <project> # default analytics view
112
+ cnry analytics <project> --feature metrics # citation rate trends
113
+ cnry analytics <project> --feature gaps # brand gap analysis (cited/gap/uncited)
114
+ cnry analytics <project> --feature sources # source breakdown by category
115
+ cnry analytics <project> --window 7d # time window: 7d, 30d, 90d, all
114
116
  ```
115
117
 
116
118
  ## Intelligence
117
119
 
118
120
  ```bash
119
- canonry insights <project> # list active insights (regressions, gains, opportunities)
120
- canonry insights <project> --dismissed # include dismissed insights
121
- canonry insights <project> --format json # JSON output
122
- canonry insights dismiss <project> <id> # dismiss an insight
123
- canonry health <project> # latest citation health snapshot
124
- canonry health <project> --history # health trend over time
125
- canonry health <project> --history --limit 10 # limit history entries
126
- canonry health <project> --format json # JSON output
127
- canonry backfill insights <project> # backfill insights for all completed runs
128
- canonry backfill insights <project> --from-run <id> --to-run <id> # backfill a range
121
+ cnry insights <project> # list active insights (regressions, gains, opportunities)
122
+ cnry insights <project> --dismissed # include dismissed insights
123
+ cnry insights <project> --format json # JSON output
124
+ cnry insights dismiss <project> <id> # dismiss an insight
125
+ cnry health <project> # latest citation health snapshot
126
+ cnry health <project> --history # health trend over time
127
+ cnry health <project> --history --limit 10 # limit history entries
128
+ cnry health <project> --format json # JSON output
129
+ cnry backfill insights <project> # backfill insights for all completed runs
130
+ cnry backfill insights <project> --from-run <id> --to-run <id> # backfill a range
129
131
  ```
130
132
 
131
133
  ## Queries & Competitors
132
134
 
133
135
  ```bash
134
- canonry query add <project> "phrase one" "phrase two"
135
- canonry query remove <project> "phrase"
136
- canonry query list <project>
137
- canonry query import <project> queries.txt
138
- canonry query generate <project> --provider gemini --count 10 --save
139
-
140
- canonry competitor add <project> competitor1.com competitor2.com
141
- canonry competitor list <project>
136
+ cnry query add <project> "phrase one" "phrase two"
137
+ cnry query remove <project> "phrase"
138
+ cnry query list <project>
139
+ cnry query import <project> queries.txt
140
+ cnry query generate <project> --provider gemini --count 10 --save
141
+
142
+ cnry competitor add <project> competitor1.com competitor2.com
143
+ cnry competitor list <project>
142
144
  ```
143
145
 
144
146
  ## Scheduling & Notifications
145
147
 
146
148
  ```bash
147
- canonry schedule set <project> --preset daily # or: weekly, twice-daily, daily@09
148
- canonry schedule set <project> --cron "0 9 * * *" --timezone America/New_York
149
- canonry schedule show <project>
150
- canonry schedule enable <project>
151
- canonry schedule disable <project>
152
- canonry schedule remove <project>
153
-
154
- canonry notify add <project> --webhook <url> --events citation.lost,citation.gained
155
- canonry notify events # list all available event types
156
- canonry notify list <project>
157
- canonry notify remove <project> <id>
158
- canonry notify test <project> <id>
149
+ cnry schedule set <project> --preset daily # or: weekly, twice-daily, daily@09
150
+ cnry schedule set <project> --cron "0 9 * * *" --timezone America/New_York
151
+ cnry schedule show <project>
152
+ cnry schedule enable <project>
153
+ cnry schedule disable <project>
154
+ cnry schedule remove <project>
155
+
156
+ cnry notify add <project> --webhook <url> --events citation.lost,citation.gained
157
+ cnry notify events # list all available event types
158
+ cnry notify list <project>
159
+ cnry notify remove <project> <id>
160
+ cnry notify test <project> <id>
159
161
  ```
160
162
 
161
163
  Available events: `citation.lost`, `citation.gained`, `run.completed`, `run.failed`, `insight.critical`, `insight.high`
@@ -165,11 +167,11 @@ Available events: `citation.lost`, `citation.gained`, `run.completed`, `run.fail
165
167
  ## Provider Settings & Quotas
166
168
 
167
169
  ```bash
168
- canonry settings # show config: providers, apiUrl, db path
169
- canonry settings --format json
170
- canonry settings provider gemini --api-key <KEY> --model gemini-2.5-flash
171
- canonry settings provider openai --max-per-day 1000 --max-per-minute 20
172
- canonry settings provider perplexity --api-key <KEY>
170
+ cnry settings # show config: providers, apiUrl, db path
171
+ cnry settings --format json
172
+ cnry settings provider gemini --api-key <KEY> --model gemini-2.5-flash
173
+ cnry settings provider openai --max-per-day 1000 --max-per-minute 20
174
+ cnry settings provider perplexity --api-key <KEY>
173
175
  ```
174
176
 
175
177
  Quota flags: `--max-concurrent`, `--max-per-minute`, `--max-per-day`
@@ -197,92 +199,93 @@ When Vertex AI is configured, no `GEMINI_API_KEY` is required. The provider uses
197
199
  ## Google Search Console
198
200
 
199
201
  ```bash
200
- canonry google connect <project> # initiate OAuth flow
201
- canonry google disconnect <project> # disconnect GSC
202
- canonry google status <project> # connection status
203
- canonry google properties <project> # list available properties
204
- canonry google set-property <project> <url> # set GSC property URL
205
- canonry google set-sitemap <project> <url> # set sitemap URL
206
- canonry google list-sitemaps <project> # list submitted sitemaps
207
- canonry google discover-sitemaps <project> --wait # auto-discover and inspect
208
-
209
- canonry google sync <project> # sync GSC data
210
- canonry google sync <project> --days 30 --full --wait # full sync with wait
211
-
212
- canonry google coverage <project> # index coverage summary
213
- canonry google refresh <project> # force-fetch fresh GSC coverage data
214
- canonry google performance <project> # search performance data
215
- canonry google performance <project> --days 30 --keyword "term" --page "/url"
216
-
217
- canonry google inspect <project> <url> # inspect specific URL
218
- canonry google inspect-sitemap <project> --wait # bulk inspect all sitemap URLs
219
- canonry google inspections <project> # inspection history
220
- canonry google inspections <project> --url <url> # filter by URL
221
- canonry google deindexed <project> # pages that lost indexing
222
-
223
- canonry google request-indexing <project> <url> # push URL to Google
224
- canonry google request-indexing <project> --all-unindexed # push all unknown pages
202
+ cnry google connect <project> # initiate OAuth flow
203
+ cnry google disconnect <project> # disconnect GSC
204
+ cnry google status <project> # connection status
205
+ cnry google properties <project> # list available properties
206
+ cnry google set-property <project> <url> # set GSC property URL
207
+ cnry google set-sitemap <project> <url> # set sitemap URL
208
+ cnry google list-sitemaps <project> # list submitted sitemaps
209
+ cnry google discover-sitemaps <project> --wait # auto-discover and inspect
210
+
211
+ cnry google sync <project> # sync GSC data
212
+ cnry google sync <project> --days 30 --full --wait # full sync with wait
213
+
214
+ cnry google coverage <project> # index coverage summary
215
+ cnry google refresh <project> # force-fetch fresh GSC coverage data
216
+ cnry google performance <project> # search performance data
217
+ cnry google performance <project> --days 30 --keyword "term" --page "/url"
218
+
219
+ cnry google inspect <project> <url> # inspect specific URL
220
+ cnry google inspect-sitemap <project> --wait # bulk inspect all sitemap URLs
221
+ cnry google inspections <project> # inspection history
222
+ cnry google inspections <project> --url <url> # filter by URL
223
+ cnry google deindexed <project> # pages that lost indexing
224
+
225
+ cnry google request-indexing <project> <url> # push URL to Google
226
+ cnry google request-indexing <project> --all-unindexed # push all unknown pages
225
227
  ```
226
228
 
227
229
  ## Discovery (Tracked-Basket Expansion)
228
230
 
229
231
  ```bash
230
- canonry discover run <project> --icp "..." --wait --format json # full pipeline: seed → embed → cluster → probe → bucket
231
- canonry discover run <project> --icp "..." --dedup-threshold 0.85 # tune cosine threshold (default 0.85)
232
- canonry discover run <project> --icp "..." --max-probes 100 # per-session probe budget (default 100, hard cap 500)
233
- canonry discover run <project> --icp-angle "angle 1" --icp-angle "angle 2" --wait # multi-angle: one session per ICP angle, useful for hyperlocal/niche businesses
234
-
235
- canonry discover list <project> # newest-first session list
236
- canonry discover show <project> <session-id> # per-query probe rows + buckets
237
- canonry discover promote preview <project> <session-id> # preview bucketed candidates + recurring suggested competitors (read-only)
238
- canonry discover promote <project> <session-id> # adopt cited + aspirational queries + recurring competitors
239
- canonry discover promote <project> <session-id> --bucket aspirational --no-competitors # scope to a bucket subset / skip competitor merge
232
+ cnry discover run <project> --icp "..." --wait --format json # full pipeline: seed → embed → cluster → probe → bucket
233
+ cnry discover run <project> --icp "..." --dedup-threshold 0.85 # tune cosine threshold (default 0.85)
234
+ cnry discover run <project> --icp "..." --max-probes 100 # per-session probe budget (default 100, hard cap 500)
235
+ cnry discover run <project> --icp-angle "angle 1" --icp-angle "angle 2" --wait # multi-angle: one session per ICP angle, useful for hyperlocal/niche businesses
236
+
237
+ cnry discover list <project> # newest-first session list
238
+ cnry discover show <project> <session-id> # per-query probe rows + buckets + classified competitor domains
239
+ cnry discover promote preview <project> <session-id> # preview bucketed candidates + recurring suggested competitors of every classified type (read-only)
240
+ cnry discover promote <project> <session-id> # adopt cited + aspirational queries + direct-competitor domains
241
+ cnry discover promote <project> <session-id> --competitor-types direct-competitor,editorial-media # widen the competitor merge to other classified types
242
+ cnry discover promote <project> <session-id> --bucket aspirational --no-competitors # scope to a bucket subset / skip competitor merge
240
243
  ```
241
244
 
242
- Discovery requires Gemini configured (API key today; Vertex-mode embeddings are deferred). The pipeline writes a `discovery_sessions` row, a `runs` row (kind `aeo-discover-probe`), and one `discovery.basket-divergence` insight when the session completes. Aero wakes unprompted with the bucket-count payload so the operator can act without polling. `discover promote` defaults to cited + aspirational queries and recurring competitor domains; include `--bucket wasted-surface` explicitly for off-ICP competitor gaps. Promotion is add-only and idempotent — queries/domains already tracked are reported as skipped, never inserted twice — and only works on `completed` sessions; promoted rows carry `provenance="discovery:<sessionId>"`.
245
+ Discovery requires Gemini configured (API key today; Vertex-mode embeddings are deferred). The pipeline writes a `discovery_sessions` row, a `runs` row (kind `aeo-discover-probe`), and one `discovery.basket-divergence` insight when the session completes. After probing, one Gemini call classifies every recurring cited domain as `direct-competitor`, `ota-aggregator`, `editorial-media`, or `other` (a failed/legacy classification leaves domains `unknown`). Aero wakes unprompted with the bucket-count payload so the operator can act without polling. `discover promote` defaults to cited + aspirational queries and `direct-competitor` domains only — aggregators and editorial media are suppressed; pass `--competitor-types` to widen the merge (or to recover legacy `unknown` entries) and `--bucket wasted-surface` for off-ICP competitor gaps. Promotion is add-only and idempotent — queries/domains already tracked are reported as skipped, never inserted twice — and only works on `completed` sessions; promoted rows carry `provenance="discovery:<sessionId>"`.
243
246
 
244
247
  ## Bing Webmaster Tools
245
248
 
246
249
  ```bash
247
- canonry bing connect <project> --api-key <key> # connect Bing WMT
248
- canonry bing disconnect <project> # disconnect
249
- canonry bing status <project> # connection status
250
- canonry bing sites <project> # list verified sites
251
- canonry bing set-site <project> <url> # set active site URL
252
- canonry bing coverage <project> # URL coverage data
253
- canonry bing refresh <project> # force-fetch fresh Bing coverage data
254
- canonry bing inspect <project> <url> # inspect specific URL
255
- canonry bing inspect-sitemap <project> # discover sitemap URLs and inspect each via Bing
256
- canonry bing inspect-sitemap <project> --sitemap-url <url> --wait # explicit sitemap, wait for run
257
- canonry bing inspections <project> # inspection history
258
- canonry bing request-indexing <project> <url> # submit URL for indexing
259
- canonry bing request-indexing <project> --all-unindexed # submit all unindexed
260
- canonry bing performance <project> # search performance data
250
+ cnry bing connect <project> --api-key <key> # connect Bing WMT
251
+ cnry bing disconnect <project> # disconnect
252
+ cnry bing status <project> # connection status
253
+ cnry bing sites <project> # list verified sites
254
+ cnry bing set-site <project> <url> # set active site URL
255
+ cnry bing coverage <project> # URL coverage data
256
+ cnry bing refresh <project> # force-fetch fresh Bing coverage data
257
+ cnry bing inspect <project> <url> # inspect specific URL
258
+ cnry bing inspect-sitemap <project> # discover sitemap URLs and inspect each via Bing
259
+ cnry bing inspect-sitemap <project> --sitemap-url <url> --wait # explicit sitemap, wait for run
260
+ cnry bing inspections <project> # inspection history
261
+ cnry bing request-indexing <project> <url> # submit URL for indexing
262
+ cnry bing request-indexing <project> --all-unindexed # submit all unindexed
263
+ cnry bing performance <project> # search performance data
261
264
  ```
262
265
 
263
266
  ## WordPress Integration
264
267
 
265
268
  ```bash
266
- canonry wordpress connect <project> --url <url> --user <user> # connect (prompts for app password)
267
- canonry wordpress disconnect <project> # disconnect
268
- canonry wordpress status <project> # connection status
269
- canonry wordpress pages <project> [--live|--staging] # list pages
270
- canonry wordpress page <project> <slug> # show page detail
271
- canonry wordpress create-page <project> --title <t> --slug <s> --content <c> # create page
272
- canonry wordpress update-page <project> <slug> --content <c> # update page
273
- canonry wordpress set-meta <project> <slug> --title <t> # set SEO meta (single page)
274
- canonry wordpress set-meta <project> --from <file> # bulk set SEO meta from JSON
275
- canonry wordpress schema <project> <slug> # read page JSON-LD
276
- canonry wordpress schema deploy <project> --profile <file> # deploy schema from profile
277
- canonry wordpress schema status <project> # schema status per page
278
- canonry wordpress set-schema <project> <slug> # manual schema handoff
279
- canonry wordpress audit <project> # audit pages for SEO issues
280
- canonry wordpress diff <project> <slug> # compare live vs staging
281
- canonry wordpress staging status <project> # staging config status
282
- canonry wordpress staging push <project> # manual staging push handoff
283
- canonry wordpress llms-txt <project> # read /llms.txt
284
- canonry wordpress set-llms-txt <project> # manual llms.txt handoff
285
- canonry wordpress onboard <project> --url <url> --user <user> # full onboarding workflow
269
+ cnry wordpress connect <project> --url <url> --user <user> # connect (prompts for app password)
270
+ cnry wordpress disconnect <project> # disconnect
271
+ cnry wordpress status <project> # connection status
272
+ cnry wordpress pages <project> [--live|--staging] # list pages
273
+ cnry wordpress page <project> <slug> # show page detail
274
+ cnry wordpress create-page <project> --title <t> --slug <s> --content <c> # create page
275
+ cnry wordpress update-page <project> <slug> --content <c> # update page
276
+ cnry wordpress set-meta <project> <slug> --title <t> # set SEO meta (single page)
277
+ cnry wordpress set-meta <project> --from <file> # bulk set SEO meta from JSON
278
+ cnry wordpress schema <project> <slug> # read page JSON-LD
279
+ cnry wordpress schema deploy <project> --profile <file> # deploy schema from profile
280
+ cnry wordpress schema status <project> # schema status per page
281
+ cnry wordpress set-schema <project> <slug> # manual schema handoff
282
+ cnry wordpress audit <project> # audit pages for SEO issues
283
+ cnry wordpress diff <project> <slug> # compare live vs staging
284
+ cnry wordpress staging status <project> # staging config status
285
+ cnry wordpress staging push <project> # manual staging push handoff
286
+ cnry wordpress llms-txt <project> # read /llms.txt
287
+ cnry wordpress set-llms-txt <project> # manual llms.txt handoff
288
+ cnry wordpress onboard <project> --url <url> --user <user> # full onboarding workflow
286
289
  ```
287
290
 
288
291
  **Onboard** runs: connect → audit → set-meta → schema deploy → Google submit → Bing submit. Use `--skip-schema` or `--skip-submit` to skip steps. `--profile <file>` provides business data and page-to-schema mapping for schema deployment.
@@ -292,31 +295,31 @@ canonry wordpress onboard <project> --url <url> --user <user> # full onboarding
292
295
  GA4 integration uses service account authentication (no OAuth). The service account must have Viewer access on the GA4 property. `ga sync` writes to four DB tables (`gaTrafficSnapshots`, `gaAiReferrals`, `gaSocialReferrals`, `gaTrafficSummaries`); every subsequent read command queries the local store rather than re-fetching from GA4, so reads are fast and quotaless. AI-referral rows are tracked across 10 known providers (chatgpt, perplexity, claude, gemini, openai, anthropic, copilot, phind, you.com, meta.ai), three GA4 attribution dimensions (`session` / `first_user` / `manual_utm`), and joined to landing pages. Social referrals are split Organic vs Paid via GA4's `sessionDefaultChannelGroup`. All commands support `--format json`.
293
296
 
294
297
  ```bash
295
- canonry ga connect <project> --property-id <id> --key-file ./sa-key.json
298
+ cnry ga connect <project> --property-id <id> --key-file ./sa-key.json
296
299
  # connect via service account (auth method = service_account)
297
- canonry ga disconnect <project> # disconnect; deletes all synced rows for the project
298
- canonry ga status <project> # connected, propertyId, authMethod, lastSyncedAt
299
- canonry ga sync <project> [--days 30] [--only traffic|ai|social]
300
+ cnry ga disconnect <project> # disconnect; deletes all synced rows for the project
301
+ cnry ga status <project> # connected, propertyId, authMethod, lastSyncedAt
302
+ cnry ga sync <project> [--days 30] [--only traffic|ai|social]
300
303
  # refresh from GA4 → DB; --only restricts which slice is replaced
301
304
  # returns: synced, rowCount, aiReferralCount, socialReferralCount,
302
305
  # syncedComponents, syncedAt
303
- canonry ga traffic <project> # current-period rollup; returns: totalSessions,
306
+ cnry ga traffic <project> # current-period rollup; returns: totalSessions,
304
307
  # totalOrganicSessions/totalDirectSessions/totalUsers,
305
308
  # organicSharePct/aiSharePct/socialSharePct/directSharePct,
306
309
  # topPages[], aiReferrals[], aiReferralLandingPages[],
307
310
  # aiSessionsDeduped, aiUsersBySession, socialReferrals[]
308
- canonry ga attribution <project> [--trend] # unified channel breakdown (organic / ai / social / direct
311
+ cnry ga attribution <project> [--trend] # unified channel breakdown (organic / ai / social / direct
309
312
  # sessions + raw and display share %s); --trend adds 7d/30d
310
313
  # direction per channel + biggest mover
311
- canonry ga ai-referral-history <project> # daily array of {date, source, medium, attribution,
314
+ cnry ga ai-referral-history <project> # daily array of {date, source, medium, attribution,
312
315
  # sessions, users}; one row per (day × source × dimension)
313
- canonry ga social-referral-history <project> # daily array of {date, source, medium, channel,
316
+ cnry ga social-referral-history <project> # daily array of {date, source, medium, channel,
314
317
  # sessions, users}; channel ∈ {Organic Social, Paid Social}
315
- canonry ga social-referral-summary <project> [--trend]
318
+ cnry ga social-referral-summary <project> [--trend]
316
319
  # one-line social rollup: socialSessions, socialUsers,
317
320
  # socialSharePct, topSources[]; --trend adds 7d/30d direction
318
- canonry ga session-history <project> # daily totals: {date, sessions, organicSessions, users}
319
- canonry ga coverage <project> # per-page overlay: {landingPage, sessions,
321
+ cnry ga session-history <project> # daily totals: {date, sessions, organicSessions, users}
322
+ cnry ga coverage <project> # per-page overlay: {landingPage, sessions,
320
323
  # organicSessions, users}
321
324
  ```
322
325
 
@@ -324,20 +327,20 @@ Every read command queries persisted DB rows, so a stale `lastSyncedAt` means th
324
327
 
325
328
  ## Backlinks (Common Crawl)
326
329
 
327
- Workspace-level Common Crawl release sync + per-project backlink extraction. Requires DuckDB; install once with `canonry backlinks install`. Releases are downloaded once per workspace and reused across all projects.
330
+ Workspace-level Common Crawl release sync + per-project backlink extraction. Requires DuckDB; install once with `cnry backlinks install`. Releases are downloaded once per workspace and reused across all projects.
328
331
 
329
332
  ```bash
330
- canonry backlinks install # install bundled DuckDB binary
331
- canonry backlinks doctor # show install + plugin status
332
- canonry backlinks status # latest workspace release sync
333
- canonry backlinks releases # list cached releases on disk
334
- canonry backlinks sync --release <id> # download + query a release (workspace-wide)
335
- canonry backlinks sync --release <id> --wait # block until ready/failed
336
- canonry backlinks list <project> # top linking domains for the project
337
- canonry backlinks list <project> --limit 100 --release <id>
338
- canonry backlinks extract <project> # re-extract this project against the latest ready release
339
- canonry backlinks extract <project> --release <id> --wait
340
- canonry backlinks cache prune --release <id> # delete cached release files from disk
333
+ cnry backlinks install # install bundled DuckDB binary
334
+ cnry backlinks doctor # show install + plugin status
335
+ cnry backlinks status # latest workspace release sync
336
+ cnry backlinks releases # list cached releases on disk
337
+ cnry backlinks sync --release <id> # download + query a release (workspace-wide)
338
+ cnry backlinks sync --release <id> --wait # block until ready/failed
339
+ cnry backlinks list <project> # top linking domains for the project
340
+ cnry backlinks list <project> --limit 100 --release <id>
341
+ cnry backlinks extract <project> # re-extract this project against the latest ready release
342
+ cnry backlinks extract <project> --release <id> --wait
343
+ cnry backlinks cache prune --release <id> # delete cached release files from disk
341
344
  ```
342
345
 
343
346
  All commands support `--format json`. A release sync has statuses `queued` → `downloading` → `querying` → `ready` / `failed`. Per-project extract runs use the standard run statuses (`queued` → `running` → `completed` / `failed`). Projects with the `autoExtractBacklinks` setting enabled get an extract run enqueued automatically when a release sync transitions to `ready`.
@@ -347,10 +350,10 @@ All commands support `--format json`. A release sync has statuses `queued` → `
347
350
  The CDP (Chrome DevTools Protocol) provider enables browser-based queries against AI chat interfaces (e.g., ChatGPT). This gives more accurate results than API-based providers for some use cases.
348
351
 
349
352
  ```bash
350
- canonry cdp connect --host localhost --port 9222 # connect to Chrome CDP
351
- canonry cdp status # show connection status
352
- canonry cdp targets # list available targets (ChatGPT, etc.)
353
- canonry cdp screenshot <query> --targets chatgpt # screenshot a query result
353
+ cnry cdp connect --host localhost --port 9222 # connect to Chrome CDP
354
+ cnry cdp status # show connection status
355
+ cnry cdp targets # list available targets (ChatGPT, etc.)
356
+ cnry cdp screenshot <query> --targets chatgpt # screenshot a query result
354
357
  ```
355
358
 
356
359
  **Requires:** Chrome running with `--remote-debugging-port=9222`
@@ -358,18 +361,18 @@ canonry cdp screenshot <query> --targets chatgpt # screenshot a query result
358
361
  ## Telemetry
359
362
 
360
363
  ```bash
361
- canonry telemetry status # show telemetry status
362
- canonry telemetry enable # enable anonymous telemetry
363
- canonry telemetry disable # disable telemetry
364
+ cnry telemetry status # show telemetry status
365
+ cnry telemetry enable # enable anonymous telemetry
366
+ cnry telemetry disable # disable telemetry
364
367
  ```
365
368
 
366
369
  ## Config as Code
367
370
 
368
371
  ```bash
369
- canonry apply project.yaml # apply declarative config
370
- canonry apply file1.yaml file2.yaml # multiple files
371
- canonry export <project> --include-results > project.yaml
372
- canonry sitemap inspect <project>
372
+ cnry apply project.yaml # apply declarative config
373
+ cnry apply file1.yaml file2.yaml # multiple files
374
+ cnry export <project> --include-results > project.yaml
375
+ cnry sitemap inspect <project>
373
376
  ```
374
377
 
375
378
  ## Agent
@@ -382,21 +385,21 @@ drive Canonry from Claude Code / Codex / a custom agent.
382
385
 
383
386
  ```bash
384
387
  # One-shot turn — Aero picks its own tools, streams events to stdout.
385
- canonry agent ask <project> "<prompt>"
386
- canonry agent ask <project> "<prompt>" --format json # JSON event stream
388
+ cnry agent ask <project> "<prompt>"
389
+ cnry agent ask <project> "<prompt>" --format json # JSON event stream
387
390
 
388
391
  # Select a specific provider / model (otherwise auto-detected from config).
389
- canonry agent ask <project> "<prompt>" --provider anthropic --model claude-opus-4-7
390
- canonry agent ask <project> "<prompt>" --provider zai --model glm-5.1
391
- canonry agent ask <project> "<prompt>" --provider openai
392
- canonry agent ask <project> "<prompt>" --provider google
392
+ cnry agent ask <project> "<prompt>" --provider anthropic --model claude-opus-4-7
393
+ cnry agent ask <project> "<prompt>" --provider zai --model glm-5.1
394
+ cnry agent ask <project> "<prompt>" --provider openai
395
+ cnry agent ask <project> "<prompt>" --provider google
393
396
 
394
397
  # Restrict the tool surface. Default is --scope all (full 13-tool surface:
395
398
  # 7 read + 6 write). --scope read-only exposes only the 7 read tools and
396
399
  # is what the dashboard bar uses by default so pasted "Copy as CLI"
397
400
  # commands can't enable writes the UI turn couldn't perform.
398
- canonry agent ask <project> "<prompt>" --scope read-only
399
- canonry agent ask <project> "<prompt>" --scope all
401
+ cnry agent ask <project> "<prompt>" --scope read-only
402
+ cnry agent ask <project> "<prompt>" --scope all
400
403
  ```
401
404
 
402
405
  **Provider detection order** when `--provider` is omitted: `anthropic` →
@@ -404,7 +407,7 @@ canonry agent ask <project> "<prompt>" --scope all
404
407
  (from `~/.canonry/config.yaml` providers block, or the matching env var
405
408
  `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` / `ZAI_API_KEY`).
406
409
 
407
- Conversations **persist per project** — `canonry agent ask` continues the
410
+ Conversations **persist per project** — `cnry agent ask` continues the
408
411
  same rolling thread each invocation. Reset with `DELETE /api/v1/projects/<name>/agent/transcript`
409
412
  or via the dashboard bar's reset button.
410
413
 
@@ -412,10 +415,10 @@ or via the dashboard bar's reset button.
412
415
 
413
416
  ```bash
414
417
  # Wire an external agent webhook to a project
415
- canonry agent attach <project> --url <webhook-url> # register webhook subscription
416
- canonry agent attach <project> --url <url> --format json # JSON output
417
- canonry agent detach <project> # remove the agent webhook
418
- canonry agent detach <project> --format json # JSON output
418
+ cnry agent attach <project> --url <webhook-url> # register webhook subscription
419
+ cnry agent attach <project> --url <url> --format json # JSON output
420
+ cnry agent detach <project> # remove the agent webhook
421
+ cnry agent detach <project> --format json # JSON output
419
422
  ```
420
423
 
421
424
  **Agent webhooks** fire on `run.completed`, `insight.critical`, `insight.high`, and `citation.gained`. The attach/detach pair is idempotent per project (one agent webhook per project, matched by source tag).