@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 +26 -11
- package/assets/agent-workspace/AGENTS.md +89 -0
- package/assets/agent-workspace/SOUL.md +54 -0
- package/assets/agent-workspace/USER.md +23 -0
- package/assets/agent-workspace/skills/aero/SKILL.md +1 -0
- package/assets/agent-workspace/skills/aero/references/wordpress-elementor-mcp.md +218 -0
- package/assets/agent-workspace/skills/canonry-setup/SKILL.md +14 -74
- package/assets/agent-workspace/skills/canonry-setup/references/canonry-cli.md +11 -1
- package/assets/agent-workspace/skills/canonry-setup/references/wordpress-integration.md +4 -0
- package/assets/assets/{index-Cxg_4UWs.js → index-CVk23m8J.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-HO22LHTY.js → chunk-JTKHPNGL.js} +7 -2
- package/dist/{chunk-RMLIF47M.js → chunk-YPTVJRJY.js} +976 -154
- package/dist/cli.js +180 -538
- package/dist/index.js +2 -2
- package/dist/{intelligence-service-ZISLIU4S.js → intelligence-service-Q4WX46MJ.js} +1 -1
- package/package.json +7 -7
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
|
-
[](https://www.npmjs.com/package/@ainyc/canonry) [](https://fsl.software/) [](https://www.npmjs.com/package/@ainyc/canonry) [](https://fsl.software/) [](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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
|
115
|
-
|
|
116
|
-
|
|
|
117
|
-
|
|
|
118
|
-
|
|
|
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 >=
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
37
|
+
**Website:** [ainyc.ai](https://ainyc.ai) | **Docs:** [github.com/AINYC/canonry](https://github.com/AINYC/canonry)
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
## When to Use
|
|
40
40
|
|
|
41
|
-
- Tracking
|
|
42
|
-
- Running technical SEO audits
|
|
43
|
-
- Implementing structured data (JSON‑LD
|
|
44
|
-
- Diagnosing indexing gaps
|
|
45
|
-
- Optimizing `llms.txt`,
|
|
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
|
|
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
|
|
64
|
-
- **
|
|
65
|
-
- **
|
|
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
|
+
- **CLI‑native** — 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).
|