@canonry/canonry 4.154.1 → 4.155.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/AGENTS.md +2 -2
- package/assets/agent-workspace/skills/aero/references/orchestration.md +3 -3
- package/assets/agent-workspace/skills/canonry/SKILL.md +2 -2
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +14 -6
- package/assets/assets/{AuditHistoryPanel-WKf-vvmg.js → AuditHistoryPanel-BlbMBxOY.js} +1 -1
- package/assets/assets/{BacklinksPage-By06DbHN.js → BacklinksPage-DA9EaV9q.js} +1 -1
- package/assets/assets/{HistoryPage-C_PcPiyX.js → HistoryPage-BTrIHjMQ.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-BHnNegEa.js → MeasurementPropertyPage-CN6o5xFg.js} +1 -1
- package/assets/assets/{ProjectPage-VTbW21dz.js → ProjectPage-CsDbgp_0.js} +1 -1
- package/assets/assets/{RunRow-9qn5Eer_.js → RunRow-ch_OlCPs.js} +1 -1
- package/assets/assets/{RunsPage-FxMTprK1.js → RunsPage-T89Y_yS8.js} +1 -1
- package/assets/assets/{SettingsPage-Cr7_PrNW.js → SettingsPage-DnmEq3F9.js} +1 -1
- package/assets/assets/{TrafficPage-D0qk9uMN.js → TrafficPage-CW1UhaJt.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-CXa_3_Gy.js → TrafficSourceDetailPage-r4Ji3wJm.js} +1 -1
- package/assets/assets/{extract-error-message-RkTEH1Vb.js → extract-error-message-a8EErBoZ.js} +1 -1
- package/assets/assets/{index-nSWJ9yka.js → index-BKq6k5Of.js} +26 -26
- package/assets/index.html +1 -1
- package/dist/{chunk-ANSQ6JNO.js → chunk-OSHRDV36.js} +317 -4
- package/dist/{chunk-NNW7TJUZ.js → chunk-VIKPFI6F.js} +200 -5
- package/dist/{chunk-KRMLGFY3.js → chunk-VOL2BSM5.js} +1113 -92
- package/dist/{chunk-JOP2DGXL.js → chunk-YSESZNVT.js} +609 -165
- package/dist/cli.js +319 -7
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-ZY5KOSZV.js → intelligence-service-G4NV3X36.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +8 -8
package/dist/cli.js
CHANGED
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
showFirstRunNotice,
|
|
31
31
|
trackCliCommandFinished,
|
|
32
32
|
trackEvent
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-YSESZNVT.js";
|
|
34
34
|
import {
|
|
35
35
|
CliError,
|
|
36
36
|
EXIT_SYSTEM_ERROR,
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
saveConfigPatch,
|
|
51
51
|
systemError,
|
|
52
52
|
usageError
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-OSHRDV36.js";
|
|
54
54
|
import {
|
|
55
55
|
apiKeys,
|
|
56
56
|
createClient,
|
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
projects,
|
|
59
59
|
queries,
|
|
60
60
|
renderReportHtml
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-VOL2BSM5.js";
|
|
62
62
|
import {
|
|
63
63
|
AdsDeliverySnapshotStatuses,
|
|
64
64
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -122,7 +122,7 @@ import {
|
|
|
122
122
|
providerQuotaPolicySchema,
|
|
123
123
|
resolveProviderInput,
|
|
124
124
|
winnabilityClassSchema
|
|
125
|
-
} from "./chunk-
|
|
125
|
+
} from "./chunk-VIKPFI6F.js";
|
|
126
126
|
|
|
127
127
|
// src/cli.ts
|
|
128
128
|
import { pathToFileURL } from "url";
|
|
@@ -13829,11 +13829,154 @@ async function technicalAeoTrend(project, opts) {
|
|
|
13829
13829
|
}
|
|
13830
13830
|
console.log(lines.join("\n"));
|
|
13831
13831
|
}
|
|
13832
|
+
async function technicalAeoCrawl(project, opts) {
|
|
13833
|
+
const crawl = await getClient27().getTechnicalAeoCrawl(project, { runId: opts.runId });
|
|
13834
|
+
if (isMachineFormat(opts.format)) {
|
|
13835
|
+
console.log(JSON.stringify(crawl, null, 2));
|
|
13836
|
+
return;
|
|
13837
|
+
}
|
|
13838
|
+
if (!crawl.hasCrawlData) {
|
|
13839
|
+
console.log(`No persisted site crawl for "${project}". Run \`canonry technical-aeo run ${project}\` first.`);
|
|
13840
|
+
return;
|
|
13841
|
+
}
|
|
13842
|
+
const lines = [
|
|
13843
|
+
`Site crawl: ${crawl.complete ? "complete" : "partial"} (${crawl.runStatus ?? "unknown"})`,
|
|
13844
|
+
`Root: ${crawl.rootUrl ?? "-"}`,
|
|
13845
|
+
`Pages: ${crawl.counts.pagesFetched} fetched \xB7 ${crawl.counts.pagesDiscovered} discovered \xB7 ${crawl.counts.pagesEligible} eligible`,
|
|
13846
|
+
`Links: ${crawl.counts.edges} internal/external observations \xB7 ${crawl.counts.findings} findings`,
|
|
13847
|
+
`Dead links: ${formatDeadLinkState(crawl.deadLinks)}`
|
|
13848
|
+
];
|
|
13849
|
+
if (crawl.termination) lines.push(`Stopped: ${crawl.termination}`);
|
|
13850
|
+
console.log(lines.join("\n"));
|
|
13851
|
+
}
|
|
13852
|
+
async function technicalAeoCrawlPages(project, opts) {
|
|
13853
|
+
const res = await getClient27().getTechnicalAeoCrawlPages(project, opts);
|
|
13854
|
+
if (opts.format === "jsonl") {
|
|
13855
|
+
emitJsonl(res.pages.map((page) => ({ project, runId: res.runId, ...page })));
|
|
13856
|
+
return;
|
|
13857
|
+
}
|
|
13858
|
+
if (opts.format === "json") {
|
|
13859
|
+
console.log(JSON.stringify(res, null, 2));
|
|
13860
|
+
return;
|
|
13861
|
+
}
|
|
13862
|
+
if (res.pages.length === 0) {
|
|
13863
|
+
console.log(`No persisted crawl pages for "${project}".`);
|
|
13864
|
+
return;
|
|
13865
|
+
}
|
|
13866
|
+
const lines = [`${res.pages.length} of ${res.total} crawl page(s)${res.nextCursor ? " (more available)" : ""}:`, ""];
|
|
13867
|
+
lines.push(`${"Depth".padStart(5)} ${"Score".padStart(5)} ${"Indexability".padEnd(15)} URL`);
|
|
13868
|
+
for (const page of res.pages) {
|
|
13869
|
+
lines.push(`${String(page.depth ?? "-").padStart(5)} ${String(page.auditScore ?? "-").padStart(5)} ${page.indexabilityState.slice(0, 15).padEnd(15)} ${page.url}`);
|
|
13870
|
+
}
|
|
13871
|
+
if (res.nextCursor) lines.push(`
|
|
13872
|
+
Next cursor: ${res.nextCursor}`);
|
|
13873
|
+
console.log(lines.join("\n"));
|
|
13874
|
+
}
|
|
13875
|
+
async function technicalAeoStructure(project, opts) {
|
|
13876
|
+
const res = await getClient27().getTechnicalAeoStructure(project, opts);
|
|
13877
|
+
if (opts.format === "jsonl") {
|
|
13878
|
+
emitJsonl(res.children.map((child) => ({ project, runId: res.runId, parentPath: res.parentPath, ...child })));
|
|
13879
|
+
return;
|
|
13880
|
+
}
|
|
13881
|
+
if (opts.format === "json") {
|
|
13882
|
+
console.log(JSON.stringify(res, null, 2));
|
|
13883
|
+
return;
|
|
13884
|
+
}
|
|
13885
|
+
if (res.children.length === 0) {
|
|
13886
|
+
console.log(`No crawl structure below ${res.parentPath} for "${project}".`);
|
|
13887
|
+
return;
|
|
13888
|
+
}
|
|
13889
|
+
const lines = [`${res.children.length} child path(s) below ${res.parentPath}${res.nextCursor ? " (more available)" : ""}:`, ""];
|
|
13890
|
+
for (const child of res.children) {
|
|
13891
|
+
lines.push(`${String(child.pageCount).padStart(5)} pages ${String(child.inventoryEligibleCount).padStart(5)} eligible ${child.path}`);
|
|
13892
|
+
}
|
|
13893
|
+
if (res.nextCursor) lines.push(`
|
|
13894
|
+
Next cursor: ${res.nextCursor}`);
|
|
13895
|
+
console.log(lines.join("\n"));
|
|
13896
|
+
}
|
|
13897
|
+
async function technicalAeoInternalLinks(project, opts) {
|
|
13898
|
+
const res = await getClient27().getTechnicalAeoInternalLinks(project, opts);
|
|
13899
|
+
if (opts.format === "jsonl") {
|
|
13900
|
+
emitJsonl(res.edges.map((edge) => ({ project, runId: res.runId, ...edge })));
|
|
13901
|
+
return;
|
|
13902
|
+
}
|
|
13903
|
+
if (opts.format === "json") {
|
|
13904
|
+
console.log(JSON.stringify(res, null, 2));
|
|
13905
|
+
return;
|
|
13906
|
+
}
|
|
13907
|
+
if (res.edges.length === 0) {
|
|
13908
|
+
console.log(`No persisted internal links for "${project}".`);
|
|
13909
|
+
return;
|
|
13910
|
+
}
|
|
13911
|
+
const lines = [`${res.edges.length} of ${res.total} internal link(s)${res.nextCursor ? " (more available)" : ""}:`, ""];
|
|
13912
|
+
for (const edge of res.edges) {
|
|
13913
|
+
lines.push(`${edge.followable ? "follow" : "nofollow"} \xD7${edge.occurrences} ${edge.sourceUrl} \u2192 ${edge.targetUrl}`);
|
|
13914
|
+
}
|
|
13915
|
+
if (res.nextCursor) lines.push(`
|
|
13916
|
+
Next cursor: ${res.nextCursor}`);
|
|
13917
|
+
console.log(lines.join("\n"));
|
|
13918
|
+
}
|
|
13919
|
+
async function technicalAeoLinkNeighbors(project, opts) {
|
|
13920
|
+
const res = await getClient27().getTechnicalAeoInternalLinkNeighbors(project, opts);
|
|
13921
|
+
if (isMachineFormat(opts.format)) {
|
|
13922
|
+
console.log(JSON.stringify(res, null, 2));
|
|
13923
|
+
return;
|
|
13924
|
+
}
|
|
13925
|
+
const title = res.url ?? res.nodeKey ?? "page";
|
|
13926
|
+
const lines = [`Internal links for ${title}:`, "", "Inbound:"];
|
|
13927
|
+
for (const edge of res.inbound) lines.push(` ${edge.sourceUrl} \u2192 ${edge.targetUrl}`);
|
|
13928
|
+
if (res.inbound.length === 0) lines.push(" (none)");
|
|
13929
|
+
if (res.inboundTruncated) lines.push(" (truncated)");
|
|
13930
|
+
lines.push("", "Outbound:");
|
|
13931
|
+
for (const edge of res.outbound) lines.push(` ${edge.sourceUrl} \u2192 ${edge.targetUrl}`);
|
|
13932
|
+
if (res.outbound.length === 0) lines.push(" (none)");
|
|
13933
|
+
if (res.outboundTruncated) lines.push(" (truncated)");
|
|
13934
|
+
console.log(lines.join("\n"));
|
|
13935
|
+
}
|
|
13936
|
+
async function technicalAeoDeadLinks(project, opts) {
|
|
13937
|
+
const res = await getClient27().getTechnicalAeoDeadLinks(project, opts);
|
|
13938
|
+
if (opts.format === "jsonl") {
|
|
13939
|
+
if ("deadLinks" in res) {
|
|
13940
|
+
const { deadLinks, ...header } = res;
|
|
13941
|
+
emitJsonl([{ kind: "technical-aeo-dead-links-header", ...header }]);
|
|
13942
|
+
emitJsonl(deadLinks.map((finding) => ({ project, runId: res.runId, state: res.state, ...finding })));
|
|
13943
|
+
} else {
|
|
13944
|
+
emitJsonl([{ kind: "technical-aeo-dead-links-header", ...res }]);
|
|
13945
|
+
}
|
|
13946
|
+
return;
|
|
13947
|
+
}
|
|
13948
|
+
if (isMachineFormat(opts.format)) {
|
|
13949
|
+
console.log(JSON.stringify(res, null, 2));
|
|
13950
|
+
return;
|
|
13951
|
+
}
|
|
13952
|
+
if (res.state === "disabled") {
|
|
13953
|
+
console.log(`Dead-link checks were disabled for crawl ${res.runId}. Re-run with \`--check-dead-links\` to enable them.`);
|
|
13954
|
+
return;
|
|
13955
|
+
}
|
|
13956
|
+
if (res.state === "unavailable") {
|
|
13957
|
+
console.log(`No dead-link check is available for "${project}".`);
|
|
13958
|
+
return;
|
|
13959
|
+
}
|
|
13960
|
+
const lines = [`Dead links: ${res.found} found from ${res.checked} checked (${res.state})`];
|
|
13961
|
+
for (const finding of res.deadLinks) lines.push(`${finding.sourceUrl ?? "-"} \u2192 ${finding.targetUrl ?? "-"}`);
|
|
13962
|
+
if (res.nextCursor) lines.push(`Next cursor: ${res.nextCursor}`);
|
|
13963
|
+
console.log(lines.join("\n"));
|
|
13964
|
+
}
|
|
13965
|
+
function formatDeadLinkState(value) {
|
|
13966
|
+
if (value.state === "disabled") return "disabled (opt in with --check-dead-links)";
|
|
13967
|
+
if (value.state === "unavailable") return "unavailable";
|
|
13968
|
+
return `${value.found ?? 0} found / ${value.checked ?? 0} checked (${value.state})`;
|
|
13969
|
+
}
|
|
13832
13970
|
async function technicalAeoRun(project, opts) {
|
|
13833
13971
|
const client = getClient27();
|
|
13834
13972
|
const { runId, status } = await client.triggerSiteAudit(project, {
|
|
13835
13973
|
sitemapUrl: opts.sitemapUrl,
|
|
13836
|
-
limit: opts.limit
|
|
13974
|
+
limit: opts.limit,
|
|
13975
|
+
maxPages: opts.maxPages,
|
|
13976
|
+
maxEdges: opts.maxEdges,
|
|
13977
|
+
maxDepth: opts.maxDepth,
|
|
13978
|
+
// Explicit opt-in: absence and false are both intentionally disabled.
|
|
13979
|
+
checkDeadLinks: opts.checkDeadLinks === true
|
|
13837
13980
|
});
|
|
13838
13981
|
if (!opts.wait) {
|
|
13839
13982
|
if (isMachineFormat(opts.format)) {
|
|
@@ -13865,6 +14008,17 @@ async function technicalAeoRun(project, opts) {
|
|
|
13865
14008
|
}
|
|
13866
14009
|
|
|
13867
14010
|
// src/cli-commands/technical-aeo.ts
|
|
14011
|
+
function parseOptionalBoolean(input, key, config) {
|
|
14012
|
+
const value = getString(input.values, key);
|
|
14013
|
+
if (value === void 0) return void 0;
|
|
14014
|
+
if (value === "true") return true;
|
|
14015
|
+
if (value === "false") return false;
|
|
14016
|
+
throw usageError(`Error: --${key} must be true or false
|
|
14017
|
+
Usage: ${config.usage}`, {
|
|
14018
|
+
message: `--${key} must be true or false`,
|
|
14019
|
+
details: { command: config.command, usage: config.usage, option: key, value }
|
|
14020
|
+
});
|
|
14021
|
+
}
|
|
13868
14022
|
var TECHNICAL_AEO_CLI_COMMANDS = [
|
|
13869
14023
|
{
|
|
13870
14024
|
path: ["technical-aeo", "score"],
|
|
@@ -13927,14 +14081,18 @@ var TECHNICAL_AEO_CLI_COMMANDS = [
|
|
|
13927
14081
|
},
|
|
13928
14082
|
{
|
|
13929
14083
|
path: ["technical-aeo", "run"],
|
|
13930
|
-
usage: "canonry technical-aeo run <project> [--sitemap-url <url>] [--
|
|
14084
|
+
usage: "canonry technical-aeo run <project> [--sitemap-url <url>] [--max-pages <n>] [--max-edges <n>] [--max-depth <n>] [--check-dead-links] [--wait] [--format json]",
|
|
13931
14085
|
options: {
|
|
13932
14086
|
"sitemap-url": stringOption(),
|
|
13933
14087
|
limit: stringOption(),
|
|
14088
|
+
"max-pages": stringOption(),
|
|
14089
|
+
"max-edges": stringOption(),
|
|
14090
|
+
"max-depth": stringOption(),
|
|
14091
|
+
"check-dead-links": { type: "boolean", default: false },
|
|
13934
14092
|
wait: { type: "boolean", default: false }
|
|
13935
14093
|
},
|
|
13936
14094
|
run: async (input) => {
|
|
13937
|
-
const usage = "canonry technical-aeo run <project> [--sitemap-url <url>] [--
|
|
14095
|
+
const usage = "canonry technical-aeo run <project> [--sitemap-url <url>] [--max-pages <n>] [--max-edges <n>] [--max-depth <n>] [--check-dead-links] [--wait] [--format json]";
|
|
13938
14096
|
const project = requireProject(input, "technical-aeo.run", usage);
|
|
13939
14097
|
await technicalAeoRun(project, {
|
|
13940
14098
|
sitemapUrl: getString(input.values, "sitemap-url"),
|
|
@@ -13943,10 +14101,164 @@ var TECHNICAL_AEO_CLI_COMMANDS = [
|
|
|
13943
14101
|
usage,
|
|
13944
14102
|
message: "--limit must be an integer"
|
|
13945
14103
|
}),
|
|
14104
|
+
maxPages: parseIntegerOption(input, "max-pages", {
|
|
14105
|
+
command: "technical-aeo.run",
|
|
14106
|
+
usage,
|
|
14107
|
+
message: "--max-pages must be an integer"
|
|
14108
|
+
}),
|
|
14109
|
+
maxEdges: parseIntegerOption(input, "max-edges", {
|
|
14110
|
+
command: "technical-aeo.run",
|
|
14111
|
+
usage,
|
|
14112
|
+
message: "--max-edges must be an integer"
|
|
14113
|
+
}),
|
|
14114
|
+
maxDepth: parseIntegerOption(input, "max-depth", {
|
|
14115
|
+
command: "technical-aeo.run",
|
|
14116
|
+
usage,
|
|
14117
|
+
message: "--max-depth must be an integer"
|
|
14118
|
+
}),
|
|
14119
|
+
checkDeadLinks: getBoolean(input.values, "check-dead-links"),
|
|
13946
14120
|
wait: getBoolean(input.values, "wait"),
|
|
13947
14121
|
format: input.format
|
|
13948
14122
|
});
|
|
13949
14123
|
}
|
|
14124
|
+
},
|
|
14125
|
+
{
|
|
14126
|
+
path: ["technical-aeo", "crawl"],
|
|
14127
|
+
usage: "canonry technical-aeo crawl <project> [--run-id <id>] [--format json]",
|
|
14128
|
+
options: { "run-id": stringOption() },
|
|
14129
|
+
run: async (input) => {
|
|
14130
|
+
const usage = "canonry technical-aeo crawl <project> [--run-id <id>] [--format json]";
|
|
14131
|
+
const project = requireProject(input, "technical-aeo.crawl", usage);
|
|
14132
|
+
await technicalAeoCrawl(project, { runId: getString(input.values, "run-id"), format: input.format });
|
|
14133
|
+
}
|
|
14134
|
+
},
|
|
14135
|
+
{
|
|
14136
|
+
path: ["technical-aeo", "crawl-pages"],
|
|
14137
|
+
usage: "canonry technical-aeo crawl-pages <project> [--run-id <id>] [--inventory-eligible true|false] [--fetch-state <state>] [--indexability-state <state>] [--audit-state <state>] [--sort url|path|score-asc|score-desc] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]",
|
|
14138
|
+
options: {
|
|
14139
|
+
"run-id": stringOption(),
|
|
14140
|
+
"inventory-eligible": stringOption(),
|
|
14141
|
+
"fetch-state": stringOption(),
|
|
14142
|
+
"indexability-state": stringOption(),
|
|
14143
|
+
"audit-state": stringOption(),
|
|
14144
|
+
sort: stringOption(),
|
|
14145
|
+
cursor: stringOption(),
|
|
14146
|
+
limit: stringOption()
|
|
14147
|
+
},
|
|
14148
|
+
run: async (input) => {
|
|
14149
|
+
const usage = "canonry technical-aeo crawl-pages <project> [--run-id <id>] [--inventory-eligible true|false] [--fetch-state <state>] [--indexability-state <state>] [--audit-state <state>] [--sort url|path|score-asc|score-desc] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]";
|
|
14150
|
+
const project = requireProject(input, "technical-aeo.crawl-pages", usage);
|
|
14151
|
+
const sort = getString(input.values, "sort");
|
|
14152
|
+
if (sort !== void 0 && !["url", "path", "score-asc", "score-desc"].includes(sort)) {
|
|
14153
|
+
throw usageError(`Error: --sort must be url, path, score-asc, or score-desc
|
|
14154
|
+
Usage: ${usage}`, {
|
|
14155
|
+
message: "--sort must be url, path, score-asc, or score-desc",
|
|
14156
|
+
details: { command: "technical-aeo.crawl-pages", usage, option: "sort", value: sort }
|
|
14157
|
+
});
|
|
14158
|
+
}
|
|
14159
|
+
await technicalAeoCrawlPages(project, {
|
|
14160
|
+
runId: getString(input.values, "run-id"),
|
|
14161
|
+
inventoryEligible: parseOptionalBoolean(input, "inventory-eligible", { command: "technical-aeo.crawl-pages", usage }),
|
|
14162
|
+
fetchState: getString(input.values, "fetch-state"),
|
|
14163
|
+
indexabilityState: getString(input.values, "indexability-state"),
|
|
14164
|
+
auditState: getString(input.values, "audit-state"),
|
|
14165
|
+
sort,
|
|
14166
|
+
cursor: getString(input.values, "cursor"),
|
|
14167
|
+
limit: parseIntegerOption(input, "limit", { command: "technical-aeo.crawl-pages", usage, message: "--limit must be an integer" }),
|
|
14168
|
+
format: input.format
|
|
14169
|
+
});
|
|
14170
|
+
}
|
|
14171
|
+
},
|
|
14172
|
+
{
|
|
14173
|
+
path: ["technical-aeo", "structure"],
|
|
14174
|
+
usage: "canonry technical-aeo structure <project> [--run-id <id>] [--parent-path <path>] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]",
|
|
14175
|
+
options: { "run-id": stringOption(), "parent-path": stringOption(), cursor: stringOption(), limit: stringOption() },
|
|
14176
|
+
run: async (input) => {
|
|
14177
|
+
const usage = "canonry technical-aeo structure <project> [--run-id <id>] [--parent-path <path>] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]";
|
|
14178
|
+
const project = requireProject(input, "technical-aeo.structure", usage);
|
|
14179
|
+
await technicalAeoStructure(project, {
|
|
14180
|
+
runId: getString(input.values, "run-id"),
|
|
14181
|
+
parentPath: getString(input.values, "parent-path"),
|
|
14182
|
+
cursor: getString(input.values, "cursor"),
|
|
14183
|
+
limit: parseIntegerOption(input, "limit", { command: "technical-aeo.structure", usage, message: "--limit must be an integer" }),
|
|
14184
|
+
format: input.format
|
|
14185
|
+
});
|
|
14186
|
+
}
|
|
14187
|
+
},
|
|
14188
|
+
{
|
|
14189
|
+
path: ["technical-aeo", "links"],
|
|
14190
|
+
usage: "canonry technical-aeo links <project> [--run-id <id>] [--source-url <url>] [--target-url <url>] [--followable|--nofollow] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]",
|
|
14191
|
+
options: {
|
|
14192
|
+
"run-id": stringOption(),
|
|
14193
|
+
"source-url": stringOption(),
|
|
14194
|
+
"target-url": stringOption(),
|
|
14195
|
+
followable: { type: "boolean", default: false },
|
|
14196
|
+
nofollow: { type: "boolean", default: false },
|
|
14197
|
+
cursor: stringOption(),
|
|
14198
|
+
limit: stringOption()
|
|
14199
|
+
},
|
|
14200
|
+
run: async (input) => {
|
|
14201
|
+
const usage = "canonry technical-aeo links <project> [--run-id <id>] [--source-url <url>] [--target-url <url>] [--followable|--nofollow] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]";
|
|
14202
|
+
const project = requireProject(input, "technical-aeo.links", usage);
|
|
14203
|
+
const followable = getBoolean(input.values, "followable");
|
|
14204
|
+
const nofollow = getBoolean(input.values, "nofollow");
|
|
14205
|
+
if (followable && nofollow) {
|
|
14206
|
+
throw usageError(`Error: --followable and --nofollow cannot be combined
|
|
14207
|
+
Usage: ${usage}`, {
|
|
14208
|
+
message: "--followable and --nofollow cannot be combined",
|
|
14209
|
+
details: { command: "technical-aeo.links", usage }
|
|
14210
|
+
});
|
|
14211
|
+
}
|
|
14212
|
+
await technicalAeoInternalLinks(project, {
|
|
14213
|
+
runId: getString(input.values, "run-id"),
|
|
14214
|
+
sourceUrl: getString(input.values, "source-url"),
|
|
14215
|
+
targetUrl: getString(input.values, "target-url"),
|
|
14216
|
+
followable: followable ? true : nofollow ? false : void 0,
|
|
14217
|
+
cursor: getString(input.values, "cursor"),
|
|
14218
|
+
limit: parseIntegerOption(input, "limit", { command: "technical-aeo.links", usage, message: "--limit must be an integer" }),
|
|
14219
|
+
format: input.format
|
|
14220
|
+
});
|
|
14221
|
+
}
|
|
14222
|
+
},
|
|
14223
|
+
{
|
|
14224
|
+
path: ["technical-aeo", "links", "neighbors"],
|
|
14225
|
+
usage: "canonry technical-aeo links neighbors <project> (--node-key <key>|--url <url>) [--run-id <id>] [--limit <n>] [--format json]",
|
|
14226
|
+
options: { "run-id": stringOption(), "node-key": stringOption(), url: stringOption(), limit: stringOption() },
|
|
14227
|
+
run: async (input) => {
|
|
14228
|
+
const usage = "canonry technical-aeo links neighbors <project> (--node-key <key>|--url <url>) [--run-id <id>] [--limit <n>] [--format json]";
|
|
14229
|
+
const project = requireProject(input, "technical-aeo.links.neighbors", usage);
|
|
14230
|
+
const nodeKey = getString(input.values, "node-key");
|
|
14231
|
+
const url = getString(input.values, "url");
|
|
14232
|
+
if (!nodeKey && !url) {
|
|
14233
|
+
throw usageError(`Error: --node-key or --url is required
|
|
14234
|
+
Usage: ${usage}`, {
|
|
14235
|
+
message: "--node-key or --url is required",
|
|
14236
|
+
details: { command: "technical-aeo.links.neighbors", usage }
|
|
14237
|
+
});
|
|
14238
|
+
}
|
|
14239
|
+
await technicalAeoLinkNeighbors(project, {
|
|
14240
|
+
runId: getString(input.values, "run-id"),
|
|
14241
|
+
nodeKey,
|
|
14242
|
+
url,
|
|
14243
|
+
limit: parseIntegerOption(input, "limit", { command: "technical-aeo.links.neighbors", usage, message: "--limit must be an integer" }),
|
|
14244
|
+
format: input.format
|
|
14245
|
+
});
|
|
14246
|
+
}
|
|
14247
|
+
},
|
|
14248
|
+
{
|
|
14249
|
+
path: ["technical-aeo", "dead-links"],
|
|
14250
|
+
usage: "canonry technical-aeo dead-links <project> [--run-id <id>] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]",
|
|
14251
|
+
options: { "run-id": stringOption(), cursor: stringOption(), limit: stringOption() },
|
|
14252
|
+
run: async (input) => {
|
|
14253
|
+
const usage = "canonry technical-aeo dead-links <project> [--run-id <id>] [--cursor <cursor>] [--limit <n>] [--format json|jsonl]";
|
|
14254
|
+
const project = requireProject(input, "technical-aeo.dead-links", usage);
|
|
14255
|
+
await technicalAeoDeadLinks(project, {
|
|
14256
|
+
runId: getString(input.values, "run-id"),
|
|
14257
|
+
cursor: getString(input.values, "cursor"),
|
|
14258
|
+
limit: parseIntegerOption(input, "limit", { command: "technical-aeo.dead-links", usage, message: "--limit must be an integer" }),
|
|
14259
|
+
format: input.format
|
|
14260
|
+
});
|
|
14261
|
+
}
|
|
13950
14262
|
}
|
|
13951
14263
|
];
|
|
13952
14264
|
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createServer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YSESZNVT.js";
|
|
4
4
|
import {
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-OSHRDV36.js";
|
|
7
|
+
import "./chunk-VOL2BSM5.js";
|
|
8
|
+
import "./chunk-VIKPFI6F.js";
|
|
9
9
|
export {
|
|
10
10
|
createServer,
|
|
11
11
|
loadConfig
|
package/dist/mcp.js
CHANGED
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
PACKAGE_VERSION,
|
|
4
4
|
canonryMcpTools,
|
|
5
5
|
createApiClient
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OSHRDV36.js";
|
|
7
7
|
import {
|
|
8
8
|
isReadOnlyKey
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-VIKPFI6F.js";
|
|
10
10
|
|
|
11
11
|
// src/mcp/cli.ts
|
|
12
12
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canonry/canonry",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.155.0",
|
|
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",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"node": ">=22.14.0"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@
|
|
42
|
+
"@canonry/aeo-audit": "4.6.2",
|
|
43
43
|
"@anthropic-ai/sdk": "^0.91.1",
|
|
44
44
|
"@fastify/rate-limit": "^11.2.0",
|
|
45
45
|
"@fastify/static": "^9.1.1",
|
|
@@ -68,21 +68,21 @@
|
|
|
68
68
|
"tsx": "^4.19.0",
|
|
69
69
|
"@ainyc/canonry-api-client": "0.0.0",
|
|
70
70
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
71
|
-
"@ainyc/canonry-config": "0.0.0",
|
|
72
|
-
"@ainyc/canonry-db": "0.0.0",
|
|
73
71
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
74
|
-
"@ainyc/canonry-
|
|
72
|
+
"@ainyc/canonry-db": "0.0.0",
|
|
73
|
+
"@ainyc/canonry-config": "0.0.0",
|
|
75
74
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
76
75
|
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
77
|
-
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
78
76
|
"@ainyc/canonry-integration-google": "0.0.0",
|
|
79
77
|
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
78
|
+
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
80
79
|
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
80
|
+
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
81
81
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
82
|
-
"@ainyc/canonry-intelligence": "0.0.0",
|
|
83
82
|
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
84
|
-
"@ainyc/canonry-
|
|
83
|
+
"@ainyc/canonry-intelligence": "0.0.0",
|
|
85
84
|
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
85
|
+
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
86
86
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
87
87
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
88
88
|
"@ainyc/canonry-provider-perplexity": "0.0.0",
|