@delete101020/aidlc 4.0.42 → 4.0.45

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.
Files changed (2) hide show
  1. package/dist/bundle.js +152 -85
  2. package/package.json +1 -1
package/dist/bundle.js CHANGED
@@ -19962,8 +19962,9 @@ var require_WorkspaceSchema = __commonJS({
19962
19962
  * The target is a step name (or agent id) before this one, without
19963
19963
  * `human_review` — work a human gate approved goes back through a human.
19964
19964
  * A validator can name the same target in its verdict (`sendBackTo`), or
19965
- * name this step / `null` to stop here instead. Bounded by the
19966
- * pipeline's `max_send_backs`.
19965
+ * name this step / `null` to stop here instead. Naming any other earlier
19966
+ * step — a `human_review` one included — sends the work back there and
19967
+ * stops the run for a person. Bounded by the pipeline's `max_send_backs`.
19967
19968
  */
19968
19969
  on_reject: zod_1.z.object({ send_back_to: zod_1.z.string().min(1) }).optional(),
19969
19970
  /**
@@ -19993,6 +19994,12 @@ var require_WorkspaceSchema = __commonJS({
19993
19994
  pause_between_batches: zod_1.z.boolean().optional(),
19994
19995
  /** When true, the runner pauses for human approval before advancing. */
19995
19996
  human_review: zod_1.z.boolean().default(false),
19997
+ /**
19998
+ * A step only a person can run — the unattended `run exec` loop stops
19999
+ * before it, as a clean stop rather than an error, and leaves it
20000
+ * `awaiting_work` for someone to run by hand.
20001
+ */
20002
+ attended: zod_1.z.boolean().optional(),
19996
20003
  /**
19997
20004
  * Command run once after a batch of follow-up epics is opened from the
19998
20005
  * `followups.json` this step produces. See `schema/FollowUpHookSchema.ts`,
@@ -20173,6 +20180,7 @@ var require_WorkspaceSchema = __commonJS({
20173
20180
  }
20174
20181
  } : {},
20175
20182
  human_review: obj.human_review === true,
20183
+ ...obj.attended === true && { attended: true },
20176
20184
  ...git && { git }
20177
20185
  };
20178
20186
  }
@@ -20665,6 +20673,9 @@ var require_PipelineAssembler = __commonJS({
20665
20673
  if (norm.model) {
20666
20674
  step.model = norm.model;
20667
20675
  }
20676
+ if (norm.attended) {
20677
+ step.attended = true;
20678
+ }
20668
20679
  if (auto_review_runner) {
20669
20680
  step.auto_review_runner = auto_review_runner;
20670
20681
  }
@@ -21484,6 +21495,7 @@ var require_PipelineRunner = __commonJS({
21484
21495
  exports2.rerunStep = rerunStep3;
21485
21496
  exports2.chooseStepSkill = chooseStepSkill;
21486
21497
  exports2.chooseStepModel = chooseStepModel;
21498
+ exports2.recordLaunchFeedback = recordLaunchFeedback;
21487
21499
  exports2.requestStepUpdate = requestStepUpdate2;
21488
21500
  exports2.dirtyUpstreamOf = dirtyUpstreamOf2;
21489
21501
  exports2.canRerunApprovedStep = canRerunApprovedStep;
@@ -21809,7 +21821,6 @@ ${route.note}` : verdict.reason;
21809
21821
  return advance(next, idx, pipeline);
21810
21822
  }
21811
21823
  function autoRejectRoute(state, pipeline, idx, norm, verdict) {
21812
- const label = (i) => `"${(0, RunState_1.stepIdentity)(state.steps[i])}" (step ${i + 1})`;
21813
21824
  const configured = norm.on_reject?.send_back_to;
21814
21825
  const cfgIdx = configured ? (0, WorkspaceSchema_1.findStepIndex)(pipeline.steps.map(WorkspaceSchema_1.normalizeStep), configured) : -1;
21815
21826
  if (configured && !(cfgIdx >= 0 && cfgIdx < idx)) {
@@ -21829,13 +21840,7 @@ ${route.note}` : verdict.reason;
21829
21840
  if (v < 0 || v > idx) {
21830
21841
  return { note: `The validator asked to send this back to "${asked}", which is not a step before this one.` };
21831
21842
  }
21832
- if (v !== cfgIdx) {
21833
- const allowed = cfgIdx >= 0 ? `only ${label(cfgIdx)} is` : "no step is (see `on_reject.send_back_to`)";
21834
- return {
21835
- note: `The validator suggests sending this back to ${label(v)}; ${allowed} sent back automatically. Send it back by hand if you agree.`
21836
- };
21837
- }
21838
- return { targetIdx: v, source: "verdict" };
21843
+ return { targetIdx: v, source: v === cfgIdx ? "verdict" : "handoff" };
21839
21844
  }
21840
21845
  function retryAutoReview(args) {
21841
21846
  const { pipeline } = args;
@@ -21882,7 +21887,7 @@ ${route.note}` : verdict.reason;
21882
21887
  }
21883
21888
  const next = clone(state);
21884
21889
  delete next.sendBacks;
21885
- return advance(next, idx, pipeline);
21890
+ return advance(next, idx, pipeline, args.auto);
21886
21891
  }
21887
21892
  function rejectStep3(args) {
21888
21893
  const { state, reason, targetIdx, pipeline } = args;
@@ -21988,6 +21993,29 @@ ${route.note}` : verdict.reason;
21988
21993
  next.steps[stepIdx] = { ...target, chosenModel: model };
21989
21994
  return next;
21990
21995
  }
21996
+ function recordLaunchFeedback(args) {
21997
+ const { state, stepIdx } = args;
21998
+ if (!Number.isInteger(stepIdx) || stepIdx < 0 || stepIdx >= state.steps.length) {
21999
+ throw new PipelineRunError3(`Invalid stepIdx ${stepIdx}`);
22000
+ }
22001
+ const feedback = args.feedback.trim();
22002
+ const target = state.steps[stepIdx];
22003
+ if (!feedback || feedback === target.feedback?.trim()) {
22004
+ return state;
22005
+ }
22006
+ const next = clone(state);
22007
+ next.steps[stepIdx] = {
22008
+ ...target,
22009
+ feedback,
22010
+ history: [...target.history ?? [], {
22011
+ kind: "feedback",
22012
+ at: (/* @__PURE__ */ new Date()).toISOString(),
22013
+ revision: target.revision,
22014
+ feedback
22015
+ }]
22016
+ };
22017
+ return next;
22018
+ }
21991
22019
  function requestStepUpdate2(args) {
21992
22020
  const { state, pipeline, stepIdx, feedback } = args;
21993
22021
  if (!Number.isInteger(stepIdx) || stepIdx < 0 || stepIdx >= state.steps.length) {
@@ -22192,7 +22220,7 @@ ${route.note}` : verdict.reason;
22192
22220
  next.status = "running";
22193
22221
  return next;
22194
22222
  }
22195
- function advance(next, idx, pipeline) {
22223
+ function advance(next, idx, pipeline, auto) {
22196
22224
  const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
22197
22225
  const approved = next.steps[idx];
22198
22226
  next.steps[idx] = {
@@ -22208,7 +22236,8 @@ ${route.note}` : verdict.reason;
22208
22236
  at: finishedAt,
22209
22237
  revision: approved.revision,
22210
22238
  ...approved.skill ? { skill: approved.skill } : {},
22211
- ...approved.chosenModel ? { model: approved.chosenModel } : {}
22239
+ ...approved.chosenModel ? { model: approved.chosenModel } : {},
22240
+ ...auto ? { auto: true } : {}
22212
22241
  })
22213
22242
  };
22214
22243
  const normalized = pipeline.steps.map(WorkspaceSchema_1.normalizeStep);
