@girardmedia/bootspring 2.3.2 → 2.3.4

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.
@@ -1395,9 +1395,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
1395
1395
  if (fn) {
1396
1396
  this._exitCallback = fn;
1397
1397
  } else {
1398
- this._exitCallback = (err2) => {
1399
- if (err2.code !== "commander.executeSubCommandAsync") {
1400
- throw err2;
1398
+ this._exitCallback = (err) => {
1399
+ if (err.code !== "commander.executeSubCommandAsync") {
1400
+ throw err;
1401
1401
  } else {
1402
1402
  }
1403
1403
  };
@@ -1473,12 +1473,12 @@ Expecting one of '${allowedValues.join("', '")}'`);
1473
1473
  _callParseArg(target, value, previous, invalidArgumentMessage) {
1474
1474
  try {
1475
1475
  return target.parseArg(value, previous);
1476
- } catch (err2) {
1477
- if (err2.code === "commander.invalidArgument") {
1478
- const message = `${invalidArgumentMessage} ${err2.message}`;
1479
- this.error(message, { exitCode: err2.exitCode, code: err2.code });
1476
+ } catch (err) {
1477
+ if (err.code === "commander.invalidArgument") {
1478
+ const message = `${invalidArgumentMessage} ${err.message}`;
1479
+ this.error(message, { exitCode: err.exitCode, code: err.code });
1480
1480
  }
1481
- throw err2;
1481
+ throw err;
1482
1482
  }
1483
1483
  }
1484
1484
  /**
@@ -1937,7 +1937,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1937
1937
  let resolvedScriptPath;
1938
1938
  try {
1939
1939
  resolvedScriptPath = fs54.realpathSync(this._scriptPath);
1940
- } catch (err2) {
1940
+ } catch (err) {
1941
1941
  resolvedScriptPath = this._scriptPath;
1942
1942
  }
1943
1943
  executableDir = path55.resolve(
@@ -2001,15 +2001,15 @@ Expecting one of '${allowedValues.join("', '")}'`);
2001
2001
  );
2002
2002
  }
2003
2003
  });
2004
- proc.on("error", (err2) => {
2005
- if (err2.code === "ENOENT") {
2004
+ proc.on("error", (err) => {
2005
+ if (err.code === "ENOENT") {
2006
2006
  const executableDirMessage = executableDir ? `searched for local subcommand relative to directory '${executableDir}'` : "no directory for search for local subcommand, use .executableDir() to supply a custom directory";
2007
2007
  const executableMissing = `'${executableFile}' does not exist
2008
2008
  - if '${subcommand._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
2009
2009
  - if the default executable name is not suitable, use the executableFile option to supply a custom name or path
2010
2010
  - ${executableDirMessage}`;
2011
2011
  throw new Error(executableMissing);
2012
- } else if (err2.code === "EACCES") {
2012
+ } else if (err.code === "EACCES") {
2013
2013
  throw new Error(`'${executableFile}' not executable`);
2014
2014
  }
2015
2015
  if (!exitCallback) {
@@ -2020,7 +2020,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
2020
2020
  "commander.executeSubCommandAsync",
2021
2021
  "(error)"
2022
2022
  );
2023
- wrappedError.nestedError = err2;
2023
+ wrappedError.nestedError = err;
2024
2024
  exitCallback(wrappedError);
2025
2025
  }
2026
2026
  });
@@ -3398,8 +3398,8 @@ function getCredentials() {
3398
3398
  }
3399
3399
  return decrypted;
3400
3400
  }
3401
- } catch (err2) {
3402
- console.error("[bootspring] Failed to read credentials:", err2.message);
3401
+ } catch (err) {
3402
+ console.error("[bootspring] Failed to read credentials:", err.message);
3403
3403
  }
3404
3404
  return null;
3405
3405
  }
@@ -3813,11 +3813,11 @@ async function request(method, path310, data = null, options = {}) {
3813
3813
  }
3814
3814
  });
3815
3815
  });
3816
- req.on("error", (err2) => {
3817
- if (err2.code === "ECONNREFUSED") {
3816
+ req.on("error", (err) => {
3817
+ if (err.code === "ECONNREFUSED") {
3818
3818
  reject(new Error("Cannot connect to Bootspring API."));
3819
3819
  } else {
3820
- reject(new Error(redactSensitiveString(err2.message || String(err2))));
3820
+ reject(new Error(redactSensitiveString(err.message || String(err))));
3821
3821
  }
3822
3822
  });
3823
3823
  if (data && method !== "GET") req.write(JSON.stringify(data));
@@ -4582,8 +4582,8 @@ ${COLORS.bold}Your Projects${COLORS.reset}
4582
4582
  console.log(` ${COLORS.dim}ID:${COLORS.reset} ${p.id} ${COLORS.dim}Role:${COLORS.reset} ${p.role || "owner"}
4583
4583
  `);
4584
4584
  });
4585
- } catch (err2) {
4586
- print.error(`Failed to list projects: ${err2.message}`);
4585
+ } catch (err) {
4586
+ print.error(`Failed to list projects: ${err.message}`);
4587
4587
  }
4588
4588
  });
4589
4589
  projectCmd.command("create [name]").alias("new").description("Create a new project").option("-d, --description <desc>", "Project description").option("-f, --framework <framework>", "Project framework (e.g., nextjs, nodejs)").option("--repo <url>", "Repository URL").action(async (name, options) => {
@@ -4602,8 +4602,8 @@ ${COLORS.bold}Your Projects${COLORS.reset}
4602
4602
  print.success(`Project "${response.name}" created successfully!`);
4603
4603
  console.log(`${COLORS.dim}ID:${COLORS.reset} ${response.id}`);
4604
4604
  console.log(`${COLORS.dim}Slug:${COLORS.reset} ${response.slug}`);
4605
- } catch (err2) {
4606
- print.error(`Failed to create project: ${err2.message}`);
4605
+ } catch (err) {
4606
+ print.error(`Failed to create project: ${err.message}`);
4607
4607
  }
4608
4608
  });
