opencode-swarm 6.18.0 → 6.18.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
@@ -14272,6 +14272,60 @@ function sanitizeTaskId(taskId) {
14272
14272
  }
14273
14273
  return taskId;
14274
14274
  }
14275
+ async function saveEvidence(directory, taskId, evidence) {
14276
+ const sanitizedTaskId = sanitizeTaskId(taskId);
14277
+ const relativePath = path3.join("evidence", sanitizedTaskId, "evidence.json");
14278
+ const evidencePath = validateSwarmPath(directory, relativePath);
14279
+ const evidenceDir = path3.dirname(evidencePath);
14280
+ let bundle;
14281
+ const existingContent = await readSwarmFileAsync(directory, relativePath);
14282
+ if (existingContent !== null) {
14283
+ try {
14284
+ const parsed = JSON.parse(existingContent);
14285
+ bundle = EvidenceBundleSchema.parse(parsed);
14286
+ } catch (error49) {
14287
+ warn(`Existing evidence bundle invalid for task ${sanitizedTaskId}, creating new: ${error49 instanceof Error ? error49.message : String(error49)}`);
14288
+ const now = new Date().toISOString();
14289
+ bundle = {
14290
+ schema_version: "1.0.0",
14291
+ task_id: sanitizedTaskId,
14292
+ entries: [],
14293
+ created_at: now,
14294
+ updated_at: now
14295
+ };
14296
+ }
14297
+ } else {
14298
+ const now = new Date().toISOString();
14299
+ bundle = {
14300
+ schema_version: "1.0.0",
14301
+ task_id: sanitizedTaskId,
14302
+ entries: [],
14303
+ created_at: now,
14304
+ updated_at: now
14305
+ };
14306
+ }
14307
+ const updatedBundle = {
14308
+ ...bundle,
14309
+ entries: [...bundle.entries, evidence],
14310
+ updated_at: new Date().toISOString()
14311
+ };
14312
+ const bundleJson = JSON.stringify(updatedBundle);
14313
+ if (bundleJson.length > EVIDENCE_MAX_JSON_BYTES) {
14314
+ throw new Error(`Evidence bundle size (${bundleJson.length} bytes) exceeds maximum (${EVIDENCE_MAX_JSON_BYTES} bytes)`);
14315
+ }
14316
+ mkdirSync(evidenceDir, { recursive: true });
14317
+ const tempPath = path3.join(evidenceDir, `evidence.json.tmp.${Date.now()}.${process.pid}`);
14318
+ try {
14319
+ await Bun.write(tempPath, bundleJson);
14320
+ renameSync(tempPath, evidencePath);
14321
+ } catch (error49) {
14322
+ try {
14323
+ rmSync(tempPath, { force: true });
14324
+ } catch {}
14325
+ throw error49;
14326
+ }
14327
+ return updatedBundle;
14328
+ }
14275
14329
  async function loadEvidence(directory, taskId) {
14276
14330
  const sanitizedTaskId = sanitizeTaskId(taskId);
14277
14331
  const relativePath = path3.join("evidence", sanitizedTaskId, "evidence.json");
@@ -37958,6 +38012,128 @@ No active swarm plan found. Nothing to sync.`;
37958
38012
  `);
37959
38013
  }
37960
38014
 
