bitfab-cli 0.2.438 → 0.2.440

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 +111 -49
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -4974,7 +4974,7 @@ var require_compile = __commonJS({
4974
4974
  const schOrFunc = root.refs[ref];
4975
4975
  if (schOrFunc)
4976
4976
  return schOrFunc;
4977
- let _sch = resolve5.call(this, root, ref);
4977
+ let _sch = resolve6.call(this, root, ref);
4978
4978
  if (_sch === void 0) {
4979
4979
  const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
4980
4980
  const { schemaId } = this.opts;
@@ -5001,7 +5001,7 @@ var require_compile = __commonJS({
5001
5001
  function sameSchemaEnv(s1, s2) {
5002
5002
  return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
5003
5003
  }
5004
- function resolve5(root, ref) {
5004
+ function resolve6(root, ref) {
5005
5005
  let sch;
5006
5006
  while (typeof (sch = this.refs[ref]) == "string")
5007
5007
  ref = sch;
@@ -5632,7 +5632,7 @@ var require_fast_uri = __commonJS({
5632
5632
  }
5633
5633
  return uri;
5634
5634
  }
5635
- function resolve5(baseURI, relativeURI, options) {
5635
+ function resolve6(baseURI, relativeURI, options) {
5636
5636
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
5637
5637
  const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
5638
5638
  const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
@@ -5916,7 +5916,7 @@ var require_fast_uri = __commonJS({
5916
5916
  var fastUri = {
5917
5917
  SCHEMES,
5918
5918
  normalize,
5919
- resolve: resolve5,
5919
+ resolve: resolve6,
5920
5920
  resolveComponent,
5921
5921
  equal,
5922
5922
  serialize,
@@ -8914,6 +8914,10 @@ import { cancel as cancel3 } from "@clack/prompts";
8914
8914
  import { execSync as execSync2 } from "child_process";
8915
8915
  import * as p7 from "@clack/prompts";
8916
8916
 
8917
+ // ../bitfab-plugin-lib/dist/bitfabToolHandlers.js
8918
+ import { readFile } from "fs/promises";
8919
+ import { resolve } from "path";
8920
+
8917
8921
  // ../node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/external.js
8918
8922
  var external_exports = {};
8919
8923
  __export(external_exports, {
@@ -13940,7 +13944,7 @@ var recursive = /* @__PURE__ */ new WeakMap();
13940
13944
  var NONE = 0;
13941
13945
  var ASSUMED = 1;
13942
13946
  var PROVEN = 2;
13943
- function isRecursive(inst, stack, resolve5) {
13947
+ function isRecursive(inst, stack, resolve6) {
13944
13948
  const cached2 = recursive.get(inst);
13945
13949
  if (cached2 !== void 0)
13946
13950
  return cached2 ? PROVEN : NONE;
@@ -13950,7 +13954,7 @@ function isRecursive(inst, stack, resolve5) {
13950
13954
  let result = NONE;
13951
13955
  const check2 = (child) => {
13952
13956
  if (result !== PROVEN && child?._zod) {
13953
- const answer = isRecursive(child, stack, resolve5);
13957
+ const answer = isRecursive(child, stack, resolve6);
13954
13958
  if (answer > result)
13955
13959
  result = answer;
13956
13960
  }
@@ -13961,7 +13965,7 @@ function isRecursive(inst, stack, resolve5) {
13961
13965
  const desc = Object.getOwnPropertyDescriptor(sh, key);
13962
13966
  if (spread && !desc.enumerable)
13963
13967
  continue;
13964
- const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve5) : NONE;
13968
+ const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve6) : NONE;
13965
13969
  if (child > answer)
13966
13970
  answer = child;
13967
13971
  }
@@ -14025,7 +14029,7 @@ function isRecursive(inst, stack, resolve5) {
14025
14029
  break;
14026
14030
  // `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
14027
14031
  case "lazy": {
14028
- const inner = def._cachedInner ?? (resolve5 ? inst._zod.innerType : void 0);
14032
+ const inner = def._cachedInner ?? (resolve6 ? inst._zod.innerType : void 0);
14029
14033
  merge2(inner ? isRecursive(inner, stack, false) : ASSUMED);
14030
14034
  break;
14031
14035
  }
@@ -29253,17 +29257,29 @@ var getScenario = {
29253
29257
  var saveScenario = {
29254
29258
  name: "save_scenario",
29255
29259
  title: "Save Scenario",
29256
- description: "Update one scenario, found by its id or by a trace it was built from, for example to add history the run had available, record data it was missing, or correct the trigger. name, description, trigger, and data each replace the saved value whole, and fields left out are kept. To add to the data without resending it, use appendData instead of data: its history entries go after the saved ones and its missing items after the saved missing items, in one step that cannot lose another caller's append made at the same time. Send data or appendData, not both. trigger, data, and appendData entries must keep the shape get_scenario returns. A history entry's source names the span its text came from, on any trace linked to the scenario (a trace that finds it by traceId is one); set it to null or leave it out when the text is not in such a trace, and the entry still counts as data the run had but cannot be cited as evidence when the scenario is turned into assertions. A source naming a span on any other trace is refused. The trigger and data summaries are rebuilt from what is saved. It only updates a scenario that already exists; a trace with no scenario, or a scenario id that does not exist, is refused. Returns the saved scenario.",
29260
+ description: "Create or update one scenario. To create a scenario, or to replace its records, send traceId with records or recordsPath: the records your own system holds that relate to that trace's run, as of the run. Bitfab builds the trigger and data from the trace when the trace has no scenario yet (so far only for traces of Noah's noah-agent-turn function; any other trace with no scenario is refused), then looks for each record's quote, and failing that its text, in the inputs and outputs of the trace's spans. A record found in a span cites that span and can back an assertion; a record found in no span is kept as context the run never saw. A trace that is a replay is refused, because a scenario belongs on the original. records and recordsPath replace the saved records whole, need traceId rather than scenarioId, and cannot be sent with any other field. To edit a scenario that already exists, find it by its id or by a trace it was built from and send name, description, trigger, data, or appendData, for example to add history the run had available, record data it was missing, or correct the trigger. name, description, trigger, and data each replace the saved value whole, and fields left out are kept. To add to the data without resending it, use appendData instead of data: its history entries go after the saved ones and its missing items after the saved missing items, in one step that cannot lose another caller's append made at the same time. Send data or appendData, not both. trigger, data, and appendData entries must keep the shape get_scenario returns. A history entry's source names the span its text came from, on any trace linked to the scenario (a trace that finds it by traceId is one); set it to null or leave it out when the text is not in such a trace, and the entry still counts as data the run had but cannot be cited as evidence when the scenario is turned into assertions. A source naming a span on any other trace is refused. The trigger and data summaries are rebuilt from what is saved. An edit to a trace with no scenario, or to a scenario id that does not exist, is refused. Returns the saved scenario.",
29257
29261
  inputSchema: {
29258
29262
  ...scenarioTargetSchema,
29259
29263
  name: external_exports.string().min(1).optional().describe("The scenario's name."),
29260
29264
  description: external_exports.string().min(1).optional().describe("The scenario's description."),
29261
29265
  trigger: external_exports.preprocess(parseJsonString, external_exports.record(external_exports.string(), external_exports.unknown())).optional().describe("The whole trigger object, in the shape get_scenario returns: what started the run."),
29262
- data: external_exports.preprocess(parseJsonString, external_exports.record(external_exports.string(), external_exports.unknown())).optional().describe("The whole data object, in the shape get_scenario returns: topic, history (earlier facts in time order, each with its source span), and missing (what the run did not have). Replaces the saved data. Leave it out when sending appendData."),
29266
+ data: external_exports.preprocess(parseJsonString, external_exports.record(external_exports.string(), external_exports.unknown())).optional().describe("The whole data object, in the shape get_scenario returns: topic, history (earlier facts in time order, each with its source span), and missing (what the run did not have). Replaces the saved data, except that the saved records are kept when it has no records field. Leave it out when sending appendData."),
29263
29267
  appendData: external_exports.preprocess(parseJsonString, external_exports.object({
29264
29268
  history: external_exports.array(external_exports.record(external_exports.string(), external_exports.unknown())).optional(),
29265
29269
  missing: external_exports.array(external_exports.string()).optional()
29266
- })).optional().describe("Data to add to the saved data: history entries (same shape as data.history, source optional, in time order, after the saved ones) and missing items. At least one of the two must be non-empty. Leave data out when sending this.")
29270
+ })).optional().describe("Data to add to the saved data: history entries (same shape as data.history, source optional, in time order, after the saved ones) and missing items. At least one of the two must be non-empty. Leave data out when sending this."),
29271
+ records: external_exports.preprocess(parseJsonString, external_exports.array(external_exports.record(external_exports.string(), external_exports.unknown()))).optional().describe(`The records related to this run, each { kind, ref, at, asOf, title, text, quote }. kind is one of "message", "contact", "preference", "memory", "email", "calendar_event", "action_item". ref is your own pointer to the row, such as "Input:234605". at is when the record came to exist, or null. asOf is "run" when the record is as it was at the run, or "now" when no history is kept for it. quote is a short exact string to look for in the run's spans, or null to look for the whole text. Prefer recordsPath, so the records never pass through the conversation. Send records or recordsPath, not both.`),
29272
+ recordsPath: external_exports.string().min(1).optional().describe("Path to a local JSON file holding the records, either as an array or as an object with a records array. The Bitfab plugin reads the file and sends its records, so they never pass through the conversation. Send records or recordsPath, not both.")
29273
+ }
29274
+ };
29275
+ var generateScenarioAssertions = {
29276
+ name: "generate_scenario_assertions",
29277
+ title: "Generate Scenario Assertions",
29278
+ description: "Turn a person's label on the scenario built from one trace into up to four assertions, saved as pending agent assertions on that trace for review. The note says what the run got right or wrong; the verdict says whether the run was right overall. Each assertion cites the spans that settle its values, from the scenario's trigger, history, and records the run saw; records the run never saw are context only. A note that gives nothing a reviewer could check against a replay yields no assertions. A trace that is a replay, or a trace with no scenario, is refused. Returns the saved assertions.",
29279
+ inputSchema: {
29280
+ traceId: external_exports.uuid().describe("ID of the trace whose run the person labeled. Its scenario supplies the context, and the assertions are saved on this trace."),
29281
+ verdict: external_exports.preprocess(parseJsonString, external_exports.boolean()).optional().describe("true when the person said the run was right, false when wrong. Leave it out when they gave no verdict."),
29282
+ note: external_exports.string().min(1).describe("What the person said was right or wrong about the run, in their words.")
29267
29283
  }
29268
29284
  };
29269
29285
  var ALL_TOOL_CONTRACTS = [
@@ -29320,7 +29336,8 @@ var ALL_TOOL_CONTRACTS = [
29320
29336
  getSimPlan,
29321
29337
  saveSimPlan,
29322
29338
  getScenario,
29323
- saveScenario
29339
+ saveScenario,
29340
+ generateScenarioAssertions
29324
29341
  ];
29325
29342
  var TOOL_NAMES = ALL_TOOL_CONTRACTS.map((contract) => contract.name).sort();
29326
29343
 
@@ -29718,6 +29735,36 @@ function withLegacyExperimentKeys(args) {
29718
29735
  ...args.experimentIds === void 0 ? {} : { testRunIds: args.experimentIds }
29719
29736
  };
29720
29737
  }
29738
+ function recordsInFile(parsed) {
29739
+ if (Array.isArray(parsed)) {
29740
+ return parsed;
29741
+ }
29742
+ if (typeof parsed === "object" && parsed !== null && "records" in parsed && Array.isArray(parsed.records)) {
29743
+ return parsed.records;
29744
+ }
29745
+ return null;
29746
+ }
29747
+ async function readRecordsFile(recordsPath) {
29748
+ const fullPath = resolve(recordsPath);
29749
+ let contents;
29750
+ try {
29751
+ contents = await readFile(fullPath, "utf8");
29752
+ } catch (error62) {
29753
+ return {
29754
+ error: `could not read recordsPath ${fullPath}: ${error62 instanceof Error ? error62.message : String(error62)}`
29755
+ };
29756
+ }
29757
+ let parsed;
29758
+ try {
29759
+ parsed = JSON.parse(contents);
29760
+ } catch {
29761
+ return { error: `recordsPath ${fullPath} is not JSON.` };
29762
+ }
29763
+ const records = recordsInFile(parsed);
29764
+ return records === null ? {
29765
+ error: `recordsPath ${fullPath} holds neither an array of records nor an object with a records array.`
29766
+ } : { records };
29767
+ }
29721
29768
  function createBitfabToolHandlers(platform2, getConfig2, pluginVersion) {
29722
29769
  const proxy = new McpProxy(platform2, pluginVersion);
29723
29770
  function proxyToolCall(toolName, args) {
@@ -29760,10 +29807,25 @@ function createBitfabToolHandlers(platform2, getConfig2, pluginVersion) {
29760
29807
  notes
29761
29808
  });
29762
29809
  }
29810
+ async function handleSaveScenario(args) {
29811
+ const { recordsPath, ...rest } = args;
29812
+ if (recordsPath === void 0) {
29813
+ return proxyToolCall("save_scenario", rest);
29814
+ }
29815
+ if (rest.records !== void 0) {
29816
+ return errorResult("Error saving scenario: send records or recordsPath, not both.");
29817
+ }
29818
+ const read = await readRecordsFile(recordsPath);
29819
+ if ("error" in read) {
29820
+ return errorResult(`Error saving scenario: ${read.error}`);
29821
+ }
29822
+ return proxyToolCall("save_scenario", { ...rest, records: read.records });
29823
+ }
29763
29824
  const specialHandlers = {
29764
29825
  [saveAgentLabels.name]: handleSaveAgentLabels,
29765
29826
  [saveExperiment.name]: handleSaveExperiment,
29766
- [saveExperimentGroup.name]: handleSaveExperimentGroup
29827
+ [saveExperimentGroup.name]: handleSaveExperimentGroup,
29828
+ [saveScenario.name]: handleSaveScenario
29767
29829
  };
29768
29830
  const handlers = ALL_TOOL_CONTRACTS.map((contract) => ({
29769
29831
  contract,
@@ -29930,10 +29992,10 @@ var semver3 = __toESM(require_semver2(), 1);
29930
29992
 
29931
29993
  // ../bitfab-plugin-lib/dist/bakedSdkVersions.js
29932
29994
  var BAKED_SDK_VERSIONS = {
29933
- typescript: "0.64.20",
29934
- python: "0.64.19",
29935
- ruby: "0.64.17",
29936
- go: "0.64.18"
29995
+ typescript: "0.64.21",
29996
+ python: "0.64.20",
29997
+ ruby: "0.64.18",
29998
+ go: "0.64.19"
29937
29999
  };
29938
30000
 
29939
30001
  // ../bitfab-plugin-lib/dist/installedSdk.js
@@ -29952,7 +30014,7 @@ function exists(p9) {
29952
30014
  return false;
29953
30015
  }
29954
30016
  }
29955
- function readFile(p9) {
30017
+ function readFile2(p9) {
29956
30018
  try {
29957
30019
  return fs6.readFileSync(p9, "utf-8");
29958
30020
  } catch {
@@ -30003,7 +30065,7 @@ function expandGlob(rootDir, pattern) {
30003
30065
  });
30004
30066
  }
30005
30067
  function readPnpmWorkspacePackages(rootDir) {
30006
- const content = readFile(path5.join(rootDir, "pnpm-workspace.yaml"));
30068
+ const content = readFile2(path5.join(rootDir, "pnpm-workspace.yaml"));
30007
30069
  if (!content) {
30008
30070
  return [];
30009
30071
  }
@@ -30021,7 +30083,7 @@ function readPnpmWorkspacePackages(rootDir) {
30021
30083
  return patterns.flatMap((p9) => expandGlob(rootDir, p9));
30022
30084
  }
30023
30085
  function readPackageJsonWorkspaces(rootDir) {
30024
- const content = readFile(path5.join(rootDir, "package.json"));
30086
+ const content = readFile2(path5.join(rootDir, "package.json"));
30025
30087
  if (!content) {
30026
30088
  return [];
30027
30089
  }
@@ -30039,7 +30101,7 @@ function readPackageJsonWorkspaces(rootDir) {
30039
30101
  }
30040
30102
  }
30041
30103
  function readUvWorkspaceMembers(rootDir) {
30042
- const content = readFile(path5.join(rootDir, "pyproject.toml"));
30104
+ const content = readFile2(path5.join(rootDir, "pyproject.toml"));
30043
30105
  if (!content) {
30044
30106
  return [];
30045
30107
  }
@@ -30058,7 +30120,7 @@ function readUvWorkspaceMembers(rootDir) {
30058
30120
  return patterns.flatMap((p9) => expandGlob(rootDir, p9));
30059
30121
  }
30060
30122
  function readGoWorkModules(rootDir) {
30061
- const content = readFile(path5.join(rootDir, "go.work"));
30123
+ const content = readFile2(path5.join(rootDir, "go.work"));
30062
30124
  if (!content) {
30063
30125
  return [];
30064
30126
  }
@@ -30713,7 +30775,7 @@ async function closeLoginWindow(signInUrl) {
30713
30775
  const appName = path15.match(/\/([^/]+)\.app\//)?.[1];
30714
30776
  return appName === void 0 ? [] : [appName];
30715
30777
  }));
30716
- await Promise.all(appNames.map((appName) => new Promise((resolve5) => {
30778
+ await Promise.all(appNames.map((appName) => new Promise((resolve6) => {
30717
30779
  const script = [
30718
30780
  "on run argv",
30719
30781
  " set loginPrefix to item 1 of argv",
@@ -30736,9 +30798,9 @@ async function closeLoginWindow(signInUrl) {
30736
30798
  "end run"
30737
30799
  ].join("\n");
30738
30800
  try {
30739
- execFile("osascript", ["-e", script, `${url2.origin}${url2.pathname}?`, marker], { timeout: 4e3 }, () => resolve5());
30801
+ execFile("osascript", ["-e", script, `${url2.origin}${url2.pathname}?`, marker], { timeout: 4e3 }, () => resolve6());
30740
30802
  } catch {
30741
- resolve5();
30803
+ resolve6();
30742
30804
  }
30743
30805
  })));
30744
30806
  }
@@ -31037,7 +31099,7 @@ import { join } from "path";
31037
31099
  // ../bitfab-plugin-lib/dist/commands/replayProgress.js
31038
31100
  import { spawn as spawn2 } from "child_process";
31039
31101
  import { createWriteStream, mkdirSync as mkdirSync4, rmSync as rmSync2 } from "fs";
31040
- import { dirname as dirname3, resolve as resolve3 } from "path";
31102
+ import { dirname as dirname3, resolve as resolve4 } from "path";
31041
31103
  import { createInterface } from "readline";
31042
31104
 
31043
31105
  // ../bitfab-plugin-lib/dist/replayCloudResult.js
@@ -31061,7 +31123,7 @@ import { dirname } from "path";
31061
31123
  // ../bitfab-plugin-lib/dist/replayRunDir.js
31062
31124
  import { randomUUID } from "crypto";
31063
31125
  import { appendFileSync, existsSync, mkdirSync as mkdirSync2, readFileSync as readFileSync2, statSync } from "fs";
31064
- import { dirname as dirname2, join as join2, resolve } from "path";
31126
+ import { dirname as dirname2, join as join2, resolve as resolve2 } from "path";
31065
31127
  var EXPERIMENT_ID_KEYS = [
31066
31128
  "experimentId",
31067
31129
  "experiment_id",
@@ -31087,7 +31149,7 @@ function extractExperimentId(result) {
31087
31149
 
31088
31150
  // ../bitfab-plugin-lib/dist/replayResultResolver.js
31089
31151
  import { readFileSync as readFileSync3, rmSync } from "fs";
31090
- import { resolve as resolve2 } from "path";
31152
+ import { resolve as resolve3 } from "path";
31091
31153
  var replayResultSchema = external_exports.object({
31092
31154
  items: external_exports.array(external_exports.unknown()),
31093
31155
  experimentId: external_exports.string().optional(),
@@ -46276,7 +46338,7 @@ var Protocol = class {
46276
46338
  return;
46277
46339
  }
46278
46340
  const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1e3;
46279
- await new Promise((resolve5) => setTimeout(resolve5, pollInterval));
46341
+ await new Promise((resolve6) => setTimeout(resolve6, pollInterval));
46280
46342
  options?.signal?.throwIfAborted();
46281
46343
  }
46282
46344
  } catch (error62) {
@@ -46293,7 +46355,7 @@ var Protocol = class {
46293
46355
  */
46294
46356
  request(request, resultSchema, options) {
46295
46357
  const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {};
46296
- return new Promise((resolve5, reject) => {
46358
+ return new Promise((resolve6, reject) => {
46297
46359
  const earlyReject = (error62) => {
46298
46360
  reject(error62);
46299
46361
  };
@@ -46371,7 +46433,7 @@ var Protocol = class {
46371
46433
  if (!parseResult.success) {
46372
46434
  reject(parseResult.error);
46373
46435
  } else {
46374
- resolve5(parseResult.data);
46436
+ resolve6(parseResult.data);
46375
46437
  }
46376
46438
  } catch (error62) {
46377
46439
  reject(error62);
@@ -46632,12 +46694,12 @@ var Protocol = class {
46632
46694
  }
46633
46695
  } catch {
46634
46696
  }
46635
- return new Promise((resolve5, reject) => {
46697
+ return new Promise((resolve6, reject) => {
46636
46698
  if (signal.aborted) {
46637
46699
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
46638
46700
  return;
46639
46701
  }
46640
- const timeoutId = setTimeout(resolve5, interval);
46702
+ const timeoutId = setTimeout(resolve6, interval);
46641
46703
  signal.addEventListener("abort", () => {
46642
46704
  clearTimeout(timeoutId);
46643
46705
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
@@ -47728,7 +47790,7 @@ var McpServer = class {
47728
47790
  let task = createTaskResult.task;
47729
47791
  const pollInterval = task.pollInterval ?? 5e3;
47730
47792
  while (task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled") {
47731
- await new Promise((resolve5) => setTimeout(resolve5, pollInterval));
47793
+ await new Promise((resolve6) => setTimeout(resolve6, pollInterval));
47732
47794
  const updatedTask = await extra.taskStore.getTask(taskId);
47733
47795
  if (!updatedTask) {
47734
47796
  throw new McpError(ErrorCode.InternalError, `Task ${taskId} not found during polling`);
@@ -48392,12 +48454,12 @@ var StdioServerTransport = class {
48392
48454
  this.onclose?.();
48393
48455
  }
48394
48456
  send(message) {
48395
- return new Promise((resolve5) => {
48457
+ return new Promise((resolve6) => {
48396
48458
  const json2 = serializeMessage(message);
48397
48459
  if (this._stdout.write(json2)) {
48398
- resolve5();
48460
+ resolve6();
48399
48461
  } else {
48400
- this._stdout.once("drain", resolve5);
48462
+ this._stdout.once("drain", resolve6);
48401
48463
  }
48402
48464
  });
48403
48465
  }
@@ -49031,7 +49093,7 @@ async function runClaudeAnalyzeRepo(captureOverride, limit, prompt) {
49031
49093
  }
49032
49094
  };
49033
49095
  try {
49034
- const exitCode = await new Promise((resolve5, reject) => {
49096
+ const exitCode = await new Promise((resolve6, reject) => {
49035
49097
  const child = spawn3(
49036
49098
  CLI2,
49037
49099
  [
@@ -49070,7 +49132,7 @@ async function runClaudeAnalyzeRepo(captureOverride, limit, prompt) {
49070
49132
  );
49071
49133
  return;
49072
49134
  }
49073
- resolve5(code2);
49135
+ resolve6(code2);
49074
49136
  });
49075
49137
  });
49076
49138
  flushRedactors();
@@ -49910,7 +49972,7 @@ async function runCodexAnalyzeRepo(captureOverride, limit, prompt) {
49910
49972
  }
49911
49973
  };
49912
49974
  try {
49913
- const exitCode = await new Promise((resolve5, reject) => {
49975
+ const exitCode = await new Promise((resolve6, reject) => {
49914
49976
  const child = spawn4(
49915
49977
  CLI3,
49916
49978
  [
@@ -49952,7 +50014,7 @@ async function runCodexAnalyzeRepo(captureOverride, limit, prompt) {
49952
50014
  );
49953
50015
  return;
49954
50016
  }
49955
- resolve5(code2);
50017
+ resolve6(code2);
49956
50018
  });
49957
50019
  });
49958
50020
  flushRedactors();
@@ -50231,7 +50293,7 @@ async function runCursorAnalyzeRepo(captureOverride, limit, prompt) {
50231
50293
  }
50232
50294
  };
50233
50295
  try {
50234
- const exitCode = await new Promise((resolve5, reject) => {
50296
+ const exitCode = await new Promise((resolve6, reject) => {
50235
50297
  const child = spawn5(
50236
50298
  "cursor",
50237
50299
  [
@@ -50276,7 +50338,7 @@ async function runCursorAnalyzeRepo(captureOverride, limit, prompt) {
50276
50338
  );
50277
50339
  return;
50278
50340
  }
50279
- resolve5(code2);
50341
+ resolve6(code2);
50280
50342
  });
50281
50343
  });
50282
50344
  flushRedactors();
@@ -50790,7 +50852,7 @@ import * as p8 from "@clack/prompts";
50790
50852
  // src/setupV2Verification.ts
50791
50853
  import { spawnSync as spawnSync4 } from "child_process";
50792
50854
  import { existsSync as existsSync3, readFileSync as readFileSync4 } from "fs";
50793
- import { basename, relative, resolve as resolve4 } from "path";
50855
+ import { basename, relative, resolve as resolve5 } from "path";
50794
50856
  var MUTATING_TOOLS = /* @__PURE__ */ new Set(["Edit", "Write"]);
50795
50857
  var CODE_EXTENSIONS = /* @__PURE__ */ new Set([
50796
50858
  ".cjs",
@@ -50814,7 +50876,7 @@ function pathFromToolInput(input2) {
50814
50876
  return typeof path15 === "string" ? path15 : void 0;
50815
50877
  }
50816
50878
  function normalizePath(cwd, path15) {
50817
- return resolve4(cwd, path15);
50879
+ return resolve5(cwd, path15);
50818
50880
  }
50819
50881
  function readGitDirtyPaths(cwd) {
50820
50882
  const result = spawnSync4(
@@ -50915,7 +50977,7 @@ function resolveRelativeImport(registryPath, specifier, sourcePaths) {
50915
50977
  if (!specifier.startsWith(".")) {
50916
50978
  return void 0;
50917
50979
  }
50918
- const base = resolve4(registryPath, "..", specifier);
50980
+ const base = resolve5(registryPath, "..", specifier);
50919
50981
  const candidates = [
50920
50982
  base,
50921
50983
  `${base}.ts`,
@@ -50924,8 +50986,8 @@ function resolveRelativeImport(registryPath, specifier, sourcePaths) {
50924
50986
  `${base}.mjs`,
50925
50987
  base.replace(/\.js$/, ".ts"),
50926
50988
  base.replace(/\.mjs$/, ".ts"),
50927
- resolve4(base, "index.ts"),
50928
- resolve4(base, "index.tsx")
50989
+ resolve5(base, "index.ts"),
50990
+ resolve5(base, "index.tsx")
50929
50991
  ];
50930
50992
  return candidates.find((candidate) => sourcePaths.has(candidate));
50931
50993
  }
@@ -50945,7 +51007,7 @@ function importedSourcePaths(registryPath, source, sourcePaths) {
50945
51007
  return [...paths];
50946
51008
  }
50947
51009
  function projectTypecheckCoversRegistry(cwd, registryPath) {
50948
- const configPath = resolve4(cwd, "tsconfig.json");
51010
+ const configPath = resolve5(cwd, "tsconfig.json");
50949
51011
  if (!existsSync3(configPath)) {
50950
51012
  return false;
50951
51013
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bitfab-cli",
3
- "version": "0.2.438",
3
+ "version": "0.2.440",
4
4
  "description": "Install and configure the Bitfab plugin in Claude Code, Codex, or Cursor, or the Bitfab skill pack in Amp (Alpha).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",