4609
4609
  projectCmd.command("info").alias("current").description("Show current project info").action(async () => {
@@ -4639,12 +4639,12 @@ ${COLORS.bold}Current Project Context${COLORS.reset}`);
4639
4639
  role: options.role
4640
4640
  });
4641
4641
  print.success(`Invitation sent to ${email} (role: ${options.role})`);
4642
- } catch (err2) {
4643
- if (err2.status === 403) {
4642
+ } catch (err) {
4643
+ if (err.status === 403) {
4644
4644
  print.warning("Project invitations require a paid Bootspring plan.");
4645
4645
  print.dim("Upgrade: https://bootspring.com/pricing");
4646
4646
  } else {
4647
- print.error(`Failed to invite: ${err2.message}`);
4647
+ print.error(`Failed to invite: ${err.message}`);
4648
4648
  }
4649
4649
  }
4650
4650
  });
@@ -4670,8 +4670,8 @@ ${COLORS.bold}Project Members${COLORS.reset} (${current.name})
4670
4670
  console.log(` ${m.email || m.name || m.id} ${roleColor}${role}${COLORS.reset}`);
4671
4671
  }
4672
4672
  console.log("");
4673
- } catch (err2) {
4674
- print.error(`Failed to list members: ${err2.message}`);
4673
+ } catch (err) {
4674
+ print.error(`Failed to list members: ${err.message}`);
4675
4675
  }
4676
4676
  });
4677
4677
  projectCmd.command("invitations").alias("invites").description("List pending invitations").action(async () => {
@@ -4694,8 +4694,8 @@ ${COLORS.bold}Pending Invitations${COLORS.reset}
4694
4694
  console.log(` ${inv.email} ${COLORS.dim}role: ${inv.role || "member"} sent: ${inv.createdAt || "unknown"}${COLORS.reset}`);
4695
4695
  }
4696
4696
  console.log("");
4697
- } catch (err2) {
4698
- print.error(`Failed to list invitations: ${err2.message}`);
4697
+ } catch (err) {
4698
+ print.error(`Failed to list invitations: ${err.message}`);
4699
4699
  }
4700
4700
  });
4701
4701
  projectCmd.command("accept <invitationId>").description("Accept a project invitation").action(async (invitationId) => {
@@ -4706,8 +4706,8 @@ ${COLORS.bold}Pending Invitations${COLORS.reset}
4706
4706
  try {
4707
4707
  await api_client_exports.request("POST", `/invitations/${encodeURIComponent(invitationId)}/accept`);
4708
4708
  print.success("Invitation accepted!");
4709
- } catch (err2) {
4710
- print.error(`Failed to accept invitation: ${err2.message}`);
4709
+ } catch (err) {
4710
+ print.error(`Failed to accept invitation: ${err.message}`);
4711
4711
  }
4712
4712
  });
4713
4713
  projectCmd.command("decline <invitationId>").description("Decline a project invitation").action(async (invitationId) => {
@@ -4718,8 +4718,8 @@ ${COLORS.bold}Pending Invitations${COLORS.reset}
4718
4718
  try {
4719
4719
  await api_client_exports.request("POST", `/invitations/${encodeURIComponent(invitationId)}/decline`);
4720
4720
  print.success("Invitation declined.");
4721
- } catch (err2) {
4722
- print.error(`Failed to decline invitation: ${err2.message}`);
4721
+ } catch (err) {
4722
+ print.error(`Failed to decline invitation: ${err.message}`);
4723
4723
  }
4724
4724
  });
4725
4725
  projectCmd.command("update-member <email>").description("Update member role").option("--role <role>", "New role (admin, member, viewer)", "member").action(async (email, options) => {
@@ -4734,8 +4734,8 @@ ${COLORS.bold}Pending Invitations${COLORS.reset}
4734
4734
  role: options.role
4735
4735
  });
4736
4736
  print.success(`Updated ${email} to role: ${options.role}`);
4737
- } catch (err2) {
4738
- print.error(`Failed to update member: ${err2.message}`);
4737
+ } catch (err) {
4738
+ print.error(`Failed to update member: ${err.message}`);
4739
4739
  }
4740
4740
  });
4741
4741
  projectCmd.command("remove-member <email>").description("Remove a project member").action(async (email) => {
@@ -4749,8 +4749,8 @@ ${COLORS.bold}Pending Invitations${COLORS.reset}
4749
4749
  email
4750
4750
  });
4751
4751
  print.success(`Removed ${email} from project.`);
4752
- } catch (err2) {
4753
- print.error(`Failed to remove member: ${err2.message}`);
4752
+ } catch (err) {
4753
+ print.error(`Failed to remove member: ${err.message}`);
4754
4754
  }
4755
4755
  });
4756
4756
  projectCmd.command("transfer <email>").description("Transfer project ownership").action(async (email) => {
@@ -4764,11 +4764,11 @@ ${COLORS.bold}Pending Invitations${COLORS.reset}
4764
4764
  newOwnerEmail: email
4765
4765
  });
4766
4766
  print.success(`Ownership transferred to ${email}.`);
4767
- } catch (err2) {
4768
- if (err2.status === 403) {
4767
+ } catch (err) {
4768
+ if (err.status === 403) {
4769
4769
  print.warning("Only the project owner can transfer ownership.");
4770
4770
  } else {
4771
- print.error(`Failed to transfer project: ${err2.message}`);
4771
+ print.error(`Failed to transfer project: ${err.message}`);
4772
4772
  }
4773
4773
  }
4774
4774
  });
@@ -4797,8 +4797,8 @@ ${COLORS.bold}Project Activity${COLORS.reset} (${current.name})
4797
4797
  }
4798
4798
  }
4799
4799
  console.log("");
4800
- } catch (err2) {
4801
- print.error(`Failed to load activity: ${err2.message}`);
4800
+ } catch (err) {
4801
+ print.error(`Failed to load activity: ${err.message}`);
4802
4802
  }
4803
4803
  });
4804
4804
  projectCmd.command("notifications").description("Show membership change notifications").action(async () => {
@@ -4823,8 +4823,8 @@ ${COLORS.bold}Notifications${COLORS.reset}
4823
4823
  if (time) print.dim(` ${time}`);
4824
4824
  }
4825
4825
  console.log("");
4826
- } catch (err2) {
4827
- print.error(`Failed to load notifications: ${err2.message}`);
4826
+ } catch (err) {
4827
+ print.error(`Failed to load notifications: ${err.message}`);
4828
4828
  }
4829
4829
  });
4830
4830
  }
@@ -5112,12 +5112,12 @@ ${COLORS.cyan}${COLORS.bold}MCP Connectors${COLORS.reset}
5112
5112
  if (c.description) console.log(` ${COLORS.dim}${c.description}${COLORS.reset}`);
5113
5113
  });
5114
5114
  console.log();
5115
- } catch (err2) {
5116
- if (err2.status === 403) {
5115
+ } catch (err) {
5116
+ if (err.status === 403) {
5117
5117
  print.warning("This feature requires a paid Bootspring plan.");
5118
5118
  print.dim("Upgrade: https://bootspring.com/pricing");
5119
5119
  } else {
5120
- print.error(`Failed to fetch connectors: ${err2.message}`);
5120
+ print.error(`Failed to fetch connectors: ${err.message}`);
5121
5121
  }
5122
5122
  }
5123
5123
  });
@@ -5195,12 +5195,12 @@ ${COLORS.bold}Resources (${resources.length})${COLORS.reset}`);
5195
5195
  print.warning("No tools or resources registered.");
5196
5196
  }
