@delete101020/aidlc 4.0.18 → 4.0.20

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 +81 -24
  2. package/package.json +1 -1
package/dist/bundle.js CHANGED
@@ -19695,7 +19695,10 @@ var require_FollowUpHookSchema = __commonJS({
19695
19695
  if (!Array.isArray(produces)) {
19696
19696
  return false;
19697
19697
  }
19698
- return produces.some((p) => typeof p === "string" && path17.posix.basename(p.replace(/\\/g, "/")) === exports2.FOLLOW_UPS_FILE);
19698
+ return produces.some((entry) => {
19699
+ const p = entry && typeof entry === "object" ? entry.path : entry;
19700
+ return typeof p === "string" && path17.posix.basename(p.replace(/\\/g, "/")) === exports2.FOLLOW_UPS_FILE;
19701
+ });
19699
19702
  }
19700
19703
  function collectFollowUpHookIssues(raw) {
19701
19704
  const issues = [];
@@ -19761,7 +19764,8 @@ var require_WorkspaceSchema = __commonJS({
19761
19764
  "use strict";
19762
19765
  Object.defineProperty(exports2, "__esModule", { value: true });
19763
19766
  exports2.WorkspaceValidationError = exports2.WorkspaceSchema = void 0;
19764
- exports2.normalizeStep = normalizeStep3;
19767
+ exports2.normalizeStep = normalizeStep4;
19768
+ exports2.producesEntries = producesEntries;
19765
19769
  exports2.stepAgentId = stepAgentId3;
19766
19770
  exports2.stepDagId = stepDagId;
19767
19771
  exports2.collectWorkspaceRefIssues = collectWorkspaceRefIssues3;
@@ -19831,10 +19835,25 @@ var require_WorkspaceSchema = __commonJS({
19831
19835
  pipeline: zod_1.z.string().min(1)
19832
19836
  })
19833
19837
  ]);
19838
+ var ProducesEntrySchema = zod_1.z.union([
19839
+ zod_1.z.string().min(1),
19840
+ zod_1.z.object({
19841
+ path: zod_1.z.string().min(1),
19842
+ optional: zod_1.z.boolean().default(false)
19843
+ }).strict()
19844
+ ]);
19834
19845
  var PipelineStepObjectSchema = zod_1.z.object({
19835
19846
  agent: zod_1.z.string().min(1),
19836
19847
  /** Display name for the step. Falls back to the agent id when omitted. */
19837
19848
  name: zod_1.z.string().optional(),
19849
+ /**
19850
+ * What this step does, shown on the epic panel's step card. One agent
19851
+ * often backs several steps (a dev agent that writes the spec and then
19852
+ * builds it), so the agent's own description cannot tell them apart.
19853
+ * Falls back to the frontmatter `description` of the step's skill when
19854
+ * it names exactly one, then to the agent's description.
19855
+ */
19856
+ description: zod_1.z.string().optional(),
19838
19857
  /** Step is part of the pipeline but skipped at run time when false. Defaults to true. */
19839
19858
  enabled: zod_1.z.boolean().default(true),
19840
19859
  /**
@@ -19848,8 +19867,12 @@ var require_WorkspaceSchema = __commonJS({
19848
19867
  * `depends_on` it, which the runner cannot tell from an oversight.
19849
19868
  */
19850
19869
  optional: zod_1.z.boolean().default(false),
19851
- /** Artifact paths the step is expected to produce. Checked after work. */
19852
- produces: zod_1.z.array(zod_1.z.string().min(1)).default([]),
19870
+ /**
19871
+ * Artifact paths the step is expected to produce. Checked after work —
19872
+ * except entries marked `{ path, optional: true }`, which are listed when
19873
+ * present and never block mark-done when absent.
19874
+ */
19875
+ produces: zod_1.z.array(ProducesEntrySchema).default([]),
19853
19876
  /**
19854
19877
  * Optional content markers asserted against the `produces` files after
19855
19878
  * they pass the existence check. Each marker must appear (plain substring)
@@ -19975,13 +19998,14 @@ var require_WorkspaceSchema = __commonJS({
19975
19998
  */
19976
19999
  gates: zod_1.z.record(zod_1.z.string(), RecipeGateSchema).optional()
19977
20000
  });
19978
- function normalizeStep3(step) {
20001
+ function normalizeStep4(step) {
19979
20002
  if (typeof step === "string") {
19980
20003
  return {
19981
20004
  agent: step,
19982
20005
  enabled: true,
19983
20006
  optional: false,
19984
20007
  produces: [],
20008
+ produces_optional: [],
19985
20009
  produces_contains: [],
19986
20010
  requires: [],
19987
20011
  depends_on: [],
@@ -19991,7 +20015,19 @@ var require_WorkspaceSchema = __commonJS({
19991
20015
  }
19992
20016
  const obj = step;
19993
20017
  const requires = Array.isArray(obj.requires) ? obj.requires : [];
19994
- const produces = Array.isArray(obj.produces) ? obj.produces : [];
20018
+ const produces = [];
20019
+ const produces_optional = [];
20020
+ for (const entry of Array.isArray(obj.produces) ? obj.produces : []) {
20021
+ if (typeof entry === "string") {
20022
+ produces.push(entry);
20023
+ } else if (entry && typeof entry === "object" && typeof entry.path === "string") {
20024
+ const e = entry;
20025
+ produces.push(e.path);
20026
+ if (e.optional === true) {
20027
+ produces_optional.push(e.path);
20028
+ }
20029
+ }
20030
+ }
19995
20031
  const produces_contains = Array.isArray(obj.produces_contains) ? obj.produces_contains : [];
19996
20032
  const depends_on = Array.isArray(obj.depends_on) ? obj.depends_on : [];
19997
20033
  const skills = Array.isArray(obj.skills) ? obj.skills.map(String).filter((s) => s.length > 0) : typeof obj.skill === "string" && obj.skill.length > 0 ? [obj.skill] : void 0;
@@ -20004,10 +20040,12 @@ var require_WorkspaceSchema = __commonJS({
20004
20040
  return {
20005
20041
  agent: typeof obj.agent === "string" ? obj.agent : "",
20006
20042
  name: typeof obj.name === "string" ? obj.name : void 0,
20043
+ ...typeof obj.description === "string" && obj.description.trim() ? { description: obj.description.trim() } : {},
20007
20044
  skills,
20008
20045
  enabled: typeof obj.enabled === "boolean" ? obj.enabled : true,
20009
20046
  optional: obj.optional === true,
20010
20047
  produces,
20048
+ produces_optional,
20011
20049
  produces_contains,
20012
20050
  requires,
20013
20051
  depends_on,
@@ -20018,6 +20056,10 @@ var require_WorkspaceSchema = __commonJS({
20018
20056
  ...git && { git }
20019
20057
  };
20020
20058
  }
20059
+ function producesEntries(norm) {
20060
+ const optional = new Set(norm.produces_optional);
20061
+ return norm.produces.map((p) => optional.has(p) ? { path: p, optional: true } : p);
20062
+ }
20021
20063
  function stepAgentId3(step) {
20022
20064
  if (typeof step === "string") {
20023
20065
  return step;
@@ -20028,7 +20070,7 @@ var require_WorkspaceSchema = __commonJS({
20028
20070
  return "";
20029
20071
  }
20030
20072
  function stepDagId(step) {
20031
- const norm = normalizeStep3(step);
20073
+ const norm = normalizeStep4(step);
20032
20074
  return norm.name ?? norm.agent;
20033
20075
  }
20034
20076
  function collectWorkspaceRefIssues3(config) {
@@ -20048,7 +20090,7 @@ var require_WorkspaceSchema = __commonJS({
20048
20090
  }
20049
20091
  for (const pipeline of config.pipelines) {
20050
20092
  for (const step of pipeline.steps) {
20051
- const norm = normalizeStep3(step);
20093
+ const norm = normalizeStep4(step);
20052
20094
  const id = norm.name ?? norm.agent;
20053
20095
  if (!agentIds.has(norm.agent)) {
20054
20096
  issues.push({
@@ -20352,12 +20394,15 @@ var require_PipelineAssembler = __commonJS({
20352
20394
  agent: norm.agent,
20353
20395
  name: norm.name ?? id,
20354
20396
  enabled: norm.enabled,
20355
- produces: norm.produces,
20397
+ produces: (0, WorkspaceSchema_1.producesEntries)(norm),
20356
20398
  requires: norm.requires,
20357
20399
  depends_on,
20358
20400
  auto_review,
20359
20401
  human_review: gate.human_review ?? norm.human_review
20360
20402
  };
20403
+ if (norm.description) {
20404
+ step.description = norm.description;
20405
+ }
20361
20406
  if (norm.skills && norm.skills.length > 0) {
20362
20407
  step.skills = norm.skills;
20363
20408
  }
@@ -20677,12 +20722,15 @@ ${raw.slice(0, 200)}`);
20677
20722
  agent: norm.agent,
20678
20723
  name: norm.name ?? a.phase,
20679
20724
  enabled: norm.enabled,
20680
- produces: norm.produces,
20725
+ produces: (0, WorkspaceSchema_1.producesEntries)(norm),
20681
20726
  requires: norm.requires,
20682
20727
  depends_on: anchor ? [anchor] : usesDag && steps.length > 0 ? [(0, WorkspaceSchema_1.stepDagId)(steps[steps.length - 1])] : [],
20683
20728
  auto_review: norm.auto_review,
20684
20729
  human_review: norm.human_review
20685
20730
  };
20731
+ if (norm.description) {
20732
+ step.description = norm.description;
20733
+ }
20686
20734
  if (norm.skills && norm.skills.length > 0) {
20687
20735
  step.skills = norm.skills;
20688
20736
  }
@@ -21198,11 +21246,15 @@ var require_PipelineRunner = __commonJS({
21198
21246
  if (missingRequires.length > 0) {
21199
21247
  throw new PipelineRunError3(`Step "${step.agent}" is blocked \u2014 required upstream artifacts are missing.`, missingRequires);
21200
21248
  }
21201
- const resolvedProduces = norm.produces.map((p) => (0, RunState_1.resolvePath)(p, state.context));
21249
+ const optionalProduces = new Set(norm.produces_optional);
21250
+ const resolvedProduces = [];
21202
21251
  const missing = [];
21203
- for (const rel of resolvedProduces) {
21252
+ for (const p of norm.produces) {
21253
+ const rel = (0, RunState_1.resolvePath)(p, state.context);
21204
21254
  const abs = path17.isAbsolute(rel) ? rel : path17.join(workspaceRoot, rel);
21205
- if (!fs14.existsSync(abs)) {
21255
+ if (fs14.existsSync(abs)) {
21256
+ resolvedProduces.push(rel);
21257
+ } else if (!optionalProduces.has(p)) {
21206
21258
  missing.push(rel);
21207
21259
  }
21208
21260
  }
@@ -25260,7 +25312,7 @@ var require_PlanGenerator = __commonJS({
25260
25312
  Object.defineProperty(exports2, "__esModule", { value: true });
25261
25313
  exports2.generatePlan = generatePlan;
25262
25314
  exports2.renderPlanMarkdown = renderPlanMarkdown;
25263
- function normalizeStep3(step) {
25315
+ function normalizeStep4(step) {
25264
25316
  if (typeof step === "string") {
25265
25317
  return { name: step };
25266
25318
  }
@@ -25376,7 +25428,7 @@ var require_PlanGenerator = __commonJS({
25376
25428
  }
25377
25429
  function generatePlan(epicId, context, pipeline, workspace) {
25378
25430
  const complexity = inferScopeComplexity(context.scope);
25379
- const steps = (pipeline.steps || []).map(normalizeStep3);
25431
+ const steps = (pipeline.steps || []).map(normalizeStep4);
25380
25432
  const agentCountPerPhase = allocateAgentCount(complexity, steps.length);
25381
25433
  const phaseAllocations = steps.map((step) => {
25382
25434
  const agentId = step.agent || "unknown";
@@ -33273,13 +33325,13 @@ var require_dist = __commonJS({
33273
33325
  "../core/dist/index.js"(exports2) {
33274
33326
  "use strict";
33275
33327
  Object.defineProperty(exports2, "__esModule", { value: true });
33276
- exports2.followUpEpicId = 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.normalizeStep = exports2.WorkspaceValidationError = exports2.validateWorkspace = exports2.WorkspaceSchema = void 0;
33277
- 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 = 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 = void 0;
33278
- exports2.commandBodyIsStale = 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 = void 0;
33279
- exports2.checkBudget = 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 = void 0;
33280
- exports2.uninstallWorkflowGlobalsByIds = 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 = void 0;
33281
- exports2.resolveCommand = 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 = void 0;
33282
- exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = void 0;
33328
+ 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;
33329
+ 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;
33330
+ 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;
33331
+ 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;
33332
+ 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;
33333
+ 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;
33334
+ exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = void 0;
33283
33335
  var WorkspaceSchema_1 = require_WorkspaceSchema();
33284
33336
  Object.defineProperty(exports2, "WorkspaceSchema", { enumerable: true, get: function() {
33285
33337
  return WorkspaceSchema_1.WorkspaceSchema;
@@ -33293,6 +33345,9 @@ var require_dist = __commonJS({
33293
33345
  Object.defineProperty(exports2, "normalizeStep", { enumerable: true, get: function() {
33294
33346
  return WorkspaceSchema_1.normalizeStep;
33295
33347
  } });
33348
+ Object.defineProperty(exports2, "producesEntries", { enumerable: true, get: function() {
33349
+ return WorkspaceSchema_1.producesEntries;
33350
+ } });
33296
33351
  Object.defineProperty(exports2, "stepAgentId", { enumerable: true, get: function() {
33297
33352
  return WorkspaceSchema_1.stepAgentId;
33298
33353
  } });
@@ -42924,7 +42979,7 @@ var require_package = __commonJS({
42924
42979
  "package.json"(exports2, module2) {
42925
42980
  module2.exports = {
42926
42981
  name: "@delete101020/aidlc",
42927
- version: "4.0.18",
42982
+ version: "4.0.20",
42928
42983
  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.",
42929
42984
  license: "MIT",
42930
42985
  repository: {
@@ -47377,7 +47432,9 @@ ${id}`));
47377
47432
  steps.forEach((step, i) => {
47378
47433
  const agent = typeof step === "string" ? step : String(step.agent ?? "?");
47379
47434
  const review = step.human_review ? import_chalk8.default.yellow(" [review]") : "";
47380
- const prod = Array.isArray(step.produces) && step.produces.length ? import_chalk8.default.dim(` \u2192 ${step.produces.join(", ")}`) : "";
47435
+ const norm = (0, import_core10.normalizeStep)(step);
47436
+ const optional = new Set(norm.produces_optional);
47437
+ const prod = norm.produces.length ? import_chalk8.default.dim(` \u2192 ${norm.produces.map((p) => optional.has(p) ? `${p} (optional)` : p).join(", ")}`) : "";
47381
47438
  console.log(` ${import_chalk8.default.dim(String(i + 1) + ".")} ${import_chalk8.default.bold(agent)}${review}${prod}`);
47382
47439
  });
47383
47440
  console.log();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delete101020/aidlc",
3
- "version": "4.0.18",
3
+ "version": "4.0.20",
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": {