@@ -22294,7 +22323,7 @@ ${route.note}` : verdict.reason;
22294
22323
  const { idx, targetIdx, reason, at: now, pipeline, source } = args;
22295
22324
  const before = clone(next);
22296
22325
  const step = next.steps[idx];
22297
- const blame = `Rejected at step ${idx + 1} (${step.agent})${reason ? `: ${reason}` : ""}`;
22326
+ const blame = `Rejected at step ${idx + 1} (${(0, RunState_1.stepIdentity)(step)})${reason ? `: ${reason}` : ""}`;
22298
22327
  const rejectedHistory = pushHistory(step.history, {
22299
22328
  kind: "reject",
22300
22329
  at: now,
@@ -29101,7 +29130,7 @@ var require_DefaultRunner = __commonJS({
29101
29130
  if (evt.type === "assistant" && evt.message?.content) {
29102
29131
  for (const block of evt.message.content) {
29103
29132
  if (block.type === "text" && typeof block.text === "string") {
29104
- ctx.onOutput(block.text);
29133
+ ctx.onOutput(block.text.replace(/\s*$/, "\n\n"));
29105
29134
  }
29106
29135
  }
29107
29136
  } else if (evt.type === "result") {
@@ -32339,6 +32368,7 @@ var require_execEngine = __commonJS({
32339
32368
  };
32340
32369
  }();
32341
32370
  Object.defineProperty(exports2, "__esModule", { value: true });
32371
+ exports2.stepLabel = stepLabel3;
32342
32372
  exports2.runExecLoop = runExecLoop2;
32343
32373
  var path17 = __importStar(require("path"));
32344
32374
  var WorkspaceLoader_1 = require_WorkspaceLoader();
@@ -32366,6 +32396,9 @@ var require_execEngine = __commonJS({
32366
32396
  var promptComposer_1 = require_promptComposer();
32367
32397
  var projectInstructions_1 = require_projectInstructions();
32368
32398
  var types_1 = require_types();
32399
+ function stepLabel3(s) {
32400
+ return s.name ?? s.agent;
32401
+ }
32369
32402
  function loadPipelineForRun(root, state) {
32370
32403
  try {
32371
32404
  const ws = WorkspaceLoader_1.WorkspaceLoader.load(root);
@@ -32441,6 +32474,9 @@ var require_execEngine = __commonJS({
32441
32474
  if (!proceed) {
32442
32475
  return { kind: "error" };
32443
32476
  }
32477
+ if (proceed === "handoff") {
32478
+ return { kind: "attended" };
32479
+ }
32444
32480
  continue;
32445
32481
  }
32446
32482
  if (step.status === "awaiting_review") {
@@ -32448,7 +32484,7 @@ var require_execEngine = __commonJS({
32448
32484
  await autoApproveStep(root, state, hooks);
32449
32485
  continue;
32450
32486
  }
32451
- hooks.onAwaitingReview?.({ agent: step.agent, runId });
32487
+ hooks.onAwaitingReview?.({ agent: step.agent, label: stepLabel3(step), runId });
32452
32488
  return { kind: "awaiting_review" };
32453
32489
  }
32454
32490
  if (step.status === "rejected") {
@@ -32458,25 +32494,26 @@ var require_execEngine = __commonJS({
32458
32494
  hooks.onStepSkipped?.({
32459
32495
  stepIdx: state.currentStepIdx,
32460
32496
  agent: step.agent,
32497
+ label: stepLabel3(step),
32461
32498
  reason: step.rejectReason ?? step.autoReviewVerdict?.reason ?? "rejected",
32462
32499
  nextStepIdx: openElsewhere,
32463
32500
  runId
32464
32501
  });
32465
- RunStateStore_1.RunStateStore.save(root, { ...state, currentStepIdx: openElsewhere });
32502
+ persist(root, { ...state, currentStepIdx: openElsewhere });
32466
32503
  continue;
32467
32504
  }
32468
- hooks.onRejected?.({ agent: step.agent, runId });
32505
+ hooks.onRejected?.({ agent: step.agent, label: stepLabel3(step), runId });
32469
32506
  return { kind: "rejected" };
32470
32507
  }
32471
32508
  if (step.status === "approved") {
32472
32509
  const openElsewhere = state.steps.findIndex((s) => (0, runProgress_1.isActiveStatus)(s.status));
32473
32510
  if (openElsewhere >= 0) {
32474
- RunStateStore_1.RunStateStore.save(root, { ...state, currentStepIdx: openElsewhere });
32511
+ persist(root, { ...state, currentStepIdx: openElsewhere });
32475
32512
  continue;
32476
32513
  }
32477
32514
  const parked = state.steps.find((s) => s.status === "rejected");
32478
32515
  if (parked) {
32479
- hooks.onRejected?.({ agent: parked.agent, runId });
32516
+ hooks.onRejected?.({ agent: parked.agent, label: stepLabel3(parked), runId });
32480
32517
  return { kind: "rejected" };
32481
32518
  }
32482
32519
  }
@@ -32484,6 +32521,10 @@ var require_execEngine = __commonJS({
32484
32521
  hooks.onRunFailed?.(`Unexpected step status "${step.status}" \u2014 cannot exec.`);
32485
32522
  return { kind: "error" };
32486
32523
  }
32524
+ if (!opts.dryRun && initialPipeline.steps[state.currentStepIdx] && (0, WorkspaceSchema_1.normalizeStep)(initialPipeline.steps[state.currentStepIdx]).attended) {
32525
+ hooks.onAttendedStep?.({ stepIdx: state.currentStepIdx, agent: step.agent, label: stepLabel3(step), runId });
32526
+ return { kind: "attended" };
32527
+ }
32487
32528
  const ran = await execStep(root, state, runId, opts, hooks);
32488
32529
  if (ran === "failed") {
32489
32530
  return { kind: "error" };
@@ -32510,6 +32551,7 @@ var require_execEngine = __commonJS({
32510
32551
  hooks.onStalled?.({
32511
32552
  stepIdx: idx,
32512
32553
  agent: step.agent,
32554
+ label: stepLabel3(step),
32513
32555
  revision: step.revision,
32514
32556
  runId,
32515
32557
  reason: `"${step.agent}" ran ${n} batch${n === 1 ? "" : "es"} (\`max_batches: ${cfg.max}\`) and still says \`Status: continue\`. Read its progress before letting it carry on: running exec again allows ${cfg.max} more.`
@@ -32520,6 +32562,7 @@ var require_execEngine = __commonJS({
32520
32562
  hooks.onBatchPause?.({
32521
32563
  stepIdx: idx,
32522
32564
  agent: step.agent,
32565
+ label: stepLabel3(step),
32523
32566
  batch: batchNo,
32524
32567
  runId,
32525
32568
  report: batchReport(initialPipeline, after ?? state, idx) ?? ""
@@ -32605,17 +32648,17 @@ var require_execEngine = __commonJS({
32605
32648
  try {
32606
32649
  ws = WorkspaceLoader_1.WorkspaceLoader.load(root);
32607
32650
  } catch (err) {
32608
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Failed to load workspace: ${errMsg(err)}` });
32651
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: `Failed to load workspace: ${errMsg(err)}` });
32609
32652
  return "failed";
32610
32653
  }
32611
32654
  const pipeline = ws.config.pipelines.find((p) => p.id === state.pipelineId);
32612
32655
  if (!pipeline) {
32613
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Pipeline "${state.pipelineId}" not found in workspace.yaml.` });
32656
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: `Pipeline "${state.pipelineId}" not found in workspace.yaml.` });
32614
32657
  return "failed";
32615
32658
  }
32616
32659
  const agent = ws.config.agents.find((a) => a.id === agentId);
32617
32660
  if (!agent) {
32618
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Agent "${agentId}" not found in workspace.yaml.` });
32661
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: `Agent "${agentId}" not found in workspace.yaml.` });
32619
32662
  return "failed";
32620
32663
  }
32621
32664
  const stepCfg = pipeline.steps[stepIdx];
@@ -32630,13 +32673,13 @@ var require_execEngine = __commonJS({
32630
32673
  try {
32631
32674
  runner = ws.runners.resolve(agent);
32632
32675
  } catch (err) {
32633
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Failed to resolve runner for agent "${agentId}": ${errMsg(err)}` });
32676
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: `Failed to resolve runner for agent "${agentId}": ${errMsg(err)}` });
32634
32677
  return "failed";
32635
32678
  }
32636
32679
  try {
32637
32680
  prompt2 = buildStepPrompt(ws, agent, skillIds, runner, root, state.runId, stepRec, stepIdx);
32638
32681
  } catch (err) {
32639
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Failed to load skills for agent "${agentId}": ${errMsg(err)}` });
32682
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: `Failed to load skills for agent "${agentId}": ${errMsg(err)}` });
32640
32683
  return "failed";
32641
32684
  }
32642
32685
  const skillText = prompt2.text;
@@ -32656,6 +32699,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32656
32699
  hooks.onStepFailed?.({
32657
32700
  stepIdx,
32658
32701
  agent: agentId,
32702
+ label: stepLabel3(stepRec),
32659
32703
  message: `Step "${agentId}" has \`batches: true\` but no \`produces\` file to write its \`Status:\` line in.`
32660
32704
  });
32661
32705
  return "failed";
@@ -32676,6 +32720,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32676
32720
  hooks.onStepStart?.({
32677
32721
  stepIdx,
32678
32722
  agent: agentId,
32723
+ label: stepLabel3(stepRec),
32679
32724
  revision: stepRec.revision,
32680
32725
  skills: skillIds,
32681
32726
  model: agentModel,
@@ -32727,15 +32772,16 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32727
32772
  hooks.onStepFailed?.({
32728
32773
  stepIdx,
32729
32774
  agent: agentId,
32775
+ label: stepLabel3(stepRec),
32730
32776
  message: `Step "${agentId}" ran past its ${minutes}-minute limit (\`timeout_minutes\`) and was stopped. It is still awaiting work on revision ${stepRec.revision}; nothing was sent back. Whatever it half-wrote is still in the working tree.`
32731
32777
  });
32732
32778
  return "failed";
32733
32779
  }
32734
- hooks.onStepStopped?.({ stepIdx, agent: agentId, revision: stepRec.revision, runId });
32780
+ hooks.onStepStopped?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), revision: stepRec.revision, runId });
32735
32781
  return "stopped";
32736
32782
  }