5197
5197
  console.log();
5198
- } catch (err2) {
5199
- if (err2.status === 403) {
5198
+ } catch (err) {
5199
+ if (err.status === 403) {
5200
5200
  print.warning("This feature requires a paid Bootspring plan.");
5201
5201
  print.dim("Upgrade: https://bootspring.com/pricing");
5202
5202
  } else {
5203
- print.error(`Failed to fetch MCP status: ${err2.message}`);
5203
+ print.error(`Failed to fetch MCP status: ${err.message}`);
5204
5204
  }
5205
5205
  }
5206
5206
  }
@@ -5230,12 +5230,12 @@ ${COLORS.cyan}${COLORS.bold}Bootspring MCP Test${COLORS.reset}
5230
5230
  }
5231
5231
  }
5232
5232
  console.log();
5233
- } catch (err2) {
5234
- if (err2.status === 403) {
5233
+ } catch (err) {
5234
+ if (err.status === 403) {
5235
5235
  print.warning("This feature requires a paid Bootspring plan.");
5236
5236
  print.dim("Upgrade: https://bootspring.com/pricing");
5237
5237
  } else {
5238
- print.error(`Connection failed: ${err2.message}`);
5238
+ print.error(`Connection failed: ${err.message}`);
5239
5239
  print.dim("Ensure your API key is valid and the server is reachable.");
5240
5240
  }
5241
5241
  }
@@ -5286,7 +5286,7 @@ ${COLORS.bold}${cat}${COLORS.reset}`);
5286
5286
  });
5287
5287
  }
5288
5288
  console.log();
5289
- } catch (_err) {
5289
+ } catch (err) {
5290
5290
  print.error(`Failed to list agents: ${err.message}`);
5291
5291
  }
5292
5292
  }
@@ -5305,8 +5305,14 @@ ${COLORS.bold}Expertise${COLORS.reset}`);
5305
5305
  agent.expertise.forEach((e) => console.log(` ${COLORS.green}\u25CF${COLORS.reset} ${e}`));
5306
5306
  }
5307
5307
  console.log();
5308
- } catch (_err) {
5309
- print.error(`Agent not found: ${name}`);
5308
+ } catch (err) {
5309
+ if (err.status === 404) {
5310
+ print.error(`Agent not found: ${name}`);
5311
+ } else if (err.status === 403) {
5312
+ print.warning("This feature requires a paid Bootspring plan.");
5313
+ } else {
5314
+ print.error(`Failed to load agent: ${err.message || "Unknown error"}`);
5315
+ }
5310
5316
  }
5311
5317
  }
5312
5318
  async function invokeAgent(name, topic) {
@@ -5324,7 +5330,7 @@ ${COLORS.bold}Agent Context:${COLORS.reset}`);
5324
5330
  console.log(response.context);
5325
5331
  console.log(`${COLORS.dim}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${COLORS.reset}
5326
5332
  `);
5327
- } catch (_err) {
5333
+ } catch (err) {
5328
5334
  print.error(`Failed to invoke agent: ${err.message}`);
5329
5335
  }
5330
5336
  }
@@ -5355,7 +5361,7 @@ ${COLORS.bold}${cat}${COLORS.reset}`);
5355
5361
  });
5356
5362
  }
5357
5363
  console.log();
5358
- } catch (_err) {
5364
+ } catch (err) {
5359
5365
  if (err.status === 403) {
5360
5366
  print.warning("This feature requires a paid Bootspring plan.");
5361
5367
  print.dim("Upgrade: https://bootspring.com/pricing");
@@ -5412,7 +5418,7 @@ ${COLORS.bold}${cat}${COLORS.reset}`);
5412
5418
  });
5413
5419
  }
5414
5420
  console.log();
5415
- } catch (_err) {
5421
+ } catch (err) {
5416
5422
  print.error(`Failed to list skills: ${err.message}`);
5417
5423
  }
5418
5424
  }
@@ -5430,8 +5436,14 @@ ${COLORS.cyan}${COLORS.bold}\u26A1 ${response.name || id}${COLORS.reset}`);
5430
5436
  `);
5431
5437
  console.log(response.content);
5432
5438
  console.log();
5433
- } catch (_err) {
5434
- print.error(`Skill not found: ${id}`);
5439
+ } catch (err) {
5440
+ if (err.status === 404) {
5441
+ print.error(`Skill not found: ${id}`);
5442
+ } else if (err.status === 403) {
5443
+ print.warning("This feature requires a paid Bootspring plan.");
5444
+ } else {
5445
+ print.error(`Failed to load skill: ${err.message || "Unknown error"}`);
5446
+ }
5435
5447
  }
5436
5448
  }
5437
5449
  async function searchSkills(query) {
@@ -5466,7 +5478,7 @@ ${COLORS.bold}${cat}${COLORS.reset}`);
5466
5478
  });
5467
5479
  }
5468
5480
  console.log();
5469
- } catch (_err) {
5481
+ } catch (err) {
5470
5482
  if (err.status === 403) {
5471
5483
  print.warning("This feature requires a paid Bootspring plan.");
5472
5484
  print.dim("Upgrade: https://bootspring.com/pricing");
@@ -5704,8 +5716,8 @@ ${COLORS.bold}Limits & Usage${COLORS.reset}`);
5704
5716
  console.log(`${COLORS.dim}Projects:${COLORS.reset} ${usage.projects} / ${limits.projects}`);
5705
5717
  console.log(`${COLORS.dim}API Calls:${COLORS.reset} ${usage.apiCalls} / ${limits.apiCalls}`);
5706
5718
  console.log();
5707
- } catch (err2) {
5708
- print.error(`Failed to fetch billing status: ${err2.message}`);
5719
+ } catch (err) {
5720
+ print.error(`Failed to fetch billing status: ${err.message}`);
5709
5721
  }
5710
5722
  }
5711
5723
  async function showUsage() {
@@ -5721,8 +5733,8 @@ ${COLORS.bold}Detailed Usage${COLORS.reset}`);
5721
5733
  console.log(`${COLORS.dim}Total Requests:${COLORS.reset} ${usage.totalRequests}`);
5722
5734
  console.log(`${COLORS.dim}Agent Invocations:${COLORS.reset} ${usage.agentInvokes}`);
5723
5735
  console.log();
5724
- } catch (err2) {
5725
- print.error(`Failed to fetch usage: ${err2.message}`);
5736
+ } catch (err) {
5737
+ print.error(`Failed to fetch usage: ${err.message}`);
5726
5738
  }
