@ainyc/canonry 4.46.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.
@@ -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://ainyc.ai
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
- 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. Full command reference and return shapes live in the co-installed `canonry/references/canonry-cli.md` (look for the "Google Analytics 4" section).
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 query citations across AI providers
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` for interpretation.
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 (executive summary, citation scorecard, competitor landscape, GSC + GA4 performance, insights). Same payload is available via `--format json` and the `canonry_report` MCP tool.
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 flags |
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 + WordPress adapters; more planned) for AI Visibility — Server-Side. Connect, sync, manage sources, troubleshoot. |
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 v3+, @ainyc/aeo-audit v1.3+
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 status <project> # citation summary + domain info
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 answer visibility from stored answers
82
- cnry backfill answer-visibility --project <name> --format json
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 shows:
86
- - `✓ cited` — domain appeared in AI response for that query
87
- - `✗ not-cited` — domain did not appear
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 13-tool surface:
399
- # 7 read + 6 write). --scope read-only exposes only the 7 read tools and
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 `DELETE /api/v1/projects/<name>/agent/transcript`
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