@girardmedia/bootspring 2.7.0 → 3.0.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 CHANGED
@@ -31,6 +31,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
31
31
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
32
32
  mod
33
33
  ));
34
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
35
 
35
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
36
37
  var init_cjs_shims = __esm({
@@ -3385,7 +3386,7 @@ var init_release = __esm({
3385
3386
  "../../packages/shared/src/release.ts"() {
3386
3387
  "use strict";
3387
3388
  init_cjs_shims();
3388
- BOOTSPRING_VERSION = "2.7.0";
3389
+ BOOTSPRING_VERSION = "3.0.0";
3389
3390
  BOOTSPRING_PACKAGE_NAME = "@girardmedia/bootspring";
3390
3391
  }
3391
3392
  });
@@ -38412,7 +38413,7 @@ var require_main = __commonJS({
38412
38413
  }
38413
38414
  return to;
38414
38415
  };
38415
- var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
38416
+ var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
38416
38417
  var node_exports = {};
38417
38418
  __export2(node_exports, {
38418
38419
  analyzeMetafile: () => analyzeMetafile,
@@ -38429,7 +38430,7 @@ var require_main = __commonJS({
38429
38430
  transformSync: () => transformSync,
38430
38431
  version: () => version3
38431
38432
  });
38432
- module2.exports = __toCommonJS(node_exports);
38433
+ module2.exports = __toCommonJS2(node_exports);
38433
38434
  function encodePacket(packet) {
38434
38435
  let visit = (value) => {
38435
38436
  if (value === null) {
@@ -39210,7 +39211,7 @@ is not a problem with esbuild. You need to fix your environment instead.
39210
39211
  function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) {
39211
39212
  const details = createObjectStash();
39212
39213
  const isContext = callName === "context";
39213
- const handleError = (e, pluginName) => {
39214
+ const handleError2 = (e, pluginName) => {
39214
39215
  const flags = [];
39215
39216
  try {
39216
39217
  pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault);
@@ -39226,12 +39227,12 @@ is not a problem with esbuild. You need to fix your environment instead.
39226
39227
  if (typeof options === "object") {
39227
39228
  const value = options.plugins;
39228
39229
  if (value !== void 0) {
39229
- if (!Array.isArray(value)) return handleError(new Error(`"plugins" must be an array`), "");
39230
+ if (!Array.isArray(value)) return handleError2(new Error(`"plugins" must be an array`), "");
39230
39231
  plugins = value;
39231
39232
  }
39232
39233
  }
39233
39234
  if (plugins && plugins.length > 0) {
39234
- if (streamIn.isSync) return handleError(new Error("Cannot use plugins in synchronous API calls"), "");
39235
+ if (streamIn.isSync) return handleError2(new Error("Cannot use plugins in synchronous API calls"), "");
39235
39236
  handlePlugins(
39236
39237
  buildKey,
39237
39238
  sendRequest,
@@ -39244,14 +39245,14 @@ is not a problem with esbuild. You need to fix your environment instead.
39244
39245
  details
39245
39246
  ).then(
39246
39247
  (result) => {
39247
- if (!result.ok) return handleError(result.error, result.pluginName);
39248
+ if (!result.ok) return handleError2(result.error, result.pluginName);
39248
39249
  try {
39249
39250
  buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks);
39250
39251
  } catch (e) {
39251
- handleError(e, "");
39252
+ handleError2(e, "");
39252
39253
  }
39253
39254
  },
39254
- (e) => handleError(e, "")
39255
+ (e) => handleError2(e, "")
39255
39256
  );
39256
39257
  return;
39257
39258
  }
@@ -39259,7 +39260,7 @@ is not a problem with esbuild. You need to fix your environment instead.
39259
39260
  buildOrContextContinue(null, (result, done) => done([], []), () => {
39260
39261
  });
39261
39262
  } catch (e) {
39262
- handleError(e, "");
39263
+ handleError2(e, "");
39263
39264
  }
39264
39265
  function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) {
39265
39266
  const writeDefault = streamIn.hasFS;
@@ -45895,6 +45896,317 @@ ${"=".repeat(50)}`);
45895
45896
  }
45896
45897
  });
45897
45898
 
45899
+ // ../../packages/mcp/src/swarm-tools.ts
45900
+ function errorResult(message) {
45901
+ return {
45902
+ content: [{ type: "text", text: `Error: ${message}` }],
45903
+ isError: true
45904
+ };
45905
+ }
45906
+ function registerSwarmTools() {
45907
+ registerTool(swarmDefinition, swarmHandler);
45908
+ registerTool(memoryDefinition, memoryHandler);
45909
+ registerTool(planDefinition, planHandler);
45910
+ }
45911
+ var swarmDefinition, swarmHandler, memoryDefinition, memoryHandler, planDefinition, planHandler, SWARM_TOOLS;
45912
+ var init_swarm_tools = __esm({
45913
+ "../../packages/mcp/src/swarm-tools.ts"() {
45914
+ "use strict";
45915
+ init_cjs_shims();
45916
+ init_registry();
45917
+ swarmDefinition = {
45918
+ name: "bootspring_swarm",
45919
+ description: "Multi-agent swarm orchestration \u2014 start swarms, spawn agents, submit tasks, run consensus votes, and change topologies (hierarchical, mesh, ring, star, adaptive). Agents collaborate through shared state and self-organize based on workload.",
45920
+ inputSchema: {
45921
+ type: "object",
45922
+ properties: {
45923
+ action: {
45924
+ type: "string",
45925
+ enum: ["start", "stop", "status", "spawn", "agents", "submit", "batch", "consensus", "topology"],
45926
+ description: "Swarm action to perform"
45927
+ },
45928
+ topology: {
45929
+ type: "string",
45930
+ enum: ["hierarchical", "mesh", "ring", "star", "adaptive"],
45931
+ description: "Swarm topology (for start/topology actions)"
45932
+ },
45933
+ role: {
45934
+ type: "string",
45935
+ enum: ["queen", "worker", "specialist", "reviewer", "monitor"],
45936
+ description: "Agent role (for spawn action)"
45937
+ },
45938
+ capabilities: {
45939
+ type: "array",
45940
+ items: { type: "string" },
45941
+ description: "Agent capabilities (for spawn action)"
45942
+ },
45943
+ taskType: {
45944
+ type: "string",
45945
+ description: "Task type (for submit action)"
45946
+ },
45947
+ taskDescription: {
45948
+ type: "string",
45949
+ description: "Task description (for submit action)"
45950
+ },
45951
+ priority: {
45952
+ type: "string",
45953
+ enum: ["critical", "high", "normal", "low"],
45954
+ description: "Task priority (for submit action)"
45955
+ },
45956
+ question: {
45957
+ type: "string",
45958
+ description: "Question for consensus vote"
45959
+ },
45960
+ options: {
45961
+ type: "array",
45962
+ items: { type: "string" },
45963
+ description: "Vote options for consensus"
45964
+ }
45965
+ },
45966
+ required: ["action"]
45967
+ }
45968
+ };
45969
+ swarmHandler = async (args) => {
45970
+ const action = String(args.action || "");
45971
+ try {
45972
+ const { api } = (init_src2(), __toCommonJS(src_exports2));
45973
+ let result;
45974
+ switch (action) {
45975
+ case "start":
45976
+ result = await api.request("POST", "/swarm/start", {
45977
+ topology: args.topology || "hierarchical"
45978
+ });
45979
+ break;
45980
+ case "stop":
45981
+ result = await api.request("POST", "/swarm/stop");
45982
+ break;
45983
+ case "status":
45984
+ result = await api.request("GET", "/swarm/status");
45985
+ break;
45986
+ case "spawn":
45987
+ if (!args.role) return errorResult("role is required for spawn");
45988
+ result = await api.request("POST", "/swarm/agents", {
45989
+ role: args.role,
45990
+ capabilities: args.capabilities || ["general"]
45991
+ });
45992
+ break;
45993
+ case "agents":
45994
+ result = await api.request("GET", "/swarm/agents");
45995
+ break;
45996
+ case "submit":
45997
+ if (!args.taskType || !args.taskDescription) {
45998
+ return errorResult("taskType and taskDescription are required for submit");
45999
+ }
46000
+ result = await api.request("POST", "/swarm/tasks", {
46001
+ type: args.taskType,
46002
+ description: args.taskDescription,
46003
+ input: {},
46004
+ priority: args.priority || "normal"
46005
+ });
46006
+ break;
46007
+ case "consensus":
46008
+ if (!args.question || !args.options) {
46009
+ return errorResult("question and options are required for consensus");
46010
+ }
46011
+ result = await api.request("POST", "/swarm/consensus", {
46012
+ question: args.question,
46013
+ options: args.options
46014
+ });
46015
+ break;
46016
+ case "topology":
46017
+ if (args.topology) {
46018
+ result = await api.request("POST", "/swarm/topology", { topology: args.topology });
46019
+ } else {
46020
+ result = await api.request("GET", "/swarm/topology");
46021
+ }
46022
+ break;
46023
+ default:
46024
+ return errorResult(`Unknown action: ${action}`);
46025
+ }
46026
+ return {
46027
+ content: [{
46028
+ type: "text",
46029
+ text: `Swarm ${action} result:
46030
+ ${JSON.stringify(result, null, 2)}`
46031
+ }]
46032
+ };
46033
+ } catch (err) {
46034
+ return errorResult(err instanceof Error ? err.message : String(err));
46035
+ }
46036
+ };
46037
+ memoryDefinition = {
46038
+ name: "bootspring_memory",
46039
+ description: "Vector memory for AI agents \u2014 store decisions, patterns, and trajectories. Search by semantic similarity using HNSW index. Agents learn from past successes.",
46040
+ inputSchema: {
46041
+ type: "object",
46042
+ properties: {
46043
+ action: {
46044
+ type: "string",
46045
+ enum: ["search", "store", "trajectory", "stats", "forget"],
46046
+ description: "Memory action to perform"
46047
+ },
46048
+ query: {
46049
+ type: "string",
46050
+ description: "Search query (for search action)"
46051
+ },
46052
+ content: {
46053
+ type: "string",
46054
+ description: "Content to store (for store action)"
46055
+ },
46056
+ type: {
46057
+ type: "string",
46058
+ enum: ["decision", "pattern", "error", "solution", "context", "preference", "trajectory"],
46059
+ description: "Memory entry type"
46060
+ },
46061
+ goal: {
46062
+ type: "string",
46063
+ description: "Goal (for trajectory action)"
46064
+ },
46065
+ steps: {
46066
+ type: "array",
46067
+ items: { type: "string" },
46068
+ description: "Steps taken (for trajectory action)"
46069
+ },
46070
+ outcome: {
46071
+ type: "string",
46072
+ enum: ["success", "partial", "failure"],
46073
+ description: "Trajectory outcome"
46074
+ },
46075
+ id: {
46076
+ type: "string",
46077
+ description: "Entry ID (for forget action)"
46078
+ },
46079
+ limit: {
46080
+ type: "number",
46081
+ description: "Max results for search (default 10)"
46082
+ }
46083
+ },
46084
+ required: ["action"]
46085
+ }
46086
+ };
46087
+ memoryHandler = async (args) => {
46088
+ const action = String(args.action || "");
46089
+ try {
46090
+ const { api } = (init_src2(), __toCommonJS(src_exports2));
46091
+ let result;
46092
+ switch (action) {
46093
+ case "search":
46094
+ if (!args.query) return errorResult("query is required for search");
46095
+ result = await api.request("POST", "/swarm/memory/search", {
46096
+ query: args.query,
46097
+ limit: args.limit || 10,
46098
+ type: args.type
46099
+ });
46100
+ break;
46101
+ case "store":
46102
+ if (!args.content || !args.type) return errorResult("content and type are required for store");
46103
+ result = await api.request("POST", "/swarm/memory", {
46104
+ content: args.content,
46105
+ type: args.type,
46106
+ sessionId: `mcp-${Date.now()}`
46107
+ });
46108
+ break;
46109
+ case "trajectory":
46110
+ if (!args.goal || !args.steps || !args.outcome) {
46111
+ return errorResult("goal, steps, and outcome are required for trajectory");
46112
+ }
46113
+ result = await api.request("POST", "/swarm/memory/trajectory", {
46114
+ goal: args.goal,
46115
+ steps: args.steps,
46116
+ sessionId: `mcp-${Date.now()}`,
46117
+ outcome: args.outcome
46118
+ });
46119
+ break;
46120
+ case "stats":
46121
+ result = await api.request("GET", "/swarm/memory/stats");
46122
+ break;
46123
+ case "forget":
46124
+ if (!args.id) return errorResult("id is required for forget");
46125
+ result = await api.request("DELETE", `/swarm/memory/${args.id}`);
46126
+ break;
46127
+ default:
46128
+ return errorResult(`Unknown action: ${action}`);
46129
+ }
46130
+ return {
46131
+ content: [{
46132
+ type: "text",
46133
+ text: `Memory ${action} result:
46134
+ ${JSON.stringify(result, null, 2)}`
46135
+ }]
46136
+ };
46137
+ } catch (err) {
46138
+ return errorResult(err instanceof Error ? err.message : String(err));
46139
+ }
46140
+ };
46141
+ planDefinition = {
46142
+ name: "bootspring_plan",
46143
+ description: "Goal-oriented action planning (GOAP) \u2014 decompose high-level goals into executable task DAGs with A* search. Finds optimal sequences and parallelizable groups.",
46144
+ inputSchema: {
46145
+ type: "object",
46146
+ properties: {
46147
+ action: {
46148
+ type: "string",
46149
+ enum: ["plan", "actions", "register"],
46150
+ description: "Planner action"
46151
+ },
46152
+ goal: {
46153
+ type: "string",
46154
+ description: "Goal to plan for (for plan action)"
46155
+ },
46156
+ parallel: {
46157
+ type: "boolean",
46158
+ description: "Enable parallel task groups"
46159
+ },
46160
+ currentState: {
46161
+ type: "object",
46162
+ description: "Current world state (key-value pairs)"
46163
+ },
46164
+ goalConditions: {
46165
+ type: "array",
46166
+ description: "Goal conditions [{key, operator, value}]"
46167
+ }
46168
+ },
46169
+ required: ["action"]
46170
+ }
46171
+ };
46172
+ planHandler = async (args) => {
46173
+ const action = String(args.action || "");
46174
+ try {
46175
+ const { api } = (init_src2(), __toCommonJS(src_exports2));
46176
+ let result;
46177
+ switch (action) {
46178
+ case "plan":
46179
+ if (!args.goal) return errorResult("goal is required for plan");
46180
+ result = await api.request("POST", "/swarm/plan", {
46181
+ goal: args.goal,
46182
+ currentState: args.currentState || {},
46183
+ goalConditions: args.goalConditions || [{ key: "deployed", operator: "==", value: true }],
46184
+ parallel: args.parallel ?? true
46185
+ });
46186
+ break;
46187
+ case "actions":
46188
+ result = await api.request("GET", "/swarm/plan/actions");
46189
+ break;
46190
+ case "register":
46191
+ return errorResult("Register custom actions via the API: POST /swarm/plan/actions");
46192
+ default:
46193
+ return errorResult(`Unknown action: ${action}`);
46194
+ }
46195
+ return {
46196
+ content: [{
46197
+ type: "text",
46198
+ text: `Plan ${action} result:
46199
+ ${JSON.stringify(result, null, 2)}`
46200
+ }]
46201
+ };
46202
+ } catch (err) {
46203
+ return errorResult(err instanceof Error ? err.message : String(err));
46204
+ }
46205
+ };
46206
+ SWARM_TOOLS = [swarmDefinition, memoryDefinition, planDefinition];
46207
+ }
46208
+ });
46209
+
45898
46210
  // ../../packages/mcp/src/index.ts
45899
46211
  var src_exports3 = {};
45900
46212
  __export(src_exports3, {
@@ -45912,6 +46224,7 @@ __export(src_exports3, {
45912
46224
  QUALITY_INTELLIGENCE_TOOLS: () => QUALITY_INTELLIGENCE_TOOLS,
45913
46225
  RBAC_TOOLS: () => RBAC_TOOLS,
45914
46226
  RELEASE_TOOLS: () => RELEASE_TOOLS,
46227
+ SWARM_TOOLS: () => SWARM_TOOLS,
45915
46228
  SYNC_TOOLS: () => SYNC_TOOLS,
45916
46229
  agentDetails: () => agentDetails,
45917
46230
  assistResponse: () => assistResponse,
@@ -45953,6 +46266,7 @@ __export(src_exports3, {
45953
46266
  registerRbacTools: () => registerRbacTools,
45954
46267
  registerReleaseTools: () => registerReleaseTools,
45955
46268
  registerResource: () => registerResource,
46269
+ registerSwarmTools: () => registerSwarmTools,
45956
46270
  registerSyncTools: () => registerSyncTools,
45957
46271
  registerTool: () => registerTool,
45958
46272
  resolveCompatibilityRegistry: () => resolveCompatibilityRegistry,
@@ -45988,6 +46302,7 @@ var init_src3 = __esm({
45988
46302
  init_observer_tools();
45989
46303
  init_autopilot_tools();
45990
46304
  init_brain_tools();
46305
+ init_swarm_tools();
45991
46306
  }
45992
46307
  });
45993
46308
 
@@ -66356,7 +66671,7 @@ function drawProgressBar(progress, width = 20) {
66356
66671
  }
66357
66672
  function getWorkflowStates(projectRoot) {
66358
66673
  const workflows = {};
66359
- const names = ["onboard", "analyze", "audit", "seed", "context", "deploy", "loop", "preseed"];
66674
+ const names = ["onboard", "analyze", "audit", "seed", "context", "deploy", "loop"];
66360
66675
  for (const name of names) {
66361
66676
  const stateFile = path78.join(projectRoot, ".bootspring", name, "workflow-state.json");
66362
66677
  if (fs77.existsSync(stateFile)) {
@@ -72858,10 +73173,434 @@ function registerHarnessCommand(program3) {
72858
73173
  });
72859
73174
  }
72860
73175
 
72861
- // src/commands/geo.ts
73176
+ // src/commands/swarm.ts
72862
73177
  init_cjs_shims();
72863
73178
  init_src2();
72864
73179
  function requireAuth4() {
73180
+ if (auth_exports.isAuthenticated()) return true;
73181
+ print(`${COLORS.red}Not authenticated.${COLORS.reset} Run ${COLORS.bold}bootspring auth login${COLORS.reset} first.`);
73182
+ process.exitCode = 1;
73183
+ return false;
73184
+ }
73185
+ function handleError(error50) {
73186
+ if (error50 && typeof error50 === "object" && "response" in error50) {
73187
+ const resp = error50.response;
73188
+ if (resp?.status === 403) {
73189
+ print(`
73190
+ ${COLORS.yellow}Swarm Intelligence requires Pro tier or higher.${COLORS.reset}`);
73191
+ print(`Upgrade at: ${COLORS.cyan}https://bootspring.com/pricing${COLORS.reset}
73192
+ `);
73193
+ return;
73194
+ }
73195
+ print(`${COLORS.red}Error:${COLORS.reset} ${resp?.data?.error || resp?.data?.message || "Unknown API error"}`);
73196
+ return;
73197
+ }
73198
+ print(`${COLORS.red}Error:${COLORS.reset} ${error50 instanceof Error ? error50.message : String(error50)}`);
73199
+ }
73200
+ var TOPOLOGY_SYMBOLS = {
73201
+ hierarchical: "\u25B3",
73202
+ // △
73203
+ mesh: "\u25C6",
73204
+ // ◆
73205
+ ring: "\u25CB",
73206
+ // ○
73207
+ star: "\u2605",
73208
+ // ★
73209
+ adaptive: "\u21C4"
73210
+ // ⇄
73211
+ };
73212
+ var STATUS_COLORS = {
73213
+ idle: COLORS.green,
73214
+ busy: COLORS.cyan,
73215
+ waiting: COLORS.yellow,
73216
+ failed: COLORS.red,
73217
+ offline: COLORS.dim
73218
+ };
73219
+ function registerSwarmCommand(program3) {
73220
+ const cmd = program3.command("swarm").description("Multi-agent swarm orchestration \u2014 topology, consensus, planning");
73221
+ cmd.command("start").description("Start a new swarm").option("-t, --topology <type>", "Topology: hierarchical, mesh, ring, star, adaptive", "hierarchical").option("--max-agents <n>", "Maximum agents", "50").option("--json", "Output as JSON").action(async (opts) => {
73222
+ if (!requireAuth4()) return;
73223
+ try {
73224
+ const res = await api_client_exports.request("POST", "/swarm/start", {
73225
+ topology: opts.topology,
73226
+ maxAgents: parseInt(opts.maxAgents, 10)
73227
+ });
73228
+ if (opts.json) {
73229
+ print(JSON.stringify(res, null, 2));
73230
+ return;
73231
+ }
73232
+ const topo = opts.topology;
73233
+ const sym = TOPOLOGY_SYMBOLS[topo] || "";
73234
+ print(`
73235
+ ${COLORS.bold}${COLORS.cyan}${sym} Swarm Started${COLORS.reset}`);
73236
+ print(` Topology: ${COLORS.green}${topo}${COLORS.reset}`);
73237
+ print(` Max Agents: ${opts.maxAgents}`);
73238
+ print(` Phase: ${res.config?.phase || "running"}
73239
+ `);
73240
+ } catch (error50) {
73241
+ handleError(error50);
73242
+ }
73243
+ });
73244
+ cmd.command("stop").description("Stop the current swarm").option("--json", "Output as JSON").action(async (opts) => {
73245
+ if (!requireAuth4()) return;
73246
+ try {
73247
+ const res = await api_client_exports.request("POST", "/swarm/stop");
73248
+ if (opts.json) {
73249
+ print(JSON.stringify(res, null, 2));
73250
+ return;
73251
+ }
73252
+ print(`
73253
+ ${COLORS.bold}Swarm Stopped${COLORS.reset}`);
73254
+ if (res.metrics) {
73255
+ print(` Tasks Completed: ${COLORS.green}${res.metrics.completedTasks}${COLORS.reset}`);
73256
+ print(` Tasks Failed: ${COLORS.red}${res.metrics.failedTasks}${COLORS.reset}`);
73257
+ print(` Total Agents: ${res.metrics.totalAgents}`);
73258
+ }
73259
+ print("");
73260
+ } catch (error50) {
73261
+ handleError(error50);
73262
+ }
73263
+ });
73264
+ cmd.command("status").description("Show swarm metrics and topology").option("--json", "Output as JSON").action(async (opts) => {
73265
+ if (!requireAuth4()) return;
73266
+ try {
73267
+ const res = await api_client_exports.request("GET", "/swarm/status");
73268
+ if (opts.json) {
73269
+ print(JSON.stringify(res, null, 2));
73270
+ return;
73271
+ }
73272
+ const m = res.metrics;
73273
+ const sym = TOPOLOGY_SYMBOLS[m.topology] || "";
73274
+ print(`
73275
+ ${COLORS.bold}${COLORS.cyan}${sym} Swarm Status${COLORS.reset}`);
73276
+ print(`${"\u2500".repeat(50)}`);
73277
+ print(` Phase: ${m.phase}`);
73278
+ print(` Topology: ${COLORS.green}${m.topology}${COLORS.reset}`);
73279
+ print(` Uptime: ${Math.round(m.uptime / 1e3)}s`);
73280
+ print("");
73281
+ print(` ${COLORS.bold}Agents${COLORS.reset}`);
73282
+ print(` Total: ${m.totalAgents}`);
73283
+ print(` Active: ${COLORS.cyan}${m.activeAgents}${COLORS.reset}`);
73284
+ print(` Idle: ${COLORS.green}${m.idleAgents}${COLORS.reset}`);
73285
+ print(` Failed: ${COLORS.red}${m.failedAgents}${COLORS.reset}`);
73286
+ print("");
73287
+ print(` ${COLORS.bold}Tasks${COLORS.reset}`);
73288
+ print(` Total: ${m.totalTasks}`);
73289
+ print(` Running: ${COLORS.cyan}${m.runningTasks}${COLORS.reset}`);
73290
+ print(` Pending: ${COLORS.yellow}${m.pendingTasks}${COLORS.reset}`);
73291
+ print(` Completed: ${COLORS.green}${m.completedTasks}${COLORS.reset}`);
73292
+ print(` Failed: ${COLORS.red}${m.failedTasks}${COLORS.reset}`);
73293
+ print("");
73294
+ print(` Throughput: ${m.throughputTasksPerMin} tasks/min`);
73295
+ print(` Avg Time: ${m.avgTaskDurationMs}ms`);
73296
+ if (res.topology) {
73297
+ print(`
73298
+ ${COLORS.bold}Topology Graph${COLORS.reset}`);
73299
+ print(` Nodes: ${res.topology.nodes.length} Edges: ${res.topology.edges.length}`);
73300
+ }
73301
+ print("");
73302
+ } catch (error50) {
73303
+ handleError(error50);
73304
+ }
73305
+ });
73306
+ cmd.command("spawn <role>").description("Spawn a new agent (queen, worker, specialist, reviewer, monitor)").option("-c, --capabilities <caps>", "Comma-separated capabilities", "general").option("--json", "Output as JSON").action(async (role, opts) => {
73307
+ if (!requireAuth4()) return;
73308
+ const validRoles = ["queen", "worker", "specialist", "reviewer", "monitor"];
73309
+ if (!validRoles.includes(role)) {
73310
+ print(`${COLORS.red}Invalid role:${COLORS.reset} ${role}. Must be one of: ${validRoles.join(", ")}`);
73311
+ return;
73312
+ }
73313
+ try {
73314
+ const capabilities = opts.capabilities.split(",").map((c) => c.trim());
73315
+ const res = await api_client_exports.request("POST", "/swarm/agents", { role, capabilities });
73316
+ if (opts.json) {
73317
+ print(JSON.stringify(res, null, 2));
73318
+ return;
73319
+ }
73320
+ print(`
73321
+ ${COLORS.green}Agent spawned:${COLORS.reset} ${res.id}`);
73322
+ print(` Role: ${res.role}`);
73323
+ print(` Capabilities: ${res.capabilities.join(", ")}`);
73324
+ print(` Status: ${STATUS_COLORS[res.status] || ""}${res.status}${COLORS.reset}
73325
+ `);
73326
+ } catch (error50) {
73327
+ handleError(error50);
73328
+ }
73329
+ });
73330
+ cmd.command("agents").description("List swarm agents").option("--role <role>", "Filter by role").option("--json", "Output as JSON").action(async (opts) => {
73331
+ if (!requireAuth4()) return;
73332
+ try {
73333
+ const query = opts.role ? `?role=${opts.role}` : "";
73334
+ const res = await api_client_exports.request("GET", `/swarm/agents${query}`);
73335
+ if (opts.json) {
73336
+ print(JSON.stringify(res, null, 2));
73337
+ return;
73338
+ }
73339
+ print(`
73340
+ ${COLORS.bold}${COLORS.cyan}Swarm Agents${COLORS.reset} (${res.count})
73341
+ `);
73342
+ print(`${"ID".padEnd(24)} ${"Role".padEnd(12)} ${"Status".padEnd(10)} ${"Done".padEnd(6)} ${"Fail".padEnd(6)} Capabilities`);
73343
+ print(`${"\u2500".repeat(24)} ${"\u2500".repeat(12)} ${"\u2500".repeat(10)} ${"\u2500".repeat(6)} ${"\u2500".repeat(6)} ${"\u2500".repeat(20)}`);
73344
+ for (const a of res.agents) {
73345
+ const color = STATUS_COLORS[a.status] || "";
73346
+ print(
73347
+ `${a.id.padEnd(24)} ${a.role.padEnd(12)} ${color}${a.status.padEnd(10)}${COLORS.reset} ${String(a.completedTasks).padEnd(6)} ${String(a.failedTasks).padEnd(6)} ${a.capabilities.join(", ")}`
73348
+ );
73349
+ }
73350
+ print("");
73351
+ } catch (error50) {
73352
+ handleError(error50);
73353
+ }
73354
+ });
73355
+ cmd.command("submit <type>").description("Submit a task to the swarm").argument("<description>", "Task description").option("-p, --priority <level>", "Priority: critical, high, normal, low", "normal").option("--json", "Output as JSON").action(async (type, description, opts) => {
73356
+ if (!requireAuth4()) return;
73357
+ try {
73358
+ const res = await api_client_exports.request("POST", "/swarm/tasks", {
73359
+ type,
73360
+ description,
73361
+ input: {},
73362
+ priority: opts.priority
73363
+ });
73364
+ if (opts.json) {
73365
+ print(JSON.stringify(res, null, 2));
73366
+ return;
73367
+ }
73368
+ print(`
73369
+ ${COLORS.green}Task submitted:${COLORS.reset} ${res.id}`);
73370
+ print(` Type: ${res.type}`);
73371
+ print(` Priority: ${res.priority}`);
73372
+ print(` Status: ${res.status}`);
73373
+ if (res.assignedAgentId) {
73374
+ print(` Assigned: ${res.assignedAgentId}`);
73375
+ }
73376
+ print("");
73377
+ } catch (error50) {
73378
+ handleError(error50);
73379
+ }
73380
+ });
73381
+ cmd.command("plan <goal>").description("Generate a GOAP execution plan from a goal").option("--parallel", "Enable parallel task groups").option("--json", "Output as JSON").action(async (goal, opts) => {
73382
+ if (!requireAuth4()) return;
73383
+ try {
73384
+ const res = await api_client_exports.request("POST", "/swarm/plan", {
73385
+ goal,
73386
+ currentState: {},
73387
+ goalConditions: [{ key: "deployed", operator: "==", value: true }],
73388
+ parallel: !!opts.parallel
73389
+ });
73390
+ if (opts.json) {
73391
+ print(JSON.stringify(res, null, 2));
73392
+ return;
73393
+ }
73394
+ const feasibleStr = res.feasible ? `${COLORS.green}FEASIBLE${COLORS.reset}` : `${COLORS.red}INFEASIBLE${COLORS.reset}`;
73395
+ print(`
73396
+ ${COLORS.bold}${COLORS.cyan}Goal Planner${COLORS.reset}
73397
+ `);
73398
+ print(` Goal: ${goal}`);
73399
+ print(` Feasible: ${feasibleStr}`);
73400
+ print(` Explanation: ${res.explanation}`);
73401
+ if (res.feasible && res.steps.length > 0) {
73402
+ print(` Total Cost: ${res.totalCost}`);
73403
+ print(` Est. Time: ${Math.round(res.estimatedDurationMs / 1e3)}s`);
73404
+ print(` Par. Groups: ${res.parallelGroups}`);
73405
+ print(`
73406
+ ${COLORS.bold}Execution Steps:${COLORS.reset}
73407
+ `);
73408
+ print(` ${"#".padEnd(4)} ${"Action".padEnd(24)} ${"Agent".padEnd(14)} ${"Group".padEnd(8)} Duration`);
73409
+ print(` ${"\u2500".repeat(4)} ${"\u2500".repeat(24)} ${"\u2500".repeat(14)} ${"\u2500".repeat(8)} ${"\u2500".repeat(10)}`);
73410
+ for (const step of res.steps) {
73411
+ const group = `G${step.parallelGroup}`;
73412
+ const dur = `${Math.round(step.action.estimatedDurationMs / 1e3)}s`;
73413
+ print(
73414
+ ` ${String(step.order + 1).padEnd(4)} ${step.action.name.padEnd(24)} ${step.action.agentCapability.padEnd(14)} ${group.padEnd(8)} ${dur}`
73415
+ );
73416
+ }
73417
+ if (res.steps.some((s) => s.dependencies.length > 0)) {
73418
+ print(`
73419
+ ${COLORS.bold}Dependencies:${COLORS.reset}`);
73420
+ for (const step of res.steps) {
73421
+ if (step.dependencies.length > 0) {
73422
+ print(` ${step.action.name} ${COLORS.dim}<- ${step.dependencies.join(", ")}${COLORS.reset}`);
73423
+ }
73424
+ }
73425
+ }
73426
+ }
73427
+ print("");
73428
+ } catch (error50) {
73429
+ handleError(error50);
73430
+ }
73431
+ });
73432
+ cmd.command("consensus <question>").description("Run a consensus vote across agents").requiredOption("-o, --options <opts>", "Comma-separated vote options").option("--json", "Output as JSON").action(async (question, opts) => {
73433
+ if (!requireAuth4()) return;
73434
+ try {
73435
+ const options = opts.options.split(",").map((o) => o.trim());
73436
+ const res = await api_client_exports.request("POST", "/swarm/consensus", { question, options });
73437
+ if (opts.json) {
73438
+ print(JSON.stringify(res, null, 2));
73439
+ return;
73440
+ }
73441
+ const quorum = res.quorumReached ? `${COLORS.green}QUORUM REACHED${COLORS.reset}` : `${COLORS.yellow}NO QUORUM${COLORS.reset}`;
73442
+ print(`
73443
+ ${COLORS.bold}${COLORS.cyan}Consensus Vote${COLORS.reset}
73444
+ `);
73445
+ print(` Question: ${question}`);
73446
+ print(` Decision: ${COLORS.bold}${res.decision}${COLORS.reset}`);
73447
+ print(` Agreement: ${Math.round(res.agreement * 100)}%`);
73448
+ print(` Status: ${quorum}`);
73449
+ print(` Votes: ${res.votes.length}
73450
+ `);
73451
+ } catch (error50) {
73452
+ handleError(error50);
73453
+ }
73454
+ });
73455
+ cmd.command("memory <action>").description("Vector memory: search, store, stats").argument("[query]", "Search query or content to store").option("--type <type>", "Memory type filter").option("--limit <n>", "Max results", "10").option("--json", "Output as JSON").action(async (action, query, opts) => {
73456
+ if (!requireAuth4()) return;
73457
+ try {
73458
+ if (action === "search" && query) {
73459
+ const res = await api_client_exports.request("POST", "/swarm/memory/search", {
73460
+ query,
73461
+ limit: parseInt(opts.limit, 10),
73462
+ type: opts.type
73463
+ });
73464
+ if (opts.json) {
73465
+ print(JSON.stringify(res, null, 2));
73466
+ return;
73467
+ }
73468
+ print(`
73469
+ ${COLORS.bold}${COLORS.cyan}Memory Search${COLORS.reset} (${res.results.length} results, ${res.searchTimeMs}ms, ${res.method})
73470
+ `);
73471
+ for (const r of res.results) {
73472
+ const truncated = r.entry.content.length > 80 ? r.entry.content.slice(0, 80) + "..." : r.entry.content;
73473
+ print(` ${COLORS.green}#${r.rank}${COLORS.reset} [${r.score.toFixed(3)}] ${COLORS.dim}(${r.entry.type})${COLORS.reset} ${truncated}`);
73474
+ }
73475
+ print("");
73476
+ } else if (action === "stats") {
73477
+ const res = await api_client_exports.request("GET", "/swarm/memory/stats");
73478
+ if (opts.json) {
73479
+ print(JSON.stringify(res, null, 2));
73480
+ return;
73481
+ }
73482
+ print(`
73483
+ ${COLORS.bold}${COLORS.cyan}Vector Memory Stats${COLORS.reset}
73484
+ `);
73485
+ print(` Entries: ${res.totalEntries}`);
73486
+ print(` Dimensions: ${res.dimensions}`);
73487
+ print(` Layers: ${res.layers}`);
73488
+ print(` Avg Import: ${res.avgImportance}`);
73489
+ print(` Memory: ${Math.round(res.memoryBytes / 1024)}KB`);
73490
+ if (res.byType && Object.keys(res.byType).length > 0) {
73491
+ print(`
73492
+ By Type:`);
73493
+ for (const [type, count] of Object.entries(res.byType)) {
73494
+ print(` ${type.padEnd(16)} ${count}`);
73495
+ }
73496
+ }
73497
+ print("");
73498
+ } else {
73499
+ print(`
73500
+ Usage: bootspring swarm memory <search|stats> [query]`);
73501
+ print(` ${COLORS.dim}bootspring swarm memory search "how to fix tests"${COLORS.reset}`);
73502
+ print(` ${COLORS.dim}bootspring swarm memory stats${COLORS.reset}
73503
+ `);
73504
+ }
73505
+ } catch (error50) {
73506
+ handleError(error50);
73507
+ }
73508
+ });
73509
+ cmd.command("topology").description("Show or change swarm topology").option("-s, --set <type>", "Change topology: hierarchical, mesh, ring, star, adaptive").option("--json", "Output as JSON").action(async (opts) => {
73510
+ if (!requireAuth4()) return;
73511
+ try {
73512
+ if (opts.set) {
73513
+ const res = await api_client_exports.request("POST", "/swarm/topology", { topology: opts.set });
73514
+ if (opts.json) {
73515
+ print(JSON.stringify(res, null, 2));
73516
+ return;
73517
+ }
73518
+ print(`
73519
+ ${COLORS.green}Topology changed to:${COLORS.reset} ${opts.set}
73520
+ `);
73521
+ } else {
73522
+ const res = await api_client_exports.request("GET", "/swarm/topology");
73523
+ if (opts.json) {
73524
+ print(JSON.stringify(res, null, 2));
73525
+ return;
73526
+ }
73527
+ print(`
73528
+ ${COLORS.bold}${COLORS.cyan}Topology Graph${COLORS.reset}
73529
+ `);
73530
+ print(` Nodes: ${res.nodes.length} Edges: ${res.edges.length}
73531
+ `);
73532
+ for (const node of res.nodes) {
73533
+ const color = STATUS_COLORS[node.status] || "";
73534
+ print(` ${color}\u25CF${COLORS.reset} ${node.id} (${node.role})`);
73535
+ }
73536
+ if (res.edges.length > 0) {
73537
+ print(`
73538
+ Edges:`);
73539
+ for (const edge of res.edges.slice(0, 20)) {
73540
+ const arrow = edge.type === "parent" ? "\u2192" : "\u2194";
73541
+ print(` ${edge.from} ${arrow} ${edge.to} ${COLORS.dim}(${edge.type})${COLORS.reset}`);
73542
+ }
73543
+ if (res.edges.length > 20) {
73544
+ print(` ${COLORS.dim}... and ${res.edges.length - 20} more edges${COLORS.reset}`);
73545
+ }
73546
+ }
73547
+ print("");
73548
+ }
73549
+ } catch (error50) {
73550
+ handleError(error50);
73551
+ }
73552
+ });
73553
+ cmd.command("visualize").description("Visualize swarm topology as ASCII art").option("--json", "Output as JSON").action(async (opts) => {
73554
+ if (!requireAuth4()) return;
73555
+ try {
73556
+ const res = await api_client_exports.request("GET", "/swarm/snapshot");
73557
+ if (opts.json) {
73558
+ print(JSON.stringify(res, null, 2));
73559
+ return;
73560
+ }
73561
+ const m = res.metrics;
73562
+ const sym = TOPOLOGY_SYMBOLS[m.topology] || "";
73563
+ print(`
73564
+ ${COLORS.bold}${COLORS.cyan}${sym} Swarm Visualization \u2014 ${m.topology}${COLORS.reset}
73565
+ `);
73566
+ const agents = res.agents || [];
73567
+ const queen = agents.find((a) => a.role === "queen");
73568
+ if (m.topology === "hierarchical" || m.topology === "star") {
73569
+ if (queen) {
73570
+ print(` ${COLORS.yellow}\u265B ${queen.id}${COLORS.reset} (queen)`);
73571
+ const children = agents.filter((a) => a.parentId === queen.id);
73572
+ for (let i = 0; i < children.length; i++) {
73573
+ const isLast = i === children.length - 1;
73574
+ const prefix = isLast ? " \u2514\u2500\u2500 " : " \u251C\u2500\u2500 ";
73575
+ const color = STATUS_COLORS[children[i].status] || "";
73576
+ print(`${prefix}${color}\u25CF ${children[i].id}${COLORS.reset} (${children[i].role})`);
73577
+ }
73578
+ }
73579
+ } else if (m.topology === "ring") {
73580
+ for (let i = 0; i < agents.length; i++) {
73581
+ const color = STATUS_COLORS[agents[i].status] || "";
73582
+ const arrow = i < agents.length - 1 ? " \u2192" : ` \u2192 ${agents[0]?.id || ""}`;
73583
+ print(` ${color}\u25CF ${agents[i].id}${COLORS.reset}${arrow}`);
73584
+ }
73585
+ } else {
73586
+ for (const a of agents) {
73587
+ const color = STATUS_COLORS[a.status] || "";
73588
+ print(` ${color}\u25CF${COLORS.reset} ${a.id} (${a.role}) [${a.capabilities.join(", ")}]`);
73589
+ }
73590
+ }
73591
+ print(`
73592
+ ${COLORS.dim}Agents: ${m.totalAgents} | Tasks: ${m.totalTasks} | Completed: ${m.completedTasks} | Phase: ${m.phase}${COLORS.reset}
73593
+ `);
73594
+ } catch (error50) {
73595
+ handleError(error50);
73596
+ }
73597
+ });
73598
+ }
73599
+
73600
+ // src/commands/geo.ts
73601
+ init_cjs_shims();
73602
+ init_src2();
73603
+ function requireAuth5() {
72865
73604
  if (auth_exports.isAuthenticated()) {
72866
73605
  return true;
72867
73606
  }
@@ -72929,7 +73668,7 @@ function printGeoResult(result) {
72929
73668
  function registerGeoCommand(program3) {
72930
73669
  const geo = program3.command("geo").description("GEO-SEO analysis \u2014 optimize for AI search engines");
72931
73670
  geo.command("audit <url>").description("Full GEO + SEO audit with parallel subagents").option("--format <format>", "Output format: markdown | json", "markdown").action(async (url2, opts) => {
72932
- if (!requireAuth4()) return;
73671
+ if (!requireAuth5()) return;
72933
73672
  const spinner = createSpinner("Running GEO audit...").start();
72934
73673
  try {
72935
73674
  const result = await api_client_exports.request("POST", "/geo/audit", { url: url2, options: opts });
@@ -72941,7 +73680,7 @@ function registerGeoCommand(program3) {
72941
73680
  }
72942
73681
  });
72943
73682
  geo.command("quick <url>").description("60-second GEO visibility snapshot").action(async (url2) => {
72944
- if (!requireAuth4()) return;
73683
+ if (!requireAuth5()) return;
72945
73684
  const spinner = createSpinner("Quick GEO scan...").start();
72946
73685
  try {
72947
73686
  const result = await api_client_exports.request("POST", "/geo/quick", { url: url2 });
@@ -72968,7 +73707,7 @@ function registerGeoCommand(program3) {
72968
73707
  ];
72969
73708
  for (const sub of subcommands) {
72970
73709
  geo.command(`${sub.name} ${sub.arg}`).description(sub.desc).action(async (urlOrDomain) => {
72971
- if (!requireAuth4()) return;
73710
+ if (!requireAuth5()) return;
72972
73711
  const spinner = createSpinner(`Running ${sub.name}...`).start();
72973
73712
  try {
72974
73713
  const body = sub.arg === "<domain>" ? { domain: urlOrDomain } : { url: urlOrDomain };
@@ -72982,7 +73721,7 @@ function registerGeoCommand(program3) {
72982
73721
  });
72983
73722
  }
72984
73723
  geo.command("prospect <action>").description("CRM: manage prospects (new, list, show, audit, note, status, pipeline)").argument("[args...]", "Action-specific arguments").action(async (action, args) => {
72985
- if (!requireAuth4()) return;
73724
+ if (!requireAuth5()) return;
72986
73725
  const spinner = createSpinner(`Prospect ${action}...`).start();
72987
73726
  try {
72988
73727
  const result = await api_client_exports.request("POST", "/geo/prospect", { action, data: args });
@@ -72994,7 +73733,7 @@ function registerGeoCommand(program3) {
72994
73733
  }
72995
73734
  });
72996
73735
  geo.command("schemas [name]").description("List JSON-LD schema templates or view a specific one").action(async (name) => {
72997
- if (!requireAuth4()) return;
73736
+ if (!requireAuth5()) return;
72998
73737
  const spinner = createSpinner(name ? `Fetching ${name} schema...` : "Listing schemas...").start();
72999
73738
  try {
73000
73739
  if (name) {
@@ -73030,7 +73769,7 @@ function registerGeoCommand(program3) {
73030
73769
  // src/commands/marketing.ts
73031
73770
  init_cjs_shims();
73032
73771
  init_src2();
73033
- function requireAuth5() {
73772
+ function requireAuth6() {
73034
73773
  if (auth_exports.isAuthenticated()) {
73035
73774
  return true;
73036
73775
  }
@@ -73176,7 +73915,7 @@ function registerMarketingCommand(program3) {
73176
73915
  }
73177
73916
  }
73178
73917
  sub.action(async (...actionArgs) => {
73179
- if (!requireAuth5()) return;
73918
+ if (!requireAuth6()) return;
73180
73919
  const body = {};
73181
73920
  for (let i = 0; i < cmd.args.length; i++) {
73182
73921
  body[cmd.args[i].name] = actionArgs[i];
@@ -73219,7 +73958,7 @@ function registerMarketingCommand(program3) {
73219
73958
  });
73220
73959
  }
73221
73960
  marketing.command("commands").description("List all available marketing commands").action(async () => {
73222
- if (!requireAuth5()) return;
73961
+ if (!requireAuth6()) return;
73223
73962
  const spinner = createSpinner("Fetching marketing commands...").start();
73224
73963
  try {
73225
73964
  const result = await api_client_exports.request("GET", "/marketing/commands");
@@ -73265,7 +74004,7 @@ function registerMarketingCommand(program3) {
73265
74004
  // src/commands/sales.ts
73266
74005
  init_cjs_shims();
73267
74006
  init_src2();
73268
- function requireAuth6() {
74007
+ function requireAuth7() {
73269
74008
  if (auth_exports.isAuthenticated()) {
73270
74009
  return true;
73271
74010
  }
@@ -73386,7 +74125,7 @@ function registerSalesCommand(program3) {
73386
74125
  }
73387
74126
  }
73388
74127
  sub.action(async (...actionArgs) => {
73389
- if (!requireAuth6()) return;
74128
+ if (!requireAuth7()) return;
73390
74129
  const body = {};
73391
74130
  for (let i = 0; i < cmd.args.length; i++) {
73392
74131
  body[cmd.args[i].name] = actionArgs[i];
@@ -73424,7 +74163,7 @@ function registerSalesCommand(program3) {
73424
74163
  });
73425
74164
  }
73426
74165
  sales.command("commands").description("List all available sales commands").action(async () => {
73427
- if (!requireAuth6()) return;
74166
+ if (!requireAuth7()) return;
73428
74167
  const spinner = createSpinner("Fetching sales commands...").start();
73429
74168
  try {
73430
74169
  const result = await api_client_exports.request("GET", "/sales/commands");
@@ -73469,7 +74208,7 @@ function registerSalesCommand(program3) {
73469
74208
  // src/commands/jobs.ts
73470
74209
  init_cjs_shims();
73471
74210
  init_src2();
73472
- function requireAuth7() {
74211
+ function requireAuth8() {
73473
74212
  if (auth_exports.isAuthenticated()) return true;
73474
74213
  print.error('Not logged in. Run "bootspring auth login" first.');
73475
74214
  process.exitCode = 1;
@@ -73478,7 +74217,7 @@ function requireAuth7() {
73478
74217
  function registerJobsCommand(program3) {
73479
74218
  const jobs = program3.command("jobs").description("List and poll async job results");
73480
74219
  jobs.command("list").alias("ls").description("List recent jobs").option("--type <type>", "Filter by type (geo, marketing, sales)").option("--limit <n>", "Number of jobs to show", "20").action(async (opts) => {
73481
- if (!requireAuth7()) return;
74220
+ if (!requireAuth8()) return;
73482
74221
  try {
73483
74222
  const params = new URLSearchParams();
73484
74223
  if (opts.type) params.set("type", opts.type);
@@ -73505,7 +74244,7 @@ ${COLORS.bold}Recent Jobs${COLORS.reset}
73505
74244
  }
73506
74245
  });
73507
74246
  jobs.command("status <jobId>").alias("get").description("Get job status and results").action(async (jobId) => {
73508
- if (!requireAuth7()) return;
74247
+ if (!requireAuth8()) return;
73509
74248
  try {
73510
74249
  const response = await api_client_exports.request("GET", `/jobs/${encodeURIComponent(jobId)}`);
73511
74250
  const job = response.job;
@@ -77931,6 +78670,7 @@ registerSetupCommand(program2);
77931
78670
  registerPipelineCommand(program2);
77932
78671
  registerWorkflowCommand(program2);
77933
78672
  registerHarnessCommand(program2);
78673
+ registerSwarmCommand(program2);
77934
78674
  registerGeoCommand(program2);
77935
78675
  registerMarketingCommand(program2);
77936
78676
  registerSalesCommand(program2);
@@ -48,7 +48,8 @@ var HELP_GROUPS = {
48
48
  "pipeline",
49
49
  "workflow",
50
50
  "orchestrator",
51
- "marketplace"
51
+ "marketplace",
52
+ "swarm"
52
53
  ]
53
54
  };
54
55
  function showHelp() {
@@ -477,7 +477,7 @@ interface InstallContext {
477
477
  scriptPath: string;
478
478
  }
479
479
  declare const PACKAGE_NAME = "@girardmedia/bootspring";
480
- declare const CURRENT_VERSION = "2.7.0";
480
+ declare const CURRENT_VERSION = "3.0.0";
481
481
  declare const DEFAULT_INTERVAL_MS: number;
482
482
  declare const STATE_PATH: string;
483
483
  declare function compareVersions(a: string, b: string): number;
package/dist/core.js CHANGED
@@ -379,7 +379,7 @@ var init_release = __esm({
379
379
  "../../packages/shared/src/release.ts"() {
380
380
  "use strict";
381
381
  init_cjs_shims();
382
- BOOTSPRING_VERSION = "2.7.0";
382
+ BOOTSPRING_VERSION = "3.0.0";
383
383
  BOOTSPRING_PACKAGE_NAME = "@girardmedia/bootspring";
384
384
  }
385
385
  });
@@ -21643,7 +21643,7 @@ ${COLORS2.dim}Run "bootspring mcp" for server options${COLORS2.reset}
21643
21643
  console.log(`${COLORS2.dim}Run "bootspring mcp" for setup instructions.${COLORS2.reset}
21644
21644
  `);
21645
21645
  }
21646
- var BOOTSPRING_VERSION2 = "2.7.0";
21646
+ var BOOTSPRING_VERSION2 = "3.0.0";
21647
21647
  var BOOTSPRING_PACKAGE_NAME2 = "@girardmedia/bootspring";
21648
21648
  var REDACTED2 = "[REDACTED]";
21649
21649
  var SENSITIVE_KEY_PATTERN2 = /(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i;
@@ -21691,7 +21691,7 @@ var require_package = __commonJS({
21691
21691
  "../../../package.json"(exports2, module2) {
21692
21692
  module2.exports = {
21693
21693
  name: "bootspring-workspace",
21694
- version: "2.7.0",
21694
+ version: "3.0.0",
21695
21695
  private: true,
21696
21696
  description: "Workspace tooling for the Bootspring monorepo",
21697
21697
  keywords: [
@@ -21766,6 +21766,7 @@ var require_package = __commonJS({
21766
21766
  "planning:sync:check": "node scripts/sync-planning-state.js --check",
21767
21767
  "planning:realign": "node scripts/sync-planning-state.js --sync-runtime",
21768
21768
  "verify:package": "node scripts/check-package-boundaries.js",
21769
+ "verify:security": "node scripts/security-scan.js",
21769
21770
  "db:sync": "node monorepo/packages/shared/db/sync.js",
21770
21771
  "db:sync:check": "node monorepo/packages/shared/db/sync.js --check"
21771
21772
  },
@@ -21776,12 +21777,15 @@ var require_package = __commonJS({
21776
21777
  "@typescript-eslint/eslint-plugin": "^8.57.0",
21777
21778
  "@typescript-eslint/parser": "^8.57.0",
21778
21779
  "@vitest/coverage-v8": "^4.0.18",
21780
+ ajv: "^8.18.0",
21779
21781
  eslint: "^9.39.2",
21780
21782
  globals: "^17.3.0",
21781
21783
  tsup: "^8.5.1",
21782
21784
  tsx: "^4.21.0",
21783
21785
  typescript: "^5.9.3",
21784
- vitest: "^4.0.18"
21786
+ vitest: "^4.0.18",
21787
+ yaml: "^2.8.3",
21788
+ zod: "^4.3.6"
21785
21789
  },
21786
21790
  engines: {
21787
21791
  node: ">=18.0.0"
@@ -21791,7 +21795,7 @@ var require_package = __commonJS({
21791
21795
  ajv: "^8.12.0"
21792
21796
  },
21793
21797
  minimatch: "^10.2.1",
21794
- hono: "4.12.4",
21798
+ hono: "4.12.14",
21795
21799
  "@hono/node-server": "1.19.10",
21796
21800
  "express-rate-limit": "^8.2.2",
21797
21801
  "path-to-regexp@<0.1.13": "0.1.13",
@@ -530,4 +530,13 @@ declare function registerAutopilotTools(): void;
530
530
  declare const BRAIN_TOOLS: ToolDefinition[];
531
531
  declare function registerBrainTools(): void;
532
532
 
533
- export { ASSISTANT_PARITY_TOOLS, AUDIT_TOOLS, AUTOPILOT_TOOLS, type AgentData, type AssistResponseData, BRAIN_TOOLS, type BuildCapabilitiesOptions, COMPLIANCE_TOOLS, type CapabilitiesDeps, type ContextValidationResult, DOCS_INTELLIGENCE_TOOLS, type FilteredWorkflows, type ListOptions, MARKETPLACE_TOOLS, type MCPServerOptions, type MCPToolResultWithMeta, METRICS_TOOLS, NOTIFICATION_TOOLS, OBSERVER_TOOLS, ONBOARDING_TOOLS, type OrchestratorStatus, type PRDData, type PolicyProfile, type ProgressInfo, type ProjectContextDisplay, QUALITY_INTELLIGENCE_TOOLS, type QualityGateResults, RBAC_TOOLS, RELEASE_TOOLS, type RegistryExports, SYNC_TOOLS, type SkillData, type SuccessOptions, type TodoItem, type ValidationResult, type WorkflowAccessContext, agentDetails, assistResponse, buildCapabilities, buildDefaultCapabilities, clearCache, contextSummary, contextValidation, createServer, error, generateProgressBar, getCompatibilityRegistryCandidatePaths, getLegacyRegistryCandidatePaths, getRegistryExports, getResourceHandlers, getResources, getToolHandlers, getTools, invokeTool, isRegistryPopulated, list, loadToolsFromDirectory, loopStatus, main, orchestratorStatus, qualityResults, registerAssistantParityTools, registerAuditTools, registerAutopilotTools, registerBrainTools, registerComplianceTools, registerDocsIntelligenceTools, registerMarketplaceTools, registerMetricsTools, registerNotificationTools, registerObserverTools, registerOnboardingTools, registerQualityIntelligenceTools, registerRbacTools, registerReleaseTools, registerResource, registerSyncTools, registerTool, resolveCompatibilityRegistry, resolveRuntimeRegistry, skillDetails, startStdioServer, success, todoList, trackTelemetry, validateDependencies, warning };
533
+ /**
534
+ * @bootspring/mcp — Swarm Intelligence MCP Tools
535
+ * 3 tools: bootspring_swarm, bootspring_memory, bootspring_plan
536
+ * @package @bootspring/mcp
537
+ */
538
+
539
+ declare const SWARM_TOOLS: ToolDefinition[];
540
+ declare function registerSwarmTools(): void;
541
+
542
+ export { ASSISTANT_PARITY_TOOLS, AUDIT_TOOLS, AUTOPILOT_TOOLS, type AgentData, type AssistResponseData, BRAIN_TOOLS, type BuildCapabilitiesOptions, COMPLIANCE_TOOLS, type CapabilitiesDeps, type ContextValidationResult, DOCS_INTELLIGENCE_TOOLS, type FilteredWorkflows, type ListOptions, MARKETPLACE_TOOLS, type MCPServerOptions, type MCPToolResultWithMeta, METRICS_TOOLS, NOTIFICATION_TOOLS, OBSERVER_TOOLS, ONBOARDING_TOOLS, type OrchestratorStatus, type PRDData, type PolicyProfile, type ProgressInfo, type ProjectContextDisplay, QUALITY_INTELLIGENCE_TOOLS, type QualityGateResults, RBAC_TOOLS, RELEASE_TOOLS, type RegistryExports, SWARM_TOOLS, SYNC_TOOLS, type SkillData, type SuccessOptions, type TodoItem, type ValidationResult, type WorkflowAccessContext, agentDetails, assistResponse, buildCapabilities, buildDefaultCapabilities, clearCache, contextSummary, contextValidation, createServer, error, generateProgressBar, getCompatibilityRegistryCandidatePaths, getLegacyRegistryCandidatePaths, getRegistryExports, getResourceHandlers, getResources, getToolHandlers, getTools, invokeTool, isRegistryPopulated, list, loadToolsFromDirectory, loopStatus, main, orchestratorStatus, qualityResults, registerAssistantParityTools, registerAuditTools, registerAutopilotTools, registerBrainTools, registerComplianceTools, registerDocsIntelligenceTools, registerMarketplaceTools, registerMetricsTools, registerNotificationTools, registerObserverTools, registerOnboardingTools, registerQualityIntelligenceTools, registerRbacTools, registerReleaseTools, registerResource, registerSwarmTools, registerSyncTools, registerTool, resolveCompatibilityRegistry, resolveRuntimeRegistry, skillDetails, startStdioServer, success, todoList, trackTelemetry, validateDependencies, warning };
@@ -31377,7 +31377,7 @@ var init_release = __esm({
31377
31377
  "../../packages/shared/src/release.ts"() {
31378
31378
  "use strict";
31379
31379
  init_cjs_shims();
31380
- BOOTSPRING_VERSION = "2.7.0";
31380
+ BOOTSPRING_VERSION = "3.0.0";
31381
31381
  BOOTSPRING_PACKAGE_NAME = "@girardmedia/bootspring";
31382
31382
  }
31383
31383
  });
@@ -52278,7 +52278,7 @@ var require_package = __commonJS({
52278
52278
  "../../../package.json"(exports2, module2) {
52279
52279
  module2.exports = {
52280
52280
  name: "bootspring-workspace",
52281
- version: "2.7.0",
52281
+ version: "3.0.0",
52282
52282
  private: true,
52283
52283
  description: "Workspace tooling for the Bootspring monorepo",
52284
52284
  keywords: [
@@ -52353,6 +52353,7 @@ var require_package = __commonJS({
52353
52353
  "planning:sync:check": "node scripts/sync-planning-state.js --check",
52354
52354
  "planning:realign": "node scripts/sync-planning-state.js --sync-runtime",
52355
52355
  "verify:package": "node scripts/check-package-boundaries.js",
52356
+ "verify:security": "node scripts/security-scan.js",
52356
52357
  "db:sync": "node monorepo/packages/shared/db/sync.js",
52357
52358
  "db:sync:check": "node monorepo/packages/shared/db/sync.js --check"
52358
52359
  },
@@ -52363,12 +52364,15 @@ var require_package = __commonJS({
52363
52364
  "@typescript-eslint/eslint-plugin": "^8.57.0",
52364
52365
  "@typescript-eslint/parser": "^8.57.0",
52365
52366
  "@vitest/coverage-v8": "^4.0.18",
52367
+ ajv: "^8.18.0",
52366
52368
  eslint: "^9.39.2",
52367
52369
  globals: "^17.3.0",
52368
52370
  tsup: "^8.5.1",
52369
52371
  tsx: "^4.21.0",
52370
52372
  typescript: "^5.9.3",
52371
- vitest: "^4.0.18"
52373
+ vitest: "^4.0.18",
52374
+ yaml: "^2.8.3",
52375
+ zod: "^4.3.6"
52372
52376
  },
52373
52377
  engines: {
52374
52378
  node: ">=18.0.0"
@@ -52378,7 +52382,7 @@ var require_package = __commonJS({
52378
52382
  ajv: "^8.12.0"
52379
52383
  },
52380
52384
  minimatch: "^10.2.1",
52381
- hono: "4.12.4",
52385
+ hono: "4.12.14",
52382
52386
  "@hono/node-server": "1.19.10",
52383
52387
  "express-rate-limit": "^8.2.2",
52384
52388
  "path-to-regexp@<0.1.13": "0.1.13",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.7.0",
3
+ "version": "3.0.0",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",