@cleocode/cleo 2026.4.152 → 2026.4.153

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
@@ -385,7 +385,18 @@ var init_branch_lock = __esm({
385
385
  /** L4c: override requires TTY but stdin/stderr is not a TTY. */
386
386
  E_OVERRIDE_NEEDS_TTY: "E_OVERRIDE_NEEDS_TTY",
387
387
  /** L4d: session override limit exceeded. */
388
- E_OVERRIDE_RATE_LIMIT: "E_OVERRIDE_RATE_LIMIT"
388
+ E_OVERRIDE_RATE_LIMIT: "E_OVERRIDE_RATE_LIMIT",
389
+ /**
390
+ * T1501 / P0-5: per-session cap (default 3) exceeded without a valid waiver doc.
391
+ * Set CLEO_OWNER_OVERRIDE_WAIVER=<absolute path> to a file containing
392
+ * `cap-waiver: true` in its frontmatter to bypass the cap.
393
+ */
394
+ E_OVERRIDE_CAP_EXCEEDED: "E_OVERRIDE_CAP_EXCEEDED",
395
+ /**
396
+ * T1502 / P0-6: the same evidence atom was used across >3 distinct tasks and
397
+ * `--shared-evidence` was not passed (or CLEO_STRICT_EVIDENCE=1 is set in CI).
398
+ */
399
+ E_SHARED_EVIDENCE_FLAG_REQUIRED: "E_SHARED_EVIDENCE_FLAG_REQUIRED"
389
400
  };
390
401
  }
391
402
  });
@@ -5290,6 +5301,32 @@ var init_registry = __esm({
5290
5301
  }
5291
5302
  ]
5292
5303
  },
5304
+ // T1147 W7 — sweep mutate variant (approve, rollback) — routes to same handler as query
5305
+ // Registered separately so mutate:memory.sweep resolves correctly (T1496/P0-1)
5306
+ {
5307
+ gateway: "mutate",
5308
+ domain: "memory",
5309
+ operation: "sweep",
5310
+ description: "memory.sweep (mutate) \u2014 T1147 W7 BRAIN noise sweep approve/rollback. approve <runId>: apply sweep to live brain tables. rollback <runId>: discard a staged run without applying changes.",
5311
+ tier: 0,
5312
+ idempotent: false,
5313
+ sessionRequired: false,
5314
+ requiredParams: [],
5315
+ params: [
5316
+ {
5317
+ name: "approve",
5318
+ type: "string",
5319
+ required: false,
5320
+ description: "Run ID to approve and apply to live tables."
5321
+ },
5322
+ {
5323
+ name: "rollback",
5324
+ type: "string",
5325
+ required: false,
5326
+ description: "Run ID to roll back without applying changes."
5327
+ }
5328
+ ]
5329
+ },
5293
5330
  // T791 — LLM extraction backend status
5294
5331
  {
5295
5332
  gateway: "query",
@@ -8563,6 +8600,25 @@ var init_registry = __esm({
8563
8600
  description: "Remove worktrees idle for longer than this many hours (default: 24)"
8564
8601
  }
8565
8602
  ]
8603
+ },
8604
+ // T1462 — Single-task worktree prune (auto-triggered by cleo complete)
8605
+ {
8606
+ gateway: "mutate",
8607
+ domain: "orchestrate",
8608
+ operation: "worktree.prune",
8609
+ description: "orchestrate.worktree.prune (mutate) \u2014 prune the worktree for a single completed task, or all orphaned worktrees when no taskId is supplied",
8610
+ tier: 2,
8611
+ idempotent: true,
8612
+ sessionRequired: false,
8613
+ requiredParams: [],
8614
+ params: [
8615
+ {
8616
+ name: "taskId",
8617
+ type: "string",
8618
+ required: false,
8619
+ description: "Task ID whose worktree should be pruned (omit for bulk prune)"
8620
+ }
8621
+ ]
8566
8622
  }
8567
8623
  ];
8568
8624
  counts = getCounts();