32737
32783
  if (!result || !result.success) {
32738
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Step "${agentId}" failed (non-zero exit).` });
32784
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: `Step "${agentId}" failed (non-zero exit).` });
32739
32785
  return "failed";
32740
32786
  }
32741
32787
  const codeUnchanged = codeBefore !== null && (0, codeFingerprint_1.codeFingerprint)(root, codeExclude) === codeBefore;
@@ -32743,6 +32789,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32743
32789
  hooks.onStalled?.({
32744
32790
  stepIdx,
32745
32791
  agent: agentId,
32792
+ label: stepLabel3(stepRec),
32746
32793
  revision: stepRec.revision,
32747
32794
  runId,
32748
32795
  reason: `Revision ${stepRec.revision} of "${agentId}" changed no code \u2014 the working tree is what it was before it ran (its report aside). Sent back ${state.sendBacks} time${state.sendBacks === 1 ? "" : "s"}; stopping rather than have the same code reviewed again.`
@@ -32754,6 +32801,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32754
32801
  hooks.onStepFailed?.({
32755
32802
  stepIdx,
32756
32803
  agent: agentId,
32804
+ label: stepLabel3(stepRec),
32757
32805
  message: `Step "${agentId}" reported success but left its artifacts unchanged: ${stale.join(", ")}. The agent may have failed to write them. Check its output, then rerun the step.`
32758
32806
  });
32759
32807
  return "failed";
@@ -32764,6 +32812,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32764
32812
  hooks.onStepFailed?.({
32765
32813
  stepIdx,
32766
32814
  agent: agentId,
32815
+ label: stepLabel3(stepRec),
32767
32816
  message: `Step "${agentId}" runs in batches and its report cannot say whether it is done: ${read.error} Add the line, then run exec again.`
32768
32817
  });
32769
32818
  return "failed";
@@ -32773,6 +32822,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32773
32822
  hooks.onStalled?.({
32774
32823
  stepIdx,
32775
32824
  agent: agentId,
32825
+ label: stepLabel3(stepRec),
32776
32826
  revision: stepRec.revision,
32777
32827
  runId,
32778
32828
  reason: `Batch ${batchNo} of "${agentId}" asked for another session but changed no code \u2014 the working tree is what it was before it ran (its report aside). Stopping rather than start the same batch again.`
@@ -32782,7 +32832,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32782
32832
  const fresh = RunStateStore_1.RunStateStore.load(root, runId);
32783
32833
  const rec = fresh?.steps[stepIdx];
32784
32834
  if (!fresh || !rec) {
32785
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Run "${runId}" disappeared.` });
32835
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: `Run "${runId}" disappeared.` });
32786
32836
  return "failed";
32787
32837
  }
32788
32838
  recordProvenance(rec, { agent, resolvedModel, agentModel, skillIds, alternatives, modelOpts });
@@ -32798,6 +32848,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32798
32848
  hooks.onBatchDone?.({
32799
32849
  stepIdx,
32800
32850
  agent: agentId,
32851
+ label: stepLabel3(stepRec),
32801
32852
  revision: rec.revision,
32802
32853
  batch: batchNo,
32803
32854
  costUsd: cost,
@@ -32817,9 +32868,9 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32817
32868
  next = (0, PipelineRunner_1.markStepDone)({ state: freshState, pipeline, workspaceRoot: root });
32818
32869
  } catch (err) {
32819
32870
  if (err instanceof PipelineRunner_1.PipelineRunError && err.missing?.length) {
32820
- hooks.onStepFailed?.({ stepIdx, agent: agentId, missing: err.missing });
32871
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), missing: err.missing });
32821
32872
  } else {
32822
- hooks.onStepFailed?.({ stepIdx, agent: agentId, message: errMsg(err) });
32873
+ hooks.onStepFailed?.({ stepIdx, agent: agentId, label: stepLabel3(stepRec), message: errMsg(err) });
32823
32874
  }
32824
32875
  return "failed";
32825
32876
  }
@@ -32828,6 +32879,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32828
32879
  hooks.onStepResult?.({
32829
32880
  stepIdx,
32830
32881
  agent: agentId,
32882
+ label: stepLabel3(stepRec),
32831
32883
  status: doneStep.status,
32832
32884
  costUsd: doneStep.costUsd,
32833
32885
  costEstimated: doneStep.costEstimated,
@@ -32952,19 +33004,19 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32952
33004
  return false;
32953
33005
  }
32954
33006
  const step = state.steps[state.currentStepIdx];
32955
- hooks.onAutoReviewStart?.({ agent: step.agent });
33007
+ hooks.onAutoReviewStart?.({ agent: step.agent, label: stepLabel3(step) });
32956
33008
  let verdict;
32957
33009
  try {
32958
33010
  verdict = await (0, AutoReviewer_1.runAutoReview)({ workspaceRoot: root, state, pipeline });
32959
33011
  } catch (err) {
32960
- hooks.onStepFailed?.({ stepIdx: state.currentStepIdx, agent: step.agent, message: `Auto-review could not run: ${errMsg(err)}` });
33012
+ hooks.onStepFailed?.({ stepIdx: state.currentStepIdx, agent: step.agent, label: stepLabel3(step), message: `Auto-review could not run: ${errMsg(err)}` });
32961
33013
  return false;
32962
33014
  }
32963
33015
  let next;
32964
33016
  try {
32965
33017
  next = (0, PipelineRunner_1.submitAutoReviewVerdict)({ state, pipeline, verdict });
32966
33018
  } catch (err) {
32967
- hooks.onStepFailed?.({ stepIdx: state.currentStepIdx, agent: step.agent, message: errMsg(err) });
33019
+ hooks.onStepFailed?.({ stepIdx: state.currentStepIdx, agent: step.agent, label: stepLabel3(step), message: errMsg(err) });
32968
33020
  return false;
32969
33021
  }
32970
33022
  persist(root, next, state);
@@ -32972,6 +33024,7 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32972
33024
  const sentBack = verdict.decision === "reject" && next.currentStepIdx !== idx && next.steps[idx].status === "pending";
32973
33025
  hooks.onAutoReviewResult?.({
32974
33026
  agent: step.agent,
33027
+ label: stepLabel3(step),
32975
33028
  decision: verdict.decision,
32976
33029
  reason: next.steps[idx].rejectReason ?? verdict.reason,
32977
33030
  runId,
@@ -32979,12 +33032,19 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
32979
33032
  sentBackTo: {
32980
33033
  stepIdx: next.currentStepIdx,
32981
33034
  agent: next.steps[next.currentStepIdx].agent,
33035
+ label: stepLabel3(next.steps[next.currentStepIdx]),
32982
33036
  revision: next.steps[next.currentStepIdx].revision,
32983
33037
  count: next.sendBacks ?? 0,
32984
33038
  max: pipeline.max_send_backs ?? WorkspaceSchema_1.DEFAULT_MAX_SEND_BACKS
32985
33039
  }
32986
33040
  } : {}
32987
33041
  });
33042
+ const last = next.steps[idx].history?.at(-1);
33043
+ if (sentBack && last?.kind === "reject" && last.source === "handoff") {
33044
+ const target = next.steps[next.currentStepIdx];
33045
+ hooks.onAttendedStep?.({ stepIdx: next.currentStepIdx, agent: target.agent, label: stepLabel3(target), runId });
33046
+ return "handoff";
33047
+ }
32988
33048
  return true;
32989
33049
  }
