opencode-swarm 6.67.0 → 6.67.1

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
@@ -37050,7 +37050,7 @@ function checkAgentToolMapAlignment(registeredKeys) {
37050
37050
  id: `agent-tool-map-mismatch-${agentName}-${toolName}`,
37051
37051
  title: "AGENT_TOOL_MAP alignment gap",
37052
37052
  description: `Tool "${toolName}" is assigned to agent "${agentName}" in AGENT_TOOL_MAP but is not registered in the plugin's tool: {} block. The agent will not be able to use this tool.`,
37053
- severity: "warn",
37053
+ severity: "error",
37054
37054
  path: `AGENT_TOOL_MAP.${agentName}`,
37055
37055
  currentValue: toolName,
37056
37056
  autoFixable: false
@@ -37159,6 +37159,11 @@ function formatToolDoctorMarkdown(result) {
37159
37159
  }
37160
37160
  lines.push("");
37161
37161
  }
37162
+ if (result.summary.error > 0) {
37163
+ lines.push("---", "");
37164
+ lines.push(`**BLOCKING**: ${result.summary.error} error-severity finding(s) must be resolved before release. ` + `AGENT_TOOL_MAP alignment errors mean an agent's system prompt instructs the model to call a tool that opencode has not registered \u2014 the agent's workflow will silently fail at runtime.`);
37165
+ lines.push("");
37166
+ }
37162
37167
  }
37163
37168
  return lines.join(`
37164
37169
  `);
@@ -1,3 +1,10 @@
1
+ import { type ConfigDoctorResult } from '../services/config-doctor';
2
+ /**
3
+ * Format tool doctor result as markdown for command output.
4
+ *
5
+ * Exported for unit testing of the BLOCKING footer enforcement path.
6
+ */
7
+ export declare function formatToolDoctorMarkdown(result: ConfigDoctorResult): string;
1
8
  /**
2
9
  * Handle /swarm config doctor command.
3
10
  * Maps to: config doctor service (runConfigDoctor)
package/dist/index.js CHANGED
@@ -35284,7 +35284,7 @@ function checkAgentToolMapAlignment(registeredKeys) {
35284
35284
  id: `agent-tool-map-mismatch-${agentName}-${toolName}`,
35285
35285
  title: "AGENT_TOOL_MAP alignment gap",
35286
35286
  description: `Tool "${toolName}" is assigned to agent "${agentName}" in AGENT_TOOL_MAP but is not registered in the plugin's tool: {} block. The agent will not be able to use this tool.`,
35287
- severity: "warn",
35287
+ severity: "error",
35288
35288
  path: `AGENT_TOOL_MAP.${agentName}`,
35289
35289
  currentValue: toolName,
35290
35290
  autoFixable: false
@@ -50015,6 +50015,11 @@ function formatToolDoctorMarkdown(result) {
50015
50015
  }
50016
50016
  lines.push("");
50017
50017
  }
50018
+ if (result.summary.error > 0) {
50019
+ lines.push("---", "");
50020
+ lines.push(`**BLOCKING**: ${result.summary.error} error-severity finding(s) must be resolved before release. ` + `AGENT_TOOL_MAP alignment errors mean an agent's system prompt instructs the model to call a tool that opencode has not registered \u2014 the agent's workflow will silently fail at runtime.`);
50021
+ lines.push("");
50022
+ }
50018
50023
  }
50019
50024
  return lines.join(`
50020
50025
  `);
@@ -54733,16 +54738,17 @@ ${customAppendPrompt}`;
54733
54738
  }
54734
54739
  prompt = prompt?.replace("{{YOUR_TOOLS}}", buildYourToolsList())?.replace("{{AVAILABLE_TOOLS}}", buildAvailableToolsList())?.replace("{{SLASH_COMMANDS}}", buildSlashCommandsList());
54735
54740
  const councilBlock = buildCouncilWorkflow(council);
54741
+ const hasPlaceholder = prompt?.includes("{{COUNCIL_WORKFLOW}}") === true;
54736
54742
  if (councilBlock === "") {
54737
- prompt = prompt?.replace(`
54738
-
54739
- {{COUNCIL_WORKFLOW}}
54740
-
54741
- `, `
54743
+ prompt = prompt?.replace(/\n\n\{\{COUNCIL_WORKFLOW\}\}\n\n/g, `
54742
54744
 
54743
54745
  `);
54746
+ } else if (hasPlaceholder) {
54747
+ prompt = prompt?.replace(/\{\{COUNCIL_WORKFLOW\}\}/g, councilBlock);
54744
54748
  } else {
54745
- prompt = prompt?.replace("{{COUNCIL_WORKFLOW}}", councilBlock);
54749
+ prompt = `${prompt ?? ""}
54750
+
54751
+ ${councilBlock}`;
54746
54752
  }
54747
54753
  const advEnabled = adversarialTesting?.enabled ?? true;
54748
54754
  const advScope = adversarialTesting?.scope ?? "all";
@@ -56494,6 +56500,13 @@ function getAgentConfigs(config3, directory, sessionId) {
56494
56500
  } else {
56495
56501
  allowedTools = AGENT_TOOL_MAP[baseAgentName];
56496
56502
  }
56503
+ if (baseAgentName === "architect" && config3?.council?.enabled === true && override !== undefined) {
56504
+ const required3 = ["declare_council_criteria", "convene_council"];
56505
+ const missing = required3.filter((t) => !override.includes(t));
56506
+ if (missing.length > 0) {
56507
+ throw new Error(`[opencode-swarm] Conflicting config: council.enabled=true but tool_filter.overrides.architect omits ${missing.join(", ")}. ` + `Either set council.enabled=false, remove the architect override entirely to fall back on AGENT_TOOL_MAP, or add the missing council tools to the override. ` + `Refusing to silently override your explicit tool_filter.overrides.architect.`);
56508
+ }
56509
+ }
56497
56510
  if (!allowedTools && !Object.hasOwn(toolFilterOverrides, baseAgentName)) {
56498
56511
  if (!warnedMissingWhitelist.has(baseAgentName)) {
56499
56512
  console.warn(`[getAgentConfigs] Unknown agent '${baseAgentName}', defaulting to minimal toolset.`);
@@ -80067,7 +80080,9 @@ var OpenCodeSwarm = async (ctx) => {
80067
80080
  checkpoint,
80068
80081
  completion_verify,
80069
80082
  complexity_hotspots,
80083
+ convene_council,
80070
80084
  curator_analyze,
80085
+ declare_council_criteria,
80071
80086
  knowledge_add,
80072
80087
  knowledge_recall,
80073
80088
  knowledge_remove,
@@ -80082,6 +80097,7 @@ var OpenCodeSwarm = async (ctx) => {
80082
80097
  imports,
80083
80098
  knowledge_query,
80084
80099
  lint,
80100
+ lint_spec,
80085
80101
  diff,
80086
80102
  pkg_audit,
80087
80103
  placeholder_scan,
@@ -80089,6 +80105,7 @@ var OpenCodeSwarm = async (ctx) => {
80089
80105
  pre_check_batch,
80090
80106
  quality_budget,
80091
80107
  repo_map,
80108
+ req_coverage,
80092
80109
  retrieve_summary,
80093
80110
  save_plan,
80094
80111
  sast_scan,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-swarm",
3
- "version": "6.67.0",
3
+ "version": "6.67.1",
4
4
  "description": "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",