38015
+ // src/tools/write-retro.ts
38016
+ init_manager();
38017
+ async function executeWriteRetro(args, directory) {
38018
+ const phase = args.phase;
38019
+ if (!Number.isInteger(phase) || phase < 1) {
38020
+ return JSON.stringify({
38021
+ success: false,
38022
+ phase,
38023
+ message: "Invalid phase: must be a positive integer"
38024
+ }, null, 2);
38025
+ }
38026
+ const validComplexities = [
38027
+ "trivial",
38028
+ "simple",
38029
+ "moderate",
38030
+ "complex"
38031
+ ];
38032
+ if (!validComplexities.includes(args.task_complexity)) {
38033
+ return JSON.stringify({
38034
+ success: false,
38035
+ phase,
38036
+ message: `Invalid task_complexity: must be one of 'trivial'|'simple'|'moderate'|'complex'`
38037
+ }, null, 2);
38038
+ }
38039
+ if (!Number.isInteger(args.task_count) || args.task_count < 1) {
38040
+ return JSON.stringify({
38041
+ success: false,
38042
+ phase,
38043
+ message: "Invalid task_count: must be a positive integer >= 1"
38044
+ }, null, 2);
38045
+ }
38046
+ const summary = args.summary;
38047
+ if (typeof summary !== "string" || summary.trim().length === 0) {
38048
+ return JSON.stringify({
38049
+ success: false,
38050
+ phase,
38051
+ message: "Invalid summary: must be a non-empty string"
38052
+ }, null, 2);
38053
+ }
38054
+ const taskId = args.task_id ?? `retro-${phase}`;
38055
+ const retroEntry = {
38056
+ task_id: taskId,
38057
+ type: "retrospective",
38058
+ timestamp: new Date().toISOString(),
38059
+ agent: "architect",
38060
+ verdict: "pass",
38061
+ summary,
38062
+ metadata: args.metadata,
38063
+ phase_number: phase,
38064
+ total_tool_calls: args.total_tool_calls,
38065
+ coder_revisions: args.coder_revisions,
38066
+ reviewer_rejections: args.reviewer_rejections,
38067
+ test_failures: args.test_failures,
38068
+ security_findings: args.security_findings,
38069
+ integration_issues: args.integration_issues,
38070
+ task_count: args.task_count,
38071
+ task_complexity: args.task_complexity,
38072
+ top_rejection_reasons: args.top_rejection_reasons ?? [],
38073
+ lessons_learned: (args.lessons_learned ?? []).slice(0, 5),
38074
+ user_directives: [],
38075
+ approaches_tried: []
38076
+ };
38077
+ try {
38078
+ await saveEvidence(directory, taskId, retroEntry);
38079
+ return JSON.stringify({
38080
+ success: true,
38081
+ task_id: taskId,
38082
+ phase,
38083
+ message: `Retrospective evidence written to .swarm/evidence/${taskId}/evidence.json`
38084
+ }, null, 2);
38085
+ } catch (error93) {
38086
+ return JSON.stringify({
38087
+ success: false,
38088
+ phase,
38089
+ message: error93 instanceof Error ? error93.message : String(error93)
38090
+ }, null, 2);
38091
+ }
38092
+ }
38093
+ var write_retro = createSwarmTool({
38094
+ description: "Write a retrospective evidence bundle for a completed phase. " + "Accepts flat retro fields and writes a correctly-wrapped EvidenceBundle to " + ".swarm/evidence/retro-{phase}/evidence.json. " + "Use this instead of manually writing retro JSON to avoid schema validation failures in phase_complete.",
38095
+ args: {
38096
+ phase: tool.schema.number().int().positive().describe("The phase number being completed (e.g., 1, 2, 3)"),
38097
+ summary: tool.schema.string().describe("Human-readable summary of the phase"),
38098
+ task_count: tool.schema.number().int().min(1).describe("Count of tasks completed in this phase"),
38099
+ task_complexity: tool.schema.enum(["trivial", "simple", "moderate", "complex"]).describe("Complexity level of the completed tasks"),
38100
+ total_tool_calls: tool.schema.number().int().min(0).describe("Total number of tool calls in this phase"),
38101
+ coder_revisions: tool.schema.number().int().min(0).describe("Number of coder revisions made"),
38102
+ reviewer_rejections: tool.schema.number().int().min(0).describe("Number of reviewer rejections received"),
38103
+ test_failures: tool.schema.number().int().min(0).describe("Number of test failures encountered"),
38104
+ security_findings: tool.schema.number().int().min(0).describe("Number of security findings"),
38105
+ integration_issues: tool.schema.number().int().min(0).describe("Number of integration issues"),
38106
+ lessons_learned: tool.schema.array(tool.schema.string()).max(5).optional().describe("Key lessons learned from this phase (max 5)"),
38107
+ top_rejection_reasons: tool.schema.array(tool.schema.string()).optional().describe("Top reasons for reviewer rejections"),
38108
+ task_id: tool.schema.string().optional().describe("Optional custom task ID (defaults to retro-{phase})"),
38109
+ metadata: tool.schema.record(tool.schema.string(), tool.schema.unknown()).optional().describe("Optional additional metadata")
38110
+ },
38111
+ execute: async (args, directory) => {
38112
+ const rawPhase = args.phase !== undefined ? Number(args.phase) : 0;
38113
+ try {
38114
+ const writeRetroArgs = {
38115
+ phase: Number(args.phase),
38116
+ summary: String(args.summary ?? ""),
38117
+ task_count: Number(args.task_count),
38118
+ task_complexity: args.task_complexity,
38119
+ total_tool_calls: Number(args.total_tool_calls),
38120
+ coder_revisions: Number(args.coder_revisions),
38121
+ reviewer_rejections: Number(args.reviewer_rejections),
38122
+ test_failures: Number(args.test_failures),
38123
+ security_findings: Number(args.security_findings),
38124
+ integration_issues: Number(args.integration_issues),
38125
+ lessons_learned: Array.isArray(args.lessons_learned) ? args.lessons_learned.map(String) : undefined,
38126
+ top_rejection_reasons: Array.isArray(args.top_rejection_reasons) ? args.top_rejection_reasons.map(String) : undefined,
38127
+ task_id: args.task_id !== undefined ? String(args.task_id) : undefined,
38128
+ metadata: args.metadata
38129
+ };
38130
+ return await executeWriteRetro(writeRetroArgs, directory);
38131
+ } catch {
38132
+ return JSON.stringify({ success: false, phase: rawPhase, message: "Invalid arguments" }, null, 2);
38133
+ }
38134
+ }
38135
+ });
38136
+
37961
38137
  // src/commands/index.ts
