@girardmedia/bootspring 2.3.3 → 2.3.5

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.
package/README.md CHANGED
@@ -12,7 +12,8 @@ Bootspring is an AI-powered development platform that provides intelligent conte
12
12
  - **Preseed → Seed → Scaffold Pipeline** - Go from idea to working code with AI-assisted document generation
13
13
  - **Universal Drop Zone** - Drop any files and let AI analyze and categorize them for you
14
14
  - **Intelligent Context Management** - Automatically generates and maintains AI context for your project
15
- - **Specialized Agents** - 12+ expert agents for database, security, frontend, backend, and more
15
+ - **Parallel Workflow Orchestration** - Multi-phase parallel execution plans with 36 specialized agents
16
+ - **Specialized Agents** - 36 expert agents for database, security, frontend, backend, and more
16
17
  - **MCP Integration** - Native Model Context Protocol server for seamless AI assistant integration
17
18
  - **Entitlement-Ready Skill Catalog** - Built-in patterns public, curated external catalog policy-gated
18
19
  - **Plugin System** - Extensible architecture for auth, payments, database, testing, security
@@ -3389,6 +3389,7 @@ function decrypt(encrypted) {
3389
3389
  return JSON.parse(decrypted);
3390
3390
  }
3391
3391
  function getCredentials() {
3392
+ if (_credentialCache) return _credentialCache.value;
3392
3393
  try {
3393
3394
  if (import_fs2.default.existsSync(CREDENTIALS_FILE)) {
3394
3395
  const raw = JSON.parse(import_fs2.default.readFileSync(CREDENTIALS_FILE, "utf-8"));
@@ -3396,11 +3397,17 @@ function getCredentials() {
3396
3397
  if (raw && typeof raw === "object" && !raw.iv && !raw.data) {
3397
3398
  saveCredentials(decrypted);
3398
3399
  }
3400
+ _credentialCache = { resolved: true, value: decrypted };
3399
3401
  return decrypted;
3400
3402
  }
3401
- } catch (err) {
3402
- console.error("[bootspring] Failed to read credentials:", err.message);
3403
+ } catch {
3404
+ _credentialDecryptFailed = true;
3405
+ try {
3406
+ import_fs2.default.unlinkSync(CREDENTIALS_FILE);
3407
+ } catch {
3408
+ }
3403
3409
  }
3410
+ _credentialCache = { resolved: true, value: null };
3404
3411
  return null;
3405
3412
  }
3406
3413
  function saveCredentials(credentials) {
@@ -3411,6 +3418,7 @@ function saveCredentials(credentials) {
3411
3418
  JSON.stringify(encrypted, null, 2),
3412
3419
  { mode: 384 }
3413
3420
  );
3421
+ _credentialCache = null;
3414
3422
  }
3415
3423
  function clearCredentials() {
3416
3424
  try {
@@ -3419,6 +3427,8 @@ function clearCredentials() {
3419
3427
  }
3420
3428
  } catch {
3421
3429
  }
3430
+ _credentialCache = null;
3431
+ _credentialDecryptFailed = false;
3422
3432
  }
3423
3433
  function getToken() {
3424
3434
  const creds = getCredentials();
@@ -3518,9 +3528,13 @@ function getApiKey() {
3518
3528
  if (storedApiKey) return storedApiKey;
3519
3529
  const legacyApiKey = getLegacyProjectApiKey();
3520
3530
  if (legacyApiKey) {
3521
- if (!legacyProjectApiKeyWarned) {
3522
- legacyProjectApiKeyWarned = true;
3523
- console.warn("[bootspring] Using legacy .bootspring.json apiKey fallback.");
3531
+ if (_credentialDecryptFailed) {
3532
+ try {
3533
+ saveCredentials({ apiKey: legacyApiKey });
3534
+ _credentialCache = null;
3535
+ _credentialDecryptFailed = false;
3536
+ } catch {
3537
+ }
3524
3538
  }
3525
3539
  return legacyApiKey;
3526
3540
  }
@@ -4100,7 +4114,7 @@ function validateSlug(slug) {
4100
4114
  }
4101
4115
  return { valid: true, sanitized: slug };
4102
4116
  }
4103
- var import_fs2, import_path2, import_os, import_crypto, import_https, import_http, import_fs3, import_path3, __defProp2, __export2, auth_exports, BOOTSPRING_DIR, CREDENTIALS_FILE, CONFIG_FILE, DEVICE_FILE, getEncryptionKey, legacyProjectApiKeyWarned, api_client_exports, API_BASE, API_VERSION, cache, CACHE_TTL, session_exports, SESSION_FILE, LOCAL_CONFIG_NAME, PROJECT_SCOPE_MARKERS, LIMITS, PATTERNS, SHELL_DANGEROUS_CHARS;
4117
+ var import_fs2, import_path2, import_os, import_crypto, import_https, import_http, import_fs3, import_path3, __defProp2, __export2, auth_exports, BOOTSPRING_DIR, CREDENTIALS_FILE, CONFIG_FILE, DEVICE_FILE, _credentialCache, _credentialDecryptFailed, getEncryptionKey, api_client_exports, API_BASE, API_VERSION, cache, CACHE_TTL, session_exports, SESSION_FILE, LOCAL_CONFIG_NAME, PROJECT_SCOPE_MARKERS, LIMITS, PATTERNS, SHELL_DANGEROUS_CHARS;
4104
4118
  var init_dist2 = __esm({
4105
4119
  "../../packages/core/dist/index.mjs"() {
4106
4120
  "use strict";
@@ -4168,11 +4182,12 @@ var init_dist2 = __esm({
4168
4182
  CREDENTIALS_FILE = import_path2.default.join(BOOTSPRING_DIR, "credentials.json");
4169
4183
  CONFIG_FILE = import_path2.default.join(BOOTSPRING_DIR, "config.json");
4170
4184
  DEVICE_FILE = import_path2.default.join(BOOTSPRING_DIR, "device.json");
4185
+ _credentialCache = null;
4186
+ _credentialDecryptFailed = false;
4171
4187
  getEncryptionKey = () => {
4172
4188
  const machineId = import_os.default.hostname() + import_os.default.userInfo().username;
4173
4189
  return import_crypto.default.createHash("sha256").update(machineId).digest();
4174
4190
  };
4175
- legacyProjectApiKeyWarned = false;
4176
4191
  api_client_exports = {};
4177
4192
  __export2(api_client_exports, {
4178
4193
  API_BASE: () => API_BASE,
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.3",
1603
+ version: "2.3.5",
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.3",
48
+ version: "2.3.5",
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.3",
3
+ "version": "2.3.5",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",