@delete101020/aidlc 4.0.22 → 4.0.23

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 +111 -29
  2. package/package.json +1 -1
package/dist/bundle.js CHANGED
@@ -19765,6 +19765,8 @@ var require_WorkspaceSchema = __commonJS({
19765
19765
  Object.defineProperty(exports2, "__esModule", { value: true });
19766
19766
  exports2.WorkspaceValidationError = exports2.WorkspaceSchema = void 0;
19767
19767
  exports2.normalizeStep = normalizeStep4;
19768
+ exports2.stepSkillAlternatives = stepSkillAlternatives;
19769
+ exports2.resolveStepSkills = resolveStepSkills;
19768
19770
  exports2.producesEntries = producesEntries;
19769
19771
  exports2.stepAgentId = stepAgentId3;
19770
19772
  exports2.stepDagId = stepDagId;
@@ -19891,6 +19893,18 @@ var require_WorkspaceSchema = __commonJS({
19891
19893
  * string); the normalizer coerces it into a single-entry array.
19892
19894
  */
19893
19895
  skills: zod_1.z.array(zod_1.z.string().min(1)).optional(),
19896
+ /**
19897
+ * Turns `skills` from "all of these" into "one of these": the person
19898
+ * picks which skill runs before launching the step, and this one is
19899
+ * preselected — and is what the unattended runner uses when nobody
19900
+ * picked. For interchangeable implementations of one step (two review
19901
+ * skills that differ only in the tool they drive), where loading both
19902
+ * would have the model run both procedures, or blend them.
19903
+ *
19904
+ * Must be one of `skills`. Omitted = every listed skill is available at
19905
+ * once, as before.
19906
+ */
19907
+ default_skill: zod_1.z.string().min(1).optional(),
19894
19908
  /** Artifact paths required from upstream. Gate-checked before work AND on Mark step done. */
19895
19909
  requires: zod_1.z.array(zod_1.z.string().min(1)).default([]),
19896
19910
  /**
@@ -19938,6 +19952,9 @@ var require_WorkspaceSchema = __commonJS({
19938
19952
  /** Open a PR after pushing (only valid when push=true). */
19939
19953
  open_pr: zod_1.z.boolean().default(true)
19940
19954
  }).optional()
19955
+ }).refine((s) => !s.default_skill || (s.skills ?? []).includes(s.default_skill), {
19956
+ message: "`default_skill` must be one of the step's `skills`.",
19957
+ path: ["default_skill"]
19941
19958
  }).refine((s) => !s.auto_review || !!s.auto_review_runner, {
19942
19959
  message: "Step with `auto_review: true` must set `auto_review_runner` (path to a JS/TS validator module).",
19943
19960
  path: ["auto_review_runner"]
@@ -20042,6 +20059,7 @@ var require_WorkspaceSchema = __commonJS({
20042
20059
  name: typeof obj.name === "string" ? obj.name : void 0,
20043
20060
  ...typeof obj.description === "string" && obj.description.trim() ? { description: obj.description.trim() } : {},
20044
20061
  skills,
20062
+ ...typeof obj.default_skill === "string" && skills?.includes(obj.default_skill) ? { default_skill: obj.default_skill } : {},
20045
20063
  enabled: typeof obj.enabled === "boolean" ? obj.enabled : true,
20046
20064
  optional: obj.optional === true,
20047
20065
  produces,
@@ -20056,6 +20074,19 @@ var require_WorkspaceSchema = __commonJS({
20056
20074
  ...git && { git }
20057
20075
  };
20058
20076
  }
20077
+ function stepSkillAlternatives(norm) {
20078
+ if (!norm.default_skill || !norm.skills?.includes(norm.default_skill)) {
20079
+ return void 0;
20080
+ }
20081
+ return { options: norm.skills, defaultSkill: norm.default_skill };
20082
+ }
20083
+ function resolveStepSkills(norm, agentSkills, chosen) {
20084
+ const alt = stepSkillAlternatives(norm);
20085
+ if (alt) {
20086
+ return [chosen && alt.options.includes(chosen) ? chosen : alt.defaultSkill];
20087
+ }
20088
+ return norm.skills && norm.skills.length > 0 ? [...norm.skills] : [...agentSkills];
20089
+ }
20059
20090
  function producesEntries(norm) {
20060
20091
  const optional = new Set(norm.produces_optional);
20061
20092
  return norm.produces.map((p) => optional.has(p) ? { path: p, optional: true } : p);
@@ -20406,6 +20437,9 @@ var require_PipelineAssembler = __commonJS({
20406
20437
  if (norm.skills && norm.skills.length > 0) {
20407
20438
  step.skills = norm.skills;
20408
20439
  }
20440
+ if (norm.default_skill) {
20441
+ step.default_skill = norm.default_skill;
20442
+ }
20409
20443
  if (auto_review_runner) {
20410
20444
  step.auto_review_runner = auto_review_runner;
20411
20445
  }
@@ -20734,6 +20768,9 @@ ${raw.slice(0, 200)}`);
20734
20768
  if (norm.skills && norm.skills.length > 0) {
20735
20769
  step.skills = norm.skills;
20736
20770
  }
20771
+ if (norm.default_skill) {
20772
+ step.default_skill = norm.default_skill;
20773
+ }
20737
20774
  if (norm.auto_review_runner) {
20738
20775
  step.auto_review_runner = norm.auto_review_runner;
20739
20776
  }
@@ -21176,6 +21213,7 @@ var require_PipelineRunner = __commonJS({
21176
21213
  exports2.approveStep = approveStep3;
21177
21214
  exports2.rejectStep = rejectStep3;
21178
21215
  exports2.rerunStep = rerunStep3;
21216
+ exports2.chooseStepSkill = chooseStepSkill;
21179
21217
  exports2.requestStepUpdate = requestStepUpdate2;
21180
21218
  exports2.dirtyUpstreamOf = dirtyUpstreamOf2;
21181
21219
  exports2.canRerunApprovedStep = canRerunApprovedStep;
@@ -21460,7 +21498,8 @@ var require_PipelineRunner = __commonJS({
21460
21498
  at: verdict.at,
21461
21499
  revision: nextStep.revision,
21462
21500
  reason: verdict.reason,
21463
- sentBackToIdx: idx
21501
+ sentBackToIdx: idx,
21502
+ ...nextStep.skill ? { skill: nextStep.skill } : {}
21464
21503
  });
21465
21504
  next.status = "running";
21466
21505
  settleOptionalRejection(next, idx, pipeline);
@@ -21537,7 +21576,8 @@ var require_PipelineRunner = __commonJS({
21537
21576
  at: now,
21538
21577
  revision: next2.steps[idx].revision,
21539
21578
  reason,
21540
- sentBackToIdx: targetIdx
21579
+ sentBackToIdx: targetIdx,
21580
+ ...next2.steps[idx].skill ? { skill: next2.steps[idx].skill } : {}
21541
21581
  });
21542
21582
  const usesDag = pipeline ? pipeline.steps.map(WorkspaceSchema_1.normalizeStep).some((s) => s.depends_on.length > 0) : false;
21543
21583
  const targetIdxN = targetIdx;
@@ -21600,7 +21640,8 @@ var require_PipelineRunner = __commonJS({
21600
21640
  at: now,
21601
21641
  revision: step.revision,
21602
21642
  reason,
21603
- sentBackToIdx: idx
21643
+ sentBackToIdx: idx,
21644
+ ...step.skill ? { skill: step.skill } : {}
21604
21645
  })
21605
21646
  };
21606
21647
  next.status = "running";
@@ -21641,6 +21682,24 @@ var require_PipelineRunner = __commonJS({
21641
21682
  next.status = "running";
21642
21683
  return next;
21643
21684
  }
21685
+ function chooseStepSkill(args) {
21686
+ const { state, pipeline, stepIdx, skill } = args;
21687
+ if (!Number.isInteger(stepIdx) || stepIdx < 0 || stepIdx >= state.steps.length) {
21688
+ throw new PipelineRunError3(`Invalid stepIdx ${stepIdx}`);
21689
+ }
21690
+ const target = state.steps[stepIdx];
21691
+ const cfg = pipeline.steps[target.stepIdx];
21692
+ const alt = cfg ? (0, WorkspaceSchema_1.stepSkillAlternatives)((0, WorkspaceSchema_1.normalizeStep)(cfg)) : void 0;
21693
+ if (!alt) {
21694
+ throw new PipelineRunError3(`Step "${target.agent}" has no alternative skills to choose from.`);
21695
+ }
21696
+ if (!alt.options.includes(skill)) {
21697
+ throw new PipelineRunError3(`Skill "${skill}" is not one of step "${target.agent}"'s alternatives (${alt.options.join(", ")}).`);
21698
+ }
21699
+ const next = clone(state);
21700
+ next.steps[stepIdx] = { ...target, skill };
21701
+ return next;
21702
+ }
21644
21703
  function requestStepUpdate2(args) {
21645
21704
  const { state, pipeline, stepIdx, feedback } = args;
21646
21705
  if (!Number.isInteger(stepIdx) || stepIdx < 0 || stepIdx >= state.steps.length) {
@@ -21857,7 +21916,8 @@ var require_PipelineRunner = __commonJS({
21857
21916
  history: pushHistory(approved.history, {
21858
21917
  kind: "approve",
21859
21918
  at: finishedAt,
21860
- revision: approved.revision
21919
+ revision: approved.revision,
21920
+ ...approved.skill ? { skill: approved.skill } : {}
21861
21921
  })
21862
21922
  };
21863
21923
  const normalized = pipeline.steps.map(WorkspaceSchema_1.normalizeStep);
@@ -29485,6 +29545,10 @@ var require_renameRefs = __commonJS({
29485
29545
  obj.skill = newId;
29486
29546
  moved = true;
29487
29547
  }
29548
+ if (obj.default_skill === oldId) {
29549
+ obj.default_skill = newId;
29550
+ moved = true;
29551
+ }
29488
29552
  return moved;
29489
29553
  }
29490
29554
  function declaredSkills(obj) {
@@ -30707,6 +30771,7 @@ var require_execEngine = __commonJS({
30707
30771
  var budget_1 = require_budget();
30708
30772
  var pricing_1 = require_pricing();
30709
30773
  var models_1 = require_models();
30774
+ var WorkspaceSchema_1 = require_WorkspaceSchema();
30710
30775
  var artifactLanguage_1 = require_artifactLanguage();
30711
30776
  var strictMode_1 = require_strictMode();
30712
30777
  var promptComposer_1 = require_promptComposer();
@@ -30848,13 +30913,13 @@ var require_execEngine = __commonJS({
30848
30913
  }
30849
30914
  }
30850
30915
  }
30851
- function loadAgentSkills3(ws, agent) {
30852
- return agent.skills.map((id) => ws.skills.load(id)).join("\n\n---\n\n");
30916
+ function loadSkills(ws, skillIds) {
30917
+ return skillIds.map((id) => ws.skills.load(id)).join("\n\n---\n\n");
30853
30918
  }
30854
- function buildStepPrompt(ws, agent, runner, root, epicId) {
30919
+ function buildStepPrompt(ws, agent, skillIds, runner, root, epicId) {
30855
30920
  const harness = (0, types_1.harnessCapabilities)(runner);
30856
30921
  return (0, promptComposer_1.composeAgentPrompt)({
30857
- skills: loadAgentSkills3(ws, agent),
30922
+ skills: loadSkills(ws, skillIds),
30858
30923
  persona: ws.personas.load(agent.id),
30859
30924
  instructions: harness.projectInstructions ? null : (0, projectInstructions_1.findProjectInstructions)(root, harness.instructionFile),
30860
30925
  harness,
@@ -30885,6 +30950,11 @@ var require_execEngine = __commonJS({
30885
30950
  hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Agent "${agentId}" not found in workspace.yaml.` });
30886
30951
  return false;
30887
30952
  }
30953
+ const stepCfg = pipeline.steps[stepIdx];
30954
+ const norm = stepCfg ? (0, WorkspaceSchema_1.normalizeStep)(stepCfg) : void 0;
30955
+ const alternatives = norm ? (0, WorkspaceSchema_1.stepSkillAlternatives)(norm) : void 0;
30956
+ const chosen = opts.skill && alternatives?.options.includes(opts.skill) ? opts.skill : stepRec.skill;
30957
+ const skillIds = norm ? (0, WorkspaceSchema_1.resolveStepSkills)(norm, agent.skills, chosen) : [...agent.skills];
30888
30958
  let runner;
30889
30959
  let prompt2;
30890
30960
  try {
@@ -30894,7 +30964,7 @@ var require_execEngine = __commonJS({
30894
30964
  return false;
30895
30965
  }
30896
30966
  try {
30897
- prompt2 = buildStepPrompt(ws, agent, runner, root, state.runId);
30967
+ prompt2 = buildStepPrompt(ws, agent, skillIds, runner, root, state.runId);
30898
30968
  } catch (err) {
30899
30969
  hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Failed to load skills for agent "${agentId}": ${errMsg(err)}` });
30900
30970
  return false;
@@ -30905,7 +30975,7 @@ var require_execEngine = __commonJS({
30905
30975
  const userMessage = opts.message ?? (contextStr || `Execute step: ${agentId}`);
30906
30976
  if (opts.dryRun) {
30907
30977
  hooks.onDryRunPreview?.({
30908
- skills: agent.skills.join(", "),
30978
+ skills: skillIds.join(", "),
30909
30979
  skillText,
30910
30980
  userMessage,
30911
30981
  env,
@@ -30917,7 +30987,7 @@ var require_execEngine = __commonJS({
30917
30987
  stepIdx,
30918
30988
  agent: agentId,
30919
30989
  revision: stepRec.revision,
30920
- skills: agent.skills,
30990
+ skills: skillIds,
30921
30991
  model: agent.model,
30922
30992
  context: userMessage,
30923
30993
  dirtyUpstream: (0, PipelineRunner_1.dirtyUpstreamOf)({ state, pipeline, stepIdx }).map((d) => ({ stepIdx: d.stepIdx, step: d.step, byStep: d.dirty.byStep }))
@@ -30946,6 +31016,9 @@ var require_execEngine = __commonJS({
30946
31016
  const rec = freshState.steps[stepIdx];
30947
31017
  rec.runner = agent.runner;
30948
31018
  rec.model = resolvedModel;
31019
+ if (alternatives) {
31020
+ rec.skill = skillIds[0];
31021
+ }
30949
31022
  rec.usage = result.usage;
30950
31023
  if (typeof result.costUsd === "number") {
30951
31024
  rec.costUsd = result.costUsd;
@@ -31189,13 +31262,13 @@ var require_runReport = __commonJS({
31189
31262
  return history.map((h) => {
31190
31263
  switch (h.kind) {
31191
31264
  case "reject":
31192
- return ` - \u2718 rejected (rev ${h.revision})${h.reason ? `: ${h.reason}` : ""}`;
31265
+ return ` - \u2718 rejected (rev ${h.revision}${h.skill ? `, ${h.skill}` : ""})${h.reason ? `: ${h.reason}` : ""}`;
31193
31266
  case "rerun":
31194
31267
  return ` - \u21BA rerun \u2192 rev ${h.revision}${h.feedback ? ` (feedback: ${h.feedback})` : ""}`;
31195
31268
  case "auto_review":
31196
31269
  return ` - \u{1F916} auto-review ${h.decision} (rev ${h.revision}): ${h.reason}`;
31197
31270
  case "approve":
31198
- return ` - \u2714 approved (rev ${h.revision})`;
31271
+ return ` - \u2714 approved (rev ${h.revision}${h.skill ? `, ${h.skill}` : ""})`;
31199
31272
  case "undo":
31200
31273
  return ` - \u21B6 mark-done undone (rev ${h.revision}, was ${h.from})`;
31201
31274
  default:
@@ -32678,7 +32751,7 @@ var require_commandModel = __commonJS({
32678
32751
  function shortcutCommandId(phaseId) {
32679
32752
  return phaseId;
32680
32753
  }
32681
- function resolveComposition(config, pipelineId, phaseId) {
32754
+ function resolveComposition(config, pipelineId, phaseId, chosenSkill) {
32682
32755
  const pipeline = config.pipelines.find((p) => p.id === pipelineId);
32683
32756
  if (!pipeline) {
32684
32757
  return { found: false, phaseId, pipelineId };
@@ -32688,11 +32761,8 @@ var require_commandModel = __commonJS({
32688
32761
  return { found: false, phaseId, pipelineId };
32689
32762
  }
32690
32763
  const step = (0, WorkspaceSchema_1.normalizeStep)(stepCfg);
32691
- let skills = step.skills;
32692
- if (!skills || skills.length === 0) {
32693
- const agent = config.agents.find((a) => a.id === step.agent);
32694
- skills = agent?.skills ?? [];
32695
- }
32764
+ const agent = config.agents.find((a) => a.id === step.agent);
32765
+ const skills = (0, WorkspaceSchema_1.resolveStepSkills)(step, agent?.skills ?? [], chosenSkill);
32696
32766
  return {
32697
32767
  found: true,
32698
32768
  phaseId,
@@ -32786,6 +32856,9 @@ The first token is the **epic id**; an optional second token is the **phase**.
32786
32856
  2. In that pipeline's \`steps\`, find the step whose \`name\` (or \`agent\` when
32787
32857
  unnamed) === the chosen phase. That step's \`agent\` + \`skills\` are the
32788
32858
  wiring. If the step omits \`skills\`, use the referenced agent's \`skills:\`.
32859
+ If the step sets \`default_skill\`, its \`skills\` are alternatives: load
32860
+ **only one** \u2014 the step's \`skill\` in \`.aidlc/runs/<epic>.json\` when it
32861
+ is one of them, else \`default_skill\`. Never load the others.
32789
32862
  3. Load the persona from \`.claude/agents/<agent>.md\` (fall back to
32790
32863
  \`~/.claude/agents/<agent>.md\`), and each skill from
32791
32864
  \`.claude/skills/<skill>.md\` (fall back to \`~/.claude/skills/<skill>.md\`).
@@ -33364,13 +33437,13 @@ var require_dist = __commonJS({
33364
33437
  "../core/dist/index.js"(exports2) {
33365
33438
  "use strict";
33366
33439
  Object.defineProperty(exports2, "__esModule", { value: true });
33367
- exports2.renderIntentMarkdown = exports2.openFollowUpEpic = exports2.openIncidentEpic = exports2.SignalParseError = exports2.isSignal = exports2.parseSignal = exports2.SignalSchema = exports2.EpicStepEditError = exports2.resolveStepRef = exports2.describeGateEffect = exports2.commitEpicStepEdit = exports2.planSetEpicStepGates = exports2.planRemoveEpicStep = exports2.planAddEpicStep = exports2.EpicWorkflowSwitchError = exports2.canSwitchEpicWorkflow = exports2.epicWorkflowLock = exports2.applyEpicWorkflowSwitch = exports2.stageEpicWorkflowSwitch = exports2.planEpicWorkflowSwitch = exports2.EpicDescriptionError = exports2.setEpicDescription = exports2.lockedEpicDirError = exports2.EpicScaffoldError = exports2.epicsRoot = exports2.mapStepStatusToEpic = exports2.mirrorRunStateToEpic = exports2.scaffoldEpic = exports2.resolveArtifactCommitConfig = exports2.commitApprovedArtifacts = exports2.PipelineAdaptError = exports2.applyAdaptation = exports2.parseAdaptationVerdict = exports2.buildAdaptationPrompt = exports2.buildPhaseCatalog = exports2.slugEpicId = exports2.parseClassificationVerdict = exports2.buildClassificationPrompt = exports2.heuristicClassify = exports2.PipelineAssembleError = exports2.recipePipelineId = exports2.assemblePipeline = exports2.collectWorkspaceRefIssues = exports2.stepDagId = exports2.stepAgentId = exports2.producesEntries = exports2.normalizeStep = exports2.WorkspaceValidationError = exports2.validateWorkspace = exports2.WorkspaceSchema = void 0;
33368
- 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 = 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.openManifestFollowUp = 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 = void 0;
33369
- exports2.readEpicTags = exports2.normalizeTags = exports2.normalizeTag = exports2.epicMatchesTags = exports2.applyTagEdit = exports2.MAX_TAG_LENGTH = exports2.EPIC_TAGS_KEY = exports2.strictModeSection = exports2.resolveEpicStrictMode = exports2.epicStrictMode = exports2.commandBodyPredatesStrictMode = exports2.STRICT_MODE_KEY = exports2.STRICT_MODE_HEADING = exports2.writeUserEpicIdPrefix = exports2.userConfigPath = 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 = void 0;
33370
- exports2.weighStepProgress = exports2.isActiveStatus = exports2.isStepOptional = exports2.isRunComplete = exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = 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.CodexRunner = exports2.DefaultRunner = exports2.RunnerRegistry = exports2.targetPath = exports2.scopePaths = exports2.discoverAssets = exports2.commandBodyIsStale = void 0;
33371
- exports2.isWorkflowGloballyInstalled = exports2.installWorkflowGlobalsByIds = exports2.installGlobalDefaults = exports2.resolveProviderModel = 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.checkBudget = void 0;
33372
- exports2.remapClaudePath = exports2.claudeConfigEnv = exports2.claudeJsonPath = exports2.isDefaultClaudeConfigDir = exports2.claudeConfigDir = exports2.resolveClaudeConfigDir = 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 = void 0;
33373
- exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = void 0;
33440
+ exports2.openIncidentEpic = exports2.SignalParseError = exports2.isSignal = exports2.parseSignal = exports2.SignalSchema = exports2.EpicStepEditError = exports2.resolveStepRef = exports2.describeGateEffect = exports2.commitEpicStepEdit = exports2.planSetEpicStepGates = exports2.planRemoveEpicStep = exports2.planAddEpicStep = exports2.EpicWorkflowSwitchError = exports2.canSwitchEpicWorkflow = exports2.epicWorkflowLock = exports2.applyEpicWorkflowSwitch = exports2.stageEpicWorkflowSwitch = exports2.planEpicWorkflowSwitch = exports2.EpicDescriptionError = exports2.setEpicDescription = exports2.lockedEpicDirError = exports2.EpicScaffoldError = exports2.epicsRoot = exports2.mapStepStatusToEpic = exports2.mirrorRunStateToEpic = exports2.scaffoldEpic = exports2.resolveArtifactCommitConfig = exports2.commitApprovedArtifacts = exports2.PipelineAdaptError = exports2.applyAdaptation = exports2.parseAdaptationVerdict = exports2.buildAdaptationPrompt = exports2.buildPhaseCatalog = exports2.slugEpicId = exports2.parseClassificationVerdict = exports2.buildClassificationPrompt = exports2.heuristicClassify = exports2.PipelineAssembleError = exports2.recipePipelineId = exports2.assemblePipeline = exports2.collectWorkspaceRefIssues = exports2.resolveStepSkills = exports2.stepSkillAlternatives = exports2.stepDagId = exports2.stepAgentId = exports2.producesEntries = exports2.normalizeStep = exports2.WorkspaceValidationError = exports2.validateWorkspace = exports2.WorkspaceSchema = void 0;
33441
+ 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 = 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.openManifestFollowUp = 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 = void 0;
33442
+ exports2.normalizeTag = exports2.epicMatchesTags = exports2.applyTagEdit = exports2.MAX_TAG_LENGTH = exports2.EPIC_TAGS_KEY = exports2.strictModeSection = exports2.resolveEpicStrictMode = exports2.epicStrictMode = exports2.commandBodyPredatesStrictMode = exports2.STRICT_MODE_KEY = exports2.STRICT_MODE_HEADING = exports2.writeUserEpicIdPrefix = exports2.userConfigPath = 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 = void 0;
33443
+ exports2.isRunComplete = exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = 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.CodexRunner = exports2.DefaultRunner = exports2.RunnerRegistry = exports2.targetPath = exports2.scopePaths = exports2.discoverAssets = exports2.commandBodyIsStale = exports2.readEpicTags = exports2.normalizeTags = void 0;
33444
+ exports2.resolveProviderModel = 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.checkBudget = exports2.weighStepProgress = exports2.isActiveStatus = exports2.isStepOptional = void 0;
33445
+ exports2.isDefaultClaudeConfigDir = exports2.claudeConfigDir = exports2.resolveClaudeConfigDir = 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 = void 0;
33446
+ exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = exports2.remapClaudePath = exports2.claudeConfigEnv = exports2.claudeJsonPath = void 0;
33374
33447
  var WorkspaceSchema_1 = require_WorkspaceSchema();
33375
33448
  Object.defineProperty(exports2, "WorkspaceSchema", { enumerable: true, get: function() {
33376
33449
  return WorkspaceSchema_1.WorkspaceSchema;
@@ -33393,6 +33466,12 @@ var require_dist = __commonJS({
33393
33466
  Object.defineProperty(exports2, "stepDagId", { enumerable: true, get: function() {
33394
33467
  return WorkspaceSchema_1.stepDagId;
33395
33468
  } });
33469
+ Object.defineProperty(exports2, "stepSkillAlternatives", { enumerable: true, get: function() {
33470
+ return WorkspaceSchema_1.stepSkillAlternatives;
33471
+ } });
33472
+ Object.defineProperty(exports2, "resolveStepSkills", { enumerable: true, get: function() {
33473
+ return WorkspaceSchema_1.resolveStepSkills;
33474
+ } });
33396
33475
  Object.defineProperty(exports2, "collectWorkspaceRefIssues", { enumerable: true, get: function() {
33397
33476
  return WorkspaceSchema_1.collectWorkspaceRefIssues;
33398
33477
  } });
@@ -33982,6 +34061,9 @@ var require_dist = __commonJS({
33982
34061
  Object.defineProperty(exports2, "requestStepUpdate", { enumerable: true, get: function() {
33983
34062
  return PipelineRunner_1.requestStepUpdate;
33984
34063
  } });
34064
+ Object.defineProperty(exports2, "chooseStepSkill", { enumerable: true, get: function() {
34065
+ return PipelineRunner_1.chooseStepSkill;
34066
+ } });
33985
34067
  Object.defineProperty(exports2, "canRerunApprovedStep", { enumerable: true, get: function() {
33986
34068
  return PipelineRunner_1.canRerunApprovedStep;
33987
34069
  } });
@@ -43018,7 +43100,7 @@ var require_package = __commonJS({
43018
43100
  "package.json"(exports2, module2) {
43019
43101
  module2.exports = {
43020
43102
  name: "@delete101020/aidlc",
43021
- version: "4.0.22",
43103
+ version: "4.0.23",
43022
43104
  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.",
43023
43105
  license: "MIT",
43024
43106
  repository: {
@@ -47964,7 +48046,7 @@ function registerRun(program3) {
47964
48046
  });
47965
48047
  cmd.command("exec <runId>").description(
47966
48048
  "Execute the current step by spawning the claude CLI, then auto-advance.\n Streams output live. Stops at human_review steps unless --auto-approve.\n Exit codes: 0 completed (or stopped at --until), 2 paused on a gate\n (awaiting review / rejected / budget), 1 error. --require-complete maps\n any non-completed outcome to 1 for CI gating."
47967
- ).option("--until <step>", "Stop after this step completes (index or agent id)").option("--auto-approve", "Also auto-approve human_review steps without pausing").option("--require-complete", "Exit 1 unless the run reaches completed (for CI gating)").option("--json", "Suppress decorative output; print a final JSON summary to stdout (claude stream goes to stderr)").option("--message <text>", "Override the user message sent to claude (default: context pairs)").option("--dry-run", "Print the assembled prompt without spawning claude").action(async (runId, opts, actionCmd) => {
48049
+ ).option("--until <step>", "Stop after this step completes (index or agent id)").option("--auto-approve", "Also auto-approve human_review steps without pausing").option("--require-complete", "Exit 1 unless the run reaches completed (for CI gating)").option("--json", "Suppress decorative output; print a final JSON summary to stdout (claude stream goes to stderr)").option("--message <text>", "Override the user message sent to claude (default: context pairs)").option("--dry-run", "Print the assembled prompt without spawning claude").option("--skill <id>", "On steps that offer alternative skills (default_skill), run this one").action(async (runId, opts, actionCmd) => {
47968
48050
  const root = resolveWorkspaceRoot(actionCmd);
47969
48051
  if (opts.json) {
47970
48052
  setQuiet(true);
@@ -48073,7 +48155,7 @@ async function execLoop(root, runId, opts) {
48073
48155
  return (0, import_core13.runExecLoop)(
48074
48156
  root,
48075
48157
  runId,
48076
- { untilIdx, autoApprove: opts.autoApprove, message: opts.message, dryRun: opts.dryRun },
48158
+ { untilIdx, autoApprove: opts.autoApprove, message: opts.message, dryRun: opts.dryRun, skill: opts.skill },
48077
48159
  cliExecHooks(runId, claudeOut)
48078
48160
  );
48079
48161
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delete101020/aidlc",
3
- "version": "4.0.22",
3
+ "version": "4.0.23",
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": {