@ainyc/canonry 4.45.0 → 4.46.1
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/assets/agent-workspace/skills/aero/SKILL.md +5 -3
- package/assets/agent-workspace/skills/canonry/SKILL.md +55 -12
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +48 -12
- package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +32 -0
- package/assets/assets/index-BDMNXVHa.css +1 -0
- package/assets/assets/{index-ObgzOp7B.js → index-CJWNAoK4.js} +111 -111
- package/assets/index.html +2 -2
- package/dist/{chunk-G2HQOLPK.js → chunk-IYUI74JP.js} +42 -32
- package/dist/{chunk-TBADB57G.js → chunk-K2TOOQ4F.js} +11 -7
- package/dist/{chunk-Q7XFJO2V.js → chunk-MM3A2CJK.js} +2 -2
- package/dist/{chunk-GRFMZ7PD.js → chunk-PRNO52YC.js} +1 -1
- package/dist/cli.js +17 -12
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-YFBVWCK2.js → intelligence-service-R3KDVKIB.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +6 -6
- package/assets/assets/index-PWkDKYPZ.css +0 -1
|
@@ -2,19 +2,21 @@
|
|
|
2
2
|
name: aero
|
|
3
3
|
slug: aero
|
|
4
4
|
description: AEO analyst orchestration — coordinates canonry sweeps and aeo-audit analysis with persistent memory and proactive regression response.
|
|
5
|
-
homepage: https://
|
|
5
|
+
homepage: https://canonry.ai
|
|
6
6
|
repository: https://github.com/AINYC/aero
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Aero Orchestration Skill
|
|
10
10
|
|
|
11
11
|
You coordinate across two tools to deliver comprehensive AEO monitoring:
|
|
12
|
-
- **canonry** — the source of truth for project state (runs, snapshots, timelines, insights, audit log, **GA4 traffic + AI/social referrals**). Query it with `cnry <command> --format json` (the CLI is also installed as `canonry` — the two are interchangeable); never maintain a parallel copy in agent memory.
|
|
12
|
+
- **canonry** — the source of truth for project state (runs, snapshots, timelines, insights, audit log, **GA4 traffic + AI/social referrals**, **server-side crawler + referral events**). Query it with `cnry <command> --format json` (the CLI is also installed as `canonry` — the two are interchangeable); never maintain a parallel copy in agent memory. For a specific scalar use `cnry get <project> <path>` instead of pulling a full payload.
|
|
13
13
|
- **aeo-audit** — on-demand site analysis and fix generation.
|
|
14
14
|
|
|
15
15
|
Persist only *user-scoped* context (operator preferences, communication style) in your platform's native memory. Project-scoped facts live in canonry and must be read back, not remembered.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
**Two signals, not one.** Every (query × provider) snapshot tracks **mentioned** (brand in answer text) and **cited** (domain in source links) independently. Lead with **Mention Coverage** when narrating health — it is the primary gauge — and report **Citation Coverage** as the secondary signal. Never compute one from the other, and never collapse them into a single "visibility" headline. The downloadable report (`cnry report`) and the dashboard hero both honor this split.
|
|
18
|
+
|
|
19
|
+
When a project has GA4 connected, traffic is a first-class signal alongside citations. Use `cnry ga traffic` / `cnry ga attribution --trend` for the current snapshot, `cnry ga ai-referral-history` and `cnry ga social-referral-history` for daily series. Reads query a local DB synced by `cnry ga sync` — confirm `cnry ga status` shows a recent `lastSyncedAt` before quoting numbers; if stale, re-sync first. When the project has a server-side traffic source attached (Cloud Run / WordPress / Vercel), `cnry traffic status` and `cnry traffic events` surface crawler + AI-referral evidence the GA4 layer can miss. Full command reference and return shapes live in the co-installed `canonry/references/canonry-cli.md`.
|
|
18
20
|
|
|
19
21
|
## Judgment Rules
|
|
20
22
|
|
|
@@ -32,48 +32,91 @@ metadata:
|
|
|
32
32
|
|
|
33
33
|
# Canonry
|
|
34
34
|
|
|
35
|
-
Agent-first open-source AEO (Answer Engine Optimization) operating platform. Track how AI answer engines cite your domain across Gemini, ChatGPT, Claude, and Perplexity, then act on the signal through the content engine and integrations.
|
|
35
|
+
Agent-first open-source AEO (Answer Engine Optimization) operating platform. Track how AI answer engines **mention** your brand in answers and **cite** your domain in sources across Gemini, ChatGPT, Claude, and Perplexity, then act on the signal through the content engine and integrations.
|
|
36
36
|
|
|
37
|
-
**Website:** [ainyc.ai](https://ainyc.ai) | **Docs:** [github.com/AINYC/canonry](https://github.com/AINYC/canonry)
|
|
37
|
+
**Website:** [canonry.ai](https://canonry.ai) | **Org:** [ainyc.ai](https://ainyc.ai) | **Docs:** [github.com/AINYC/canonry](https://github.com/AINYC/canonry)
|
|
38
38
|
|
|
39
39
|
**CLI:** invoke as `cnry` (short form) or `canonry` — both ship with the npm package and are interchangeable. Examples in this skill use `cnry`.
|
|
40
40
|
|
|
41
41
|
## When to Use
|
|
42
42
|
|
|
43
|
-
- Tracking
|
|
43
|
+
- Tracking brand **mentions** in AI answer text and **citations** in source links across providers
|
|
44
|
+
- Expanding the tracked-query basket from an ICP description (`cnry discover run`)
|
|
44
45
|
- Running technical SEO audits (14‑factor scoring)
|
|
45
46
|
- Implementing structured data (JSON‑LD)
|
|
46
47
|
- Diagnosing indexing gaps via Google Search Console / Bing Webmaster Tools
|
|
48
|
+
- Wiring server-side traffic (Cloud Run, WordPress, Vercel) and GA4 referrals into a single AEO signal
|
|
47
49
|
- Optimizing `llms.txt`, sitemaps, robots.txt for AI crawlers
|
|
48
50
|
- Submitting URLs to Google Indexing API and Bing IndexNow
|
|
49
51
|
- Analyzing competitor citation patterns
|
|
50
52
|
|
|
51
53
|
## Core Philosophy
|
|
52
54
|
|
|
53
|
-
- **Measure outcomes** — AI models are black boxes; track citations, don't assume causality
|
|
55
|
+
- **Measure outcomes** — AI models are black boxes; track mentions + citations, don't assume causality
|
|
54
56
|
- **Signal over noise** — Focus on high‑intent queries; avoid granular targeting until base visibility exists
|
|
55
57
|
- **CLI‑native** — API‑driven changes over manual CMS clicks; faster, repeatable, auditable
|
|
56
58
|
|
|
59
|
+
## What Canonry Measures (Vocabulary)
|
|
60
|
+
|
|
61
|
+
Two parallel signals are tracked per (query × provider) snapshot. They are independent — a model can do either, both, or neither — never conflate them.
|
|
62
|
+
|
|
63
|
+
| Term | Means | Headline metric |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| **mentioned** | The project's brand or domain appears in the LLM's **answer text** (the prose the model returns). | **Mention Coverage** — share of (query × provider) snapshots where the brand was mentioned. **Mention Share** is the project's share among the cited+mentioned set vs competitors. |
|
|
66
|
+
| **cited** | The project's domain appears in the LLM's **source links** (the grounding citations returned alongside the answer). | **Citation Coverage** — share of snapshots where the domain was in the source list. |
|
|
67
|
+
|
|
68
|
+
Configure `spec.brandAliases` on the project (or pass via `cnry apply`) so the mention detector catches "Meta" alongside "Facebook", etc. The downloadable report (`cnry report`) and the dashboard both lead with Mention Coverage; Citation Coverage rides as the secondary gauge.
|
|
69
|
+
|
|
57
70
|
## How to Operate
|
|
58
71
|
|
|
59
72
|
A canonry engagement follows the same loop regardless of project size:
|
|
60
73
|
|
|
61
|
-
1. **Diagnose** — Run a baseline sweep (`cnry run <project> --wait`) and a technical audit (`npx @ainyc/aeo-audit@latest <url> --format json`). See `references/aeo-analysis.md
|
|
74
|
+
1. **Diagnose** — Run a baseline sweep (`cnry run <project> --wait`) and a technical audit (`npx @ainyc/aeo-audit@latest <url> --format json`). Read Mention Coverage first, Citation Coverage second. See `references/aeo-analysis.md`.
|
|
62
75
|
2. **Prioritize** — Triage by impact: indexing gaps → schema gaps → content gaps → query strategy. Branded-term losses are urgent.
|
|
63
|
-
3. **Execute** — Apply fixes via the canonry CLI or platform integrations. See `references/canonry-cli.md` for the full command catalog and `references/wordpress-integration.md` for the WordPress workflow.
|
|
64
|
-
4. **Monitor** — Re-run sweeps weekly. Correlate visibility shifts with deployments and competitor moves.
|
|
65
|
-
5. **Report** — Lead with data, not interpretation: "Lost `<query>` on Gemini between <date> and <date> — two competitors moved in. Here's what to fix." For a one-command client-facing summary, run `cnry report <project>` to generate a self-contained HTML bundle (
|
|
76
|
+
3. **Execute** — Apply fixes via the canonry CLI or platform integrations. Use `--dry-run` on supported mutations (`cnry project delete`, `cnry query replace`, `cnry backfill ...`) to preview before committing. See `references/canonry-cli.md` for the full command catalog and `references/wordpress-integration.md` for the WordPress workflow.
|
|
77
|
+
4. **Monitor** — Re-run sweeps weekly (`cnry run --all --wait` fans out across every project). Correlate visibility shifts with deployments and competitor moves.
|
|
78
|
+
5. **Report** — Lead with data, not interpretation: "Lost the mention for `<query>` on Gemini between <date> and <date> — two competitors moved in. Here's what to fix." For a one-command client-facing summary, run `cnry report <project>` to generate a self-contained HTML bundle (mention + citation hero, competitor landscape, GSC + GA4 performance, insights, suggested next queries). Same payload is available via `--format json` and the `canonry_report` MCP tool.
|
|
79
|
+
|
|
80
|
+
## Surgical Reads
|
|
81
|
+
|
|
82
|
+
When you need a specific value rather than a full payload, use the dot-path getter:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
cnry get <project> scores.mentionShare.value
|
|
86
|
+
cnry get <project> scores.mentionCoverage.value
|
|
87
|
+
cnry get <project> insights[0].severity
|
|
88
|
+
cnry get <project> --from report scores.citationCoverage.value
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`cnry get` resolves a path into the project's overview (default) or any registered source (`report`, `traffic`, `discovery`, etc.). Returns scalar values without forcing the agent to grep through a 30 KB JSON dump.
|
|
66
92
|
|
|
67
93
|
## Common Starting Points
|
|
68
94
|
|
|
69
95
|
- **New site, 0 citations** → submit to GSC/Bing first; basic LocalBusiness/Service schema; `llms.txt`; trim to 8–12 high-intent queries. See `references/indexing.md`.
|
|
70
96
|
- **Established site, regression** → diff canonry runs to find the loss window; verify schema is intact; resubmit affected URLs. See `references/aeo-analysis.md`.
|
|
97
|
+
- **Empty / generic query basket** → describe the ICP and let discovery expand: `cnry discover run <project> --icp "..." --wait`, then `cnry discover promote <session-id>` to adopt the cited + aspirational queries. Multi-location projects can geo-constrain with `--locations <label,...>`.
|
|
71
98
|
- **Multi-county targeting** → reference counties in `areaServed` schema and `llms.txt`; do not split into per-county queries until base visibility exists.
|
|
72
99
|
|
|
73
100
|
## Google Analytics 4
|
|
74
101
|
|
|
75
102
|
GA4 is a first-class signal alongside citation tracking. Connect once with `cnry ga connect <project> --property-id <id> --key-file <path>`; `cnry ga sync` then pulls daily landing-page traffic, AI-referral sessions across 10 known providers (chatgpt, perplexity, claude, gemini, openai, anthropic, copilot, phind, you.com, meta.ai), and social referrals split into Organic vs Paid via GA4's `channelGroup` — and persists everything into four DB tables (`gaTrafficSnapshots`, `gaAiReferrals`, `gaSocialReferrals`, `gaTrafficSummaries`). All read commands query that local store, so they are fast and quotaless once a sync has run. AI referrals are tracked across three GA4 attribution dimensions (session source / first-user source / manual UTM) and joined to landing pages, so you can see which page each AI provider sent traffic to. Use `cnry ga traffic` for the current snapshot, `cnry ga attribution --trend` for a unified channel-share overview with biggest-mover deltas, and `cnry ga ai-referral-history` / `cnry ga social-referral-history` for daily series. See `references/canonry-cli.md` for the full command catalog and return-shape details.
|
|
76
103
|
|
|
104
|
+
## Server-Side Traffic
|
|
105
|
+
|
|
106
|
+
When the project ships behind a server you control, wire crawler + AI-referral evidence directly from the edge: `cnry traffic connect cloud-run | wordpress | vercel <project> ...` writes credentials to `~/.canonry/config.yaml`, `cnry traffic sync` pulls and classifies logs into hourly buckets, and `cnry traffic events / sources / status` expose the rollups. See `references/server-side-traffic.md` for adapter-specific setup.
|
|
107
|
+
|
|
108
|
+
## Built-in Analyst (Aero)
|
|
109
|
+
|
|
110
|
+
Canonry ships a built-in agent — Aero — for users who don't already have one. Drive it from the CLI:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
cnry agent ask <project> "what changed since the last sweep?"
|
|
114
|
+
cnry agent ask <project> "..." --provider claude --scope read-only
|
|
115
|
+
cnry agent memory list <project> # durable project notes
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Aero also wakes unprompted after every `run.completed` so insights and regressions get analyzed without a user click. Users who already run their own agent (Claude Code, Codex, custom) wire webhooks instead: `cnry agent attach <project> --url <webhook-url>` subscribes to `run.completed`, `insight.critical`, `insight.high`, `citation.gained`.
|
|
119
|
+
|
|
77
120
|
## Boundaries & Safety
|
|
78
121
|
|
|
79
122
|
- **Never touch live WordPress without explicit approval**
|
|
@@ -86,13 +129,13 @@ GA4 is a first-class signal alongside citation tracking. Connect once with `cnry
|
|
|
86
129
|
|
|
87
130
|
| File | Read when |
|
|
88
131
|
|---|---|
|
|
89
|
-
| `references/canonry-cli.md` | Looking up specific canonry commands or
|
|
132
|
+
| `references/canonry-cli.md` | Looking up specific canonry commands, flags, or JSON return shapes |
|
|
90
133
|
| `references/aeo-analysis.md` | Interpreting sweep output, diagnosing regressions, planning content fixes |
|
|
91
134
|
| `references/indexing.md` | Submitting URLs, checking GSC/Bing coverage, fixing indexing gaps |
|
|
92
135
|
| `references/wordpress-integration.md` | Connecting to WordPress, editing pages, pushing staging → live |
|
|
93
|
-
| `references/server-side-traffic.md` | Wiring server-log evidence (Cloud Run
|
|
136
|
+
| `references/server-side-traffic.md` | Wiring server-log evidence (Cloud Run, WordPress, Vercel adapters) for AI Visibility — Server-Side. Connect, sync, manage sources, troubleshoot. |
|
|
94
137
|
|
|
95
138
|
---
|
|
96
139
|
|
|
97
|
-
**Tools:** canonry
|
|
98
|
-
**Website:** [ainyc.ai](https://ainyc.ai) | **Reference:** [AINYC AEO Methodology](https://ainyc.ai/aeo-methodology)
|
|
140
|
+
**Tools:** canonry v4+, @ainyc/aeo-audit v1.3+
|
|
141
|
+
**Website:** [canonry.ai](https://canonry.ai) | **Org:** [ainyc.ai](https://ainyc.ai) | **Reference:** [AINYC AEO Methodology](https://ainyc.ai/aeo-methodology)
|
|
@@ -29,9 +29,28 @@ cnry project create <name> --domain <url> --country US --language en
|
|
|
29
29
|
cnry project show <name> # project detail
|
|
30
30
|
cnry project update <name> # update project settings
|
|
31
31
|
cnry project delete <name> # delete a project
|
|
32
|
-
cnry
|
|
32
|
+
cnry project delete <name> --dry-run # preview cascade impact (GET /delete-preview) without writing
|
|
33
|
+
cnry status <project> # mention + citation summary + domain info
|
|
33
34
|
```
|
|
34
35
|
|
|
36
|
+
### Brand aliases
|
|
37
|
+
|
|
38
|
+
`spec.brandAliases: string[]` on the project (set via `cnry apply` or the dashboard) widens the mention detector. Use it when the answer text says "Meta" but the canonical brand is "Facebook", or for product variants ("AcmeCloud", "Acme Cloud", "AcmeCloud Pro"). Aliases are case-insensitive and match the same answer-text scan that powers `answerMentioned`.
|
|
39
|
+
|
|
40
|
+
## Surgical Reads — `cnry get`
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
cnry get <project> scores.mentionShare.value
|
|
44
|
+
cnry get <project> scores.mentionCoverage.value
|
|
45
|
+
cnry get <project> scores.citationCoverage.value
|
|
46
|
+
cnry get <project> insights[0].severity
|
|
47
|
+
cnry get <project> latestRun.status
|
|
48
|
+
cnry get <project> --from report scores.citationCoverage.value # pick a registered source
|
|
49
|
+
cnry get <project> <path> --format json # raw JSON output
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Resolves a dot/bracket path against the project's overview (default `--from overview`) or any registered source — `report`, `traffic`, `discovery`, etc. Returns the scalar (or sub-tree) at the path so an agent can lift a single number without pulling a 30 KB JSON payload. Use `--from <source> .` to see the available top-level keys for that source.
|
|
53
|
+
|
|
35
54
|
### Locations
|
|
36
55
|
|
|
37
56
|
Projects support multi-region location context for geographically-aware sweeps:
|
|
@@ -74,18 +93,21 @@ Run statuses: `queued` → `running` → `completed` / `failed` / `partial`
|
|
|
74
93
|
## Citation Data
|
|
75
94
|
|
|
76
95
|
```bash
|
|
77
|
-
cnry evidence <project> # per-query cited/not-cited
|
|
96
|
+
cnry evidence <project> # per-query cited/not-cited + mentioned/not-mentioned
|
|
78
97
|
cnry evidence <project> --format json # JSON output
|
|
79
98
|
cnry history <project> # audit trail
|
|
80
99
|
cnry export <project> --include-results # export as YAML
|
|
81
|
-
cnry backfill answer-visibility # recompute
|
|
82
|
-
cnry backfill answer-visibility --
|
|
100
|
+
cnry backfill answer-visibility # recompute citationState from stored answers
|
|
101
|
+
cnry backfill answer-visibility --dry-run # preview which snapshots would change
|
|
102
|
+
cnry backfill answer-mentions # recompute answerMentioned from stored answers (honors brandAliases)
|
|
103
|
+
cnry backfill answer-mentions --dry-run
|
|
104
|
+
cnry backfill insights <project> # recompute insights for completed runs
|
|
105
|
+
cnry backfill insights <project> --since 2026-04-01 --dry-run
|
|
83
106
|
```
|
|
84
107
|
|
|
85
|
-
Output
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
- Summary: `Cited: X / Y`
|
|
108
|
+
Output uses a two-glyph cell per (query × provider): `[C/c][M/m]` — uppercase = present, lowercase = absent, `–` = no snapshot. Always print the legend before the table; never collapse the two signals into one cell.
|
|
109
|
+
|
|
110
|
+
Summary: `Cited: X / Y` and `Mentioned: X / Y` are reported independently — a query can be one, both, or neither.
|
|
89
111
|
|
|
90
112
|
## Reports
|
|
91
113
|
|
|
@@ -134,6 +156,8 @@ cnry backfill insights <project> --from-run <id> --to-run <id> # backfill a ran
|
|
|
134
156
|
|
|
135
157
|
```bash
|
|
136
158
|
cnry query add <project> "phrase one" "phrase two"
|
|
159
|
+
cnry query replace <project> "phrase one" "phrase two" # set the basket to exactly this list
|
|
160
|
+
cnry query replace <project> "..." --dry-run # preview adds/removes via /queries/replace-preview
|
|
137
161
|
cnry query remove <project> "phrase"
|
|
138
162
|
cnry query list <project>
|
|
139
163
|
cnry query import <project> queries.txt
|
|
@@ -388,6 +412,8 @@ drive Canonry from Claude Code / Codex / a custom agent.
|
|
|
388
412
|
# One-shot turn — Aero picks its own tools, streams events to stdout.
|
|
389
413
|
cnry agent ask <project> "<prompt>"
|
|
390
414
|
cnry agent ask <project> "<prompt>" --format json # JSON event stream
|
|
415
|
+
cnry agent ask --all "<prompt>" # fan out the same prompt across every project
|
|
416
|
+
cnry agent ask <project> "<prompt>" --trace # emit tool-execution detail for debugging
|
|
391
417
|
|
|
392
418
|
# Select a specific provider / model (otherwise auto-detected from config).
|
|
393
419
|
cnry agent ask <project> "<prompt>" --provider anthropic --model claude-opus-4-7
|
|
@@ -395,12 +421,22 @@ cnry agent ask <project> "<prompt>" --provider zai --model glm-5.1
|
|
|
395
421
|
cnry agent ask <project> "<prompt>" --provider openai
|
|
396
422
|
cnry agent ask <project> "<prompt>" --provider google
|
|
397
423
|
|
|
398
|
-
# Restrict the tool surface. Default is --scope all (full
|
|
399
|
-
#
|
|
400
|
-
# is what the dashboard bar uses by default so pasted "Copy as CLI"
|
|
424
|
+
# Restrict the tool surface. Default is --scope all (full read+write surface).
|
|
425
|
+
# --scope read-only matches the dashboard bar default so pasted "Copy as CLI"
|
|
401
426
|
# commands can't enable writes the UI turn couldn't perform.
|
|
402
427
|
cnry agent ask <project> "<prompt>" --scope read-only
|
|
403
428
|
cnry agent ask <project> "<prompt>" --scope all
|
|
429
|
+
|
|
430
|
+
# Session + provider introspection
|
|
431
|
+
cnry agent providers <project> # list provider keys Aero will pick from + the resolved default
|
|
432
|
+
cnry agent transcript <project> # dump the rolling transcript for the current session
|
|
433
|
+
cnry agent reset <project> # start a fresh session (drops in-memory state, keeps memory)
|
|
434
|
+
cnry agent clear <project> # delete the transcript row from the DB
|
|
435
|
+
|
|
436
|
+
# Durable project notes (the <memory> hydrate block on every new session)
|
|
437
|
+
cnry agent memory list <project>
|
|
438
|
+
cnry agent memory set <project> --key <k> --value <v> # 2 KB cap per value
|
|
439
|
+
cnry agent memory forget <project> --key <k>
|
|
404
440
|
```
|
|
405
441
|
|
|
406
442
|
**Provider detection order** when `--provider` is omitted: `anthropic` →
|
|
@@ -409,7 +445,7 @@ cnry agent ask <project> "<prompt>" --scope all
|
|
|
409
445
|
`ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` / `ZAI_API_KEY`).
|
|
410
446
|
|
|
411
447
|
Conversations **persist per project** — `cnry agent ask` continues the
|
|
412
|
-
same rolling thread each invocation. Reset with `
|
|
448
|
+
same rolling thread each invocation. Reset with `cnry agent reset <project>`
|
|
413
449
|
or via the dashboard bar's reset button.
|
|
414
450
|
|
|
415
451
|
### External agents (webhook)
|
|
@@ -36,6 +36,7 @@ Adapters today:
|
|
|
36
36
|
|---|---|---|
|
|
37
37
|
| `cloud-run` | GCP Cloud Run request logs via Logging API | Any service running on Cloud Run |
|
|
38
38
|
| `wordpress` | The Canonry Traffic Logger WP plugin's REST endpoint | WordPress sites where you control wp-admin |
|
|
39
|
+
| `vercel` | Vercel project logs via the Vercel API | Sites deployed on Vercel (Next.js, SvelteKit, etc.) |
|
|
39
40
|
|
|
40
41
|
Future adapters slot in by implementing the same contract.
|
|
41
42
|
|
|
@@ -104,6 +105,37 @@ The plugin auto-prunes events older than the retention window (default
|
|
|
104
105
|
90 days) once per day via WP-Cron. Operators who want a different
|
|
105
106
|
window change it in `Settings → Canonry Traffic Logger`.
|
|
106
107
|
|
|
108
|
+
## Connecting a Vercel source
|
|
109
|
+
|
|
110
|
+
The Vercel adapter pulls per-request logs from the Vercel API for a
|
|
111
|
+
specific project + environment. Logs are filtered by canonical domain
|
|
112
|
+
before classification so a multi-tenant Vercel project only surfaces
|
|
113
|
+
hits for the tracked site.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# 1. In the Vercel dashboard, create a token with read access to the
|
|
117
|
+
# target team (Settings → Tokens → Create). Note the team ID
|
|
118
|
+
# (Settings → General → Team ID) and the Vercel project ID
|
|
119
|
+
# (Project → Settings → General → Project ID).
|
|
120
|
+
|
|
121
|
+
# 2. Connect from cnry CLI:
|
|
122
|
+
cnry traffic connect vercel <project> \
|
|
123
|
+
--project-id prj_xxxxxxxx \
|
|
124
|
+
--team-id team_xxxxxxxx \
|
|
125
|
+
--token <vercel-token> # or: --token-file <path>
|
|
126
|
+
|
|
127
|
+
# 3. (Optional) scope to a specific environment (default: production):
|
|
128
|
+
cnry traffic connect vercel <project> \
|
|
129
|
+
--project-id prj_xxx --team-id team_xxx --token ... \
|
|
130
|
+
--environment preview
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Credentials live in `~/.canonry/config.yaml` under `vercelTraffic:`,
|
|
134
|
+
mirroring the cloud-run / wordpress blocks. The adapter classifies bot
|
|
135
|
+
crawls + AI-referral arrivals into the same `crawler_events_hourly` /
|
|
136
|
+
`ai_referral_events_hourly` tables — downstream commands
|
|
137
|
+
(`cnry traffic events / sources / status`) are source-agnostic.
|
|
138
|
+
|
|
107
139
|
## Syncing data
|
|
108
140
|
|
|
109
141
|
```bash
|