@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.
- package/dist/cli/index.js +19181 -17406
- package/dist/cli-launcher.js +45 -38
- package/dist/core/index.d.ts +13 -6
- package/dist/core.js +81 -9
- package/dist/mcp-server.js +135 -20
- package/package.json +1 -1
package/dist/mcp-server.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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: "
|
|
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
|
-
|
|
53012
|
-
|
|
53013
|
-
|
|
53014
|
-
|
|
53015
|
-
|
|
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
|
-
|
|
53203
|
-
|
|
53204
|
-
|
|
53205
|
-
|
|
53206
|
-
|
|
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
|
};
|