@ainyc/canonry 4.51.3 → 4.51.4
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 +18 -0
- package/dist/cli.js +39 -14
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -40,6 +40,24 @@ cnry evidence my-site
|
|
|
40
40
|
cnry insights my-site
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
## Or set it up with your AI coding agent
|
|
44
|
+
|
|
45
|
+
Drop this into Claude Code, Codex, or any shell-capable agent. It installs canonry, runs your first sweep, audits your site for AEO readiness, and stops for your sign-off before taking any action on your behalf:
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
Set up canonry for me. Canonry is an open-source platform that tracks how AI answer engines (Gemini, ChatGPT, Claude, Perplexity) cite my site.
|
|
49
|
+
|
|
50
|
+
1. Ask me for: my domain, 3–5 queries I want to track, and which provider I want to start with (gemini / openai / claude / perplexity). Wait for my answers before proceeding.
|
|
51
|
+
2. Run `npm install -g @ainyc/canonry`.
|
|
52
|
+
3. Run `cnry init` in this directory. This scaffolds config and installs the canonry skills into `.claude/skills/canonry/`, `.claude/skills/aero/`, `.codex/skills/canonry/`, and `.codex/skills/aero/`. If the skills aren't there afterwards, run `cnry skills install`.
|
|
53
|
+
4. Read the operator playbook at `.claude/skills/canonry/SKILL.md` and follow it end-to-end: create the project with my domain and queries, wire up the provider key I chose, and trigger the first sweep.
|
|
54
|
+
5. Open my browser to the dashboard so I can see the run results.
|
|
55
|
+
6. Switch to the analyst playbook at `.claude/skills/aero/SKILL.md` and run a baseline AEO audit on my behalf. Read citation evidence with `cnry evidence <project> --format json`, then run `npx @ainyc/aeo-audit "<my-domain>" --format json` for a site-readiness score.
|
|
56
|
+
7. Summarize what you found: my mention and citation rates per provider, the top 3 queries I'm not yet cited on, and the highest-impact site issues from the audit. Ask me for permission before taking any further action, such as drafting content, submitting URLs for indexing, editing files, or anything else that changes my site.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
One-click copy at [canonry.ai](https://canonry.ai).
|
|
60
|
+
|
|
43
61
|
## If you get stuck
|
|
44
62
|
|
|
45
63
|
| Problem | Fix |
|
package/dist/cli.js
CHANGED
|
@@ -6683,26 +6683,38 @@ async function triggerRunAll(opts) {
|
|
|
6683
6683
|
}
|
|
6684
6684
|
return;
|
|
6685
6685
|
}
|
|
6686
|
-
const
|
|
6686
|
+
const baseBody = {};
|
|
6687
6687
|
if (opts?.provider) {
|
|
6688
6688
|
const providerInputs = opts.provider.split(",").map((s) => s.trim()).filter(Boolean);
|
|
6689
6689
|
const resolved = providerInputs.flatMap((p) => resolveProviderInput(p));
|
|
6690
|
-
|
|
6690
|
+
baseBody.providers = resolved.length > 0 ? resolved : providerInputs;
|
|
6691
6691
|
}
|
|
6692
6692
|
if (opts?.allLocations) {
|
|
6693
|
-
|
|
6693
|
+
baseBody.allLocations = true;
|
|
6694
6694
|
}
|
|
6695
6695
|
if (opts?.noLocation) {
|
|
6696
|
-
|
|
6696
|
+
baseBody.noLocation = true;
|
|
6697
6697
|
}
|
|
6698
6698
|
const results = [];
|
|
6699
6699
|
for (const p of projects2) {
|
|
6700
|
+
const body = { ...baseBody };
|
|
6701
|
+
if (body.allLocations && p.locations.length === 0) {
|
|
6702
|
+
delete body.allLocations;
|
|
6703
|
+
}
|
|
6700
6704
|
try {
|
|
6701
|
-
const
|
|
6702
|
-
|
|
6705
|
+
const response = await client.triggerRun(p.name, body);
|
|
6706
|
+
const dispatched = Array.isArray(response) ? response : [response];
|
|
6707
|
+
for (const r of dispatched) {
|
|
6708
|
+
results.push({
|
|
6709
|
+
project: p.name,
|
|
6710
|
+
runId: r.id,
|
|
6711
|
+
status: r.status,
|
|
6712
|
+
location: r.location ?? null
|
|
6713
|
+
});
|
|
6714
|
+
}
|
|
6703
6715
|
} catch (err) {
|
|
6704
6716
|
const msg = err instanceof Error ? err.message : String(err);
|
|
6705
|
-
results.push({ project: p.name, runId: "", status: "error", error: msg });
|
|
6717
|
+
results.push({ project: p.name, runId: "", status: "error", location: null, error: msg });
|
|
6706
6718
|
}
|
|
6707
6719
|
}
|
|
6708
6720
|
if (opts?.wait) {
|
|
@@ -6720,14 +6732,27 @@ async function triggerRunAll(opts) {
|
|
|
6720
6732
|
console.log(JSON.stringify(results, null, 2));
|
|
6721
6733
|
return;
|
|
6722
6734
|
}
|
|
6723
|
-
|
|
6735
|
+
const showLocationColumn = results.some((r) => r.location !== null);
|
|
6736
|
+
const projectCount = new Set(results.map((r) => r.project)).size;
|
|
6737
|
+
console.log(`Triggered ${results.length} run(s) across ${projectCount} project(s):
|
|
6724
6738
|
`);
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
const
|
|
6729
|
-
|
|
6730
|
-
|
|
6739
|
+
if (showLocationColumn) {
|
|
6740
|
+
console.log(" PROJECT LOCATION RUN ID STATUS");
|
|
6741
|
+
console.log(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
|
|
6742
|
+
for (const r of results) {
|
|
6743
|
+
const proj = r.project.padEnd(31);
|
|
6744
|
+
const loc = (r.location ?? "\u2014").padEnd(15);
|
|
6745
|
+
const id = (r.runId || "(failed)").padEnd(36);
|
|
6746
|
+
console.log(` ${proj} ${loc} ${id} ${r.status}`);
|
|
6747
|
+
}
|
|
6748
|
+
} else {
|
|
6749
|
+
console.log(" PROJECT RUN ID STATUS");
|
|
6750
|
+
console.log(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
|
|
6751
|
+
for (const r of results) {
|
|
6752
|
+
const proj = r.project.padEnd(31);
|
|
6753
|
+
const id = (r.runId || "(failed)").padEnd(36);
|
|
6754
|
+
console.log(` ${proj} ${id} ${r.status}`);
|
|
6755
|
+
}
|
|
6731
6756
|
}
|
|
6732
6757
|
}
|
|
6733
6758
|
async function cancelRun(project, runId, format) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ainyc/canonry",
|
|
3
|
-
"version": "4.51.
|
|
3
|
+
"version": "4.51.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Agent-first open-source AEO operating platform - track how answer engines cite your domain",
|
|
6
6
|
"license": "FSL-1.1-ALv2",
|
|
@@ -61,22 +61,22 @@
|
|
|
61
61
|
"tsup": "^8.5.1",
|
|
62
62
|
"tsx": "^4.19.0",
|
|
63
63
|
"@ainyc/canonry-api-client": "0.0.0",
|
|
64
|
-
"@ainyc/canonry-api-routes": "0.0.0",
|
|
65
64
|
"@ainyc/canonry-config": "0.0.0",
|
|
66
|
-
"@ainyc/canonry-intelligence": "0.0.0",
|
|
67
65
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
68
66
|
"@ainyc/canonry-db": "0.0.0",
|
|
69
|
-
"@ainyc/canonry-
|
|
67
|
+
"@ainyc/canonry-api-routes": "0.0.0",
|
|
68
|
+
"@ainyc/canonry-intelligence": "0.0.0",
|
|
69
|
+
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
70
70
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
71
|
+
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
72
|
+
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
71
73
|
"@ainyc/canonry-integration-google": "0.0.0",
|
|
72
74
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
73
|
-
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
74
|
-
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
75
75
|
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
76
76
|
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
77
|
-
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
78
77
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
79
78
|
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
79
|
+
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
80
80
|
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
81
81
|
},
|
|
82
82
|
"scripts": {
|