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.
Files changed (2) hide show
  1. package/dist/index.js +144 -28
  2. 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.10";
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 manifestPath = join26(tmpdir2(), `sfi-refresh-package-${Date.now()}.xml`);
127399
- const retrieveDir = join26(tmpdir2(), `sfi-retrieve-${Date.now()}`);
127400
- await writeFile11(manifestPath, buildPackageXml(manifestTypes), "utf8");
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 base = "No vault. Run `sfi init` followed by `sfi refresh`.";
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
- return ok({ ctx: ctxResult.value, server: createServer(ctxResult.value) });
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({ cwd: process.cwd() });
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.10";
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.10",
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/parsers": "0.1.0",
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/patterns": "0.1.0",
58
+ "@sf-intelligence/parsers": "0.1.0",
59
59
  "@sf-intelligence/graph": "0.1.0"
60
60
  },
61
61
  "scripts": {