@delete101020/aidlc 4.0.26 → 4.0.27

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: epic-context
3
- description: Load and maintain an epic's compact memory so continuing it (with any agent) is cheap on tokens. Reads docs/epics/<epic>/epic-memory.json FIRST as primary context, appends durable decisions/constraints as you work, and records a reflection on how to prompt/work better next time. Invoke /epic-context <epic> when starting or continuing an epic.
3
+ description: Load and maintain an epic's compact memory so continuing it (with any agent) is cheap on tokens. Reads docs/epics/<epic>/epic-memory.json FIRST as primary context, appends durable decisions/constraints as you work, and records a reflection on how to prompt/work better next time. Invoke /epic-context <epic> when starting or continuing an epic (no id = the active epic from .aidlc/user.yaml).
4
4
  ---
5
5
 
6
6
  # /epic-context — cheap, portable epic memory
@@ -20,9 +20,16 @@ Each write is auto-attributed (git identity, hostname fallback) + timestamped.
20
20
 
21
21
  ## Arguments
22
22
 
23
- `/epic-context <epic>` — e.g. `/epic-context EPIC-001`. Paths are relative to the
23
+ `/epic-context [epic]` — e.g. `/epic-context EPIC-001`. Paths are relative to the
24
24
  open project: `EPIC_DIR = docs/epics/<epic>`.
25
25
 
26
+ No id given → use the **active epic**: the `active_epic:` line of
27
+ `.aidlc/user.yaml` (set from the VS Code status bar / Go to Epic, or with
28
+ `aidlc epic use <id>`). Read it with
29
+ `grep -m1 '^active_epic:' .aidlc/user.yaml | sed 's/^active_epic:[[:space:]]*//'`.
30
+ Say which epic you picked in one line. If there is no active epic either, ask
31
+ for the id — don't guess from the epics folder.
32
+
26
33
  ## On start (continuing an epic)
27
34
 
28
35
  1. **Load memory first**: `$M show "$EPIC_DIR"`.
