@girardmedia/bootspring 2.3.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7697,6 +7697,8 @@ function registerBuildCommand(program3) {
7697
7697
  init_cjs_shims();
7698
7698
  var fs8 = __toESM(require("fs"), 1);
7699
7699
  var path9 = __toESM(require("path"), 1);
7700
+ var os3 = __toESM(require("os"), 1);
7701
+ var import_child_process2 = require("child_process");
7700
7702
  init_dist();
7701
7703
  init_dist2();
7702
7704
  function registerHealthCommand(program3) {
@@ -7744,6 +7746,85 @@ function registerHealthCommand(program3) {
7744
7746
  } else {
7745
7747
  checks.push({ name: "AI Context", status: "warn", message: "Run `bootspring generate` to create CLAUDE.md" });
7746
7748
  }
7749
+ const homeDir = os3.homedir();
7750
+ const projectMcp = path9.join(cwd, ".mcp.json");
7751
+ const globalSettings = path9.join(homeDir, ".claude", "settings.json");
7752
+ if (fs8.existsSync(projectMcp)) {
7753
+ try {
7754
+ const mcpConfig = JSON.parse(fs8.readFileSync(projectMcp, "utf-8"));
7755
+ if (mcpConfig.mcpServers?.bootspring) {
7756
+ const cmd = mcpConfig.mcpServers.bootspring.command;
7757
+ const args = mcpConfig.mcpServers.bootspring.args || [];
7758
+ checks.push({ name: "MCP Config (project)", status: "pass", message: `${cmd} ${args.join(" ")}` });
7759
+ } else {
7760
+ checks.push({ name: "MCP Config (project)", status: "warn", message: ".mcp.json exists but no bootspring server entry" });
7761
+ }
7762
+ } catch {
7763
+ checks.push({ name: "MCP Config (project)", status: "fail", message: ".mcp.json is invalid JSON" });
7764
+ }
7765
+ } else if (fs8.existsSync(globalSettings)) {
7766
+ try {
7767
+ const settings = JSON.parse(fs8.readFileSync(globalSettings, "utf-8"));
7768
+ if (settings.mcpServers?.bootspring) {
7769
+ checks.push({ name: "MCP Config (global)", status: "pass", message: "Bootspring MCP in ~/.claude/settings.json" });
7770
+ } else {
7771
+ checks.push({ name: "MCP Config", status: "warn", message: "No bootspring MCP server configured. Run `bootspring doctor --fix-claude-config`" });
7772
+ }
7773
+ } catch {
7774
+ checks.push({ name: "MCP Config (global)", status: "fail", message: "~/.claude/settings.json is invalid JSON" });
7775
+ }
7776
+ } else {
7777
+ checks.push({ name: "MCP Config", status: "fail", message: "No MCP config found. Run `bootspring doctor --fix-claude-config`" });
7778
+ }
7779
+ try {
7780
+ const result = (0, import_child_process2.execSync)(
7781
+ `echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"health","version":"1.0.0"}}}' | bootspring mcp 2>/dev/null | head -1`,
7782
+ { timeout: 1e4, encoding: "utf-8" }
7783
+ ).trim();
7784
+ if (result) {
7785
+ const parsed = JSON.parse(result);
7786
+ if (parsed.result?.serverInfo) {
7787
+ checks.push({ name: "MCP Server", status: "pass", message: `${parsed.result.serverInfo.name} v${parsed.result.serverInfo.version}` });
7788
+ } else {
7789
+ checks.push({ name: "MCP Server", status: "fail", message: "Server responded but no serverInfo" });
7790
+ }
7791
+ } else {
7792
+ checks.push({ name: "MCP Server", status: "fail", message: "No response from MCP server (stdout may be corrupted)" });
7793
+ }
7794
+ } catch {
7795
+ checks.push({ name: "MCP Server", status: "fail", message: "MCP server failed to start. Check `bootspring mcp status`" });
7796
+ }
7797
+ if (auth_exports.isAuthenticated()) {
7798
+ checks.push({ name: "Authentication", status: "pass", message: "Logged in" });
7799
+ } else {
7800
+ checks.push({ name: "Authentication", status: "warn", message: "Not logged in. Run `bootspring auth login`" });
7801
+ }
7802
+ const skillFile = path9.join(homeDir, ".claude", "skills", "bootspring", "SKILL.md");
7803
+ const commandsDir = path9.join(homeDir, ".claude", "commands");
7804
+ if (fs8.existsSync(skillFile)) {
7805
+ checks.push({ name: "Bootspring Skill", status: "pass", message: "SKILL.md installed" });
7806
+ } else {
7807
+ checks.push({ name: "Bootspring Skill", status: "warn", message: "Not installed. Run `bootspring doctor setup`" });
7808
+ }
7809
+ if (fs8.existsSync(path9.join(commandsDir, "build.md"))) {
7810
+ checks.push({ name: "Slash Commands", status: "pass", message: "Installed" });
7811
+ } else {
7812
+ checks.push({ name: "Slash Commands", status: "warn", message: "Not installed. Run `bootspring doctor setup`" });
7813
+ }
7814
+ const buildStatePath = path9.join(cwd, "planning", "BUILD_STATE.json");
7815
+ const todoPath = path9.join(cwd, "planning", "TODO.md");
7816
+ if (fs8.existsSync(buildStatePath)) {
7817
+ try {
7818
+ const state = JSON.parse(fs8.readFileSync(buildStatePath, "utf-8"));
7819
+ const total = state.implementationQueue?.length || 0;
7820
+ const done = state.implementationQueue?.filter((t) => t.status === "completed").length || 0;
7821
+ checks.push({ name: "Build State", status: "pass", message: `${done}/${total} tasks complete` });
7822
+ } catch {
7823
+ checks.push({ name: "Build State", status: "warn", message: "BUILD_STATE.json exists but is invalid" });
7824
+ }
7825
+ } else if (fs8.existsSync(todoPath)) {
7826
+ checks.push({ name: "Build Plan", status: "pass", message: "TODO.md present (no BUILD_STATE.json yet)" });
7827
+ }
7747
7828
  }
7748
7829
  if (!opts.local) {
7749
7830
  try {
@@ -7917,9 +7998,9 @@ function registerDashboardCommand(program3) {
7917
7998
  }
7918
7999
  }
7919
8000
  try {
7920
- const { execSync: execSync9 } = await import("child_process");
7921
- const branch = execSync9("git rev-parse --abbrev-ref HEAD", { cwd, encoding: "utf-8" }).trim();
7922
- const commitCount = execSync9("git rev-list --count HEAD", { cwd, encoding: "utf-8" }).trim();
8001
+ const { execSync: execSync10 } = await import("child_process");
8002
+ const branch = execSync10("git rev-parse --abbrev-ref HEAD", { cwd, encoding: "utf-8" }).trim();
8003
+ const commitCount = execSync10("git rev-list --count HEAD", { cwd, encoding: "utf-8" }).trim();
7923
8004
  print.info(`Branch: ${branch} (${commitCount} commits)`);
7924
8005
  } catch {
7925
8006
  print.dim("Git: not available");
@@ -9117,7 +9198,7 @@ function registerDeployCommand(program3) {
9117
9198
 
9118
9199
  // src/commands/quality.ts
9119
9200
  init_cjs_shims();
9120
- var import_child_process2 = require("child_process");
9201
+ var import_child_process3 = require("child_process");
9121
9202
  var fs15 = __toESM(require("fs"), 1);
9122
9203
  var path16 = __toESM(require("path"), 1);
9123
9204
  init_dist();
@@ -9208,7 +9289,7 @@ function resolveCommand(check) {
9208
9289
  function runCheck(check) {
9209
9290
  const command = resolveCommand(check);
9210
9291
  try {
9211
- const output = (0, import_child_process2.execSync)(command, {
9292
+ const output = (0, import_child_process3.execSync)(command, {
9212
9293
  cwd: process.cwd(),
9213
9294
  encoding: "utf-8",
9214
9295
  stdio: ["pipe", "pipe", "pipe"],
@@ -9380,7 +9461,7 @@ function registerQualityCommand(program3) {
9380
9461
 
9381
9462
  // src/commands/security.ts
9382
9463
  init_cjs_shims();
9383
- var import_child_process3 = require("child_process");
9464
+ var import_child_process4 = require("child_process");
9384
9465
  var fs16 = __toESM(require("fs"), 1);
9385
9466
  var path17 = __toESM(require("path"), 1);
9386
9467
  init_dist();
@@ -9443,7 +9524,7 @@ function runDependencyAudit() {
9443
9524
  return summary;
9444
9525
  }
9445
9526
  try {
9446
- const output = (0, import_child_process3.execSync)("npm audit --json 2>/dev/null || true", {
9527
+ const output = (0, import_child_process4.execSync)("npm audit --json 2>/dev/null || true", {
9447
9528
  cwd,
9448
9529
  encoding: "utf-8",
9449
9530
  maxBuffer: 10 * 1024 * 1024
@@ -9604,7 +9685,7 @@ function registerSecurityCommand(program3) {
9604
9685
 
9605
9686
  // src/commands/doctor.ts
9606
9687
  init_cjs_shims();
9607
- var import_child_process4 = require("child_process");
9688
+ var import_child_process5 = require("child_process");
9608
9689
  var fs17 = __toESM(require("fs"), 1);
9609
9690
  var path18 = __toESM(require("path"), 1);
9610
9691
  init_dist();
@@ -9649,7 +9730,7 @@ function checkNodeVersion() {
9649
9730
  }
9650
9731
  function checkNpmVersion() {
9651
9732
  try {
9652
- const version = (0, import_child_process4.execSync)("npm --version", { encoding: "utf-8" }).trim();
9733
+ const version = (0, import_child_process5.execSync)("npm --version", { encoding: "utf-8" }).trim();
9653
9734
  const major = parseInt(version.split(".")[0], 10);
9654
9735
  if (major >= 9) {
9655
9736
  return { status: "pass", detail: `npm ${version}` };
@@ -9669,7 +9750,7 @@ function checkNpmVersion() {
9669
9750
  }
9670
9751
  function checkPnpmVersion() {
9671
9752
  try {
9672
- const version = (0, import_child_process4.execSync)("pnpm --version", { encoding: "utf-8" }).trim();
9753
+ const version = (0, import_child_process5.execSync)("pnpm --version", { encoding: "utf-8" }).trim();
9673
9754
  return { status: "pass", detail: `pnpm ${version}` };
9674
9755
  } catch {
9675
9756
  return {
@@ -9681,7 +9762,7 @@ function checkPnpmVersion() {
9681
9762
  }
9682
9763
  function checkGitInstallation() {
9683
9764
  try {
9684
- const version = (0, import_child_process4.execSync)("git --version", { encoding: "utf-8" }).trim();
9765
+ const version = (0, import_child_process5.execSync)("git --version", { encoding: "utf-8" }).trim();
9685
9766
  return { status: "pass", detail: version };
9686
9767
  } catch {
9687
9768
  return {
@@ -9695,7 +9776,7 @@ function checkGitRepo() {
9695
9776
  const cwd = process.cwd();
9696
9777
  if (fs17.existsSync(path18.join(cwd, ".git"))) {
9697
9778
  try {
9698
- const branch = (0, import_child_process4.execSync)("git branch --show-current", {
9779
+ const branch = (0, import_child_process5.execSync)("git branch --show-current", {
9699
9780
  cwd,
9700
9781
  encoding: "utf-8"
9701
9782
  }).trim();
@@ -9751,7 +9832,7 @@ function checkDependencies() {
9751
9832
  }
9752
9833
  function checkDiskSpace() {
9753
9834
  try {
9754
- const output = (0, import_child_process4.execSync)("df -h . | tail -1", { encoding: "utf-8" }).trim();
9835
+ const output = (0, import_child_process5.execSync)("df -h . | tail -1", { encoding: "utf-8" }).trim();
9755
9836
  const parts = output.split(/\s+/);
9756
9837
  const available = parts[3] || "unknown";
9757
9838
  const usePercent = parts[4] || "unknown";
@@ -9780,7 +9861,7 @@ function checkTypeScript() {
9780
9861
  return { status: "warn", detail: "No tsconfig.json found (not a TypeScript project)" };
9781
9862
  }
9782
9863
  try {
9783
- const version = (0, import_child_process4.execSync)("npx tsc --version", {
9864
+ const version = (0, import_child_process5.execSync)("npx tsc --version", {
9784
9865
  cwd,
9785
9866
  encoding: "utf-8",
9786
9867
  timeout: 1e4
@@ -11494,7 +11575,7 @@ function registerDocsCommand(program3) {
11494
11575
  init_cjs_shims();
11495
11576
  var fs25 = __toESM(require("fs"), 1);
11496
11577
  var path26 = __toESM(require("path"), 1);
11497
- var import_child_process5 = require("child_process");
11578
+ var import_child_process6 = require("child_process");
11498
11579
  init_dist();
11499
11580
  var WORKSPACE_DIR = ".bootspring-workspace";
11500
11581
  var WORKSPACE_FILE = "workspace.json";
@@ -11698,7 +11779,7 @@ function registerWorkspaceCommand(program3) {
11698
11779
  for (const project of projects) {
11699
11780
  const spinner = createSpinner(`${project.name}...`).start();
11700
11781
  try {
11701
- (0, import_child_process5.execSync)(`bootspring ${workflowName}`, {
11782
+ (0, import_child_process6.execSync)(`bootspring ${workflowName}`, {
11702
11783
  cwd: project.absolutePath,
11703
11784
  encoding: "utf-8",
11704
11785
  timeout: parseInt(opts.timeout, 10),
@@ -12018,7 +12099,7 @@ function registerOrgCommand(program3) {
12018
12099
  init_cjs_shims();
12019
12100
  var fs26 = __toESM(require("fs"), 1);
12020
12101
  var path27 = __toESM(require("path"), 1);
12021
- var import_child_process6 = require("child_process");
12102
+ var import_child_process7 = require("child_process");
12022
12103
  init_dist();
12023
12104
  var MONITORING_PROVIDERS = {
12024
12105
  sentry: {
@@ -12126,7 +12207,7 @@ function collectMetrics(projectRoot) {
12126
12207
  const dirPath = path27.join(projectRoot, dir);
12127
12208
  if (fs26.existsSync(dirPath)) {
12128
12209
  try {
12129
- const output = (0, import_child_process6.execSync)(`du -sk "${dirPath}"`, {
12210
+ const output = (0, import_child_process7.execSync)(`du -sk "${dirPath}"`, {
12130
12211
  cwd: projectRoot,
12131
12212
  encoding: "utf-8",
12132
12213
  stdio: ["pipe", "pipe", "pipe"]
@@ -14349,7 +14430,7 @@ Generated: ${(/* @__PURE__ */ new Date()).toISOString()}`);
14349
14430
  init_cjs_shims();
14350
14431
  var fs35 = __toESM(require("fs"), 1);
14351
14432
  var path36 = __toESM(require("path"), 1);
14352
- var import_child_process7 = require("child_process");
14433
+ var import_child_process8 = require("child_process");
14353
14434
  init_dist();
14354
14435
  function getConnectionPath() {
14355
14436
  return path36.join(process.cwd(), ".bootspring", "github.json");
@@ -14375,7 +14456,7 @@ function saveConnection(conn) {
14375
14456
  }
14376
14457
  function isGhInstalled() {
14377
14458
  try {
14378
- (0, import_child_process7.execSync)("gh --version", { stdio: "pipe" });
14459
+ (0, import_child_process8.execSync)("gh --version", { stdio: "pipe" });
14379
14460
  return true;
14380
14461
  } catch {
14381
14462
  return false;
@@ -14383,7 +14464,7 @@ function isGhInstalled() {
14383
14464
  }
14384
14465
  function isGhAuthenticated() {
14385
14466
  try {
14386
- (0, import_child_process7.execSync)("gh auth status", { stdio: "pipe" });
14467
+ (0, import_child_process8.execSync)("gh auth status", { stdio: "pipe" });
14387
14468
  return true;
14388
14469
  } catch {
14389
14470
  return false;
@@ -14391,7 +14472,7 @@ function isGhAuthenticated() {
14391
14472
  }
14392
14473
  function detectRepoFromGit() {
14393
14474
  try {
14394
- const remote = (0, import_child_process7.execSync)("git remote get-url origin", { stdio: "pipe" }).toString().trim();
14475
+ const remote = (0, import_child_process8.execSync)("git remote get-url origin", { stdio: "pipe" }).toString().trim();
14395
14476
  const httpsMatch = remote.match(/github\.com\/([^/]+)\/([^/.]+)/);
14396
14477
  const sshMatch = remote.match(/github\.com:([^/]+)\/([^/.]+)/);
14397
14478
  const match = httpsMatch || sshMatch;
@@ -14408,7 +14489,7 @@ function detectRepoFromGit() {
14408
14489
  }
14409
14490
  function getRecentCommits(limit = 5) {
14410
14491
  try {
14411
- const log = (0, import_child_process7.execSync)(
14492
+ const log = (0, import_child_process8.execSync)(
14412
14493
  `git log --oneline --format="%H|%s|%an|%ai" -${limit}`,
14413
14494
  { stdio: "pipe" }
14414
14495
  ).toString().trim();
@@ -16459,7 +16540,7 @@ function registerLearnCommand(program3) {
16459
16540
 
16460
16541
  // src/commands/memory.ts
16461
16542
  init_cjs_shims();
16462
- var import_child_process8 = require("child_process");
16543
+ var import_child_process9 = require("child_process");
16463
16544
  init_dist();
16464
16545
  var MEMORY_CATEGORIES = {
16465
16546
  bugfix: { icon: "\u{1F41B}", label: "Bug Fixes", patterns: [/^fix/i, /^bugfix/i, /\bfix\b/i] },
@@ -16475,7 +16556,7 @@ var MEMORY_CATEGORIES = {
16475
16556
  };
16476
16557
  function isGitRepo() {
16477
16558
  try {
16478
- (0, import_child_process8.execSync)("git rev-parse --is-inside-work-tree", { encoding: "utf-8", stdio: "pipe" });
16559
+ (0, import_child_process9.execSync)("git rev-parse --is-inside-work-tree", { encoding: "utf-8", stdio: "pipe" });
16479
16560
  return true;
16480
16561
  } catch {
16481
16562
  return false;
@@ -16499,9 +16580,8 @@ function extractLearnings(options = {}) {
16499
16580
  return { learnings: [], total: 0, error: "Not a git repository" };
16500
16581
  }
16501
16582
  try {
16502
- const format = "--format=%H|%s|%ai";
16503
16583
  const sinceFlag = since ? `--since="${since}"` : "";
16504
- const output = (0, import_child_process8.execSync)(`git log ${format} ${sinceFlag} -n ${limit}`, {
16584
+ const output = (0, import_child_process9.execSync)(`git log --format='%H|%s|%ai' ${sinceFlag} -n ${limit}`, {
16505
16585
  encoding: "utf-8",
16506
16586
  stdio: ["pipe", "pipe", "pipe"]
16507
16587
  }).trim();
@@ -16540,15 +16620,15 @@ function groupByCategory(learnings) {
16540
16620
  function getRepoStats() {
16541
16621
  if (!isGitRepo()) return null;
16542
16622
  try {
16543
- const totalOutput = (0, import_child_process8.execSync)("git rev-list --count HEAD", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16623
+ const totalOutput = (0, import_child_process9.execSync)("git rev-list --count HEAD", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16544
16624
  const totalCommits = parseInt(totalOutput, 10) || 0;
16545
- const contributorsOutput = (0, import_child_process8.execSync)("git shortlog -sn --all", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16625
+ const contributorsOutput = (0, import_child_process9.execSync)("git shortlog -sn --all", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16546
16626
  const contributors = contributorsOutput.split("\n").filter(Boolean).length;
16547
- const weeklyOutput = (0, import_child_process8.execSync)('git rev-list --count --since="1 week ago" HEAD', { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16627
+ const weeklyOutput = (0, import_child_process9.execSync)('git rev-list --count --since="1 week ago" HEAD', { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16548
16628
  const weeklyPace = parseInt(weeklyOutput, 10) || 0;
16549
16629
  let firstCommit;
16550
16630
  try {
16551
- firstCommit = (0, import_child_process8.execSync)("git log --reverse --format=%ai | head -1", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16631
+ firstCommit = (0, import_child_process9.execSync)("git log --reverse --format=%ai | head -1", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
16552
16632
  } catch {
16553
16633
  }
16554
16634
  return { totalCommits, contributors, weeklyPace, firstCommit };
@@ -16647,7 +16727,7 @@ function registerMemoryCommand(program3) {
16647
16727
  }
16648
16728
  try {
16649
16729
  const limit = parseInt(opts.limit, 10) || 50;
16650
- const output = (0, import_child_process8.execSync)(`git log --name-only --format="" -n ${limit}`, {
16730
+ const output = (0, import_child_process9.execSync)(`git log --name-only --format="" -n ${limit}`, {
16651
16731
  encoding: "utf-8",
16652
16732
  stdio: ["pipe", "pipe", "pipe"]
16653
16733
  }).trim();
@@ -17619,7 +17699,7 @@ function registerPreseedFromCodebaseCommand(program3) {
17619
17699
  init_cjs_shims();
17620
17700
  var fs45 = __toESM(require("fs"), 1);
17621
17701
  var path46 = __toESM(require("path"), 1);
17622
- var os3 = __toESM(require("os"), 1);
17702
+ var os4 = __toESM(require("os"), 1);
17623
17703
  init_dist();
17624
17704
  function detectEnvironment() {
17625
17705
  return {
@@ -17627,7 +17707,7 @@ function detectEnvironment() {
17627
17707
  isVSCode: !!process.env["VSCODE_PID"] || (process.env["TERM_PROGRAM"] || "").includes("vscode"),
17628
17708
  isCursor: !!process.env["CURSOR_TRACE_ID"],
17629
17709
  isInteractive: !!(process.stdin.isTTY && process.stdout.isTTY),
17630
- platform: os3.platform()
17710
+ platform: os4.platform()
17631
17711
  };
17632
17712
  }
17633
17713
  function detectProjectContext(projectRoot) {
@@ -18083,7 +18163,7 @@ function registerTaskCommand(program3) {
18083
18163
 
18084
18164
  // src/commands/update.ts
18085
18165
  init_cjs_shims();
18086
- var import_child_process9 = require("child_process");
18166
+ var import_child_process10 = require("child_process");
18087
18167
  var fs47 = __toESM(require("fs"), 1);
18088
18168
  var path48 = __toESM(require("path"), 1);
18089
18169
  init_dist();
@@ -18101,7 +18181,7 @@ function getCurrentVersion() {
18101
18181
  }
18102
18182
  function getLatestVersion() {
18103
18183
  try {
18104
- const result = (0, import_child_process9.execSync)(`npm view ${PACKAGE_NAME} version 2>/dev/null`, {
18184
+ const result = (0, import_child_process10.execSync)(`npm view ${PACKAGE_NAME} version 2>/dev/null`, {
18105
18185
  encoding: "utf-8",
18106
18186
  timeout: 1e4,
18107
18187
  stdio: ["pipe", "pipe", "pipe"]
@@ -18124,7 +18204,7 @@ function compareVersions(a, b) {
18124
18204
  }
18125
18205
  function getInstallContext() {
18126
18206
  try {
18127
- const globalPrefix = (0, import_child_process9.execSync)("npm config get prefix", {
18207
+ const globalPrefix = (0, import_child_process10.execSync)("npm config get prefix", {
18128
18208
  encoding: "utf-8",
18129
18209
  stdio: ["pipe", "pipe", "pipe"]
18130
18210
  }).trim();
@@ -18178,7 +18258,7 @@ function registerUpdateCommand(program3) {
18178
18258
  const spinner = createSpinner(`Updating ${target}`).start();
18179
18259
  try {
18180
18260
  const cmd = context.mode === "global" ? `npm install -g ${PACKAGE_NAME}@latest` : `npm install ${PACKAGE_NAME}@latest`;
18181
- (0, import_child_process9.execSync)(cmd, {
18261
+ (0, import_child_process10.execSync)(cmd, {
18182
18262
  encoding: "utf-8",
18183
18263
  stdio: ["pipe", "pipe", "pipe"],
18184
18264
  timeout: 6e4
@@ -18961,7 +19041,7 @@ async function showTypes() {
18961
19041
  init_cjs_shims();
18962
19042
  var fs51 = __toESM(require("fs"), 1);
18963
19043
  var path53 = __toESM(require("path"), 1);
18964
- var os4 = __toESM(require("os"), 1);
19044
+ var os5 = __toESM(require("os"), 1);
18965
19045
  init_dist();
18966
19046
  init_dist2();
18967
19047
  function registerManagerCommand(program3) {
@@ -18999,7 +19079,7 @@ function getKnownProjects() {
18999
19079
  }
19000
19080
  } catch {
19001
19081
  }
19002
- const workspaceFile = path53.join(os4.homedir(), ".bootspring", "workspace.json");
19082
+ const workspaceFile = path53.join(os5.homedir(), ".bootspring", "workspace.json");
19003
19083
  if (fs51.existsSync(workspaceFile)) {
19004
19084
  try {
19005
19085
  const workspace = JSON.parse(fs51.readFileSync(workspaceFile, "utf-8"));
@@ -19126,10 +19206,10 @@ async function scanProjects(dir) {
19126
19206
  // src/commands/setup.ts
19127
19207
  init_cjs_shims();
19128
19208
  var fs53 = __toESM(require("fs"), 1);
19129
- var os5 = __toESM(require("os"), 1);
19209
+ var os6 = __toESM(require("os"), 1);
19130
19210
  var path54 = __toESM(require("path"), 1);
19131
19211
  init_dist();
19132
- var HOME = os5.homedir();
19212
+ var HOME = os6.homedir();
19133
19213
  function registerSetupCommand(program3) {
19134
19214
  const setup = program3.command("setup").description("Configure MCP for Claude Code, Codex, and Gemini CLI");
19135
19215
  setup.command("assistants").description("Install MCP entries for all supported assistants (default)").action(async () => {
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.1",
1603
+ version: "2.3.2",
1604
1604
  description: "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
1605
1605
  keywords: [
1606
1606
  "ai",
@@ -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.1",
48
+ version: "2.3.2",
49
49
  description: "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
50
50
  keywords: [
51
51
  "ai",
@@ -2220,7 +2220,10 @@ async function resolveTools() {
2220
2220
  }
2221
2221
  try {
2222
2222
  const response = await api.listMcpTools();
2223
- return Array.isArray(response) ? response : response.tools || FALLBACK_TOOLS;
2223
+ const apiTools = Array.isArray(response) ? response : response.tools || [];
2224
+ const apiNames = new Set(apiTools.map((t) => t.name));
2225
+ const missing = FALLBACK_TOOLS.filter((t) => !apiNames.has(t.name));
2226
+ return [...apiTools, ...missing];
2224
2227
  } catch {
2225
2228
  return FALLBACK_TOOLS;
2226
2229
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",