@canonry/canonry 7.2.0 → 7.4.0

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 (34) hide show
  1. package/assets/agent-workspace/skills/aero/references/aeo-discovery.md +3 -2
  2. package/assets/agent-workspace/skills/aero/references/orchestration.md +1 -1
  3. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +1 -1
  4. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +33 -4
  5. package/assets/assets/{AuditHistoryPanel-Duvyi8vx.js → AuditHistoryPanel-DIL5oTHF.js} +1 -1
  6. package/assets/assets/{BacklinksPage-CY5AllQu.js → BacklinksPage-BpCURZh8.js} +1 -1
  7. package/assets/assets/{HistoryPage-C0Gr0gcj.js → HistoryPage-TPbexxzA.js} +1 -1
  8. package/assets/assets/{MeasurementPropertyPage-DrAB6VKX.js → MeasurementPropertyPage-H991GW9h.js} +1 -1
  9. package/assets/assets/ProjectPage-l1NAl-9k.js +8 -0
  10. package/assets/assets/{RunsPage-DMxOrtfl.js → RunsPage-Dhu7Qe7B.js} +1 -1
  11. package/assets/assets/{SettingsPage-sxiUNt2A.js → SettingsPage-BCG1QJ07.js} +1 -1
  12. package/assets/assets/SiteHealthSection-BXueYSiu.js +4 -0
  13. package/assets/assets/{TrafficPage-CvSQDNTi.js → TrafficPage-ua9wsccA.js} +3 -3
  14. package/assets/assets/{TrafficSourceDetailPage-BaYeIBmc.js → TrafficSourceDetailPage-pwATnkp8.js} +1 -1
  15. package/assets/assets/{extract-error-message-76IWhqQF.js → extract-error-message-DJfNdKqh.js} +1 -1
  16. package/assets/assets/{index-BlrH2zRW.js → index-DvWWyhGp.js} +21 -21
  17. package/assets/assets/{react-sigma_core.esm.min-CkAcKW2k.js → react-sigma_core.esm.min-DnbWY5j_.js} +1 -1
  18. package/assets/assets/{v2-overview-adapter-DnEE4E9w.js → v2-overview-adapter-BIOvZAlo.js} +1 -1
  19. package/assets/index.html +1 -1
  20. package/dist/{chunk-UIDHHZH3.js → chunk-GEKMHZS2.js} +293 -1267
  21. package/dist/{chunk-BYSSJEL7.js → chunk-JU6TPMCJ.js} +33 -11
  22. package/dist/{chunk-TY3CJKKR.js → chunk-PXRUWG75.js} +11327 -10807
  23. package/dist/{chunk-RCQJI3UX.js → chunk-SWSWCUHS.js} +3215 -2723
  24. package/dist/{chunk-FDBQOQLP.js → chunk-TNLOOXUP.js} +29 -2
  25. package/dist/{chunk-SVTVBPIT.js → chunk-XFVJ6QVE.js} +2 -2
  26. package/dist/{chunk-EQBYK77W.js → chunk-ZP6GF32R.js} +3 -3
  27. package/dist/cli.js +1151 -68
  28. package/dist/{demo-server-GWRYDPJC.js → demo-server-INMOE4BA.js} +6 -6
  29. package/dist/index.js +6 -6
  30. package/dist/{intelligence-service-3L2665AK.js → intelligence-service-IBUS2IND.js} +2 -2
  31. package/dist/mcp.js +4 -4
  32. package/package.json +13 -13
  33. package/assets/assets/ProjectPage-DSxvvnAd.js +0 -8
  34. package/assets/assets/SiteHealthSection--6tZe3hM.js +0 -4