package/dist/bundle.js CHANGED
@@ -30209,8 +30209,9 @@ var require_userConfig = __commonJS({
30209
30209
  exports2.userConfigPath = userConfigPath;
30210
30210
  exports2.readUserConfig = readUserConfig3;
30211
30211
  exports2.writeUserEpicIdPrefix = writeUserEpicIdPrefix;
30212
+ exports2.updateUserConfig = updateUserConfig;
30212
30213
  exports2.readGitUserName = readGitUserName2;
30213
- exports2.ensureUserConfigIgnored = ensureUserConfigIgnored;
30214
+ exports2.ensureUserConfigIgnored = ensureUserConfigIgnored2;
30214
30215
  var child_process_1 = require("child_process");
30215
30216
  var fs_1 = __importDefault(require("fs"));
30216
30217
  var path_1 = __importDefault(require("path"));
@@ -30236,15 +30237,22 @@ var require_userConfig = __commonJS({
30236
30237
  "# Settings for this checkout only \u2014 NOT committed (see .gitignore).",
30237
30238
  "# epic_id_prefix is your own two letters, so the epics you open are filed",
30238
30239
  "# under you and never collide with a colleague's numbering.",
30240
+ "# active_epic / pinned_epics / recent_epics are your own working set; the",
30241
+ "# extension and `aidlc epic use|pin` keep them, and hand edits are fine.",
30239
30242
  ""
30240
30243
  ].join("\n");
30241
30244
  function writeUserEpicIdPrefix(root, prefix) {
30245
+ updateUserConfig(root, (doc) => {
30246
+ if (prefix) {
30247
+ doc.epic_id_prefix = prefix.toUpperCase();
30248
+ } else {
30249
+ delete doc.epic_id_prefix;
30250
+ }
30251
+ });
30252
+ }
30253
+ function updateUserConfig(root, mutate) {
30242
30254
  const doc = readUserConfig3(root) ?? {};
30243
- if (prefix) {
30244
- doc.epic_id_prefix = prefix.toUpperCase();
30245
- } else {
30246
- delete doc.epic_id_prefix;
30247
- }
30255
+ mutate(doc);
30248
30256
  const file = userConfigPath(root);
30249
30257
  fs_1.default.mkdirSync(path_1.default.dirname(file), { recursive: true });
30250
30258
  if (Object.keys(doc).length === 0) {
@@ -30267,7 +30275,7 @@ var require_userConfig = __commonJS({
30267
30275
  return null;
30268
30276
  }
30269
30277
  }
30270
- function ensureUserConfigIgnored(root) {
30278
+ function ensureUserConfigIgnored2(root) {
30271
30279
  const file = path_1.default.join(root, ".gitignore");
30272
30280
  try {
30273
30281
  const existing = fs_1.default.existsSync(file) ? fs_1.default.readFileSync(file, "utf8") : "";
@@ -30277,7 +30285,7 @@ var require_userConfig = __commonJS({
30277
30285
  }
30278
30286
  const sep4 = existing === "" || existing.endsWith("\n") ? "" : "\n";
30279
30287
  fs_1.default.writeFileSync(file, `${existing}${sep4}
30280
- # Per-checkout AIDLC settings (epic_id_prefix) \u2014 never shared
30288
+ # Per-checkout AIDLC settings (epic_id_prefix, active/pinned epics) \u2014 never shared
30281
30289
  ${exports2.USER_CONFIG_IGNORE_LINE}
30282
30290
  `, "utf8");
30283
30291
  return true;
@@ -30288,6 +30296,114 @@ ${exports2.USER_CONFIG_IGNORE_LINE}
30288
30296
  }
30289
30297
  });
30290
30298
 
30299
+ // ../core/dist/loader/epicFocus.js
30300
+ var require_epicFocus = __commonJS({
30301
+ "../core/dist/loader/epicFocus.js"(exports2) {
30302
+ "use strict";
30303
+ Object.defineProperty(exports2, "__esModule", { value: true });
30304
+ exports2.RECENT_EPICS_LIMIT = exports2.RECENT_EPICS_KEY = exports2.PINNED_EPICS_KEY = exports2.ACTIVE_EPIC_KEY = void 0;
30305
+ exports2.epicFocusFrom = epicFocusFrom;
30306
+ exports2.readEpicFocus = readEpicFocus2;
30307
+ exports2.pushRecent = pushRecent;
30308
+ exports2.recordEpicOpened = recordEpicOpened;
30309
+ exports2.setActiveEpic = setActiveEpic2;
30310
+ exports2.setEpicPinned = setEpicPinned2;
30311
+ exports2.epicIdFromBranch = epicIdFromBranch;
30312
+ var userConfig_1 = require_userConfig();
30313
+ exports2.ACTIVE_EPIC_KEY = "active_epic";
30314
+ exports2.PINNED_EPICS_KEY = "pinned_epics";
30315
+ exports2.RECENT_EPICS_KEY = "recent_epics";
30316
+ exports2.RECENT_EPICS_LIMIT = 10;
30317
+ function asId(v) {
30318
+ return typeof v === "string" && v.trim() !== "" ? v.trim() : null;
30319
+ }
30320
+ function asIdList(v) {
30321
+ if (!Array.isArray(v)) {
30322
+ return [];
30323
+ }
30324
+ const out2 = [];
30325
+ for (const item of v) {
30326
+ const id = asId(item);
30327
+ if (id && !out2.includes(id)) {
30328
+ out2.push(id);
30329
+ }
30330
+ }
30331
+ return out2;
30332
+ }
30333
+ function epicFocusFrom(doc) {
30334
+ return {
30335
+ active: asId(doc?.[exports2.ACTIVE_EPIC_KEY]),
30336
+ pinned: asIdList(doc?.[exports2.PINNED_EPICS_KEY]),
30337
+ recent: asIdList(doc?.[exports2.RECENT_EPICS_KEY])
30338
+ };
30339
+ }
30340
+ function readEpicFocus2(root) {
30341
+ return epicFocusFrom((0, userConfig_1.readUserConfig)(root));
30342
+ }
30343
+ function pushRecent(list, id, limit = exports2.RECENT_EPICS_LIMIT) {
30344
+ return [id, ...list.filter((x) => x !== id)].slice(0, limit);
30345
+ }
30346
+ function writeList(doc, key, list) {
30347
+ if (list.length > 0) {
30348
+ doc[key] = list;
30349
+ } else {
30350
+ delete doc[key];
30351
+ }
30352
+ }
30353
+ function recordEpicOpened(root, id) {
30354
+ (0, userConfig_1.updateUserConfig)(root, (doc) => {
30355
+ writeList(doc, exports2.RECENT_EPICS_KEY, pushRecent(asIdList(doc[exports2.RECENT_EPICS_KEY]), id));
30356
+ });
30357
+ }
30358
+ function setActiveEpic2(root, id) {
30359
+ (0, userConfig_1.updateUserConfig)(root, (doc) => {
30360
+ if (id) {
30361
+ doc[exports2.ACTIVE_EPIC_KEY] = id;
30362
+ writeList(doc, exports2.RECENT_EPICS_KEY, pushRecent(asIdList(doc[exports2.RECENT_EPICS_KEY]), id));
30363
+ } else {
30364
+ delete doc[exports2.ACTIVE_EPIC_KEY];
30365
+ }
30366
+ });
30367
+ }
30368
+ function setEpicPinned2(root, id, pinned) {
30369
+ (0, userConfig_1.updateUserConfig)(root, (doc) => {
30370
+ const list = asIdList(doc[exports2.PINNED_EPICS_KEY]).filter((x) => x !== id);
30371
+ if (pinned) {
30372
+ list.push(id);
30373
+ }
30374
+ writeList(doc, exports2.PINNED_EPICS_KEY, list);
30375
+ });
30376
+ }
30377
+ function epicIdFromBranch(branch, knownIds) {
30378
+ if (!branch) {
30379
+ return null;
30380
+ }
30381
+ const hay = branch.toLowerCase();
30382
+ let best = null;
30383
+ for (const id of knownIds) {
30384
+ const needle = id.toLowerCase();
30385
+ let from = 0;
30386
+ for (; ; ) {
30387
+ const at = hay.indexOf(needle, from);
30388
+ if (at < 0) {
30389
+ break;
30390
+ }
30391
+ const before = at === 0 ? "" : hay[at - 1];
30392
+ const after = hay[at + needle.length] ?? "";
30393
+ if (!/[a-z0-9]/.test(before) && !/[0-9]/.test(after)) {
30394
+ if (!best || id.length > best.length) {
30395
+ best = id;
30396
+ }
30397
+ break;
30398
+ }
30399
+ from = at + 1;
30400
+ }
30401
+ }
30402
+ return best;
30403
+ }
30404
+ }
30405
+ });
30406
+
30291
30407
  // ../core/dist/presets/commandBodyFreshness.js
30292
30408
  var require_commandBodyFreshness = __commonJS({
30293
30409
  "../core/dist/presets/commandBodyFreshness.js"(exports2) {
@@ -33536,11 +33652,11 @@ var require_dist = __commonJS({
33536
33652
  Object.defineProperty(exports2, "__esModule", { value: true });
33537
33653
  exports2.openIncidentEpic = exports2.SignalParseError = exports2.isSignal = exports2.parseSignal = exports2.SignalSchema = exports2.EpicStepEditError = exports2.resolveStepRef = exports2.describeGateEffect = exports2.commitEpicStepEdit = exports2.planSetEpicStepGates = exports2.planRemoveEpicStep = exports2.planAddEpicStep = exports2.EpicWorkflowSwitchError = exports2.canSwitchEpicWorkflow = exports2.epicWorkflowLock = exports2.applyEpicWorkflowSwitch = exports2.stageEpicWorkflowSwitch = exports2.planEpicWorkflowSwitch = exports2.EpicDescriptionError = exports2.setEpicDescription = exports2.lockedEpicDirError = exports2.EpicScaffoldError = exports2.epicsRoot = exports2.mapStepStatusToEpic = exports2.mirrorRunStateToEpic = exports2.scaffoldEpic = exports2.resolveArtifactCommitConfig = exports2.commitApprovedArtifacts = exports2.PipelineAdaptError = exports2.applyAdaptation = exports2.parseAdaptationVerdict = exports2.buildAdaptationPrompt = exports2.buildPhaseCatalog = exports2.slugEpicId = exports2.parseClassificationVerdict = exports2.buildClassificationPrompt = exports2.heuristicClassify = exports2.PipelineAssembleError = exports2.recipePipelineId = exports2.assemblePipeline = exports2.collectWorkspaceRefIssues = exports2.resolveStepSkills = exports2.stepSkillAlternatives = exports2.stepDagId = exports2.stepAgentId = exports2.producesEntries = exports2.normalizeStep = exports2.WorkspaceValidationError = exports2.validateWorkspace = exports2.WorkspaceSchema = void 0;
33538
33654
  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.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 = void 0;
33539
- exports2.EPIC_TAGS_KEY = exports2.strictModeSection = exports2.resolveEpicStrictMode = exports2.epicStrictMode = exports2.commandBodyPredatesStrictMode = exports2.STRICT_MODE_KEY = exports2.STRICT_MODE_HEADING = exports2.writeUserEpicIdPrefix = exports2.userConfigPath = exports2.readUserConfig = exports2.readGitUserName = exports2.ensureUserConfigIgnored = exports2.USER_CONFIG_RELPATH = exports2.USER_CONFIG_IGNORE_LINE = exports2.suggestEpicId = exports2.resolveEpicIdPrefixChain = exports2.resolveEpicIdPrefix = exports2.epicIdDateStamp = exports2.deriveEpicIdPrefix = exports2.EPIC_ID_PREFIX_PATTERN = exports2.EPIC_ID_PREFIX_KEY = exports2.resolveArtifactLanguage = exports2.commandBodyPredatesArtifactLanguage = exports2.artifactLanguageSection = exports2.ARTIFACT_LANGUAGE_HEADING = exports2.stripPersonaDirectives = exports2.composeAgentPrompt = exports2.PROJECT_INSTRUCTION_FILES = exports2.findProjectInstructions = exports2.stripPersonaMetadata = exports2.PersonaLoader = exports2.SkillNotFoundError = exports2.SkillLoader = exports2.EnvVarMissingError = exports2.EnvResolver = exports2.epicPipelineReport = exports2.planEpicPipelineExtraction = exports2.epicOwningPipeline = exports2.unstageEpicPipeline = exports2.stageEpicPipeline = exports2.writeEpicPipelines = exports2.splitEpicPipelines = exports2.mergeEpicPipelines = exports2.epicPipelinePath = exports2.EPIC_PIPELINE_FILENAME = exports2.unusedAfterStepRemoval = exports2.skillReferences = exports2.agentReferences = exports2.renameSkillRefs = exports2.renameAgentRefs = void 0;
33540
- exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = exports2.chooseStepSkill = exports2.requestStepUpdate = exports2.rerunStep = exports2.rejectStep = exports2.approveStep = exports2.undoStepDone = exports2.canUndoStepDone = exports2.markStepDone = exports2.canStartStep = exports2.startRun = exports2.activateBackendFromWorkspace = exports2.activateRunStateBackend = exports2.resolveRunStateBackend = exports2.GitRunStateStore = exports2.RUN_ID_PATTERN = exports2.FileRunStateStore = exports2.RunStateStore = exports2.harnessCapabilities = exports2.NO_HARNESS_CAPABILITIES = exports2.RunnerValidationError = exports2.validateRunnerExport = exports2.CustomRunnerLoader = exports2.buildClaudeSpawnEnv = exports2.hasClaudeLogin = exports2.isInsideClaudeCodeSession = exports2.createJsonSink = exports2.createLineSink = exports2.isCodexMcpConfigured = exports2.codexConfigPath = exports2.readProjectMcpServer = exports2.mcpRegistrarFor = exports2.codexMcpRegistrar = exports2.claudeMcpRegistrar = exports2.CodexRunner = exports2.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 = void 0;
33541
- exports2.PLANNING_MODEL = exports2.isBuiltinPreset = exports2.BUILTIN_PRESET_IDS = exports2.writeBuiltinAutoReviewValidators = exports2.resolvePrimaryStack = exports2.getSdlcArtifactTemplates = exports2.getBuiltinArtifactTemplates = exports2.phaseArtifactFileName = exports2.sdlcClaudeCommand = exports2.builtinClaudeCommand = exports2.loadAllBuiltinPresets = exports2.loadBuiltinPreset = exports2.planRecipeMigration = exports2.getBuiltinRecipeSummaries = exports2.getAllBuiltinPipelineSummaries = exports2.getSdlcBuiltinPipelineSummary = exports2.getBuiltinPipelineSummary = exports2.getBuiltinWorkflowByPipelineId = exports2.getBuiltinWorkflow = exports2.workflowSlug = exports2.builtinTemplatesRoot = exports2.pipelineCommandId = exports2.PHASES = exports2.BUILTIN_WORKFLOWS = exports2.withBackfilledStepNames = exports2.describeDrift = exports2.reconcileRunSteps = exports2.RUN_STATE_SCHEMA_VERSION = exports2.migrateRunState = exports2.stepIdentity = exports2.resolvePath = exports2.AutoReviewerError = exports2.runAutoReview = exports2.renderRunReport = exports2.verifyRun = exports2.runExecLoop = exports2.estimateCostUsd = exports2.providerAliases = exports2.ratesFromConfig = exports2.mergeRates = exports2.BUILTIN_RATES = exports2.checkBudget = exports2.weighStepProgress = exports2.isActiveStatus = exports2.isStepOptional = exports2.isRunComplete = exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = void 0;
33542
- exports2.setClaudeConfigDir = exports2.resolveDeclaredPath = exports2.expandHome = exports2.ProfileLoadError = exports2.UnknownStandardError = exports2.builtinProfiles = exports2.loadActiveProfile = exports2.loadProfile = exports2.listProfileManifests = exports2.resolveStandard = exports2.workspaceStandard = exports2.isBuiltinProfileId = exports2.ProfileSchema = exports2.TRACE_RULES = exports2.PROFILES_DIR = exports2.DEFAULT_PROFILE_ID = exports2.BUILTIN_PROFILE_IDS = exports2.setEpicMemoryHook = exports2.isEpicMemoryHookEnabled = exports2.installAnnotationTools = exports2.relativeEpicRoot = exports2.provisionDeclaredWorkflows = exports2.provisionWorkflowFiles = exports2.writeWorkflowArtifactTemplates = exports2.writeWorkflowCommands = exports2.provisionShortcutDocs = exports2.writeTwoLayerCommands = exports2.shortcutCommandDoc = exports2.backboneCommandDoc = exports2.unprovisionedPhases = exports2.nextEligiblePhase = exports2.resolveComposition = exports2.shortcutCommandId = exports2.getCanonicalPhase = exports2.isCanonicalPhase = exports2.BACKBONE_COMMAND_ID = exports2.CANONICAL_PHASE_IDS = exports2.CANONICAL_PHASES = exports2.renderTemplate = exports2.DEFAULT_GLOBAL_WORKFLOW_IDS = exports2.detectGlobalBuiltinSource = exports2.uninstallWorkflowGlobalsByIds = exports2.isWorkflowGloballyInstalled = exports2.installWorkflowGlobalsByIds = exports2.installGlobalDefaults = exports2.resolveProviderModel = exports2.isClaudeTierAlias = exports2.CLAUDE_TIER_ALIASES = exports2.FAST_MODEL = exports2.CODING_MODEL = void 0;
33543
- exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = exports2.remapClaudePath = exports2.claudeConfigEnv = exports2.claudeJsonPath = exports2.isDefaultClaudeConfigDir = exports2.claudeConfigDir = exports2.resolveClaudeConfigDir = exports2.defaultClaudeConfigDir = exports2.getClaudeConfigDirOverride = void 0;
33655
+ exports2.epicIdFromBranch = exports2.epicFocusFrom = exports2.RECENT_EPICS_LIMIT = exports2.RECENT_EPICS_KEY = exports2.PINNED_EPICS_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 = void 0;
33656
+ 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.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.setEpicPinned = exports2.setActiveEpic = exports2.recordEpicOpened = exports2.readEpicFocus = exports2.pushRecent = void 0;
33657
+ exports2.planRecipeMigration = exports2.getBuiltinRecipeSummaries = exports2.getAllBuiltinPipelineSummaries = exports2.getSdlcBuiltinPipelineSummary = exports2.getBuiltinPipelineSummary = exports2.getBuiltinWorkflowByPipelineId = exports2.getBuiltinWorkflow = exports2.workflowSlug = exports2.builtinTemplatesRoot = exports2.pipelineCommandId = exports2.PHASES = exports2.BUILTIN_WORKFLOWS = exports2.withBackfilledStepNames = exports2.describeDrift = exports2.reconcileRunSteps = exports2.RUN_STATE_SCHEMA_VERSION = exports2.migrateRunState = exports2.stepIdentity = exports2.resolvePath = exports2.AutoReviewerError = exports2.runAutoReview = exports2.renderRunReport = exports2.verifyRun = exports2.runExecLoop = exports2.estimateCostUsd = exports2.providerAliases = exports2.ratesFromConfig = exports2.mergeRates = exports2.BUILTIN_RATES = exports2.checkBudget = exports2.weighStepProgress = exports2.isActiveStatus = exports2.isStepOptional = exports2.isRunComplete = exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = exports2.chooseStepSkill = exports2.requestStepUpdate = exports2.rerunStep = exports2.rejectStep = exports2.approveStep = exports2.undoStepDone = exports2.canUndoStepDone = exports2.markStepDone = exports2.canStartStep = void 0;
33658
+ exports2.ProfileSchema = exports2.TRACE_RULES = exports2.PROFILES_DIR = exports2.DEFAULT_PROFILE_ID = exports2.BUILTIN_PROFILE_IDS = exports2.setEpicMemoryHook = exports2.isEpicMemoryHookEnabled = exports2.installAnnotationTools = exports2.relativeEpicRoot = exports2.provisionDeclaredWorkflows = exports2.provisionWorkflowFiles = exports2.writeWorkflowArtifactTemplates = exports2.writeWorkflowCommands = exports2.provisionShortcutDocs = exports2.writeTwoLayerCommands = exports2.shortcutCommandDoc = exports2.backboneCommandDoc = exports2.unprovisionedPhases = exports2.nextEligiblePhase = exports2.resolveComposition = exports2.shortcutCommandId = exports2.getCanonicalPhase = exports2.isCanonicalPhase = exports2.BACKBONE_COMMAND_ID = exports2.CANONICAL_PHASE_IDS = exports2.CANONICAL_PHASES = exports2.renderTemplate = exports2.DEFAULT_GLOBAL_WORKFLOW_IDS = exports2.detectGlobalBuiltinSource = exports2.uninstallWorkflowGlobalsByIds = exports2.isWorkflowGloballyInstalled = exports2.installWorkflowGlobalsByIds = exports2.installGlobalDefaults = exports2.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 = void 0;
33659
+ 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 = void 0;
33544
33660
  var WorkspaceSchema_1 = require_WorkspaceSchema();
33545
33661
  Object.defineProperty(exports2, "WorkspaceSchema", { enumerable: true, get: function() {
33546
33662
  return WorkspaceSchema_1.WorkspaceSchema;
@@ -33992,12 +34108,49 @@ var require_dist = __commonJS({
33992
34108
  Object.defineProperty(exports2, "readUserConfig", { enumerable: true, get: function() {
33993
34109
  return userConfig_1.readUserConfig;
33994
34110
  } });
34111
+ Object.defineProperty(exports2, "updateUserConfig", { enumerable: true, get: function() {
34112
+ return userConfig_1.updateUserConfig;
34113
+ } });
33995
34114
  Object.defineProperty(exports2, "userConfigPath", { enumerable: true, get: function() {
33996
34115
  return userConfig_1.userConfigPath;
33997
34116
  } });
33998
34117
  Object.defineProperty(exports2, "writeUserEpicIdPrefix", { enumerable: true, get: function() {
33999
34118
  return userConfig_1.writeUserEpicIdPrefix;
34000
34119
  } });
34120
+ var epicFocus_1 = require_epicFocus();
34121
+ Object.defineProperty(exports2, "ACTIVE_EPIC_KEY", { enumerable: true, get: function() {
34122
+ return epicFocus_1.ACTIVE_EPIC_KEY;
34123
+ } });
34124
+ Object.defineProperty(exports2, "PINNED_EPICS_KEY", { enumerable: true, get: function() {
34125
+ return epicFocus_1.PINNED_EPICS_KEY;
34126
+ } });
34127
+ Object.defineProperty(exports2, "RECENT_EPICS_KEY", { enumerable: true, get: function() {
34128
+ return epicFocus_1.RECENT_EPICS_KEY;
34129
+ } });
34130
+ Object.defineProperty(exports2, "RECENT_EPICS_LIMIT", { enumerable: true, get: function() {
34131
+ return epicFocus_1.RECENT_EPICS_LIMIT;
34132
+ } });
34133
+ Object.defineProperty(exports2, "epicFocusFrom", { enumerable: true, get: function() {
34134
+ return epicFocus_1.epicFocusFrom;
34135
+ } });
34136
+ Object.defineProperty(exports2, "epicIdFromBranch", { enumerable: true, get: function() {
34137
+ return epicFocus_1.epicIdFromBranch;
34138
+ } });
34139
+ Object.defineProperty(exports2, "pushRecent", { enumerable: true, get: function() {
34140
+ return epicFocus_1.pushRecent;
34141
+ } });
34142
+ Object.defineProperty(exports2, "readEpicFocus", { enumerable: true, get: function() {
34143
+ return epicFocus_1.readEpicFocus;
34144
+ } });
34145
+ Object.defineProperty(exports2, "recordEpicOpened", { enumerable: true, get: function() {
34146
+ return epicFocus_1.recordEpicOpened;
34147
+ } });
34148
+ Object.defineProperty(exports2, "setActiveEpic", { enumerable: true, get: function() {
34149
+ return epicFocus_1.setActiveEpic;
34150
+ } });
34151
+ Object.defineProperty(exports2, "setEpicPinned", { enumerable: true, get: function() {
34152
+ return epicFocus_1.setEpicPinned;
34153
+ } });
34001
34154
  var strictMode_1 = require_strictMode();
34002
34155
  Object.defineProperty(exports2, "STRICT_MODE_HEADING", { enumerable: true, get: function() {
34003
34156
  return strictMode_1.STRICT_MODE_HEADING;
@@ -43212,7 +43365,7 @@ var require_package = __commonJS({
43212
43365
  "package.json"(exports2, module2) {
43213
43366
  module2.exports = {
43214
43367
  name: "@delete101020/aidlc",
43215
- version: "4.0.26",
43368
+ version: "4.0.27",
43216
43369
  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.",
43217
43370
  license: "MIT",
43218
43371
  repository: {
@@ -50216,6 +50369,67 @@ ${plan.length} pipeline(s) would move. Re-run without --dry-run.`));
50216
50369
  });
50217
50370
  console.log((0, import_core19.suggestEpicId)(existing, prefix));
50218
50371
  });
50372
+ const requireKnownEpic = (root, id) => {
50373
+ const all = listEpics(root, readYaml(root)).map((e) => e.id);
50374
+ const hit = all.find((x) => x.toLowerCase() === id.toLowerCase());
50375
+ if (!hit) {
50376
+ console.error(import_chalk15.default.red(`Epic "${id}" not found.`));
50377
+ if (all.length > 0) {
50378
+ console.error(import_chalk15.default.dim(`Available: ${all.join(", ")}`));
50379
+ }
50380
+ process.exit(1);
50381
+ }
50382
+ return hit;
50383
+ };
50384
+ const noteIgnored = (root) => {
50385
+ if ((0, import_core19.ensureUserConfigIgnored)(root)) {
50386
+ console.log(import_chalk15.default.dim(` Added ${import_core19.USER_CONFIG_IGNORE_LINE} to .gitignore \u2014 it is yours, not the team's.`));
50387
+ }
50388
+ };
50389
+ cmd.command("current").description("Print the active epic id (from .aidlc/user.yaml); exits 1 when none is set").option("--json", "Print active, pinned and recent as JSON").action((opts, actionCmd) => {
50390
+ const root = resolveWorkspaceRoot(actionCmd);
50391
+ const focus = (0, import_core19.readEpicFocus)(root);
50392
+ if (opts.json) {
50393
+ console.log(JSON.stringify(focus, null, 2));
50394
+ return;
50395
+ }
50396
+ if (!focus.active) {
50397
+ process.exit(1);
50398
+ }
50399
+ console.log(focus.active);
50400
+ });
50401
+ cmd.command("use [id]").description("Make an epic the active one \u2014 what skills like /epic-context pick up when given no id").option("--clear", "unset the active epic").action((id, opts, actionCmd) => {
50402
+ const root = resolveWorkspaceRoot(actionCmd);
50403
+ if (opts.clear) {
50404
+ (0, import_core19.setActiveEpic)(root, null);
50405
+ console.log(import_chalk15.default.green("\u2714") + " No active epic.");
50406
+ return;
50407
+ }
50408
+ if (!id) {
50409
+ console.error(import_chalk15.default.red("Give an epic id, or --clear."));
50410
+ process.exit(1);
50411
+ }
50412
+ const epicId = requireKnownEpic(root, id);
50413
+ (0, import_core19.setActiveEpic)(root, epicId);
50414
+ console.log(import_chalk15.default.green("\u2714") + ` Active epic: ${import_chalk15.default.bold(epicId)}`);
50415
+ noteIgnored(root);
50416
+ });
50417
+ for (const [name, pinned] of [["pin", true], ["unpin", false]]) {
50418
+ cmd.command(`${name} [id]`).description(pinned ? "Pin an epic to the top of the sidebar and Go to Epic picker; bare `pin` lists pins" : "Unpin an epic").action((id, _opts, actionCmd) => {
50419
+ const root = resolveWorkspaceRoot(actionCmd);
50420
+ if (!id) {
50421
+ const list = (0, import_core19.readEpicFocus)(root).pinned;
50422
+ console.log(list.length > 0 ? import_chalk15.default.cyan(list.join(" ")) : import_chalk15.default.dim("(nothing pinned)"));
50423
+ return;
50424
+ }
50425
+ const epicId = pinned ? requireKnownEpic(root, id) : id;
50426
+ (0, import_core19.setEpicPinned)(root, epicId, pinned);
50427
+ console.log(import_chalk15.default.green("\u2714") + ` ${pinned ? "Pinned" : "Unpinned"} ${import_chalk15.default.bold(epicId)}`);
50428
+ if (pinned) {
50429
+ noteIgnored(root);
50430
+ }
50431
+ });
50432
+ }
50219
50433
  cmd.command("strict <epicId> [value]").description("Show or set an epic's depth of work (strict_mode in its state.json)").action((epicId, value, _opts, actionCmd) => {
50220
50434
  const root = resolveWorkspaceRoot(actionCmd);
50221
50435
  const doc = requireYaml(root);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delete101020/aidlc",
3
- "version": "4.0.26",
3
+ "version": "4.0.27",
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": {
@@ -36,11 +36,19 @@
36
36
  "README.md",
37
37
  "AUTOMATION.md"
38
38
  ],
39
+ "scripts": {
40
+ "compile": "tsc -p ./",
41
+ "build": "tsc -p ./",
42
+ "clean": "rm -rf dist",
43
+ "bundle": "esbuild src/index.ts --bundle --platform=node --target=node18 --outfile=dist/bundle.js --external:fsevents && rm -rf dist/templates && cp -R ../core/templates dist/templates && rm -rf dist/tools dist/vendor dist/assets && cp -R ../../tools dist/tools && node -e \"require('fs').mkdirSync('dist/vendor', { recursive: true })\" && cp -R ../../vendor/annotron dist/vendor/annotron && cp -R ../extension/assets dist/assets",
44
+ "prepublishOnly": "pnpm bundle"
45
+ },
39
46
  "publishConfig": {
40
47
  "access": "public",
41
48
  "registry": "https://registry.npmjs.org/"
42
49
  },
43
50
  "devDependencies": {
51
+ "@aidlc/core": "workspace:*",
44
52
  "@types/js-yaml": "^4.0.9",
45
53
  "@types/node": "^20.0.0",
46
54
  "chalk": "^4.1.2",
@@ -48,13 +56,6 @@
48
56
  "cli-table3": "^0.6.5",
49
57
  "commander": "^11.1.0",
50
58
  "esbuild": "^0.21.0",
51
- "js-yaml": "^4.1.1",
52
- "@aidlc/core": "0.0.1"
53
- },
54
- "scripts": {
55
- "compile": "tsc -p ./",
56
- "build": "tsc -p ./",
57
- "clean": "rm -rf dist",
58
- "bundle": "esbuild src/index.ts --bundle --platform=node --target=node18 --outfile=dist/bundle.js --external:fsevents && rm -rf dist/templates && cp -R ../core/templates dist/templates && rm -rf dist/tools dist/vendor dist/assets && cp -R ../../tools dist/tools && node -e \"require('fs').mkdirSync('dist/vendor', { recursive: true })\" && cp -R ../../vendor/annotron dist/vendor/annotron && cp -R ../extension/assets dist/assets"
59
+ "js-yaml": "^4.1.1"
59
60
  }
60
- }
61
+ }