32990
33050
  function isAutoSendBackTarget(state, stepIdx) {
@@ -33004,15 +33064,12 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
33004
33064
  async function autoApproveStep(root, state, hooks) {
33005
33065
  const ws = WorkspaceLoader_1.WorkspaceLoader.load(root);
33006
33066
  const pipeline = ws.config.pipelines.find((p) => p.id === state.pipelineId);
33007
- const next = { ...(0, PipelineRunner_1.approveStep)({ state, pipeline }), sendBacks: state.sendBacks };
33067
+ const next = { ...(0, PipelineRunner_1.approveStep)({ state, pipeline, auto: true }), sendBacks: state.sendBacks };
33008
33068
  persist(root, next, state);
33009
- hooks.onAutoApproved?.({ agent: state.steps[state.currentStepIdx].agent });
33069
+ hooks.onAutoApproved?.({ agent: state.steps[state.currentStepIdx].agent, label: stepLabel3(state.steps[state.currentStepIdx]) });
33010
33070
  }
33011
33071
  function persist(root, next, before) {
33012
33072
  RunStateStore_1.RunStateStore.save(root, next);
33013
- if (!before) {
33014
- return;
33015
- }
33016
33073
  let doc;
33017
33074
  try {
33018
33075
  doc = WorkspaceLoader_1.WorkspaceLoader.load(root).config;
@@ -33020,13 +33077,13 @@ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` :
33020
33077
  return;
33021
33078
  }
33022
33079
  const cfgDoc = doc;
33023
- if ((0, EpicArtifactCommit_1.resolveArtifactCommitConfig)(cfgDoc).mode !== "on_approve") {
33024
- return;
33025
- }
33026
33080
  try {
33027
33081
  (0, EpicScaffold_1.mirrorRunStateToEpic)(root, next, cfgDoc);
33028
33082
  } catch {
33029
33083
  }
33084
+ if (!before || (0, EpicArtifactCommit_1.resolveArtifactCommitConfig)(cfgDoc).mode !== "on_approve") {
33085
+ return;
33086
+ }
33030
33087
  (0, EpicArtifactCommit_1.commitApprovedArtifacts)({ workspaceRoot: root, before, after: next, doc: cfgDoc });
33031
33088
  }
33032
33089
  function errMsg(err) {
@@ -33176,11 +33233,13 @@ var require_runReport = __commonJS({
33176
33233
  case "auto_review":
33177
33234
  return ` - \u{1F916} auto-review ${h.decision} (rev ${h.revision}): ${h.reason}`;
33178
33235
  case "approve":
33179
- return ` - \u2714 approved (rev ${h.revision}${h.skill ? `, ${h.skill}` : ""}${h.model ? `, ${h.model}` : ""})`;
33236
+ return ` - \u2714 ${h.auto ? "auto-approved" : "approved"} (rev ${h.revision}${h.skill ? `, ${h.skill}` : ""}${h.model ? `, ${h.model}` : ""})`;
33180
33237
  case "undo":
33181
33238
  return ` - \u21B6 mark-done undone (rev ${h.revision}, was ${h.from})`;
33182
33239
  case "interrupted":
33183
33240
  return h.why === "timeout" ? ` - \u23F1 stopped after ${h.minutes ?? "?"} min (timeout_minutes, rev ${h.revision})` : ` - \u23F9 stopped mid-step (rev ${h.revision})`;
33241
+ case "feedback":
33242
+ return ` - \u270E launched with feedback (rev ${h.revision}): ${h.feedback}`;
33184
33243
  case "batch":
33185
33244
  return ` - \u21BB batch ${h.batch} done, more to come (rev ${h.revision}${typeof h.costUsd === "number" ? `, $${h.costUsd.toFixed(4)}` : ""})`;
33186
33245
  default:
@@ -33227,7 +33286,7 @@ var require_runReport = __commonJS({
33227
33286
  lines.push("| # | Step | Status | Rev | Engine | Duration | Cost |");
33228
33287
  lines.push("|---|------|--------|-----|--------|----------|------|");
33229
33288
  for (const step of state.steps) {
33230
- const label = stepLabel2(step, pipeline);
33289
+ const label = stepLabel3(step, pipeline);
33231
33290
  lines.push(`| ${step.stepIdx} | ${cell(label)} | ${step.status} | ${step.revision} | ${cell(formatEngine(step))} | ${formatDuration(step.startedAt, step.finishedAt)} | ${formatCost(step)} |`);
33232
33291
  }
33233
33292
  const detailed = state.steps.filter((s) => s.rejectReason || s.feedback || s.autoReviewVerdict || s.history && s.history.length > 0);
@@ -33236,7 +33295,7 @@ var require_runReport = __commonJS({
33236
33295
  lines.push("## Step details");
33237
33296
  for (const step of detailed) {
33238
33297
  lines.push("");
33239
- lines.push(`### Step ${step.stepIdx}: ${stepLabel2(step, pipeline)}`);
33298
+ lines.push(`### Step ${step.stepIdx}: ${stepLabel3(step, pipeline)}`);
33240
33299
  if (step.feedback) {
33241
33300
  lines.push(`- **Feedback:** ${step.feedback}`);
33242
33301
  }
@@ -33255,7 +33314,7 @@ var require_runReport = __commonJS({
33255
33314
  lines.push("");
33256
33315
  return lines.join("\n");
33257
33316
  }
33258
- function stepLabel2(step, pipeline) {
33317
+ function stepLabel3(step, pipeline) {
33259
33318
  const cfg = pipeline?.steps?.[step.stepIdx];
33260
33319
  if (cfg && typeof cfg === "object" && typeof cfg.name === "string") {
33261
33320
  return cfg.name;
@@ -35403,10 +35462,10 @@ var require_dist = __commonJS({
35403
35462
  exports2.generatePlan = exports2.collectContext = exports2.followUpHookFailures = exports2.pendingFollowUpDone = exports2.applyFollowUpHookRun = exports2.trackFollowUpChildren = exports2.writeFollowUpHookLedger = exports2.readFollowUpHookLedger = exports2.followUpHookLedgerPath = exports2.runFollowUpHook = exports2.fillFollowUpHookCommand = exports2.resolveFollowUpHooks = exports2.epicPipelineId = exports2.FOLLOW_UP_HOOK_TIMEOUT_MS = exports2.FOLLOW_UP_HOOKS_LEDGER = exports2.stepProducesFollowUps = exports2.collectFollowUpHookIssues = exports2.FOLLOW_UP_HOOK_PLACEHOLDERS = exports2.FOLLOW_UP_HOOK_KEYS = exports2.FOLLOW_UP_INTENT = exports2.FOLLOW_UPS_FILE = exports2.MANUAL_FOLLOW_UP_KEY_PREFIX = exports2.followUpDefaults = exports2.nextManualFollowUpKey = exports2.withFollowUpProvenance = exports2.openManifestFollowUp = exports2.combinedParentId = exports2.followUpChildId = exports2.followUpsOf = exports2.readEpicFollowUps = exports2.parseFollowUps = exports2.FollowUpsParseError = exports2.FollowUpManifestSchema = exports2.FollowUpItemSchema = exports2.SIGNAL_FILE = exports2.FOLLOW_UP_ARTIFACT = exports2.readEpicSignal = exports2.existingEpicIds = exports2.followUpIdFor = exports2.followUpEpicId = exports2.renderIntentMarkdown = exports2.openFollowUpEpic = exports2.openIncidentEpic = exports2.SignalParseError = exports2.isSignal = exports2.parseSignal = exports2.SignalSchema = exports2.EpicStepEditError = exports2.resolveStepRef = exports2.describeGateEffect = void 0;
35404
35463
  exports2.readUserConfig = exports2.readGitUserName = exports2.ensureUserConfigIgnored = exports2.USER_CONFIG_RELPATH = exports2.USER_CONFIG_IGNORE_LINE = exports2.suggestEpicId = exports2.resolveEpicIdPrefixChain = exports2.resolveEpicIdPrefix = exports2.epicIdDateStamp = exports2.deriveEpicIdPrefix = exports2.EPIC_ID_PREFIX_PATTERN = exports2.EPIC_ID_PREFIX_KEY = exports2.resolveArtifactLanguage = exports2.commandBodyPredatesArtifactLanguage = exports2.artifactLanguageSection = exports2.ARTIFACT_LANGUAGE_HEADING = exports2.stripPersonaDirectives = exports2.composeAgentPrompt = exports2.PROJECT_INSTRUCTION_FILES = exports2.findProjectInstructions = exports2.stripPersonaMetadata = exports2.PersonaLoader = exports2.SkillNotFoundError = exports2.SkillLoader = exports2.EnvVarMissingError = exports2.EnvResolver = exports2.epicPipelineReport = exports2.planEpicPipelineExtraction = exports2.epicOwningPipeline = exports2.unstageEpicPipeline = exports2.stageEpicPipeline = exports2.writeEpicPipelines = exports2.splitEpicPipelines = exports2.mergeEpicPipelines = exports2.epicPipelinePath = exports2.EPIC_PIPELINE_FILENAME = exports2.unusedAfterStepRemoval = exports2.skillReferences = exports2.agentReferences = exports2.renameSkillRefs = exports2.renameAgentRefs = exports2.dropRecipesForPipeline = exports2.dropRecipeStep = exports2.recipesDrawingFrom = exports2.WORKSPACE_DIR = exports2.WORKSPACE_FILENAME = exports2.WorkspaceParseError = exports2.WorkspaceNotFoundError = exports2.WorkspaceLoader = exports2.renderPlanMarkdown = void 0;
35405
35464
  exports2.hasEmptyCiChecks = exports2.findApprovalGate = exports2.autopilotPreflight = exports2.STOP_GRACE_MS = exports2.stopProcessTree = exports2.stopOnAbort = exports2.processGroupSpawnOptions = exports2.claudeModelArg = exports2.DefaultRunner = exports2.RunnerRegistry = exports2.targetPath = exports2.scopePaths = exports2.discoverAssets = exports2.commandBodyIsStale = exports2.readEpicTags = exports2.normalizeTags = exports2.normalizeTag = exports2.epicMatchesTags = exports2.applyTagEdit = exports2.MAX_TAG_LENGTH = exports2.EPIC_TAGS_KEY = exports2.inheritedContextNote = exports2.INHERITED_CONTEXT_MARKER = exports2.strictModeSection = exports2.resolveEpicStrictMode = exports2.epicStrictMode = exports2.commandBodyPredatesStrictMode = exports2.STRICT_MODE_KEY = exports2.STRICT_MODE_HEADING = exports2.setEpicWatched = exports2.setEpicListFlat = exports2.setEpicSort = exports2.setActiveEpic = exports2.recordEpicOpened = exports2.readEpicListFlat = exports2.readEpicSort = exports2.readEpicFocus = exports2.pushRecent = exports2.epicSortFrom = exports2.epicIdFromBranch = exports2.epicFocusFrom = exports2.WATCHED_EPICS_KEY = exports2.RECENT_EPICS_LIMIT = exports2.RECENT_EPICS_KEY = exports2.EPIC_LIST_FLAT_KEY = exports2.EPIC_SORT_KEY = exports2.ACTIVE_EPIC_KEY = exports2.writeUserEpicIdPrefix = exports2.userConfigPath = exports2.updateUserConfig = void 0;
35406
- exports2.isStepOptional = exports2.isRunComplete = exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = exports2.chooseStepModel = exports2.chooseStepSkill = exports2.requestStepUpdate = exports2.rerunStep = exports2.rejectStep = exports2.approveStep = exports2.undoStepDone = exports2.canUndoStepDone = exports2.markStepDone = exports2.canStartStep = exports2.startRun = exports2.activateBackendFromWorkspace = exports2.activateRunStateBackend = exports2.resolveRunStateBackend = exports2.GitRunStateStore = exports2.RUN_ID_PATTERN = exports2.FileRunStateStore = exports2.RunStateStore = exports2.harnessCapabilities = exports2.NO_HARNESS_CAPABILITIES = exports2.RunnerValidationError = exports2.validateRunnerExport = exports2.CustomRunnerLoader = exports2.buildClaudeSpawnEnv = exports2.hasClaudeLogin = exports2.isInsideClaudeCodeSession = exports2.createJsonSink = exports2.createLineSink = exports2.isCodexMcpConfigured = exports2.codexConfigPath = exports2.readProjectMcpServer = exports2.mcpRegistrarFor = exports2.codexMcpRegistrar = exports2.claudeMcpRegistrar = exports2.copilotMcpConfig = exports2.copilotGraphServer = exports2.CopilotRunner = exports2.CodexRunner = exports2.AUTOPILOT_ENV = exports2.APPROVAL_GATE_SCRIPT = exports2.emptyCiChecksMessage = void 0;
35407
- exports2.isClaudeTierAlias = exports2.CLAUDE_TIER_ALIASES = exports2.FAST_MODEL = exports2.CODING_MODEL = exports2.PLANNING_MODEL = exports2.isBuiltinPreset = exports2.BUILTIN_PRESET_IDS = exports2.writeBuiltinAutoReviewValidators = exports2.resolvePrimaryStack = exports2.getSdlcArtifactTemplates = exports2.getBuiltinArtifactTemplates = exports2.phaseArtifactFileName = exports2.sdlcClaudeCommand = exports2.builtinClaudeCommand = exports2.loadAllBuiltinPresets = exports2.loadBuiltinPreset = exports2.planRecipeMigration = exports2.getBuiltinRecipeSummaries = exports2.getAllBuiltinPipelineSummaries = exports2.getSdlcBuiltinPipelineSummary = exports2.getBuiltinPipelineSummary = exports2.getBuiltinWorkflowByPipelineId = exports2.getBuiltinWorkflow = exports2.workflowSlug = exports2.builtinTemplatesRoot = exports2.pipelineCommandId = exports2.PHASES = exports2.BUILTIN_WORKFLOWS = exports2.withBackfilledStepNames = exports2.describeDrift = exports2.reconcileRunSteps = exports2.RUN_STATE_SCHEMA_VERSION = exports2.migrateRunState = exports2.stepIdentity = exports2.resolvePath = exports2.AutoReviewerError = exports2.runAutoReview = exports2.renderRunReport = exports2.verifyRun = exports2.runExecLoop = exports2.estimateCostUsd = exports2.providerAliases = exports2.ratesFromConfig = exports2.mergeRates = exports2.BUILTIN_RATES = exports2.unchangedProduces = exports2.snapshotProduces = exports2.checkBudget = exports2.weighStepProgress = exports2.isActiveStatus = void 0;
35408
- exports2.defaultClaudeConfigDir = exports2.getClaudeConfigDirOverride = exports2.setClaudeConfigDir = exports2.resolveDeclaredPath = exports2.expandHome = exports2.ProfileLoadError = exports2.UnknownStandardError = exports2.builtinProfiles = exports2.loadActiveProfile = exports2.loadProfile = exports2.listProfileManifests = exports2.resolveStandard = exports2.workspaceStandard = exports2.isBuiltinProfileId = exports2.ProfileSchema = exports2.TRACE_RULES = exports2.PROFILES_DIR = exports2.DEFAULT_PROFILE_ID = exports2.BUILTIN_PROFILE_IDS = exports2.setEpicMemoryHook = exports2.isEpicMemoryHookEnabled = exports2.installAnnotationTools = exports2.relativeEpicRoot = exports2.provisionDeclaredWorkflows = exports2.provisionWorkflowFiles = exports2.writeWorkflowArtifactTemplates = exports2.writeWorkflowCommands = exports2.provisionShortcutDocs = exports2.writeTwoLayerCommands = exports2.shortcutCommandDoc = exports2.backboneCommandDoc = exports2.unprovisionedPhases = exports2.nextEligiblePhase = exports2.resolveComposition = exports2.shortcutCommandId = exports2.getCanonicalPhase = exports2.isCanonicalPhase = exports2.BACKBONE_COMMAND_ID = exports2.CANONICAL_PHASE_IDS = exports2.CANONICAL_PHASES = exports2.renderTemplate = exports2.DEFAULT_GLOBAL_WORKFLOW_IDS = exports2.detectGlobalBuiltinSource = exports2.uninstallWorkflowGlobalsByIds = exports2.isWorkflowGloballyInstalled = exports2.installWorkflowGlobalsByIds = exports2.installGlobalDefaults = exports2.stepModelOptions = exports2.pickAgentModel = exports2.resolveProviderModel = void 0;
35409
- exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = exports2.remapClaudePath = exports2.claudeConfigEnv = exports2.claudeJsonPath = exports2.isDefaultClaudeConfigDir = exports2.claudeConfigDir = exports2.resolveClaudeConfigDir = void 0;
35465
+ exports2.isRunComplete = exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = exports2.recordLaunchFeedback = exports2.chooseStepModel = exports2.chooseStepSkill = exports2.requestStepUpdate = exports2.rerunStep = exports2.rejectStep = exports2.approveStep = exports2.undoStepDone = exports2.canUndoStepDone = exports2.markStepDone = exports2.canStartStep = exports2.startRun = exports2.activateBackendFromWorkspace = exports2.activateRunStateBackend = exports2.resolveRunStateBackend = exports2.GitRunStateStore = exports2.RUN_ID_PATTERN = exports2.FileRunStateStore = exports2.RunStateStore = exports2.harnessCapabilities = exports2.NO_HARNESS_CAPABILITIES = exports2.RunnerValidationError = exports2.validateRunnerExport = exports2.CustomRunnerLoader = exports2.buildClaudeSpawnEnv = exports2.hasClaudeLogin = exports2.isInsideClaudeCodeSession = exports2.createJsonSink = exports2.createLineSink = exports2.isCodexMcpConfigured = exports2.codexConfigPath = exports2.readProjectMcpServer = exports2.mcpRegistrarFor = exports2.codexMcpRegistrar = exports2.claudeMcpRegistrar = exports2.copilotMcpConfig = exports2.copilotGraphServer = exports2.CopilotRunner = exports2.CodexRunner = exports2.AUTOPILOT_ENV = exports2.APPROVAL_GATE_SCRIPT = exports2.emptyCiChecksMessage = void 0;
35466
+ exports2.FAST_MODEL = exports2.CODING_MODEL = exports2.PLANNING_MODEL = exports2.isBuiltinPreset = exports2.BUILTIN_PRESET_IDS = exports2.writeBuiltinAutoReviewValidators = exports2.resolvePrimaryStack = exports2.getSdlcArtifactTemplates = exports2.getBuiltinArtifactTemplates = exports2.phaseArtifactFileName = exports2.sdlcClaudeCommand = exports2.builtinClaudeCommand = exports2.loadAllBuiltinPresets = exports2.loadBuiltinPreset = exports2.planRecipeMigration = exports2.getBuiltinRecipeSummaries = exports2.getAllBuiltinPipelineSummaries = exports2.getSdlcBuiltinPipelineSummary = exports2.getBuiltinPipelineSummary = exports2.getBuiltinWorkflowByPipelineId = exports2.getBuiltinWorkflow = exports2.workflowSlug = exports2.builtinTemplatesRoot = exports2.pipelineCommandId = exports2.PHASES = exports2.BUILTIN_WORKFLOWS = exports2.withBackfilledStepNames = exports2.describeDrift = exports2.reconcileRunSteps = exports2.RUN_STATE_SCHEMA_VERSION = exports2.migrateRunState = exports2.stepIdentity = exports2.resolvePath = exports2.AutoReviewerError = exports2.runAutoReview = exports2.renderRunReport = exports2.verifyRun = exports2.stepLabel = exports2.runExecLoop = exports2.estimateCostUsd = exports2.providerAliases = exports2.ratesFromConfig = exports2.mergeRates = exports2.BUILTIN_RATES = exports2.unchangedProduces = exports2.snapshotProduces = exports2.checkBudget = exports2.weighStepProgress = exports2.isActiveStatus = exports2.isStepOptional = void 0;
35467
+ exports2.setClaudeConfigDir = exports2.resolveDeclaredPath = exports2.expandHome = exports2.ProfileLoadError = exports2.UnknownStandardError = exports2.builtinProfiles = exports2.loadActiveProfile = exports2.loadProfile = exports2.listProfileManifests = exports2.resolveStandard = exports2.workspaceStandard = exports2.isBuiltinProfileId = exports2.ProfileSchema = exports2.TRACE_RULES = exports2.PROFILES_DIR = exports2.DEFAULT_PROFILE_ID = exports2.BUILTIN_PROFILE_IDS = exports2.setEpicMemoryHook = exports2.isEpicMemoryHookEnabled = exports2.installAnnotationTools = exports2.relativeEpicRoot = exports2.provisionDeclaredWorkflows = exports2.provisionWorkflowFiles = exports2.writeWorkflowArtifactTemplates = exports2.writeWorkflowCommands = exports2.provisionShortcutDocs = exports2.writeTwoLayerCommands = exports2.shortcutCommandDoc = exports2.backboneCommandDoc = exports2.unprovisionedPhases = exports2.nextEligiblePhase = exports2.resolveComposition = exports2.shortcutCommandId = exports2.getCanonicalPhase = exports2.isCanonicalPhase = exports2.BACKBONE_COMMAND_ID = exports2.CANONICAL_PHASE_IDS = exports2.CANONICAL_PHASES = exports2.renderTemplate = exports2.DEFAULT_GLOBAL_WORKFLOW_IDS = exports2.detectGlobalBuiltinSource = exports2.uninstallWorkflowGlobalsByIds = exports2.isWorkflowGloballyInstalled = exports2.installWorkflowGlobalsByIds = exports2.installGlobalDefaults = exports2.stepModelOptions = exports2.pickAgentModel = exports2.resolveProviderModel = exports2.isClaudeTierAlias = exports2.CLAUDE_TIER_ALIASES = void 0;
35468
+ exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = exports2.remapClaudePath = exports2.claudeConfigEnv = exports2.claudeJsonPath = exports2.isDefaultClaudeConfigDir = exports2.claudeConfigDir = exports2.resolveClaudeConfigDir = exports2.defaultClaudeConfigDir = exports2.getClaudeConfigDirOverride = void 0;
35410
35469
  var WorkspaceSchema_1 = require_WorkspaceSchema();
35411
35470
  Object.defineProperty(exports2, "WorkspaceSchema", { enumerable: true, get: function() {
35412
35471
  return WorkspaceSchema_1.WorkspaceSchema;
@@ -36179,6 +36238,9 @@ var require_dist = __commonJS({
36179
36238
  Object.defineProperty(exports2, "chooseStepModel", { enumerable: true, get: function() {
36180
36239
  return PipelineRunner_1.chooseStepModel;
36181
36240
  } });
36241
+ Object.defineProperty(exports2, "recordLaunchFeedback", { enumerable: true, get: function() {
36242
+ return PipelineRunner_1.recordLaunchFeedback;
36243
+ } });
36182
36244
  Object.defineProperty(exports2, "canRerunApprovedStep", { enumerable: true, get: function() {
36183
36245
  return PipelineRunner_1.canRerunApprovedStep;
36184
36246
  } });
@@ -36244,6 +36306,9 @@ var require_dist = __commonJS({
36244
36306
  Object.defineProperty(exports2, "runExecLoop", { enumerable: true, get: function() {
36245
36307
  return execEngine_1.runExecLoop;
36246
36308
  } });
36309
+ Object.defineProperty(exports2, "stepLabel", { enumerable: true, get: function() {
36310
+ return execEngine_1.stepLabel;
36311
+ } });
36247
36312
  var verifyRun_1 = require_verifyRun();
36248
36313
  Object.defineProperty(exports2, "verifyRun", { enumerable: true, get: function() {
36249
36314
  return verifyRun_1.verifyRun;
@@ -45228,7 +45293,7 @@ var require_package = __commonJS({
45228
45293
  "package.json"(exports2, module2) {
45229
45294
  module2.exports = {
45230
45295
  name: "@delete101020/aidlc",
45231
- version: "4.0.42",
45296
+ version: "4.0.45",
45232
45297
  description: "AIDLC Native CLI, a fork of AIDLC \u2014 drive Claude through the six-stage AI-Native SDLC Playbook: Plan \u2192 Design \u2192 Build \u2192 Test \u2192 Deploy \u2192 Maintain, with artifact gates, requirements traceability, an incident loop back to Plan, and Spec Kit support.",
45233
45298
  license: "MIT",
45234
45299
  repository: {
@@ -49034,7 +49099,7 @@ ${import_chalk5.default.bold(state.runId)} ${runColor(state.status)}`);
49034
49099
  const isCurrent = i === state.currentStepIdx && state.status === "running";
49035
49100
  const marker = isCurrent ? import_chalk5.default.yellow("\u25B6") : " ";
49036
49101
  const idxLabel = import_chalk5.default.dim(`${i}.`);
49037
- const agent = isCurrent ? import_chalk5.default.bold(step.agent) : import_chalk5.default.dim(step.agent);
49102
+ const agent = isCurrent ? import_chalk5.default.bold((0, import_core7.stepLabel)(step)) : import_chalk5.default.dim((0, import_core7.stepLabel)(step));
49038
49103
  const status = colorStatus(step.status);
49039
49104
  const rev = step.revision > 1 ? import_chalk5.default.dim(` rev${step.revision}`) : "";
49040
49105
  const feedback = step.feedback ? import_chalk5.default.dim(` [feedback: ${step.feedback.slice(0, 40)}]`) : "";
@@ -50057,7 +50122,7 @@ function registerRun(program3) {
50057
50122
  printRunSummary(state);
50058
50123
  const first = state.steps[0];
50059
50124
  if (first) {
50060
- console.log(import_chalk10.default.dim(` Current step: ${import_chalk10.default.bold(first.agent)} \u2014 awaiting_work`));
50125
+ console.log(import_chalk10.default.dim(` Current step: ${import_chalk10.default.bold((0, import_core13.stepLabel)(first))} \u2014 awaiting_work`));
50061
50126
  console.log(import_chalk10.default.dim(` When done: aidlc run mark-done ${runId}`));
50062
50127
  }
50063
50128
  });
@@ -50094,13 +50159,13 @@ function registerRun(program3) {
50094
50159
  return;
50095
50160
  }
50096
50161
  if (step.status === prevStatus) {
50097
- console.log(import_chalk10.default.dim(`\u2022 Step "${step.agent}" is already ${step.status} \u2014 nothing to do.`));
50162
+ console.log(import_chalk10.default.dim(`\u2022 Step "${(0, import_core13.stepLabel)(step)}" is already ${step.status} \u2014 nothing to do.`));
50098
50163
  } else if (step.status === "awaiting_review") {
50099
- console.log(import_chalk10.default.cyan("\u2714") + ` Step "${step.agent}" is now ${import_chalk10.default.cyan("awaiting_review")}`);
50164
+ console.log(import_chalk10.default.cyan("\u2714") + ` Step "${(0, import_core13.stepLabel)(step)}" is now ${import_chalk10.default.cyan("awaiting_review")}`);
50100
50165
  console.log(import_chalk10.default.dim(` Approve: aidlc run approve ${runId}`));
50101
50166
  console.log(import_chalk10.default.dim(` Reject: aidlc run reject ${runId} --reason "..."`));
50102
50167
  } else {
50103
- console.log(import_chalk10.default.green("\u2714") + ` Step "${step.agent}" approved, advancing\u2026`);
50168
+ console.log(import_chalk10.default.green("\u2714") + ` Step "${(0, import_core13.stepLabel)(step)}" approved, advancing\u2026`);
50104
50169
  printRunSummary(next);
50105
50170
  }
50106
50171
  });
@@ -50120,7 +50185,7 @@ function registerRun(program3) {
50120
50185
  }
50121
50186
  saveRunState(root, next, state);
50122
50187
  const approvedStep = state.steps[state.currentStepIdx];
50123
- console.log(import_chalk10.default.green("\u2714") + ` Approved "${approvedStep.agent}"`);
50188
+ console.log(import_chalk10.default.green("\u2714") + ` Approved "${(0, import_core13.stepLabel)(approvedStep)}"`);
50124
50189
  printRunSummary(next);
50125
50190
  if (next.status === "completed") {
50126
50191
  console.log(import_chalk10.default.green("\u{1F389} Run completed \u2014 all steps approved."));
@@ -50138,7 +50203,7 @@ function registerRun(program3) {
50138
50203
  targetIdx = requireStepIdx(state, opts.to);
50139
50204
  if (targetIdx >= idx) {
50140
50205
  console.error(import_chalk10.default.red(
50141
- `--to must name a step before the rejected one (${idx}:${state.steps[idx].agent}), got ${targetIdx}:${state.steps[targetIdx].agent}.`
50206
+ `--to must name a step before the rejected one (${idx}:${(0, import_core13.stepLabel)(state.steps[idx])}), got ${targetIdx}:${(0, import_core13.stepLabel)(state.steps[targetIdx])}.`
50142
50207
  ));
50143
50208
  process.exit(1);
50144
50209
  }
@@ -50154,13 +50219,13 @@ function registerRun(program3) {
50154
50219
  const step = state.steps[idx];
50155
50220
  if (targetIdx !== void 0) {
50156
50221
  const target = next.steps[targetIdx];
50157
- console.log(import_chalk10.default.red("\u2718") + ` Rejected "${step.agent}" \u2014 sent back to "${target.agent}" (rev ${target.revision})`);
50222
+ console.log(import_chalk10.default.red("\u2718") + ` Rejected "${(0, import_core13.stepLabel)(step)}" \u2014 sent back to "${(0, import_core13.stepLabel)(target)}" (rev ${target.revision})`);
50158
50223
  console.log(import_chalk10.default.dim(` Reason: ${opts.reason}`));
50159
50224
  console.log(import_chalk10.default.dim(` When done: aidlc run mark-done ${runId}`));
50160
50225
  printRunSummary(next);
50161
50226
  return;
50162
50227
  }
50163
- console.log(import_chalk10.default.red("\u2718") + ` Rejected "${step.agent}"`);
50228
+ console.log(import_chalk10.default.red("\u2718") + ` Rejected "${(0, import_core13.stepLabel)(step)}"`);
50164
50229
  console.log(import_chalk10.default.dim(` Reason: ${opts.reason}`));
50165
50230
  console.log(import_chalk10.default.dim(` Rerun: aidlc run rerun ${runId} [--feedback "..."]`));
50166
50231
  });
@@ -50181,7 +50246,7 @@ function registerRun(program3) {
50181
50246
  }
50182
50247
  saveRunState(root, next, state);
50183
50248
  const step = next.steps[stepIdx ?? next.currentStepIdx];
50184
- console.log(import_chalk10.default.yellow("\u21BA") + ` Rerunning "${step.agent}" (rev ${step.revision})`);
50249
+ console.log(import_chalk10.default.yellow("\u21BA") + ` Rerunning "${(0, import_core13.stepLabel)(step)}" (rev ${step.revision})`);
50185
50250
  if (opts.feedback) {
50186
50251
  console.log(import_chalk10.default.dim(` Feedback: ${opts.feedback}`));
50187
50252
  }
@@ -50204,7 +50269,7 @@ function registerRun(program3) {
50204
50269
  }
50205
50270
  saveRunState(root, next, state);
50206
50271
  const target = next.steps[stepIdx];
50207
- console.log(import_chalk10.default.yellow("\u21BB") + ` Reopened "${target.agent}" for update (rev ${target.revision})`);
50272
+ console.log(import_chalk10.default.yellow("\u21BB") + ` Reopened "${(0, import_core13.stepLabel)(target)}" for update (rev ${target.revision})`);
50208
50273
  if (opts.feedback) {
50209
50274
  console.log(import_chalk10.default.dim(` Feedback: ${opts.feedback}`));
50210
50275
  }
@@ -50227,7 +50292,7 @@ function registerRun(program3) {
50227
50292
  }
50228
50293
  saveRunState(root, next, state);
50229
50294
  const target = next.steps[stepIdx];
50230
- console.log(import_chalk10.default.yellow("\u21BA") + ` Rerunning "${target.agent}" (rev ${target.revision})`);
50295
+ console.log(import_chalk10.default.yellow("\u21BA") + ` Rerunning "${(0, import_core13.stepLabel)(target)}" (rev ${target.revision})`);
50231
50296
  if (opts.feedback) {
50232
50297
  console.log(import_chalk10.default.dim(` Feedback: ${opts.feedback}`));
50233
50298
  }
@@ -50235,7 +50300,7 @@ function registerRun(program3) {
50235
50300
  if (marked.length > 0) {
50236
50301
  console.log(import_chalk10.default.yellow(` \u26A0 ${marked.length} approved step(s) downstream kept and marked dirty:`));
50237
50302
  for (const m of marked) {
50238
- console.log(import_chalk10.default.dim(` ${m.stepIdx}. ${m.name ?? m.agent}`));
50303
+ console.log(import_chalk10.default.dim(` ${m.stepIdx}. ${(0, import_core13.stepLabel)(m)}`));
50239
50304
  }
50240
50305
  console.log(import_chalk10.default.dim(" They still count as done. Redo each one to clear its mark."));
50241
50306
  }
@@ -50295,7 +50360,7 @@ function registerRun(program3) {
50295
50360
  console.error(import_chalk10.default.red("\u2718") + ` Drift detected in ${report.drift.length} of ${report.checked} step(s):`);
50296
50361
  for (const d of report.drift) {
50297
50362
  console.error(import_chalk10.default.yellow(`
50298
- Step ${d.stepIdx} (${d.agent}) \u2014 ${d.status}`));
50363
+ Step ${d.stepIdx} (${(0, import_core13.stepLabel)(state.steps[d.stepIdx] ?? d)}) \u2014 ${d.status}`));
50299
50364
  for (const m of d.missing) {
50300
50365
  console.error(import_chalk10.default.dim(` \u2718 missing file: ${m}`));
50301
50366
  }
@@ -50341,7 +50406,7 @@ function execExitCode(outcome, requireComplete) {
50341
50406
  if (requireComplete) {
50342
50407
  return 1;
50343
50408
  }
50344
- if (outcome.kind === "until") {
50409
+ if (outcome.kind === "until" || outcome.kind === "attended") {
50345
50410
  return 0;
50346
50411
  }
50347
50412
  return 2;
@@ -50406,7 +50471,7 @@ async function driveAutoReview(root, runId, state) {
50406
50471
  const pipeline = requirePipelineForRun(root, state);
50407
50472
  const step = state.steps[state.currentStepIdx];
50408
50473
  console.log(import_chalk10.default.bold(`
50409
- \u{1F50D} Auto-review: "${step.agent}"`));
50474
+ \u{1F50D} Auto-review: "${(0, import_core13.stepLabel)(step)}"`));
50410
50475
  let verdict;
50411
50476
  try {
50412
50477
  verdict = await (0, import_core13.runAutoReview)({ workspaceRoot: root, state, pipeline });
@@ -50432,7 +50497,7 @@ async function driveAutoReview(root, runId, state) {
50432
50497
  console.log(import_chalk10.default.green("\u2714") + " Auto-review passed" + import_chalk10.default.dim(` \u2014 ${verdict.reason}`));
50433
50498
  const after = next.steps[state.currentStepIdx];
50434
50499
  if (after.status === "awaiting_review") {
50435
- console.log(import_chalk10.default.cyan("\u2714") + ` Step "${after.agent}" is now ${import_chalk10.default.cyan("awaiting_review")}`);
50500
+ console.log(import_chalk10.default.cyan("\u2714") + ` Step "${(0, import_core13.stepLabel)(after)}" is now ${import_chalk10.default.cyan("awaiting_review")}`);
50436
50501
  console.log(import_chalk10.default.dim(` Approve: aidlc run approve ${runId}`));
50437
50502
  console.log(import_chalk10.default.dim(` Reject: aidlc run reject ${runId} --reason "..."`));
50438
50503
  }
@@ -50448,7 +50513,7 @@ function cliExecHooks(runId, claudeOut) {
50448
50513
  ${reason}`)),
50449
50514
  onStepStart: (e) => {
50450
50515
  info(import_chalk10.default.bold(`
50451
- \u25B6 Step ${e.stepIdx}: ${e.agent}`) + import_chalk10.default.dim(` (rev ${e.revision})`));
50516
+ \u25B6 Step ${e.stepIdx}: ${e.label}`) + import_chalk10.default.dim(` (rev ${e.revision})`));
50452
50517
  info(import_chalk10.default.dim(` skills: ${e.skills.join(", ")} model: ${e.model ?? import_core13.CODING_MODEL}`));
50453
50518
  if (e.context) {
50454
50519
  info(import_chalk10.default.dim(` context: ${e.context}`));
@@ -50464,13 +50529,13 @@ ${reason}`)),
50464
50529
  sep4();
50465
50530
  if (e.status === "awaiting_auto_review") {
50466
50531
  info(import_chalk10.default.cyan(`
50467
- \u2714 Step "${e.agent}" done \u2014 auto-review pending.`));
50532
+ \u2714 Step "${e.label}" done \u2014 auto-review pending.`));
50468
50533
  } else if (e.status === "awaiting_review") {
50469
50534
  info(import_chalk10.default.cyan(`
50470
- \u2714 Step "${e.agent}" done \u2014 awaiting review.`));
50535
+ \u2714 Step "${e.label}" done \u2014 awaiting review.`));
50471
50536
  } else {
50472
50537
  info(import_chalk10.default.green(`
50473
- \u2714 Step "${e.agent}" approved.`));
50538
+ \u2714 Step "${e.label}" approved.`));
50474
50539
  }
50475
50540
  if (typeof e.costUsd === "number") {
50476
50541
  info(import_chalk10.default.dim(` cost: $${e.costUsd.toFixed(4)}`));
@@ -50485,24 +50550,24 @@ ${reason}`)),
50485
50550
  console.error(import_chalk10.default.dim("\n Produce the files above, then: aidlc run mark-done " + runId));
50486
50551
  } else {
50487
50552
  console.error(import_chalk10.default.red(`
50488
- \u2718 ${e.message ?? `Step "${e.agent}" failed.`}`));
50553
+ \u2718 ${e.message ?? `Step "${e.label}" failed.`}`));
50489
50554
  console.error(import_chalk10.default.dim(" Fix the issue then retry: aidlc run exec " + runId));
50490
50555
  }
50491
50556
  },
50492
50557
  onAwaitingReview: (e) => {
50493
50558
  info(import_chalk10.default.cyan(`
50494
- \u23F8 Step "${e.agent}" is awaiting human review.`));
50559
+ \u23F8 Step "${e.label}" is awaiting human review.`));
50495
50560
  info(import_chalk10.default.dim(` Approve: aidlc run approve ${e.runId}`));
50496
50561
  info(import_chalk10.default.dim(` Reject: aidlc run reject ${e.runId} --reason "..."`));
50497
50562
  },
50498
50563
  onRejected: (e) => {
50499
50564
  info(import_chalk10.default.red(`
50500
- \u2718 Step "${e.agent}" was rejected.`));
50565
+ \u2718 Step "${e.label}" was rejected.`));
50501
50566
  info(import_chalk10.default.dim(` Rerun: aidlc run rerun ${e.runId} [--feedback "..."]`));
50502
50567
  },
50503
50568
  onStepStopped: (e) => {
50504
50569
  info(import_chalk10.default.yellow(`
50505
- \u23F9 Stopped "${e.agent}" mid-step (rev ${e.revision}). It is still awaiting work.`));
50570
+ \u23F9 Stopped "${e.label}" mid-step (rev ${e.revision}). It is still awaiting work.`));
50506
50571
  info(import_chalk10.default.dim(" Anything it half-wrote is still in the working tree \u2014 check git status."));
50507
50572
  info(import_chalk10.default.dim(` Resume: aidlc run exec ${e.runId}`));
50508
50573
  },
@@ -50516,14 +50581,14 @@ ${reason}`)),
50516
50581
  onBatchDone: (e) => {
50517
50582
  sep4();
50518
50583
  info(import_chalk10.default.cyan(`
50519
- \u21BB Batch ${e.batch} of "${e.agent}" done \u2014 starting the next in a fresh session.`));
50584
+ \u21BB Batch ${e.batch} of "${e.label}" done \u2014 starting the next in a fresh session.`));
50520
50585
  if (typeof e.costUsd === "number") {
50521
50586
  info(import_chalk10.default.dim(` cost: $${e.costUsd.toFixed(4)}`));
50522
50587
  }
50523
50588
  },
50524
50589
  onBatchPause: (e) => {
50525
50590
  info(import_chalk10.default.cyan(`
50526
- \u23F8 Batch ${e.batch} of "${e.agent}" done; pausing (pause_between_batches).`));
50591
+ \u23F8 Batch ${e.batch} of "${e.label}" done; pausing (pause_between_batches).`));
50527
50592
  if (e.report) {
50528
50593
  info(import_chalk10.default.dim(` Progress: ${e.report}`));
50529
50594
  }
@@ -50531,23 +50596,23 @@ ${reason}`)),
50531
50596
  },
50532
50597
  onStepSkipped: (e) => {
50533
50598
  info(import_chalk10.default.yellow(`
50534
- \u2933 Step "${e.agent}" was rejected \u2014 carrying on.`) + import_chalk10.default.dim(` ${e.reason}`));
50599
+ \u2933 Step "${e.label}" was rejected \u2014 carrying on.`) + import_chalk10.default.dim(` ${e.reason}`));
50535
50600
  info(import_chalk10.default.dim(` Want it back? aidlc run rerun ${e.runId} --step ${e.stepIdx}`));
50536
50601
  },
50537
50602
  onAutoReviewStart: (e) => info(import_chalk10.default.bold(`
50538
- \u{1F50D} Auto-review: "${e.agent}"`)),
50603
+ \u{1F50D} Auto-review: "${e.label}"`)),
50539
50604
  onAutoReviewResult: (e) => {
50540
50605
  if (e.decision === "pass") {
50541
50606
  info(import_chalk10.default.green("\u2714 Auto-review passed") + import_chalk10.default.dim(` \u2014 ${e.reason}`));
50542
50607
  } else if (e.sentBackTo) {
50543
50608
  const to = e.sentBackTo;
50544
- info(import_chalk10.default.yellow(`\u21A9 Auto-review rejected \u2014 sent back to "${to.agent}" (rev ${to.revision}, send-back ${to.count} of ${to.max})`) + import_chalk10.default.dim(` \u2014 ${e.reason}`));
50609
+ info(import_chalk10.default.yellow(`\u21A9 Auto-review rejected \u2014 sent back to "${to.label}" (rev ${to.revision}, send-back ${to.count} of ${to.max})`) + import_chalk10.default.dim(` \u2014 ${e.reason}`));
50545
50610
  } else {
50546
50611
  info(import_chalk10.default.red("\u2718 Auto-review rejected") + import_chalk10.default.dim(` \u2014 ${e.reason}`));
50547
50612
  info(import_chalk10.default.dim(` Fix the issue, then: aidlc run rerun ${e.runId} [--feedback "..."]`));
50548
50613
  }
50549
50614
  },
50550
- onAutoApproved: (e) => info(import_chalk10.default.green(`\u2714 Auto-approved "${e.agent}" (--auto-approve)`)),
50615
+ onAutoApproved: (e) => info(import_chalk10.default.green(`\u2714 Auto-approved "${e.label}" (--auto-approve)`)),
50551
50616
  onBudget: (e) => {
50552
50617
  const caveats = [];
50553
50618
  if (e.estimated && e.estimated > 0) {
@@ -50571,6 +50636,8 @@ ${reason}`)),
50571
50636
  },
50572
50637
  onUntilStop: (e) => info(import_chalk10.default.dim(`
50573
50638
  Stopped at step ${e.untilIdx} as requested.`)),
50639
+ onAttendedStep: (e) => info(import_chalk10.default.dim(`
50640
+ Stopped before step ${e.stepIdx + 1} \xB7 ${e.label} \u2014 a person runs it.`)),
50574
50641
  onDryRunPreview: (e) => {
50575
50642
  const layers = [
50576
50643
  e.inlined.persona ? "persona" : null,
@@ -50833,12 +50900,12 @@ function render(root, runIdFilter) {
50833
50900
  for (const run of filtered) {
50834
50901
  const stepNum = `${run.currentStepIdx + 1}/${run.steps.length}`;
50835
50902
  const current = run.steps[run.currentStepIdx];
50836
- const stepLabel2 = current ? `${stepNum} ${current.agent} ${import_chalk12.default.dim(`(${current.status})`)}` : stepNum;
50903
+ const stepLabel3 = current ? `${stepNum} ${current.agent} ${import_chalk12.default.dim(`(${current.status})`)}` : stepNum;
50837
50904
  table.push([
50838
50905
  import_chalk12.default.bold(run.runId),
50839
50906
  import_chalk12.default.dim(run.pipelineId),
50840
50907
  colorRunStatus(run.status),
50841
- stepLabel2,
50908
+ stepLabel3,
50842
50909
  import_chalk12.default.dim(humanizeTime(run.updatedAt))
50843
50910
  ]);
50844
50911
  }
@@ -51967,12 +52034,12 @@ function registerEpic(program3) {
51967
52034
  const total = epic.stepDetails.length;
51968
52035
  const done = epic.stepDetails.filter((s) => s.status === "done").length;
51969
52036
  const pct = epicProgress(epic).percent;
51970
- const stepLabel2 = total ? `${done}/${total} (${pct}%)` : "\u2014";
52037
+ const stepLabel3 = total ? `${done}/${total} (${pct}%)` : "\u2014";
51971
52038
  table.push([
51972
52039
  import_chalk15.default.bold(epic.id),
51973
52040
  truncate(epic.title || import_chalk15.default.dim("(untitled)"), 40),
51974
52041
  epic.tags.length > 0 ? import_chalk15.default.cyan(truncate(epic.tags.join(" "), 28)) : import_chalk15.default.dim("\u2014"),
51975
- stepLabel2,
52042
+ stepLabel3,
51976
52043
  colorEpicStatus(epic.status),
51977
52044
  import_chalk15.default.dim(epic.pipeline ?? "\u2014")
51978
52045
  ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delete101020/aidlc",
3
- "version": "4.0.42",
3
+ "version": "4.0.45",
4
4
  "description": "AIDLC Native CLI, a fork of AIDLC — drive Claude through the six-stage AI-Native SDLC Playbook: Plan → Design → Build → Test → Deploy → Maintain, with artifact gates, requirements traceability, an incident loop back to Plan, and Spec Kit support.",
5
5
  "license": "MIT",
6
6
  "repository": {