@delete101020/aidlc 4.0.36 → 4.0.37

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 (3) hide show
  1. package/README.md +7 -0
  2. package/dist/bundle.js +105 -16
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -313,6 +313,13 @@ the pipeline it was derived from) and inherits its tags; override with
313
313
  runs: the child waits at its first step until someone starts it. The
314
314
  extension's card offers the same as **New follow-up epic**.
315
315
 
316
+ One epic can follow several: `epic follow-up SEAL-CUT --also SEAL-CLASSIFY`
317
+ (repeatable; **Also follows** in the extension) when one change reworks what two
318
+ earlier epics built. The extra parents go into `also_from` — linked from both
319
+ cards, while the child stays grouped under `<parent>`. Every phase prompt tells
320
+ the agent to read each parent's `intent.md` and `spec.md` first, so the child
321
+ starts from their rules instead of a change request on each.
322
+
316
323
  **Tags** are free text in and one canonical form on disk: uppercase, ASCII,
317
324
  dash-separated — `"thanh toán VNPay"` is stored as `THANH-TOAN-VNPAY`, and the
318
325
  accents and case are folded on the way *in* to a filter too, so `--tag "thanh
package/dist/bundle.js CHANGED
@@ -27076,7 +27076,7 @@ var require_FollowUps = __commonJS({
27076
27076
  };
27077
27077
  }();
27078
27078
  Object.defineProperty(exports2, "__esModule", { value: true });
27079
- exports2.MANUAL_FOLLOW_UP_KEY_PREFIX = exports2.FollowUpsParseError = exports2.FollowUpManifestSchema = exports2.FollowUpItemSchema = exports2.FOLLOW_UP_INTENT = exports2.FOLLOW_UPS_FILE = void 0;
27079
+ exports2.MANUAL_FOLLOW_UP_KEY_PREFIX = exports2.ALSO_FROM_INPUT = exports2.FollowUpsParseError = exports2.FollowUpManifestSchema = exports2.FollowUpItemSchema = exports2.FOLLOW_UP_INTENT = exports2.FOLLOW_UPS_FILE = void 0;
27080
27080
  exports2.parseFollowUps = parseFollowUps;
27081
27081
  exports2.readEpicFollowUps = readEpicFollowUps;
27082
27082
  exports2.followUpsOf = followUpsOf;
@@ -27235,8 +27235,16 @@ var require_FollowUps = __commonJS({
27235
27235
  intentPath: path17.join(result.artifactsDir, exports2.FOLLOW_UP_INTENT)
27236
27236
  };
27237
27237
  }
27238
- function withFollowUpProvenance2(inputs, parentEpicId, key) {
27239
- return { ...inputs, from_epic: parentEpicId, follow_up_key: key };
27238
+ exports2.ALSO_FROM_INPUT = "also_from";
27239
+ function withFollowUpProvenance2(inputs, parentEpicId, key, alsoFrom = []) {
27240
+ const { [exports2.ALSO_FROM_INPUT]: _ignored, ...rest } = inputs;
27241
+ const others = [...new Set(alsoFrom.map((id) => id.trim()).filter((id) => id && id !== parentEpicId))];
27242
+ return {
27243
+ ...rest,
27244
+ from_epic: parentEpicId,
27245
+ follow_up_key: key,
27246
+ ...others.length > 0 ? { [exports2.ALSO_FROM_INPUT]: others.join(",") } : {}
27247
+ };
27240
27248
  }
27241
27249
  exports2.MANUAL_FOLLOW_UP_KEY_PREFIX = "F";
27242
27250
  function nextManualFollowUpKey(taken) {
@@ -30677,6 +30685,24 @@ var require_epicFocus = __commonJS({
30677
30685
  }
30678
30686
  });
30679
30687
 
30688
+ // ../core/dist/loader/inheritedContext.js
30689
+ var require_inheritedContext = __commonJS({
30690
+ "../core/dist/loader/inheritedContext.js"(exports2) {
30691
+ "use strict";
30692
+ Object.defineProperty(exports2, "__esModule", { value: true });
30693
+ exports2.INHERITED_CONTEXT_MARKER = void 0;
30694
+ exports2.inheritedContextNote = inheritedContextNote;
30695
+ exports2.commandBodyPredatesInheritedContext = commandBodyPredatesInheritedContext;
30696
+ exports2.INHERITED_CONTEXT_MARKER = "`also_from`";
30697
+ function inheritedContextNote(epicRoot) {
30698
+ return `If it has \`from_epic\` (and ${exports2.INHERITED_CONTEXT_MARKER}, comma-separated), this epic follows those epics and inherits their business rules: before writing, read each one's \`${epicRoot}/<parent>/artifacts/intent.md\` and \`spec.md\` (whichever exist), keep what this epic does not change, and say what it changes.`;
30699
+ }
30700
+ function commandBodyPredatesInheritedContext(existing) {
30701
+ return !existing.includes(exports2.INHERITED_CONTEXT_MARKER);
30702
+ }
30703
+ }
30704
+ });
30705
+
30680
30706
  // ../core/dist/presets/commandBodyFreshness.js