5727
5739
  }
5728
5740
  async function upgrade() {
@@ -5749,8 +5761,8 @@ async function portal() {
5749
5761
  ${COLORS.bold}Billing Portal:${COLORS.reset}`);
5750
5762
  console.log(` ${COLORS.cyan}${url}${COLORS.reset}
5751
5763
  `);
5752
- } catch (err2) {
5753
- print.error(`Failed to get portal URL: ${err2.message}`);
5764
+ } catch (err) {
5765
+ print.error(`Failed to get portal URL: ${err.message}`);
5754
5766
  }
5755
5767
  }
5756
5768
 
@@ -7631,8 +7643,8 @@ function registerBuildCommand(program3) {
7631
7643
  if (!fs7.existsSync(dir)) fs7.mkdirSync(dir, { recursive: true });
7632
7644
  fs7.writeFileSync(todoFile, todoContent);
7633
7645
  print.success(`Migrated ${tasks.length} tasks to planning/TODO.md`);
7634
- } catch (err2) {
7635
- print.error(`Migration failed: ${err2.message}`);
7646
+ } catch (err) {
7647
+ print.error(`Migration failed: ${err.message}`);
7636
7648
  }
7637
7649
  });
7638
7650
  build.command("backfill").aliases(["recover", "hydrate", "bootstrap"]).description("Recover build artifacts from existing codebase").action(() => {
@@ -7774,7 +7786,7 @@ function registerHealthCommand(program3) {
7774
7786
  checks.push({ name: "MCP Config (global)", status: "fail", message: "~/.claude/settings.json is invalid JSON" });
7775
7787
  }
7776
7788
  } else {
7777
- checks.push({ name: "MCP Config", status: "fail", message: "No MCP config found. Run `bootspring doctor --fix-claude-config`" });
7789
+ checks.push({ name: "MCP Config", status: "warn", message: "No MCP config found. Run `bootspring doctor --fix-claude-config`" });
7778
7790
  }
7779
7791
  try {
7780
7792
  const result = (0, import_child_process2.execSync)(
@@ -7786,13 +7798,13 @@ function registerHealthCommand(program3) {
7786
7798
  if (parsed.result?.serverInfo) {
7787
7799
  checks.push({ name: "MCP Server", status: "pass", message: `${parsed.result.serverInfo.name} v${parsed.result.serverInfo.version}` });
7788
7800
  } else {
7789
- checks.push({ name: "MCP Server", status: "fail", message: "Server responded but no serverInfo" });
7801
+ checks.push({ name: "MCP Server", status: "warn", message: "Server responded but no serverInfo" });
7790
7802
  }
7791
7803
  } else {
7792
- checks.push({ name: "MCP Server", status: "fail", message: "No response from MCP server (stdout may be corrupted)" });
7804
+ checks.push({ name: "MCP Server", status: "warn", message: "No response from MCP server (stdout may be corrupted)" });
7793
7805
  }
7794
7806
  } catch {
7795
- checks.push({ name: "MCP Server", status: "fail", message: "MCP server failed to start. Check `bootspring mcp status`" });
7807
+ checks.push({ name: "MCP Server", status: "warn", message: "MCP server not reachable. Check `bootspring mcp status`" });
7796
7808
  }
7797
7809
  if (auth_exports.isAuthenticated()) {
7798
7810
  checks.push({ name: "Authentication", status: "pass", message: "Logged in" });
@@ -7827,15 +7839,16 @@ function registerHealthCommand(program3) {
7827
7839
  }
7828
7840
  }
7829
7841
  if (!opts.local) {
7842
+ const apiFailLevel = opts.api ? "fail" : "warn";
7830
7843
  try {
7831
7844
  const status = await api_client_exports.healthCheck();
7832
7845
  if (status.connected) {
7833
7846
  checks.push({ name: "API Connection", status: "pass", message: `Connected (v${status.version || "unknown"})` });
7834
7847
  } else {
7835
- checks.push({ name: "API Connection", status: "fail", message: "Cannot connect" });
7848
+ checks.push({ name: "API Connection", status: apiFailLevel, message: "Cannot connect" });
7836
7849
  }
7837
7850
  } catch {
7838
- checks.push({ name: "API Connection", status: "fail", message: "Connection failed" });
7851
+ checks.push({ name: "API Connection", status: apiFailLevel, message: "Connection failed" });
7839
7852
  }
7840
7853
  }
7841
7854
  let passCount = 0;
@@ -9297,8 +9310,8 @@ function runCheck(check) {
9297
9310
  });
9298
9311
  return { passed: true, output };
9299
9312
  } catch (error) {
9300
- const err2 = error;
9301
- return { passed: false, output: err2.stdout || err2.stderr || "Check failed" };
9313
+ const err = error;
9314
+ return { passed: false, output: err.stdout || err.stderr || "Check failed" };
9302
9315
  }
9303
9316
  }
9304
9317
  function runGate(gateId, opts) {
@@ -9694,10 +9707,10 @@ function runCheck2(name, fn) {
9694
9707
  const result = fn();
9695
9708
  return { name, result };
9696
9709
  } catch (error) {
9697
- const err2 = error;
9710
+ const err = error;
9698
9711
  return {
9699
9712
  name,
9700
- result: { status: "fail", detail: `Error: ${err2.message}` }
9713
+ result: { status: "fail", detail: `Error: ${err.message}` }
9701
9714
  };
9702
9715
  }
9703
9716
  }
@@ -11865,13 +11878,13 @@ function registerOrgCommand(program3) {
11865
11878
  if (o.memberCount != null) print.dim(` Members: ${o.memberCount}`);
11866
11879
  }
11867
11880
  console.log("");
11868
- } catch (err2) {
11881
+ } catch (err) {
11869
11882
  spinner.stop();
11870
- if (err2.status === 403) {
11883
+ if (err.status === 403) {
11871
11884
  print.warning("This feature requires a paid plan.");
11872
11885
  print.dim("Upgrade: https://bootspring.com/pricing");
11873
11886
  } else {
11874
- print.error(`Failed: ${err2.message}`);
11887
+ print.error(`Failed: ${err.message}`);
11875
11888
  }
11876
11889
  }
11877
11890
  });
@@ -11899,13 +11912,13 @@ function registerOrgCommand(program3) {
11899
11912
  if (o.policy?.profile) console.log(` Policy: ${getProfileBadge(o.policy.profile)}`);
11900
11913
  if (o.owner) console.log(` Owner: ${o.owner.email || o.owner.name || o.owner.id}`);
11901
11914
  console.log("");
11902
- } catch (err2) {
11915
+ } catch (err) {
11903
11916
  spinner.stop();
11904
- if (err2.status === 403) {
11917
+ if (err.status === 403) {
11905
11918
  print.warning("This feature requires a paid plan.");
11906
11919
  print.dim("Upgrade: https://bootspring.com/pricing");
11907
11920
  } else {
11908
- print.error(`Failed: ${err2.message}`);
11921
+ print.error(`Failed: ${err.message}`);
11909
11922
  }
11910
11923
  }
11911
11924
  });
@@ -11948,13 +11961,13 @@ function registerOrgCommand(program3) {
11948
11961
  }
11949
11962
  console.log("");
11950
11963
  }
11951
- } catch (err2) {
11964
+ } catch (err) {
11952
11965
  spinner.stop();
11953
- if (err2.status === 403) {
11966
+ if (err.status === 403) {
11954
11967
  print.warning("This feature requires a paid plan.");
11955
11968
  print.dim("Upgrade: https://bootspring.com/pricing");
11956
11969
  } else {
11957
- print.error(`Failed: ${err2.message}`);
11970
+ print.error(`Failed: ${err.message}`);
11958
11971
  }
11959
11972
  }
11960
11973
  });
@@ -11979,13 +11992,13 @@ function registerOrgCommand(program3) {
11979
11992
  try {
11980
11993
  await api_client_exports.request("PUT", `/organizations/${resolvedOrgId}/policy`, { profile });
11981
11994
  spinner.succeed(`Policy updated to "${profile}" for ${resolvedOrgId}`);
11982
- } catch (err2) {
11995
+ } catch (err) {
11983
11996
  spinner.stop();
11984
- if (err2.status === 403) {
11997
+ if (err.status === 403) {
11985
11998
  print.warning("This feature requires a paid plan.");
11986
11999
  print.dim("Upgrade: https://bootspring.com/pricing");
11987
12000
  } else {
11988
- print.error(`Failed: ${err2.message}`);
12001
+ print.error(`Failed: ${err.message}`);
11989
12002
  }
11990
12003
  }
11991
12004
  });
@@ -12043,13 +12056,13 @@ function registerOrgCommand(program3) {
12043
12056
  }
12044
12057
  console.log("");
12045
12058
  print.dim(`Total: ${members.length} member${members.length !== 1 ? "s" : ""}`);
12046
- } catch (err2) {
12059
+ } catch (err) {
12047
12060
  spinner.stop();
12048
- if (err2.status === 403) {
12061
+ if (err.status === 403) {
12049
12062
  print.warning("This feature requires a paid plan.");
12050
12063
  print.dim("Upgrade: https://bootspring.com/pricing");
12051
12064
  } else {
12052
- print.error(`Failed: ${err2.message}`);
12065
+ print.error(`Failed: ${err.message}`);
12053
12066
  }
12054
12067
  }
12055
12068
  });
@@ -12080,13 +12093,13 @@ function registerOrgCommand(program3) {
12080
12093
  }
12081
12094
  }
12082
12095
  console.log("");
12083
- } catch (err2) {
12096
+ } catch (err) {
12084
12097
  spinner.stop();
12085
- if (err2.status === 403) {
12098
+ if (err.status === 403) {
12086
12099
  print.warning("This feature requires a paid plan.");
12087
12100
  print.dim("Upgrade: https://bootspring.com/pricing");
12088
12101
  } else {
12089
- print.error(`Failed: ${err2.message}`);
12102
+ print.error(`Failed: ${err.message}`);
12090
12103
  }
12091
12104
  }
12092
12105
  });
@@ -15130,12 +15143,12 @@ ${generateBadges(results)}`);
15130
15143
  history: state.history
15131
15144
  });