@@ -9584,6 +9640,7 @@ import {
9584
9640
  paginate,
9585
9641
  parseScope,
9586
9642
  persistHandoff,
9643
+ readSessionOverrideCount,
9587
9644
  recordAssumption,
9588
9645
  recordDecision,
9589
9646
  showSession,
@@ -9598,12 +9655,14 @@ async function sessionStatus(projectRoot) {
9598
9655
  const focusState = await accessor.getMetaValue("focus_state");
9599
9656
  const sessions2 = await accessor.loadSessions();
9600
9657
  const active = sessions2.find((s) => s.status === "active");
9658
+ const overrideCount = active ? readSessionOverrideCount(projectRoot, active.id) : 0;
9601
9659
  return {
9602
9660
  success: true,
9603
9661
  data: {
9604
9662
  hasActiveSession: !!active,
9605
9663
  session: active || null,
9606
- taskWork: focusState || null
9664
+ taskWork: focusState || null,
9665
+ overrideCount
9607
9666
  }
9608
9667
  };
9609
9668
  } catch {
@@ -14605,8 +14664,10 @@ import {
14605
14664
  import {
14606
14665
  appendForceBypassLine,
14607
14666
  appendGateAuditLine,
14667
+ checkAndIncrementOverrideCap,
14608
14668
  checkGateEvidenceMinimum,
14609
14669
  composeGateEvidence,
14670
+ enforceSharedEvidence,
14610
14671
  getAccessor as getAccessor7,
14611
14672
  parseEvidence,
14612
14673
  validateAtom
@@ -15111,6 +15172,44 @@ async function validateGateVerify(params, projectRoot) {
15111
15172
  }
15112
15173
  const isWriteRequiringEvidence = (all || gate && value !== false) && !reset;
15113
15174
  const override = readOverrideState();
15175
+ let sessionOverrideOrdinal;
15176
+ let isWorktreeCtx = false;
15177
+ if (override.override && isWriteRequiringEvidence) {
15178
+ const command = (process.argv.slice(1).join(" ") || "cleo").slice(0, 512);
15179
+ const capResult = checkAndIncrementOverrideCap(
15180
+ root,
15181
+ sessionId ?? "global",
15182
+ void 0,
15183
+ command
15184
+ );
15185
+ if (!capResult.allowed) {
15186
+ return engineError(
15187
+ capResult.errorCode ?? "E_OVERRIDE_CAP_EXCEEDED",
15188
+ capResult.errorMessage ?? "Per-session override cap exceeded."
15189
+ );
15190
+ }
15191
+ sessionOverrideOrdinal = capResult.sessionOverrideOrdinal;
15192
+ isWorktreeCtx = capResult.workTreeContext === true;
15193
+ }
15194
+ let sharedEvidenceAcknowledged = false;
15195
+ let sharedAtomWarned = false;
15196
+ if (isWriteRequiringEvidence && !override.override && params.evidence && sessionId) {
15197
+ const seResult = enforceSharedEvidence(
15198
+ root,
15199
+ sessionId,
15200
+ taskId,
15201
+ params.evidence,
15202
+ params.sharedEvidence === true
15203
+ );
15204
+ if (!seResult.allowed) {
15205
+ return engineError(
15206
+ seResult.errorCode ?? "E_SHARED_EVIDENCE_FLAG_REQUIRED",
15207
+ seResult.errorMessage ?? "Shared evidence flag required."
15208
+ );
15209
+ }
15210
+ sharedEvidenceAcknowledged = seResult.acknowledged === true;
15211
+ sharedAtomWarned = seResult.warned === true;
15212
+ }
15114
15213
  let verification = task.verification ?? initVerification();
15115
15214
  if (!verification.evidence) {
15116
15215
  verification.evidence = {};
@@ -15225,7 +15324,18 @@ Or set CLEO_OWNER_OVERRIDE=1 with CLEO_OWNER_OVERRIDE_REASON=<reason> for emerge
15225
15324
  ...auditRecord,
15226
15325
  overrideReason: override.reason,
15227
15326
  pid: process.pid,
15228
- command: (process.argv.slice(1).join(" ") || "cleo").slice(0, 512)
15327
+ command: (process.argv.slice(1).join(" ") || "cleo").slice(0, 512),
15328
+ ...sessionOverrideOrdinal !== void 0 ? { sessionOverrideOrdinal } : {},
15329
+ ...isWorktreeCtx ? { workTreeContext: true } : {}
15330
+ });
15331
+ } else if ((sharedEvidenceAcknowledged || sharedAtomWarned) && action !== "reset") {
15332
+ await appendForceBypassLine(root, {
15333
+ ...auditRecord,
15334
+ overrideReason: "shared-evidence",
15335
+ pid: process.pid,
15336
+ command: (process.argv.slice(1).join(" ") || "cleo").slice(0, 512),
15337
+ ...sharedEvidenceAcknowledged ? { sharedEvidence: true } : {},
15338
+ ...sharedAtomWarned ? { sharedAtomWarning: true } : {}
15229
15339
  });
15230
15340
  }
15231
15341
  } catch {
@@ -17729,7 +17839,8 @@ var init_check = __esm({
17729
17839
  all: params.all,
17730
17840
  reset: params.reset,
17731
17841
  evidence: params.evidence,
17732
- sessionId: params.sessionId
17842
+ sessionId: params.sessionId,
17843
+ sharedEvidence: params.sharedEvidence
17733
17844
  };
17734
17845
  const result = await validateGateVerify(gateParams, projectRoot);
17735
17846
  setImmediate(async () => {
@@ -19273,7 +19384,7 @@ var init_memory2 = __esm({
19273
19384
  switch (operation) {
19274
19385
  case "find": {
19275
19386
  const query = paramStringRequired(params, "query");
19276
- if (!query) {
19387
+ if (!query)
19277
19388
  return errorResult(
19278
19389
  "query",
19279
19390
  "memory",
@@ -19282,24 +19393,27 @@ var init_memory2 = __esm({
19282
19393
  "query is required",
19283
19394
  startTime
19284
19395
  );
19285
- }
19286
- const result = await memoryFind(
19287
- {
19288
- query,
19289
- limit: paramNumber(params, "limit"),
19290
- tables: paramStringArray(params, "tables"),
19291
- dateStart: paramString(params, "dateStart"),
19292
- dateEnd: paramString(params, "dateEnd"),
19293
- // T418: optional agent filter for per-agent mental model retrieval
19294
- agent: paramString(params, "agent")
19295
- },
19296
- projectRoot
19396
+ return wrapResult(
19397
+ await memoryFind(
19398
+ {
19399
+ query,
19400
+ limit: paramNumber(params, "limit"),
19401
+ tables: paramStringArray(params, "tables"),
19402
+ dateStart: paramString(params, "dateStart"),
19403
+ dateEnd: paramString(params, "dateEnd"),
19404
+ agent: paramString(params, "agent")
19405
+ },
19406
+ projectRoot
19407
+ ),
19408
+ "query",
19409
+ "memory",
19410
+ operation,
19411
+ startTime
19297
19412
  );
19298
- return wrapResult(result, "query", "memory", operation, startTime);
19299
19413
  }
19300
19414
  case "timeline": {
19301
19415
  const anchor = paramStringRequired(params, "anchor");
19302
- if (!anchor) {
19416
+ if (!anchor)
19303
19417
  return errorResult(
19304
19418
  "query",
19305
19419
  "memory",
@@ -19308,20 +19422,24 @@ var init_memory2 = __esm({
19308
19422
  "anchor is required",
19309
19423
  startTime
19310
19424
  );
19311
- }
19312
- const result = await memoryTimeline(
19313
- {
19314
- anchor,
19315
- depthBefore: paramNumber(params, "depthBefore"),
19316
- depthAfter: paramNumber(params, "depthAfter")
19317
- },
19318
- projectRoot
19425
+ return wrapResult(
19426
+ await memoryTimeline(
19427
+ {
19428
+ anchor,
19429
+ depthBefore: paramNumber(params, "depthBefore"),
19430
+ depthAfter: paramNumber(params, "depthAfter")
19431
+ },
19432
+ projectRoot
19433
+ ),
19434
+ "query",
19435
+ "memory",
19436
+ operation,
19437
+ startTime
19319
19438
  );
19320
- return wrapResult(result, "query", "memory", operation, startTime);
19321
19439
  }
19322
19440
  case "fetch": {
19323
19441
  const ids = paramStringArray(params, "ids");
19324
- if (!ids || ids.length === 0) {
19442
+ if (!ids || ids.length === 0)
19325
19443
  return errorResult(
19326
19444
  "query",
19327
19445
  "memory",
@@ -19330,9 +19448,13 @@ var init_memory2 = __esm({
19330
19448
  "ids is required (non-empty array)",
19331
19449
  startTime
19332
19450
  );
19333
- }
19334
- const result = await memoryFetch({ ids }, projectRoot);
19335
- return wrapResult(result, "query", "memory", operation, startTime);
19451
+ return wrapResult(
19452
+ await memoryFetch({ ids }, projectRoot),
19453
+ "query",
19454
+ "memory",
19455
+ operation,
19456
+ startTime
19457
+ );
19336
19458
  }
19337
19459
  case "decision.find": {
19338
19460
  const result = await memoryDecisionFind(
@@ -20786,6 +20908,10 @@ var init_memory2 = __esm({
20786
20908
  return handleErrorResult("mutate", "memory", operation, rollbackErr, startTime);
20787
20909
  }
20788
20910
  }
20911
+ // T1147 W7 — sweep mutate operations (approve, rollback) delegate to query handler
20912
+ // which already handles all sweep sub-commands via a unified case block.
20913
+ case "sweep":
20914
+ return this.query(operation, params);
20789
20915
  default:
20790
20916
  return unsupportedOp("mutate", "memory", operation, startTime);
20791
20917
  }
@@ -20862,6 +20988,8 @@ var init_memory2 = __esm({
20862
20988
  "precompact-flush",
20863
20989
  // T1006 — write a diary-typed observation
20864
20990
  "diary.write",
20991
+ // T1147 W7 — sweep mutate operations (approve, rollback)
20992
+ "sweep",
20865
20993
  // T1003 — staged backfill operations
20866
20994
  "backfill.run",
20867
20995
  "backfill.approve",
@@ -21692,6 +21820,45 @@ import {
21692
21820
  getNexusNativeDb as getNexusNativeDb2,
21693
21821
  getProjectRoot as getProjectRoot7
21694
21822
  } from "@cleocode/core/internal";
21823
+ function nexusQueryEnvelopeToResponse(envelope, operation, startTime) {
21824
+ const env = envelope;
21825
+ let pageMetadata = env.page;
21826
+ let resultData = env.data;
21827
+ if (!pageMetadata && env.success && resultData && typeof resultData === "object") {
21828
+ const dataObj = resultData;
21829
+ if ("page" in dataObj && dataObj.page) {
21830
+ pageMetadata = dataObj.page;
21831
+ const { page: _removed, ...cleanData } = dataObj;
21832
+ resultData = cleanData;
21833
+ }
21834
+ }
21835
+ return wrapResult(
21836
+ {
21837
+ success: env.success,
21838
+ data: resultData,
21839
+ page: pageMetadata,
21840
+ error: env.error ? { code: String(env.error.code), message: env.error.message } : void 0
21841
+ },
21842
+ "query",
21843
+ "nexus",
21844
+ operation,
21845
+ startTime
21846
+ );
21847
+ }
21848
+ function nexusMutateEnvelopeToResponse(envelope, operation, startTime) {
21849
+ const env = envelope;
21850
+ return wrapResult(
21851
+ {
21852
+ success: env.success,
21853
+ data: env.data,
21854
+ error: env.error ? { code: String(env.error.code), message: env.error.message } : void 0
21855
+ },
21856
+ "mutate",
21857
+ "nexus",
21858
+ operation,
21859
+ startTime
21860
+ );
21861
+ }
21695
21862
  async function handleTopEntries(operation, params, startTime) {
21696
21863
  const rawLimit = params?.limit;
21697
21864
  const limit = typeof rawLimit === "number" && Number.isFinite(rawLimit) && rawLimit > 0 ? Math.floor(rawLimit) : 20;
@@ -22430,29 +22597,7 @@ var init_nexus2 = __esm({
22430
22597
  operation,
22431
22598
  params ?? {}
22432
22599
  );
22433
- const env = envelope;
22434
- let pageMetadata = env.page;
22435
- let resultData = env.data;
22436
- if (!pageMetadata && env.success && resultData && typeof resultData === "object") {
22437
- const dataObj = resultData;
22438
- if ("page" in dataObj && dataObj.page) {
22439
- pageMetadata = dataObj.page;
22440
- const { page: _removed, ...cleanData } = dataObj;
22441
- resultData = cleanData;
22442
- }
22443
- }
22444
- return wrapResult(
22445
- {
22446
- success: env.success,
22447
- data: resultData,
22448
- page: pageMetadata,
22449
- error: env.error ? { code: String(env.error.code), message: env.error.message } : void 0
22450
- },
22451
- "query",
22452
- "nexus",
22453
- operation,
22454
- startTime
22455
- );
22600
+ return nexusQueryEnvelopeToResponse(envelope, operation, startTime);
22456
22601
  } catch (error) {
22457
22602
  getLogger9("domain:nexus").error(
22458
22603
  { gateway: "query", domain: "nexus", operation, err: error },
@@ -22478,18 +22623,7 @@ var init_nexus2 = __esm({
22478
22623
  operation,
22479
22624
  params ?? {}
22480
22625
  );
22481
- const env = envelope;
22482
- return wrapResult(
22483
- {
22484
- success: env.success,
22485
- data: env.data,
22486
- error: env.error ? { code: String(env.error.code), message: env.error.message } : void 0
22487
- },
22488
- "mutate",
22489
- "nexus",
22490
- operation,
22491
- startTime
22492
- );
22626
+ return nexusMutateEnvelopeToResponse(envelope, operation, startTime);
22493
22627
  } catch (error) {
22494
22628
  getLogger9("domain:nexus").error(
22495
22629
  { gateway: "mutate", domain: "nexus", operation, err: error },
@@ -28220,6 +28354,31 @@ async function handleWorktreeCleanup(projectRoot, taskIds, startTime) {
28220
28354
  return handleErrorResult("mutate", "orchestrate", "worktree.cleanup", error, startTime);
28221
28355
  }
28222
28356
  }
28357
+ async function handleWorktreePrune(projectRoot, taskId, startTime) {
28358
+ try {
28359
+ const { pruneWorktree, pruneOrphanedWorktrees } = await import("@cleocode/core/internal");
28360
+ if (taskId) {
28361
+ const result2 = pruneWorktree(taskId, projectRoot);
28362
+ return {
28363
+ meta: dispatchMeta("mutate", "orchestrate", "worktree.prune", startTime),
28364
+ success: true,
28365
+ data: result2
28366
+ };
28367
+ }
28368
+ const result = pruneOrphanedWorktrees(projectRoot, void 0);
28369
+ return {
28370
+ meta: dispatchMeta("mutate", "orchestrate", "worktree.prune", startTime),
28371
+ success: true,
28372
+ data: { ...result, mode: "bulk" }
28373
+ };
28374
+ } catch (error) {
28375
+ getLogger11("domain:orchestrate").error(
28376
+ { operation: "worktree.prune", taskId, err: error },
28377
+ error instanceof Error ? error.message : String(error)
28378
+ );
28379
+ return handleErrorResult("mutate", "orchestrate", "worktree.prune", error, startTime);
28380
+ }
28381
+ }
28223
28382
  var ivtrHandler, OrchestrateHandler, FANOUT_MANIFEST_MAX_SIZE, fanoutManifestStore;
28224
28383
  var init_orchestrate2 = __esm({
28225
28384
  "packages/cleo/src/dispatch/domains/orchestrate.ts"() {
@@ -28287,9 +28446,10 @@ var init_orchestrate2 = __esm({
28287
28446
  const result = await orchestrateAnalyze(epicId, projectRoot, mode);
28288
28447
  return wrapResult(result, "query", "orchestrate", "analyze", startTime);
28289
28448
  }
28449
+ // T408: prompt-based CANT team routing (ADR-030 §5: query, idempotent, advisory)
28290
28450
  case "classify": {
28291
28451
  const request = params?.request;
28292
- if (!request) {
28452
+ if (!request)
28293
28453
  return errorResult(
28294
28454
  "query",
28295
28455
  "orchestrate",
@@ -28298,10 +28458,13 @@ var init_orchestrate2 = __esm({
28298
28458
  "request is required",
28299
28459
  startTime
28300
28460
  );
28301
- }
28302
- const context = params?.context;
28303
- const result = await orchestrateClassify(request, context, projectRoot);
28304
- return wrapResult(result, "query", "orchestrate", operation, startTime);
28461
+ return wrapResult(
28462
+ await orchestrateClassify(request, params?.context, projectRoot),
28463
+ "query",
28464
+ "orchestrate",
28465
+ operation,
28466
+ startTime
28467
+ );
28305
28468
  }
28306
28469
  case "fanout.status": {
28307
28470
  const manifestEntryId = params?.manifestEntryId;
@@ -28594,6 +28757,11 @@ var init_orchestrate2 = __esm({
28594
28757
  const taskIds = params?.taskIds;
28595
28758
  return handleWorktreeCleanup(projectRoot, taskIds, startTime);
28596
28759
  }
28760
+ // T1462 — Single-task worktree prune (used by `cleo orchestrate prune`)
28761
+ case "worktree.prune": {
28762
+ const taskId = params?.taskId;
28763
+ return handleWorktreePrune(projectRoot, taskId, startTime);
28764
+ }
28597
28765
  case "parallel": {
28598
28766
  return routeByParam(params, "action", {
28599
28767
  start: async () => {
@@ -28650,9 +28818,10 @@ var init_orchestrate2 = __esm({
28650
28818
  }
28651
28819
  });
28652
28820
  }
28821
+ // T409: Promise.allSettled fanout wrapper (ADR-030 §5: not idempotent, concurrent)
28653
28822
  case "fanout": {
28654
28823
  const items = params?.items;
28655
- if (!items || !Array.isArray(items) || items.length === 0) {
28824
+ if (!items || !Array.isArray(items) || items.length === 0)
28656
28825
  return errorResult(
28657
28826
  "mutate",
28658
28827
  "orchestrate",
@@ -28661,9 +28830,13 @@ var init_orchestrate2 = __esm({
28661
28830
  "items array is required and must be non-empty",
28662
28831
  startTime
28663
28832
  );
28664
- }
28665
- const result = await orchestrateFanout(items, projectRoot);
28666
- return wrapResult(result, "mutate", "orchestrate", operation, startTime);
28833
+ return wrapResult(
28834
+ await orchestrateFanout(items, projectRoot),
28835
+ "mutate",
28836
+ "orchestrate",
28837
+ operation,
28838
+ startTime
28839
+ );
28667
28840
  }
28668
28841
  case "tessera.instantiate": {
28669
28842
  const templateId = params?.templateId;
@@ -28785,7 +28958,9 @@ var init_orchestrate2 = __esm({
28785
28958
  "reject",
28786
28959
  // T1118 L1 — Worktree lifecycle
28787
28960
  "worktree.complete",
28788
- "worktree.cleanup"
28961
+ "worktree.cleanup",
28962
+ // T1462 — Single-task worktree prune
28963
+ "worktree.prune"
28789
28964
  ]
28790
28965
  };
28791
28966
  }
@@ -29003,6 +29178,44 @@ async function chainAdvanceOp(params) {
29003
29178
  getProjectRoot10()
29004
29179
  );
29005
29180
  }
29181
+ function pipelinePhaseListResponse(envelope, params, operation, startTime) {
29182
+ const listData = envelope.data ?? {};
29183
+ const phases = listData?.phases ?? [];
29184
+ const total = listData?.summary?.total ?? phases.length;
29185
+ const { limit, offset } = getListParams(params);
29186
+ const page = paginate5(phases, limit, offset);
29187
+ return {
29188
+ meta: dispatchMeta("query", "pipeline", operation, startTime),
29189
+ success: true,
29190
+ data: { ...listData, phases: page.items, total, filtered: total },
29191
+ page: page.page
29192
+ };
29193
+ }
29194
+ function pipelineChainListResponse(envelope, params, operation, startTime) {
29195
+ const rawData = envelope.data ?? { _chains: [] };
29196
+ const chains = rawData._chains ?? [];
29197
+ const { limit, offset } = getListParams(params);
29198
+ const page = paginate5(chains, limit, offset);
29199
+ return {
29200
+ meta: dispatchMeta("query", "pipeline", operation, startTime),
29201
+ success: true,
29202
+ data: { chains: page.items, total: chains.length, filtered: chains.length },
29203
+ page: page.page
29204
+ };
29205
+ }
29206
+ function pipelineEnvelopeResponse(envelope, operation, startTime) {
29207
+ const envelopeData = envelope.data;
29208
+ const enginePage = envelopeData?._enginePage;
29209
+ const responseData = envelopeData?._enginePage !== void 0 ? (({ _enginePage: _p, ...rest }) => rest)(
29210
+ envelopeData
29211
+ ) : envelopeData;
29212
+ return {
29213
+ meta: dispatchMeta("query", "pipeline", operation, startTime),
29214
+ success: true,
29215
+ data: responseData,
29216
+ ...enginePage ? { page: enginePage } : {}
29217
+ };
29218
+ }
29006
29219
  var coreOps, _pipelineTypedHandler, PipelineHandler;
29007
29220
  var init_pipeline3 = __esm({
29008
29221
  "packages/cleo/src/dispatch/domains/pipeline.ts"() {
@@ -29369,52 +29582,11 @@ var init_pipeline3 = __esm({
29369
29582
  }
29370
29583
  };
29371
29584
  }
29372
- if (operation === "phase.list") {
29373
- const rawData = envelope.data;
29374
- const listData = rawData;
29375
- const phases = listData?.phases ?? [];
29376
- const total = listData?.summary?.total ?? phases.length;
29377
- const { limit, offset } = getListParams(params);
29378
- const page = paginate5(phases, limit, offset);
29379
- return {
29380
- meta: dispatchMeta("query", "pipeline", operation, startTime),
29381
- success: true,
29382
- data: {
29383
- ...listData,
29384
- phases: page.items,
29385
- total,
29386
- filtered: total
29387
- },
29388
- page: page.page
29389
- };
29390
- }
29391
- if (operation === "chain.list") {
29392
- const rawData = envelope.data;
29393
- const chains = rawData._chains ?? [];
29394
- const { limit, offset } = getListParams(params);
29395
- const page = paginate5(chains, limit, offset);
29396
- return {
29397
- meta: dispatchMeta("query", "pipeline", operation, startTime),
29398
- success: true,
29399
- data: {
29400
- chains: page.items,
29401
- total: chains.length,
29402
- filtered: chains.length
29403
- },
29404
- page: page.page
29405
- };
29406
- }
29407
- const envelopeData = envelope.data;
29408
- const enginePage = envelopeData?._enginePage;
29409
- const responseData = envelopeData?._enginePage !== void 0 ? (({ _enginePage: _p, ...rest }) => rest)(
29410
- envelopeData
29411
- ) : envelopeData;
29412
- return {
29413
- meta: dispatchMeta("query", "pipeline", operation, startTime),
29414
- success: true,
29415
- data: responseData,
29416
- ...enginePage ? { page: enginePage } : {}
29417
- };
29585
+ if (operation === "phase.list")
29586
+ return pipelinePhaseListResponse(envelope, params, operation, startTime);
29587
+ if (operation === "chain.list")
29588
+ return pipelineChainListResponse(envelope, params, operation, startTime);
29589
+ return pipelineEnvelopeResponse(envelope, operation, startTime);
29418
29590
  } catch (error) {
29419
29591
  getLogger12("domain:pipeline").error(
29420
29592
  { gateway: "query", domain: "pipeline", operation, err: error },
@@ -29549,12 +29721,10 @@ var init_release2 = __esm({
29549
29721
  const startTime = Date.now();
29550
29722
  try {
29551
29723
  switch (operation) {
29552
- // ------------------------------------------------------------------
29553
29724
  // release.gate — IVTR gate check (RELEASE-03)
29554
- // ------------------------------------------------------------------
29555
29725
  case "gate": {
29556
29726
  const epicId = params?.["epicId"];
29557
- if (!epicId) {
29727
+ if (!epicId)
29558
29728
  return errorResult(
29559
29729
  "query",
29560
29730
  "release",
@@ -29563,18 +29733,18 @@ var init_release2 = __esm({
29563
29733
  "epicId is required",
29564
29734
  startTime
29565
29735
  );
29566
- }
29567
- const force = params?.["force"] === true;
29568
- const projectRoot = getProjectRoot11();
29569
- const result = await releaseGateCheck(epicId, force, projectRoot);
29570
- return wrapResult(result, "query", "release", operation, startTime);
29736
+ return wrapResult(
29737
+ await releaseGateCheck(epicId, params?.["force"] === true, getProjectRoot11()),
29738
+ "query",
29739
+ "release",
29740
+ operation,
29741
+ startTime
29742
+ );
29571
29743
  }
29572
- // ------------------------------------------------------------------
29573
29744
  // release.ivtr-suggest — IVTR auto-suggest (RELEASE-07)
29574
- // ------------------------------------------------------------------
29575
29745
  case "ivtr-suggest": {
29576
29746
  const taskId = params?.["taskId"];
29577
- if (!taskId) {
29747
+ if (!taskId)
29578
29748
  return errorResult(
29579
29749
  "query",
29580
29750
  "release",
@@ -29583,10 +29753,13 @@ var init_release2 = __esm({
29583
29753
  "taskId is required",
29584
29754
  startTime
29585
29755
  );
29586
- }
29587
- const projectRoot = getProjectRoot11();
29588
- const result = await releaseIvtrAutoSuggest(taskId, projectRoot);
29589
- return wrapResult(result, "query", "release", operation, startTime);
29756
+ return wrapResult(
29757
+ await releaseIvtrAutoSuggest(taskId, getProjectRoot11()),
29758
+ "query",
29759
+ "release",
29760
+ operation,
29761
+ startTime
29762
+ );
29590
29763
  }
29591
29764
  default:
29592
29765
  return errorResult(
@@ -29622,13 +29795,10 @@ var init_release2 = __esm({
29622
29795
  const startTime = Date.now();
29623
29796
  try {
29624
29797
  switch (operation) {
29625
- // ------------------------------------------------------------------
29626
- // release.gate — IVTR gate check (RELEASE-03)
29627
- // Pre-ship guard: blocks release.ship when tasks are not IVTR released.
29628
- // ------------------------------------------------------------------
29798
+ // release.gate — IVTR gate check (RELEASE-03, no DB writes)
29629
29799
  case "gate": {
29630
29800
  const epicId = params?.["epicId"];
29631
- if (!epicId) {
29801
+ if (!epicId)
29632
29802
  return errorResult(
29633
29803
  "mutate",
29634
29804
  "release",
@@ -29637,19 +29807,18 @@ var init_release2 = __esm({
29637
29807
  "epicId is required",
29638
29808
  startTime
29639
29809
  );
29640
- }
29641
- const force = params?.["force"] === true;
29642
- const projectRoot = getProjectRoot11();
29643
- const result = await releaseGateCheck(epicId, force, projectRoot);
29644
- return wrapResult(result, "mutate", "release", operation, startTime);
29810
+ return wrapResult(
29811
+ await releaseGateCheck(epicId, params?.["force"] === true, getProjectRoot11()),
29812
+ "mutate",
29813
+ "release",
29814
+ operation,
29815
+ startTime
29816
+ );
29645
29817
  }
29646
- // ------------------------------------------------------------------
29647
- // release.ivtr-suggest — IVTR auto-suggest (RELEASE-07)
29648
- // Triggered after ivtr.release succeeds; checks if all siblings are done.
29649
- // ------------------------------------------------------------------
29818
+ // release.ivtr-suggest — IVTR auto-suggest (RELEASE-07, no DB writes)
29650
29819
  case "ivtr-suggest": {
29651
29820
  const taskId = params?.["taskId"];
29652
- if (!taskId) {
29821
+ if (!taskId)
29653
29822
  return errorResult(
29654
29823
  "mutate",
29655
29824
  "release",
@@ -29658,10 +29827,13 @@ var init_release2 = __esm({
29658
29827
  "taskId is required",
29659
29828
  startTime
29660
29829
  );
29661
- }
29662
- const projectRoot = getProjectRoot11();
29663
- const result = await releaseIvtrAutoSuggest(taskId, projectRoot);
29664
- return wrapResult(result, "mutate", "release", operation, startTime);
29830
+ return wrapResult(
29831
+ await releaseIvtrAutoSuggest(taskId, getProjectRoot11()),
29832
+ "mutate",
29833
+ "release",
29834
+ operation,
29835
+ startTime
29836
+ );
29665
29837
  }
29666
29838
  default:
29667
29839
  return errorResult(
@@ -30070,10 +30242,12 @@ var init_session3 = __esm({
30070
30242
  // Query ops
30071
30243
  // -------------------------------------------------------------------------
30072
30244
  // Engine guarantees data on success; fallback mirrors empty-state shape.
30245
+ // overrideCount included per T1501 / P0-5.
30073
30246
  status: async (_params) => wrapCoreResult(await coreOps3.status(), "status", {
30074
30247
  hasActiveSession: false,
30075
30248
  session: null,
30076
- taskWork: null
30249
+ taskWork: null,
30250
+ overrideCount: 0
30077
30251
  }),
30078
30252
  list: async (params) => wrapCoreResult(await coreOps3.list(params), "list"),
30079
30253
  // session.show absorbs debrief.show via include param (T5615)
@@ -30362,6 +30536,7 @@ var init_session3 = __esm({
30362
30536
  });
30363
30537
 
30364
30538
  // packages/cleo/src/dispatch/engines/sticky-engine.ts
30539
+ import { paginate as paginate6 } from "@cleocode/core";
30365
30540
  import {
30366
30541
  addSticky,
30367
30542
  archiveSticky,
@@ -30381,10 +30556,17 @@ async function stickyAdd(projectRoot, params) {
30381
30556
  return engineError("E_INTERNAL", String(error));
30382
30557
  }
30383
30558
  }
30384
- async function stickyList(projectRoot, params = {}) {
30559
+ async function stickyListFiltered(projectRoot, filters, limit, offset) {
30385
30560
  try {
30386
- const stickies = await listStickies(params, projectRoot);
30387
- return { success: true, data: { stickies, total: stickies.length } };
30561
+ const filteredStickies = await listStickies(filters, projectRoot);
30562
+ const hasFilter = filters.status !== void 0 || filters.color !== void 0 || filters.priority !== void 0 || filters.tags !== void 0 && filters.tags.length > 0;
30563
+ const total = hasFilter ? (await listStickies({}, projectRoot)).length : filteredStickies.length;
30564
+ const page = paginate6(filteredStickies, limit, offset);
30565
+ return {
30566
+ success: true,
30567
+ data: { stickies: page.items, total, filtered: filteredStickies.length },
30568
+ page: page.page
30569
+ };
30388
30570
  } catch (error) {
30389
30571
  return engineError("E_INTERNAL", String(error));
30390
30572
  }
@@ -30474,14 +30656,13 @@ var init_sticky_engine = __esm({
30474
30656
  });
30475
30657
 
30476
30658
  // packages/cleo/src/dispatch/domains/sticky.ts
30477
- import { getLogger as getLogger15, getProjectRoot as getProjectRoot14, paginate as paginate6 } from "@cleocode/core";
30659
+ import { getLogger as getLogger15, getProjectRoot as getProjectRoot14 } from "@cleocode/core";
30478
30660
  var StickyHandler;
30479
30661
  var init_sticky = __esm({
30480
30662
  "packages/cleo/src/dispatch/domains/sticky.ts"() {
30481
30663
  "use strict";
30482
30664
  init_sticky_engine();
30483
30665
  init_base();
30484
- init_meta2();
30485
30666
  StickyHandler = class {
30486
30667
  // -----------------------------------------------------------------------
30487
30668
  // Query
@@ -30492,36 +30673,18 @@ var init_sticky = __esm({
30492
30673
  try {
30493
30674
  switch (operation) {
30494
30675
  case "list": {
30495
- const tags = params?.tags;
30496
- const filters = {
30497
- status: params?.status,
30498
- color: params?.color,
30499
- priority: params?.priority,
30500
- tags
30501
- };
30502
- const result = await stickyList(projectRoot, filters);
30503
- if (!result.success) {
30504
- return wrapResult(result, "query", "sticky", operation, startTime);
30505
- }
30506
- const filteredStickies = result.data?.stickies ?? [];
30507
- const hasFilter = filters.status !== void 0 || filters.color !== void 0 || filters.priority !== void 0 || tags !== void 0 && tags.length > 0;
30508
- const totalResult = hasFilter ? await stickyList(projectRoot, {}) : result;
30509
- if (!totalResult.success) {
30510
- return wrapResult(totalResult, "query", "sticky", operation, startTime);
30511
- }
30512
- const limit = params?.limit;
30513
- const offset = params?.offset;
30514
- const page = paginate6(filteredStickies, limit, offset);
30515
- return {
30516
- meta: dispatchMeta("query", "sticky", operation, startTime),
30517
- success: true,
30518
- data: {
30519
- stickies: page.items,
30520
- total: totalResult.data?.total ?? filteredStickies.length,
30521
- filtered: filteredStickies.length
30676
+ const result = await stickyListFiltered(
30677
+ projectRoot,
30678
+ {
30679
+ status: params?.status,
30680
+ color: params?.color,
30681
+ priority: params?.priority,
30682
+ tags: params?.tags
30522
30683
  },
30523
- page: page.page
30524
- };
30684
+ params?.limit,
30685
+ params?.offset
30686
+ );
30687
+ return wrapResult(result, "query", "sticky", operation, startTime);
30525
30688
  }
30526
30689
  case "show": {
30527
30690
  const stickyId = params?.stickyId;
@@ -52305,6 +52468,29 @@ var fanoutCommand = defineCommand({
52305
52468
  );
52306
52469
  }
52307
52470
  });
52471
+ var pruneCommand = defineCommand({
52472
+ meta: {
52473
+ name: "prune",
52474
+ description: "Remove stale agent worktrees (after task completion or crash)"
52475
+ },
52476
+ args: {
52477
+ taskId: {
52478
+ type: "positional",
52479
+ description: "Task ID whose worktree should be pruned (omit for bulk prune)",
52480
+ required: false
52481
+ }
52482
+ },
52483
+ async run({ args }) {
52484
+ const taskId = typeof args.taskId === "string" && args.taskId.length > 0 ? args.taskId : void 0;
52485
+ await dispatchFromCli(
52486
+ "mutate",
52487
+ "orchestrate",
52488
+ "worktree.prune",
52489
+ { taskId },
52490
+ { command: "orchestrate" }
52491
+ );
52492
+ }
52493
+ });
52308
52494
  var conduitStatusCommand = defineCommand({
52309
52495
  meta: { name: "conduit-status", description: "Get conduit messaging status" },
52310
52496
  async run() {
@@ -52486,6 +52672,7 @@ var orchestrateCommand = defineCommand({
52486
52672
  handoff: handoffCommand,
52487
52673
  "spawn-execute": spawnExecuteCommand,
52488
52674
  fanout: fanoutCommand,
52675
+ prune: pruneCommand,
52489
52676
  "conduit-status": conduitStatusCommand,
52490
52677
  "conduit-peek": conduitPeekCommand,
52491
52678
  "conduit-start": conduitStartCommand,
@@ -58622,7 +58809,7 @@ var migrateCommand2 = defineCommand({
58622
58809
  }
58623
58810
  }
58624
58811
  });
58625
- var pruneCommand = defineCommand({
58812
+ var pruneCommand2 = defineCommand({
58626
58813
  meta: {
58627
58814
  name: "prune",
58628
58815
  description: "Prune session transcripts older than the specified duration. Dry-run by default."
@@ -58749,7 +58936,7 @@ var transcriptCommand = defineCommand({
58749
58936
  scan: scanCommand,
58750
58937
  extract: extractCommand,
58751
58938
  migrate: migrateCommand2,
58752
- prune: pruneCommand
58939
+ prune: pruneCommand2
58753
58940
  },
58754
58941
  async run({ cmd, rawArgs }) {
58755
58942
  const firstArg = rawArgs?.find((a) => !a.startsWith("-"));
@@ -59095,6 +59282,10 @@ var verifyCommand2 = defineCommand({
59095
59282
  explain: {
59096
59283
  type: "boolean",
59097
59284
  description: "Enrich read-only view with per-gate evidence breakdown, re-validation status, and blockers[] preventing `cleo complete` (T1013 / ADR-051)."
59285
+ },
59286
+ "shared-evidence": {
59287
+ type: "boolean",
59288
+ description: "Acknowledge that the same evidence atom is applied to >3 distinct tasks in this session (T1502 / ADR-059). Without this flag, such reuse triggers a warning; in strict mode (CLEO_STRICT_EVIDENCE=1) it is a hard reject."
59098
59289
  }
59099
59290
  },
59100
59291
  async run({ args, cmd }) {
@@ -59116,7 +59307,8 @@ var verifyCommand2 = defineCommand({
59116
59307
  agent: args.agent,
59117
59308
  all: args.all,
59118
59309
  reset: args.reset,
59119
- evidence: args.evidence
59310
+ evidence: args.evidence,
59311
+ sharedEvidence: args["shared-evidence"] ?? false
59120
59312
  },
59121
59313
  { command: "verify" }
59122
59314
  );