@ainyc/canonry 4.71.1 → 4.72.2
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/regression-playbook.md +1 -1
- package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +7 -0
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +20 -2
- package/assets/assets/{BacklinksPage-CQNPYiDA.js → BacklinksPage-CjfpwZEH.js} +1 -1
- package/assets/assets/{ChartPrimitives-BShpLrpS.js → ChartPrimitives-Ckf2FrUy.js} +1 -1
- package/assets/assets/{ProjectPage-CJLw1m4O.js → ProjectPage-DZeplYeC.js} +6 -6
- package/assets/assets/{RunRow-Dq1vs1hA.js → RunRow-BuFyG0V_.js} +1 -1
- package/assets/assets/{RunsPage-CBMa2xWh.js → RunsPage-D-pr000K.js} +1 -1
- package/assets/assets/{SettingsPage-B_XeJDdg.js → SettingsPage-CiaapCYn.js} +1 -1
- package/assets/assets/{TrafficPage-vJv_Mf6f.js → TrafficPage-B40xytJD.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-C3yFwVmQ.js → TrafficSourceDetailPage-7hHem-gM.js} +1 -1
- package/assets/assets/{extract-error-message-CIpeBFLl.js → extract-error-message-3GkDsu1h.js} +1 -1
- package/assets/assets/{index-BXLM3-cs.js → index-BVdH2O9w.js} +77 -77
- package/assets/assets/{server-traffic-Yt3jIi3g.js → server-traffic-CsgPsudZ.js} +1 -1
- package/assets/assets/{trash-2-xGvNHhEj.js → trash-2-B8Ipf9rI.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-CWEV3YMZ.js → chunk-BRXQKUGY.js} +92 -4
- package/dist/{chunk-ETJDAMGA.js → chunk-J7SDOU2J.js} +616 -89
- package/dist/{chunk-ZNWMVYYU.js → chunk-NYZSY5QJ.js} +126 -7
- package/dist/{chunk-5FM7QRYD.js → chunk-SJI6JGPN.js} +1249 -1005
- package/dist/cli.js +306 -84
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-ISO4VGEC.js → intelligence-service-JNF3JRFR.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +9 -9
package/dist/cli.js
CHANGED
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
setTelemetrySource,
|
|
28
28
|
showFirstRunNotice,
|
|
29
29
|
trackEvent
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-BRXQKUGY.js";
|
|
31
31
|
import {
|
|
32
32
|
CliError,
|
|
33
33
|
EXIT_SYSTEM_ERROR,
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
saveConfig,
|
|
45
45
|
saveConfigPatch,
|
|
46
46
|
usageError
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-NYZSY5QJ.js";
|
|
48
48
|
import {
|
|
49
49
|
apiKeys,
|
|
50
50
|
createClient,
|
|
@@ -52,7 +52,7 @@ import {
|
|
|
52
52
|
projects,
|
|
53
53
|
queries,
|
|
54
54
|
renderReportHtml
|
|
55
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-J7SDOU2J.js";
|
|
56
56
|
import {
|
|
57
57
|
CcReleaseSyncStatuses,
|
|
58
58
|
CheckScopes,
|
|
@@ -69,8 +69,9 @@ import {
|
|
|
69
69
|
normalizeProjectAliases,
|
|
70
70
|
notificationEventSchema,
|
|
71
71
|
providerQuotaPolicySchema,
|
|
72
|
-
resolveProviderInput
|
|
73
|
-
|
|
72
|
+
resolveProviderInput,
|
|
73
|
+
winnabilityClassSchema
|
|
74
|
+
} from "./chunk-SJI6JGPN.js";
|
|
74
75
|
|
|
75
76
|
// src/cli.ts
|
|
76
77
|
import { pathToFileURL } from "url";
|
|
@@ -2548,7 +2549,7 @@ async function gaSocialReferralSummary(project, opts) {
|
|
|
2548
2549
|
console.log(` Sessions: ${traffic.socialSessions} (${traffic.socialSharePct}% of ${traffic.totalSessions} total)`);
|
|
2549
2550
|
console.log(` Users: ${traffic.socialUsers}`);
|
|
2550
2551
|
console.log();
|
|
2551
|
-
const fmtTrend = (
|
|
2552
|
+
const fmtTrend = (pct3) => pct3 === null ? "n/a" : `${pct3 >= 0 ? "+" : ""}${pct3}%`;
|
|
2552
2553
|
console.log(` 7d trend: ${fmtTrend(trend.trend7dPct)} (${trend.socialSessions7d} vs ${trend.socialSessionsPrev7d})`);
|
|
2553
2554
|
console.log(` 30d trend: ${fmtTrend(trend.trend30dPct)} (${trend.socialSessions30d} vs ${trend.socialSessionsPrev30d})`);
|
|
2554
2555
|
if (trend.biggestMover) {
|
|
@@ -2591,7 +2592,7 @@ async function gaSocialReferralSummary(project, opts) {
|
|
|
2591
2592
|
async function gaAttribution(project, opts) {
|
|
2592
2593
|
const client = getClient5();
|
|
2593
2594
|
const traffic = await client.gaTraffic(project);
|
|
2594
|
-
const fmtTrend = (
|
|
2595
|
+
const fmtTrend = (pct3) => pct3 === null ? "n/a" : `${pct3 >= 0 ? "+" : ""}${pct3}%`;
|
|
2595
2596
|
if (opts?.trend) {
|
|
2596
2597
|
const trend = await client.gaAttributionTrend(project);
|
|
2597
2598
|
if (isMachineFormat(opts.format)) {
|
|
@@ -3155,9 +3156,9 @@ async function gbpPlaces(project, opts) {
|
|
|
3155
3156
|
console.log(` ${p.locationName} [${p.tier}] ${amenities}`);
|
|
3156
3157
|
}
|
|
3157
3158
|
}
|
|
3158
|
-
function fmtDelta(
|
|
3159
|
-
if (
|
|
3160
|
-
return `${
|
|
3159
|
+
function fmtDelta(pct3) {
|
|
3160
|
+
if (pct3 === null) return "n/a";
|
|
3161
|
+
return `${pct3 >= 0 ? "+" : ""}${pct3}%`;
|
|
3161
3162
|
}
|
|
3162
3163
|
async function gbpSummary(project, opts) {
|
|
3163
3164
|
const client = getClient6();
|
|
@@ -6575,7 +6576,7 @@ async function showAnalytics(project, options) {
|
|
|
6575
6576
|
break;
|
|
6576
6577
|
}
|
|
6577
6578
|
case "sources": {
|
|
6578
|
-
const data = await client.getAnalyticsSources(project, options.window);
|
|
6579
|
+
const data = await client.getAnalyticsSources(project, { window: options.window });
|
|
6579
6580
|
results.sources = data;
|
|
6580
6581
|
if (!isMachineFormat(options.format)) printSources(data);
|
|
6581
6582
|
break;
|
|
@@ -6600,14 +6601,14 @@ function printMetrics(data) {
|
|
|
6600
6601
|
console.log(`
|
|
6601
6602
|
Citation Rate Trends (${data.window})`);
|
|
6602
6603
|
console.log("\u2500".repeat(50));
|
|
6603
|
-
const
|
|
6604
|
-
console.log(` Overall: ${
|
|
6604
|
+
const pct3 = (n) => `${(n * 100).toFixed(1)}%`;
|
|
6605
|
+
console.log(` Overall: ${pct3(data.overall.citationRate)} (${data.overall.cited}/${data.overall.total})`);
|
|
6605
6606
|
console.log(` Trend: ${data.trend}`);
|
|
6606
6607
|
if (Object.keys(data.byProvider).length > 0) {
|
|
6607
6608
|
console.log(`
|
|
6608
6609
|
By Provider:`);
|
|
6609
6610
|
for (const [provider, metric] of Object.entries(data.byProvider)) {
|
|
6610
|
-
console.log(` ${provider.padEnd(10)} ${
|
|
6611
|
+
console.log(` ${provider.padEnd(10)} ${pct3(metric.citationRate).padStart(6)} (${metric.cited}/${metric.total})`);
|
|
6611
6612
|
}
|
|
6612
6613
|
}
|
|
6613
6614
|
if (data.buckets.length > 0) {
|
|
@@ -6616,7 +6617,7 @@ Citation Rate Trends (${data.window})`);
|
|
|
6616
6617
|
for (const bucket of data.buckets) {
|
|
6617
6618
|
const start = bucket.startDate.slice(0, 10);
|
|
6618
6619
|
const bar = bucket.total > 0 ? "\u2588".repeat(Math.round(bucket.citationRate * 20)) : "";
|
|
6619
|
-
console.log(` ${start} ${
|
|
6620
|
+
console.log(` ${start} ${pct3(bucket.citationRate).padStart(6)} ${bar}`);
|
|
6620
6621
|
}
|
|
6621
6622
|
}
|
|
6622
6623
|
const providersInBuckets = [...new Set(data.buckets.flatMap((b) => Object.keys(b.byProvider ?? {})))].sort();
|
|
@@ -6630,7 +6631,7 @@ Citation Rate Trends (${data.window})`);
|
|
|
6630
6631
|
if (!metric) continue;
|
|
6631
6632
|
const start = bucket.startDate.slice(0, 10);
|
|
6632
6633
|
const bar = metric.total > 0 ? "\u2588".repeat(Math.round(metric.citationRate * 20)) : "";
|
|
6633
|
-
console.log(` ${start} ${
|
|
6634
|
+
console.log(` ${start} ${pct3(metric.citationRate).padStart(6)} ${bar}`);
|
|
6634
6635
|
}
|
|
6635
6636
|
}
|
|
6636
6637
|
}
|
|
@@ -6668,18 +6669,80 @@ Source Origin Breakdown`);
|
|
|
6668
6669
|
return;
|
|
6669
6670
|
}
|
|
6670
6671
|
for (const cat of data.overall) {
|
|
6671
|
-
const
|
|
6672
|
+
const pct3 = `${(cat.percentage * 100).toFixed(1)}%`;
|
|
6672
6673
|
const domains = cat.topDomains.slice(0, 3).map((d) => d.domain).join(", ");
|
|
6673
|
-
console.log(` ${cat.label.padEnd(20)} ${
|
|
6674
|
+
console.log(` ${cat.label.padEnd(20)} ${pct3.padStart(6)} (${cat.count}) ${domains}`);
|
|
6674
6675
|
}
|
|
6675
6676
|
}
|
|
6676
6677
|
|
|
6677
|
-
// src/commands/
|
|
6678
|
+
// src/commands/sources.ts
|
|
6678
6679
|
function getClient15() {
|
|
6679
6680
|
return createApiClient();
|
|
6680
6681
|
}
|
|
6681
|
-
|
|
6682
|
+
var pct = (n) => `${(n * 100).toFixed(1)}%`;
|
|
6683
|
+
async function showSources(project, options) {
|
|
6684
|
+
if (options.limit !== void 0 && (!Number.isInteger(options.limit) || options.limit <= 0)) {
|
|
6685
|
+
throw usageError("Error: --limit must be a positive integer\nUsage: canonry sources <project> [--rank] [--limit N] [--by-provider] [--window 7d|30d|90d|all] [--format json|jsonl]", {
|
|
6686
|
+
message: "--limit must be a positive integer",
|
|
6687
|
+
details: { command: "sources", option: "limit", value: options.limit }
|
|
6688
|
+
});
|
|
6689
|
+
}
|
|
6682
6690
|
const client = getClient15();
|
|
6691
|
+
const data = await client.getAnalyticsSources(project, { window: options.window, limit: options.limit });
|
|
6692
|
+
if (options.format === "jsonl") {
|
|
6693
|
+
emitJsonl(data.ranked.entries.map((e) => ({ project, ...e })));
|
|
6694
|
+
return;
|
|
6695
|
+
}
|
|
6696
|
+
if (isMachineFormat(options.format)) {
|
|
6697
|
+
console.log(JSON.stringify(data, null, 2));
|
|
6698
|
+
return;
|
|
6699
|
+
}
|
|
6700
|
+
printSourceRankings(data, options);
|
|
6701
|
+
}
|
|
6702
|
+
function printSourceRankings(data, options) {
|
|
6703
|
+
console.log(`
|
|
6704
|
+
Source Rankings (${data.window})`);
|
|
6705
|
+
console.log("\u2500".repeat(50));
|
|
6706
|
+
if (data.ranked.totalCitedSlots === 0) {
|
|
6707
|
+
console.log(" No source data available");
|
|
6708
|
+
return;
|
|
6709
|
+
}
|
|
6710
|
+
console.log("\n By surface class:");
|
|
6711
|
+
printSurfaceClasses(data.ranked);
|
|
6712
|
+
if (options.rank) {
|
|
6713
|
+
console.log("\n Top sources:");
|
|
6714
|
+
printRankedEntries(data.ranked);
|
|
6715
|
+
}
|
|
6716
|
+
if (options.byProvider) {
|
|
6717
|
+
console.log("\n By provider:");
|
|
6718
|
+
for (const [provider, list] of Object.entries(data.byProvider)) {
|
|
6719
|
+
console.log(`
|
|
6720
|
+
${provider} (${list.totalCitedSlots} cited slots):`);
|
|
6721
|
+
printRankedEntries(list, " ");
|
|
6722
|
+
}
|
|
6723
|
+
}
|
|
6724
|
+
}
|
|
6725
|
+
function printSurfaceClasses(list) {
|
|
6726
|
+
for (const c of list.bySurfaceClass) {
|
|
6727
|
+
const noun = c.domainCount === 1 ? "domain" : "domains";
|
|
6728
|
+
console.log(` ${c.label.padEnd(28)} ${pct(c.percentage).padStart(6)} (${c.count}) ${c.domainCount} ${noun}`);
|
|
6729
|
+
}
|
|
6730
|
+
}
|
|
6731
|
+
function printRankedEntries(list, indent = "") {
|
|
6732
|
+
for (const e of list.entries) {
|
|
6733
|
+
console.log(`${indent} ${e.domain.padEnd(32)} ${String(e.count).padStart(4)} ${pct(e.percentage).padStart(6)} ${e.surfaceClass}`);
|
|
6734
|
+
}
|
|
6735
|
+
if (list.truncatedDomainCount > 0) {
|
|
6736
|
+
console.log(`${indent} \u2026 +${list.truncatedDomainCount} more domains (${list.truncatedCitedSlots} cited slots)`);
|
|
6737
|
+
}
|
|
6738
|
+
}
|
|
6739
|
+
|
|
6740
|
+
// src/commands/evidence.ts
|
|
6741
|
+
function getClient16() {
|
|
6742
|
+
return createApiClient();
|
|
6743
|
+
}
|
|
6744
|
+
async function showEvidence(project, format) {
|
|
6745
|
+
const client = getClient16();
|
|
6683
6746
|
const timeline = await client.getTimeline(project);
|
|
6684
6747
|
if (format === "json") {
|
|
6685
6748
|
const enriched = timeline.map((entry) => ({
|
|
@@ -6746,11 +6809,11 @@ async function loadLatestRunForExport(client, project) {
|
|
|
6746
6809
|
}
|
|
6747
6810
|
|
|
6748
6811
|
// src/commands/history.ts
|
|
6749
|
-
function
|
|
6812
|
+
function getClient17() {
|
|
6750
6813
|
return createApiClient();
|
|
6751
6814
|
}
|
|
6752
6815
|
async function showHistory(project, format) {
|
|
6753
|
-
const client =
|
|
6816
|
+
const client = getClient17();
|
|
6754
6817
|
try {
|
|
6755
6818
|
const entries = await client.getHistory(project);
|
|
6756
6819
|
if (format === "json") {
|
|
@@ -6789,11 +6852,11 @@ async function showHistory(project, format) {
|
|
|
6789
6852
|
}
|
|
6790
6853
|
|
|
6791
6854
|
// src/commands/status.ts
|
|
6792
|
-
function
|
|
6855
|
+
function getClient18() {
|
|
6793
6856
|
return createApiClient();
|
|
6794
6857
|
}
|
|
6795
6858
|
async function showStatus(project, format) {
|
|
6796
|
-
const client =
|
|
6859
|
+
const client = getClient18();
|
|
6797
6860
|
const projectData = await client.getProject(project);
|
|
6798
6861
|
const latest = await getLatestRunSummary(client, project);
|
|
6799
6862
|
if (isMachineFormat(format)) {
|
|
@@ -6905,6 +6968,31 @@ var OPERATOR_CLI_COMMANDS = [
|
|
|
6905
6968
|
});
|
|
6906
6969
|
}
|
|
6907
6970
|
},
|
|
6971
|
+
{
|
|
6972
|
+
path: ["sources"],
|
|
6973
|
+
usage: "canonry sources <project> [--rank] [--limit N] [--by-provider] [--window 7d|30d|90d|all] [--format json|jsonl]",
|
|
6974
|
+
options: {
|
|
6975
|
+
rank: { type: "boolean", default: false },
|
|
6976
|
+
"by-provider": { type: "boolean", default: false },
|
|
6977
|
+
limit: stringOption(),
|
|
6978
|
+
window: stringOption()
|
|
6979
|
+
},
|
|
6980
|
+
run: async (input) => {
|
|
6981
|
+
const usage = "canonry sources <project> [--rank] [--limit N] [--by-provider] [--window 7d|30d|90d|all] [--format json|jsonl]";
|
|
6982
|
+
const project = requireProject(input, "sources", usage);
|
|
6983
|
+
await showSources(project, {
|
|
6984
|
+
rank: getBoolean(input.values, "rank"),
|
|
6985
|
+
byProvider: getBoolean(input.values, "by-provider"),
|
|
6986
|
+
limit: parseIntegerOption(input, "limit", {
|
|
6987
|
+
message: "--limit must be an integer",
|
|
6988
|
+
usage,
|
|
6989
|
+
command: "sources"
|
|
6990
|
+
}),
|
|
6991
|
+
window: getString(input.values, "window"),
|
|
6992
|
+
format: input.format
|
|
6993
|
+
});
|
|
6994
|
+
}
|
|
6995
|
+
},
|
|
6908
6996
|
{
|
|
6909
6997
|
path: ["apply"],
|
|
6910
6998
|
usage: "canonry apply <file...> [--format json]",
|
|
@@ -6924,11 +7012,11 @@ var OPERATOR_CLI_COMMANDS = [
|
|
|
6924
7012
|
];
|
|
6925
7013
|
|
|
6926
7014
|
// src/commands/project.ts
|
|
6927
|
-
function
|
|
7015
|
+
function getClient19() {
|
|
6928
7016
|
return createApiClient();
|
|
6929
7017
|
}
|
|
6930
7018
|
async function createProject(name, opts) {
|
|
6931
|
-
const client =
|
|
7019
|
+
const client = getClient19();
|
|
6932
7020
|
const result = await client.putProject(name, {
|
|
6933
7021
|
displayName: opts.displayName,
|
|
6934
7022
|
canonicalDomain: opts.domain,
|
|
@@ -6944,7 +7032,7 @@ async function createProject(name, opts) {
|
|
|
6944
7032
|
console.log(`Project created: ${result.name} (${result.id})`);
|
|
6945
7033
|
}
|
|
6946
7034
|
async function listProjects(format) {
|
|
6947
|
-
const client =
|
|
7035
|
+
const client = getClient19();
|
|
6948
7036
|
const projects2 = await client.listProjects();
|
|
6949
7037
|
if (format === "json") {
|
|
6950
7038
|
console.log(JSON.stringify(projects2, null, 2));
|
|
@@ -6976,7 +7064,7 @@ async function listProjects(format) {
|
|
|
6976
7064
|
}
|
|
6977
7065
|
}
|
|
6978
7066
|
async function showProject(name, format) {
|
|
6979
|
-
const client =
|
|
7067
|
+
const client = getClient19();
|
|
6980
7068
|
const project = await client.getProject(name);
|
|
6981
7069
|
if (isMachineFormat(format)) {
|
|
6982
7070
|
console.log(JSON.stringify(project, null, 2));
|
|
@@ -7005,7 +7093,7 @@ async function showProject(name, format) {
|
|
|
7005
7093
|
if (project.updatedAt) console.log(` Updated: ${project.updatedAt}`);
|
|
7006
7094
|
}
|
|
7007
7095
|
async function updateProjectSettings(name, opts) {
|
|
7008
|
-
const client =
|
|
7096
|
+
const client = getClient19();
|
|
7009
7097
|
const project = await client.getProject(name);
|
|
7010
7098
|
let ownedDomains = opts.ownedDomains ?? project.ownedDomains ?? [];
|
|
7011
7099
|
if (opts.addOwnedDomain) {
|
|
@@ -7042,7 +7130,7 @@ async function updateProjectSettings(name, opts) {
|
|
|
7042
7130
|
console.log(`Project updated: ${result.name}`);
|
|
7043
7131
|
}
|
|
7044
7132
|
async function deleteProject(name, opts) {
|
|
7045
|
-
const client =
|
|
7133
|
+
const client = getClient19();
|
|
7046
7134
|
const isJson = isMachineFormat(opts?.format);
|
|
7047
7135
|
if (opts?.dryRun) {
|
|
7048
7136
|
const preview = await client.previewProjectDelete(name);
|
|
@@ -7072,7 +7160,7 @@ async function deleteProject(name, opts) {
|
|
|
7072
7160
|
console.log(`Project deleted: ${name}`);
|
|
7073
7161
|
}
|
|
7074
7162
|
async function addLocation(project, opts) {
|
|
7075
|
-
const client =
|
|
7163
|
+
const client = getClient19();
|
|
7076
7164
|
const location = await client.addLocation(project, {
|
|
7077
7165
|
label: opts.label,
|
|
7078
7166
|
city: opts.city,
|
|
@@ -7087,7 +7175,7 @@ async function addLocation(project, opts) {
|
|
|
7087
7175
|
console.log(`Location added: ${opts.label} (${opts.city}, ${opts.region}, ${opts.country})`);
|
|
7088
7176
|
}
|
|
7089
7177
|
async function listLocations(project, format) {
|
|
7090
|
-
const client =
|
|
7178
|
+
const client = getClient19();
|
|
7091
7179
|
const result = await client.listLocations(project);
|
|
7092
7180
|
if (format === "json") {
|
|
7093
7181
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -7121,7 +7209,7 @@ async function listLocations(project, format) {
|
|
|
7121
7209
|
}
|
|
7122
7210
|
}
|
|
7123
7211
|
async function removeLocation(project, label, format) {
|
|
7124
|
-
const client =
|
|
7212
|
+
const client = getClient19();
|
|
7125
7213
|
await client.removeLocation(project, label);
|
|
7126
7214
|
if (isMachineFormat(format)) {
|
|
7127
7215
|
console.log(JSON.stringify({ project, label, removed: true }, null, 2));
|
|
@@ -7130,7 +7218,7 @@ async function removeLocation(project, label, format) {
|
|
|
7130
7218
|
console.log(`Location removed: ${label}`);
|
|
7131
7219
|
}
|
|
7132
7220
|
async function setDefaultLocation(project, label, format) {
|
|
7133
|
-
const client =
|
|
7221
|
+
const client = getClient19();
|
|
7134
7222
|
const result = await client.setDefaultLocation(project, label);
|
|
7135
7223
|
if (isMachineFormat(format)) {
|
|
7136
7224
|
console.log(JSON.stringify({ project, ...result }, null, 2));
|
|
@@ -7371,12 +7459,12 @@ var REPORT_CLI_COMMANDS = [
|
|
|
7371
7459
|
];
|
|
7372
7460
|
|
|
7373
7461
|
// src/commands/run.ts
|
|
7374
|
-
function
|
|
7462
|
+
function getClient20() {
|
|
7375
7463
|
return createApiClient();
|
|
7376
7464
|
}
|
|
7377
7465
|
var TERMINAL_STATUSES = /* @__PURE__ */ new Set(["completed", "partial", "failed", "cancelled"]);
|
|
7378
7466
|
async function triggerRun(project, opts) {
|
|
7379
|
-
const client =
|
|
7467
|
+
const client = getClient20();
|
|
7380
7468
|
const body = {};
|
|
7381
7469
|
if (opts?.provider) {
|
|
7382
7470
|
const providerInputs = opts.provider.split(",").map((s) => s.trim()).filter(Boolean);
|
|
@@ -7478,7 +7566,7 @@ async function triggerRun(project, opts) {
|
|
|
7478
7566
|
}
|
|
7479
7567
|
}
|
|
7480
7568
|
async function triggerRunAll(opts) {
|
|
7481
|
-
const client =
|
|
7569
|
+
const client = getClient20();
|
|
7482
7570
|
const projects2 = await client.listProjects();
|
|
7483
7571
|
if (projects2.length === 0) {
|
|
7484
7572
|
if (isMachineFormat(opts?.format)) {
|
|
@@ -7561,7 +7649,7 @@ async function triggerRunAll(opts) {
|
|
|
7561
7649
|
}
|
|
7562
7650
|
}
|
|
7563
7651
|
async function cancelRun(project, runId, format) {
|
|
7564
|
-
const client =
|
|
7652
|
+
const client = getClient20();
|
|
7565
7653
|
let targetId = runId;
|
|
7566
7654
|
if (!targetId) {
|
|
7567
7655
|
const runs = await client.listRuns(project);
|
|
@@ -7593,7 +7681,7 @@ To cancel by ID : canonry run cancel ${project} <run-id>`,
|
|
|
7593
7681
|
console.log(`Run ${result.id} cancelled.`);
|
|
7594
7682
|
}
|
|
7595
7683
|
async function showRun(id, format) {
|
|
7596
|
-
const client =
|
|
7684
|
+
const client = getClient20();
|
|
7597
7685
|
const run = await client.getRun(id);
|
|
7598
7686
|
if (isMachineFormat(format)) {
|
|
7599
7687
|
console.log(JSON.stringify(run, null, 2));
|
|
@@ -7602,7 +7690,7 @@ async function showRun(id, format) {
|
|
|
7602
7690
|
printRunDetail(run);
|
|
7603
7691
|
}
|
|
7604
7692
|
async function listRuns(project, opts) {
|
|
7605
|
-
const client =
|
|
7693
|
+
const client = getClient20();
|
|
7606
7694
|
const runs = await client.listRuns(project, opts?.limit, opts?.kind);
|
|
7607
7695
|
if (opts?.format === "json") {
|
|
7608
7696
|
console.log(JSON.stringify(runs, null, 2));
|
|
@@ -7777,11 +7865,11 @@ var RUN_CLI_COMMANDS = [
|
|
|
7777
7865
|
];
|
|
7778
7866
|
|
|
7779
7867
|
// src/commands/schedule.ts
|
|
7780
|
-
function
|
|
7868
|
+
function getClient21() {
|
|
7781
7869
|
return createApiClient();
|
|
7782
7870
|
}
|
|
7783
7871
|
async function setSchedule(project, opts) {
|
|
7784
|
-
const client =
|
|
7872
|
+
const client = getClient21();
|
|
7785
7873
|
const body = {};
|
|
7786
7874
|
if (opts.kind) body.kind = opts.kind;
|
|
7787
7875
|
if (opts.sourceId) body.sourceId = opts.sourceId;
|
|
@@ -7798,7 +7886,7 @@ async function setSchedule(project, opts) {
|
|
|
7798
7886
|
printSchedule(result);
|
|
7799
7887
|
}
|
|
7800
7888
|
async function showSchedule(project, format, kind) {
|
|
7801
|
-
const client =
|
|
7889
|
+
const client = getClient21();
|
|
7802
7890
|
const result = await client.getSchedule(project, kind);
|
|
7803
7891
|
if (isMachineFormat(format)) {
|
|
7804
7892
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -7807,7 +7895,7 @@ async function showSchedule(project, format, kind) {
|
|
|
7807
7895
|
printSchedule(result);
|
|
7808
7896
|
}
|
|
7809
7897
|
async function enableSchedule(project, format, kind) {
|
|
7810
|
-
const client =
|
|
7898
|
+
const client = getClient21();
|
|
7811
7899
|
const current = await client.getSchedule(project, kind);
|
|
7812
7900
|
const body = { kind: current.kind, timezone: current.timezone, enabled: true };
|
|
7813
7901
|
if (current.preset) body.preset = current.preset;
|
|
@@ -7822,7 +7910,7 @@ async function enableSchedule(project, format, kind) {
|
|
|
7822
7910
|
console.log(`Schedule enabled for "${project}" (kind: ${result.kind})`);
|
|
7823
7911
|
}
|
|
7824
7912
|
async function disableSchedule(project, format, kind) {
|
|
7825
|
-
const client =
|
|
7913
|
+
const client = getClient21();
|
|
7826
7914
|
const current = await client.getSchedule(project, kind);
|
|
7827
7915
|
const body = { kind: current.kind, timezone: current.timezone, enabled: false };
|
|
7828
7916
|
if (current.preset) body.preset = current.preset;
|
|
@@ -7837,7 +7925,7 @@ async function disableSchedule(project, format, kind) {
|
|
|
7837
7925
|
console.log(`Schedule disabled for "${project}" (kind: ${result.kind})`);
|
|
7838
7926
|
}
|
|
7839
7927
|
async function removeSchedule(project, format, kind) {
|
|
7840
|
-
const client =
|
|
7928
|
+
const client = getClient21();
|
|
7841
7929
|
await client.deleteSchedule(project, kind);
|
|
7842
7930
|
const resolvedKind = kind ?? "answer-visibility";
|
|
7843
7931
|
if (isMachineFormat(format)) {
|
|
@@ -7955,11 +8043,11 @@ var SCHEDULE_CLI_COMMANDS = [
|
|
|
7955
8043
|
];
|
|
7956
8044
|
|
|
7957
8045
|
// src/commands/settings.ts
|
|
7958
|
-
function
|
|
8046
|
+
function getClient22() {
|
|
7959
8047
|
return createApiClient();
|
|
7960
8048
|
}
|
|
7961
8049
|
async function setProvider(name, opts) {
|
|
7962
|
-
const client =
|
|
8050
|
+
const client = getClient22();
|
|
7963
8051
|
const { format, ...payload } = opts;
|
|
7964
8052
|
const result = await client.updateProvider(name, payload);
|
|
7965
8053
|
if (isMachineFormat(format)) {
|
|
@@ -7975,7 +8063,7 @@ async function setProvider(name, opts) {
|
|
|
7975
8063
|
}
|
|
7976
8064
|
}
|
|
7977
8065
|
async function showSettings(format) {
|
|
7978
|
-
const client =
|
|
8066
|
+
const client = getClient22();
|
|
7979
8067
|
const config = loadConfig();
|
|
7980
8068
|
const settings = await client.getSettings();
|
|
7981
8069
|
if (isMachineFormat(format)) {
|
|
@@ -8522,7 +8610,7 @@ function wrapText(font, text, size, maxWidth) {
|
|
|
8522
8610
|
}
|
|
8523
8611
|
|
|
8524
8612
|
// src/commands/snapshot.ts
|
|
8525
|
-
function
|
|
8613
|
+
function getClient23() {
|
|
8526
8614
|
return createApiClient();
|
|
8527
8615
|
}
|
|
8528
8616
|
function slugify(value) {
|
|
@@ -8533,7 +8621,7 @@ function autoOutputPath(companyName, ext) {
|
|
|
8533
8621
|
return `${slugify(companyName)}-snapshot-${date}.${ext}`;
|
|
8534
8622
|
}
|
|
8535
8623
|
async function createSnapshotReport(companyName, opts) {
|
|
8536
|
-
const client =
|
|
8624
|
+
const client = getClient23();
|
|
8537
8625
|
const report = await client.createSnapshot({
|
|
8538
8626
|
companyName,
|
|
8539
8627
|
domain: opts.domain,
|
|
@@ -8930,8 +9018,8 @@ function renderHuman(overview) {
|
|
|
8930
9018
|
printScore("Competitor press.", scores.competitorPressure);
|
|
8931
9019
|
printScore("Run status ", scores.runStatus);
|
|
8932
9020
|
console.log(`
|
|
8933
|
-
Queries cited: ${queryCounts.citedQueries}/${queryCounts.totalQueries} (${
|
|
8934
|
-
console.log(` Queries mentioned: ${queryCounts.mentionedQueries}/${queryCounts.totalQueries} (${
|
|
9021
|
+
Queries cited: ${queryCounts.citedQueries}/${queryCounts.totalQueries} (${pct2(queryCounts.citedRate)})`);
|
|
9022
|
+
console.log(` Queries mentioned: ${queryCounts.mentionedQueries}/${queryCounts.totalQueries} (${pct2(queryCounts.mentionRate)})`);
|
|
8935
9023
|
if (movementSummary.hasPreviousRun) {
|
|
8936
9024
|
console.log(` Movement: +${movementSummary.gained} gained, -${movementSummary.lost} lost (${movementSummary.tone})`);
|
|
8937
9025
|
} else if (movementSummary.gained > 0) {
|
|
@@ -8940,7 +9028,7 @@ function renderHuman(overview) {
|
|
|
8940
9028
|
if (providers.length > 0) {
|
|
8941
9029
|
console.log("\n Providers:");
|
|
8942
9030
|
for (const p of providers) {
|
|
8943
|
-
console.log(` ${p.provider.padEnd(12)} ${p.cited}/${p.total} (${
|
|
9031
|
+
console.log(` ${p.provider.padEnd(12)} ${p.cited}/${p.total} (${pct2(p.citedRate)})`);
|
|
8944
9032
|
}
|
|
8945
9033
|
}
|
|
8946
9034
|
if (providerScores.length > 0) {
|
|
@@ -8969,7 +9057,7 @@ function renderHuman(overview) {
|
|
|
8969
9057
|
}
|
|
8970
9058
|
if (health) {
|
|
8971
9059
|
console.log(`
|
|
8972
|
-
Health: ${
|
|
9060
|
+
Health: ${pct2(health.overallCitedRate)} cited (${health.citedPairs}/${health.totalPairs} pairs)`);
|
|
8973
9061
|
}
|
|
8974
9062
|
if (topInsights.length > 0) {
|
|
8975
9063
|
console.log("\n Top insights:");
|
|
@@ -9009,14 +9097,14 @@ function printMentionShareBreakdown(mentionShare) {
|
|
|
9009
9097
|
const youPct = (breakdown.projectMentionSnapshots / total * 100).toFixed(1);
|
|
9010
9098
|
console.log(` you${" ".repeat(28)} ${breakdown.projectMentionSnapshots} mentions (${youPct}% of combined)`);
|
|
9011
9099
|
for (const row of breakdown.perCompetitor.slice(0, 3)) {
|
|
9012
|
-
const
|
|
9013
|
-
console.log(` ${row.domain.padEnd(30)} ${row.mentionSnapshots} mentions (${
|
|
9100
|
+
const pct3 = (row.mentionSnapshots / total * 100).toFixed(1);
|
|
9101
|
+
console.log(` ${row.domain.padEnd(30)} ${row.mentionSnapshots} mentions (${pct3}% of combined)`);
|
|
9014
9102
|
}
|
|
9015
9103
|
if (breakdown.perCompetitor.length > 3) {
|
|
9016
9104
|
console.log(` + ${breakdown.perCompetitor.length - 3} more competitor${breakdown.perCompetitor.length - 3 === 1 ? "" : "s"} (--format json for full breakdown)`);
|
|
9017
9105
|
}
|
|
9018
9106
|
}
|
|
9019
|
-
function
|
|
9107
|
+
function pct2(value) {
|
|
9020
9108
|
return `${(value * 100).toFixed(1)}%`;
|
|
9021
9109
|
}
|
|
9022
9110
|
|
|
@@ -9244,11 +9332,14 @@ var INTELLIGENCE_CLI_COMMANDS = [
|
|
|
9244
9332
|
];
|
|
9245
9333
|
|
|
9246
9334
|
// src/commands/content.ts
|
|
9335
|
+
var WINNABILITY_COVERAGE_CHECK_ID = "content.winnability.coverage";
|
|
9247
9336
|
async function listContentTargets(project, opts) {
|
|
9248
9337
|
const client = createApiClient();
|
|
9249
9338
|
const response = await client.getContentTargets(project, {
|
|
9250
9339
|
limit: opts.limit,
|
|
9251
|
-
includeInProgress: opts.includeInProgress
|
|
9340
|
+
includeInProgress: opts.includeInProgress,
|
|
9341
|
+
winnabilityClass: opts.winnabilityClass,
|
|
9342
|
+
ownable: opts.ownable
|
|
9252
9343
|
});
|
|
9253
9344
|
if (opts.format === "json") {
|
|
9254
9345
|
console.log(JSON.stringify(response, null, 2));
|
|
@@ -9276,7 +9367,8 @@ async function listContentTargets(project, opts) {
|
|
|
9276
9367
|
const action = target.action.toUpperCase().padEnd(11);
|
|
9277
9368
|
const score = target.score.toFixed(1).padStart(6);
|
|
9278
9369
|
const conf = target.actionConfidence.padEnd(6);
|
|
9279
|
-
|
|
9370
|
+
const surface = target.winnabilityClass === "ceded" ? "CEDED " : "ownable";
|
|
9371
|
+
console.log(`${action} ${score} conf=${conf} [${surface}] ${target.query}`);
|
|
9280
9372
|
if (target.ourBestPage) {
|
|
9281
9373
|
const posLabel = target.ourBestPage.gscAvgPosition !== null ? `pos #${target.ourBestPage.gscAvgPosition}` : "no GSC ranking";
|
|
9282
9374
|
console.log(` our page: ${target.ourBestPage.url} (${posLabel})`);
|
|
@@ -9345,27 +9437,123 @@ async function listContentGaps(project, opts) {
|
|
|
9345
9437
|
console.log("");
|
|
9346
9438
|
}
|
|
9347
9439
|
}
|
|
9440
|
+
async function generateContentBrief(project, targetRef, opts) {
|
|
9441
|
+
const client = createApiClient();
|
|
9442
|
+
await warnIfWinnabilityCoverageIsLow(client, project, opts.format);
|
|
9443
|
+
const response = await client.synthesizeContentBrief(project, targetRef, {
|
|
9444
|
+
provider: opts.provider,
|
|
9445
|
+
model: opts.model,
|
|
9446
|
+
forceRefresh: opts.force
|
|
9447
|
+
});
|
|
9448
|
+
if (isMachineFormat(opts.format)) {
|
|
9449
|
+
console.log(JSON.stringify(response, null, 2));
|
|
9450
|
+
return;
|
|
9451
|
+
}
|
|
9452
|
+
const b = response.brief;
|
|
9453
|
+
console.log(`Brief for: ${b.targetQuery}`);
|
|
9454
|
+
console.log(`Surface: ${b.winnabilityClass}`);
|
|
9455
|
+
console.log(`Provider: ${response.provider} / ${response.model}`);
|
|
9456
|
+
console.log("");
|
|
9457
|
+
console.log(`Angle: ${b.angle}`);
|
|
9458
|
+
console.log(`Why winnable: ${b.whyWinnable}`);
|
|
9459
|
+
console.log(`Schema hookup: ${b.schemaHookup}`);
|
|
9460
|
+
console.log(`Controllable surface: ${b.controllableSurfaceRationale}`);
|
|
9461
|
+
}
|
|
9462
|
+
async function tryGetBrief(client, project, targetRef) {
|
|
9463
|
+
try {
|
|
9464
|
+
return await client.getContentBrief(project, targetRef);
|
|
9465
|
+
} catch (err) {
|
|
9466
|
+
if (err instanceof CliError && err.code === "NOT_FOUND") return null;
|
|
9467
|
+
throw err;
|
|
9468
|
+
}
|
|
9469
|
+
}
|
|
9470
|
+
async function contentMap(project, opts) {
|
|
9471
|
+
const client = createApiClient();
|
|
9472
|
+
await warnIfWinnabilityCoverageIsLow(client, project, opts.format);
|
|
9473
|
+
const [classifications, targets] = await Promise.all([
|
|
9474
|
+
client.getDomainClassifications(project),
|
|
9475
|
+
client.getContentTargets(project, { ownable: true })
|
|
9476
|
+
]);
|
|
9477
|
+
const ownable = await Promise.all(
|
|
9478
|
+
targets.targets.map(async (target) => ({
|
|
9479
|
+
...target,
|
|
9480
|
+
brief: (await tryGetBrief(client, project, target.targetRef))?.brief ?? null
|
|
9481
|
+
}))
|
|
9482
|
+
);
|
|
9483
|
+
if (opts.format === "json") {
|
|
9484
|
+
console.log(JSON.stringify({ classifications: classifications.classifications, ownable }, null, 2));
|
|
9485
|
+
return;
|
|
9486
|
+
}
|
|
9487
|
+
if (opts.format === "jsonl") {
|
|
9488
|
+
emitJsonl(ownable.map((row) => ({ project, ...row })));
|
|
9489
|
+
return;
|
|
9490
|
+
}
|
|
9491
|
+
const ceded = classifications.classifications.filter(
|
|
9492
|
+
(c) => c.competitorType === "ota-aggregator" || c.competitorType === "editorial-media"
|
|
9493
|
+
);
|
|
9494
|
+
console.log(
|
|
9495
|
+
`${classifications.classifications.length} domain(s) classified (${ceded.length} ceded surface${ceded.length === 1 ? "" : "s"}) \xB7 ${ownable.length} ownable target(s)`
|
|
9496
|
+
);
|
|
9497
|
+
console.log("");
|
|
9498
|
+
for (const row of ownable) {
|
|
9499
|
+
const score = row.score.toFixed(1).padStart(6);
|
|
9500
|
+
const briefMark = row.brief ? "brief \u2713" : "brief \u2014";
|
|
9501
|
+
console.log(`${score} ${briefMark} ${row.query}`);
|
|
9502
|
+
if (row.brief) {
|
|
9503
|
+
console.log(` angle: ${row.brief.angle}`);
|
|
9504
|
+
}
|
|
9505
|
+
}
|
|
9506
|
+
}
|
|
9507
|
+
function shouldWarn(check) {
|
|
9508
|
+
return check?.status === "warn" || check?.status === "fail";
|
|
9509
|
+
}
|
|
9510
|
+
async function warnIfWinnabilityCoverageIsLow(client, project, format) {
|
|
9511
|
+
if (isMachineFormat(format)) return;
|
|
9512
|
+
let check;
|
|
9513
|
+
try {
|
|
9514
|
+
const report = await client.runDoctor({ project, checkIds: [WINNABILITY_COVERAGE_CHECK_ID] });
|
|
9515
|
+
check = report.checks.find((candidate) => candidate.id === WINNABILITY_COVERAGE_CHECK_ID);
|
|
9516
|
+
} catch {
|
|
9517
|
+
return;
|
|
9518
|
+
}
|
|
9519
|
+
if (!shouldWarn(check)) return;
|
|
9520
|
+
const remediation = check.remediation ? ` ${check.remediation}` : "";
|
|
9521
|
+
console.error(`Warning: ${check.summary}${remediation}`);
|
|
9522
|
+
}
|
|
9348
9523
|
|
|
9349
9524
|
// src/cli-commands/content.ts
|
|
9350
9525
|
var CONTENT_CLI_COMMANDS = [
|
|
9351
9526
|
{
|
|
9352
9527
|
path: ["content", "targets"],
|
|
9353
|
-
usage: "canonry content targets <project> [--limit <n>] [--include-in-progress] [--format json]",
|
|
9528
|
+
usage: "canonry content targets <project> [--limit <n>] [--include-in-progress] [--ownable] [--winnability-class <ownable|ceded>] [--format json]",
|
|
9354
9529
|
options: {
|
|
9355
9530
|
limit: { type: "string" },
|
|
9356
|
-
"include-in-progress": { type: "boolean" }
|
|
9531
|
+
"include-in-progress": { type: "boolean" },
|
|
9532
|
+
ownable: { type: "boolean" },
|
|
9533
|
+
"winnability-class": { type: "string" }
|
|
9357
9534
|
},
|
|
9358
9535
|
run: async (input) => {
|
|
9359
|
-
const usage = "canonry content targets <project> [--limit <n>] [--include-in-progress] [--format json]";
|
|
9536
|
+
const usage = "canonry content targets <project> [--limit <n>] [--include-in-progress] [--ownable] [--winnability-class <ownable|ceded>] [--format json]";
|
|
9360
9537
|
const project = requireProject(input, "content targets", usage);
|
|
9361
9538
|
const limit = parseIntegerOption(input, "limit", {
|
|
9362
9539
|
command: "content targets",
|
|
9363
9540
|
usage,
|
|
9364
9541
|
message: "--limit must be a non-negative integer"
|
|
9365
9542
|
});
|
|
9543
|
+
const rawWinnabilityClass = input.values["winnability-class"];
|
|
9544
|
+
let winnabilityClass;
|
|
9545
|
+
if (typeof rawWinnabilityClass === "string") {
|
|
9546
|
+
const parsed = winnabilityClassSchema.safeParse(rawWinnabilityClass);
|
|
9547
|
+
if (!parsed.success) {
|
|
9548
|
+
throw usageError('Error: --winnability-class must be "ownable" or "ceded"', { message: usage });
|
|
9549
|
+
}
|
|
9550
|
+
winnabilityClass = parsed.data;
|
|
9551
|
+
}
|
|
9366
9552
|
await listContentTargets(project, {
|
|
9367
9553
|
limit,
|
|
9368
9554
|
includeInProgress: input.values["include-in-progress"] === true,
|
|
9555
|
+
ownable: input.values.ownable === true,
|
|
9556
|
+
winnabilityClass,
|
|
9369
9557
|
format: input.format
|
|
9370
9558
|
});
|
|
9371
9559
|
}
|
|
@@ -9389,6 +9577,40 @@ var CONTENT_CLI_COMMANDS = [
|
|
|
9389
9577
|
const project = requireProject(input, "content gaps", usage);
|
|
9390
9578
|
await listContentGaps(project, { format: input.format });
|
|
9391
9579
|
}
|
|
9580
|
+
},
|
|
9581
|
+
{
|
|
9582
|
+
path: ["content", "brief"],
|
|
9583
|
+
usage: "canonry content brief <project> <targetRef> [--provider <p>] [--model <m>] [--force] [--format json]",
|
|
9584
|
+
options: {
|
|
9585
|
+
provider: { type: "string" },
|
|
9586
|
+
model: { type: "string" },
|
|
9587
|
+
force: { type: "boolean" }
|
|
9588
|
+
},
|
|
9589
|
+
run: async (input) => {
|
|
9590
|
+
const usage = "canonry content brief <project> <targetRef> [--provider <p>] [--model <m>] [--force] [--format json]";
|
|
9591
|
+
const project = requireProject(input, "content brief", usage);
|
|
9592
|
+
const targetRef = requirePositional(input, 1, {
|
|
9593
|
+
command: "content brief",
|
|
9594
|
+
usage,
|
|
9595
|
+
message: "targetRef is required (from `canonry content targets`)"
|
|
9596
|
+
});
|
|
9597
|
+
await generateContentBrief(project, targetRef, {
|
|
9598
|
+
provider: typeof input.values.provider === "string" ? input.values.provider : void 0,
|
|
9599
|
+
model: typeof input.values.model === "string" ? input.values.model : void 0,
|
|
9600
|
+
force: input.values.force === true,
|
|
9601
|
+
format: input.format
|
|
9602
|
+
});
|
|
9603
|
+
}
|
|
9604
|
+
},
|
|
9605
|
+
{
|
|
9606
|
+
path: ["content", "map"],
|
|
9607
|
+
usage: "canonry content map <project> [--format json]",
|
|
9608
|
+
options: {},
|
|
9609
|
+
run: async (input) => {
|
|
9610
|
+
const usage = "canonry content map <project> [--format json]";
|
|
9611
|
+
const project = requireProject(input, "content map", usage);
|
|
9612
|
+
await contentMap(project, { format: input.format });
|
|
9613
|
+
}
|
|
9392
9614
|
}
|
|
9393
9615
|
];
|
|
9394
9616
|
|
|
@@ -10480,7 +10702,7 @@ var SYSTEM_CLI_COMMANDS = [
|
|
|
10480
10702
|
import fs11 from "fs";
|
|
10481
10703
|
|
|
10482
10704
|
// src/commands/wordpress.ts
|
|
10483
|
-
function
|
|
10705
|
+
function getClient24() {
|
|
10484
10706
|
return createApiClient();
|
|
10485
10707
|
}
|
|
10486
10708
|
async function loadYamlModule() {
|
|
@@ -10630,7 +10852,7 @@ async function wordpressConnect(project, opts) {
|
|
|
10630
10852
|
details: { project }
|
|
10631
10853
|
});
|
|
10632
10854
|
}
|
|
10633
|
-
const client =
|
|
10855
|
+
const client = getClient24();
|
|
10634
10856
|
const result = await client.wordpressConnect(project, {
|
|
10635
10857
|
url: opts.url,
|
|
10636
10858
|
stagingUrl: opts.stagingUrl,
|
|
@@ -10647,7 +10869,7 @@ async function wordpressConnect(project, opts) {
|
|
|
10647
10869
|
printWordpressStatus(project, result);
|
|
10648
10870
|
}
|
|
10649
10871
|
async function wordpressDisconnect(project, format) {
|
|
10650
|
-
const client =
|
|
10872
|
+
const client = getClient24();
|
|
10651
10873
|
await client.wordpressDisconnect(project);
|
|
10652
10874
|
if (isMachineFormat(format)) {
|
|
10653
10875
|
printJson2({ project, disconnected: true });
|
|
@@ -10656,7 +10878,7 @@ async function wordpressDisconnect(project, format) {
|
|
|
10656
10878
|
console.log(`WordPress disconnected from project "${project}".`);
|
|
10657
10879
|
}
|
|
10658
10880
|
async function wordpressStatus(project, format) {
|
|
10659
|
-
const client =
|
|
10881
|
+
const client = getClient24();
|
|
10660
10882
|
const result = await client.wordpressStatus(project);
|
|
10661
10883
|
if (isMachineFormat(format)) {
|
|
10662
10884
|
printJson2(result);
|
|
@@ -10665,7 +10887,7 @@ async function wordpressStatus(project, format) {
|
|
|
10665
10887
|
printWordpressStatus(project, result);
|
|
10666
10888
|
}
|
|
10667
10889
|
async function wordpressPages(project, opts) {
|
|
10668
|
-
const client =
|
|
10890
|
+
const client = getClient24();
|
|
10669
10891
|
const result = await client.wordpressPages(project, opts.env);
|
|
10670
10892
|
if (isMachineFormat(opts.format)) {
|
|
10671
10893
|
printJson2(result);
|
|
@@ -10674,7 +10896,7 @@ async function wordpressPages(project, opts) {
|
|
|
10674
10896
|
printPages(project, result.env, result.pages);
|
|
10675
10897
|
}
|
|
10676
10898
|
async function wordpressPage(project, slug, opts) {
|
|
10677
|
-
const client =
|
|
10899
|
+
const client = getClient24();
|
|
10678
10900
|
const result = await client.wordpressPage(project, slug, opts.env);
|
|
10679
10901
|
if (isMachineFormat(opts.format)) {
|
|
10680
10902
|
printJson2(result);
|
|
@@ -10683,7 +10905,7 @@ async function wordpressPage(project, slug, opts) {
|
|
|
10683
10905
|
printPageDetail(result);
|
|
10684
10906
|
}
|
|
10685
10907
|
async function wordpressCreatePage(project, body) {
|
|
10686
|
-
const client =
|
|
10908
|
+
const client = getClient24();
|
|
10687
10909
|
const result = await client.wordpressCreatePage(project, body);
|
|
10688
10910
|
if (isMachineFormat(body.format)) {
|
|
10689
10911
|
printJson2(result);
|
|
@@ -10694,7 +10916,7 @@ async function wordpressCreatePage(project, body) {
|
|
|
10694
10916
|
printPageDetail(result);
|
|
10695
10917
|
}
|
|
10696
10918
|
async function wordpressUpdatePage(project, body) {
|
|
10697
|
-
const client =
|
|
10919
|
+
const client = getClient24();
|
|
10698
10920
|
const result = await client.wordpressUpdatePage(project, body);
|
|
10699
10921
|
if (isMachineFormat(body.format)) {
|
|
10700
10922
|
printJson2(result);
|
|
@@ -10705,7 +10927,7 @@ async function wordpressUpdatePage(project, body) {
|
|
|
10705
10927
|
printPageDetail(result);
|
|
10706
10928
|
}
|
|
10707
10929
|
async function wordpressSetMeta(project, body) {
|
|
10708
|
-
const client =
|
|
10930
|
+
const client = getClient24();
|
|
10709
10931
|
const result = await client.wordpressSetMeta(project, body);
|
|
10710
10932
|
if (isMachineFormat(body.format)) {
|
|
10711
10933
|
printJson2(result);
|
|
@@ -10755,7 +10977,7 @@ async function wordpressBulkSetMeta(project, opts) {
|
|
|
10755
10977
|
details: { path: filePath }
|
|
10756
10978
|
});
|
|
10757
10979
|
}
|
|
10758
|
-
const client =
|
|
10980
|
+
const client = getClient24();
|
|
10759
10981
|
const result = await client.wordpressBulkSetMeta(project, { entries, env: opts.env });
|
|
10760
10982
|
if (isMachineFormat(opts.format)) {
|
|
10761
10983
|
printJson2(result);
|
|
@@ -10798,7 +11020,7 @@ async function wordpressBulkSetMeta(project, opts) {
|
|
|
10798
11020
|
Total: ${applied.length} applied, ${skipped.length} skipped, ${manual.length} manual`);
|
|
10799
11021
|
}
|
|
10800
11022
|
async function wordpressSchema(project, slug, opts) {
|
|
10801
|
-
const client =
|
|
11023
|
+
const client = getClient24();
|
|
10802
11024
|
const result = await client.wordpressSchema(project, slug, opts.env);
|
|
10803
11025
|
if (isMachineFormat(opts.format)) {
|
|
10804
11026
|
printJson2(result);
|
|
@@ -10809,7 +11031,7 @@ async function wordpressSchema(project, slug, opts) {
|
|
|
10809
11031
|
printSchemaBlocks(result.blocks);
|
|
10810
11032
|
}
|
|
10811
11033
|
async function wordpressSetSchema(project, body) {
|
|
10812
|
-
const client =
|
|
11034
|
+
const client = getClient24();
|
|
10813
11035
|
const result = await client.wordpressSetSchema(project, body);
|
|
10814
11036
|
if (isMachineFormat(body.format)) {
|
|
10815
11037
|
printJson2(result);
|
|
@@ -10857,7 +11079,7 @@ async function wordpressSchemaDeploy(project, opts) {
|
|
|
10857
11079
|
details: { path: filePath }
|
|
10858
11080
|
});
|
|
10859
11081
|
}
|
|
10860
|
-
const client =
|
|
11082
|
+
const client = getClient24();
|
|
10861
11083
|
const result = await client.wordpressSchemaDeploy(project, { profile: parsed, env: opts.env });
|
|
10862
11084
|
if (isMachineFormat(opts.format)) {
|
|
10863
11085
|
printJson2(result);
|
|
@@ -10896,7 +11118,7 @@ async function wordpressSchemaDeploy(project, opts) {
|
|
|
10896
11118
|
Total: ${deployed} deployed, ${stripped} stripped, ${skipped} skipped, ${failed} failed`);
|
|
10897
11119
|
}
|
|
10898
11120
|
async function wordpressSchemaStatus(project, opts) {
|
|
10899
|
-
const client =
|
|
11121
|
+
const client = getClient24();
|
|
10900
11122
|
const result = await client.wordpressSchemaStatus(project, opts.env);
|
|
10901
11123
|
if (isMachineFormat(opts.format)) {
|
|
10902
11124
|
printJson2(result);
|
|
@@ -10955,7 +11177,7 @@ async function wordpressOnboard(project, opts) {
|
|
|
10955
11177
|
});
|
|
10956
11178
|
}
|
|
10957
11179
|
}
|
|
10958
|
-
const client =
|
|
11180
|
+
const client = getClient24();
|
|
10959
11181
|
const result = await client.wordpressOnboard(project, {
|
|
10960
11182
|
url: opts.url,
|
|
10961
11183
|
username: opts.user,
|
|
@@ -10980,7 +11202,7 @@ async function wordpressOnboard(project, opts) {
|
|
|
10980
11202
|
}
|
|
10981
11203
|
}
|
|
10982
11204
|
async function wordpressLlmsTxt(project, opts) {
|
|
10983
|
-
const client =
|
|
11205
|
+
const client = getClient24();
|
|
10984
11206
|
const result = await client.wordpressLlmsTxt(project, opts.env);
|
|
10985
11207
|
if (isMachineFormat(opts.format)) {
|
|
10986
11208
|
printJson2(result);
|
|
@@ -10991,7 +11213,7 @@ async function wordpressLlmsTxt(project, opts) {
|
|
|
10991
11213
|
console.log(result.content ?? "(not found)");
|
|
10992
11214
|
}
|
|
10993
11215
|
async function wordpressSetLlmsTxt(project, body) {
|
|
10994
|
-
const client =
|
|
11216
|
+
const client = getClient24();
|
|
10995
11217
|
const result = await client.wordpressSetLlmsTxt(project, body);
|
|
10996
11218
|
if (isMachineFormat(body.format)) {
|
|
10997
11219
|
printJson2(result);
|
|
@@ -11000,7 +11222,7 @@ async function wordpressSetLlmsTxt(project, body) {
|
|
|
11000
11222
|
printManualAssist(`llms.txt update for "${project}"`, result);
|
|
11001
11223
|
}
|
|
11002
11224
|
async function wordpressAudit(project, opts) {
|
|
11003
|
-
const client =
|
|
11225
|
+
const client = getClient24();
|
|
11004
11226
|
const result = await client.wordpressAudit(project, opts.env);
|
|
11005
11227
|
if (isMachineFormat(opts.format)) {
|
|
11006
11228
|
printJson2(result);
|
|
@@ -11014,7 +11236,7 @@ async function wordpressAudit(project, opts) {
|
|
|
11014
11236
|
printAuditIssues(result.issues);
|
|
11015
11237
|
}
|
|
11016
11238
|
async function wordpressDiff(project, slug, format) {
|
|
11017
|
-
const client =
|
|
11239
|
+
const client = getClient24();
|
|
11018
11240
|
const result = await client.wordpressDiff(project, slug);
|
|
11019
11241
|
if (isMachineFormat(format)) {
|
|
11020
11242
|
printJson2(result);
|
|
@@ -11023,7 +11245,7 @@ async function wordpressDiff(project, slug, format) {
|
|
|
11023
11245
|
printDiff(result);
|
|
11024
11246
|
}
|
|
11025
11247
|
async function wordpressStagingStatus(project, format) {
|
|
11026
|
-
const client =
|
|
11248
|
+
const client = getClient24();
|
|
11027
11249
|
const result = await client.wordpressStagingStatus(project);
|
|
11028
11250
|
if (isMachineFormat(format)) {
|
|
11029
11251
|
printJson2(result);
|
|
@@ -11037,7 +11259,7 @@ async function wordpressStagingStatus(project, format) {
|
|
|
11037
11259
|
console.log(` Admin URL: ${result.adminUrl}`);
|
|
11038
11260
|
}
|
|
11039
11261
|
async function wordpressStagingPush(project, format) {
|
|
11040
|
-
const client =
|
|
11262
|
+
const client = getClient24();
|
|
11041
11263
|
const result = await client.wordpressStagingPush(project);
|
|
11042
11264
|
if (isMachineFormat(format)) {
|
|
11043
11265
|
printJson2(result);
|