15132
15145
  print.success("Metrics synced to remote dashboard.");
15133
- } catch (err2) {
15134
- if (err2.status === 403) {
15146
+ } catch (err) {
15147
+ if (err.status === 403) {
15135
15148
  print.warning("Metrics sync requires a paid Bootspring plan.");
15136
15149
  print.dim("Upgrade: https://bootspring.com/pricing");
15137
15150
  } else {
15138
- print.error(`Sync failed: ${err2.message}`);
15151
+ print.error(`Sync failed: ${err.message}`);
15139
15152
  }
15140
15153
  }
15141
15154
  });
@@ -15358,8 +15371,8 @@ function registerMvpCommand(program3) {
15358
15371
  }
15359
15372
  referenced.push({ source: analysis.path, reason: `Quality: ${analysis.qualityScore}%` });
15360
15373
  }
15361
- } catch (err2) {
15362
- errors.push({ file: path39.relative(cwd, filePath), error: err2.message });
15374
+ } catch (err) {
15375
+ errors.push({ file: path39.relative(cwd, filePath), error: err.message });
15363
15376
  }
15364
15377
  }
15365
15378
  if (imported.length > 0) {
@@ -15386,8 +15399,8 @@ function registerMvpCommand(program3) {
15386
15399
  }
15387
15400
  if (errors.length > 0) {
15388
15401
  console.log(`Errors (${errors.length}):`);
15389
- for (const err2 of errors) {
15390
- print.error(`${err2.file}: ${err2.error}`);
15402
+ for (const err of errors) {
15403
+ print.error(`${err.file}: ${err.error}`);
15391
15404
  }
15392
15405
  console.log("");
15393
15406
  }
@@ -16104,8 +16117,8 @@ function registerLearnCommand(program3) {
16104
16117
  console.log(` Quality Patterns: ${learnings.qualityPatterns.length} patterns`);
16105
16118
  }
16106
16119
  console.log("");
16107
- } catch (err2) {
16108
- spinner.fail(`Failed to learn from organization: ${err2.message}`);
16120
+ } catch (err) {
16121
+ spinner.fail(`Failed to learn from organization: ${err.message}`);
16109
16122
  }
16110
16123
  });
16111
16124
  org.command("recommend").description("Get recommendations for new projects").option("--type <type>", "Project type").option("--features <features>", "Comma-separated features").action(async (opts) => {
@@ -16301,8 +16314,8 @@ function registerLearnCommand(program3) {
16301
16314
  console.log("");
16302
16315
  }
16303
16316
  }
16304
- } catch (err2) {
16305
- spinner.fail(`Analysis failed: ${err2.message}`);
16317
+ } catch (err) {
16318
+ spinner.fail(`Analysis failed: ${err.message}`);
16306
16319
  }
16307
16320
  });