@@ -26,6 +26,8 @@ import {
26
26
  backlinkSourceSchema,
27
27
  canonicalizeGtmAccountId,
28
28
  canonicalizeGtmResourceSelection,
29
+ competitorAliasesRequestSchema,
30
+ competitorAppendRequestSchema,
29
31
  competitorBatchRequestSchema,
30
32
  competitorLandscapeQuerySchema,
31
33
  contentTargetDismissRequestSchema,
@@ -122,6 +124,7 @@ import {
122
124
  sentimentSummaryIncludeSchema,
123
125
  sentimentSummaryReadSchema,
124
126
  settingsDtoSchema,
127
+ siteAuditPageBudgetSchema,
125
128
  snapshotRequestInputSchema,
126
129
  telemetryStatusDtoSchema,
127
130
  trafficAnalyticsPeriodSchema,
@@ -132,7 +135,7 @@ import {
132
135
  trafficSeriesGranularitySchema,
133
136
  visibilityCompareSelectionSchema,
134
137
  visibilityReportRequestSchema
135
- } from "./chunk-TY3CJKKR.js";
138
+ } from "./chunk-PXRUWG75.js";
136
139
 
137
140
  // src/cli-error.ts
138
141
  function isMachineFormat(format) {
@@ -906,6 +909,14 @@ var competitorsInputSchema = z3.object({
906
909
  project: projectNameSchema,
907
910
  request: competitorBatchRequestSchema
908
911
  });
912
+ var competitorsAddInputSchema = z3.object({
913
+ project: projectNameSchema,
914
+ request: competitorAppendRequestSchema
915
+ });
916
+ var competitorAliasesInputSchema = competitorAliasesRequestSchema.safeExtend({
917
+ project: projectNameSchema,
918
+ domain: z3.string().trim().min(1).describe("Tracked competitor domain (any spelling; it resolves to the stored registrable domain).")
919
+ });
909
920
  var latestSweepRunIdDescription = "A run id, or latest for the latest sweep (the run the measurement reads display). With queryClass branded or non-brand and neither runId nor window, this tool reads latest; pass window to pool every sweep in it.";
910
921
  var competitorLandscapeInputSchema = competitorLandscapeQuerySchema.safeExtend({
911
922
  project: projectNameSchema,
@@ -1199,7 +1210,7 @@ var technicalAeoRunInputSchema = z3.object({
1199
1210
  project: projectNameSchema,
1200
1211
  sitemapUrl: z3.string().url().optional().describe("Override the sitemap URL. Defaults to https://<canonicalDomain>/sitemap.xml."),
1201
1212
  limit: z3.number().int().positive().max(2e3).optional().describe("Deprecated compatibility alias for maxPages."),
1202
- maxPages: z3.number().int().positive().max(5e4).optional().describe("Maximum pages crawled and audited. Defaults to 1,000; hard maximum 50,000."),
1213
+ maxPages: siteAuditPageBudgetSchema.optional().describe("Maximum pages crawled and audited (1 to 50,000). Omitted uses the project's saved budget (siteAuditMaxPages, set with canonry_project_upsert or canonry_apply_config), else the full site, up to 50,000; pass a smaller number for a quick look."),
1203
1214
  maxEdges: z3.number().int().positive().max(1e6).optional().describe("Maximum link observations retained for this crawl. When omitted the crawl engine derives the budget from the page count; hard maximum 1,000,000."),
1204
1215
  maxDepth: z3.number().int().min(0).max(100).optional().describe("Maximum internal-link depth from the root page."),
1205
1216
  checkDeadLinks: z3.boolean().optional().describe("Opt in to internal dead-link checks. Omitted and false both disable checks.")
@@ -1948,7 +1959,7 @@ var canonryMcpTools = [
1948
1959
  defineTool({
1949
1960
  name: "canonry_competitors_list",
1950
1961
  title: "List competitors",
1951
- description: "List tracked competitors for a Canonry project.",
1962
+ description: "List tracked competitors for a Canonry project, each with its operator-curated `aliases` (the names it goes by in answer text; `[]` means the domain label alone identifies it).",
1952
1963
  access: "read",
1953
1964
  tier: "setup",
1954
1965
  inputSchema: projectInputSchema,
@@ -2684,7 +2695,7 @@ var canonryMcpTools = [
2684
2695
  defineTool({
2685
2696
  name: "canonry_project_upsert",
2686
2697
  title: "Create or replace project",
2687
- description: "Create or replace a Canonry project. PUT semantics: fields not in the request are reset to their defaults. Provide the full intended project shape. Exceptions: an omitted providerDispatchModes (provider \u2192 sync|batch for scheduled sweeps) keeps the stored preference; send {} to clear it. An omitted qualifiedAliases (the aliases Simple sentiment treats as this brand's own names) keeps the stored list, minus names that no longer qualify (a removed alias, a spelling of the display name, or a competitor's name); send [] to clear it.",
2698
+ description: "Create or replace a Canonry project. PUT semantics: fields not in the request are reset to their defaults. Provide the full intended project shape. Exceptions: an omitted providerDispatchModes (provider \u2192 sync|batch for scheduled sweeps) keeps the stored preference; send {} to clear it. An omitted qualifiedAliases (the aliases Simple sentiment treats as this brand's own names) keeps the stored list, minus names that no longer qualify (a removed alias, a spelling of the display name, or a competitor's name); send [] to clear it. Competitors are not part of this request, but a new identity (display name, aliases, domains) that claims a tracked competitor's curated alias drops that alias, and the drop is audited. An omitted siteAuditMaxPages (the Site Health page budget for scans that set none, 1 to 50,000) keeps the stored budget; send null for the full site.",
2688
2699
  access: "write",
2689
2700
  tier: "setup",
2690
2701
  inputSchema: projectUpsertInputSchema,
@@ -2695,7 +2706,7 @@ var canonryMcpTools = [
2695
2706
  defineTool({
2696
2707
  name: "canonry_apply_config",
2697
2708
  title: "Apply project config",
2698
- description: "Apply one Canonry config-as-code project document. Replaces the project to match the config; fields omitted from the spec are reset to defaults, with these exceptions: a spec with neither queries nor keywords leaves the tracked-query basket unchanged (to clear the basket, pass an explicit empty queries list); an omitted providerDispatchModes keeps the stored preference; and an omitted qualifiedAliases keeps the stored list, minus names that no longer qualify (a removed alias, a spelling of the display name, or a competitor's name); send [] to clear it. For multi-document YAML, call this tool once per project document.",
2709
+ description: "Apply one Canonry config-as-code project document. Replaces the project to match the config; fields omitted from the spec are reset to defaults, with these exceptions: a spec with neither queries nor keywords leaves the tracked-query basket unchanged (to clear the basket, pass an explicit empty queries list); an omitted providerDispatchModes keeps the stored preference; an omitted qualifiedAliases keeps the stored list, minus names that no longer qualify (a removed alias, a spelling of the display name, or a competitor's name); send [] to clear it; and a competitor given as a plain domain keeps its stored curated aliases, while `{ domain, aliases }` sets them exactly (`[]` clears). A spec identity that claims a competitor's alias drops that alias (audited); a new competitor whose name overlaps another competitor's alias (one brand key contains the other) or that is the project's own site fails the apply. An omitted siteAuditMaxPages keeps the stored Site Health page budget (null means the full site). For multi-document YAML, call this tool once per project document.",
2699
2710
  access: "write",
2700
2711
  tier: "core",
2701
2712
  inputSchema: applyConfigInputSchema,
@@ -3255,16 +3266,27 @@ var canonryMcpTools = [
3255
3266
  defineTool({
3256
3267
  name: "canonry_competitors_add",
3257
3268
  title: "Add competitors",
3258
- description: "Add tracked competitor domains to a Canonry project.",
3269
+ description: "Add tracked competitor domains to a Canonry project. Each entry is a domain, or `{ domain, aliases }` to also add curated answer-text names to that competitor (tracked already or not; existing aliases are kept, the same rules as canonry_competitors_aliases_set apply). A new domain whose name overlaps another competitor's curated alias, or the label or a curated alias of a competitor an Advanced market pins (one brand key contains the other, so the alias \"Tune\" claims tunespoke.example), is rejected until that name is removed, and so is the project's own site. Already tracked domains (any spelling) are skipped.",
3259
3270
  access: "write",
3260
3271
  tier: "setup",
3261
- inputSchema: competitorsInputSchema,
3272
+ inputSchema: competitorsAddInputSchema,
3262
3273
  annotations: writeAnnotations({ idempotentHint: true }),
3263
3274
  openApiOperations: ["POST /api/v1/projects/{name}/competitors"],
3264
3275
  handler: async (client, input) => {
3265
- await client.appendCompetitors(input.project, uniqueStrings(input.request.competitors));
3276
+ await client.appendCompetitors(input.project, input.request.competitors);
3266
3277
  }
3267
3278
  }),
3279
+ defineTool({
3280
+ name: "canonry_competitors_aliases_set",
3281
+ title: "Set competitor aliases",
3282
+ description: `Set one tracked competitor's operator-curated aliases exactly (\`[]\` clears): the brand names it goes by in answer text when they differ from its domain, e.g. "TuneSpoke" for spoketuneworks.example or a 3-letter brand the domain label floor drops. Every competitor mention matcher (mention share, competitor landscape, mention gaps, run and history signals) uses them on stored answers at read time. Rejected: aliases under 3 letters or digits, over 80 characters, more than 10, or whose brand key contains, or sits inside, one of the project's own names or hosts or a name another tracked competitor answers to (its aliases, domain label or written host), because answers may split or join the words: "Tune" cannot belong to one competitor while another answers to "Tune Spoke", "TuneSpoke" or tunespoke.example, and joined-word lookalikes ("Tune" and "Tuner") are refused too. A competitor an Advanced market pins (active revision, pending draft, or a superseded revision the project's runs were measured under) counts as another competitor. Idempotent; returns the competitor.`,
3283
+ access: "write",
3284
+ tier: "setup",
3285
+ inputSchema: competitorAliasesInputSchema,
3286
+ annotations: writeAnnotations({ idempotentHint: true }),
3287
+ openApiOperations: ["PUT /api/v1/projects/{name}/competitors/{domain}/aliases"],
3288
+ handler: (client, input) => client.setCompetitorAliases(input.project, input.domain, input.aliases)
3289
+ }),
3268
3290
  defineTool({
3269
3291
  name: "canonry_competitors_remove",
3270
3292
  title: "Remove competitors",
@@ -3555,7 +3577,7 @@ var canonryMcpTools = [
3555
3577
  defineTool({
3556
3578
  name: "canonry_discover_promote_preview",
3557
3579
  title: "Preview discovery promotion",
3558
- description: "Read-only preview of available promotion candidates for a session: bucketed query lists and recurring suggested competitor domains not already in the project's tracked competitor list. Use it to confirm a basket before calling canonry_discover_promote.",
3580
+ description: "Read-only preview of available promotion candidates for a session: bucketed query lists, the recurring competitors a promote could add (suggestedCompetitors, each stored as its registrable domain with the cited hosts merged into it as sources), and the eligible ones it would leave out with a reason (skippedCompetitors: already-tracked, project-domain, shared-host, claimed-by-alias). Use it to confirm a basket before calling canonry_discover_promote.",
3559
3581
  access: "read",
3560
3582
  tier: "discovery",
3561
3583
  inputSchema: discoverySessionIdInputSchema,
@@ -3566,7 +3588,7 @@ var canonryMcpTools = [
3566
3588
  defineTool({
3567
3589
  name: "canonry_discover_promote",
3568
3590
  title: "Promote discovery session",
3569
- description: 'Adopt a completed discovery session\'s bucketed queries into the project\'s tracked basket, tagged with provenance "discovery:<sessionId>". By default, only cited + aspirational queries are promoted; include wasted-surface explicitly when off-ICP competitor gaps should also be tracked. Recurring discovered competitor domains classified as direct-competitor are also merged by default \u2014 pass request.competitorTypes to adopt editorial-media channels or recover legacy unknown entries. Add-only and idempotent: queries/domains already tracked are returned under `skipped`, never inserted twice. Only sessions with status "completed" can be promoted. Call canonry_discover_promote_preview first to inspect candidates.',
3591
+ description: `Adopt a completed discovery session's bucketed queries into the project's tracked basket, tagged with provenance "discovery:<sessionId>". By default, only cited + aspirational queries are promoted; include wasted-surface explicitly when off-ICP competitor gaps should also be tracked. Recurring discovered competitor domains classified as direct-competitor are also merged by default; pass request.competitorTypes to adopt editorial-media channels or recover legacy unknown entries. Cited subdomains are stored as their registrable domain; a competitor that is the project's own site, was cited as two or more different subdomains of one possibly shared host, or is claimed by another competitor's curated alias is left out with a reason in competitorDetails while the rest proceeds. Add-only and idempotent: queries/domains already tracked are returned under \`skipped\`, never inserted twice. Only sessions with status "completed" can be promoted. Call canonry_discover_promote_preview first to inspect candidates.`,
3570
3592
  access: "write",
3571
3593
  tier: "discovery",
3572
3594
  inputSchema: discoveryPromoteInputSchema,
@@ -3794,7 +3816,7 @@ var canonryMcpTools = [
3794
3816
  defineTool({
3795
3817
  name: "canonry_technical_aeo_run",
3796
3818
  title: "Run Technical AEO site audit",
3797
- description: "Start a site-audit run. The run discovers root, sitemap, and linked pages. It defaults to 1,000 pages, and the engine derives the link-observation budget from that page count with a 100,000 floor, so raising maxPages raises it too. An explicit maxEdges is a ceiling that replaces the derivation and can sit below it. It returns {runId, status} and continues in the background. If an active run has identical effective options, this tool returns it; different options are refused. Poll canonry_run_get, then read the crawl and score tools.",
3819
+ description: "Start a site-audit run. The run discovers root, sitemap, and linked pages. Without maxPages it uses the project's saved page budget (siteAuditMaxPages), else the full site (up to 50,000 pages), and the engine derives the link-observation budget from that page count with a 100,000 floor, so raising maxPages raises it too. An explicit maxEdges is a ceiling that replaces the derivation and can sit below it. It returns {runId, status} and continues in the background. If an active run has identical effective options, this tool returns it; different options are refused. Poll canonry_run_get, then read the crawl and score tools.",
3798
3820
  access: "write",
3799
3821
  tier: "monitoring",
3800
3822
  inputSchema: technicalAeoRunInputSchema,