@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 +2 -1
- package/dist/cli/index.cjs +22 -7
- package/dist/core.js +47 -2
- package/dist/mcp-server.js +1 -1
- package/package.json +1 -1
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
|
-
- **
|
|
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
|
package/dist/cli/index.cjs
CHANGED
|
@@ -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
|
|
3402
|
-
|
|
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 (
|
|
3522
|
-
|
|
3523
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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
|
|
package/dist/mcp-server.js
CHANGED
|
@@ -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.
|
|
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",
|