16308
16321
  antipattern.command("list").description("List known anti-patterns").action(async () => {
@@ -16449,8 +16462,8 @@ function registerLearnCommand(program3) {
16449
16462
  console.log(`${COLORS.dim}Sources: ${activeSources.join(", ")}${COLORS.reset}
16450
16463
  `);
16451
16464
  }
16452
- } catch (err2) {
16453
- spinner.fail(`Failed to generate recommendations: ${err2.message}`);
16465
+ } catch (err) {
16466
+ spinner.fail(`Failed to generate recommendations: ${err.message}`);
16454
16467
  }
16455
16468
  });
16456
16469
  recommend.command("quick <question...>").description("Get quick answer to a question").action(async (question) => {
@@ -16500,8 +16513,8 @@ function registerLearnCommand(program3) {
16500
16513
  }
16501
16514
  }
16502
16515
  console.log("");
16503
- } catch (err2) {
16504
- console.log(`${COLORS.red}Failed: ${err2.message}${COLORS.reset}`);
16516
+ } catch (err) {
16517
+ console.log(`${COLORS.red}Failed: ${err.message}${COLORS.reset}`);
16505
16518
  }
16506
16519
  });
16507
16520
  recommend.command("report").description("Generate recommendation report").action(async () => {
@@ -16532,8 +16545,8 @@ function registerLearnCommand(program3) {
16532
16545
  console.log(` - [${rec.type}] ${rec.title} (${rec.confidenceLevel})`);
16533
16546
  }
16534
16547
  console.log("");
16535
- } catch (err2) {
16536
- console.log(`${COLORS.red}Failed to generate report: ${err2.message}${COLORS.reset}`);
16548
+ } catch (err) {
16549
+ console.log(`${COLORS.red}Failed to generate report: ${err.message}${COLORS.reset}`);
16537
16550
  }
16538
16551
  });
16539
16552
  }
@@ -16603,8 +16616,8 @@ function extractLearnings(options = {}) {
16603
16616
  (l) => l.summary.length > 5 && !l.summary.startsWith("Merge ") && !l.summary.startsWith("merge ")
16604
16617
  );
16605
16618
  return { learnings: filtered, total: lines.length };
16606
- } catch (err2) {
16607
- return { learnings: [], total: 0, error: err2.message };
16619
+ } catch (err) {
16620
+ return { learnings: [], total: 0, error: err.message };
16608
16621
  }
16609
16622
  }
