@ainyc/canonry 4.29.1 → 4.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-C4UBTDDS.js +302 -0
- package/assets/assets/{index-BnALDZI7.css → index-CNKAwZMB.css} +1 -1
- package/assets/index.html +2 -2
- package/dist/{chunk-GB3QJURO.js → chunk-5STLZRGB.js} +5 -3
- package/dist/{chunk-RLLFB3M3.js → chunk-HTNC6AWN.js} +44 -2
- package/dist/{chunk-HONTKYY7.js → chunk-PUTJHEVR.js} +130 -13
- package/dist/{chunk-UEV3HSRL.js → chunk-U3YKRV47.js} +1 -1
- package/dist/cli.js +55 -14
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-O6KB6YAM.js → intelligence-service-CJONZ7ST.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +9 -8
- package/assets/assets/index-DC2S5T9p.js +0 -302
|
@@ -14,7 +14,7 @@ Getting pages indexed fast is high-leverage AEO work. Unindexed pages are invisi
|
|
|
14
14
|
|
|
15
15
|
### Check coverage
|
|
16
16
|
```bash
|
|
17
|
-
|
|
17
|
+
cnry google coverage <project>
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
Statuses to act on:
|
|
@@ -24,43 +24,43 @@ Statuses to act on:
|
|
|
24
24
|
|
|
25
25
|
### Sync GSC data
|
|
26
26
|
```bash
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
cnry google sync <project> # incremental sync
|
|
28
|
+
cnry google sync <project> --full --wait # full re-sync
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
### Check search performance
|
|
32
32
|
```bash
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
cnry google performance <project> # default 28 days
|
|
34
|
+
cnry google performance <project> --days 90 --keyword "term"
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
### Discover and inspect sitemaps
|
|
38
38
|
```bash
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
cnry google discover-sitemaps <project> --wait # auto-discover sitemaps and queue inspection
|
|
40
|
+
cnry google list-sitemaps <project> # list submitted sitemaps
|
|
41
|
+
cnry google inspect-sitemap <project> --wait # bulk inspect all sitemap URLs
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
### Inspect individual URLs
|
|
45
45
|
```bash
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
cnry google inspect <project> <url> # inspect specific URL
|
|
47
|
+
cnry google inspections <project> # inspection history
|
|
48
|
+
cnry google inspections <project> --url <url> # filter by URL
|
|
49
|
+
cnry google deindexed <project> # pages that lost indexing
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
### Submit URLs to Google Indexing API
|
|
53
53
|
```bash
|
|
54
54
|
# Single URL
|
|
55
|
-
|
|
55
|
+
cnry google request-indexing <project> <url>
|
|
56
56
|
|
|
57
57
|
# All unindexed at once
|
|
58
|
-
|
|
58
|
+
cnry google request-indexing <project> --all-unindexed
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
**Requirements:**
|
|
62
62
|
- "Web Search Indexing API" enabled in the GCP project
|
|
63
|
-
- OAuth connection set up in canonry (`
|
|
63
|
+
- OAuth connection set up in canonry (`cnry settings` shows Google connection)
|
|
64
64
|
- Officially intended for JobPosting/BroadcastEvent schema; in practice Google processes all URLs
|
|
65
65
|
|
|
66
66
|
**After submitting:** Check coverage again after 48h. Once indexed, run a sweep — pages must be indexed before citation is possible.
|
|
@@ -71,37 +71,37 @@ canonry google request-indexing <project> --all-unindexed
|
|
|
71
71
|
|
|
72
72
|
### One-time setup
|
|
73
73
|
```bash
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
cnry bing connect <project> --api-key <key>
|
|
75
|
+
cnry bing set-site <project> https://example.com/
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
Get API key from: https://www.bing.com/webmasters/ → Settings → API Access
|
|
79
79
|
|
|
80
80
|
### Check connection and coverage
|
|
81
81
|
```bash
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
cnry bing status <project>
|
|
83
|
+
cnry bing coverage <project>
|
|
84
|
+
cnry bing performance <project>
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
### Inspect URLs
|
|
88
88
|
```bash
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
cnry bing inspect <project> <url>
|
|
90
|
+
cnry bing inspections <project>
|
|
91
91
|
```
|
|
92
92
|
|
|
93
93
|
### Inspect every URL in your sitemap
|
|
94
94
|
```bash
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
cnry bing inspect-sitemap <project> # default https://<domain>/sitemap.xml
|
|
96
|
+
cnry bing inspect-sitemap <project> --sitemap-url <url> # explicit sitemap or sitemap index
|
|
97
|
+
cnry bing inspect-sitemap <project> --wait # block until the run finishes
|
|
98
98
|
```
|
|
99
99
|
Bing has no native sitemap inspection API — this command fetches the sitemap, diffs against the tracked URL set, then calls `GetUrlInfo` for each discovered URL so coverage reflects the full sitemap rather than only previously inspected pages.
|
|
100
100
|
|
|
101
101
|
### Submit URLs for indexing
|
|
102
102
|
```bash
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
cnry bing request-indexing <project> <url>
|
|
104
|
+
cnry bing request-indexing <project> --all-unindexed
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
### Submit sitemap (manual, one-time)
|
|
@@ -143,20 +143,20 @@ Expected response: `202 Accepted`
|
|
|
143
143
|
|---|---|
|
|
144
144
|
| Get pages into ChatGPT / Perplexity / Claude | Google Indexing API |
|
|
145
145
|
| Get pages into Copilot / Bing AI | IndexNow + Bing WMT |
|
|
146
|
-
| Audit what Google currently knows | `
|
|
147
|
-
| Audit what Bing currently knows | `
|
|
146
|
+
| Audit what Google currently knows | `cnry google coverage <project>` |
|
|
147
|
+
| Audit what Bing currently knows | `cnry bing coverage <project>` |
|
|
148
148
|
| Fast crawl of new/updated pages on Bing | IndexNow batch submit |
|
|
149
|
-
| Ongoing Google crawl health | `
|
|
150
|
-
| Ongoing Bing crawl health | Bing WMT sitemap + `
|
|
151
|
-
| Find deindexed pages | `
|
|
149
|
+
| Ongoing Google crawl health | `cnry google sync` + `cnry google performance` |
|
|
150
|
+
| Ongoing Bing crawl health | Bing WMT sitemap + `cnry bing performance` |
|
|
151
|
+
| Find deindexed pages | `cnry google deindexed <project>` |
|
|
152
152
|
|
|
153
153
|
---
|
|
154
154
|
|
|
155
155
|
## General Workflow for New Client Pages
|
|
156
156
|
|
|
157
|
-
1. `
|
|
158
|
-
2. `
|
|
159
|
-
3. `
|
|
157
|
+
1. `cnry google coverage <project>` — identify unindexed pages
|
|
158
|
+
2. `cnry google request-indexing <project> --all-unindexed` — push to Google
|
|
159
|
+
3. `cnry bing request-indexing <project> --all-unindexed` — push to Bing
|
|
160
160
|
4. Submit sitemap to Bing WMT (manual, one-time per site)
|
|
161
161
|
5. Send IndexNow batch for key URLs
|
|
162
162
|
6. Re-check coverage after 48h
|
|
@@ -45,13 +45,13 @@ Future adapters slot in by implementing the same contract.
|
|
|
45
45
|
# 1. Create a service account in the Cloud project that hosts the Cloud Run
|
|
46
46
|
# service. Grant it `roles/logging.viewer`. Download the JSON key.
|
|
47
47
|
|
|
48
|
-
# 2. Connect from
|
|
49
|
-
|
|
48
|
+
# 2. Connect from cnry CLI:
|
|
49
|
+
cnry traffic connect cloud-run <project> \
|
|
50
50
|
--gcp-project <gcp-project-id> \
|
|
51
51
|
--service-account-key <path/to/key.json>
|
|
52
52
|
|
|
53
53
|
# 3. (Optional) narrow to a specific service or location:
|
|
54
|
-
|
|
54
|
+
cnry traffic connect cloud-run <project> \
|
|
55
55
|
--gcp-project <id> \
|
|
56
56
|
--service-account-key <path> \
|
|
57
57
|
--service my-service-name \
|
|
@@ -59,7 +59,7 @@ canonry traffic connect cloud-run <project> \
|
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
Credentials are stored in `~/.canonry/config.yaml` (not the DB). The
|
|
62
|
-
canonical key lives only on the host that runs `
|
|
62
|
+
canonical key lives only on the host that runs `cnry serve`. The
|
|
63
63
|
sync flow does NOT echo the private key back in any response.
|
|
64
64
|
|
|
65
65
|
## Connecting a WordPress source
|
|
@@ -82,8 +82,8 @@ exposes a paginated REST endpoint protected by an Application Password.
|
|
|
82
82
|
# 7–365 days; default is 90. The page also shows the current event
|
|
83
83
|
# count and the oldest event timestamp.
|
|
84
84
|
|
|
85
|
-
# 4. Connect from
|
|
86
|
-
|
|
85
|
+
# 4. Connect from cnry CLI:
|
|
86
|
+
cnry traffic connect wordpress <project> \
|
|
87
87
|
--url https://example.com \
|
|
88
88
|
--username admin \
|
|
89
89
|
--app-password "xxxx xxxx xxxx xxxx xxxx xxxx"
|
|
@@ -109,10 +109,10 @@ window change it in `Settings → Canonry Traffic Logger`.
|
|
|
109
109
|
```bash
|
|
110
110
|
# Manual sync — defaults to a 30-day lookback on the first run; subsequent
|
|
111
111
|
# runs are clamped forward to lastSyncedAt to avoid re-pulling.
|
|
112
|
-
|
|
112
|
+
cnry traffic sync <project> --source <id>
|
|
113
113
|
|
|
114
114
|
# Override the lookback window (minutes):
|
|
115
|
-
|
|
115
|
+
cnry traffic sync <project> --source <id> --since-minutes 4320 # 3 days
|
|
116
116
|
```
|
|
117
117
|
|
|
118
118
|
Cross-sync dedupe via the `last_event_ids` ring buffer means re-running a
|
|
@@ -123,14 +123,14 @@ hits. Safe to schedule (see "Scheduling" below) or trigger from CI.
|
|
|
123
123
|
|
|
124
124
|
```bash
|
|
125
125
|
# All sources with last-24h totals + latest sync run (single-call):
|
|
126
|
-
|
|
126
|
+
cnry traffic status <project> --format json
|
|
127
127
|
|
|
128
128
|
# Just the source list:
|
|
129
|
-
|
|
129
|
+
cnry traffic sources <project> --format json
|
|
130
130
|
|
|
131
131
|
# Windowed events (defaults to last 24h):
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
cnry traffic events <project> --kind crawler --limit 200 --format json
|
|
133
|
+
cnry traffic events <project> --kind ai-referral --since 2026-04-01 --until 2026-04-30
|
|
134
134
|
```
|
|
135
135
|
|
|
136
136
|
The `traffic status` composite returns the same per-source detail
|
|
@@ -144,8 +144,8 @@ MCP `canonry_traffic_status` tool.
|
|
|
144
144
|
|---|---|
|
|
145
145
|
| Project dashboard `/projects/:name/activity` | Live source table + 24h totals + GA4 referrals (combined view) |
|
|
146
146
|
| Top-level `/traffic` route | Cross-project source admin (connect, sync, archive) |
|
|
147
|
-
| `
|
|
148
|
-
| `
|
|
147
|
+
| `cnry report <project>` (HTML + SPA) | "AI Visibility — Server-Side" section, ranked above Indexing Health |
|
|
148
|
+
| `cnry doctor --project <name>` | `traffic.source.connected`, `recent-data`, `credentials`, `scopes` checks |
|
|
149
149
|
| MCP toolkit `traffic` | Tools: `canonry_traffic_status`, `_sources_list`, `_source_get`, `_events`, `_connect_cloud_run`, `_sync` |
|
|
150
150
|
|
|
151
151
|
## Doctor signals
|
|
@@ -154,15 +154,15 @@ The doctor checks are adapter-agnostic. When they fail or warn:
|
|
|
154
154
|
|
|
155
155
|
| Check | Code | What to do |
|
|
156
156
|
|---|---|---|
|
|
157
|
-
| `traffic.source.connected` | `traffic.source.none` | No source — `
|
|
157
|
+
| `traffic.source.connected` | `traffic.source.none` | No source — `cnry traffic connect cloud-run …` |
|
|
158
158
|
| `traffic.source.connected` | `traffic.source.all-errored` | Re-connect the source. The check's `details.lastError` shows the underlying reason. |
|
|
159
|
-
| `traffic.source.recent-data` | `traffic.recent-data.stale` | Last sync was >7d ago. Run `
|
|
160
|
-
| `traffic.source.recent-data` | `traffic.recent-data.empty` | Source connected but no data in 30d. Verify config and credentials with `
|
|
159
|
+
| `traffic.source.recent-data` | `traffic.recent-data.stale` | Last sync was >7d ago. Run `cnry traffic sync …` or schedule a recurring sync. |
|
|
160
|
+
| `traffic.source.recent-data` | `traffic.recent-data.empty` | Source connected but no data in 30d. Verify config and credentials with `cnry traffic sources <project>`. |
|
|
161
161
|
| `traffic.source.credentials` | `traffic.credentials.resolve-failed` | Service-account key in `~/.canonry/config.yaml` is invalid or expired. Re-connect. |
|
|
162
162
|
|
|
163
163
|
## Scheduling
|
|
164
164
|
|
|
165
|
-
`
|
|
165
|
+
`cnry schedule` supports `--kind traffic-sync`. Recurring syncs are
|
|
166
166
|
safe because of the `last_event_ids` cross-sync dedupe ring buffer
|
|
167
167
|
described above. Recommended cadence:
|
|
168
168
|
|
|
@@ -6,16 +6,16 @@ Canonry integrates with WordPress through the core REST API plus Application Pas
|
|
|
6
6
|
|
|
7
7
|
- Read and write page content, titles, slugs, and status
|
|
8
8
|
- Audit pages for `noindex`, missing SEO title, missing meta description, missing schema, and thin content
|
|
9
|
-
- Compare live vs staging for a page with `
|
|
9
|
+
- Compare live vs staging for a page with `cnry wordpress diff`
|
|
10
10
|
- Update SEO meta when the site exposes writable REST meta fields
|
|
11
11
|
|
|
12
12
|
## What Stays Manual
|
|
13
13
|
|
|
14
14
|
Canonry generates payloads and instructions for these workflows, but it does not apply them remotely:
|
|
15
15
|
|
|
16
|
-
- `
|
|
17
|
-
- `
|
|
18
|
-
- `
|
|
16
|
+
- `cnry wordpress set-schema`
|
|
17
|
+
- `cnry wordpress set-llms-txt`
|
|
18
|
+
- `cnry wordpress staging push`
|
|
19
19
|
|
|
20
20
|
Expect those commands to return:
|
|
21
21
|
|
|
@@ -39,13 +39,13 @@ Env-sensitive commands accept `--live` or `--staging`. If neither is provided, c
|
|
|
39
39
|
## Typical Workflow
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
cnry wordpress connect mysite --url https://example.com --user admin --staging-url https://staging.example.com --default-env staging
|
|
43
|
+
cnry wordpress pages mysite --staging
|
|
44
|
+
cnry wordpress page mysite pricing --staging
|
|
45
|
+
cnry wordpress set-meta mysite pricing --title "SEO title" --description "Meta description" --staging
|
|
46
|
+
cnry wordpress audit mysite --staging
|
|
47
|
+
cnry wordpress diff mysite pricing
|
|
48
|
+
cnry wordpress staging push mysite
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
## Important Constraints
|