@claude-flow/cli 3.56.1 → 3.56.2

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": {
3
- "version": "3.56.1",
3
+ "version": "3.56.2",
4
4
  "files": {
5
5
  "auto-memory-hook.mjs": "c8d218526a3c34034c2a69de23f507f0eb0f70d59c16426a8edc849e6ac22529",
6
6
  "hook-handler.cjs": "34d2aacfb59a73ff94b1467bb57ab9d9c4af89c0e470aadf3bd0d74a503a658d",
@@ -9,6 +9,6 @@
9
9
  "router.cjs": "16648b3c0d73b6681ac2d8d13def6a68286c57f5a11004de5b19a0fa088c833d"
10
10
  }
11
11
  },
12
- "signature": "eGhCbWbSEhufQTLyjtRuSNc3JX1kDYCMAbqj/mn4IpYUOX+pi9Xs5lPAo/kVgVolhF1JRspGhzFi3Y8spw0EBw==",
12
+ "signature": "03RFXZ6Pjgky6pMS4AtU7Ba4ohrtwT67+aH8+COTVfhl5eZ0R1LsSXrGfMlROX+5U+FRlrbGoEaiNmNOhHRPDg==",
13
13
  "algorithm": "ed25519"
14
14
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "generation": 7,
4
- "generatedAt": "2026-10-09T04:37:42.484Z",
5
- "gitSha": "58e0ae7e",
4
+ "generatedAt": "2026-10-09T17:22:50.548Z",
5
+ "gitSha": "9f97475f",
6
6
  "catalog": {
7
7
  "agents": 176,
8
8
  "tools": 423,
@@ -4,5 +4,10 @@
4
4
  * Tool definitions for task management with file persistence.
5
5
  */
6
6
  import { type MCPTool } from './types.js';
7
+ export declare const TASK_STATUSES: readonly ["pending", "in_progress", "completed", "failed", "cancelled"];
8
+ type TaskStatus = (typeof TASK_STATUSES)[number];
9
+ /** The canonical status for a written one (trimmed, any case, known aliases), or null when it is none of the five. */
10
+ export declare function statusOf(value: unknown): TaskStatus | null;
7
11
  export declare const taskTools: MCPTool[];
12
+ export {};
8
13
  //# sourceMappingURL=task-tools.d.ts.map
@@ -12,6 +12,21 @@ import { validateIdentifier, validateText } from './validate-input.js';
12
12
  const STORAGE_DIR = '.claude-flow';
13
13
  const TASK_DIR = 'tasks';
14
14
  const TASK_FILE = 'store.json';
15
+ export const TASK_STATUSES = ['pending', 'in_progress', 'completed', 'failed', 'cancelled'];
16
+ // Spellings agents write for the same five states (seen in the wild: "complete").
17
+ const STATUS_ALIASES = {
18
+ complete: 'completed', done: 'completed', canceled: 'cancelled',
19
+ running: 'in_progress', 'in-progress': 'in_progress', inprogress: 'in_progress',
20
+ };
21
+ /** The canonical status for a written one (trimmed, any case, known aliases), or null when it is none of the five. */
22
+ export function statusOf(value) {
23
+ if (typeof value !== 'string')
24
+ return null;
25
+ const key = value.trim().toLowerCase();
26
+ if (TASK_STATUSES.includes(key))
27
+ return key;
28
+ return Object.hasOwn(STATUS_ALIASES, key) ? STATUS_ALIASES[key] : null;
29
+ }
15
30
  function getTaskDir() {
16
31
  return join(getProjectCwd(), STORAGE_DIR, TASK_DIR);
17
32
  }
@@ -290,7 +305,9 @@ export const taskTools = [
290
305
  type: 'object',
291
306
  properties: {
292
307
  taskId: { type: 'string', description: 'Task ID' },
293
- status: { type: 'string', description: 'New status' },
308
+ // No schema enum: the HTTP/WebSocket registry validates enums before the handler, which would refuse the aliases there
309
+ // while stdio accepted them. The handler is the one place that normalises and refuses, for every transport.
310
+ status: { type: 'string', description: 'New status: pending, in_progress, completed, failed or cancelled' },
294
311
  progress: { type: 'number', description: 'Progress percentage (0-100)' },
295
312
  assignTo: { type: 'array', items: { type: 'string' }, description: 'Agent IDs to assign' },
296
313
  result: { type: 'object', description: 'Result data (e.g. the failure of a failed task)' },
@@ -302,26 +319,52 @@ export const taskTools = [
302
319
  const vId = validateIdentifier(input.taskId, 'taskId');
303
320
  if (!vId.valid)
304
321
  return { success: false, error: vId.error };
322
+ // A status outside the five is stored as written otherwise, and every reader that buckets
323
+ // by status (task_list filters, the console kanban) then miscounts it: "complete" read as pending.
324
+ const status = input.status === undefined ? undefined : statusOf(input.status);
325
+ if (status === null) {
326
+ return { success: false, error: `status must be one of ${TASK_STATUSES.join(', ')}` };
327
+ }
305
328
  const store = loadTaskStore();
306
329
  const taskId = input.taskId;
307
330
  const task = store.tasks[taskId];
308
331
  if (task) {
309
- if (input.status) {
310
- const newStatus = input.status;
332
+ // Worker effects run AFTER the task store is saved, as task_complete does: a failed save must not leave
333
+ // workers freed and counted against a task that still reads unfinished.
334
+ let afterSave;
335
+ if (status !== undefined) {
336
+ const newStatus = status;
337
+ const wasCompleted = task.status === 'completed';
311
338
  task.status = newStatus;
312
339
  if (newStatus === 'in_progress' && !task.startedAt) {
313
340
  task.startedAt = new Date().toISOString();
314
341
  }
315
- // A failed task frees its workers, as task_complete and task_cancel do;
316
- // otherwise a worker whose run failed stays `busy` forever.
317
- if (newStatus === 'failed') {
342
+ // A finished task frees its workers, as task_complete and task_cancel do; otherwise a worker
343
+ // whose task was finished through task_update stays `busy` forever, and a later task_complete
344
+ // returns early because the status already reads completed.
345
+ if (newStatus === 'failed' || newStatus === 'cancelled') {
346
+ task.completedAt = new Date().toISOString();
347
+ afterSave = () => releaseAgents(task.assignedTo, taskId);
348
+ }
349
+ if (newStatus === 'completed' && !wasCompleted) {
318
350
  task.completedAt = new Date().toISOString();
319
- releaseAgents(task.assignedTo, taskId);
351
+ // Credited only to a worker still holding this task, so complete -> pending -> complete
352
+ // (no reassignment in between) never counts the same work twice.
353
+ afterSave = () => updateAgents(task.assignedTo, (agent) => {
354
+ if (agent.currentTask === taskId) {
355
+ agent.status = 'idle';
356
+ agent.currentTask = null;
357
+ agent.taskCount = (agent.taskCount || 0) + 1;
358
+ }
359
+ });
320
360
  }
321
361
  }
322
362
  if (typeof input.progress === 'number') {
323
363
  task.progress = Math.min(100, Math.max(0, input.progress));
324
364
  }
365
+ // Completing is 100% whatever progress the same call carried.
366
+ if (task.status === 'completed')
367
+ task.progress = 100;
325
368
  if (input.assignTo) {
326
369
  task.assignedTo = input.assignTo;
327
370
  }
@@ -329,6 +372,7 @@ export const taskTools = [
329
372
  task.result = input.result;
330
373
  }
331
374
  saveTaskStore(store);
375
+ afterSave?.();
332
376
  return {
333
377
  success: true,
334
378
  taskId: task.taskId,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claude-flow/cli",
3
- "version": "3.56.1",
3
+ "version": "3.56.2",
4
4
  "type": "module",
5
5
  "description": "Ruflo CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
6
6
  "main": "dist/src/index.js",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ruflo-metaharness",
3
3
  "description": "MetaHarness integration for ruflo — surfaces score/genome/mint/mcp-scan/threat-model via skills; pairs with @metaharness/router (ADR-148/149) for cost-optimal model routing; honors ADR-150's architectural constraint that MetaHarness remains an optional augmentation, never a required runtime dependency. As a mod (ADR-445): confirms flywheel promotion, keeps secrets out of inputs, /metaharness-mod, and a status file the console shows",
4
- "version": "0.2.4",
4
+ "version": "0.2.5",
5
5
  "author": {
6
6
  "name": "ruvnet",
7
7
  "url": "https://github.com/ruvnet"
@@ -2,6 +2,9 @@
2
2
 
3
3
  Newest first. One `## <version> — <date>` heading per version, then `feat:`, `fix:`, `breaking:` and `chore:` bullets (ADR-478). Built from git history; this is the whole history.
4
4
 
5
+ ## 0.2.5 — 2026-10-09
6
+ - fix: seven harness-* skill descriptions no longer carry angle-bracket placeholders (claude.ai strips them as XML tags)
7
+
5
8
  ## 0.2.4 — 2026-10-07
6
9
  - fix: run the installed ruflo CLI before `npx @claude-flow/cli@latest` in cost-tracker, adr and metaharness
7
10
  - chore: 3.55.0 versions, leaf pins, lockfiles, plugin bumps, changelog
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # Structural smoke test for ruflo-metaharness v0.2.4 (ADR-150 Phase 1).
2
+ # Structural smoke test for ruflo-metaharness v0.2.5 (ADR-150 Phase 1).
3
3
  set -u
4
4
  ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
5
  PASS=0
@@ -32,10 +32,10 @@ else
32
32
  bad "extraction-regex-rot: EXPECTED_TOOLS=$EXPECTED_TOOLS EXPECTED_SUBS=$EXPECTED_SUBS"
33
33
  fi
34
34
 
35
- step "1. plugin.json declares 0.2.4 with adr-150 keywords"
35
+ step "1. plugin.json declares 0.2.5 with adr-150 keywords"
36
36
  v=$(grep -E '"version"' "$ROOT/.claude-plugin/plugin.json" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
37
- if [[ "$v" != "0.2.4" ]]; then
38
- bad "expected 0.2.4, got '$v'"
37
+ if [[ "$v" != "0.2.5" ]]; then
38
+ bad "expected 0.2.5, got '$v'"
39
39
  else
40
40
  miss=""
41
41
  for k in ruflo metaharness harness scorecard genome mcp-scan threat-model router adr-150 adr-148 adr-149 optional-dependency graceful-degradation subprocess phase-1-mvp; do
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-bench
3
- description: Manage `@metaharness/darwin` bench suites — `bench create <repo>` scaffolds a JSON suite from a repo's test corpus; `bench verify <suite.json>` checks suite well-formedness. Bench suites are the fixed evaluation corpora that `harness-evolve --bench <suite.json>` scores variants against, decoupling evolution from the repo's natural tests. Degrades gracefully when @metaharness/darwin is absent.
3
+ description: Manage `@metaharness/darwin` bench suites — `bench create {repo}` scaffolds a JSON suite from a repo's test corpus; `bench verify {suite.json}` checks suite well-formedness. Bench suites are the fixed evaluation corpora that `harness-evolve --bench {suite.json}` scores variants against, decoupling evolution from the repo's natural tests. Degrades gracefully when @metaharness/darwin is absent.
4
4
  argument-hint: "--op create --repo <path> [--out <path>] | --op verify --suite <path>"
5
5
  allowed-tools: Bash
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-evolve
3
- description: Run `@metaharness/darwin evolve <repo>` to mutate a harness's seven policy surfaces (planner/contextBuilder/reviewer/retryPolicy/toolPolicy/memoryPolicy/scorePolicy), sandbox-score each variant, and promote only measured wins. The model is frozen; the harness evolves. Closes the loop ADR-150 opens (score+genome describe; evolve changes). Degrades gracefully when @metaharness/darwin is absent (ADR-150 + ADR-153 architectural constraints).
3
+ description: Run `@metaharness/darwin evolve {repo}` to mutate a harness's seven policy surfaces (planner/contextBuilder/reviewer/retryPolicy/toolPolicy/memoryPolicy/scorePolicy), sandbox-score each variant, and promote only measured wins. The model is frozen; the harness evolves. Closes the loop ADR-150 opens (score+genome describe; evolve changes). Degrades gracefully when @metaharness/darwin is absent (ADR-150 + ADR-153 architectural constraints).
4
4
  argument-hint: "--repo <path> [--generations 3] [--children 3] [--concurrency 2] [--sandbox real|mock|agent] [--selection pareto|quality-diversity|...] [--mutator deterministic|ruvllm] [--diagnose] [--confirm]"
5
5
  allowed-tools: Bash
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-genome
3
- description: 7-section repo readiness report from `metaharness genome <path>`. Returns repo_type / agent_topology / risk_score / mcp_surface / test_confidence / publish_readiness. Pure-read; degrades gracefully (ADR-150).
3
+ description: 7-section repo readiness report from `metaharness genome {path}`. Returns repo_type / agent_topology / risk_score / mcp_surface / test_confidence / publish_readiness. Pure-read; degrades gracefully (ADR-150).
4
4
  argument-hint: "[--path .] [--alert-on-risk-above 0.5] [--format table|json]"
5
5
  allowed-tools: Bash
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-mcp-scan
3
- description: Static security scan of a harness's declared MCP surface via `harness mcp-scan <path>`. Reads `.mcp/servers.json` + `.harness/claims.json`. Pure-read, no dispatch. Exits 1 on findings at or above `--fail-on` severity.
3
+ description: Static security scan of a harness's declared MCP surface via `harness mcp-scan {path}`. Reads `.mcp/servers.json` + `.harness/claims.json`. Pure-read, no dispatch. Exits 1 on findings at or above `--fail-on` severity.
4
4
  argument-hint: "[--path .] [--fail-on low|medium|high] [--format table|json]"
5
5
  allowed-tools: Bash
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-mint
3
- description: Scaffold a custom AI agent harness via `metaharness new <name> --template <id> --host <id>`. Defaults to DRY-RUN (no writes) unless --confirm is passed. Refuses to write to the calling repo root or anywhere inside it. Honors ADR-150 architectural constraint + ruflo's "destructive-action confirmation" pattern.
3
+ description: Scaffold a custom AI agent harness via `metaharness new {name} --template {id} --host {id}`. Defaults to DRY-RUN (no writes) unless --confirm is passed. Refuses to write to the calling repo root or anywhere inside it. Honors ADR-150 architectural constraint + ruflo's "destructive-action confirmation" pattern.
4
4
  argument-hint: "--name <id> --template <vertical:coding|minimal|…> [--host claude-code|codex|…] [--target /abs/path] [--confirm] [--format table|json]"
5
5
  allowed-tools: Bash
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-score
3
- description: 5-dimension harness readiness scorecard from `metaharness score <path>`. Returns harnessFit / compileConfidence / taskCoverage / toolSafety / memoryUsefulness + estCostPerRunUsd + scaffoldReady. Pure-read; subprocess invocation; degrades gracefully when MetaHarness is absent (ADR-150 architectural constraint).
3
+ description: 5-dimension harness readiness scorecard from `metaharness score {path}`. Returns harnessFit / compileConfidence / taskCoverage / toolSafety / memoryUsefulness + estCostPerRunUsd + scaffoldReady. Pure-read; subprocess invocation; degrades gracefully when MetaHarness is absent (ADR-150 architectural constraint).
4
4
  argument-hint: "[--path .] [--alert-on-fit-below 70] [--format table|json]"
5
5
  allowed-tools: Bash
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-threat-model
3
- description: Enterprise-review-grade threat model from `harness threat-model <path>`. Categorizes MCP-surface threats; emits `worst: 'clean'|'low'|'medium'|'high'` + per-threat findings. Pure-read.
3
+ description: Enterprise-review-grade threat model from `harness threat-model {path}`. Categorizes MCP-surface threats; emits `worst: 'clean'|'low'|'medium'|'high'` + per-threat findings. Pure-read.
4
4
  argument-hint: "[--path .] [--fail-on clean|low|medium|high] [--format table|json]"
5
5
  allowed-tools: Bash
6
6
  ---