sf-intelligence 0.1.10 → 0.1.11
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/dist/index.js +144 -28
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -59448,7 +59448,7 @@ var init_package_version = __esm({
|
|
|
59448
59448
|
"use strict";
|
|
59449
59449
|
readCliPackageVersion = () => {
|
|
59450
59450
|
if (true)
|
|
59451
|
-
return "0.1.
|
|
59451
|
+
return "0.1.11";
|
|
59452
59452
|
for (const rel of ["../package.json", "../../package.json"]) {
|
|
59453
59453
|
try {
|
|
59454
59454
|
const raw = readFileSync3(fileURLToPath(new URL(rel, import.meta.url)), "utf8");
|
|
@@ -126240,6 +126240,7 @@ __export(refresh_exports, {
|
|
|
126240
126240
|
buildFolderedReportManifest: () => buildFolderedReportManifest,
|
|
126241
126241
|
buildRefreshPulse: () => buildRefreshPulse,
|
|
126242
126242
|
classifyForDemandRetrieve: () => classifyForDemandRetrieve,
|
|
126243
|
+
classifyRetrieveError: () => classifyRetrieveError,
|
|
126243
126244
|
computeChangeSummary: () => computeChangeSummary,
|
|
126244
126245
|
countLandedReportMembers: () => countLandedReportMembers,
|
|
126245
126246
|
formatDemandRetrieveSummary: () => formatDemandRetrieveSummary,
|
|
@@ -126250,17 +126251,20 @@ __export(refresh_exports, {
|
|
|
126250
126251
|
markDemandQueueDrains: () => markDemandQueueDrains,
|
|
126251
126252
|
objectsToExpandManifest: () => objectsToExpandManifest,
|
|
126252
126253
|
registerRefreshCommand: () => registerRefreshCommand,
|
|
126254
|
+
retrieveWithFallback: () => retrieveWithFallback,
|
|
126253
126255
|
runDemandRetrieve: () => runDemandRetrieve,
|
|
126254
126256
|
runRefresh: () => runRefresh,
|
|
126255
126257
|
runSfRetrieveSmartReports: () => runSfRetrieveSmartReports,
|
|
126256
|
-
selectManifestTypes: () => selectManifestTypes
|
|
126258
|
+
selectManifestTypes: () => selectManifestTypes,
|
|
126259
|
+
splitTypeBatch: () => splitTypeBatch,
|
|
126260
|
+
summarizeRetrieveFailures: () => summarizeRetrieveFailures
|
|
126257
126261
|
});
|
|
126258
126262
|
import { exec } from "node:child_process";
|
|
126259
126263
|
import { appendFile as appendFile4, mkdir as mkdir12, readdir as readdir6, readFile as readFile79, rename as rename6, rm as rm5, stat as stat10, writeFile as writeFile11 } from "node:fs/promises";
|
|
126260
126264
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
126261
126265
|
import { join as join26, resolve as resolve4 } from "node:path";
|
|
126262
126266
|
import { promisify as promisify4 } from "node:util";
|
|
126263
|
-
var execAsync, SF_API_VERSION2, EMPTY_COUNTS, EMPTY_SKIPPED, failed, PACKAGE_VERSION, extractCachePath, loadExtractCache, saveExtractCache, applyApexAstEdges, runRefresh, preserveFactsForSideBuild, aggregateFailuresByType, buildCoverageEntries2, decoratePendingCoverage, decorateReportsCapCoverage, countGraphTotals, fullRebuild, importGraph, persistResolveIndexBestEffort, runWithOpenGraph, appendRefreshHistory, appendRiskScores, writeOnboardingDoc, writeOrgCard, diffCounts, sumCounts, metricCounts, signedDelta, findAnnotationOrphans, buildRefreshPulse, computeChangeSummary, TOOLING_API_ENRICHED_TYPES, runToolingApiEnrichment, loadVaultConfig, METADATA_API_NAME2, toApiName, SF_MAX_BUFFER, STANDARD_OBJECTS_TO_MODEL, manifestMembersForType, appendStandardObjectDescribeFields, AUTOMATION_EDGE_TYPES, objectsToExpandManifest, buildPackageXml, getOrgSupportedTypes, selectManifestTypes, runSfRetrieve, computeReconciledTypes, runSfRetrieveObjects, buildFolderedReportManifest, REPORT_META_SUFFIXES, REPORT_DIR_MARKERS, countLandedReportMembers, collectReportMetaFiles, runSfRetrieveFolderedReports, reportsCap, runSfRetrieveSmartReports, formatFailure, formatBlock, formatChangeSummary, formatRefreshSummary, formatReportsCapSummary, SKIPPED_TOP_N, KNOWN_UNMODELED_SKIP_DIRS, formatSkippedWarning, formatToolingApiSummary, demandCoverageStatusOf, DEMAND_REFUSAL_REASON, classifyForDemandRetrieve, markDemandQueueDrains, runDemandRetrieve, formatDemandRetrieveSummary, registerRefreshCommand;
|
|
126267
|
+
var execAsync, SF_API_VERSION2, EMPTY_COUNTS, EMPTY_SKIPPED, failed, PACKAGE_VERSION, extractCachePath, loadExtractCache, saveExtractCache, applyApexAstEdges, runRefresh, preserveFactsForSideBuild, aggregateFailuresByType, buildCoverageEntries2, decoratePendingCoverage, decorateReportsCapCoverage, countGraphTotals, fullRebuild, importGraph, persistResolveIndexBestEffort, runWithOpenGraph, appendRefreshHistory, appendRiskScores, writeOnboardingDoc, writeOrgCard, diffCounts, sumCounts, metricCounts, signedDelta, findAnnotationOrphans, buildRefreshPulse, computeChangeSummary, TOOLING_API_ENRICHED_TYPES, runToolingApiEnrichment, loadVaultConfig, METADATA_API_NAME2, toApiName, SF_MAX_BUFFER, STANDARD_OBJECTS_TO_MODEL, manifestMembersForType, appendStandardObjectDescribeFields, AUTOMATION_EDGE_TYPES, objectsToExpandManifest, buildPackageXml, getOrgSupportedTypes, selectManifestTypes, classifyRetrieveError, splitTypeBatch, firstErrorLine, summarizeRetrieveFailures, retrieveWithFallback, retrieveTypeBatch, runSfRetrieve, computeReconciledTypes, runSfRetrieveObjects, buildFolderedReportManifest, REPORT_META_SUFFIXES, REPORT_DIR_MARKERS, countLandedReportMembers, collectReportMetaFiles, runSfRetrieveFolderedReports, reportsCap, runSfRetrieveSmartReports, formatFailure, formatBlock, formatChangeSummary, formatRefreshSummary, formatReportsCapSummary, SKIPPED_TOP_N, KNOWN_UNMODELED_SKIP_DIRS, formatSkippedWarning, formatToolingApiSummary, demandCoverageStatusOf, DEMAND_REFUSAL_REASON, classifyForDemandRetrieve, markDemandQueueDrains, runDemandRetrieve, formatDemandRetrieveSummary, registerRefreshCommand;
|
|
126264
126268
|
var init_refresh = __esm({
|
|
126265
126269
|
"dist/src/commands/refresh.js"() {
|
|
126266
126270
|
"use strict";
|
|
@@ -126437,6 +126441,7 @@ var init_refresh = __esm({
|
|
|
126437
126441
|
});
|
|
126438
126442
|
let pullManifestTypes = null;
|
|
126439
126443
|
let sourceReconcileDeleted = 0;
|
|
126444
|
+
let retrieveFailures = [];
|
|
126440
126445
|
if (!opts.noPull) {
|
|
126441
126446
|
const priorManifest = await loadManifest(configResult.value.vaultRoot);
|
|
126442
126447
|
const priorComponentCount = priorManifest.ok ? Object.values(priorManifest.value.components ?? {}).reduce((a2, b2) => a2 + (typeof b2 === "number" ? b2 : 0), 0) : null;
|
|
@@ -126453,9 +126458,13 @@ var init_refresh = __esm({
|
|
|
126453
126458
|
return failed(started, pulled.error, []);
|
|
126454
126459
|
pullManifestTypes = pulled.value.manifestTypes;
|
|
126455
126460
|
sourceReconcileDeleted = pulled.value.deletedCount;
|
|
126461
|
+
retrieveFailures = pulled.value.failures;
|
|
126456
126462
|
if (sourceReconcileDeleted > 0) {
|
|
126457
126463
|
progress(`Reconciled source: removed ${sourceReconcileDeleted} stale file(s) deleted in the org.`);
|
|
126458
126464
|
}
|
|
126465
|
+
if (retrieveFailures.length > 0) {
|
|
126466
|
+
progress(`Partial retrieve: ${retrieveFailures.length} metadata type(s) failed and were skipped \u2014 the vault is built from what landed. ${summarizeRetrieveFailures(retrieveFailures)}`);
|
|
126467
|
+
}
|
|
126459
126468
|
}
|
|
126460
126469
|
progress("Extracting components from retrieved source...");
|
|
126461
126470
|
const prevCache = opts.incremental ? await loadExtractCache(paths.meta) : void 0;
|
|
@@ -126552,6 +126561,7 @@ var init_refresh = __esm({
|
|
|
126552
126561
|
opts,
|
|
126553
126562
|
requestedTypes,
|
|
126554
126563
|
snapshotOnRefresh: configResult.value.snapshotOnRefresh,
|
|
126564
|
+
retrieveFailures,
|
|
126555
126565
|
...reconciledTypes !== null ? { reconciledTypes } : {},
|
|
126556
126566
|
...apexAstStats !== void 0 ? { apexAstStats } : {},
|
|
126557
126567
|
...reportsCapStats !== void 0 ? { reportsCapStats } : {}
|
|
@@ -126805,11 +126815,12 @@ var init_refresh = __esm({
|
|
|
126805
126815
|
return failed(started, `countGraphTotals: ${counted.error}`, walked.failures, EMPTY_COUNTS, walked.skippedDirectories);
|
|
126806
126816
|
}
|
|
126807
126817
|
return {
|
|
126808
|
-
status: walked.failures.length === 0 ? "success" : "partial",
|
|
126818
|
+
status: walked.failures.length === 0 && args.retrieveFailures.length === 0 ? "success" : "partial",
|
|
126809
126819
|
counts: counted.value,
|
|
126810
126820
|
skippedDirectories: walked.skippedDirectories,
|
|
126811
126821
|
errors: walked.failures,
|
|
126812
126822
|
durationMs: Date.now() - started,
|
|
126823
|
+
...args.retrieveFailures.length > 0 ? { retrieveFailures: args.retrieveFailures } : {},
|
|
126813
126824
|
...toolingApiSummary !== void 0 ? { toolingApi: toolingApiSummary } : {},
|
|
126814
126825
|
...args.reportsCapStats !== void 0 ? { reportsCap: args.reportsCapStats } : {}
|
|
126815
126826
|
};
|
|
@@ -126954,11 +126965,12 @@ var init_refresh = __esm({
|
|
|
126954
126965
|
}
|
|
126955
126966
|
}
|
|
126956
126967
|
return {
|
|
126957
|
-
status: walked.failures.length === 0 ? "success" : "partial",
|
|
126968
|
+
status: walked.failures.length === 0 && args.retrieveFailures.length === 0 ? "success" : "partial",
|
|
126958
126969
|
counts,
|
|
126959
126970
|
skippedDirectories: walked.skippedDirectories,
|
|
126960
126971
|
errors: walked.failures,
|
|
126961
126972
|
durationMs: Date.now() - started,
|
|
126973
|
+
...args.retrieveFailures.length > 0 ? { retrieveFailures: args.retrieveFailures } : {},
|
|
126962
126974
|
...changeSummary !== void 0 ? { changeSummary } : {},
|
|
126963
126975
|
...pulse !== void 0 ? { pulse } : {},
|
|
126964
126976
|
...toolingApiSummary !== void 0 ? { toolingApi: toolingApiSummary } : {},
|
|
@@ -127380,6 +127392,76 @@ ${card.body}
|
|
|
127380
127392
|
dropped: candidates.filter((type) => !orgTypes.has(toApiName(type)))
|
|
127381
127393
|
};
|
|
127382
127394
|
};
|
|
127395
|
+
classifyRetrieveError = (message) => {
|
|
127396
|
+
const GLOBAL_SIGNALS = [
|
|
127397
|
+
/no authorization|not authorized|no auth information|expired access\/refresh token|invalid[_ ]grant/i,
|
|
127398
|
+
/org ?login|sfdx[_ ]?login|requires? you to (?:re-?)?authenticate|session expired/i,
|
|
127399
|
+
/does not contain a valid salesforce dx project/i,
|
|
127400
|
+
/enotfound|etimedout|econnrefused|enetunreach|getaddrinfo|socket hang up|network error|unable to connect|connection timed out/i,
|
|
127401
|
+
/no default (?:environment|org)|no target-?org|no org configured|requires a target org/i
|
|
127402
|
+
];
|
|
127403
|
+
return GLOBAL_SIGNALS.some((re2) => re2.test(message)) ? "global" : "per-type";
|
|
127404
|
+
};
|
|
127405
|
+
splitTypeBatch = (types) => {
|
|
127406
|
+
const mid = Math.floor(types.length / 2);
|
|
127407
|
+
return [types.slice(0, mid), types.slice(mid)];
|
|
127408
|
+
};
|
|
127409
|
+
firstErrorLine = (error) => (error.split("\n")[0] ?? error).trim();
|
|
127410
|
+
summarizeRetrieveFailures = (failures) => {
|
|
127411
|
+
if (failures.length === 0)
|
|
127412
|
+
return "";
|
|
127413
|
+
const uniqueReasons = new Set(failures.map((f2) => firstErrorLine(f2.error)));
|
|
127414
|
+
if (uniqueReasons.size === 1) {
|
|
127415
|
+
const [reason] = [...uniqueReasons];
|
|
127416
|
+
const [first] = failures;
|
|
127417
|
+
return failures.length === 1 && first !== void 0 ? `${first.type}: ${reason}` : reason ?? "";
|
|
127418
|
+
}
|
|
127419
|
+
return failures.map((f2) => `${f2.type} (${firstErrorLine(f2.error)})`).join("; ");
|
|
127420
|
+
};
|
|
127421
|
+
retrieveWithFallback = async (allTypes, retrieveBatch) => {
|
|
127422
|
+
const succeeded = [];
|
|
127423
|
+
const failures = [];
|
|
127424
|
+
let deletedCount = 0;
|
|
127425
|
+
const attempt = async (types) => {
|
|
127426
|
+
if (types.length === 0)
|
|
127427
|
+
return;
|
|
127428
|
+
const result = await retrieveBatch(types);
|
|
127429
|
+
if (result.ok) {
|
|
127430
|
+
succeeded.push(...types);
|
|
127431
|
+
deletedCount += result.value.deletedCount;
|
|
127432
|
+
return;
|
|
127433
|
+
}
|
|
127434
|
+
if (types.length === 1 || classifyRetrieveError(result.error) === "global") {
|
|
127435
|
+
for (const type of types)
|
|
127436
|
+
failures.push({ type, error: result.error });
|
|
127437
|
+
return;
|
|
127438
|
+
}
|
|
127439
|
+
const [left, right] = splitTypeBatch(types);
|
|
127440
|
+
await attempt(left);
|
|
127441
|
+
await attempt(right);
|
|
127442
|
+
};
|
|
127443
|
+
await attempt(allTypes);
|
|
127444
|
+
return { succeeded, deletedCount, failures };
|
|
127445
|
+
};
|
|
127446
|
+
retrieveTypeBatch = async (targetOrg, sourceDir, types) => {
|
|
127447
|
+
const stamp = `${Date.now()}-${types.length}-${types[0] ?? "batch"}`;
|
|
127448
|
+
const manifestPath = join26(tmpdir2(), `sfi-refresh-package-${stamp}.xml`);
|
|
127449
|
+
const retrieveDir = join26(tmpdir2(), `sfi-retrieve-${stamp}`);
|
|
127450
|
+
await writeFile11(manifestPath, buildPackageXml(types), "utf8");
|
|
127451
|
+
try {
|
|
127452
|
+
await execAsync(`sf project retrieve start --manifest "${manifestPath}" --target-org "${targetOrg}" --output-dir "${retrieveDir}"`, { maxBuffer: SF_MAX_BUFFER });
|
|
127453
|
+
const reconcile = await reconcileSourceDeletions(sourceDir, retrieveDir, new Set(types));
|
|
127454
|
+
await syncAuthoritativeRetrieveIntoSource(sourceDir, retrieveDir);
|
|
127455
|
+
return ok({ deletedCount: reconcile.deletedCount });
|
|
127456
|
+
} catch (cause) {
|
|
127457
|
+
return err(cause instanceof Error ? cause.message : String(cause));
|
|
127458
|
+
} finally {
|
|
127459
|
+
await rm5(manifestPath, { force: true }).catch(() => {
|
|
127460
|
+
});
|
|
127461
|
+
await rm5(retrieveDir, { recursive: true, force: true }).catch(() => {
|
|
127462
|
+
});
|
|
127463
|
+
}
|
|
127464
|
+
};
|
|
127383
127465
|
runSfRetrieve = async (targetOrg, sourceDir, requestedTypes) => {
|
|
127384
127466
|
const orgTypes = await getOrgSupportedTypes(targetOrg);
|
|
127385
127467
|
if (orgTypes === null) {
|
|
@@ -127395,22 +127477,15 @@ ${card.body}
|
|
|
127395
127477
|
if (manifestTypes.length === 0) {
|
|
127396
127478
|
return err(`No retrievable metadata types for ${targetOrg} after intersecting with the org's describe.`);
|
|
127397
127479
|
}
|
|
127398
|
-
const
|
|
127399
|
-
|
|
127400
|
-
|
|
127401
|
-
try {
|
|
127402
|
-
await execAsync(`sf project retrieve start --manifest "${manifestPath}" --target-org "${targetOrg}" --output-dir "${retrieveDir}"`, { maxBuffer: SF_MAX_BUFFER });
|
|
127403
|
-
const reconcile = await reconcileSourceDeletions(sourceDir, retrieveDir, new Set(manifestTypes));
|
|
127404
|
-
await syncAuthoritativeRetrieveIntoSource(sourceDir, retrieveDir);
|
|
127405
|
-
return ok({ manifestTypes, deletedCount: reconcile.deletedCount });
|
|
127406
|
-
} catch (cause) {
|
|
127407
|
-
return err(`sf project retrieve failed: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
127408
|
-
} finally {
|
|
127409
|
-
await rm5(manifestPath, { force: true }).catch(() => {
|
|
127410
|
-
});
|
|
127411
|
-
await rm5(retrieveDir, { recursive: true, force: true }).catch(() => {
|
|
127412
|
-
});
|
|
127480
|
+
const outcome = await retrieveWithFallback(manifestTypes, (types) => retrieveTypeBatch(targetOrg, sourceDir, types));
|
|
127481
|
+
if (outcome.succeeded.length === 0) {
|
|
127482
|
+
return err(`sf project retrieve failed: ${summarizeRetrieveFailures(outcome.failures)}`);
|
|
127413
127483
|
}
|
|
127484
|
+
return ok({
|
|
127485
|
+
manifestTypes: outcome.succeeded,
|
|
127486
|
+
deletedCount: outcome.deletedCount,
|
|
127487
|
+
failures: outcome.failures
|
|
127488
|
+
});
|
|
127414
127489
|
};
|
|
127415
127490
|
computeReconciledTypes = (pullManifestTypes, sourceRoot, failures) => {
|
|
127416
127491
|
if (pullManifestTypes === null || pullManifestTypes.length === 0)
|
|
@@ -127699,6 +127774,9 @@ ${typesXml}
|
|
|
127699
127774
|
if (result.errors.length > 0) {
|
|
127700
127775
|
lines.push("", `Errors (${result.errors.length}):`, ...result.errors.map(formatFailure));
|
|
127701
127776
|
}
|
|
127777
|
+
if (result.retrieveFailures !== void 0 && result.retrieveFailures.length > 0) {
|
|
127778
|
+
lines.push("", `Partial retrieve \u2014 ${result.retrieveFailures.length} metadata type(s) skipped (the org may have rejected them; the vault is built from what landed):`, ...result.retrieveFailures.map((f2) => ` ${f2.type}: ${firstErrorLine(f2.error)}`));
|
|
127779
|
+
}
|
|
127702
127780
|
if (result.fatalError !== void 0) {
|
|
127703
127781
|
lines.push("", `Fatal: ${result.fatalError}`);
|
|
127704
127782
|
}
|
|
@@ -128960,6 +129038,14 @@ var registerStatusCommand = (program) => {
|
|
|
128960
129038
|
// dist/src/commands/doctor.js
|
|
128961
129039
|
var execAsync2 = promisify5(exec2);
|
|
128962
129040
|
var DEFAULT_VAULT_ROOT2 = "org-kb";
|
|
129041
|
+
var parseSfCliVersion = (versionLine) => {
|
|
129042
|
+
const m2 = /(\d+)\.(\d+)\.(\d+)/.exec(versionLine);
|
|
129043
|
+
if (m2 === null)
|
|
129044
|
+
return null;
|
|
129045
|
+
return [Number(m2[1]), Number(m2[2]), Number(m2[3])];
|
|
129046
|
+
};
|
|
129047
|
+
var isLegacySfdxToolbelt = (versionLine) => /sfdx-cli\//i.test(versionLine);
|
|
129048
|
+
var formatVersion = (v2) => v2.join(".");
|
|
128963
129049
|
var summarizeRouteGaps = async (logFile) => {
|
|
128964
129050
|
let raw;
|
|
128965
129051
|
try {
|
|
@@ -129031,6 +129117,15 @@ var runDoctor = async (opts) => {
|
|
|
129031
129117
|
}
|
|
129032
129118
|
}
|
|
129033
129119
|
}
|
|
129120
|
+
if (sfDetail !== null && isLegacySfdxToolbelt(sfDetail)) {
|
|
129121
|
+
const parsed = parseSfCliVersion(sfDetail);
|
|
129122
|
+
checks.push({
|
|
129123
|
+
name: "Salesforce CLI version",
|
|
129124
|
+
status: "warn",
|
|
129125
|
+
detail: `legacy sfdx-cli${parsed !== null ? ` ${formatVersion(parsed)}` : ""} detected \u2014 it predates \`sf project retrieve start\` (used by refresh) and cannot drive a vault refresh`,
|
|
129126
|
+
fix: "Install the modern unified CLI: npm install --global @salesforce/cli@latest"
|
|
129127
|
+
});
|
|
129128
|
+
}
|
|
129034
129129
|
if (sfOnPath) {
|
|
129035
129130
|
checks.push({ name: "Salesforce CLI", status: "pass", detail: sfDetail ?? "installed" });
|
|
129036
129131
|
} else if (sfDetail !== null) {
|
|
@@ -129578,11 +129673,20 @@ init_dist();
|
|
|
129578
129673
|
init_src7();
|
|
129579
129674
|
init_src2();
|
|
129580
129675
|
import { execFile as execFile4 } from "node:child_process";
|
|
129581
|
-
import { stat as stat14 } from "node:fs/promises";
|
|
129676
|
+
import { readFile as readFile83, stat as stat14 } from "node:fs/promises";
|
|
129582
129677
|
import { resolve as resolve10 } from "node:path";
|
|
129583
129678
|
import { promisify as promisify7 } from "node:util";
|
|
129584
129679
|
var DEFAULT_VAULT_ROOT4 = "org-kb";
|
|
129585
129680
|
var SHUTDOWN_SIGNALS = ["SIGINT", "SIGTERM"];
|
|
129681
|
+
var readBoundOrg = async (configPath) => {
|
|
129682
|
+
try {
|
|
129683
|
+
const raw = await readFile83(configPath, "utf8");
|
|
129684
|
+
const parsed = JSON.parse(raw);
|
|
129685
|
+
return typeof parsed.targetOrg === "string" ? parsed.targetOrg : null;
|
|
129686
|
+
} catch {
|
|
129687
|
+
return null;
|
|
129688
|
+
}
|
|
129689
|
+
};
|
|
129586
129690
|
var nodeExecFile3 = promisify7(execFile4);
|
|
129587
129691
|
var defaultListOrgs = async () => {
|
|
129588
129692
|
try {
|
|
@@ -129608,11 +129712,12 @@ var defaultListOrgs = async () => {
|
|
|
129608
129712
|
}
|
|
129609
129713
|
};
|
|
129610
129714
|
var prepareMcp = async (opts) => {
|
|
129611
|
-
const vaultRoot = resolve10(opts.cwd, DEFAULT_VAULT_ROOT4);
|
|
129715
|
+
const vaultRoot = opts.vaultRoot !== void 0 ? resolve10(opts.cwd, opts.vaultRoot) : resolve10(opts.cwd, DEFAULT_VAULT_ROOT4);
|
|
129612
129716
|
const paths = vaultPaths(vaultRoot);
|
|
129613
129717
|
if (!await pathExists6(paths.config)) {
|
|
129614
129718
|
const orgs = await (opts.listOrgs ?? defaultListOrgs)();
|
|
129615
|
-
const
|
|
129719
|
+
const where = opts.vaultRoot !== void 0 ? ` at ${vaultRoot}` : "";
|
|
129720
|
+
const base = `No vault${where}. Run \`sfi init\` followed by \`sfi refresh\`, or point \`sfi mcp --vault <path>\` at an existing org-kb.`;
|
|
129616
129721
|
const hint = orgs.length > 0 ? ` You are authenticated to ${orgs.length} org(s): ${orgs.slice(0, 8).join(", ")}${orgs.length > 8 ? ", \u2026" : ""}. Run \`sfi init\` to pick the one you want and build its knowledge base \u2014 live answers attach to a vault's org, so the product never guesses which of your orgs to query.` : "";
|
|
129617
129722
|
return err({ kind: "no-vault", message: base + hint });
|
|
129618
129723
|
}
|
|
@@ -129620,7 +129725,13 @@ var prepareMcp = async (opts) => {
|
|
|
129620
129725
|
if (!ctxResult.ok) {
|
|
129621
129726
|
return err({ kind: "buildContext-failed", message: ctxResult.error.message });
|
|
129622
129727
|
}
|
|
129623
|
-
|
|
129728
|
+
const targetOrg = await readBoundOrg(paths.config);
|
|
129729
|
+
return ok({
|
|
129730
|
+
ctx: ctxResult.value,
|
|
129731
|
+
server: createServer(ctxResult.value),
|
|
129732
|
+
vaultRoot,
|
|
129733
|
+
targetOrg
|
|
129734
|
+
});
|
|
129624
129735
|
};
|
|
129625
129736
|
var pathExists6 = async (path) => {
|
|
129626
129737
|
try {
|
|
@@ -129632,14 +129743,19 @@ var pathExists6 = async (path) => {
|
|
|
129632
129743
|
};
|
|
129633
129744
|
var isEnoent5 = (cause) => typeof cause === "object" && cause !== null && "code" in cause && cause.code === "ENOENT";
|
|
129634
129745
|
var registerMcpCommand = (program) => {
|
|
129635
|
-
program.command("mcp").description("Run the MCP server backing the org-kb vault").action(async () => {
|
|
129636
|
-
const prepared = await prepareMcp({
|
|
129746
|
+
program.command("mcp").description("Run the MCP server backing the org-kb vault").option("--vault <path>", "Serve a specific org-kb vault instead of ./org-kb (bind a project to the right org)").action(async (cmdOpts) => {
|
|
129747
|
+
const prepared = await prepareMcp({
|
|
129748
|
+
cwd: process.cwd(),
|
|
129749
|
+
...cmdOpts.vault !== void 0 ? { vaultRoot: cmdOpts.vault } : {}
|
|
129750
|
+
});
|
|
129637
129751
|
if (!prepared.ok) {
|
|
129638
129752
|
process.stderr.write(`sfi mcp: ${prepared.error.message}
|
|
129639
129753
|
`);
|
|
129640
129754
|
process.exit(1);
|
|
129641
129755
|
}
|
|
129642
|
-
const { ctx, server } = prepared.value;
|
|
129756
|
+
const { ctx, server, vaultRoot, targetOrg } = prepared.value;
|
|
129757
|
+
process.stderr.write(`sfi mcp: serving vault ${vaultRoot}${targetOrg !== null ? ` (org: ${targetOrg})` : " (no targetOrg in config)"}
|
|
129758
|
+
`);
|
|
129643
129759
|
const shutdownOnce = makeShutdownOnce(ctx);
|
|
129644
129760
|
for (const signal of SHUTDOWN_SIGNALS) {
|
|
129645
129761
|
process.on(signal, () => {
|
|
@@ -129916,7 +130032,7 @@ init_vault_git();
|
|
|
129916
130032
|
init_watch();
|
|
129917
130033
|
var readVersion = () => {
|
|
129918
130034
|
if (true)
|
|
129919
|
-
return "0.1.
|
|
130035
|
+
return "0.1.11";
|
|
129920
130036
|
const pkgUrl = new URL("../../package.json", import.meta.url);
|
|
129921
130037
|
const raw = readFileSync5(fileURLToPath2(pkgUrl), "utf8");
|
|
129922
130038
|
const parsed = JSON.parse(raw);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-intelligence",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "Offline-first, MCP-first knowledge base for a Salesforce org. Ask about your org's metadata, dependencies, permissions, and automation — grounded in real retrieved metadata. Ships the sfi CLI and an MCP server.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"homepage": "https://salesforce-intelligence.pages.dev",
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
"@sf-intelligence/core": "0.1.0",
|
|
52
52
|
"@sf-intelligence/extractors": "0.1.0",
|
|
53
53
|
"@sf-intelligence/mcp": "0.1.0",
|
|
54
|
-
"@sf-intelligence/
|
|
54
|
+
"@sf-intelligence/patterns": "0.1.0",
|
|
55
55
|
"@sf-intelligence/renderers": "0.1.0",
|
|
56
56
|
"@sf-intelligence/tooling-api": "0.1.0",
|
|
57
57
|
"@sf-intelligence/vault": "0.1.0",
|
|
58
|
-
"@sf-intelligence/
|
|
58
|
+
"@sf-intelligence/parsers": "0.1.0",
|
|
59
59
|
"@sf-intelligence/graph": "0.1.0"
|
|
60
60
|
},
|
|
61
61
|
"scripts": {
|