@ainyc/canonry 3.2.7 → 3.3.2
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 +16 -4
- package/assets/agent-workspace/skills/canonry-setup/SKILL.md +30 -149
- package/assets/agent-workspace/skills/canonry-setup/references/aeo-analysis.md +15 -0
- package/assets/agent-workspace/skills/canonry-setup/references/canonry-cli.md +29 -11
- package/assets/assets/{index-BJz9S5-O.js → index-C1kUp1aS.js} +67 -67
- package/assets/index.html +1 -1
- package/dist/{chunk-GY4MNUTI.js → chunk-ALMP3NBQ.js} +72 -62
- package/dist/{chunk-7R5NSWF7.js → chunk-HQ47AA6H.js} +1 -1
- package/dist/cli.js +389 -57
- package/dist/index.js +2 -2
- package/dist/mcp.js +1 -1
- package/package.json +6 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: aero
|
|
3
3
|
slug: aero
|
|
4
|
-
description: AEO analyst orchestration — coordinates canonry sweeps and aeo-audit analysis
|
|
4
|
+
description: AEO analyst orchestration — coordinates canonry sweeps and aeo-audit analysis with persistent memory and proactive regression response.
|
|
5
5
|
homepage: https://ainyc.ai
|
|
6
6
|
repository: https://github.com/AINYC/aero
|
|
7
7
|
---
|
|
@@ -9,11 +9,13 @@ repository: https://github.com/AINYC/aero
|
|
|
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). Query it with `canonry <command> --format json`; 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**). Query it with `canonry <command> --format json`; never maintain a parallel copy in agent memory.
|
|
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 `canonry ga traffic` / `canonry ga attribution --trend` for the current snapshot, `canonry ga ai-referral-history` and `canonry ga social-referral-history` for daily series. Reads query a local DB synced by `canonry ga sync` — confirm `canonry 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-setup/references/canonry-cli.md` (look for the "Google Analytics 4" section).
|
|
18
|
+
|
|
17
19
|
## Judgment Rules
|
|
18
20
|
|
|
19
21
|
### What to Prioritize
|
|
@@ -35,6 +37,16 @@ Persist only *user-scoped* context (operator preferences, communication style) i
|
|
|
35
37
|
- Be specific: "You lost the ChatGPT citation for 'roof repair phoenix' between March 28-April 2" not "your visibility decreased"
|
|
36
38
|
- Action-oriented: every observation ends with a recommended next step
|
|
37
39
|
|
|
38
|
-
##
|
|
40
|
+
## References
|
|
41
|
+
|
|
42
|
+
Detailed playbooks live alongside this file. Read them on demand when the task matches:
|
|
43
|
+
|
|
44
|
+
| File | Read when |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `references/orchestration.md` | Planning a multi-step or recurring workflow (baseline, weekly review, content-gap analysis) |
|
|
47
|
+
| `references/regression-playbook.md` | A keyword lost its citation and you need to triage and respond |
|
|
48
|
+
| `references/memory-patterns.md` | Deciding whether to remember a fact in agent memory or re-query canonry |
|
|
49
|
+
| `references/reporting.md` | Producing a client-facing weekly or monthly summary |
|
|
50
|
+
| `references/wordpress-elementor-mcp.md` | Editing WordPress pages with the Elementor MCP integration |
|
|
39
51
|
|
|
40
|
-
|
|
52
|
+
Aero (canonry's built-in agent) additionally exposes `list_skill_docs` / `read_skill_doc` MCP tools that walk this directory programmatically. External agents (Claude Code, Codex) should `Read` the files directly.
|
|
@@ -52,163 +52,44 @@ Agent-first open-source AEO (Answer Engine Optimization) operating platform. Tra
|
|
|
52
52
|
- **Signal over noise** — Focus on high‑intent queries; avoid granular targeting until base visibility exists
|
|
53
53
|
- **CLI‑native** — API‑driven changes over manual CMS clicks; faster, repeatable, auditable
|
|
54
54
|
|
|
55
|
-
##
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
canonry
|
|
74
|
-
|
|
75
|
-
# Submit URLs to Bing
|
|
76
|
-
canonry bing request-indexing <project> <url>
|
|
77
|
-
|
|
78
|
-
# Submit to Google Indexing API
|
|
79
|
-
canonry google request-indexing <project> <url>
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### aeo-audit (Technical SEO Analysis)
|
|
83
|
-
```bash
|
|
84
|
-
# Run audit (JSON output)
|
|
85
|
-
npx @ainyc/aeo-audit@latest "https://example.com" --format json
|
|
86
|
-
|
|
87
|
-
# 14‑factor scoring includes:
|
|
88
|
-
# - Structured Data (JSON‑LD)
|
|
89
|
-
# - Content Depth
|
|
90
|
-
# - AI‑Readable Content (llms.txt, llms‑full.txt)
|
|
91
|
-
# - E‑E‑A‑T Signals
|
|
92
|
-
# - FAQ Content
|
|
93
|
-
# - Citations & Authority Signals
|
|
94
|
-
# - Definition Blocks
|
|
95
|
-
# - Technical SEO (H1, alt text, meta)
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Google Search Console / Bing WMT
|
|
99
|
-
```bash
|
|
100
|
-
# GSC coverage summary
|
|
101
|
-
canonry google coverage <project>
|
|
102
|
-
|
|
103
|
-
# Bing coverage summary
|
|
104
|
-
canonry bing coverage <project>
|
|
105
|
-
|
|
106
|
-
# Force refresh cached data
|
|
107
|
-
canonry google refresh <project>
|
|
108
|
-
canonry bing refresh <project>
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Workflow
|
|
112
|
-
|
|
113
|
-
### 1. Diagnose
|
|
114
|
-
```bash
|
|
115
|
-
# Baseline AEO visibility
|
|
116
|
-
canonry run <project> --wait
|
|
117
|
-
canonry evidence <project>
|
|
118
|
-
|
|
119
|
-
# Technical SEO audit
|
|
120
|
-
npx @ainyc/aeo-audit@latest "https://client.com" --format json > audit.json
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### 2. Prioritize
|
|
124
|
-
Gaps sorted by impact:
|
|
125
|
-
1. **Missing H1** → immediate content patch
|
|
126
|
-
2. **No structured data** → JSON‑LD injection
|
|
127
|
-
3. **Thin content** → definition blocks ("What is…")
|
|
128
|
-
4. **County‑level targeting** → refine after base visibility
|
|
129
|
-
5. **E‑E‑A‑T signals** → Person schema, author tags (needs client input)
|
|
130
|
-
|
|
131
|
-
### 3. Execute
|
|
132
|
-
- **Schema injection**: LocalBusiness + FAQPage JSON‑LD via site‑appropriate method (Elementor Custom Code, theme hooks, etc.)
|
|
133
|
-
- **Content patches**: H1, meta title/description, image alt text via REST API or CMS
|
|
134
|
-
- **AI‑readable files**: Upload `llms.txt`, `llms‑full.txt` to site root
|
|
135
|
-
- **Indexing requests**: Submit all URLs to Google Indexing API + Bing IndexNow
|
|
136
|
-
- **Keyphrase strategy**: Trim to 8‑12 high‑intent queries; remove noise
|
|
137
|
-
|
|
138
|
-
### 4. Monitor
|
|
139
|
-
- Weekly canonry sweeps to track citation changes
|
|
140
|
-
- Correlate visibility shifts with deployment dates
|
|
141
|
-
- Watch for competitor displacement in keyphrases
|
|
142
|
-
|
|
143
|
-
### 5. Report
|
|
144
|
-
Clear, data‑first summaries:
|
|
145
|
-
> “Lost `emergency dentist brooklyn` on Gemini — two competitors moved in. Here’s what to fix.”
|
|
146
|
-
|
|
147
|
-
## Common Patterns
|
|
148
|
-
|
|
149
|
-
### New Site (0 citations)
|
|
150
|
-
- Focus on indexing first: submit sitemap to GSC/Bing, request indexing
|
|
151
|
-
- Implement base schema (LocalBusiness, Service)
|
|
152
|
-
- Create `llms.txt` with service‑area details
|
|
153
|
-
- Trim keyphrases to 8‑12 core queries
|
|
154
|
-
- Expect 4‑8 weeks for first citations
|
|
155
|
-
|
|
156
|
-
### Established Site (regression)
|
|
157
|
-
- Compare canonry runs to identify when loss occurred
|
|
158
|
-
- Check for recent competitor content or site changes
|
|
159
|
-
- Validate schema is still present and error‑free
|
|
160
|
-
- Re‑submit affected URLs to indexing APIs
|
|
161
|
-
|
|
162
|
-
### County‑Level Targeting
|
|
163
|
-
```yaml
|
|
164
|
-
# Service areas in llms.txt / schema
|
|
165
|
-
Michigan:
|
|
166
|
-
- Oakland County (Troy, Auburn Hills, Pontiac)
|
|
167
|
-
- Macomb County (Sterling Heights, Shelby Township)
|
|
168
|
-
- Wayne County (Detroit, Dearborn)
|
|
169
|
-
- Lapeer County (HQ: Almont)
|
|
170
|
-
|
|
171
|
-
Florida:
|
|
172
|
-
- Miami‑Dade County (Miami, Coral Gables)
|
|
173
|
-
- Broward County (Fort Lauderdale, Hollywood)
|
|
174
|
-
- Palm Beach County (West Palm Beach, Boca Raton)
|
|
175
|
-
```
|
|
176
|
-
- Reference counties in schema `areaServed` and `llms.txt`
|
|
177
|
-
- **Do not** create separate keyphrases per county until base visibility exists
|
|
178
|
-
|
|
179
|
-
### WordPress/Elementor Specifics
|
|
180
|
-
- REST API user with Application Passwords (`/wp‑json/wp/v2/`)
|
|
181
|
-
- Elementor data patched via `_elementor_data` meta field
|
|
182
|
-
- Schema injection via Elementor Pro Custom Code (`elementor_snippet` CPT)
|
|
183
|
-
- Yoast SEO title/description fields often NOT REST‑writable → manual WP Admin edit
|
|
184
|
-
- `wp‑login.php` may be hidden (security plugin) → file uploads require manual WP File Manager
|
|
185
|
-
|
|
186
|
-
## Example: Full AEO Audit + Action Plan
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
# 1. Audit
|
|
190
|
-
npx @ainyc/aeo-audit@latest "https://client.com" --format json > audit.json
|
|
191
|
-
|
|
192
|
-
# 2. Parse score
|
|
193
|
-
cat audit.json | jq '.overallScore, .overallGrade'
|
|
194
|
-
|
|
195
|
-
# 3. Check AEO baseline
|
|
196
|
-
canonry status client-project
|
|
197
|
-
canonry evidence client-project
|
|
198
|
-
|
|
199
|
-
# 4. Generate action list
|
|
200
|
-
cat audit.json | jq -r '.factors[] | select(.score < 70) | "- \(.name): \(.score)/100 (\(.grade)) - \(.recommendations[0])"'
|
|
201
|
-
```
|
|
55
|
+
## How to Operate
|
|
56
|
+
|
|
57
|
+
A canonry engagement follows the same loop regardless of project size:
|
|
58
|
+
|
|
59
|
+
1. **Diagnose** — Run a baseline sweep (`canonry run <project> --wait`) and a technical audit (`npx @ainyc/aeo-audit@latest <url> --format json`). See `references/aeo-analysis.md` for interpretation.
|
|
60
|
+
2. **Prioritize** — Triage by impact: indexing gaps → schema gaps → content gaps → keyphrase strategy. Branded-term losses are urgent.
|
|
61
|
+
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.
|
|
62
|
+
4. **Monitor** — Re-run sweeps weekly. Correlate visibility shifts with deployments and competitor moves.
|
|
63
|
+
5. **Report** — Lead with data, not interpretation: "Lost `<keyword>` on Gemini between <date> and <date> — two competitors moved in. Here's what to fix."
|
|
64
|
+
|
|
65
|
+
## Common Starting Points
|
|
66
|
+
|
|
67
|
+
- **New site, 0 citations** → submit to GSC/Bing first; basic LocalBusiness/Service schema; `llms.txt`; trim to 8–12 high-intent keyphrases. See `references/indexing.md`.
|
|
68
|
+
- **Established site, regression** → diff canonry runs to find the loss window; verify schema is intact; resubmit affected URLs. See `references/aeo-analysis.md`.
|
|
69
|
+
- **Multi-county targeting** → reference counties in `areaServed` schema and `llms.txt`; do not split into per-county keyphrases until base visibility exists.
|
|
70
|
+
|
|
71
|
+
## Google Analytics 4
|
|
72
|
+
|
|
73
|
+
GA4 is a first-class signal alongside citation tracking. Connect once with `canonry ga connect <project> --property-id <id> --key-file <path>`; `canonry 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 `canonry ga traffic` for the current snapshot, `canonry ga attribution --trend` for a unified channel-share overview with biggest-mover deltas, and `canonry ga ai-referral-history` / `canonry ga social-referral-history` for daily series. See `references/canonry-cli.md` for the full command catalog and return-shape details.
|
|
202
74
|
|
|
203
75
|
## Boundaries & Safety
|
|
204
76
|
|
|
205
77
|
- **Never touch live WordPress without explicit approval**
|
|
206
78
|
- **Back up `~/.canonry/config.yaml` before any config edit**
|
|
207
|
-
- **Never fabricate citation data** — if a sweep hasn
|
|
79
|
+
- **Never fabricate citation data** — if a sweep hasn't run, say so
|
|
208
80
|
- **Client data stays private** — canonry repo is public; no real domains in issues
|
|
209
81
|
- **Respect API rate limits** — batch operations, avoid tight loops
|
|
210
82
|
|
|
83
|
+
## References
|
|
84
|
+
|
|
85
|
+
| File | Read when |
|
|
86
|
+
|---|---|
|
|
87
|
+
| `references/canonry-cli.md` | Looking up specific canonry commands or flags |
|
|
88
|
+
| `references/aeo-analysis.md` | Interpreting sweep output, diagnosing regressions, planning content fixes |
|
|
89
|
+
| `references/indexing.md` | Submitting URLs, checking GSC/Bing coverage, fixing indexing gaps |
|
|
90
|
+
| `references/wordpress-integration.md` | Connecting to WordPress, editing pages, pushing staging → live |
|
|
91
|
+
|
|
211
92
|
---
|
|
212
93
|
|
|
213
|
-
**Tools:** canonry
|
|
94
|
+
**Tools:** canonry v3+, @ainyc/aeo-audit v1.3+
|
|
214
95
|
**Website:** [ainyc.ai](https://ainyc.ai) | **Reference:** [AINYC AEO Methodology](https://ainyc.ai/aeo-methodology)
|
|
@@ -81,6 +81,21 @@ canonry analytics <project> --feature gaps --window 30d
|
|
|
81
81
|
```
|
|
82
82
|
Look for patterns: are gaps growing or shrinking? Are new competitors appearing?
|
|
83
83
|
|
|
84
|
+
### Step 6: Check GA4 traffic for impact
|
|
85
|
+
A lost citation isn't always a lost user. Before declaring a regression real, confirm whether AI-referral traffic actually fell on the same window:
|
|
86
|
+
```bash
|
|
87
|
+
canonry ga status <project> # confirm lastSyncedAt is recent; re-sync if stale
|
|
88
|
+
canonry ga ai-referral-history <project> --format json
|
|
89
|
+
# daily {date, source, medium, attribution, sessions, users}
|
|
90
|
+
canonry ga attribution <project> --trend # 7d/30d direction per channel + biggest mover
|
|
91
|
+
```
|
|
92
|
+
Read the result against the citation loss window:
|
|
93
|
+
- **AI sessions flat or up** → the citation loss may be sweep-side noise (provider variance, query refresh). Track for one more cycle before alarming the client.
|
|
94
|
+
- **AI sessions dropped on the same date** → real outage; escalate. Cross-reference `aiReferrals[]` from `canonry ga traffic` to identify which provider lost traffic.
|
|
95
|
+
- **Organic dropped but AI held** → the citation loss is masking a separate indexing issue. Re-run Step 1.
|
|
96
|
+
|
|
97
|
+
GA4 also covers the inverse case: a *gain* on `attribution --trend` for the AI channel that isn't reflected in citation count usually means a provider expanded an existing citation's exposure (more queries triggering it) — a quiet win worth flagging in the next report.
|
|
98
|
+
|
|
84
99
|
## Trend Interpretation
|
|
85
100
|
|
|
86
101
|
**Stable cited** — monitor for regressions, no action needed.
|
|
@@ -253,21 +253,39 @@ canonry wordpress onboard <project> --url <url> --user <user> # full onboarding
|
|
|
253
253
|
|
|
254
254
|
## Google Analytics 4
|
|
255
255
|
|
|
256
|
-
GA4 integration uses service account authentication (no OAuth). The service account must have Viewer access on the GA4 property.
|
|
256
|
+
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`.
|
|
257
257
|
|
|
258
258
|
```bash
|
|
259
|
-
canonry ga connect <project> --property-id <id> --key-file ./sa-key.json
|
|
260
|
-
|
|
261
|
-
canonry ga
|
|
262
|
-
canonry ga
|
|
263
|
-
canonry ga
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
canonry ga
|
|
268
|
-
|
|
259
|
+
canonry ga connect <project> --property-id <id> --key-file ./sa-key.json
|
|
260
|
+
# connect via service account (auth method = service_account)
|
|
261
|
+
canonry ga disconnect <project> # disconnect; deletes all synced rows for the project
|
|
262
|
+
canonry ga status <project> # connected, propertyId, authMethod, lastSyncedAt
|
|
263
|
+
canonry ga sync <project> [--days 30] [--only traffic|ai|social]
|
|
264
|
+
# refresh from GA4 → DB; --only restricts which slice is replaced
|
|
265
|
+
# returns: synced, rowCount, aiReferralCount, socialReferralCount,
|
|
266
|
+
# syncedComponents, syncedAt
|
|
267
|
+
canonry ga traffic <project> # current-period rollup; returns: totalSessions,
|
|
268
|
+
# totalOrganicSessions/totalDirectSessions/totalUsers,
|
|
269
|
+
# organicSharePct/aiSharePct/socialSharePct/directSharePct,
|
|
270
|
+
# topPages[], aiReferrals[], aiReferralLandingPages[],
|
|
271
|
+
# aiSessionsDeduped, aiUsersBySession, socialReferrals[]
|
|
272
|
+
canonry ga attribution <project> [--trend] # unified channel breakdown (organic / ai / social / direct
|
|
273
|
+
# sessions + raw and display share %s); --trend adds 7d/30d
|
|
274
|
+
# direction per channel + biggest mover
|
|
275
|
+
canonry ga ai-referral-history <project> # daily array of {date, source, medium, attribution,
|
|
276
|
+
# sessions, users}; one row per (day × source × dimension)
|
|
277
|
+
canonry ga social-referral-history <project> # daily array of {date, source, medium, channel,
|
|
278
|
+
# sessions, users}; channel ∈ {Organic Social, Paid Social}
|
|
279
|
+
canonry ga social-referral-summary <project> [--trend]
|
|
280
|
+
# one-line social rollup: socialSessions, socialUsers,
|
|
281
|
+
# socialSharePct, topSources[]; --trend adds 7d/30d direction
|
|
282
|
+
canonry ga session-history <project> # daily totals: {date, sessions, organicSessions, users}
|
|
283
|
+
canonry ga coverage <project> # per-page overlay: {landingPage, sessions,
|
|
284
|
+
# organicSessions, users}
|
|
269
285
|
```
|
|
270
286
|
|
|
287
|
+
Every read command queries persisted DB rows, so a stale `lastSyncedAt` means the response is stale — always check `ga status` before drawing conclusions, and re-`ga sync` if the data is older than the analysis window. Use `--only ai` or `--only social` to refresh just one slice when iterating.
|
|
288
|
+
|
|
271
289
|
## Backlinks (Common Crawl)
|
|
272
290
|
|
|
273
291
|
Workspace-level Common Crawl release sync + per-project backlink extraction. Requires DuckDB; install once with `canonry backlinks install`. Releases are downloaded once per workspace and reused across all projects.
|