@girardmedia/bootspring 2.5.10 → 2.6.0

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.
@@ -33,9 +33,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
33
33
  ));
34
34
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
35
 
36
- // ../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js
36
+ // ../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js
37
37
  var init_cjs_shims = __esm({
38
- "../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js"() {
38
+ "../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js"() {
39
39
  "use strict";
40
40
  }
41
41
  });
@@ -31156,6 +31156,13 @@ ${COLORS.bold}${msg}${COLORS.reset}`);
31156
31156
  console.log(`${indent}- ${formatListItem(item)}`);
31157
31157
  }
31158
31158
  };
31159
+ printImpl.apiError = (prefix, err) => {
31160
+ if (err && typeof err === "object" && err.authHandled) {
31161
+ return;
31162
+ }
31163
+ const message = err instanceof Error ? err.message : String(err);
31164
+ console.log(`${COLORS.red}\u2717${COLORS.reset} ${prefix}: ${message}`);
31165
+ };
31159
31166
  print = printImpl;
31160
31167
  }
31161
31168
  });
@@ -31370,7 +31377,7 @@ var init_release = __esm({
31370
31377
  "../../packages/shared/src/release.ts"() {
31371
31378
  "use strict";
31372
31379
  init_cjs_shims();
31373
- BOOTSPRING_VERSION = "2.5.10";
31380
+ BOOTSPRING_VERSION = "2.6.0";
31374
31381
  BOOTSPRING_PACKAGE_NAME = "@girardmedia/bootspring";
31375
31382
  }
31376
31383
  });
@@ -47594,7 +47601,7 @@ var require_dist2 = __commonJS({
47594
47601
  ));
47595
47602
  var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
47596
47603
  var init_cjs_shims2 = __esm2({
47597
- "../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js"() {
47604
+ "../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js"() {
47598
47605
  "use strict";
47599
47606
  }
47600
47607
  });
@@ -48932,6 +48939,7 @@ var require_dist2 = __commonJS({
48932
48939
  presence: () => presence_exports,
48933
48940
  readNearestProjectConfig: () => readNearestProjectConfig,
48934
48941
  refreshSession: () => refreshSession,
48942
+ registerMcpForAssistant: () => registerMcpForAssistant,
48935
48943
  remoteLogout: () => remoteLogout,
48936
48944
  request: () => request,
48937
48945
  resolvePolicyProfile: () => resolvePolicyProfile,
@@ -49151,6 +49159,7 @@ var require_dist2 = __commonJS({
49151
49159
  if (reauthOk) {
49152
49160
  return rawRequest(method, path10, data, { ...options, _authRetried: true, noCache: true });
49153
49161
  }
49162
+ err.authHandled = true;
49154
49163
  }
49155
49164
  throw err;
49156
49165
  }
@@ -49380,6 +49389,7 @@ var require_dist2 = __commonJS({
49380
49389
  var self_heal_exports = {};
49381
49390
  __export2(self_heal_exports, {
49382
49391
  classifyError: () => classifyError,
49392
+ registerMcpForAssistant: () => registerMcpForAssistant,
49383
49393
  runDiagnostics: () => runDiagnostics,
49384
49394
  tryHeal: () => tryHeal
49385
49395
  });
@@ -49627,6 +49637,30 @@ var require_dist2 = __commonJS({
49627
49637
  } else {
49628
49638
  results.push({ id: "deps", status: "ok", message: "Dependencies installed." });
49629
49639
  }
49640
+ const lockPath = import_path3.default.join(cwd, "package-lock.json");
49641
+ const pnpmLock = import_path3.default.join(cwd, "pnpm-lock.yaml");
49642
+ const nmPath = import_path3.default.join(cwd, "node_modules");
49643
+ const lockFile = import_fs3.default.existsSync(pnpmLock) ? pnpmLock : import_fs3.default.existsSync(lockPath) ? lockPath : null;
49644
+ if (lockFile && import_fs3.default.existsSync(nmPath)) {
49645
+ try {
49646
+ const lockMtime = import_fs3.default.statSync(lockFile).mtimeMs;
49647
+ const nmMtime = import_fs3.default.statSync(nmPath).mtimeMs;
49648
+ if (lockMtime > nmMtime) {
49649
+ const installCmd = lockFile.endsWith(".yaml") ? "pnpm install" : "npm install";
49650
+ if (autoFix) {
49651
+ try {
49652
+ (0, import_child_process.execSync)(installCmd, { cwd, timeout: 12e4, stdio: "pipe" });
49653
+ results.push({ id: "deps-stale", status: "healed", message: `Lockfile newer than node_modules \u2014 ran ${installCmd}.` });
49654
+ } catch {
49655
+ results.push({ id: "deps-stale", status: "action-needed", message: "Lockfile newer than node_modules.", fix: installCmd });
49656
+ }
49657
+ } else {
49658
+ results.push({ id: "deps-stale", status: "action-needed", message: "Lockfile newer than node_modules \u2014 dependencies may be stale.", fix: `${installCmd}` });
49659
+ }
49660
+ }
49661
+ } catch {
49662
+ }
49663
+ }
49630
49664
  const mcpTargets = {
49631
49665
  claude: import_path3.default.join(homeDir, ".claude.json"),
49632
49666
  codex: import_path3.default.join(homeDir, ".codex", "config.toml"),
@@ -49677,7 +49711,9 @@ var require_dist2 = __commonJS({
49677
49711
  if (autoFix) {
49678
49712
  const backup = buildStatePath + ".bak";
49679
49713
  import_fs3.default.copyFileSync(buildStatePath, backup);
49680
- results.push({ id: "build-state", status: "action-needed", message: "BUILD_STATE.json has invalid structure.", fix: "bootspring build start" });
49714
+ state.implementationQueue = state.implementationQueue || [];
49715
+ import_fs3.default.writeFileSync(buildStatePath, JSON.stringify(state, null, 2));
49716
+ results.push({ id: "build-state", status: "healed", message: `BUILD_STATE.json repaired (backed up to ${import_path3.default.basename(backup)}).` });
49681
49717
  } else {
49682
49718
  results.push({ id: "build-state", status: "action-needed", message: "BUILD_STATE.json has invalid structure.", fix: "bootspring doctor --fix" });
49683
49719
  }
@@ -49773,6 +49809,29 @@ ${block}` : block;
49773
49809
  return false;
49774
49810
  }
