@ainyc/canonry 4.30.0 → 4.32.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 +15 -13
- package/assets/agent-workspace/skills/aero/SKILL.md +2 -2
- package/assets/agent-workspace/skills/aero/references/aeo-discovery.md +26 -17
- package/assets/agent-workspace/skills/aero/references/memory-patterns.md +9 -9
- package/assets/agent-workspace/skills/aero/references/orchestration.md +6 -6
- package/assets/agent-workspace/skills/aero/references/reporting.md +3 -3
- package/assets/agent-workspace/skills/canonry/SKILL.md +5 -3
- package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +9 -9
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +203 -200
- package/assets/agent-workspace/skills/canonry/references/indexing.md +35 -35
- package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +18 -18
- package/assets/agent-workspace/skills/canonry/references/wordpress-integration.md +11 -11
- package/assets/assets/{index-BnALDZI7.css → index-CNKAwZMB.css} +1 -1
- package/assets/assets/index-CUMjedc6.js +302 -0
- package/assets/index.html +2 -2
- package/dist/{chunk-7UO3EGDB.js → chunk-5M4PP6P4.js} +25 -2
- package/dist/{chunk-PTFVEYUX.js → chunk-7I65IXVU.js} +617 -23
- package/dist/{chunk-4EDC2P3J.js → chunk-LUAJVZVZ.js} +1 -1
- package/dist/{chunk-NIAAHWRF.js → chunk-LVX5TOYA.js} +28 -3
- package/dist/cli.js +166 -15
- package/dist/index.d.ts +20 -0
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-ASXADXLF.js → intelligence-service-RSRWDBHS.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +8 -7
- package/assets/assets/index-BYiZYtd9.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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
-
|
|
298
|
+
cnry ga connect <project> --property-id <id> --key-file ./sa-key.json
|
|
296
299
|
# connect via service account (auth method = service_account)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
316
|
+
cnry ga social-referral-history <project> # daily array of {date, source, medium, channel,
|
|
314
317
|
# sessions, users}; channel ∈ {Organic Social, Paid Social}
|
|
315
|
-
|
|
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
|
-
|
|
319
|
-
|
|
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 `
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
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
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
-
|
|
386
|
-
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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
|
-
|
|
399
|
-
|
|
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** — `
|
|
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
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
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).
|