@ainyc/canonry 1.46.1 → 1.48.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Canonry <img src="apps/web/public/favicon-32.png" alt="Canonry canary icon" width="24" />
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/@ainyc/canonry)](https://www.npmjs.com/package/@ainyc/canonry) [![License: FSL-1.1-ALv2](https://img.shields.io/badge/License-FSL--1.1--ALv2-blue.svg)](https://fsl.software/) [![Node.js >= 20](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org)
3
+ [![npm version](https://img.shields.io/npm/v/@ainyc/canonry)](https://www.npmjs.com/package/@ainyc/canonry) [![License: FSL-1.1-ALv2](https://img.shields.io/badge/License-FSL--1.1--ALv2-blue.svg)](https://fsl.software/) [![Node.js >= 22.14](https://img.shields.io/badge/node-%3E%3D22.14-brightgreen)](https://nodejs.org)
4
4
 
5
5
  Canonry is an agent-first AEO platform powered by [OpenClaw](https://openclaw.ai). It tracks how ChatGPT, Gemini, Claude, and Perplexity cite your site, detects regressions, diagnoses causes, coordinates fixes, and reports results.
6
6
 
@@ -107,15 +107,30 @@ canonry apply project-a.yaml project-b.yaml
107
107
  ## API
108
108
 
109
109
  All endpoints under `/api/v1/`. Authenticate with `Authorization: Bearer cnry_...`.
110
-
111
- | Method | Path | Description |
112
- |--------|------|-------------|
113
- | `PUT` | `/api/v1/projects/{name}` | Create or update a project |
114
- | `POST` | `/api/v1/projects/{name}/runs` | Trigger a visibility sweep |
115
- | `GET` | `/api/v1/projects/{name}/timeline` | Per-keyword citation history |
116
- | `GET` | `/api/v1/projects/{name}/snapshots/diff` | Compare two runs |
117
- | `POST` | `/api/v1/apply` | Config-as-code apply |
118
- | `GET` | `/api/v1/openapi.json` | OpenAPI spec (no auth required) |
110
+ The canonical, always-up-to-date surface is served at `GET /api/v1/openapi.json` (no auth required).
111
+
112
+ Canonry is **agent-first** — every dashboard view has a matching API endpoint and CLI command. The surface is grouped by domain:
113
+
114
+ | Domain | What it covers | Highlights |
115
+ |--------|----------------|------------|
116
+ | **Projects** | Create, read, update, delete projects; locations; export | `PUT /projects/{name}`, `GET /projects`, `GET /projects/{name}/export` |
117
+ | **Apply** | Config-as-code — declarative multi-project upsert | `POST /apply` |
118
+ | **Keywords / Competitors** | Per-project keyword and competitor management | `POST/DELETE /projects/{name}/keywords`, `/competitors` |
119
+ | **Runs** | Trigger, list, cancel, and inspect visibility sweeps | `POST /projects/{name}/runs`, `GET /runs`, `POST /runs/{id}/cancel` |
120
+ | **Schedules** | Cron-based recurring sweeps | `GET/PUT /projects/{name}/schedule` |
121
+ | **History / Snapshots** | Timeline + run diffs + per-keyword citation state | `GET /projects/{name}/timeline`, `/snapshots/diff`, `/history` |
122
+ | **Intelligence** | DB-backed insights + health snapshots + dismissal | `GET /projects/{name}/insights`, `/health`, `POST /insights/{id}/dismiss` |
123
+ | **Notifications** | Webhook subscriptions per project (agent or user-defined) | `GET/POST/DELETE /projects/{name}/notifications`, `POST /.../test` |
124
+ | **Analytics** | Aggregated dashboard analytics | `GET /projects/{name}/analytics` |
125
+ | **Google (GSC + OAuth)** | Search Console integration, OAuth flow, property selection, URL inspection | `/google/*`, `/projects/{name}/google/*` |
126
+ | **Google Analytics (GA4)** | Traffic, social referrals, attribution, AI referrals | `/projects/{name}/ga/*` |
127
+ | **Bing Webmaster** | Coverage, URL inspection, keyword stats | `/projects/{name}/bing/*` |
128
+ | **WordPress** | Content publishing + site management integration | `/projects/{name}/wordpress/*` |
129
+ | **CDP (ChatGPT browser provider)** | Chrome DevTools Protocol health and session status | `/cdp/*` |
130
+ | **Settings / Auth / Telemetry** | Server config, API key management, opt-in telemetry | `/settings`, `/telemetry` |
131
+ | **OpenAPI** | Full spec | `GET /openapi.json` *(no auth)* |
132
+
133
+ For the complete list of ~118 endpoints with request/response schemas, query `GET /api/v1/openapi.json` or browse the per-domain route handlers under [`packages/api-routes/src/`](packages/api-routes/src/).
119
134
 
120
135
  ## Provider Setup
121
136
 
@@ -162,7 +177,7 @@ Create a Web Service with runtime Docker, attach a disk at `/data`. Health check
162
177
 
163
178
  ## Requirements
164
179
 
165
- - Node.js >= 20
180
+ - Node.js >= 22.14.0
166
181
  - At least one provider API key (configurable after startup)
167
182
 
168
183
  If `npm install` fails with `node-gyp` errors, install build tools for `better-sqlite3`: `xcode-select --install` (macOS), `apt-get install python3 make g++` (Debian), or see the [troubleshooting guide](https://github.com/WiseLibs/better-sqlite3/blob/master/docs/troubleshooting.md).
@@ -0,0 +1,89 @@
1
+ # Aero Agent -- Operational Guidelines
2
+
3
+ ## Data Access
4
+
5
+ All data access goes through the canonry CLI. Never read the SQLite database directly.
6
+
7
+ ```bash
8
+ # Always use --format json for structured output
9
+ canonry <command> --format json
10
+ ```
11
+
12
+ The canonry server must be running for most commands. Verify with:
13
+
14
+ ```bash
15
+ canonry agent status
16
+ ```
17
+
18
+ If the server isn't running, start it with `canonry serve` (or `canonry agent start` for the gateway).
19
+
20
+ ## Key Commands
21
+
22
+ ### Monitoring
23
+
24
+ | Command | Purpose |
25
+ |---------|---------|
26
+ | `canonry run <project>` | Trigger a visibility sweep across all configured providers |
27
+ | `canonry run <project> --provider gemini` | Single-provider sweep |
28
+ | `canonry status <project>` | Current project status and latest run summary |
29
+ | `canonry evidence <project>` | Raw citation evidence from sweeps |
30
+ | `canonry insights <project>` | AI-generated insights and findings |
31
+ | `canonry health <project>` | Health snapshot with visibility scores |
32
+ | `canonry timeline <project>` | Per-keyword citation history over time |
33
+ | `canonry export <project>` | Full project data export |
34
+
35
+ ### Auditing
36
+
37
+ ```bash
38
+ # Run a technical AEO audit on a URL
39
+ npx @ainyc/aeo-audit <url> --format json
40
+ ```
41
+
42
+ ### Project Management
43
+
44
+ | Command | Purpose |
45
+ |---------|---------|
46
+ | `canonry project list` | List all projects |
47
+ | `canonry project create <name> --domain <domain>` | Create a new project |
48
+ | `canonry keyword add <project> <keyword>...` | Add keywords to track |
49
+ | `canonry keyword list <project>` | List tracked keywords |
50
+
51
+ ## Workflow Patterns
52
+
53
+ ### Daily monitoring sweep
54
+
55
+ 1. Check project status: `canonry status <project> --format json`
56
+ 2. Run sweep if stale: `canonry run <project>`
57
+ 3. Review insights: `canonry insights <project> --format json`
58
+ 4. Escalate critical/high severity findings to the operator
59
+
60
+ ### Investigation workflow
61
+
62
+ 1. Identify affected keywords from insights
63
+ 2. Pull evidence: `canonry evidence <project> --format json`
64
+ 3. Check timeline for trends: `canonry timeline <project> --format json`
65
+ 4. If structural issues suspected, run audit: `npx @ainyc/aeo-audit <url> --format json`
66
+ 5. Compile findings with evidence and recommended actions
67
+
68
+ ## Quota Awareness
69
+
70
+ Provider APIs have rate limits. Follow these guidelines:
71
+
72
+ - Don't run full sweeps more than necessary. Check `canonry status` first to see when the last run completed.
73
+ - Use `--provider <name>` for targeted single-provider checks when investigating a specific engine.
74
+ - If a run returns `partial` status, some providers failed -- check the run details before retrying.
75
+ - Space out consecutive sweeps. Back-to-back runs waste quota without new data.
76
+
77
+ ## Skills
78
+
79
+ Reference skills are available in `skills/` for domain-specific guidance:
80
+
81
+ - `skills/aero/` -- Aero agent skill definition
82
+ - `skills/canonry-setup/` -- Canonry installation and configuration reference
83
+
84
+ ## Error Handling
85
+
86
+ - Exit code `0` = success, `1` = user error, `2` = system error.
87
+ - On exit code `2` (system error), check server status and retry once before escalating.
88
+ - On exit code `1` (user error), review the error message -- don't retry the same command.
89
+ - Parse stderr for structured error JSON: `{ "error": { "code": "...", "message": "..." } }`.
@@ -0,0 +1,54 @@
1
+ # Aero
2
+
3
+ You are Aero, an AI-native AEO (Answer Engine Optimization) analyst. You monitor how AI answer engines -- Gemini, ChatGPT, Claude, Perplexity -- cite and reference domains for tracked keywords, then surface actionable findings to your operator.
4
+
5
+ ## Identity
6
+
7
+ - **Role:** Autonomous analyst, not a chatbot. You surface findings proactively; the operator approves or dismisses.
8
+ - **Tools:** `canonry` CLI and `@ainyc/aeo-audit` are your primary instruments. All data access goes through these tools.
9
+ - **Domain:** Citation monitoring, answer engine visibility, structured data validation, competitive positioning.
10
+
11
+ ## Operating Principles
12
+
13
+ 1. **Data-first.** Every claim must be backed by evidence from a canonry sweep or audit result. Never fabricate citation data or invent sources.
14
+ 2. **Proactive.** Don't wait to be asked. When you detect regressions, emerging competitors, or optimization opportunities, surface them immediately.
15
+ 3. **Honest timelines.** If a sweep is rate-limited or a provider is down, say so. Don't promise results you can't deliver.
16
+ 4. **Action-oriented.** End every analysis with concrete next steps: what to fix, what to monitor, what to escalate.
17
+ 5. **Concise.** Report in structured format with evidence tables. No filler, no hedging, no marketing language.
18
+
19
+ ## Priority Framework
20
+
21
+ Severity ordering for findings:
22
+
23
+ 1. **Critical:** Branded keyword citation loss (domain was cited, now isn't). Escalate immediately.
24
+ 2. **High:** Competitor gaining citations on tracked keywords where the domain is absent.
25
+ 3. **Medium:** Informational keyword gaps -- domain has relevant content but isn't surfaced by answer engines.
26
+ 4. **Low:** Optimization opportunities -- structured data improvements, content gaps for long-tail queries.
27
+
28
+ ## Constraints
29
+
30
+ - Never access the canonry SQLite database directly. Use `canonry <command> --format json` for all data.
31
+ - Never fabricate sweep results or citation data. If data is unavailable, say so.
32
+ - Never run sweeps without considering provider rate limits and quota.
33
+ - Never present audit recommendations as confirmed fixes -- they are suggestions that require validation.
34
+ - Always attribute findings to specific sweep runs, timestamps, and providers.
35
+
36
+ ## Reporting Format
37
+
38
+ When presenting findings, use this structure:
39
+
40
+ ```
41
+ ## [Finding Title]
42
+
43
+ **Severity:** critical | high | medium | low
44
+ **Keywords affected:** <list>
45
+ **Provider(s):** <which answer engines>
46
+ **Evidence:** <run ID, timestamp, citation state>
47
+
48
+ ### Analysis
49
+ <What changed and why it matters>
50
+
51
+ ### Recommended Actions
52
+ 1. <Specific action>
53
+ 2. <Specific action>
54
+ ```
@@ -0,0 +1,23 @@
1
+ # Client Context
2
+
3
+ This file stores client-specific context accumulated over time. Update it as you learn about the client's domain, priorities, and competitive landscape.
4
+
5
+ ## Client Info
6
+
7
+ <!-- Domain, industry, target audience, key products/services -->
8
+
9
+ ## Projects
10
+
11
+ <!-- Active canonry projects and their purpose -->
12
+
13
+ ## Key Findings
14
+
15
+ <!-- Important discoveries from sweeps and audits, with dates -->
16
+
17
+ ## Watchlist
18
+
19
+ <!-- Keywords, competitors, or trends to monitor closely -->
20
+
21
+ ## Notes
22
+
23
+ <!-- Any other relevant context -->
@@ -40,3 +40,4 @@ You coordinate across three tools to deliver comprehensive AEO monitoring:
40
40
  - [memory-patterns.md](references/memory-patterns.md) — What to persist per client
41
41
  - [regression-playbook.md](references/regression-playbook.md) — Detection through response
42
42
  - [reporting.md](references/reporting.md) — Report generation templates
43
+ - [wordpress-elementor-mcp.md](references/wordpress-elementor-mcp.md) — Elementor MCP tools for page management
@@ -0,0 +1,218 @@
1
+ # Elementor + WordPress MCP Development Guide
2
+
3
+ ## Overview
4
+
5
+ This guide covers programmatic management of WordPress + Elementor sites using the Elementor MCP plugin. It enables AI agents to read, create, and modify Elementor page layouts, widgets, and settings via the Model Context Protocol.
6
+
7
+ ## Prerequisites
8
+
9
+ ### WordPress Side
10
+ - WordPress >= 6.8
11
+ - Elementor >= 3.20 (container-based layouts)
12
+ - Elementor Pro (for custom CSS, forms, nav menus, etc.)
13
+ - **WordPress MCP Adapter** plugin ([GitHub](https://github.com/WordPress/mcp-adapter))
14
+ - **Elementor MCP** plugin ([GitHub](https://github.com/msrbuilds/elementor-mcp))
15
+ - Application Password created for API auth (Users > Profile > Application Passwords)
16
+ - Permalinks set to "Post name" (required for `/wp-json/` REST API routing)
17
+
18
+ ### Client Side
19
+ - `.mcp.json` in project root with HTTP MCP server config
20
+ - Base64-encoded credentials: `echo -n "username:app-password" | base64`
21
+
22
+ ## MCP Configuration
23
+
24
+ ```json
25
+ {
26
+ "mcpServers": {
27
+ "elementor-staging": {
28
+ "type": "http",
29
+ "url": "https://your-staging-site.com/wp-json/mcp/elementor-mcp-server",
30
+ "headers": {
31
+ "Authorization": "Basic BASE64_CREDENTIALS"
32
+ }
33
+ },
34
+ "elementor-production": {
35
+ "type": "http",
36
+ "url": "https://your-production-site.com/wp-json/mcp/elementor-mcp-server",
37
+ "headers": {
38
+ "Authorization": "Basic BASE64_CREDENTIALS"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ ### Troubleshooting Connection Issues
46
+ - If `/wp-json/` returns 404: go to Settings > Permalinks, set to "Post name", click Save
47
+ - If auth fails (401): verify application password is correct and user has admin role
48
+ - If MCP endpoint 404 but `/wp-json/` works: re-activate both MCP plugins
49
+ - After staging re-clone: re-install plugins, re-create app password, re-save permalinks
50
+
51
+ ## Elementor Architecture
52
+
53
+ ### Element Hierarchy
54
+ ```
55
+ Page
56
+ └── Container (root section)
57
+ └── Container (hero/section)
58
+ └── Container (row/column)
59
+ └── Widget (heading, text-editor, button, etc.)
60
+ ```
61
+
62
+ ### Key Concepts
63
+ - **Containers** are flex/grid layouts that hold other containers or widgets
64
+ - **Widgets** are the actual content elements (headings, text, images, buttons, forms)
65
+ - **Element IDs** are 7-char hex strings, unique within a page
66
+ - **Settings** control all visual properties (typography, colors, spacing, responsive)
67
+ - **Responsive suffixes**: `_tablet` and `_mobile` variants (e.g., `typography_font_size_tablet`)
68
+
69
+ ### Common Widget Types
70
+ - `heading` — H1-H6 titles
71
+ - `text-editor` — Rich text content
72
+ - `button` — CTA buttons with links
73
+ - `image` / `image-box` — Images with optional text
74
+ - `form` — Contact/lead forms (Pro)
75
+ - `google_maps` — Embedded maps
76
+ - `html` — Custom HTML (used for JSON-LD schema injection)
77
+ - `reviews` — Testimonials
78
+ - `nested-tabs` / `nested-accordion` — Tabbed/accordion content
79
+
80
+ ## Core MCP Workflow
81
+
82
+ ### 1. Discovery
83
+
84
+ ```
85
+ list-pages → Get all Elementor pages with IDs
86
+ get-page-structure → See element tree (containers + widgets)
87
+ get-element-settings → Inspect any element's full settings
88
+ find-element → Search by text content, widget type, or setting
89
+ list-widgets → See all available widget types
90
+ get-widget-schema → Get available settings for a widget type
91
+ ```
92
+
93
+ ### 2. Content Updates
94
+
95
+ ```
96
+ update-widget → Change text, links, colors, typography (partial merge)
97
+ update-container → Change layout, spacing, alignment, background
98
+ add-heading → Add a heading widget
99
+ add-text-editor → Add a text block
100
+ add-button → Add a CTA button
101
+ add-html → Add custom HTML (JSON-LD schema, tracking scripts)
102
+ add-container → Add a layout container
103
+ ```
104
+
105
+ ### 3. Structure Changes
106
+
107
+ ```
108
+ move-element → Reorder or re-parent elements
109
+ remove-element → Delete an element
110
+ duplicate-element → Clone an element
111
+ reorder-elements → Change sibling order
112
+ ```
113
+
114
+ ### 4. Styling
115
+
116
+ ```
117
+ add-custom-css → Page-level or element-level CSS (use media queries for responsive)
118
+ update-global-colors → Site-wide color palette
119
+ update-global-typography → Site-wide font presets
120
+ ```
121
+
122
+ ### 5. Page Management
123
+
124
+ ```
125
+ create-page → New WordPress page with Elementor
126
+ build-page → Create complete page from declarative JSON
127
+ export-page → Get full page data
128
+ delete-page-content → Clear page content
129
+ ```
130
+
131
+ ## Best Practices
132
+
133
+ ### Staging-First Workflow
134
+ 1. Make all changes on staging via MCP
135
+ 2. Verify visually across viewports (use Chrome browser tools)
136
+ 3. Get human approval
137
+ 4. Replay changes on production via MCP
138
+ 5. Re-clone staging from production for next iteration
139
+
140
+ ### Responsive Design
141
+ - Always check 3 breakpoints: desktop (1440+), tablet (768-1024), mobile (375-390)
142
+ - Use `_tablet` and `_mobile` setting suffixes for responsive overrides
143
+ - For large desktop fixes (1800px+), use `add-custom-css` with media queries
144
+ - Elementor's breakpoints: desktop (default), tablet (1024px), mobile (767px)
145
+
146
+ ### Settings Merge Behavior
147
+ - `update-widget` and `update-container` do **partial merges** — only specified settings change
148
+ - Nested objects (like `margin`, `padding`, `typography_font_size`) must include all subkeys
149
+ - Example margin: `{"unit": "px", "top": "0", "right": "0", "bottom": "0", "left": "20", "isLinked": false}`
150
+
151
+ ### CSS Custom Overrides
152
+ - Use `add-custom-css` with `replace: true` to avoid CSS accumulation
153
+ - Use `selector` keyword for element-level CSS: `selector .heading { color: red; }`
154
+ - Wrap responsive fixes in `@media` queries to avoid affecting other breakpoints
155
+ - Always verify CSS doesn't break other viewports after applying
156
+
157
+ ### JSON-LD Schema Injection
158
+ - Use `add-html` widget with `<script type="application/ld+json">` content
159
+ - Place in root container (append position -1) — script tags produce no visible output
160
+ - Use distinct `@id` values that don't conflict with Yoast's auto-generated schema
161
+ - Yoast generates: WebPage, BreadcrumbList, WebSite, Organization
162
+ - Custom schema should use: Service, RoofingContractor, DefinedTerm, LocalBusiness, etc.
163
+
164
+ ### Common Gotchas
165
+ - **Elementor CSS cache**: changes may not appear until CSS is regenerated. Use Elementor > Tools > Regenerate Files & Data, or the cache flush endpoint
166
+ - **Shared templates**: headers/footers are Elementor Library templates (different post type). Find their post ID via browser inspection (`data-elementor-id` attribute)
167
+ - **Widget IDs shared across pages**: pages cloned from templates share element IDs. Changes to one page don't affect others
168
+ - **Yoast SEO meta**: not writable via REST API. Must be set manually in wp-admin
169
+ - **WP Staging re-clone**: wipes plugins, app passwords, and permalink settings. Must reconfigure after each clone
170
+ - **Background images**: `background-position` and `background-size: cover` interact differently across viewport sizes. Use browser tools to measure actual rendered positions
171
+
172
+ ## Quick Reference: Common Operations
173
+
174
+ ### Change heading text
175
+ ```
176
+ update-widget(post_id, element_id, {"title": "New Heading"})
177
+ ```
178
+
179
+ ### Change text block content
180
+ ```
181
+ update-widget(post_id, element_id, {"editor": "<p>New content</p>"})
182
+ ```
183
+
184
+ ### Change font size (responsive)
185
+ ```
186
+ update-widget(post_id, element_id, {
187
+ "typography_font_size": {"unit": "px", "size": 80, "sizes": []},
188
+ "typography_font_size_tablet": {"unit": "px", "size": 65, "sizes": []},
189
+ "typography_font_size_mobile": {"unit": "px", "size": 40, "sizes": []}
190
+ })
191
+ ```
192
+
193
+ ### Change container margin
194
+ ```
195
+ update-container(post_id, element_id, {
196
+ "margin": {"unit": "px", "top": "0", "right": "0", "bottom": "0", "left": "250", "isLinked": false}
197
+ })
198
+ ```
199
+
200
+ ### Add JSON-LD schema to a page
201
+ ```
202
+ add-html(post_id, parent_id, '<script type="application/ld+json">{"@context":"https://schema.org",...}</script>')
203
+ ```
204
+
205
+ ### Add responsive CSS fix
206
+ ```
207
+ add-custom-css(post_id, '@media (min-width: 1800px) { .elementor-element-XXXXX { margin-top: -200px !important; } }', replace=true)
208
+ ```
209
+
210
+ ### Find text on a page
211
+ ```
212
+ find-element(post_id, search_text="lorem ipsum")
213
+ ```
214
+
215
+ ### Update Google Maps widget
216
+ ```
217
+ update-widget(post_id, element_id, {"address": "Southeast Michigan, USA", "zoom": {"unit": "px", "size": 8, "sizes": []}})
218
+ ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: canonry
3
- description: "AEO (Answer Engine Optimization) monitoring and analysis using canonry CLI and aeo-audit tool. Use when: (1) running citation sweeps across AI providers (Gemini, ChatGPT, Claude, Perplexity); (2) auditing technical SEO with structured data validation; (3) implementing schema markup, sitemaps, llms.txt; (4) diagnosing indexing issues via Google Search Console and Bing Webmaster Tools; (5) optimizing content for AI readability and entity consistency. NOT for: general web development, content writing, PPC campaigns, or social media management."
3
+ description: "Agent-first AEO monitoring and operating platform."
4
4
  metadata:
5
5
  {
6
6
  "openclaw":
@@ -32,38 +32,25 @@ metadata:
32
32
 
33
33
  # Canonry
34
34
 
35
- Monitor and optimize site visibility across AI answer engines (Gemini, ChatGPT, Claude, Perplexity) and traditional search engines using the `canonry` CLI for AEO monitoring and `aeo-audit` for technical SEO analysis.
35
+ Open-source AEO (Answer Engine Optimization) monitoring platform. Track how AI answer engines cite your domain across Gemini, ChatGPT, Claude, and Perplexity.
36
36
 
37
- ## When to Use
37
+ **Website:** [ainyc.ai](https://ainyc.ai) | **Docs:** [github.com/AINYC/canonry](https://github.com/AINYC/canonry)
38
38
 
39
- **USE this skill when:**
39
+ ## When to Use
40
40
 
41
- - Tracking which keyphrases earn citations (or lose them) across AI providers
42
- - Running technical SEO audits with 14‑factor scoring
43
- - Implementing structured data (JSON‑LD: LocalBusiness, FAQPage, Service)
44
- - Diagnosing indexing gaps in Google Search Console / Bing Webmaster Tools
45
- - Optimizing `llms.txt`, `llms‑full.txt`, sitemaps, robots.txt for AI crawlers
46
- - Patching missing H1 tags, meta descriptions, image alt text
41
+ - Tracking keyphrase citations across AI providers
42
+ - Running technical SEO audits (14‑factor scoring)
43
+ - Implementing structured data (JSON‑LD)
44
+ - Diagnosing indexing gaps via Google Search Console / Bing Webmaster Tools
45
+ - Optimizing `llms.txt`, sitemaps, robots.txt for AI crawlers
47
46
  - Submitting URLs to Google Indexing API and Bing IndexNow
48
- - Analyzing competitor citation patterns in AI answers
49
-
50
- ## When NOT to Use
51
-
52
- ❌ **DON'T use this skill when:**
53
-
54
- - General WordPress development (use `wordpress` skill if available)
55
- - Content writing or copy creation (human‑led task)
56
- - Paid search/SEM campaigns (different specialty)
57
- - Social media management or outreach
58
- - Local business listing management (e.g., GBP, Yelp)
59
- - Backlink building or outreach campaigns
47
+ - Analyzing competitor citation patterns
60
48
 
61
49
  ## Core Philosophy
62
50
 
63
- - **AI models are black boxes** Measure citation outcomes, not assume causality
64
- - **Position, then wait** — Site changes take weeks/months to reflect in AI indexes; canonry tells us *when* it happens, not *if*
65
- - **Signalover‑noise** — Trim keyphrase lists to high‑intent queries; avoid granular targeting until base visibility exists
66
- - **CLI‑native, UI‑optional** — Prefer API‑driven changes over manual CMS clicks; faster, repeatable, auditable
51
+ - **Measure outcomes** — AI models are black boxes; track citations, don't assume causality
52
+ - **Signal over noise** — Focus on high‑intent queries; avoid granular targeting until base visibility exists
53
+ - **CLInative** — API‑driven changes over manual CMS clicks; faster, repeatable, auditable
67
54
 
68
55
  ## Toolchain
69
56
 
@@ -221,54 +208,7 @@ cat audit.json | jq -r '.factors[] | select(.score < 70) | "- \(.name): \(.score
221
208
  - **Client data stays private** — canonry repo is public; no real domains in issues
222
209
  - **Respect API rate limits** — batch operations, avoid tight loops
223
210
 
224
- ## Output Templates
225
-
226
- ### Audit Summary
227
- ```
228
- ## AEO/SEO Audit — https://client.com
229
-
230
- **Overall:** 66/100 (D)
231
-
232
- **Top strengths (A/A+):**
233
- - AI‑Readable Content (100) — llms.txt, llms‑full.txt present
234
- - FAQ Content (100) — FAQPage schema detected
235
- - AI Crawler Access (100) — robots.txt allows all bots
236
-
237
- **Critical gaps (F):**
238
- - Definition Blocks (0) — no "What is…" sections
239
- - E‑E‑A‑T Signals (45) — missing Person schema, author tags
240
- - Citations & Authority (44) — no external references to industry sources
241
-
242
- **Immediate actions:**
243
- 1. Add H1 tag to homepage (Technical SEO: 60/100)
244
- 2. Create "What is polyurea?" section on /services/ (Definition Blocks: 0/100)
245
- 3. Submit all 5 URLs to Bing IndexNow (indexing: 2/5)
246
- ```
247
-
248
- ### Citation Report
249
- ```
250
- ## canonry sweep — client-project
251
-
252
- **Run:** 2026‑04‑03T13:44Z (ID: 4a45ebfc...)
253
-
254
- **Keyphrase visibility (12 tracked):**
255
- ✅ polyurea roof coating — 3/3 providers
256
- ✅ commercial roof coating — 2/3 providers
257
- ❌ polyurea roof coating Michigan — 0/3 (geo gap)
258
- ❌ commercial roofing contractor Michigan — 0/3 (geo gap)
259
-
260
- **Changes since last sweep (2026‑03‑27):**
261
- - Lost `flat roof coating Michigan` on Gemini (−1)
262
- - Gained `industrial roof coating` on Claude (+1)
263
- - No change on ChatGPT (stable)
264
-
265
- **Next steps:**
266
- - Build Michigan location page (/michigan/)
267
- - Add county‑level references to llms.txt
268
- - Re‑sweep in 7 days
269
- ```
270
-
271
211
  ---
272
212
 
273
213
  **Tools:** canonry v1.37+, @ainyc/aeo‑audit v1.3+
274
- **Reference:** [AINYC AEO Methodology](https://ainyc.ai/aeo-methodology)
214
+ **Website:** [ainyc.ai](https://ainyc.ai) | **Reference:** [AINYC AEO Methodology](https://ainyc.ai/aeo-methodology)
@@ -139,7 +139,9 @@ canonry notify remove <project> <id>
139
139
  canonry notify test <project> <id>
140
140
  ```
141
141
 
142
- Available events: `citation.lost`, `citation.gained`, `run.completed`, `run.failed`
142
+ Available events: `citation.lost`, `citation.gained`, `run.completed`, `run.failed`, `insight.critical`, `insight.high`
143
+
144
+ `insight.critical` and `insight.high` fire when the intelligence engine generates critical- or high-severity insights after a sweep completes.
143
145
 
144
146
  ## Provider Settings & Quotas
145
147
 
@@ -326,6 +328,12 @@ canonry agent setup --gemini-key <key> # monitoring provider keys (pas
326
328
  canonry agent setup --openai-key <key>
327
329
  canonry agent setup --claude-key <key>
328
330
  canonry agent setup --perplexity-key <key>
331
+
332
+ # Webhook lifecycle
333
+ canonry agent attach <project> # register agent webhook for project
334
+ canonry agent attach <project> --format json # JSON output
335
+ canonry agent detach <project> # remove agent webhook from project
336
+ canonry agent detach <project> --format json # JSON output
329
337
  ```
330
338
 
331
339
  **Setup flow:** init canonry (if needed) → install OpenClaw (if needed) → configure profile → configure gateway → set agent LLM credentials → seed workspace with skills.
@@ -334,6 +342,8 @@ canonry agent setup --perplexity-key <key>
334
342
 
335
343
  **Re-running is safe:** setup is idempotent — it skips steps that are already configured.
336
344
 
345
+ **Agent webhooks:** `canonry agent attach <project>` registers a webhook notification on the project so the agent receives events (`run.completed`, `insight.critical`, `insight.high`, `citation.gained`). Idempotent — skips if an agent webhook already exists. `canonry agent detach <project>` removes the agent webhook. When `autoStart` is enabled, the server auto-attaches webhooks to newly created or applied projects.
346
+
337
347
  ## Output Formats
338
348
 
339
349
  Most commands support `--format json` for machine-readable output.
@@ -55,3 +55,7 @@ canonry wordpress staging push mysite
55
55
  - If SEO meta is not writable through REST, canonry returns an actionable error instead of guessing
56
56
  - Duplicate slug matches are returned as explicit ambiguity errors with candidate page IDs/titles
57
57
  - Authentication is verified on connect by calling `/wp/v2/users/me` — if that fails, canonry returns an actionable error message
58
+
59
+ ## Related: Elementor MCP
60
+
61
+ For programmatic management of Elementor page layouts, widgets, and styling via MCP tools, see the aero skill reference: [`skills/aero/references/wordpress-elementor-mcp.md`](../../aero/references/wordpress-elementor-mcp.md).