49775
49811
  }
49812
+ var MCP_PATHS = {
49813
+ claude: () => import_path3.default.join(import_os2.default.homedir(), ".claude.json"),
49814
+ cursor: () => import_path3.default.join(import_os2.default.homedir(), ".cursor", "mcp.json"),
49815
+ codex: () => import_path3.default.join(import_os2.default.homedir(), ".codex", "config.toml"),
49816
+ gemini: () => import_path3.default.join(import_os2.default.homedir(), ".gemini", "settings.json")
49817
+ };
49818
+ function registerMcpForAssistant(target) {
49819
+ const configPath = MCP_PATHS[target]();
49820
+ let success = false;
49821
+ switch (target) {
49822
+ case "claude":
49823
+ case "cursor":
49824
+ success = writeClaudeMcp(configPath);
49825
+ break;
49826
+ case "codex":
49827
+ success = writeCodexMcp(configPath);
49828
+ break;
49829
+ case "gemini":
49830
+ success = writeGeminiMcp(configPath);
49831
+ break;
49832
+ }
49833
+ return { success, path: configPath };
49834
+ }
49776
49835
  var presence_exports = {};
49777
49836
  __export2(presence_exports, {
49778
49837
  maybeAutoUploadTelemetry: () => maybeAutoUploadTelemetry,
@@ -52219,7 +52278,7 @@ var require_package = __commonJS({
52219
52278
  "../../../package.json"(exports2, module2) {
52220
52279
  module2.exports = {
52221
52280
  name: "bootspring-workspace",
52222
- version: "2.5.10",
52281
+ version: "2.6.0",
52223
52282
  private: true,
52224
52283
  description: "Workspace tooling for the Bootspring monorepo",
52225
52284
  keywords: [
@@ -52249,9 +52308,12 @@ var require_package = __commonJS({
52249
52308
  mcp: "node monorepo/apps/cli/dist/mcp-server.js",
52250
52309
  "version:sync": "node scripts/sync-version-metadata.js",
52251
52310
  "verify:version-sync": "node scripts/sync-version-metadata.js --check",
52252
- "release:prepare": "npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:thin-client-contract && npm run verify:mcp-contract && npm run verify:monorepo-assets && npm run verify:release-gates",
52311
+ "release:prepare": "npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:thin-client-contract && npm run verify:mcp-contract && npm run verify:monorepo-assets && npm run verify:release-gates && npm run smoke:publish",
52312
+ "release:dry-run": "npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:thin-client-contract && npm run verify:mcp-contract && npm run verify:monorepo-assets && npm run verify:release-gates && npm run smoke:publish && echo '\\n--- DRY RUN COMPLETE (no publish) ---'",
52313
+ "smoke:publish": "node scripts/smoke-publish.js",
52253
52314
  pretest: "npm run build",
52254
52315
  test: "vitest run",
52316
+ "test:e2e": "vitest run --config vitest.e2e.config.ts",
52255
52317
  "test:launch-smoke": "vitest run __tests__/unit/cli-first-run-smoke.test.js __tests__/unit/health-fresh-start.test.ts __tests__/unit/session-project-scope.test.ts __tests__/unit/auth-cli-mixed-states.test.ts __tests__/unit/api-client-project-auth-fallback.test.js __tests__/unit/cli-help-surface.test.js __tests__/unit/cli-command-manifest.test.js",
52256
52318
  "test:seed-ingestion": "vitest run __tests__/unit/seed-ingestion-regression.test.js",
52257
52319
  "test:watch": "vitest",
@@ -52276,7 +52338,10 @@ var require_package = __commonJS({
52276
52338
  "server:bundle:configure-shared-billing-gh": "bash monorepo/apps/server/compat-runtime/scripts/configure-shared-billing-smoke-gh.sh",
52277
52339
  "build:cli": "npm --prefix monorepo/apps/cli run build",
52278
52340
  "build:watch": "npm --prefix monorepo/apps/cli run dev",
52279
- dev: "npm --prefix monorepo/apps/cli run dev",
52341
+ dev: "cd monorepo && pnpm turbo dev --filter=@girardmedia/bootspring --filter=@bootspring/server --concurrency=10",
52342
+ "dev:cli": "npm --prefix monorepo/apps/cli run dev",
52343
+ "dev:server": "npm --prefix monorepo/apps/server run dev",
52344
+ "dev:test": "vitest",
52280
52345
  "verify:lint-budget": "node scripts/check-lint-budgets.js",
52281
52346
  "verify:release-gates": "node scripts/release-gate-check.js",
52282
52347
  "verify:shared-contracts": "node scripts/verify-shared-contracts.js",
@@ -52680,8 +52745,58 @@ async function executeLocalBuild(args) {
52680
52745
  hint: "Create planning/TODO.md with tasks, then use action=sync to load them"
52681
52746
  }, null, 2) }] };
52682
52747
  }
52748
+ case "scan": {
52749
+ if (!state) {
52750
+ return { content: [{ type: "text", text: JSON.stringify({ error: "No build state found", hint: "Use action=init or action=sync first" }, null, 2) }] };
52751
+ }
52752
+ const { execSync } = require("child_process");
52753
+ const projectRoot = getProjectRoot();
52754
+ let gitLog;
52755
+ try {
52756
+ const since = state.loopSession?.startedAt;
52757
+ const sinceArg = since ? ` --since="${since}"` : " -100";
52758
+ gitLog = execSync(`git log --oneline${sinceArg}`, { cwd: projectRoot, encoding: "utf-8", timeout: 1e4 }).trim();
52759
+ } catch {
52760
+ return { content: [{ type: "text", text: JSON.stringify({ error: "Failed to read git log \u2014 not a git repo or git not available" }, null, 2) }] };
52761
+ }
52762
+ if (!gitLog) {
52763
+ return { content: [{ type: "text", text: JSON.stringify({ scanned: 0, marked: 0, message: "No commits found to scan" }, null, 2) }] };
52764
+ }
52765
+ const lines = gitLog.split("\n").filter(Boolean);
52766
+ const bsIdPattern = /\bbs-(\d+)\b/gi;
52767
+ const foundIds = /* @__PURE__ */ new Set();
52768
+ for (const line of lines) {
52769
+ for (const match of line.matchAll(bsIdPattern)) {
52770
+ foundIds.add(`bs-${match[1]}`);
52771
+ }
52772
+ }
52773
+ const queue = state.implementationQueue || [];
52774
+ const marked = [];
52775
+ for (const id of foundIds) {
52776
+ const task = queue.find((t) => t.id === id && (t.status === "pending" || t.status === "in_progress"));
52777
+ if (task) {
52778
+ task.status = "completed";
52779
+ task.completedAt = (/* @__PURE__ */ new Date()).toISOString();
52780
+ task.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
52781
+ task.completedBy = "commit-back-scan";
52782
+ marked.push(id);
52783
+ }
52784
+ }
52785
+ if (marked.length > 0) {
52786
+ saveBuildState(state);
52787
+ }
52788
+ const stats = buildGetStats(state);
52789
+ return { content: [{ type: "text", text: JSON.stringify({
52790
+ scanned: lines.length,
52791
+ bsIdsFound: foundIds.size,
52792
+ marked: marked.length,
52793
+ markedIds: marked,
52794
+ progress: stats,
52795
+ message: marked.length > 0 ? `Marked ${marked.length} task${marked.length === 1 ? "" : "s"} as completed from git history` : `Scanned ${lines.length} commits, found ${foundIds.size} bs-IDs, but none matched pending/in-progress tasks`
52796
+ }, null, 2) }] };
52797
+ }
52683
52798
  default:
52684
- return { content: [{ type: "text", text: JSON.stringify({ error: `Unknown action: ${action}`, validActions: ["next", "current", "done", "skip", "status", "list", "init", "sync", "advance"] }, null, 2) }] };
52799
+ return { content: [{ type: "text", text: JSON.stringify({ error: `Unknown action: ${action}`, validActions: ["next", "current", "done", "skip", "status", "list", "init", "sync", "advance", "scan"] }, null, 2) }] };
52685
52800
  }
52686
52801
  }
52687
52802
  async function executeLocalSeed(args) {
@@ -52943,7 +53058,7 @@ var FALLBACK_TOOLS = [
52943
53058
  inputSchema: {
52944
53059
  type: "object",
52945
53060
  properties: {
52946
- action: { type: "string", enum: ["next", "current", "done", "skip", "status", "list", "init", "sync", "advance"] },
53061
+ action: { type: "string", enum: ["next", "current", "done", "skip", "status", "list", "init", "sync", "advance", "scan"] },
52947
53062
  reason: { type: "string" },
52948
53063
  autoDone: { type: "boolean" }
52949
53064
  },
@@ -53008,11 +53123,11 @@ function diagnoseApiSurface() {
53008
53123
  if (missing.length === 0) return null;
53009
53124
  return [
53010
53125
  `Bootspring MCP server v${VERSION} is missing required API methods: ${missing.join(", ")}.`,
53011
- `This usually means the installed @girardmedia/bootspring package is out of date.`,
53012
- `Fix:`,
53013
- ` 1. Quit Claude Code completely`,
53014
- ` 2. npm i -g @girardmedia/bootspring@latest`,
53015
- ` 3. Restart Claude Code so the MCP server reloads`
53126
+ "This usually means the installed @girardmedia/bootspring package is out of date.",
53127
+ "Fix:",
53128
+ " 1. Quit Claude Code completely",
53129
+ " 2. npm i -g @girardmedia/bootspring@latest",
53130
+ " 3. Restart Claude Code so the MCP server reloads"
53016
53131
  ].join("\n");
53017
53132
  }
53018
53133
  function formatProxyError(error) {
@@ -53199,11 +53314,11 @@ module.exports = {
53199
53314
  if (missing.length === 0) return null;
53200
53315
  return [
53201
53316
  `Bootspring MCP server v${version} is missing required API methods: ${missing.join(", ")}.`,
53202
- `This usually means the installed @girardmedia/bootspring package is out of date.`,
53203
- `Fix:`,
53204
- ` 1. Quit Claude Code completely`,
53205
- ` 2. npm i -g @girardmedia/bootspring@latest`,
53206
- ` 3. Restart Claude Code so the MCP server reloads`
53317
+ "This usually means the installed @girardmedia/bootspring package is out of date.",
53318
+ "Fix:",
53319
+ " 1. Quit Claude Code completely",
53320
+ " 2. npm i -g @girardmedia/bootspring@latest",
53321
+ " 3. Restart Claude Code so the MCP server reloads"
53207
53322
  ].join("\n");
53208
53323
  }
53209
53324
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.5.10",
3
+ "version": "2.6.0",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",