16610
16623
  function groupByCategory(learnings) {
@@ -16744,8 +16757,8 @@ function registerMemoryCommand(program3) {
16744
16757
  ... and ${sorted.length - 20} more files`);
16745
16758
  }
16746
16759
  console.log("");
16747
- } catch (err2) {
16748
- print.error(err2.message);
16760
+ } catch (err) {
16761
+ print.error(err.message);
16749
16762
  }
16750
16763
  });
16751
16764
  memory.command("export").description("Export learnings as JSON").option("--limit <n>", "Number of commits", "50").option("--since <date>", "How far back to look", "3 months ago").action((opts) => {
@@ -17252,18 +17265,18 @@ function requireAuth() {
17252
17265
  print.error('Not logged in. Run "bootspring auth login" first.');
17253
17266
  return false;
17254
17267
  }
17255
- function handleApiError(err2, context) {
17256
- if (err2.status === 403) {
17268
+ function handleApiError(err, context) {
17269
+ if (err.status === 403) {
17257
17270
  print.warning("This feature requires a paid Bootspring plan.");
17258
17271
  print.dim("Upgrade: https://bootspring.com/pricing");
17259
17272
  return;
17260
17273
  }
17261
- if (err2.message?.includes("Cannot connect") || err2.code === "ECONNREFUSED") {
17274
+ if (err.message?.includes("Cannot connect") || err.code === "ECONNREFUSED") {
17262
17275
  print.error("Cannot connect to Bootspring API.");
17263
17276
  print.dim("Check your internet connection or try again later.");
17264
17277
  return;
17265
17278
  }
17266
- print.error(`${context}: ${err2.message}`);
17279
+ print.error(`${context}: ${err.message}`);
17267
17280
  }
17268
17281
  function registerOrchestratorCommand(program3) {
17269
17282
  const orchestrator = program3.command("orchestrator").description("Hosted workflow orchestration");
@@ -17288,9 +17301,9 @@ function registerOrchestratorCommand(program3) {
17288
17301
  }
17289
17302
  console.log("");
17290
17303
  }
17291
- } catch (err2) {
17304
+ } catch (err) {
17292
17305
  spinner.fail("Failed to fetch workflows");
17293
- handleApiError(err2, "Failed to list workflows");
17306
+ handleApiError(err, "Failed to list workflows");
17294
17307
  }
17295
17308
  });
17296
17309
  orchestrator.command("workflow [id]").description("Show workflow details").action(async (id) => {
@@ -17324,9 +17337,9 @@ function registerOrchestratorCommand(program3) {
17324
17337
  console.log(` ${workflow.agents.join(", ")}`);
17325
17338
  console.log("");
17326
17339
  }
17327
- } catch (err2) {
17340
+ } catch (err) {
17328
17341
  spinner.fail("Failed to load workflow");
17329
- handleApiError(err2, `Failed to fetch workflow "${id}"`);
17342
+ handleApiError(err, `Failed to fetch workflow "${id}"`);
17330
17343
  }
17331
17344
  });
17332
17345
  orchestrator.command("analyze [task]").description("Analyze project context").action(async (task) => {
@@ -17365,9 +17378,9 @@ function registerOrchestratorCommand(program3) {
17365
17378
  }
17366
17379
  console.log("");
17367
17380
  }
17368
- } catch (err2) {
17381
+ } catch (err) {
17369
17382
  spinner.fail("Analysis failed");
17370
- handleApiError(err2, "Failed to analyze context");
17383
+ handleApiError(err, "Failed to analyze context");
17371
17384
  }
17372
17385
  });
17373
17386
  orchestrator.command("suggest [task]").description("Get hosted suggestions").action(async (task) => {
@@ -17400,9 +17413,9 @@ function registerOrchestratorCommand(program3) {
17400
17413
  console.log(` ${COLORS.cyan}${suggestion.type || "suggestion"}${COLORS.reset} ${COLORS.dim}${JSON.stringify(suggestion)}${COLORS.reset}`);
17401
17414
  }
17402
17415
  console.log("");
17403
- } catch (err2) {
17416
+ } catch (err) {
17404
17417
  spinner.fail("Failed to get suggestions");
17405
- handleApiError(err2, "Failed to get suggestions");
17418
+ handleApiError(err, "Failed to get suggestions");
17406
17419
  }
17407
17420
  });
17408
17421
  orchestrator.command("start <id>").description("Start a hosted workflow").action(async (id) => {
@@ -17427,9 +17440,9 @@ function registerOrchestratorCommand(program3) {
17427
17440
  });
17428
17441
  console.log("");
17429
17442
  }
17430
- } catch (err2) {
17443
+ } catch (err) {
17431
17444
  spinner.fail("Failed to start workflow");
17432
- handleApiError(err2, `Failed to start workflow "${id}"`);
17445
+ handleApiError(err, `Failed to start workflow "${id}"`);
17433
17446
  }
17434
17447
  });
17435
17448
  orchestrator.command("status").description("Show orchestrator access").action(async () => {
@@ -17446,9 +17459,9 @@ function registerOrchestratorCommand(program3) {
17446
17459
  console.log(` ${COLORS.bold}Hosted workflows:${COLORS.reset} ${workflows.length}`);
17447
17460
  console.log(` ${COLORS.bold}Accessible:${COLORS.reset} ${accessible}`);
17448
17461
  console.log("");
17449
- } catch (err2) {
17462
+ } catch (err) {
17450
17463
  spinner.fail("Failed to fetch status");
17451
- handleApiError(err2, "Failed to fetch orchestrator status");
17464
+ handleApiError(err, "Failed to fetch orchestrator status");
17452
17465
  }
17453
17466
  });
17454
17467
  orchestrator.command("next").description("Advance to next workflow step").option("--workflow <id>", "Specify workflow ID (uses active workflow if omitted)").action(async (opts) => {
@@ -17472,9 +17485,9 @@ function registerOrchestratorCommand(program3) {
17472
17485
  spinner.info("No next step available");
17473
17486
  }
17474
17487
  console.log("");
17475
- } catch (err2) {
17488
+ } catch (err) {
17476
17489
  spinner.fail("Failed to advance");
17477
- handleApiError(err2, "Failed to advance workflow");
17490
+ handleApiError(err, "Failed to advance workflow");
17478
17491
  }
17479
17492
  });
17480
17493
  orchestrator.command("checkpoint [workflow] [step]").description("Mark workflow completion signal").option("--message <msg>", "Checkpoint message").action(async (workflow, step, opts) => {
@@ -17491,9 +17504,9 @@ function registerOrchestratorCommand(program3) {
17491
17504
  console.log(` ${COLORS.dim}Progress: ${response.progress}%${COLORS.reset}`);
17492
17505
  }
17493
17506
  console.log("");
17494
- } catch (err2) {
17507
+ } catch (err) {
17495
17508
  spinner.fail("Checkpoint failed");
17496
- handleApiError(err2, "Failed to record checkpoint");
17509
+ handleApiError(err, "Failed to record checkpoint");
17497
17510
  }
17498
17511
  });
17499
17512
  orchestrator.command("agents").description("List available agents").action(async () => {
@@ -17516,9 +17529,9 @@ function registerOrchestratorCommand(program3) {
17516
17529
  }
17517
17530
  console.log("");
17518
17531
  }
17519
- } catch (err2) {
17532
+ } catch (err) {
17520
17533
  spinner.fail("Failed to fetch agents");
17521
- handleApiError(err2, "Failed to list agents");
17534
+ handleApiError(err, "Failed to list agents");
17522
17535
  }
17523
17536
  });
17524
17537
  orchestrator.action(() => {
@@ -18644,8 +18657,8 @@ var FileWatcher = class extends import_events.EventEmitter {
18644
18657
  }
18645
18658
  });
18646
18659
  this.watchers.push(watcher);
18647
- } catch (err2) {
18648
- this.emit("error", { type, error: err2 });
18660
+ } catch (err) {
18661
+ this.emit("error", { type, error: err });
18649
18662
  }
18650
18663
  }
18651
18664
  watchDirectory(dirPath, type) {
@@ -18658,8 +18671,8 @@ var FileWatcher = class extends import_events.EventEmitter {
18658
18671
  }
18659
18672
  });
18660
18673
  this.watchers.push(watcher);
18661
- } catch (err2) {
18662
- this.emit("error", { type, error: err2 });
18674
+ } catch (err) {
18675
+ this.emit("error", { type, error: err });
18663
18676
  }
18664
18677
  }
18665
18678
  debouncedHandle(filePath, type) {
@@ -18703,8 +18716,8 @@ var FileWatcher = class extends import_events.EventEmitter {
18703
18716
  }
18704
18717
  }
18705
18718
  }
18706
- } catch (err2) {
18707
- this.emit("error", { type, filePath, error: err2 });
18719
+ } catch (err) {
18720
+ this.emit("error", { type, filePath, error: err });
18708
18721
  }
18709
18722
  }
18710
18723
  loadTodoState(filePath) {
@@ -18773,8 +18786,8 @@ function registerWatchCommand(program3) {
18773
18786
  console.log(`${COLORS.dim}${parts.join(" | ")}${COLORS.reset}`);
18774
18787
  console.log("");
18775
18788
  });
18776
- watcher.on("error", (err2) => {
18777
- console.log(`${COLORS.red}Error:${COLORS.reset} ${err2.type} - ${err2.error?.message || "Unknown error"}`);
18789
+ watcher.on("error", (err) => {
18790
+ console.log(`${COLORS.red}Error:${COLORS.reset} ${err.type} - ${err.error?.message || "Unknown error"}`);
18778
18791
  });
18779
18792
  watcher.start();
18780
18793
  process.on("SIGINT", () => {
@@ -19187,8 +19200,8 @@ async function scanProjects(dir) {
19187
19200
  found.push({ name: entry.name, path: dirPath });
19188
19201
  }
19189
19202
  }
19190
- } catch (err2) {
19191
- print.error(`Scan failed: ${err2.message}`);
19203
+ } catch (err) {
19204
+ print.error(`Scan failed: ${err.message}`);
19192
19205
  return;
19193
19206
  }
19194
19207
  print.success(`Found ${found.length} project(s)`);
@@ -19246,8 +19259,8 @@ function upsertJsonMcp(name, configPath, assistant) {
19246
19259
  fs53.writeFileSync(configPath, `${JSON.stringify(settings, null, 2)}
19247
19260
  `, "utf-8");
19248
19261
  return { name, path: configPath, status: "updated" };
19249
- } catch (err2) {
19250
- return { name, path: configPath, status: "error", reason: err2.message };
19262
+ } catch (err) {
19263
+ return { name, path: configPath, status: "error", reason: err.message };
19251
19264
  }
19252
19265
  }
19253
19266
  function upsertCodexToml() {
@@ -19269,8 +19282,8 @@ env = { BOOTSPRING_ASSISTANT = "codex" }
19269
19282
  ${block}` : block;
19270
19283
  fs53.writeFileSync(configPath, content, "utf-8");
19271
19284
  return { name: "Codex", path: configPath, status: "updated" };
19272
- } catch (err2) {
19273
- return { name: "Codex", path: configPath, status: "error", reason: err2.message };
19285
+ } catch (err) {
19286
+ return { name: "Codex", path: configPath, status: "error", reason: err.message };
19274
19287
  }
19275
19288
  }
