@canonry/canonry 4.158.0 → 4.160.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 +3 -3
- package/THIRD_PARTY_NOTICES.md +102 -0
- package/assets/THIRD_PARTY_NOTICES.md +102 -0
- package/assets/agent-workspace/skills/aero/SKILL.md +16 -1
- package/assets/agent-workspace/skills/canonry/SKILL.md +17 -5
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +67 -0
- package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +231 -62
- package/assets/assets/{AuditHistoryPanel-McQfjoU9.js → AuditHistoryPanel-AtgoG2AH.js} +1 -1
- package/assets/assets/{BacklinksPage-Da8y1Wv8.js → BacklinksPage-DrOSF7Mu.js} +1 -1
- package/assets/assets/{HistoryPage-9MJfhRyT.js → HistoryPage-CGQXleJc.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-BiNAHEJW.js → MeasurementPropertyPage-C7D2OgIQ.js} +1 -1
- package/assets/assets/ProjectPage-Lp1VjNvL.js +12 -0
- package/assets/assets/{RunRow-DCG2LBlS.js → RunRow-BdzKKODo.js} +1 -1
- package/assets/assets/{RunsPage-ByWA_FSk.js → RunsPage-BU96L07S.js} +1 -1
- package/assets/assets/{SettingsPage-DdSeKAKF.js → SettingsPage-LEca0kDH.js} +1 -1
- package/assets/assets/SiteHealthSection-CKM4DUfE.js +4 -0
- package/assets/assets/{TrafficPage-5u8rPcBt.js → TrafficPage-tU9wl1F_.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-Dm-fK87u.js → TrafficSourceDetailPage-DZTpnU9f.js} +1 -1
- package/assets/assets/extract-error-message-BAyN-ftk.js +1 -0
- package/assets/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/assets/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/assets/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/assets/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/assets/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/assets/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/assets/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/assets/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/assets/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/assets/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/assets/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/assets/assets/index-CACRaOmZ.css +1 -0
- package/assets/assets/index-Wqv7kvs-.js +83 -0
- package/assets/assets/{react-sigma_core.esm.min-ComIyDKi.js → react-sigma_core.esm.min-DlZOAc_w.js} +2 -2
- package/assets/assets/{vendor-lucide-BtYdosYk.js → vendor-lucide-nYKv-BB7.js} +1 -1
- package/assets/assets/{vendor-markdown-D274_wsI.js → vendor-markdown-Bn7fRwrx.js} +1 -1
- package/assets/assets/{vendor-radix-BxMXSwbC.js → vendor-radix-4UOaVWza.js} +1 -1
- package/assets/assets/{vendor-recharts-C4ktw_aE.js → vendor-recharts-D8rt5lKn.js} +1 -1
- package/assets/assets/{vendor-tanstack-pFxw0eGP.js → vendor-tanstack-Dock0eH1.js} +1 -1
- package/assets/index.html +7 -7
- package/dist/{chunk-DEVAEC2S.js → chunk-7M7T5QXS.js} +290 -16
- package/dist/{chunk-LK6YFHG4.js → chunk-HQAVEK42.js} +65 -15
- package/dist/{chunk-YP4K2KXH.js → chunk-X7CYY5Q7.js} +2687 -686
- package/dist/{chunk-4VZP64GZ.js → chunk-XGESWHFP.js} +660 -274
- package/dist/cli.js +333 -117
- package/dist/index.d.ts +37 -14
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-LQ6ZRWMF.js → intelligence-service-6XQMM466.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +11 -9
- package/assets/assets/ProjectPage-mWSMjXrR.js +0 -15
- package/assets/assets/extract-error-message-CtxkAd6E.js +0 -1
- package/assets/assets/index-DUfg50Pl.js +0 -83
- package/assets/assets/index-cXb3mfeQ.css +0 -1
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@canonry/canonry) [](https://nodejs.org)
|
|
4
4
|
|
|
5
|
-
Your entire AEO + web analytics stack
|
|
5
|
+
Your entire AEO/GEO/AI Visibility, technical SEO + web analytics stack. **Agent-first. Self-hosted. Local.**
|
|
6
6
|
|
|
7
7
|
- **Local-only:** Canonry runs on your machine and stores its data in SQLite.
|
|
8
|
-
- Track citations across Gemini, ChatGPT, Claude, Perplexity, and local LLMs
|
|
8
|
+
- Track web search citations and mentions across Gemini, ChatGPT, Claude, Perplexity, and local LLMs
|
|
9
9
|
- Capture server-side traffic from Cloudflare, Cloud Run, Vercel, and WordPress — [setup guide](skills/canonry/references/server-side-traffic.md)
|
|
10
10
|
- Diagnose against real traffic with built-in [GSC](docs/google-search-console-setup.md), [GA4](docs/google-analytics-setup.md), and [Bing Webmaster](docs/bing-webmaster-setup.md)
|
|
11
11
|
- Track local AEO via [Google Business Profile](skills/canonry/references/google-business-profile.md) — search-term impressions, performance metrics, and hotel lodging + booking-CTA gaps
|
|
@@ -94,7 +94,7 @@ Configure during `cnry init`, in the dashboard `/settings`, or as env vars.
|
|
|
94
94
|
| **Aero — built-in agent** | [skills/aero/SKILL.md](skills/aero/SKILL.md) |
|
|
95
95
|
| **Agent Plugin — portable core + Codex / Claude adapters** | [docs/plugins.md](docs/plugins.md) |
|
|
96
96
|
| **MCP — Claude Desktop / Cursor / Codex** | [docs/mcp.md](docs/mcp.md) |
|
|
97
|
-
| **Integrations** | [GSC](docs/google-search-console-setup.md) · [GA4](docs/google-analytics-setup.md) · [Bing](docs/bing-webmaster-setup.md) · [Google Business Profile](skills/canonry/references/google-business-profile.md) · [WordPress](docs/wordpress-setup.md) · [Server-side traffic (Cloudflare direct push, Cloud Run, Vercel, WordPress)](skills/canonry/references/server-side-traffic.md) |
|
|
97
|
+
| **Integrations** | [GSC](docs/google-search-console-setup.md) · [GA4](docs/google-analytics-setup.md) · [Bing](docs/bing-webmaster-setup.md) · [Google Business Profile](skills/canonry/references/google-business-profile.md) · [WordPress](docs/wordpress-setup.md) · [Server-side traffic (Cloudflare direct push or Queue pull, Cloud Run, Vercel, WordPress)](skills/canonry/references/server-side-traffic.md) |
|
|
98
98
|
| **Deployment** — Docker, Railway, Render, systemd, Tailscale | [docs/deployment.md](docs/deployment.md) |
|
|
99
99
|
| **API** — 118+ endpoints | `GET /api/v1/openapi.json` (no auth) |
|
|
100
100
|
| **Standalone skills bundle** for Claude Code / Codex | `cnry skills install` ([details](skills/canonry/SKILL.md)) |
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
Canonry includes the following font software in its bundled dashboard assets.
|
|
4
|
+
|
|
5
|
+
## Geist and Geist Mono
|
|
6
|
+
|
|
7
|
+
Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
|
|
8
|
+
|
|
9
|
+
Geist-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
|
|
10
|
+
|
|
11
|
+
GeistMono-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)
|
|
12
|
+
|
|
13
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
14
|
+
This license is copied below, and is also available with a FAQ at:
|
|
15
|
+
http://scripts.sil.org/OFL
|
|
16
|
+
|
|
17
|
+
-----------------------------------------------------------
|
|
18
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
19
|
+
-----------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
PREAMBLE
|
|
22
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
23
|
+
development of collaborative font projects, to support the font creation
|
|
24
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
25
|
+
open framework in which fonts may be shared and improved in partnership
|
|
26
|
+
with others.
|
|
27
|
+
|
|
28
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
29
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
30
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
31
|
+
redistributed and/or sold with any software provided that any reserved
|
|
32
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
33
|
+
however, cannot be released under any other type of license. The
|
|
34
|
+
requirement for fonts to remain under this license does not apply
|
|
35
|
+
to any document created using the fonts or their derivatives.
|
|
36
|
+
|
|
37
|
+
DEFINITIONS
|
|
38
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
39
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
40
|
+
include source files, build scripts and documentation.
|
|
41
|
+
|
|
42
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
43
|
+
copyright statement(s).
|
|
44
|
+
|
|
45
|
+
"Original Version" refers to the collection of Font Software components as
|
|
46
|
+
distributed by the Copyright Holder(s).
|
|
47
|
+
|
|
48
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
49
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
50
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
51
|
+
new environment.
|
|
52
|
+
|
|
53
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
54
|
+
writer or other person who contributed to the Font Software.
|
|
55
|
+
|
|
56
|
+
PERMISSION & CONDITIONS
|
|
57
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
58
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
59
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
60
|
+
Software, subject to the following conditions:
|
|
61
|
+
|
|
62
|
+
1) Neither the Font Software nor any of its individual components,
|
|
63
|
+
in Original or Modified Versions, may be sold by itself.
|
|
64
|
+
|
|
65
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
66
|
+
redistributed and/or sold with any software, provided that each copy
|
|
67
|
+
contains the above copyright notice and this license. These can be
|
|
68
|
+
included either as stand-alone text files, human-readable headers or
|
|
69
|
+
in the appropriate machine-readable metadata fields within text or
|
|
70
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
71
|
+
|
|
72
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
73
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
74
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
75
|
+
presented to the users.
|
|
76
|
+
|
|
77
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
78
|
+
Software shall not be used to promote, endorse or advertise any
|
|
79
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
80
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
81
|
+
permission.
|
|
82
|
+
|
|
83
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
84
|
+
must be distributed entirely under this license, and must not be
|
|
85
|
+
distributed under any other license. The requirement for fonts to
|
|
86
|
+
remain under this license does not apply to any document created
|
|
87
|
+
using the Font Software.
|
|
88
|
+
|
|
89
|
+
TERMINATION
|
|
90
|
+
This license becomes null and void if any of the above conditions are
|
|
91
|
+
not met.
|
|
92
|
+
|
|
93
|
+
DISCLAIMER
|
|
94
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
95
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
96
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
97
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
98
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
99
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
100
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
101
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
102
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
Canonry includes the following font software in its bundled dashboard assets.
|
|
4
|
+
|
|
5
|
+
## Geist and Geist Mono
|
|
6
|
+
|
|
7
|
+
Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
|
|
8
|
+
|
|
9
|
+
Geist-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
|
|
10
|
+
|
|
11
|
+
GeistMono-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)
|
|
12
|
+
|
|
13
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
14
|
+
This license is copied below, and is also available with a FAQ at:
|
|
15
|
+
http://scripts.sil.org/OFL
|
|
16
|
+
|
|
17
|
+
-----------------------------------------------------------
|
|
18
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
19
|
+
-----------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
PREAMBLE
|
|
22
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
23
|
+
development of collaborative font projects, to support the font creation
|
|
24
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
25
|
+
open framework in which fonts may be shared and improved in partnership
|
|
26
|
+
with others.
|
|
27
|
+
|
|
28
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
29
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
30
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
31
|
+
redistributed and/or sold with any software provided that any reserved
|
|
32
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
33
|
+
however, cannot be released under any other type of license. The
|
|
34
|
+
requirement for fonts to remain under this license does not apply
|
|
35
|
+
to any document created using the fonts or their derivatives.
|
|
36
|
+
|
|
37
|
+
DEFINITIONS
|
|
38
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
39
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
40
|
+
include source files, build scripts and documentation.
|
|
41
|
+
|
|
42
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
43
|
+
copyright statement(s).
|
|
44
|
+
|
|
45
|
+
"Original Version" refers to the collection of Font Software components as
|
|
46
|
+
distributed by the Copyright Holder(s).
|
|
47
|
+
|
|
48
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
49
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
50
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
51
|
+
new environment.
|
|
52
|
+
|
|
53
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
54
|
+
writer or other person who contributed to the Font Software.
|
|
55
|
+
|
|
56
|
+
PERMISSION & CONDITIONS
|
|
57
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
58
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
59
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
60
|
+
Software, subject to the following conditions:
|
|
61
|
+
|
|
62
|
+
1) Neither the Font Software nor any of its individual components,
|
|
63
|
+
in Original or Modified Versions, may be sold by itself.
|
|
64
|
+
|
|
65
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
66
|
+
redistributed and/or sold with any software, provided that each copy
|
|
67
|
+
contains the above copyright notice and this license. These can be
|
|
68
|
+
included either as stand-alone text files, human-readable headers or
|
|
69
|
+
in the appropriate machine-readable metadata fields within text or
|
|
70
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
71
|
+
|
|
72
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
73
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
74
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
75
|
+
presented to the users.
|
|
76
|
+
|
|
77
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
78
|
+
Software shall not be used to promote, endorse or advertise any
|
|
79
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
80
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
81
|
+
permission.
|
|
82
|
+
|
|
83
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
84
|
+
must be distributed entirely under this license, and must not be
|
|
85
|
+
distributed under any other license. The requirement for fonts to
|
|
86
|
+
remain under this license does not apply to any document created
|
|
87
|
+
using the Font Software.
|
|
88
|
+
|
|
89
|
+
TERMINATION
|
|
90
|
+
This license becomes null and void if any of the above conditions are
|
|
91
|
+
not met.
|
|
92
|
+
|
|
93
|
+
DISCLAIMER
|
|
94
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
95
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
96
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
97
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
98
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
99
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
100
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
101
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
102
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -16,7 +16,22 @@ Persist only *user-scoped* context (operator preferences, communication style) i
|
|
|
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
18
|
|
|
19
|
-
When a project has GA4 connected, traffic is a first-class signal alongside
|
|
19
|
+
When a project has GA4 connected, traffic is a first-class signal alongside
|
|
20
|
+
mentions and citations. Use `cnry ga traffic` and `cnry ga attribution --trend`
|
|
21
|
+
for the current snapshot. Use the GA referral-history commands for daily series.
|
|
22
|
+
Before you quote GA4 data, make sure that `cnry ga status` has a recent
|
|
23
|
+
`lastSyncedAt`. If it is stale, get approval before you run `cnry ga sync`.
|
|
24
|
+
|
|
25
|
+
For Cloud Run, WordPress, Vercel, or Cloudflare, use `cnry traffic status` and
|
|
26
|
+
`cnry traffic events` for crawler and AI-referral evidence. Read the Cloudflare
|
|
27
|
+
`deliveryMode` before you recommend an action. Direct push does not use
|
|
28
|
+
`traffic sync`. Queue pull freshness requires an enabled `traffic-sync`
|
|
29
|
+
schedule. Run the `traffic.source.*` doctor checks. Inspect
|
|
30
|
+
`traffic.source.queue-backlog` before you quote current Queue data. If more than
|
|
31
|
+
1,000 messages remain, report that one default tick cannot drain the backlog.
|
|
32
|
+
Get approval before you run a manual sync or change the schedule. The full
|
|
33
|
+
command reference is in the co-installed
|
|
34
|
+
`canonry/references/canonry-cli.md`.
|
|
20
35
|
|
|
21
36
|
**Diagnosing a stuck Vercel/Cloud Run source:** if `cnry traffic status` shows `status=error` with a recent `lastError` of `refusing to advance` or `ExceedsBillingLimitError`, the source's `lastSyncedAt` has aged past the upstream retention boundary and every sync now throws. Recovery: `cnry traffic reset <project> --source <id> --advance-to-now`. This advances `lastSyncedAt` to NOW and resumes going-forward syncs — historical events in the gap are unrecoverable from the sync path; run `cnry traffic backfill --days N` separately if any of that history is needed (capped at retention).
|
|
22
37
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: canonry
|
|
3
|
-
description: "Set up and operate Canonry AEO projects
|
|
3
|
+
description: "Set up and operate Canonry AEO projects. Inspect mention and citation coverage, diagnose regressions, and run technical audits. Connect Cloudflare direct-push or queue-pull traffic. Act through the Canonry CLI or MCP tools. Examples: inspect project acme coverage (run + report), diagnose query drift via attribution (report.html + visibility-attribution), or submit GSC sitemaps (gsc-sitemap-submission batched)."
|
|
4
4
|
compatibility: Requires Node.js 22.14+ and globally installed @canonry/canonry; canonry-mcp must be on PATH.
|
|
5
5
|
metadata:
|
|
6
6
|
agent: >-
|
|
@@ -131,10 +131,22 @@ GA4 is a first-class signal alongside citation tracking. Connect once with `cnry
|
|
|
131
131
|
|
|
132
132
|
When the project ships behind a server you control, connect Cloud Run, WordPress,
|
|
133
133
|
or Vercel. `cnry traffic sync` pulls and classifies their logs into hourly
|
|
134
|
-
buckets. For
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
buckets. For Cloudflare, choose `direct-push` or `queue-pull` on the local,
|
|
135
|
+
credential-owning host. Direct push requires a public Canonry HTTPS receiver.
|
|
136
|
+
It does not use `traffic sync`. Queue pull sends events to a Cloudflare Queue,
|
|
137
|
+
then Canonry drains it through `traffic sync` and the `traffic-sync` schedule.
|
|
138
|
+
|
|
139
|
+
If the connect response reports `activationRequired`, attach the Worker route
|
|
140
|
+
first. Then run `cnry traffic activate <project> --source <id>`. Activation
|
|
141
|
+
pauses all sibling sources. It also moves the one `traffic-sync` schedule to
|
|
142
|
+
Queue pull. A first source becomes active automatically.
|
|
143
|
+
|
|
144
|
+
Each default Queue tick drains at most 1,000 messages. Use `cnry traffic status`
|
|
145
|
+
and the `traffic.source.queue-backlog` doctor check to read the backlog. If more
|
|
146
|
+
than 1,000 messages remain, get approval before a manual sync or a shorter
|
|
147
|
+
schedule interval. Use `cnry traffic events`, `cnry traffic sources`, and
|
|
148
|
+
`cnry traffic status` for every adapter. See
|
|
149
|
+
`references/server-side-traffic.md` for setup and smoke tests.
|
|
138
150
|
|
|
139
151
|
**Vercel gotcha:** a freshly connected Vercel source captures only going-forward traffic — `lastSyncedAt` is seeded to NOW to avoid the 30-day default window exceeding Vercel's ~14-day request-logs retention (which would otherwise throw on every first sync). Use `cnry traffic backfill <project> --source <id> --days N` for historical recovery. If an idle Vercel/Cloud Run source has been failing long enough that `lastSyncedAt` aged past retention, unstick it with `cnry traffic reset <project> --source <id> --advance-to-now`.
|
|
140
152
|
|
|
@@ -258,6 +258,7 @@ Site-wide technical audit (structured data, AI-readable content, AI-crawler acce
|
|
|
258
258
|
cnry technical-aeo run <project> --wait # full crawl + audit; defaults to 1,000 pages / 100,000 edges; waits for terminal state
|
|
259
259
|
cnry technical-aeo run <project> --sitemap-url <url> --max-pages 5000 --max-edges 250000 --max-depth 12 # optional crawl seeds and custom budgets; hard caps are 50,000 pages / 1,000,000 edges
|
|
260
260
|
cnry technical-aeo run <project> --check-dead-links --wait # opt in to dead-link checks; they are off by default
|
|
261
|
+
cnry technical-aeo progress <project> --run-id <id> [--format json] # exact durable phase and pages found / checked / failed counters; never a synthesized percentage
|
|
261
262
|
cnry technical-aeo crawl <project> [--run-id <id>] [--format json] # crawl metadata, budgets, completeness, and termination
|
|
262
263
|
cnry site-health overview <project> [--run-id <id>] [--format json] # operator-facing alias for crawl metadata
|
|
263
264
|
cnry site-health page-audit <project> (--node-key <key>|--url <url>) [--run-id <id>] [--format json] # exact audit score, factor findings, recommendations, and crawl provenance for one graph page
|
|
@@ -563,6 +564,72 @@ cnry wordpress onboard <project> --url <url> --user <user> # full onboarding wo
|
|
|
563
564
|
|
|
564
565
|
**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.
|
|
565
566
|
|
|
567
|
+
## Server-Side Traffic
|
|
568
|
+
|
|
569
|
+
Cloudflare supports direct push and Queue pull. Run Cloudflare connect only from
|
|
570
|
+
the local host that owns the Canonry configuration and Wrangler profile. This
|
|
571
|
+
operation is not available through MCP because it uses local credentials.
|
|
572
|
+
|
|
573
|
+
```bash
|
|
574
|
+
# Direct push to a stable public Canonry HTTPS receiver:
|
|
575
|
+
cnry traffic connect cloudflare <project> \
|
|
576
|
+
--delivery-mode direct-push \
|
|
577
|
+
--zone-id <zone-id> --account-id <account-id> \
|
|
578
|
+
--deploy --confirm-route --confirm-fail-open
|
|
579
|
+
|
|
580
|
+
# Create the Queue and enable its HTTP pull consumer first:
|
|
581
|
+
wrangler queues create canonry-traffic-<project>
|
|
582
|
+
# Workers Paid only: use this command to change the four-day default.
|
|
583
|
+
wrangler queues update canonry-traffic-<project> \
|
|
584
|
+
--message-retention-period-secs <seconds>
|
|
585
|
+
wrangler queues info canonry-traffic-<project>
|
|
586
|
+
wrangler queues consumer http add canonry-traffic-<project>
|
|
587
|
+
|
|
588
|
+
# Queue pull keeps the API token in the local Canonry credential store:
|
|
589
|
+
cnry traffic connect cloudflare <project> \
|
|
590
|
+
--delivery-mode queue-pull \
|
|
591
|
+
--zone-id <zone-id> --account-id <account-id> \
|
|
592
|
+
--queue-id <queue-id> --queue-name canonry-traffic-<project> \
|
|
593
|
+
--api-token-file <mode-0600-token-file> \
|
|
594
|
+
--retention-seconds <actual-queue-retention-seconds> \
|
|
595
|
+
--deploy --confirm-route --confirm-fail-open
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
Workers Free retention is fixed at `86400` seconds. Workers Paid defaults to
|
|
599
|
+
`345600` seconds. If you change paid retention with `wrangler queues update`,
|
|
600
|
+
pass the same value to Canonry. The Canonry flag does not change the Queue.
|
|
601
|
+
|
|
602
|
+
Both commands deploy an unattached Worker. Attach the exact site route in the
|
|
603
|
+
Cloudflare Dashboard. Then set its request-limit failure mode to **Fail open**.
|
|
604
|
+
Do not put the Queue API token on the command line or in an agent transcript.
|
|
605
|
+
|
|
606
|
+
```bash
|
|
607
|
+
# If connect reports activationRequired, activate after the route is live:
|
|
608
|
+
cnry traffic activate <project> --source <source-id>
|
|
609
|
+
cnry traffic sync <project> --source <source-id> # pull adapters, including Cloudflare Queue pull
|
|
610
|
+
cnry traffic sources <project> --format json
|
|
611
|
+
cnry traffic status <project> --format json
|
|
612
|
+
cnry traffic events <project> --source <source-id> --format json
|
|
613
|
+
|
|
614
|
+
cnry doctor --project <project> --check 'traffic.source.*' --format json
|
|
615
|
+
cnry schedule show <project> --kind traffic-sync --format json
|
|
616
|
+
cnry schedule set <project> --kind traffic-sync \
|
|
617
|
+
--source <source-id> --cron "*/10 * * * *"
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
A first source becomes active automatically. A staged source stays paused until
|
|
621
|
+
the explicit activation command. Activation pauses sibling sources and moves the
|
|
622
|
+
one `traffic-sync` schedule for the project. Direct push rejects `traffic sync` and
|
|
623
|
+
does not use this schedule.
|
|
624
|
+
|
|
625
|
+
Queue pull drains at most 1,000 messages in one default sync. The doctor warns
|
|
626
|
+
when the remaining backlog is more than 1,000 messages. If the operator approves
|
|
627
|
+
a manual drain, run a manual sync. If the backlog recurs, get approval to shorten
|
|
628
|
+
the schedule interval.
|
|
629
|
+
|
|
630
|
+
Read the [server-side traffic guide](server-side-traffic.md) for token safety,
|
|
631
|
+
route checks, activation order, smoke tests, rollback, and troubleshooting.
|
|
632
|
+
|
|
566
633
|
## Google Analytics 4
|
|
567
634
|
|
|
568
635
|
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`.
|