37962
38138
  var HELP_TEXT = [
37963
38139
  "## Swarm Commands",
@@ -37986,7 +38162,8 @@ var HELP_TEXT = [
37986
38162
  "- `/swarm simulate [--target <glob>]` \u2014 Dry-run impact analysis of proposed changes",
37987
38163
  "- `/swarm knowledge quarantine <id> [reason]` \u2014 Move a knowledge entry to quarantine",
37988
38164
  "- `/swarm knowledge restore <id>` \u2014 Restore a quarantined knowledge entry",
37989
- "- `/swarm knowledge migrate` \u2014 Migrate knowledge entries to the current format"
38165
+ "- `/swarm knowledge migrate` \u2014 Migrate knowledge entries to the current format",
38166
+ "- `/swarm write-retro <json>` \u2014 Write a retrospective evidence bundle for a completed phase"
37990
38167
  ].join(`
37991
38168
  `);
37992
38169
 
@@ -21,6 +21,7 @@ export { handleSimulateCommand } from './simulate';
21
21
  export { handleSpecifyCommand } from './specify';
22
22
  export { handleStatusCommand } from './status';
23
23
  export { handleSyncPlanCommand } from './sync-plan';
24
+ export { handleWriteRetroCommand } from './write_retro';
24
25
  /**
25
26
  * Creates a command.execute.before handler for /swarm commands.
26
27
  * Uses factory pattern to close over directory and agents.
@@ -0,0 +1 @@
1
+ export declare function handleWriteRetroCommand(directory: string, args: string[]): Promise<string>;
package/dist/index.js CHANGED
@@ -45019,6 +45019,188 @@ No active swarm plan found. Nothing to sync.`;
45019
45019
  `);
45020
45020
  }
45021
45021
 
45022
+ // src/tools/write-retro.ts
45023
+ init_tool();
45024
+ init_manager();
45025
+ init_create_tool();
45026
+ async function executeWriteRetro(args2, directory) {
45027
+ const phase = args2.phase;
45028
+ if (!Number.isInteger(phase) || phase < 1) {
45029
+ return JSON.stringify({
45030
+ success: false,
45031
+ phase,
45032
+ message: "Invalid phase: must be a positive integer"
45033
+ }, null, 2);
45034
+ }
45035
+ const validComplexities = [
45036
+ "trivial",
45037
+ "simple",
45038
+ "moderate",
45039
+ "complex"
45040
+ ];
45041
+ if (!validComplexities.includes(args2.task_complexity)) {
45042
+ return JSON.stringify({
45043
+ success: false,
45044
+ phase,
45045
+ message: `Invalid task_complexity: must be one of 'trivial'|'simple'|'moderate'|'complex'`
45046
+ }, null, 2);
45047
+ }
45048
+ if (!Number.isInteger(args2.task_count) || args2.task_count < 1) {
45049
+ return JSON.stringify({
45050
+ success: false,
45051
+ phase,
45052
+ message: "Invalid task_count: must be a positive integer >= 1"
45053
+ }, null, 2);
45054
+ }
45055
+ const summary = args2.summary;
45056
+ if (typeof summary !== "string" || summary.trim().length === 0) {
45057
+ return JSON.stringify({
45058
+ success: false,
45059
+ phase,
45060
+ message: "Invalid summary: must be a non-empty string"
45061
+ }, null, 2);
45062
+ }
45063
+ const taskId = args2.task_id ?? `retro-${phase}`;
45064
+ const retroEntry = {
45065
+ task_id: taskId,
45066
+ type: "retrospective",
45067
+ timestamp: new Date().toISOString(),
45068
+ agent: "architect",
45069
+ verdict: "pass",
45070
+ summary,
45071
+ metadata: args2.metadata,
45072
+ phase_number: phase,
45073
+ total_tool_calls: args2.total_tool_calls,
45074
+ coder_revisions: args2.coder_revisions,
45075
+ reviewer_rejections: args2.reviewer_rejections,
45076
+ test_failures: args2.test_failures,
45077
+ security_findings: args2.security_findings,
45078
+ integration_issues: args2.integration_issues,
45079
+ task_count: args2.task_count,
45080
+ task_complexity: args2.task_complexity,
45081
+ top_rejection_reasons: args2.top_rejection_reasons ?? [],
45082
+ lessons_learned: (args2.lessons_learned ?? []).slice(0, 5),
45083
+ user_directives: [],
45084
+ approaches_tried: []
45085
+ };
45086
+ try {
45087
+ await saveEvidence(directory, taskId, retroEntry);
45088
+ return JSON.stringify({
45089
+ success: true,
45090
+ task_id: taskId,
45091
+ phase,
45092
+ message: `Retrospective evidence written to .swarm/evidence/${taskId}/evidence.json`
45093
+ }, null, 2);
45094
+ } catch (error93) {
45095
+ return JSON.stringify({
45096
+ success: false,
45097
+ phase,
45098
+ message: error93 instanceof Error ? error93.message : String(error93)
45099
+ }, null, 2);
45100
+ }
45101
+ }
45102
+ var write_retro = createSwarmTool({
45103
+ description: "Write a retrospective evidence bundle for a completed phase. " + "Accepts flat retro fields and writes a correctly-wrapped EvidenceBundle to " + ".swarm/evidence/retro-{phase}/evidence.json. " + "Use this instead of manually writing retro JSON to avoid schema validation failures in phase_complete.",
45104
+ args: {
45105
+ phase: tool.schema.number().int().positive().describe("The phase number being completed (e.g., 1, 2, 3)"),
45106
+ summary: tool.schema.string().describe("Human-readable summary of the phase"),
45107
+ task_count: tool.schema.number().int().min(1).describe("Count of tasks completed in this phase"),
45108
+ task_complexity: tool.schema.enum(["trivial", "simple", "moderate", "complex"]).describe("Complexity level of the completed tasks"),
45109
+ total_tool_calls: tool.schema.number().int().min(0).describe("Total number of tool calls in this phase"),
45110
+ coder_revisions: tool.schema.number().int().min(0).describe("Number of coder revisions made"),
45111
+ reviewer_rejections: tool.schema.number().int().min(0).describe("Number of reviewer rejections received"),
45112
+ test_failures: tool.schema.number().int().min(0).describe("Number of test failures encountered"),
45113
+ security_findings: tool.schema.number().int().min(0).describe("Number of security findings"),
45114
+ integration_issues: tool.schema.number().int().min(0).describe("Number of integration issues"),
45115
+ lessons_learned: tool.schema.array(tool.schema.string()).max(5).optional().describe("Key lessons learned from this phase (max 5)"),
45116
+ top_rejection_reasons: tool.schema.array(tool.schema.string()).optional().describe("Top reasons for reviewer rejections"),
45117
+ task_id: tool.schema.string().optional().describe("Optional custom task ID (defaults to retro-{phase})"),
45118
+ metadata: tool.schema.record(tool.schema.string(), tool.schema.unknown()).optional().describe("Optional additional metadata")
45119
+ },
45120
+ execute: async (args2, directory) => {
45121
+ const rawPhase = args2.phase !== undefined ? Number(args2.phase) : 0;
45122
+ try {
45123
+ const writeRetroArgs = {
45124
+ phase: Number(args2.phase),
45125
+ summary: String(args2.summary ?? ""),
45126
+ task_count: Number(args2.task_count),
45127
+ task_complexity: args2.task_complexity,
45128
+ total_tool_calls: Number(args2.total_tool_calls),
45129
+ coder_revisions: Number(args2.coder_revisions),
45130
+ reviewer_rejections: Number(args2.reviewer_rejections),
45131
+ test_failures: Number(args2.test_failures),
45132
+ security_findings: Number(args2.security_findings),
45133
+ integration_issues: Number(args2.integration_issues),
45134
+ lessons_learned: Array.isArray(args2.lessons_learned) ? args2.lessons_learned.map(String) : undefined,
45135
+ top_rejection_reasons: Array.isArray(args2.top_rejection_reasons) ? args2.top_rejection_reasons.map(String) : undefined,
45136
+ task_id: args2.task_id !== undefined ? String(args2.task_id) : undefined,
45137
+ metadata: args2.metadata
45138
+ };
45139
+ return await executeWriteRetro(writeRetroArgs, directory);
45140
+ } catch {
45141
+ return JSON.stringify({ success: false, phase: rawPhase, message: "Invalid arguments" }, null, 2);
45142
+ }
45143
+ }
45144
+ });
45145
+
45146
+ // src/commands/write_retro.ts
45147
+ async function handleWriteRetroCommand(directory, args2) {
45148
+ if (args2.length === 0 || !args2[0] || args2[0].trim() === "") {
45149
+ return `## Usage: /swarm write-retro <json>
45150
+
45151
+ Writes a retrospective evidence bundle for a completed phase.
45152
+
45153
+ ### Required JSON fields:
45154
+ \`\`\`json
45155
+ {
45156
+ "phase": 1,
45157
+ "summary": "Phase summary here",
45158
+ "task_count": 3,
45159
+ "task_complexity": "simple",
45160
+ "total_tool_calls": 20,
45161
+ "coder_revisions": 1,
45162
+ "reviewer_rejections": 0,
45163
+ "test_failures": 0,
45164
+ "security_findings": 0,
45165
+ "integration_issues": 0
45166
+ }
45167
+ \`\`\`
45168
+
45169
+ ### Optional fields:
45170
+ - \`lessons_learned\`: string[] (max 5)
45171
+ - \`top_rejection_reasons\`: string[]
45172
+ - \`task_id\`: string (defaults to \`retro-{phase}\`)
45173
+ - \`metadata\`: Record<string, unknown>
45174
+
45175
+ ### task_complexity values: trivial | simple | moderate | complex`;
45176
+ }
45177
+ let parsedArgs;
45178
+ try {
45179
+ const jsonObj = JSON.parse(args2[0]);
45180
+ if (typeof jsonObj !== "object" || jsonObj === null || Array.isArray(jsonObj)) {
45181
+ return "Error: Invalid JSON \u2014 expected a JSON object with retro fields. Run `/swarm write-retro` with no arguments to see usage.";
45182
+ }
45183
+ parsedArgs = jsonObj;
45184
+ } catch {
45185
+ return "Error: Invalid JSON \u2014 expected a JSON object with retro fields. Run `/swarm write-retro` with no arguments to see usage.";
45186
+ }
45187
+ const resultJson = await executeWriteRetro(parsedArgs, directory);
45188
+ let result;
45189
+ try {
45190
+ result = JSON.parse(resultJson);
45191
+ } catch {
45192
+ return "Error: Failed to parse result from write-retro tool.";
45193
+ }
45194
+ if (result.success === true) {
45195
+ return `## Retrospective Written
45196
+
45197
+ Phase **${result.phase ?? "unknown"}** retrospective saved to \`.swarm/evidence/${result.task_id ?? "unknown"}/evidence.json\`.
45198
+
45199
+ Run \`/swarm evidence ${result.task_id ?? "unknown"}\` to view it, or \`/swarm status\` to check phase_complete readiness.`;
45200
+ }
45201
+ return `Error: ${result.message}`;
45202
+ }
45203
+
45022
45204
  // src/commands/index.ts
45023
45205
  var HELP_TEXT = [
45024
45206
  "## Swarm Commands",
@@ -45047,7 +45229,8 @@ var HELP_TEXT = [
45047
45229
  "- `/swarm simulate [--target <glob>]` \u2014 Dry-run impact analysis of proposed changes",
45048
45230
  "- `/swarm knowledge quarantine <id> [reason]` \u2014 Move a knowledge entry to quarantine",
45049
45231
  "- `/swarm knowledge restore <id>` \u2014 Restore a quarantined knowledge entry",
45050
- "- `/swarm knowledge migrate` \u2014 Migrate knowledge entries to the current format"
45232
+ "- `/swarm knowledge migrate` \u2014 Migrate knowledge entries to the current format",
45233
+ "- `/swarm write-retro <json>` \u2014 Write a retrospective evidence bundle for a completed phase"
45051
45234
  ].join(`
45052
45235
  `);
45053
45236
  function createSwarmCommandHandler(directory, agents) {
@@ -45133,6 +45316,9 @@ function createSwarmCommandHandler(directory, agents) {
45133
45316
  case "dark-matter":
45134
45317
  text = await handleDarkMatterCommand(directory, args2);
45135
45318
  break;
45319
+ case "write-retro":
45320
+ text = await handleWriteRetroCommand(directory, args2);
45321
+ break;
45136
45322
  case "knowledge": {
45137
45323
  const [knowledgeSubcmd, ...knowledgeArgs] = args2;
45138
45324
  if (knowledgeSubcmd === "quarantine") {
@@ -24,3 +24,4 @@ export { symbols } from './symbols';
24
24
  export { type SyntaxCheckFileResult, type SyntaxCheckInput, type SyntaxCheckResult, syntaxCheck, } from './syntax-check';
25
25
  export { test_runner } from './test-runner';
26
26
  export { todo_extract } from './todo-extract';
27
+ export { executeWriteRetro, write_retro } from './write-retro';
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Write retro tool for persisting retrospective evidence bundles.
3
+ * Accepts flat retro fields from the Architect and wraps them correctly
4
+ * in a RetrospectiveEvidence entry before calling saveEvidence().
5
+ * This fixes the bug where Architect was writing flat JSON that failed EvidenceBundleSchema.parse().
6
+ */
7
+ import { type ToolDefinition } from '@opencode-ai/plugin/tool';
8
+ /**
9
+ * Arguments for the write_retro tool
10
+ * User-supplied fields (the Architect provides these)
11
+ */
12
+ export interface WriteRetroArgs {
13
+ /** The phase number being completed (maps to phase_number in schema) */
14
+ phase: number;
15
+ /** Human-readable phase summary (maps to summary in BaseEvidenceSchema) */
16
+ summary: string;
17
+ /** Count of tasks completed */
18
+ task_count: number;
19
+ /** Task complexity level */
20
+ task_complexity: 'trivial' | 'simple' | 'moderate' | 'complex';
21
+ /** Total number of tool calls in the phase */
22
+ total_tool_calls: number;
23
+ /** Number of coder revisions made */
24
+ coder_revisions: number;
25
+ /** Number of reviewer rejections received */
26
+ reviewer_rejections: number;
27
+ /** Number of test failures encountered */
28
+ test_failures: number;
29
+ /** Number of security findings */
30
+ security_findings: number;
31
+ /** Number of integration issues */
32
+ integration_issues: number;
33
+ /** Optional lessons learned (max 5) */
34
+ lessons_learned?: string[];
35
+ /** Optional top rejection reasons */
36
+ top_rejection_reasons?: string[];
37
+ /** Optional task ID (defaults to retro-{phase}) */
38
+ task_id?: string;
39
+ /** Optional metadata */
40
+ metadata?: Record<string, unknown>;
41
+ }
42
+ /**
43
+ * Execute the write_retro tool.
44
+ * Validates input, builds a RetrospectiveEvidence entry, and saves to disk.
45
+ * @param args - The write retro arguments
46
+ * @param directory - Working directory
47
+ * @returns JSON string with success status and details
48
+ */
49
+ export declare function executeWriteRetro(args: WriteRetroArgs, directory: string): Promise<string>;
50
+ /**
51
+ * Tool definition for write_retro
52
+ */
53
+ export declare const write_retro: ToolDefinition;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-swarm",
3
- "version": "6.18.0",
3
+ "version": "6.18.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",