30681
30707
  var require_commandBodyFreshness = __commonJS({
30682
30708
  "../core/dist/presets/commandBodyFreshness.js"(exports2) {
@@ -30685,8 +30711,9 @@ var require_commandBodyFreshness = __commonJS({
30685
30711
  exports2.commandBodyIsStale = commandBodyIsStale;
30686
30712
  var artifactLanguage_1 = require_artifactLanguage();
30687
30713
  var strictMode_1 = require_strictMode();
30714
+ var inheritedContext_1 = require_inheritedContext();
30688
30715
  function commandBodyIsStale(existing) {
30689
- return (0, artifactLanguage_1.commandBodyPredatesArtifactLanguage)(existing) || (0, strictMode_1.commandBodyPredatesStrictMode)(existing);
30716
+ return (0, artifactLanguage_1.commandBodyPredatesArtifactLanguage)(existing) || (0, strictMode_1.commandBodyPredatesStrictMode)(existing) || (0, inheritedContext_1.commandBodyPredatesInheritedContext)(existing);
30690
30717
  }
30691
30718
  }
30692
30719
  });
@@ -31337,8 +31364,46 @@ Expected a JS/TS module at "${scriptPath}" with a default-exported function retu
31337
31364
  var require_execEngine = __commonJS({
31338
31365
  "../core/dist/runs/execEngine.js"(exports2) {
31339
31366
  "use strict";
31367
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
31368
+ if (k2 === void 0) k2 = k;
31369
+ var desc = Object.getOwnPropertyDescriptor(m, k);
31370
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
31371
+ desc = { enumerable: true, get: function() {
31372
+ return m[k];
31373
+ } };
31374
+ }
31375
+ Object.defineProperty(o, k2, desc);
31376
+ } : function(o, m, k, k2) {
31377
+ if (k2 === void 0) k2 = k;
31378
+ o[k2] = m[k];
31379
+ });
31380
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {
31381
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31382
+ } : function(o, v) {
31383
+ o["default"] = v;
31384
+ });
31385
+ var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ function() {
31386
+ var ownKeys = function(o) {
31387
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
31388
+ var ar = [];
31389
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
31390
+ return ar;
31391
+ };
31392
+ return ownKeys(o);
31393
+ };
31394
+ return function(mod) {
31395
+ if (mod && mod.__esModule) return mod;
31396
+ var result = {};
31397
+ if (mod != null) {
31398
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31399
+ }
31400
+ __setModuleDefault(result, mod);
31401
+ return result;
31402
+ };
31403
+ }();
31340
31404
  Object.defineProperty(exports2, "__esModule", { value: true });
31341
31405
  exports2.runExecLoop = runExecLoop2;
31406
+ var path17 = __importStar(require("path"));
31342
31407
  var WorkspaceLoader_1 = require_WorkspaceLoader();
31343
31408
  var RunStateStore_1 = require_RunStateStore();
31344
31409
  var PipelineRunner_1 = require_PipelineRunner();