19276
19289
  function printResult(result) {
@@ -19335,8 +19348,8 @@ ${COLORS.cyan}${COLORS.bold}Bootspring Setup Status${COLORS.reset}
19335
19348
  status: settings.mcpServers?.bootspring?.command ? "unchanged" : "error",
19336
19349
  reason: settings.mcpServers?.bootspring?.command ? void 0 : "bootspring entry missing"
19337
19350
  });
19338
- } catch (err2) {
19339
- checks.push({ name: "Claude Code", path: claudePath, status: "error", reason: err2.message });
19351
+ } catch (err) {
19352
+ checks.push({ name: "Claude Code", path: claudePath, status: "error", reason: err.message });
19340
19353
  }
19341
19354
  } else {
19342
19355
  checks.push({ name: "Claude Code", path: claudePath, status: "error", reason: "config missing" });
@@ -19366,8 +19379,8 @@ ${COLORS.cyan}${COLORS.bold}Bootspring Setup Status${COLORS.reset}
19366
19379
  status: settings.mcpServers?.bootspring?.command ? "unchanged" : "error",
19367
19380
  reason: settings.mcpServers?.bootspring?.command ? void 0 : "bootspring entry missing"
19368
19381
  });
19369
- } catch (err2) {
19370
- checks.push({ name: "Gemini CLI", path: geminiPath, status: "error", reason: err2.message });
19382
+ } catch (err) {
19383
+ checks.push({ name: "Gemini CLI", path: geminiPath, status: "error", reason: err.message });
19371
19384
  }
19372
19385
  } else {
19373
19386
  checks.push({ name: "Gemini CLI", path: geminiPath, status: "error", reason: "config missing" });
package/dist/core.js CHANGED
@@ -1600,7 +1600,7 @@ var require_package = __commonJS({
1600
1600
  "package.json"(exports2, module2) {
1601
1601
  module2.exports = {
1602
1602
  name: "@girardmedia/bootspring",
1603
- version: "2.3.2",
1603
+ version: "2.3.4",
1604
1604
  description: "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
1605
1605
  keywords: [
1606
1606
  "ai",
@@ -5278,6 +5278,7 @@ var mcp_config_exports = {};
5278
5278
  __export(mcp_config_exports, {
5279
5279
  PACKAGE_NAME: () => PACKAGE_NAME,
5280
5280
  PROJECT_MCP_FILENAME: () => PROJECT_MCP_FILENAME,
5281
+ ensureClaudeMcpEnabled: () => ensureClaudeMcpEnabled,
5281
5282
  ensureProjectMcpConfig: () => ensureProjectMcpConfig,
5282
5283
  getManagedMcpServerConfig: () => getManagedMcpServerConfig,
5283
5284
  isManagedMcpServerConfig: () => isManagedMcpServerConfig
@@ -5376,7 +5377,49 @@ function ensureProjectMcpConfig(projectRoot = process.cwd(), options = {}) {
5376
5377
  };
5377
5378
  }
5378
5379
  }
5379
- var fs7, path8, PACKAGE_NAME, PROJECT_MCP_FILENAME;
5380
+ function ensureClaudeMcpEnabled(projectRoot = process.cwd()) {
5381
+ const claudeDir = path8.join(projectRoot, CLAUDE_SETTINGS_DIR);
5382
+ const settingsPath = path8.join(claudeDir, CLAUDE_SETTINGS_LOCAL);
5383
+ try {
5384
+ if (!fs7.existsSync(claudeDir)) {
5385
+ fs7.mkdirSync(claudeDir, { recursive: true });
5386
+ }
5387
+ let settings = {};
5388
+ let existed = false;
5389
+ if (fs7.existsSync(settingsPath)) {
5390
+ existed = true;
5391
+ try {
5392
+ settings = JSON.parse(fs7.readFileSync(settingsPath, "utf8"));
5393
+ } catch {
5394
+ settings = {};
5395
+ }
5396
+ }
5397
+ const hasEnableAll = settings.enableAllProjectMcpServers === true;
5398
+ const currentEnabled = Array.isArray(settings.enabledMcpjsonServers) ? settings.enabledMcpjsonServers : [];
5399
+ const hasBootspring = currentEnabled.includes("bootspring");
5400
+ if (hasEnableAll && hasBootspring) {
5401
+ return { status: "unchanged", changed: false, path: settingsPath };
5402
+ }
5403
+ settings.enableAllProjectMcpServers = true;
5404
+ if (!hasBootspring) {
5405
+ settings.enabledMcpjsonServers = [...currentEnabled, "bootspring"];
5406
+ }
5407
+ fs7.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
5408
+ return {
5409
+ status: existed ? "updated" : "created",
5410
+ changed: true,
5411
+ path: settingsPath
5412
+ };
5413
+ } catch (error) {
5414
+ return {
5415
+ status: "error",
5416
+ changed: false,
5417
+ path: settingsPath,
5418
+ error: error instanceof Error ? error : new Error(String(error))
5419
+ };
5420
+ }
5421
+ }
5422
+ var fs7, path8, PACKAGE_NAME, PROJECT_MCP_FILENAME, CLAUDE_SETTINGS_DIR, CLAUDE_SETTINGS_LOCAL;
5380
5423
  var init_mcp_config = __esm({
5381
5424
  "src/core/mcp-config.ts"() {
5382
5425
  "use strict";
@@ -5385,6 +5428,8 @@ var init_mcp_config = __esm({
5385
5428
  path8 = __toESM(require("path"));
5386
5429
  PACKAGE_NAME = "@girardmedia/bootspring";
5387
5430
  PROJECT_MCP_FILENAME = ".mcp.json";
5431
+ CLAUDE_SETTINGS_DIR = ".claude";
5432
+ CLAUDE_SETTINGS_LOCAL = "settings.local.json";
5388
5433
  }
5389
5434
  });
5390
5435
 
@@ -45,7 +45,7 @@ var require_package = __commonJS({
45
45
  "package.json"(exports2, module2) {
46
46
  module2.exports = {
47
47
  name: "@girardmedia/bootspring",
48
- version: "2.3.2",
48
+ version: "2.3.4",
49
49
  description: "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
50
50
  keywords: [
51
51
  "ai",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.3.2",
3
+ "version": "2.3.4",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",