@delete101020/aidlc 4.0.36 → 4.0.38

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 +127 -22
  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,11 +27076,12 @@ 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;
27083
27083
  exports2.followUpChildId = followUpChildId;
27084
+ exports2.combinedParentId = combinedParentId;
27084
27085
  exports2.openManifestFollowUp = openManifestFollowUp;
27085
27086
  exports2.withFollowUpProvenance = withFollowUpProvenance2;
27086
27087
  exports2.nextManualFollowUpKey = nextManualFollowUpKey;
@@ -27205,6 +27206,17 @@ var require_FollowUps = __commonJS({
27205
27206
  }
27206
27207
  throw new EpicScaffold_1.EpicScaffoldError(`Could not derive a free epic id from "${base}".`);
27207
27208
  }
27209
+ function combinedParentId(parentEpicId, alsoFrom = []) {
27210
+ const head = parentEpicId.split("-");
27211
+ return parentEpicId + alsoFrom.map((id) => {
27212
+ const segs = id.split("-");
27213
+ let i = 0;
27214
+ while (i < segs.length - 1 && segs[i] === head[i]) {
27215
+ i++;
27216
+ }
27217
+ return segs.slice(i).join("-");
27218
+ }).join("");
27219
+ }
27208
27220
  function openManifestFollowUp(args) {
27209
27221
  const { workspaceRoot, doc, parentEpicId, item, pipeline } = args;
27210
27222
  const steps = Array.isArray(pipeline.steps) ? pipeline.steps : [];
@@ -27235,8 +27247,16 @@ var require_FollowUps = __commonJS({
27235
27247
  intentPath: path17.join(result.artifactsDir, exports2.FOLLOW_UP_INTENT)
27236
27248
  };
27237
27249
  }
27238
- function withFollowUpProvenance2(inputs, parentEpicId, key) {
27239
- return { ...inputs, from_epic: parentEpicId, follow_up_key: key };
27250
+ exports2.ALSO_FROM_INPUT = "also_from";
27251
+ function withFollowUpProvenance2(inputs, parentEpicId, key, alsoFrom = []) {
27252
+ const { [exports2.ALSO_FROM_INPUT]: _ignored, ...rest } = inputs;
27253
+ const others = [...new Set(alsoFrom.map((id) => id.trim()).filter((id) => id && id !== parentEpicId))];
27254
+ return {
27255
+ ...rest,
27256
+ from_epic: parentEpicId,
27257
+ follow_up_key: key,
27258
+ ...others.length > 0 ? { [exports2.ALSO_FROM_INPUT]: others.join(",") } : {}
27259
+ };
27240
27260
  }
27241
27261
  exports2.MANUAL_FOLLOW_UP_KEY_PREFIX = "F";
27242
27262
  function nextManualFollowUpKey(taken) {
@@ -27283,7 +27303,7 @@ var require_FollowUps = __commonJS({
27283
27303
  }
27284
27304
  return void 0;
27285
27305
  }
27286
- function followUpDefaults2(workspaceRoot, doc, parentEpicId) {
27306
+ function followUpDefaults2(workspaceRoot, doc, parentEpicId, alsoFrom = []) {
27287
27307
  const root = (0, EpicScaffold_1.epicsRoot)(workspaceRoot, doc);
27288
27308
  const dir = path17.join(root, parentEpicId);
27289
27309
  const stateFile = path17.join(dir, "state.json");
@@ -27312,14 +27332,15 @@ var require_FollowUps = __commonJS({
27312
27332
  if (!own && typeof state.pipeline === "string") {
27313
27333
  own = pipelines.find((p) => p.id === state.pipeline) ?? null;
27314
27334
  }
27315
- const key = nextManualFollowUpKey(followUpsOf(workspaceRoot, doc, parentEpicId).map((f) => f.key ?? ""));
27316
27335
  const taken = fs14.existsSync(root) ? fs14.readdirSync(root) : [];
27336
+ const combined = combinedParentId(parentEpicId, alsoFrom);
27337
+ const key = alsoFrom.length > 0 ? nextManualFollowUpKey(taken.filter((id) => id.startsWith(`${combined}-`)).map((id) => id.slice(combined.length + 1))) : nextManualFollowUpKey(followUpsOf(workspaceRoot, doc, parentEpicId).map((f) => f.key ?? ""));
27317
27338
  const target = parentTarget(own, pipelines, recipes);
27318
27339
  return {
27319
27340
  parentEpicId,
27320
27341
  parentTitle: typeof state.title === "string" ? state.title : "",
27321
27342
  key,
27322
- epicId: followUpChildId(parentEpicId, key, taken),
27343
+ epicId: followUpChildId(combined, key, taken),
27323
27344
  tags: (0, epicTags_1.normalizeTags)(state.tags),
27324
27345
  ...target ? { target } : {}
27325
27346
  };
@@ -30677,6 +30698,24 @@ var require_epicFocus = __commonJS({
30677
30698
  }
30678
30699
  });
30679
30700
 
30701
+ // ../core/dist/loader/inheritedContext.js
30702
+ var require_inheritedContext = __commonJS({
30703
+ "../core/dist/loader/inheritedContext.js"(exports2) {
30704
+ "use strict";
30705
+ Object.defineProperty(exports2, "__esModule", { value: true });
30706
+ exports2.INHERITED_CONTEXT_MARKER = void 0;
30707
+ exports2.inheritedContextNote = inheritedContextNote;
30708
+ exports2.commandBodyPredatesInheritedContext = commandBodyPredatesInheritedContext;
30709
+ exports2.INHERITED_CONTEXT_MARKER = "`also_from`";
30710
+ function inheritedContextNote(epicRoot) {
30711
+ 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.`;
30712
+ }
30713
+ function commandBodyPredatesInheritedContext(existing) {
30714
+ return !existing.includes(exports2.INHERITED_CONTEXT_MARKER);
30715
+ }
30716
+ }
30717
+ });
30718
+
30680
30719
  // ../core/dist/presets/commandBodyFreshness.js
30681
30720
  var require_commandBodyFreshness = __commonJS({
30682
30721
  "../core/dist/presets/commandBodyFreshness.js"(exports2) {
@@ -30685,8 +30724,9 @@ var require_commandBodyFreshness = __commonJS({
30685
30724
  exports2.commandBodyIsStale = commandBodyIsStale;
30686
30725
  var artifactLanguage_1 = require_artifactLanguage();
30687
30726
  var strictMode_1 = require_strictMode();
30727
+ var inheritedContext_1 = require_inheritedContext();
30688
30728
  function commandBodyIsStale(existing) {
30689
- return (0, artifactLanguage_1.commandBodyPredatesArtifactLanguage)(existing) || (0, strictMode_1.commandBodyPredatesStrictMode)(existing);
30729
+ return (0, artifactLanguage_1.commandBodyPredatesArtifactLanguage)(existing) || (0, strictMode_1.commandBodyPredatesStrictMode)(existing) || (0, inheritedContext_1.commandBodyPredatesInheritedContext)(existing);
30690
30730
  }
30691
30731
  }
30692
30732
  });
@@ -31337,8 +31377,46 @@ Expected a JS/TS module at "${scriptPath}" with a default-exported function retu
31337
31377
  var require_execEngine = __commonJS({
31338
31378
  "../core/dist/runs/execEngine.js"(exports2) {
31339
31379
  "use strict";
31380
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
31381
+ if (k2 === void 0) k2 = k;
31382
+ var desc = Object.getOwnPropertyDescriptor(m, k);
31383
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
31384
+ desc = { enumerable: true, get: function() {
31385
+ return m[k];
31386
+ } };
31387
+ }
31388
+ Object.defineProperty(o, k2, desc);
31389
+ } : function(o, m, k, k2) {
31390
+ if (k2 === void 0) k2 = k;
31391
+ o[k2] = m[k];
31392
+ });
31393
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {
31394
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31395
+ } : function(o, v) {
31396
+ o["default"] = v;
31397
+ });
31398
+ var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ function() {
31399
+ var ownKeys = function(o) {
31400
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
31401
+ var ar = [];
31402
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
31403
+ return ar;
31404
+ };
31405
+ return ownKeys(o);
31406
+ };
31407
+ return function(mod) {
31408
+ if (mod && mod.__esModule) return mod;
31409
+ var result = {};
31410
+ if (mod != null) {
31411
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31412
+ }
31413
+ __setModuleDefault(result, mod);
31414
+ return result;
31415
+ };
31416
+ }();
31340
31417
  Object.defineProperty(exports2, "__esModule", { value: true });
31341
31418
  exports2.runExecLoop = runExecLoop2;
31419
+ var path17 = __importStar(require("path"));
31342
31420
  var WorkspaceLoader_1 = require_WorkspaceLoader();
31343
31421
  var RunStateStore_1 = require_RunStateStore();
31344
31422
  var PipelineRunner_1 = require_PipelineRunner();
@@ -31353,6 +31431,7 @@ var require_execEngine = __commonJS({
31353
31431
  var WorkspaceSchema_1 = require_WorkspaceSchema();
31354
31432
  var artifactLanguage_1 = require_artifactLanguage();
31355
31433
  var strictMode_1 = require_strictMode();
31434
+ var inheritedContext_1 = require_inheritedContext();
31356
31435
  var promptComposer_1 = require_promptComposer();
31357
31436
  var projectInstructions_1 = require_projectInstructions();
31358
31437
  var types_1 = require_types();
@@ -31553,7 +31632,11 @@ var require_execEngine = __commonJS({
31553
31632
  const skillText = prompt2.text;
31554
31633
  const env = ws.envResolver.resolveLayered(ws.config.environment ?? {}, agent.env ?? {});
31555
31634
  const contextStr = Object.entries(state.context).map(([k, v]) => `${k}=${v}`).join(" ");
31556
- const userMessage = opts.message ?? (contextStr || `Execute step: ${agentId}`);
31635
+ const epicRoot = path17.relative(root, (0, EpicScaffold_1.epicsRoot)(root, ws.config)).split(path17.sep).join("/");
31636
+ const inherited = state.context.from_epic ? `
31637
+
31638
+ About these inputs: ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}` : "";
31639
+ const userMessage = opts.message ?? (contextStr ? contextStr + inherited : `Execute step: ${agentId}`);
31557
31640
  if (opts.dryRun) {
31558
31641
  hooks.onDryRunPreview?.({
31559
31642
  skills: skillIds.join(", "),
@@ -32094,6 +32177,7 @@ var require_builtinWorkflows = __commonJS({
32094
32177
  var path17 = __importStar(require("path"));
32095
32178
  var artifactLanguage_1 = require_artifactLanguage();
32096
32179
  var strictMode_1 = require_strictMode();
32180
+ var inheritedContext_1 = require_inheritedContext();
32097
32181
  var models_1 = require_models();
32098
32182
  var templateRenderer_1 = require_templateRenderer();
32099
32183
  var PHASES = [
@@ -32890,7 +32974,7 @@ The user invoked you with epic id \`$ARGUMENTS\`.
32890
32974
  1. Read \`${epicRoot}/$ARGUMENTS/state.json\` to understand the current run state.
32891
32975
  - If the step has \`feedback\` from a prior rejection, address it explicitly in this revision.
32892
32976
  - 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.).
32977
+ 2. Read \`${epicRoot}/$ARGUMENTS/inputs.json\` for capability inputs (Jira ticket, Figma URL, files glob, GitHub repo, etc.). ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}
32894
32978
  ${artifactInstruction}
32895
32979
  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
32980
 
@@ -33308,6 +33392,7 @@ var require_commandModel = __commonJS({
33308
33392
  var path17 = __importStar(require("path"));
33309
33393
  var artifactLanguage_1 = require_artifactLanguage();
33310
33394
  var strictMode_1 = require_strictMode();
33395
+ var inheritedContext_1 = require_inheritedContext();
33311
33396
  var commandBodyFreshness_1 = require_commandBodyFreshness();
33312
33397
  var WorkspaceSchema_1 = require_WorkspaceSchema();
33313
33398
  var runProgress_1 = require_runProgress();
@@ -33466,7 +33551,7 @@ Claude \u2014 but still follow the structural contract below.
33466
33551
 
33467
33552
  1. Read \`${epicRoot}/<epic>/state.json\` for prior feedback/history and address
33468
33553
  any rejection reasons in this revision.
33469
- 2. Read \`${epicRoot}/<epic>/inputs.json\` for capability inputs.
33554
+ 2. Read \`${epicRoot}/<epic>/inputs.json\` for capability inputs. ${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}
33470
33555
  3. Before writing, read the blank template for that artifact at
33471
33556
  \`.aidlc/aidlc-templates/<templatesId>/<FILE>\` and follow its structure \u2014
33472
33557
  \`<templatesId>\` is the pipeline's \`derived_from\` when it has one (a
@@ -33509,7 +33594,7 @@ procedure exactly as \`/aidlc <epic> ${phase.id}\` would:
33509
33594
  ones \u2014 and only fall back to \`.claude/skills/<id>.md\` and
33510
33595
  \`.claude/agents/<id>.md\` when none is declared. Adopt them (unless the
33511
33596
  active standard is \`none\`), then follow the structural contract: read
33512
- state/inputs, write to
33597
+ state/inputs (${(0, inheritedContext_1.inheritedContextNote)(epicRoot)}), write to
33513
33598
  \`${epicRoot}/<epic>/artifacts/${phase.artifact}\` (or the step's declared
33514
33599
  artifact), and tell the user to click **"Mark step done"**.
33515
33600
 
@@ -34032,12 +34117,12 @@ var require_dist = __commonJS({
34032
34117
  "use strict";
34033
34118
  Object.defineProperty(exports2, "__esModule", { value: true });
34034
34119
  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
- 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
- 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;
34120
+ 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.combinedParentId = exports2.followUpChildId = exports2.followUpsOf = exports2.readEpicFollowUps = exports2.parseFollowUps = exports2.FollowUpsParseError = exports2.FollowUpManifestSchema = exports2.FollowUpItemSchema = exports2.SIGNAL_FILE = exports2.FOLLOW_UP_ARTIFACT = exports2.readEpicSignal = exports2.existingEpicIds = exports2.followUpIdFor = exports2.followUpEpicId = exports2.renderIntentMarkdown = exports2.openFollowUpEpic = exports2.openIncidentEpic = void 0;
34121
+ 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 = exports2.dropRecipeStep = void 0;
34122
+ 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 = exports2.RECENT_EPICS_LIMIT = void 0;
34123
+ 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 = exports2.buildClaudeSpawnEnv = void 0;
34124
+ 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 = exports2.migrateRunState = void 0;
34125
+ 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 = exports2.nextEligiblePhase = void 0;
34041
34126
  var WorkspaceSchema_1 = require_WorkspaceSchema();
34042
34127
  Object.defineProperty(exports2, "WorkspaceSchema", { enumerable: true, get: function() {
34043
34128
  return WorkspaceSchema_1.WorkspaceSchema;
@@ -34248,6 +34333,9 @@ var require_dist = __commonJS({
34248
34333
  Object.defineProperty(exports2, "followUpChildId", { enumerable: true, get: function() {
34249
34334
  return FollowUps_1.followUpChildId;
34250
34335
  } });
34336
+ Object.defineProperty(exports2, "combinedParentId", { enumerable: true, get: function() {
34337
+ return FollowUps_1.combinedParentId;
34338
+ } });
34251
34339
  Object.defineProperty(exports2, "openManifestFollowUp", { enumerable: true, get: function() {
34252
34340
  return FollowUps_1.openManifestFollowUp;
34253
34341
  } });
@@ -34575,6 +34663,13 @@ var require_dist = __commonJS({
34575
34663
  Object.defineProperty(exports2, "strictModeSection", { enumerable: true, get: function() {
34576
34664
  return strictMode_1.strictModeSection;
34577
34665
  } });
34666
+ var inheritedContext_1 = require_inheritedContext();
34667
+ Object.defineProperty(exports2, "INHERITED_CONTEXT_MARKER", { enumerable: true, get: function() {
34668
+ return inheritedContext_1.INHERITED_CONTEXT_MARKER;
34669
+ } });
34670
+ Object.defineProperty(exports2, "inheritedContextNote", { enumerable: true, get: function() {
34671
+ return inheritedContext_1.inheritedContextNote;
34672
+ } });
34578
34673
  var epicTags_1 = require_epicTags();
34579
34674
  Object.defineProperty(exports2, "EPIC_TAGS_KEY", { enumerable: true, get: function() {
34580
34675
  return epicTags_1.EPIC_TAGS_KEY;
@@ -43796,7 +43891,7 @@ var require_package = __commonJS({
43796
43891
  "package.json"(exports2, module2) {
43797
43892
  module2.exports = {
43798
43893
  name: "@delete101020/aidlc",
43799
- version: "4.0.36",
43894
+ version: "4.0.38",
43800
43895
  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
43896
  license: "MIT",
43802
43897
  repository: {
@@ -50515,7 +50610,7 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50515
50610
  throw err;
50516
50611
  }
50517
50612
  });
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) => {
50613
+ 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
50614
  const root = resolveWorkspaceRoot(actionCmd);
50520
50615
  const doc = requireYaml(root);
50521
50616
  if (opts.recipe && opts.pipeline) {
@@ -50532,11 +50627,19 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50532
50627
  }
50533
50628
  let defaults;
50534
50629
  try {
50535
- defaults = (0, import_core19.followUpDefaults)(root, doc, parentEpic);
50630
+ defaults = (0, import_core19.followUpDefaults)(root, doc, parentEpic, opts.also.map((id) => id.trim()));
50536
50631
  } catch (err) {
50537
50632
  console.error(import_chalk15.default.red(err instanceof Error ? err.message : String(err)));
50538
50633
  process.exit(1);
50539
50634
  }
50635
+ for (const other of opts.also) {
50636
+ try {
50637
+ (0, import_core19.followUpDefaults)(root, doc, other.trim());
50638
+ } catch (err) {
50639
+ console.error(import_chalk15.default.red(err instanceof Error ? err.message : String(err)));
50640
+ process.exit(1);
50641
+ }
50642
+ }
50540
50643
  const epicId = opts.epic?.trim() || defaults.epicId;
50541
50644
  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
50645
  if (!target) {
@@ -50563,7 +50666,7 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50563
50666
  description: opts.desc?.trim() ?? "",
50564
50667
  target: { kind: "pipeline", id: pipelineCfg.id },
50565
50668
  agents,
50566
- inputs: (0, import_core19.withFollowUpProvenance)(inputs, parentEpic, defaults.key),
50669
+ inputs: (0, import_core19.withFollowUpProvenance)(inputs, parentEpic, defaults.key, opts.also),
50567
50670
  pipeline: pipelineCfg,
50568
50671
  strictMode: opts.strict,
50569
50672
  tags
@@ -50574,12 +50677,14 @@ Run ${import_chalk15.default.cyan(`${runCmd} ${epicId}`)} in Claude to begin.`);
50574
50677
  epicDir,
50575
50678
  pipeline: pipelineCfg.id,
50576
50679
  fromEpic: parentEpic,
50680
+ alsoFrom: opts.also,
50577
50681
  followUpKey: defaults.key,
50578
50682
  tags
50579
50683
  }, null, 2));
50580
50684
  return;
50581
50685
  }
50582
- console.log(import_chalk15.default.green("\u2714") + ` Opened follow-up ${import_chalk15.default.bold(epicId)} of ${import_chalk15.default.bold(parentEpic)}`);
50686
+ const others = opts.also.length > 0 ? ` (also ${opts.also.map((id) => import_chalk15.default.bold(id)).join(", ")})` : "";
50687
+ console.log(import_chalk15.default.green("\u2714") + ` Opened follow-up ${import_chalk15.default.bold(epicId)} of ${import_chalk15.default.bold(parentEpic)}${others}`);
50583
50688
  console.log(import_chalk15.default.dim(` Pipeline: ${pipelineCfg.id}`));
50584
50689
  console.log(import_chalk15.default.dim(` Steps: ${agents.join(" \u2192 ")}`));
50585
50690
  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.38",
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": {