@ainyc/canonry 3.2.7 → 3.3.3

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.
@@ -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 into coherent monitoring workflows with persistent memory and proactive regression response.
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
- ## Reference Playbooks
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
- Detailed playbooks (workflows, regression diagnosis, reporting templates, integrations) are bundled as separate docs. Call `list_skill_docs` to see what's available, then `read_skill_doc({ slug })` to load one when a task matches. Don't guess slugs — list first.
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
- ## Toolchain
56
-
57
- ### canonry (AEO Operating Platform)
58
- ```bash
59
- # List projects
60
- canonry project list
61
-
62
- # Run a sweep (all providers)
63
- canonry run <project> --wait
64
-
65
- # Check per‑phrase citation status
66
- canonry evidence <project>
67
-
68
- # Show latest run summary
69
- canonry status <project>
70
-
71
- # Add/remove keyphrases
72
- canonry keyword add <project> "polyurea roof coating"
73
- canonry keyword remove <project> "best roof coating for a warehouse"
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 hasnt run, say so
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 v1.37+, @ainyc/aeoaudit v1.3+
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 # connect GA4
260
- canonry ga disconnect <project> # disconnect
261
- canonry ga status <project> # connection status
262
- canonry ga sync <project> [--days 30] [--only traffic|ai|social] # pull GA4 data (selective or full)
263
- canonry ga traffic <project> # landing pages + AI/social referral sources
264
- canonry ga coverage <project> # indexed pages with traffic overlay
265
- canonry ga ai-referral-history <project> # daily AI referral history by source
266
- canonry ga social-referral-history <project> # daily social referral history by source
267
- canonry ga social-referral-summary <project> [--trend] # one-line social summary + optional trend
268
- canonry ga attribution <project> [--trend] # unified channel attribution overview + optional trends
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.