@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.
Files changed (3) hide show
  1. package/README.md +18 -0
  2. package/dist/cli.js +39 -14
  3. 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 body = {};
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
- body.providers = resolved.length > 0 ? resolved : providerInputs;
6690
+ baseBody.providers = resolved.length > 0 ? resolved : providerInputs;
6691
6691
  }
6692
6692
  if (opts?.allLocations) {
6693
- body.allLocations = true;
6693
+ baseBody.allLocations = true;
6694
6694
  }
6695
6695
  if (opts?.noLocation) {
6696
- body.noLocation = true;
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 run = await client.triggerRun(p.name, body);
6702
- results.push({ project: p.name, runId: run.id, status: run.status });
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
- console.log(`Triggered ${results.length} run(s):
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
- console.log(" PROJECT RUN ID STATUS");
6726
- 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");
6727
- for (const r of results) {
6728
- const proj = r.project.padEnd(31);
6729
- const id = (r.runId || "(failed)").padEnd(36);
6730
- console.log(` ${proj} ${id} ${r.status}`);
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",
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-integration-bing": "0.0.0",
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": {