@canonry/canonry 5.20.3 → 5.21.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.
- package/assets/agent-workspace/skills/aero/references/portfolio-analysis.md +1 -1
- package/assets/agent-workspace/skills/aero/references/reporting.md +9 -4
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +3 -0
- package/assets/assets/{AuditHistoryPanel-BSh3Oezj.js → AuditHistoryPanel-CjxWA3lx.js} +1 -1
- package/assets/assets/{BacklinksPage-DQ59dhCx.js → BacklinksPage-Bdd164Up.js} +1 -1
- package/assets/assets/{HistoryPage-BBvgid3o.js → HistoryPage-BvJmE-kP.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-Dmb18JbT.js → MeasurementPropertyPage-HuP6RMZ-.js} +1 -1
- package/assets/assets/{ProjectPage-CPg0q2Dy.js → ProjectPage-DOvXVbyy.js} +1 -1
- package/assets/assets/{RunRow-BK8sZCID.js → RunRow-Cnb3JOBw.js} +1 -1
- package/assets/assets/{RunsPage-CIcVBTdP.js → RunsPage-Dvz1JYIm.js} +1 -1
- package/assets/assets/{SettingsPage-Bc3aR-gz.js → SettingsPage-DYGvphkg.js} +1 -1
- package/assets/assets/{SiteHealthSection-FF14aIXT.js → SiteHealthSection-CUNiKaod.js} +3 -3
- package/assets/assets/{TrafficPage-C_qoeGDl.js → TrafficPage-Bf4Tq95q.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-B3i_B2MI.js → TrafficSourceDetailPage-CIuLWZgT.js} +1 -1
- package/assets/assets/{extract-error-message-BisUn6nN.js → extract-error-message-DZex1e4H.js} +1 -1
- package/assets/assets/{index-Dht7JNX5.js → index-CeXW-lzj.js} +21 -21
- package/assets/assets/{react-sigma_core.esm.min-tWhS09SS.js → react-sigma_core.esm.min-CxvtwEkv.js} +1 -1
- package/assets/assets/{v2-overview-adapter-CAoeWKQJ.js → v2-overview-adapter-Bh4qIzLp.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-TOSPZ7I5.js → chunk-2LO7FLVD.js} +48 -5
- package/dist/{chunk-7YGOE4R2.js → chunk-FAVYLZQV.js} +341 -96
- package/dist/{chunk-PXVJ3P5G.js → chunk-FRWZWJB3.js} +4 -4
- package/dist/{chunk-KHNPBUUN.js → chunk-HDJHQPW3.js} +2 -2
- package/dist/{chunk-CVUR3O5G.js → chunk-MEAKE5W7.js} +3 -3
- package/dist/{chunk-H6XSHOS5.js → chunk-NFN5GSEJ.js} +7 -7
- package/dist/{chunk-JJPZ4OQ2.js → chunk-WUT3G2GM.js} +5 -3
- package/dist/cli.js +69 -12
- package/dist/{demo-server-JYDAUEP2.js → demo-server-7BVVVXPM.js} +4 -4
- package/dist/index.js +6 -6
- package/dist/{intelligence-service-H4LGPJLZ.js → intelligence-service-3UUKRAZ5.js} +2 -2
- package/dist/mcp.js +4 -4
- package/package.json +12 -12
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
PACKAGE_VERSION,
|
|
6
6
|
canonryMcpTools,
|
|
7
7
|
isMachineFormat
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WUT3G2GM.js";
|
|
9
9
|
import {
|
|
10
10
|
AGENT_PROVIDER_IDS,
|
|
11
11
|
CANONRY_NPM_PACKAGE_URL,
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
skillsClientSchema,
|
|
38
38
|
upgradeCaveatFor,
|
|
39
39
|
upgradeCommandFor
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-2LO7FLVD.js";
|
|
41
41
|
|
|
42
42
|
// src/config.ts
|
|
43
43
|
import fs from "fs";
|
|
@@ -8891,12 +8891,12 @@ var ApiClient = class {
|
|
|
8891
8891
|
})
|
|
8892
8892
|
);
|
|
8893
8893
|
}
|
|
8894
|
-
async getVisibilityCompare(project, from, to) {
|
|
8894
|
+
async getVisibilityCompare(project, from, to, selection = {}) {
|
|
8895
8895
|
return this.invoke(
|
|
8896
8896
|
() => getApiV1ProjectsByNameVisibilityCompare({
|
|
8897
8897
|
client: this.heyClient,
|
|
8898
8898
|
path: { name: project },
|
|
8899
|
-
query: { from, to }
|
|
8899
|
+
query: { from, to, ...selection }
|
|
8900
8900
|
})
|
|
8901
8901
|
);
|
|
8902
8902
|
}
|
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
siteCrawlGraphNodes,
|
|
6
6
|
siteCrawlPages,
|
|
7
7
|
siteCrawlSnapshots
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-FAVYLZQV.js";
|
|
9
9
|
import {
|
|
10
10
|
SITE_CRAWL_GRAPH_MAX_EDGES,
|
|
11
11
|
SITE_CRAWL_GRAPH_MAX_NODES,
|
|
12
12
|
TEMPLATE_LINK_RATIO_THRESHOLD
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-2LO7FLVD.js";
|
|
14
14
|
|
|
15
15
|
// src/site-crawl-graph-layout.ts
|
|
16
16
|
import crypto from "crypto";
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
installSkills,
|
|
5
5
|
loadConfigRaw,
|
|
6
6
|
saveConfigPatch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-FRWZWJB3.js";
|
|
8
8
|
import {
|
|
9
9
|
PACKAGE_VERSION
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-WUT3G2GM.js";
|
|
11
11
|
import {
|
|
12
12
|
SKILL_MANIFEST_FILENAME,
|
|
13
13
|
SkillsClients
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-2LO7FLVD.js";
|
|
15
15
|
|
|
16
16
|
// src/skills-autosync.ts
|
|
17
17
|
import fs from "fs";
|
|
@@ -13,19 +13,19 @@ import {
|
|
|
13
13
|
resolveOperatorApiKeyIds,
|
|
14
14
|
runWithUsageTags,
|
|
15
15
|
saveConfigPatch
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-FRWZWJB3.js";
|
|
17
17
|
import {
|
|
18
18
|
deleteSiteCrawlGraphLayout,
|
|
19
19
|
persistSiteCrawlGraphLayout,
|
|
20
20
|
prepareSiteCrawlGraphLayout
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-HDJHQPW3.js";
|
|
22
22
|
import {
|
|
23
23
|
CanonryMcpToolNames,
|
|
24
24
|
CliError,
|
|
25
25
|
PACKAGE_VERSION,
|
|
26
26
|
canonryMcpTools,
|
|
27
27
|
isMachineFormat
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-WUT3G2GM.js";
|
|
29
29
|
import {
|
|
30
30
|
CC_CACHE_DIR,
|
|
31
31
|
DUCKDB_SPEC,
|
|
@@ -186,7 +186,7 @@ import {
|
|
|
186
186
|
siteLivenessState,
|
|
187
187
|
toAlertView,
|
|
188
188
|
usageCounters
|
|
189
|
-
} from "./chunk-
|
|
189
|
+
} from "./chunk-FAVYLZQV.js";
|
|
190
190
|
import {
|
|
191
191
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
192
192
|
AGENT_NONE,
|
|
@@ -353,7 +353,7 @@ import {
|
|
|
353
353
|
visibilityReportRequestSchema,
|
|
354
354
|
winnabilityClassLabel,
|
|
355
355
|
withRetry
|
|
356
|
-
} from "./chunk-
|
|
356
|
+
} from "./chunk-2LO7FLVD.js";
|
|
357
357
|
|
|
358
358
|
// src/runtime-context.ts
|
|
359
359
|
function cliRuntimeContext(env = process.env, stdio = process) {
|
|
@@ -6648,7 +6648,7 @@ function nonBlank(value) {
|
|
|
6648
6648
|
return trimmed ? trimmed : void 0;
|
|
6649
6649
|
}
|
|
6650
6650
|
function resolveBuildCommit(env = process.env) {
|
|
6651
|
-
const embedded = true ? "
|
|
6651
|
+
const embedded = true ? "9367462bc55240da41850bf9358ec7327c387258" : void 0;
|
|
6652
6652
|
return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
|
|
6653
6653
|
}
|
|
6654
6654
|
function resolveInstanceIdentity(env = process.env) {
|
|
@@ -12235,7 +12235,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
12235
12235
|
return result2;
|
|
12236
12236
|
}
|
|
12237
12237
|
async function backfillInsightsCommand(project, opts) {
|
|
12238
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
12238
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-3UUKRAZ5.js");
|
|
12239
12239
|
const config = loadConfig();
|
|
12240
12240
|
const db = createClient(config.database);
|
|
12241
12241
|
migrate(db);
|
|
@@ -104,8 +104,9 @@ import {
|
|
|
104
104
|
trafficConnectWordpressRequestSchema,
|
|
105
105
|
trafficEventKindSchema,
|
|
106
106
|
trafficSeriesGranularitySchema,
|
|
107
|
+
visibilityCompareSelectionSchema,
|
|
107
108
|
visibilityReportRequestSchema
|
|
108
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-2LO7FLVD.js";
|
|
109
110
|
|
|
110
111
|
// src/cli-error.ts
|
|
111
112
|
function isMachineFormat(format) {
|
|
@@ -1579,17 +1580,18 @@ var canonryMcpTools = [
|
|
|
1579
1580
|
defineTool({
|
|
1580
1581
|
name: "canonry_visibility_compare",
|
|
1581
1582
|
title: "Compare AEO visibility month over month",
|
|
1582
|
-
description: "Statistically honest month-over-month AEO comparison in ONE call \u2014 use this instead of hand-computing deltas from two visibility-stats calls. Share of voice (`mention-share-of-voice`, `driftRobust: true`) is less exposed to broad model-wide naming propensity than absolute rates, but it never overrides model continuity. The response restricts to common query/provider pairs, then includes only providers with exactly one known, identical configured model id in both months. `continuity` surfaces every provider, its model evidence, and whether it was excluded for a changed, mixed mid-month, or unknown model. When no provider remains, metrics return `model-discontinuous` or `model-unknown`, never a directional call. A silent upstream version bump under an unchanged configured id remains undetectable. `from` must be a month strictly before `to`.",
|
|
1583
|
+
description: "Statistically honest month-over-month AEO comparison in ONE call \u2014 use this instead of hand-computing deltas from two visibility-stats calls. Share of voice (`mention-share-of-voice`, `driftRobust: true`) is less exposed to broad model-wide naming propensity than absolute rates, but it never overrides model continuity. Branded and non-brand mention/cited rates are separate additive metrics; classification-unavailable never falls back to pooling. provider and location narrow every frame; scope, scopeKey and marketKey answer from the frozen Advanced frame alone (refused when a month holds unreconstructable schema-v1 runs) and deduplicate shared executions. Without scope/marketKey, Advanced class metrics use classComparison for their basket and continuity while the four original metrics keep the project frame. On frozen frames, answers with incomplete source capture leave every citation figure (excludedUnknown). The response restricts to common query/provider pairs, then includes only providers with exactly one known, identical configured model id in both months. `continuity` surfaces every provider, its model evidence, and whether it was excluded for a changed, mixed mid-month, or unknown model. When no provider remains, metrics return `model-discontinuous` or `model-unknown`, never a directional call. A silent upstream version bump under an unchanged configured id remains undetectable. `from` must be a month strictly before `to`.",
|
|
1583
1584
|
access: "read",
|
|
1584
1585
|
tier: "monitoring",
|
|
1585
1586
|
inputSchema: z3.object({
|
|
1586
1587
|
project: projectNameSchema,
|
|
1588
|
+
...visibilityCompareSelectionSchema.shape,
|
|
1587
1589
|
from: z3.string().describe('Earlier calendar month (YYYY-MM), the baseline. Must be strictly before "to".'),
|
|
1588
1590
|
to: z3.string().describe('Later calendar month (YYYY-MM), compared against "from".')
|
|
1589
1591
|
}),
|
|
1590
1592
|
annotations: readAnnotations(),
|
|
1591
1593
|
openApiOperations: ["GET /api/v1/projects/{name}/visibility-compare"],
|
|
1592
|
-
handler: (client, input) => client.getVisibilityCompare(input.project, input.from, input.to)
|
|
1594
|
+
handler: (client, input) => client.getVisibilityCompare(input.project, input.from, input.to, { scope: input.scope, scopeKey: input.scopeKey, marketKey: input.marketKey, provider: input.provider, location: input.location })
|
|
1593
1595
|
}),
|
|
1594
1596
|
defineTool({
|
|
1595
1597
|
name: "canonry_content_targets",
|
package/dist/cli.js
CHANGED
|
@@ -35,11 +35,11 @@ import {
|
|
|
35
35
|
trackCliCommandFinished,
|
|
36
36
|
trackEvent,
|
|
37
37
|
waitForServerRuntimeStartup
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-NFN5GSEJ.js";
|
|
39
39
|
import {
|
|
40
40
|
autoSyncSkills,
|
|
41
41
|
formatAutoSyncNotice
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-MEAKE5W7.js";
|
|
43
43
|
import {
|
|
44
44
|
configExists,
|
|
45
45
|
createApiClient,
|
|
@@ -56,13 +56,13 @@ import {
|
|
|
56
56
|
saveConfig,
|
|
57
57
|
saveConfigPatch,
|
|
58
58
|
shouldPrintServeSkillsNudge
|
|
59
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-FRWZWJB3.js";
|
|
60
60
|
import {
|
|
61
61
|
DEFAULT_DEMO_TRUSTED_PROXIES,
|
|
62
62
|
trustedProxiesProblem,
|
|
63
63
|
trustedProxyProblem
|
|
64
64
|
} from "./chunk-RB2F4D3Z.js";
|
|
65
|
-
import "./chunk-
|
|
65
|
+
import "./chunk-HDJHQPW3.js";
|
|
66
66
|
import {
|
|
67
67
|
CliError,
|
|
68
68
|
EXIT_SYSTEM_ERROR,
|
|
@@ -74,7 +74,7 @@ import {
|
|
|
74
74
|
runMeasurementDraftAction,
|
|
75
75
|
systemError,
|
|
76
76
|
usageError
|
|
77
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-WUT3G2GM.js";
|
|
78
78
|
import {
|
|
79
79
|
CLOUDFLARE_WORKER_BINDINGS,
|
|
80
80
|
CLOUDFLARE_WORKER_GENERATED_MARKER,
|
|
@@ -89,7 +89,7 @@ import {
|
|
|
89
89
|
queries,
|
|
90
90
|
renderReportHtml,
|
|
91
91
|
runs
|
|
92
|
-
} from "./chunk-
|
|
92
|
+
} from "./chunk-FAVYLZQV.js";
|
|
93
93
|
import {
|
|
94
94
|
AdsDeliverySnapshotStatuses,
|
|
95
95
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -146,6 +146,7 @@ import {
|
|
|
146
146
|
formatRunErrorOneLine,
|
|
147
147
|
formatWholePercent,
|
|
148
148
|
googleAdsMetricsWindowSchema,
|
|
149
|
+
isVisibilityCompareClassMetric,
|
|
149
150
|
logQuerySchema,
|
|
150
151
|
measurementChangesQuerySchema,
|
|
151
152
|
measurementDataQualityQuerySchema,
|
|
@@ -175,9 +176,10 @@ import {
|
|
|
175
176
|
shareOfVoiceLabel,
|
|
176
177
|
shareOfVoiceReason,
|
|
177
178
|
snapshotProviderModeSchema,
|
|
179
|
+
visibilityCompareSelectionSchema,
|
|
178
180
|
visibilityReportRequestSchema,
|
|
179
181
|
winnabilityClassSchema
|
|
180
|
-
} from "./chunk-
|
|
182
|
+
} from "./chunk-2LO7FLVD.js";
|
|
181
183
|
|
|
182
184
|
// src/cli.ts
|
|
183
185
|
import { pathToFileURL } from "url";
|
|
@@ -442,7 +444,7 @@ function parseDemoTrustedProxies(values) {
|
|
|
442
444
|
async function demoCommand(options) {
|
|
443
445
|
const { host, port } = parseDemoListenOptions(options);
|
|
444
446
|
const trustProxy = parseDemoTrustedProxies(options.trustProxy);
|
|
445
|
-
const { createDemoServer } = await import("./demo-server-
|
|
447
|
+
const { createDemoServer } = await import("./demo-server-7BVVVXPM.js");
|
|
446
448
|
const app = await createDemoServer({ trustProxy });
|
|
447
449
|
let stopping = false;
|
|
448
450
|
const stop = () => {
|
|
@@ -17420,7 +17422,7 @@ function pct3(rate) {
|
|
|
17420
17422
|
async function showVisibilityCompare(project, opts) {
|
|
17421
17423
|
if (!opts.from || !opts.to) throw new Error("visibility-compare requires --from <YYYY-MM> and --to <YYYY-MM>");
|
|
17422
17424
|
const client = createApiClient();
|
|
17423
|
-
const data = await client.getVisibilityCompare(project, opts.from, opts.to);
|
|
17425
|
+
const data = await client.getVisibilityCompare(project, opts.from, opts.to, { scope: opts.scope, scopeKey: opts.scopeKey, marketKey: opts.marketKey, provider: opts.provider, location: opts.location });
|
|
17424
17426
|
if (isMachineFormat(opts.format)) {
|
|
17425
17427
|
console.log(JSON.stringify(data, null, 2));
|
|
17426
17428
|
return;
|
|
@@ -17428,6 +17430,7 @@ async function showVisibilityCompare(project, opts) {
|
|
|
17428
17430
|
printVisibilityCompare(data);
|
|
17429
17431
|
}
|
|
17430
17432
|
function periodCell(p) {
|
|
17433
|
+
if (p.availability === "classification-unavailable") return "unavailable: query classification";
|
|
17431
17434
|
if (p.availability === "no-competitive-frame") {
|
|
17432
17435
|
return `unavailable: no competitive frame (${p.numerator} observed)`;
|
|
17433
17436
|
}
|
|
@@ -17450,12 +17453,24 @@ function verdictCell(m) {
|
|
|
17450
17453
|
}
|
|
17451
17454
|
}
|
|
17452
17455
|
function metricQueryClassLabel(metric) {
|
|
17456
|
+
if (metric.queryClass === "branded") return "branded queries";
|
|
17453
17457
|
if (metric.queryClass === "non-brand") return "non-brand queries";
|
|
17454
17458
|
if (metric.queryClass === "pooled") return "pooled queries; classification unavailable";
|
|
17455
17459
|
return "all queries";
|
|
17456
17460
|
}
|
|
17461
|
+
function selectionLabel(selection) {
|
|
17462
|
+
if (!selection) return null;
|
|
17463
|
+
const parts = [];
|
|
17464
|
+
if (selection.scope && selection.scope !== "project") parts.push(`${selection.scope} ${selection.scopeKey ?? ""}`.trim());
|
|
17465
|
+
if (selection.marketKey) parts.push(`market ${selection.marketKey}`);
|
|
17466
|
+
if (selection.provider) parts.push(`engine ${selection.provider}`);
|
|
17467
|
+
if (selection.location) parts.push(`location ${selection.location}`);
|
|
17468
|
+
return parts.length > 0 ? parts.join(" \xB7 ") : null;
|
|
17469
|
+
}
|
|
17457
17470
|
function printVisibilityCompare(data) {
|
|
17458
17471
|
console.log(`AEO month over month: ${data.project} ${data.from.month} -> ${data.to.month}`);
|
|
17472
|
+
const selection = selectionLabel(data.selection);
|
|
17473
|
+
if (selection) console.log(`Selection: ${selection}`);
|
|
17459
17474
|
const b = data.basket;
|
|
17460
17475
|
const excl = [];
|
|
17461
17476
|
if (b.excludedFromOnly > 0) excl.push(`${b.excludedFromOnly} only in ${data.from.month}`);
|
|
@@ -17469,8 +17484,19 @@ function printVisibilityCompare(data) {
|
|
|
17469
17484
|
console.log(`Continuity: ${data.continuity.status.replace("-", " ")} \u2014 no directional call is made.`);
|
|
17470
17485
|
}
|
|
17471
17486
|
console.log("");
|
|
17487
|
+
if (data.classComparison) {
|
|
17488
|
+
const frame = data.classComparison;
|
|
17489
|
+
console.log(`Class metrics basket (frozen Advanced): ${frame.basket.queryCount} queries; engines: ${frame.basket.providers.join(", ") || "none"}`);
|
|
17490
|
+
const classSweeps = `Class basket sweeps: ${frame.from.month} ${frame.from.runCount}, ${frame.to.month} ${frame.to.runCount}; continuity: ${frame.continuity.status}`;
|
|
17491
|
+
const classLow = frame.from.lowRunCount || frame.to.lowRunCount;
|
|
17492
|
+
console.log(classLow ? `${classSweeps} (below the 5-sweep floor \u2014 class intervals are wide, a "moved" verdict is unlikely to be reachable)` : classSweeps);
|
|
17493
|
+
for (const provider of frame.continuity.providers) {
|
|
17494
|
+
if (provider.status !== "included") console.log(`Class basket excludes ${provider.provider}: ${provider.fromModels.join("/") || "?"} -> ${provider.toModels.join("/") || "?"} (${provider.status})`);
|
|
17495
|
+
}
|
|
17496
|
+
console.log("");
|
|
17497
|
+
}
|
|
17472
17498
|
const rows = data.metrics.map((m) => ({
|
|
17473
|
-
label: `${m.label} \xB7 ${metricQueryClassLabel(m)}${m.driftRobust ? " *" : ""}`,
|
|
17499
|
+
label: `${m.label} \xB7 ${metricQueryClassLabel(m)}${data.classComparison && isVisibilityCompareClassMetric(m.key) ? " \xB7 class basket" : ""}${m.driftRobust ? " *" : ""}`,
|
|
17474
17500
|
to: periodCell(m.to),
|
|
17475
17501
|
from: periodCell(m.from),
|
|
17476
17502
|
verdict: verdictCell(m)
|
|
@@ -17600,7 +17626,32 @@ function parseQueryClass(value) {
|
|
|
17600
17626
|
}
|
|
17601
17627
|
return value;
|
|
17602
17628
|
}
|
|
17603
|
-
var COMPARE_USAGE = "canonry visibility-compare <project> --from <YYYY-MM> --to <YYYY-MM> [--format json]";
|
|
17629
|
+
var COMPARE_USAGE = "canonry visibility-compare <project> --from <YYYY-MM> --to <YYYY-MM> [--scope project|group|market|property] [--scope-key <key>] [--market-key <key>] [--provider <engine>] [--location <label|none>] [--format json]";
|
|
17630
|
+
var COMPARE_SELECTION_FLAGS = {
|
|
17631
|
+
scope: "--scope",
|
|
17632
|
+
scopeKey: "--scope-key",
|
|
17633
|
+
marketKey: "--market-key",
|
|
17634
|
+
provider: "--provider",
|
|
17635
|
+
location: "--location"
|
|
17636
|
+
};
|
|
17637
|
+
function parseCompareSelection(values) {
|
|
17638
|
+
const parsed = visibilityCompareSelectionSchema.safeParse({
|
|
17639
|
+
scope: getString(values, "scope"),
|
|
17640
|
+
scopeKey: getString(values, "scope-key"),
|
|
17641
|
+
marketKey: getString(values, "market-key"),
|
|
17642
|
+
provider: getString(values, "provider"),
|
|
17643
|
+
location: getString(values, "location")
|
|
17644
|
+
});
|
|
17645
|
+
if (parsed.success) return parsed.data;
|
|
17646
|
+
const issue = parsed.error.issues[0];
|
|
17647
|
+
const flag = COMPARE_SELECTION_FLAGS[String(issue.path[0])] ?? "--scope";
|
|
17648
|
+
const message = flag === "--scope" ? "--scope must be one of: project, group, market, property" : `${flag} must not be empty`;
|
|
17649
|
+
throw usageError(`Error: ${message}
|
|
17650
|
+
Usage: ${COMPARE_USAGE}`, {
|
|
17651
|
+
message,
|
|
17652
|
+
details: { command: "visibility-compare", usage: COMPARE_USAGE }
|
|
17653
|
+
});
|
|
17654
|
+
}
|
|
17604
17655
|
var VISIBILITY_STATS_CLI_COMMANDS = [
|
|
17605
17656
|
{
|
|
17606
17657
|
path: ["visibility-stats"],
|
|
@@ -17637,13 +17688,19 @@ var VISIBILITY_STATS_CLI_COMMANDS = [
|
|
|
17637
17688
|
usage: COMPARE_USAGE,
|
|
17638
17689
|
options: {
|
|
17639
17690
|
from: stringOption(),
|
|
17640
|
-
to: stringOption()
|
|
17691
|
+
to: stringOption(),
|
|
17692
|
+
scope: stringOption(),
|
|
17693
|
+
"scope-key": stringOption(),
|
|
17694
|
+
"market-key": stringOption(),
|
|
17695
|
+
provider: stringOption(),
|
|
17696
|
+
location: stringOption()
|
|
17641
17697
|
},
|
|
17642
17698
|
run: async (input) => {
|
|
17643
17699
|
const project = requireProject(input, "visibility-compare", COMPARE_USAGE);
|
|
17644
17700
|
await showVisibilityCompare(project, {
|
|
17645
17701
|
from: getString(input.values, "from"),
|
|
17646
17702
|
to: getString(input.values, "to"),
|
|
17703
|
+
...parseCompareSelection(input.values),
|
|
17647
17704
|
format: input.format
|
|
17648
17705
|
});
|
|
17649
17706
|
}
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
layoutSiteCrawlGraphInput,
|
|
6
6
|
persistSiteCrawlGraphLayout
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-HDJHQPW3.js";
|
|
8
8
|
import {
|
|
9
9
|
PACKAGE_VERSION,
|
|
10
10
|
canonryMcpTools
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-WUT3G2GM.js";
|
|
12
12
|
import {
|
|
13
13
|
HISTORY_WINDOW_RUNS,
|
|
14
14
|
IntelligenceService,
|
|
@@ -84,7 +84,7 @@ import {
|
|
|
84
84
|
siteCrawlPages,
|
|
85
85
|
siteCrawlSnapshots,
|
|
86
86
|
trafficSources
|
|
87
|
-
} from "./chunk-
|
|
87
|
+
} from "./chunk-FAVYLZQV.js";
|
|
88
88
|
import {
|
|
89
89
|
RunKinds,
|
|
90
90
|
SiteCrawlFetchStates,
|
|
@@ -108,7 +108,7 @@ import {
|
|
|
108
108
|
placementLinkDecision,
|
|
109
109
|
siteAuditPageFactorSchema,
|
|
110
110
|
wilsonInterval
|
|
111
|
-
} from "./chunk-
|
|
111
|
+
} from "./chunk-2LO7FLVD.js";
|
|
112
112
|
|
|
113
113
|
// src/demo-server.ts
|
|
114
114
|
import { dirname, join as join2 } from "path";
|
package/dist/index.js
CHANGED
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
createGoogleMarketingCredentialStore,
|
|
4
4
|
createGoogleMarketingRuntime,
|
|
5
5
|
createServer
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NFN5GSEJ.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-FRWZWJB3.js";
|
|
10
|
+
import "./chunk-HDJHQPW3.js";
|
|
11
|
+
import "./chunk-WUT3G2GM.js";
|
|
12
|
+
import "./chunk-FAVYLZQV.js";
|
|
13
|
+
import "./chunk-2LO7FLVD.js";
|
|
14
14
|
export {
|
|
15
15
|
GoogleMarketingRuntimeError,
|
|
16
16
|
createGoogleMarketingCredentialStore,
|
package/dist/mcp.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoSyncSkills
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MEAKE5W7.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient,
|
|
6
6
|
createCanonryMcpServer
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-FRWZWJB3.js";
|
|
8
|
+
import "./chunk-WUT3G2GM.js";
|
|
9
9
|
import {
|
|
10
10
|
isReadOnlyKey,
|
|
11
11
|
updateCheckEnvOptOut
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-2LO7FLVD.js";
|
|
13
13
|
|
|
14
14
|
// src/mcp/cli.ts
|
|
15
15
|
import { randomUUID } from "crypto";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canonry/canonry",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.21.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Self-hosted AI visibility (AEO) platform: track how ChatGPT, Claude, Gemini, and Perplexity cite your domain, join it with Search Console, GA4, server-side traffic, and paid media, and fix what you find through agent tools (CLI, REST, MCP). Local SQLite.",
|
|
6
6
|
"keywords": [
|
|
@@ -86,32 +86,32 @@
|
|
|
86
86
|
"@types/node-cron": "^3.0.11",
|
|
87
87
|
"tsup": "^8.5.1",
|
|
88
88
|
"tsx": "^4.19.0",
|
|
89
|
-
"@ainyc/canonry-api-client": "0.0.0",
|
|
90
|
-
"@ainyc/canonry-config": "0.0.0",
|
|
91
89
|
"@ainyc/canonry-web": "0.0.0",
|
|
90
|
+
"@ainyc/canonry-api-client": "0.0.0",
|
|
92
91
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
93
92
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
93
|
+
"@ainyc/canonry-config": "0.0.0",
|
|
94
94
|
"@ainyc/canonry-db": "0.0.0",
|
|
95
|
-
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
96
|
-
"@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
|
|
97
95
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
98
|
-
"@ainyc/canonry-integration-
|
|
96
|
+
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
99
97
|
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
100
|
-
"@ainyc/canonry-integration-
|
|
98
|
+
"@ainyc/canonry-integration-google": "0.0.0",
|
|
99
|
+
"@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
|
|
101
100
|
"@ainyc/canonry-integration-google-ads": "0.0.0",
|
|
102
|
-
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
103
101
|
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
102
|
+
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
103
|
+
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
104
104
|
"@ainyc/canonry-integration-google-tag-manager": "0.0.0",
|
|
105
105
|
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
106
|
-
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
107
106
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
107
|
+
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
108
108
|
"@ainyc/canonry-intelligence": "0.0.0",
|
|
109
109
|
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
110
|
-
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
111
|
-
"@ainyc/canonry-provider-local": "0.0.0",
|
|
112
110
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
111
|
+
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
113
112
|
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
114
|
-
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
113
|
+
"@ainyc/canonry-provider-perplexity": "0.0.0",
|
|
114
|
+
"@ainyc/canonry-provider-local": "0.0.0"
|
|
115
115
|
},
|
|
116
116
|
"scripts": {
|
|
117
117
|
"build": "pnpm run build:cli && pnpm run build:web",
|