@@ -31353,6 +31418,7 @@ var require_execEngine = __commonJS({
31353
31418
  var WorkspaceSchema_1 = require_WorkspaceSchema();
31354
31419
  var artifactLanguage_1 = require_artifactLanguage();
31355
31420
  var strictMode_1 = require_strictMode();
31421
+ var inheritedContext_1 = require_inheritedContext();
31356
31422
  var promptComposer_1 = require_promptComposer();
31357
31423
  var projectInstructions_1 = require_projectInstructions();
31358
31424
  var types_1 = require_types();
@@ -31553,7 +31619,11 @@ var require_execEngine = __commonJS({
31553
31619
  const skillText = prompt2.text;
31554
31620
  const env = ws.envResolver.resolveLayered(ws.config.environment ?? {}, agent.env ?? {});
31555
31621
  const contextStr = Object.entries(state.context).map(([k, v]) => `${k}=${v}`).join(" ");
31556
- const userMessage = opts.message ?? (contextStr || `Execute step: ${agentId}`);
31622
+ const epicRoot = path17.relative(root, (0, EpicScaffold_1.epicsRoot)(root, ws.config)).split(path17.sep).join("/");
31623
+ const inherited = state.context.from_epic ? `
31624
+
31625
+ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` : "";
31626
+ const userMessage = opts.message ?? (contextStr ? contextStr + inherited : `Execute step: ${agentId}`);
31557
31627
  if (opts.dryRun) {
31558
31628
  hooks.onDryRunPreview?.({
31559
31629
  skills: skillIds.join(", "),
@@ -32094,6 +32164,7 @@ var require_builtinWorkflows = __commonJS({
32094
32164
  var path17 = __importStar(require("path"));
32095
32165
  var artifactLanguage_1 = require_artifactLanguage();
32096
32166
  var strictMode_1 = require_strictMode();
32167
+ var inheritedContext_1 = require_inheritedContext();
32097
32168
  var models_1 = require_models();
32098
32169
  var templateRenderer_1 = require_templateRenderer();
32099
32170
  var PHASES = [
@@ -32890,7 +32961,7 @@ The user invoked you with epic id \`$ARGUMENTS\`.
32890
32961
  1. Read \`${epicRoot}/$ARGUMENTS/state.json\` to understand the current run state.
32891
32962
  - If the step has \`feedback\` from a prior rejection, address it explicitly in this revision.
32892
32963
  - Check \`history\` entries for rejection reasons and context.
32893
- 2. Read \`${epicRoot}/$ARGUMENTS/inputs.json\` for capability inputs (Jira ticket, Figma URL, files glob, GitHub repo, etc.).
32964
+ 2. Read \`${epicRoot}/$ARGUMENTS/inputs.json\` for capability inputs (Jira ticket, Figma URL, files glob, GitHub repo, etc.). ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}
32894
32965
  ${artifactInstruction}
32895
32966
  4. When finished, summarize what you produced and tell the user to click **"Mark step done"** in the AIDLC panel to advance the pipeline.
32896
32967
 
@@ -33308,6 +33379,7 @@ var require_commandModel = __commonJS({
33308
33379
  var path17 = __importStar(require("path"));
33309
33380
  var artifactLanguage_1 = require_artifactLanguage();
33310
33381
  var strictMode_1 = require_strictMode();
33382
+ var inheritedContext_1 = require_inheritedContext();
33311
33383
  var commandBodyFreshness_1 = require_commandBodyFreshness();
33312
33384
  var WorkspaceSchema_1 = require_WorkspaceSchema();
33313
33385
  var runProgress_1 = require_runProgress();
@@ -33466,7 +33538,7 @@ Claude \u2014 but still follow the structural contract below.
33466
33538
 
33467
33539
  1. Read \`${epicRoot}/<epic>/state.json\` for prior feedback/history and address
33468
33540
  any rejection reasons in this revision.
33469
- 2. Read \`${epicRoot}/<epic>/inputs.json\` for capability inputs.
33541
+ 2. Read \`${epicRoot}/<epic>/inputs.json\` for capability inputs. ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}
33470
33542
  3. Before writing, read the blank template for that artifact at
33471
33543
  \`.aidlc/aidlc-templates/<templatesId>/<FILE>\` and follow its structure \u2014
33472
33544
  \`<templatesId>\` is the pipeline's \`derived_from\` when it has one (a
@@ -33509,7 +33581,7 @@ procedure exactly as \`/aidlc <epic> ${phase.id}\` would:
33509
33581
  ones \u2014 and only fall back to \`.claude/skills/<id>.md\` and
33510
33582
  \`.claude/agents/<id>.md\` when none is declared. Adopt them (unless the
33511
33583
  active standard is \`none\`), then follow the structural contract: read
33512
- state/inputs, write to
33584
+ state/inputs (${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}), write to
33513
33585
  \`${epicRoot}/<epic>/artifacts/${phase.artifact}\` (or the step's declared
33514
33586
  artifact), and tell the user to click **"Mark step done"**.
33515
33587
 
@@ -34034,10 +34106,10 @@ var require_dist = __commonJS({
34034
34106
  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.pipelineRecipeLabel = 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;
34035
34107
  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.MANUAL_FOLLOW_UP_KEY_PREFIX = exports2.followUpDefaults = exports2.nextManualFollowUpKey = exports2.withFollowUpProvenance = 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 = exports2.openIncidentEpic = void 0;
34036
34108
  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 = 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 = void 0;
34037
- 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.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.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 = void 0;
34038
- 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 = 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 = void 0;
34039
- 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 = 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 = void 0;
34040
- 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 = 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 = void 0;
34109
+ 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.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 = void 0;
34110
+ 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 = 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 = void 0;
34111
+ 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 = 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 = void 0;
34112
+ 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 = 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 = void 0;
34041
34113
  var WorkspaceSchema_1 = require_WorkspaceSchema();
34042
34114
  Object.defineProperty(exports2, "WorkspaceSchema", { enumerable: true, get: function() {
34043
34115
  return WorkspaceSchema_1.WorkspaceSchema;
@@ -34575,6 +34647,13 @@ var require_dist = __commonJS({
34575
34647
  Object.defineProperty(exports2, "strictModeSection", { enumerable: true, get: function() {
34576
34648
  return strictMode_1.strictModeSection;
34577
34649
  } });
34650
+ var inheritedContext_1 = require_inheritedContext();
34651
+ Object.defineProperty(exports2, "INHERITED_CONTEXT_MARKER", { enumerable: true, get: function() {
34652
+ return inheritedContext_1.INHERITED_CONTEXT_MARKER;
34653
+ } });
34654
+ Object.defineProperty(exports2, "inheritedContextNote", { enumerable: true, get: function() {
34655
+ return inheritedContext_1.inheritedContextNote;
34656
+ } });
34578
34657
  var epicTags_1 = require_epicTags();
34579
34658
  Object.defineProperty(exports2, "EPIC_TAGS_KEY", { enumerable: true, get: function() {
34580
34659
  return epicTags_1.EPIC_TAGS_KEY;
@@ -43796,7 +43875,7 @@ var require_package = __commonJS({
43796
43875
  "package.json"(exports2, module2) {
43797
43876
  module2.exports = {
43798
43877
  name: "@delete101020/aidlc",
43799
- version: "4.0.36",
43878
+ version: "4.0.37",
43800
43879
  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.",
43801
43880
  license: "MIT",
43802
43881
  repository: {
@@ -50515,7 +50594,7 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50515
50594
  throw err;
50516
50595
  }
50517
50596
  });
50518
- cmd.command("follow-up <parentEpic>").description("Open a follow-up epic of <parentEpic> to park work found while doing it \u2014 nothing runs yet").requiredOption("--title <title>", "what the follow-up is").option("--desc <description>", "the note: what turned up, and why it is not part of the parent").option("--recipe <id>", "recipe for the follow-up (default: the one the parent runs on)").option("--pipeline <id>", "use an existing pipeline as-is (default: the parent's workflow)").option("--from <pipelineId>", "override the recipe's source pipeline").option("--epic <id>", "id for the follow-up (default: <parentEpic>-F<n>)").option("--input <kv>", "capability input as key=value (repeatable)", collectKv, []).option("--tag <tag>", "extra tag (repeatable) \u2014 added to the ones inherited from the parent", collectKv, []).option("--no-inherit-tags", "do not copy the parent's tags").option("--no-strict", "work to the size of this epic \u2014 no invented NFR / risk / alternatives sections").option("--json", "output the result as JSON").action((parentEpic, opts, actionCmd) => {
50597
+ cmd.command("follow-up <parentEpic>").description("Open a follow-up epic of <parentEpic> to park work found while doing it \u2014 nothing runs yet").requiredOption("--title <title>", "what the follow-up is").option("--desc <description>", "the note: what turned up, and why it is not part of the parent").option("--recipe <id>", "recipe for the follow-up (default: the one the parent runs on)").option("--pipeline <id>", "use an existing pipeline as-is (default: the parent's workflow)").option("--from <pipelineId>", "override the recipe's source pipeline").option("--epic <id>", "id for the follow-up (default: <parentEpic>-F<n>)").option("--also <epic>", "another epic this one also follows (repeatable) \u2014 linked and read for context; <parentEpic> stays the one it is grouped under", collectKv, []).option("--input <kv>", "capability input as key=value (repeatable)", collectKv, []).option("--tag <tag>", "extra tag (repeatable) \u2014 added to the ones inherited from the parent", collectKv, []).option("--no-inherit-tags", "do not copy the parent's tags").option("--no-strict", "work to the size of this epic \u2014 no invented NFR / risk / alternatives sections").option("--json", "output the result as JSON").action((parentEpic, opts, actionCmd) => {
50519
50598
  const root = resolveWorkspaceRoot(actionCmd);
50520
50599
  const doc = requireYaml(root);
50521
50600
  if (opts.recipe && opts.pipeline) {
@@ -50537,6 +50616,14 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50537
50616
  console.error(import_chalk15.default.red(err instanceof Error ? err.message : String(err)));
50538
50617
  process.exit(1);
50539
50618
  }
50619
+ for (const other of opts.also) {
50620
+ try {
50621
+ (0, import_core19.followUpDefaults)(root, doc, other.trim());
50622
+ } catch (err) {
50623
+ console.error(import_chalk15.default.red(err instanceof Error ? err.message : String(err)));
50624
+ process.exit(1);
50625
+ }
50626
+ }
50540
50627
  const epicId = opts.epic?.trim() || defaults.epicId;
50541
50628
  const target = opts.pipeline ? { pipeline: opts.pipeline } : opts.recipe ? { recipe: opts.recipe } : defaults.target?.kind === "pipeline" ? { pipeline: defaults.target.id } : defaults.target ? { recipe: defaults.target.id } : void 0;
50542
50629
  if (!target) {
@@ -50563,7 +50650,7 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50563
50650
  description: opts.desc?.trim() ?? "",
50564
50651
  target: { kind: "pipeline", id: pipelineCfg.id },
50565
50652
  agents,
50566
- inputs: (0, import_core19.withFollowUpProvenance)(inputs, parentEpic, defaults.key),
50653
+ inputs: (0, import_core19.withFollowUpProvenance)(inputs, parentEpic, defaults.key, opts.also),
50567
50654
  pipeline: pipelineCfg,
50568
50655
  strictMode: opts.strict,
50569
50656
  tags
@@ -50574,12 +50661,14 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50574
50661
  epicDir,
50575
50662
  pipeline: pipelineCfg.id,
50576
50663
  fromEpic: parentEpic,
50664
+ alsoFrom: opts.also,
50577
50665
  followUpKey: defaults.key,
50578
50666
  tags
50579
50667
  }, null, 2));
50580
50668
  return;
50581
50669
  }
50582
- console.log(import_chalk15.default.green("\u2714") + ` Opened follow-up ${import_chalk15.default.bold(epicId)} of ${import_chalk15.default.bold(parentEpic)}`);
50670
+ const others = opts.also.length > 0 ? ` (also ${opts.also.map((id) => import_chalk15.default.bold(id)).join(", ")})` : "";
50671
+ console.log(import_chalk15.default.green("\u2714") + ` Opened follow-up ${import_chalk15.default.bold(epicId)} of ${import_chalk15.default.bold(parentEpic)}${others}`);
50583
50672
  console.log(import_chalk15.default.dim(` Pipeline: ${pipelineCfg.id}`));
50584
50673
  console.log(import_chalk15.default.dim(` Steps: ${agents.join(" \u2192 ")}`));
50585
50674
  console.log(import_chalk15.default.dim(` Dir: ${epicDir}`));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delete101020/aidlc",
3
- "version": "4.0.36",
3
+ "version": "4.0.37",
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": {