substrate-ai 0.20.147 → 0.20.148

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.
@@ -0,0 +1,4 @@
1
+ import { AdapterRegistry } from "./dist-CZk5SeSt.js";
2
+ import "./adapter-registry-DIcrxjH8.js";
3
+
4
+ export { AdapterRegistry };
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
- import { FileKvStore, SUBSTRATE_OWNED_SETTINGS_KEYS, VALID_PHASES, buildPipelineStatusOutput, createDatabaseAdapter, createDoltOperatorReader, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, parseDbTimestampAsUtc, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion } from "../health-nQ_Txd5T.js";
2
+ import { FileKvStore, SUBSTRATE_OWNED_SETTINGS_KEYS, VALID_PHASES, buildPipelineStatusOutput, createDatabaseAdapter, createDoltOperatorReader, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, parseDbTimestampAsUtc, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion } from "../health-Aqc5cghP.js";
3
3
  import { createLogger } from "../logger-KeHncl-f.js";
4
4
  import { createEventBus } from "../helpers-CElYrONe.js";
5
- import { AdapterRegistry, BudgetConfigSchema, CURRENT_CONFIG_FORMAT_VERSION, CURRENT_TASK_GRAPH_VERSION, ConfigError, CostTrackerConfigSchema, DEFAULT_CONFIG, DoltClient, DoltNotInstalled, GlobalSettingsSchema, InMemoryDatabaseAdapter, IngestionServer, MonitorDatabaseImpl, OPERATIONAL_FINDING, PartialGlobalSettingsSchema, PartialProviderConfigSchema, ProvidersSchema, RoutingRecommender, STORY_METRICS, TelemetryConfigSchema, addTokenUsage, aggregateTokenUsageForRun, checkDoltInstalled, compareRunMetrics, createAmendmentRun, createConfigSystem, createDecision, createPipelineRun, createStderrLogger, getActiveDecisions, getAllCostEntriesFiltered, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initWorkGraphSchema, initializeDolt, listRunMetrics, loadParentRunDecisions, supersedeDecision, swallowDebug, tagRunAsBaseline, updatePipelineRun } from "../dist-DT378h1M.js";
6
- import { AdapterTelemetryPersistence, AppError, DoltRepoMapMetaRepository, DoltSymbolRepository, ERR_REPO_MAP_STORAGE_WRITE, EpicIngester, GLOBSTAR, GitClient, GrammarLoader, Minimatch, Minipass, RepoMapInjector, RepoMapModule, RepoMapQueryEngine, RepoMapStorage, SymbolParser, createContextCompiler, createDispatcher, createEventEmitter, createGitWorktreeManager, createImplementationOrchestrator, createPackLoader, createPhaseOrchestrator, createStopAfterGate, createTelemetryAdvisor, escape, formatPhaseCompletionSummary, getFactoryRunSummaries, getScenarioResultsForRun, getTwinRunsForRun, listGraphRuns, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runSolutioningPhase, unescape, validateStopAfterFromConflict } from "../run-BBVZdkEo.js";
5
+ import { AdapterRegistry, BudgetConfigSchema, CURRENT_CONFIG_FORMAT_VERSION, CURRENT_TASK_GRAPH_VERSION, ConfigError, CostTrackerConfigSchema, DEFAULT_CONFIG, DoltClient, DoltNotInstalled, GlobalSettingsSchema, InMemoryDatabaseAdapter, IngestionServer, MonitorDatabaseImpl, OPERATIONAL_FINDING, PartialGlobalSettingsSchema, PartialProviderConfigSchema, ProvidersSchema, RoutingRecommender, STORY_METRICS, TelemetryConfigSchema, addTokenUsage, aggregateTokenUsageForRun, checkDoltInstalled, compareRunMetrics, createAmendmentRun, createConfigSystem, createDecision, createPipelineRun, createStderrLogger, getActiveDecisions, getAllCostEntriesFiltered, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initWorkGraphSchema, initializeDolt, listRunMetrics, loadParentRunDecisions, supersedeDecision, swallowDebug, tagRunAsBaseline, updatePipelineRun } from "../dist-CZk5SeSt.js";
6
+ import { AdapterTelemetryPersistence, AppError, DoltRepoMapMetaRepository, DoltSymbolRepository, ERR_REPO_MAP_STORAGE_WRITE, EpicIngester, GLOBSTAR, GitClient, GrammarLoader, Minimatch, Minipass, RepoMapInjector, RepoMapModule, RepoMapQueryEngine, RepoMapStorage, SymbolParser, createContextCompiler, createDispatcher, createEventEmitter, createGitWorktreeManager, createImplementationOrchestrator, createPackLoader, createPhaseOrchestrator, createStopAfterGate, createTelemetryAdvisor, escape, formatPhaseCompletionSummary, getFactoryRunSummaries, getScenarioResultsForRun, getTwinRunsForRun, listGraphRuns, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runSolutioningPhase, unescape, validateStopAfterFromConflict } from "../run-B9DV9sro.js";
7
7
  import "../adapter-registry-DIcrxjH8.js";
8
- import { RunManifest, SupervisorLock, ZERO_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, aggregateProbeAuthorMetrics, parseRuntimeProbes, readCurrentRunId, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, rollupFindingsByAuthor, rollupProbeAuthorByClass, rollupProbeAuthorMetrics, runAcTraceabilityCheck } from "../manifest-read-DlWwZpfO.js";
9
- import "../errors-BGE3kaH8.js";
8
+ import { RunManifest, SupervisorLock, ZERO_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, aggregateProbeAuthorMetrics, parseRuntimeProbes, readCurrentRunId, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, rollupFindingsByAuthor, rollupProbeAuthorByClass, rollupProbeAuthorMetrics, runAcTraceabilityCheck } from "../manifest-read-D6NAZgt8.js";
9
+ import "../errors-_tbIg6Cv.js";
10
10
  import "../routing-DFxoKHDt.js";
11
11
  import { WorkGraphRepository } from "../work-graph-repository-DZyJv5pV.js";
12
12
  import "../decisions-CzSIEeGP.js";
13
13
  import "../decision-router-BAPpON_C.js";
14
- import "../interactive-prompt-xJ3K-IUQ.js";
14
+ import "../interactive-prompt-BLkX0iE_.js";
15
15
  import "../recovery-engine-BKGBeBnW.js";
16
16
  import "../version-manager-impl-qFBiO4Eh.js";
17
- import { registerUpgradeCommand } from "../upgrade-BVHnUYUd.js";
17
+ import { registerUpgradeCommand } from "../upgrade-BEfZJU4K.js";
18
18
  import { Command } from "commander";
19
19
  import { fileURLToPath } from "url";
20
20
  import { dirname, join, resolve } from "path";
@@ -624,11 +624,15 @@ const SubstrateConfigSchema = z.object({
624
624
  supervisor_poll_interval_seconds: z.number().int().positive().optional(),
625
625
  retry_budget: z.number().int().positive().optional(),
626
626
  epics_path: z.string().optional(),
627
- finalization: z.object({ mode: z.enum([
628
- "merge",
629
- "branch",
630
- "pr"
631
- ]).optional() }).strict().optional()
627
+ finalization: z.object({
628
+ mode: z.enum([
629
+ "merge",
630
+ "branch",
631
+ "pr"
632
+ ]).optional(),
633
+ merge_strategy: z.enum(["ff-only", "three-way"]).optional(),
634
+ epic_gate_command: z.string().optional()
635
+ }).strict().optional()
632
636
  }).strict();
633
637
  const PartialSubstrateConfigSchema = z.object({
634
638
  config_format_version: z.enum(["1"]).optional(),
@@ -648,11 +652,15 @@ const PartialSubstrateConfigSchema = z.object({
648
652
  supervisor_poll_interval_seconds: z.number().int().positive().optional(),
649
653
  retry_budget: z.number().int().positive().optional(),
650
654
  epics_path: z.string().optional(),
651
- finalization: z.object({ mode: z.enum([
652
- "merge",
653
- "branch",
654
- "pr"
655
- ]).optional() }).strict().optional()
655
+ finalization: z.object({
656
+ mode: z.enum([
657
+ "merge",
658
+ "branch",
659
+ "pr"
660
+ ]).optional(),
661
+ merge_strategy: z.enum(["ff-only", "three-way"]).optional(),
662
+ epic_gate_command: z.string().optional()
663
+ }).strict().optional()
656
664
  }).strict();
657
665
 
658
666
  //#endregion
@@ -7062,7 +7070,7 @@ async function runStatusAction(options) {
7062
7070
  logger$15.debug({ err }, "Work graph query failed, continuing without work graph data");
7063
7071
  }
7064
7072
  if (run === void 0) {
7065
- const { inspectProcessTree: inspectProcessTree$1 } = await import("../health-BJoVPIyR.js");
7073
+ const { inspectProcessTree: inspectProcessTree$1 } = await import("../health-Cm0aQCQL.js");
7066
7074
  const substrateDirPath = join(projectRoot, ".substrate");
7067
7075
  const processInfo = inspectProcessTree$1({
7068
7076
  projectRoot,
@@ -8010,7 +8018,7 @@ function defaultSupervisorDeps() {
8010
8018
  if (cached === null) {
8011
8019
  const { AdapterRegistry: AR } = await import(
8012
8020
  /* @vite-ignore */
8013
- "../adapter-registry-SL7-DtOW.js"
8021
+ "../adapter-registry-hLwwiJGM.js"
8014
8022
  );
8015
8023
  cached = new AR();
8016
8024
  await cached.discoverAndRegister();
@@ -8577,11 +8585,11 @@ async function runSupervisorAction(options, deps = {}) {
8577
8585
  try {
8578
8586
  const { createExperimenter } = await import(
8579
8587
  /* @vite-ignore */
8580
- "../experimenter-COLnRT8i.js"
8588
+ "../experimenter-RnaEiLUD.js"
8581
8589
  );
8582
8590
  const { getLatestRun: getLatest } = await import(
8583
8591
  /* @vite-ignore */
8584
- "../decisions-qFnqErZ5.js"
8592
+ "../decisions-DSDqOEN4.js"
8585
8593
  );
8586
8594
  const expAdapter = createDatabaseAdapter({
8587
8595
  backend: "auto",
@@ -8591,7 +8599,7 @@ async function runSupervisorAction(options, deps = {}) {
8591
8599
  await initSchema(expAdapter);
8592
8600
  const { runRunAction: runPipeline } = await import(
8593
8601
  /* @vite-ignore */
8594
- "../run-D3mhgkIL.js"
8602
+ "../run-BX-__EJm.js"
8595
8603
  );
8596
8604
  const runStoryFn = async (opts) => {
8597
8605
  const exitCode = await runPipeline({
@@ -9116,7 +9124,7 @@ async function runMetricsAction(options) {
9116
9124
  const routingConfigPath = join(dbDir, "routing.yml");
9117
9125
  let routingConfig = null;
9118
9126
  if (existsSync$1(routingConfigPath)) try {
9119
- const { loadModelRoutingConfig } = await import("../routing-Dz4GQta5.js");
9127
+ const { loadModelRoutingConfig } = await import("../routing-QBUaShFv.js");
9120
9128
  routingConfig = loadModelRoutingConfig(routingConfigPath);
9121
9129
  } catch {}
9122
9130
  if (routingConfig === null) routingConfig = {
@@ -13442,8 +13450,8 @@ async function createProgram() {
13442
13450
  /** Fire-and-forget startup version check (story 8.3, AC3/AC5) */
13443
13451
  function checkForUpdatesInBackground(currentVersion) {
13444
13452
  if (process.env.SUBSTRATE_NO_UPDATE_CHECK === "1") return;
13445
- import("../upgrade-V0xYGkQs.js").then(async () => {
13446
- const { createVersionManager } = await import("../version-manager-impl-BWqvme_f.js");
13453
+ import("../upgrade-emlrK3YW.js").then(async () => {
13454
+ const { createVersionManager } = await import("../version-manager-impl-_x1n4xZk.js");
13447
13455
  const vm = createVersionManager();
13448
13456
  const result = await vm.checkForUpdates();
13449
13457
  if (result.updateAvailable) {
@@ -1,4 +1,4 @@
1
- import { addTokenUsage, createDecision, createPipelineRun, createRequirement, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunningPipelineRuns, getTokenUsageSummary, listRequirements, registerArtifact, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision } from "./dist-DT378h1M.js";
1
+ import { addTokenUsage, createDecision, createPipelineRun, createRequirement, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunningPipelineRuns, getTokenUsageSummary, listRequirements, registerArtifact, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision } from "./dist-CZk5SeSt.js";
2
2
  import "./decisions-CzSIEeGP.js";
3
3
 
4
4
  export { getLatestRun };
@@ -6252,11 +6252,15 @@ const SubstrateConfigSchema = z.object({
6252
6252
  telemetry: TelemetryConfigSchema.optional(),
6253
6253
  worktree: WorktreeConfigSchema.optional(),
6254
6254
  trivialOutputThreshold: z.number().int().nonnegative().optional(),
6255
- finalization: z.object({ mode: z.enum([
6256
- "merge",
6257
- "branch",
6258
- "pr"
6259
- ]).optional() }).strict().optional()
6255
+ finalization: z.object({
6256
+ mode: z.enum([
6257
+ "merge",
6258
+ "branch",
6259
+ "pr"
6260
+ ]).optional(),
6261
+ merge_strategy: z.enum(["ff-only", "three-way"]).optional(),
6262
+ epic_gate_command: z.string().optional()
6263
+ }).strict().optional()
6260
6264
  }).passthrough();
6261
6265
  const PartialProviderConfigSchema = ProviderConfigSchema.partial();
6262
6266
  const PartialGlobalSettingsSchema = GlobalSettingsSchema.partial();
@@ -6274,11 +6278,15 @@ const PartialSubstrateConfigSchema = z.object({
6274
6278
  telemetry: TelemetryConfigSchema.partial().optional(),
6275
6279
  worktree: WorktreeConfigSchema.partial().optional(),
6276
6280
  trivialOutputThreshold: z.number().int().nonnegative().optional(),
6277
- finalization: z.object({ mode: z.enum([
6278
- "merge",
6279
- "branch",
6280
- "pr"
6281
- ]).optional() }).strict().optional()
6281
+ finalization: z.object({
6282
+ mode: z.enum([
6283
+ "merge",
6284
+ "branch",
6285
+ "pr"
6286
+ ]).optional(),
6287
+ merge_strategy: z.enum(["ff-only", "three-way"]).optional(),
6288
+ epic_gate_command: z.string().optional()
6289
+ }).strict().optional()
6282
6290
  }).passthrough();
6283
6291
 
6284
6292
  //#endregion
@@ -11646,4 +11654,4 @@ async function callLLM(params) {
11646
11654
 
11647
11655
  //#endregion
11648
11656
  export { ADVISORY_NOTES, AdapterRegistry, AdtError, BudgetConfigSchema, CLAUDE_AUTH_FAILURE_HINT, CODEX_SANDBOX_BLOCK_HINT, CURRENT_CONFIG_FORMAT_VERSION, CURRENT_TASK_GRAPH_VERSION, Categorizer, ClaudeCodeAdapter, CodexCLIAdapter, ConfigError, ConfigIncompatibleFormatError, ConsumerAnalyzer, CostTrackerConfigSchema, DEFAULT_CONFIG, DEFAULT_GLOBAL_SETTINGS, DispatcherImpl, DoltClient, DoltNotInstalled, DoltQueryError, ESCALATION_DIAGNOSIS, EXPERIMENT_RESULT, EfficiencyScorer, GeminiCLIAdapter, GlobalSettingsSchema, InMemoryDatabaseAdapter, IngestionServer, LEARNING_FINDING, LogTurnAnalyzer, ModelRoutingConfigSchema, MonitorDatabaseImpl, OPERATIONAL_FINDING, PartialGlobalSettingsSchema, PartialProviderConfigSchema, ProviderPolicySchema, ProvidersSchema, Recommender, RoutingConfigError, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, STORY_METRICS, STORY_OUTCOME, SubstrateConfigSchema, TASK_TYPE_PHASE_MAP, TEST_EXPANSION_FINDING, TEST_PLAN, TelemetryConfigSchema, TelemetryNormalizer, TelemetryPipeline, TurnAnalyzer, VersionManagerImpl, addTokenUsage, aggregateTokenUsageForRun, aggregateTokenUsageForStory, buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, callLLM, checkDoltInstalled, classifyVersionGap, compareRunMetrics, createAmendmentRun, createConfigSystem, createDatabaseAdapter as createDatabaseAdapter$1, createDecision, createExperimenter, createPipelineRun, createRequirement, createStderrLogger, createVersionManager, detectClaudeAuthFailure, detectCodexSandboxBlock, detectInterfaceChanges, determineVerdict, getActiveDecisions, getAllCostEntriesFiltered, getArtifactByTypeForRun, getArtifactsByRun, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getModelTier, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initWorkGraphSchema, initializeDolt, listRequirements, listRunMetrics, loadModelRoutingConfig, loadParentRunDecisions, registerArtifact, resolvePromptFile, supersedeDecision, swallowDebug, tagRunAsBaseline, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics };
11649
- //# sourceMappingURL=dist-DT378h1M.js.map
11657
+ //# sourceMappingURL=dist-CZk5SeSt.js.map
@@ -1,4 +1,4 @@
1
- import { AdtError } from "./dist-DT378h1M.js";
1
+ import { AdtError } from "./dist-CZk5SeSt.js";
2
2
 
3
3
  //#region src/core/errors.ts
4
4
  /** Error thrown when task configuration is invalid */
@@ -71,4 +71,4 @@ var TaskGraphIncompatibleFormatError = class extends AdtError {
71
71
 
72
72
  //#endregion
73
73
  export { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError };
74
- //# sourceMappingURL=errors-BGE3kaH8.js.map
74
+ //# sourceMappingURL=errors-_tbIg6Cv.js.map
@@ -1,3 +1,3 @@
1
- import { buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, createExperimenter, determineVerdict, resolvePromptFile } from "./dist-DT378h1M.js";
1
+ import { buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, createExperimenter, determineVerdict, resolvePromptFile } from "./dist-CZk5SeSt.js";
2
2
 
3
3
  export { createExperimenter };
@@ -1,6 +1,6 @@
1
1
  import { createLogger } from "./logger-KeHncl-f.js";
2
- import { DoltClient, DoltQueryError, createDatabaseAdapter$1 as createDatabaseAdapter, getLatestRun, getPipelineRunById, initSchema } from "./dist-DT378h1M.js";
3
- import { resolveMainRepoRoot, resolveRunManifest } from "./manifest-read-DlWwZpfO.js";
2
+ import { DoltClient, DoltQueryError, createDatabaseAdapter$1 as createDatabaseAdapter, getLatestRun, getPipelineRunById, initSchema } from "./dist-CZk5SeSt.js";
3
+ import { resolveMainRepoRoot, resolveRunManifest } from "./manifest-read-D6NAZgt8.js";
4
4
  import { createRequire } from "module";
5
5
  import { dirname, join } from "path";
6
6
  import { existsSync, readFileSync } from "node:fs";
@@ -1000,4 +1000,4 @@ function registerHealthCommand(program, _version = "0.0.0", projectRoot = proces
1000
1000
 
1001
1001
  //#endregion
1002
1002
  export { BMAD_BASELINE_TOKENS_FULL, DEFAULT_STALL_THRESHOLD_SECONDS, FileKvStore, STOP_AFTER_VALID_PHASES, STORY_KEY_PATTERN, SUBSTRATE_OWNED_SETTINGS_KEYS, VALID_PHASES, __commonJS, __require, __toESM, buildPipelineStatusOutput, createDatabaseAdapter$1 as createDatabaseAdapter, createDoltOperatorReader, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, isOrchestratorProcessLine, parseDbTimestampAsUtc, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion, runHealthAction, validateStoryKey };
1003
- //# sourceMappingURL=health-nQ_Txd5T.js.map
1003
+ //# sourceMappingURL=health-Aqc5cghP.js.map
@@ -1,7 +1,7 @@
1
- import { DEFAULT_STALL_THRESHOLD_SECONDS, getAllDescendantPids, getAutoHealthData, inspectProcessTree, isOrchestratorProcessLine, registerHealthCommand, runHealthAction } from "./health-nQ_Txd5T.js";
1
+ import { DEFAULT_STALL_THRESHOLD_SECONDS, getAllDescendantPids, getAutoHealthData, inspectProcessTree, isOrchestratorProcessLine, registerHealthCommand, runHealthAction } from "./health-Aqc5cghP.js";
2
2
  import "./logger-KeHncl-f.js";
3
- import "./dist-DT378h1M.js";
4
- import "./manifest-read-DlWwZpfO.js";
3
+ import "./dist-CZk5SeSt.js";
4
+ import "./manifest-read-D6NAZgt8.js";
5
5
  import "./work-graph-repository-DZyJv5pV.js";
6
6
  import "./decisions-CzSIEeGP.js";
7
7
 
@@ -298,6 +298,11 @@ declare const SubstrateConfigSchema: z.ZodObject<{
298
298
  branch: "branch";
299
299
  pr: "pr";
300
300
  }>>;
301
+ merge_strategy: z.ZodOptional<z.ZodEnum<{
302
+ "ff-only": "ff-only";
303
+ "three-way": "three-way";
304
+ }>>;
305
+ epic_gate_command: z.ZodOptional<z.ZodString>;
301
306
  }, z.core.$strict>>;
302
307
  }, z.core.$loose>;
303
308
  type SubstrateConfig = z.infer<typeof SubstrateConfigSchema>; //#endregion
@@ -1591,4 +1596,4 @@ interface Recommendation {
1591
1596
 
1592
1597
  //#endregion
1593
1598
  export { AdapterDiscoveryResult, AdapterRegistry as AdapterRegistry$1, AdtError as AdtError$1, ClaudeCodeAdapter as ClaudeCodeAdapter$1, CodexCLIAdapter as CodexCLIAdapter$1, ConfigError as ConfigError$1, ConfigIncompatibleFormatError as ConfigIncompatibleFormatError$1, CoreEvents, DatabaseAdapter, DiscoveryReport, GeminiCLIAdapter as GeminiCLIAdapter$1, Recommendation, TypedEventBus };
1594
- //# sourceMappingURL=index-DaBYDiWn.d.ts.map
1599
+ //# sourceMappingURL=index-CvNLhgKV.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AdapterDiscoveryResult, AdapterRegistry$1 as AdapterRegistry, AdtError$1 as AdtError, ClaudeCodeAdapter$1 as ClaudeCodeAdapter, CodexCLIAdapter$1 as CodexCLIAdapter, ConfigError$1 as ConfigError, ConfigIncompatibleFormatError$1 as ConfigIncompatibleFormatError, DiscoveryReport, GeminiCLIAdapter$1 as GeminiCLIAdapter, Recommendation, TypedEventBus } from "./index-DaBYDiWn.js";
1
+ import { AdapterDiscoveryResult, AdapterRegistry$1 as AdapterRegistry, AdtError$1 as AdtError, ClaudeCodeAdapter$1 as ClaudeCodeAdapter, CodexCLIAdapter$1 as CodexCLIAdapter, ConfigError$1 as ConfigError, ConfigIncompatibleFormatError$1 as ConfigIncompatibleFormatError, DiscoveryReport, GeminiCLIAdapter$1 as GeminiCLIAdapter, Recommendation, TypedEventBus } from "./index-CvNLhgKV.js";
2
2
  import pino from "pino";
3
3
  import { z } from "zod";
4
4
  import { Readable, Writable } from "node:stream";
@@ -1074,6 +1074,11 @@ declare const SubstrateConfigSchema: z.ZodObject<{
1074
1074
  branch: "branch";
1075
1075
  pr: "pr";
1076
1076
  }>>;
1077
+ merge_strategy: z.ZodOptional<z.ZodEnum<{
1078
+ "ff-only": "ff-only";
1079
+ "three-way": "three-way";
1080
+ }>>;
1081
+ epic_gate_command: z.ZodOptional<z.ZodString>;
1077
1082
  }, z.core.$strict>>;
1078
1083
  }, z.core.$strict>;
1079
1084
  type SubstrateConfig = z.infer<typeof SubstrateConfigSchema>;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { childLogger, createLogger, logger } from "./logger-KeHncl-f.js";
2
2
  import { assertDefined, createEventBus, createTuiApp, deepClone, formatDuration, generateId, isPlainObject, isTuiCapable, printNonTtyWarning, sleep, withRetry } from "./helpers-CElYrONe.js";
3
- import { AdapterRegistry, AdtError, ClaudeCodeAdapter, CodexCLIAdapter, ConfigError, ConfigIncompatibleFormatError, GeminiCLIAdapter } from "./dist-DT378h1M.js";
3
+ import { AdapterRegistry, AdtError, ClaudeCodeAdapter, CodexCLIAdapter, ConfigError, ConfigIncompatibleFormatError, GeminiCLIAdapter } from "./dist-CZk5SeSt.js";
4
4
  import "./adapter-registry-DIcrxjH8.js";
5
- import { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError } from "./errors-BGE3kaH8.js";
5
+ import { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError } from "./errors-_tbIg6Cv.js";
6
6
 
7
7
  //#region src/core/di.ts
8
8
  /**
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from "./logger-KeHncl-f.js";
2
- import { readCurrentRunId, resolveMainRepoRoot } from "./manifest-read-DlWwZpfO.js";
2
+ import { readCurrentRunId, resolveMainRepoRoot } from "./manifest-read-D6NAZgt8.js";
3
3
  import { join } from "node:path";
4
4
  import { mkdir, readFile, writeFile } from "node:fs/promises";
5
5
  import * as readline from "node:readline";
@@ -180,4 +180,4 @@ async function runInteractivePrompt(decisionContext) {
180
180
 
181
181
  //#endregion
182
182
  export { runInteractivePrompt };
183
- //# sourceMappingURL=interactive-prompt-xJ3K-IUQ.js.map
183
+ //# sourceMappingURL=interactive-prompt-BLkX0iE_.js.map
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from "./logger-KeHncl-f.js";
2
- import { LEARNING_FINDING, createDecision, getDecisionsByCategory } from "./dist-DT378h1M.js";
2
+ import { LEARNING_FINDING, createDecision, getDecisionsByCategory } from "./dist-CZk5SeSt.js";
3
3
  import * as path$1 from "path";
4
4
  import { join } from "path";
5
5
  import { readFile } from "fs/promises";
@@ -6300,4 +6300,4 @@ async function resolveRunManifest(dbRoot, runId) {
6300
6300
 
6301
6301
  //#endregion
6302
6302
  export { FindingsInjector, RunManifest, RuntimeProbeListSchema, SupervisorLock, ZERO_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, aggregateProbeAuthorMetrics, applyConfigToGraph, createDefaultVerificationPipeline, createGraphOrchestrator, createSdlcCodeReviewHandler, createSdlcCreateStoryHandler, createSdlcDevStoryHandler, createSdlcPhaseHandler, detectsEventDrivenAC, detectsStateIntegratingAC, extractTargetFilesFromStoryContent, parseRuntimeProbes, readCurrentRunId, renderFindings, resolveGraphPath, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, rollupFindingsByAuthor, rollupProbeAuthorByClass, rollupProbeAuthorMetrics, runAcTraceabilityCheck, runStaleVerificationRecovery };
6303
- //# sourceMappingURL=manifest-read-DlWwZpfO.js.map
6303
+ //# sourceMappingURL=manifest-read-D6NAZgt8.js.map
@@ -1,6 +1,6 @@
1
1
  import "../../logger-KeHncl-f.js";
2
- import "../../dist-DT378h1M.js";
3
- import "../../manifest-read-DlWwZpfO.js";
4
- import { runInteractivePrompt } from "../../interactive-prompt-xJ3K-IUQ.js";
2
+ import "../../dist-CZk5SeSt.js";
3
+ import "../../manifest-read-D6NAZgt8.js";
4
+ import { runInteractivePrompt } from "../../interactive-prompt-BLkX0iE_.js";
5
5
 
6
6
  export { runInteractivePrompt };
@@ -1,4 +1,4 @@
1
- import { ModelRoutingConfigSchema, ProviderPolicySchema, RoutingConfigError, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, TASK_TYPE_PHASE_MAP, getModelTier, loadModelRoutingConfig } from "./dist-DT378h1M.js";
1
+ import { ModelRoutingConfigSchema, ProviderPolicySchema, RoutingConfigError, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, TASK_TYPE_PHASE_MAP, getModelTier, loadModelRoutingConfig } from "./dist-CZk5SeSt.js";
2
2
  import "./routing-DFxoKHDt.js";
3
3
 
4
4
  export { loadModelRoutingConfig };
@@ -1,11 +1,11 @@
1
- import { BMAD_BASELINE_TOKENS_FULL, FileKvStore, STOP_AFTER_VALID_PHASES, STORY_KEY_PATTERN, VALID_PHASES, __commonJS, __require, __toESM, buildPipelineStatusOutput, createDatabaseAdapter, formatOutput, formatPipelineSummary, formatTokenTelemetry, inspectProcessTree, parseDbTimestampAsUtc, validateStoryKey } from "./health-nQ_Txd5T.js";
1
+ import { BMAD_BASELINE_TOKENS_FULL, FileKvStore, STOP_AFTER_VALID_PHASES, STORY_KEY_PATTERN, VALID_PHASES, __commonJS, __require, __toESM, buildPipelineStatusOutput, createDatabaseAdapter, formatOutput, formatPipelineSummary, formatTokenTelemetry, inspectProcessTree, parseDbTimestampAsUtc, validateStoryKey } from "./health-Aqc5cghP.js";
2
2
  import { createLogger } from "./logger-KeHncl-f.js";
3
3
  import { TypedEventBusImpl, createEventBus, createTuiApp, isTuiCapable, printNonTtyWarning, sleep } from "./helpers-CElYrONe.js";
4
- import { ADVISORY_NOTES, CLAUDE_AUTH_FAILURE_HINT, CODEX_SANDBOX_BLOCK_HINT, Categorizer, ConsumerAnalyzer, DEFAULT_GLOBAL_SETTINGS, DispatcherImpl, DoltClient, ESCALATION_DIAGNOSIS, EXPERIMENT_RESULT, EfficiencyScorer, IngestionServer, LogTurnAnalyzer, OPERATIONAL_FINDING, Recommender, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, STORY_METRICS, STORY_OUTCOME, SubstrateConfigSchema, TEST_EXPANSION_FINDING, TEST_PLAN, TelemetryNormalizer, TelemetryPipeline, TurnAnalyzer, addTokenUsage, aggregateTokenUsageForRun, aggregateTokenUsageForStory, callLLM, classifyVersionGap, createConfigSystem, createDatabaseAdapter$1, createDecision, createPipelineRun, createRequirement, createStderrLogger, detectClaudeAuthFailure, detectCodexSandboxBlock, detectInterfaceChanges, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunMetrics, getRunningPipelineRuns, getStoryMetricsForRun, getTokenUsageSummary, initSchema, listRequirements, loadModelRoutingConfig, registerArtifact, swallowDebug, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics } from "./dist-DT378h1M.js";
5
- import { FindingsInjector, RunManifest, RuntimeProbeListSchema, applyConfigToGraph, createDefaultVerificationPipeline, createGraphOrchestrator, createSdlcCodeReviewHandler, createSdlcCreateStoryHandler, createSdlcDevStoryHandler, createSdlcPhaseHandler, detectsEventDrivenAC, detectsStateIntegratingAC, extractTargetFilesFromStoryContent, parseRuntimeProbes, renderFindings, resolveGraphPath, resolveMainRepoRoot, runAcTraceabilityCheck, runStaleVerificationRecovery } from "./manifest-read-DlWwZpfO.js";
4
+ import { ADVISORY_NOTES, CLAUDE_AUTH_FAILURE_HINT, CODEX_SANDBOX_BLOCK_HINT, Categorizer, ConsumerAnalyzer, DEFAULT_GLOBAL_SETTINGS, DispatcherImpl, DoltClient, ESCALATION_DIAGNOSIS, EXPERIMENT_RESULT, EfficiencyScorer, IngestionServer, LogTurnAnalyzer, OPERATIONAL_FINDING, Recommender, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, STORY_METRICS, STORY_OUTCOME, SubstrateConfigSchema, TEST_EXPANSION_FINDING, TEST_PLAN, TelemetryNormalizer, TelemetryPipeline, TurnAnalyzer, addTokenUsage, aggregateTokenUsageForRun, aggregateTokenUsageForStory, callLLM, classifyVersionGap, createConfigSystem, createDatabaseAdapter$1, createDecision, createPipelineRun, createRequirement, createStderrLogger, detectClaudeAuthFailure, detectCodexSandboxBlock, detectInterfaceChanges, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunMetrics, getRunningPipelineRuns, getStoryMetricsForRun, getTokenUsageSummary, initSchema, listRequirements, loadModelRoutingConfig, registerArtifact, swallowDebug, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics } from "./dist-CZk5SeSt.js";
5
+ import { FindingsInjector, RunManifest, RuntimeProbeListSchema, applyConfigToGraph, createDefaultVerificationPipeline, createGraphOrchestrator, createSdlcCodeReviewHandler, createSdlcCreateStoryHandler, createSdlcDevStoryHandler, createSdlcPhaseHandler, detectsEventDrivenAC, detectsStateIntegratingAC, extractTargetFilesFromStoryContent, parseRuntimeProbes, renderFindings, resolveGraphPath, resolveMainRepoRoot, runAcTraceabilityCheck, runStaleVerificationRecovery } from "./manifest-read-D6NAZgt8.js";
6
6
  import { WorkGraphRepository, detectCycles } from "./work-graph-repository-DZyJv5pV.js";
7
7
  import { deriveExitCode, routeDecision } from "./decision-router-BAPpON_C.js";
8
- import { runInteractivePrompt } from "./interactive-prompt-xJ3K-IUQ.js";
8
+ import { runInteractivePrompt } from "./interactive-prompt-BLkX0iE_.js";
9
9
  import { runRecoveryEngine } from "./recovery-engine-BKGBeBnW.js";
10
10
  import { basename, dirname, extname, join } from "path";
11
11
  import { access, readFile, readdir, stat } from "fs/promises";
@@ -9606,11 +9606,26 @@ const logger$16 = createLogger("compiled-workflows:merge-to-main");
9606
9606
  */
9607
9607
  async function runMergeToMain(params) {
9608
9608
  const { storyKey, branchName, startBranch, worktreeManager, eventBus, projectRoot } = params;
9609
+ const mergeStrategy = params.mergeStrategy ?? "ff-only";
9609
9610
  logger$16.info({
9610
9611
  storyKey,
9611
9612
  branchName,
9612
- startBranch
9613
+ startBranch,
9614
+ mergeStrategy
9613
9615
  }, "Starting merge-to-main phase");
9616
+ const dirtiedFiles = listParentDirtyIntersection(branchName, startBranch, projectRoot);
9617
+ if (dirtiedFiles.length > 0) {
9618
+ logger$16.warn({
9619
+ storyKey,
9620
+ branchName,
9621
+ dirtiedFiles
9622
+ }, "parent working tree has uncommitted changes to files in the story diff — refusing to merge");
9623
+ return {
9624
+ success: false,
9625
+ reason: "parent-tree-dirtied-by-run",
9626
+ dirtiedFiles
9627
+ };
9628
+ }
9614
9629
  const ffSuccess = tryFfMerge(branchName, projectRoot);
9615
9630
  if (ffSuccess) {
9616
9631
  logger$16.info({
@@ -9620,6 +9635,17 @@ async function runMergeToMain(params) {
9620
9635
  await cleanupAfterSuccessfulMerge(storyKey, branchName, worktreeManager, projectRoot);
9621
9636
  return { success: true };
9622
9637
  }
9638
+ if (mergeStrategy === "ff-only") {
9639
+ logger$16.warn({
9640
+ storyKey,
9641
+ branchName,
9642
+ startBranch
9643
+ }, "fast-forward not possible (base moved since the story branched) and merge_strategy is ff-only — refusing 3-way merge. Set finalization.merge_strategy: three-way to allow it (required for concurrent multi-story runs), or integrate the branch manually.");
9644
+ return {
9645
+ success: false,
9646
+ reason: "ff-only-merge-not-possible"
9647
+ };
9648
+ }
9623
9649
  logger$16.info({
9624
9650
  storyKey,
9625
9651
  branchName
@@ -9651,6 +9677,47 @@ async function runMergeToMain(params) {
9651
9677
  };
9652
9678
  }
9653
9679
  /**
9680
+ * H3.3 (AC1): files that are both dirty in the parent working tree and part of
9681
+ * the story branch's diff against the start branch. Best-effort: if either
9682
+ * git query fails, returns [] (the merge itself will surface genuine issues).
9683
+ */
9684
+ function listParentDirtyIntersection(branchName, startBranch, projectRoot) {
9685
+ try {
9686
+ const statusOut = execFileSync("git", ["status", "--porcelain"], {
9687
+ cwd: projectRoot,
9688
+ encoding: "utf-8",
9689
+ stdio: [
9690
+ "ignore",
9691
+ "pipe",
9692
+ "pipe"
9693
+ ]
9694
+ });
9695
+ const dirty = new Set(statusOut.split("\n").filter((line) => line.trim().length > 0).map((line) => {
9696
+ const body = line.slice(3).trim();
9697
+ const arrow = body.indexOf(" -> ");
9698
+ return arrow === -1 ? body : body.slice(arrow + 4);
9699
+ }));
9700
+ if (dirty.size === 0) return [];
9701
+ const diffOut = execFileSync("git", [
9702
+ "diff",
9703
+ "--name-only",
9704
+ `${startBranch}...${branchName}`
9705
+ ], {
9706
+ cwd: projectRoot,
9707
+ encoding: "utf-8",
9708
+ stdio: [
9709
+ "ignore",
9710
+ "pipe",
9711
+ "pipe"
9712
+ ]
9713
+ });
9714
+ return diffOut.split("\n").filter((f$1) => f$1.trim().length > 0).filter((f$1) => dirty.has(f$1));
9715
+ } catch (err) {
9716
+ logger$16.warn({ err }, "parent-clean precondition check failed (best-effort) — proceeding to merge");
9717
+ return [];
9718
+ }
9719
+ }
9720
+ /**
9654
9721
  * Attempt a fast-forward merge of `branchName` into the current branch.
9655
9722
  *
9656
9723
  * @param branchName - Branch to merge
@@ -16746,6 +16813,63 @@ function createImplementationOrchestrator(deps) {
16746
16813
  }, "merge-to-main pre-flight verification failed — proceeding with merge phase");
16747
16814
  }
16748
16815
  const finalizationMode = config.finalizationMode ?? "merge";
16816
+ const epicGateCommand = config.epicGateCommand;
16817
+ if (epicGateCommand !== void 0 && epicGateCommand.trim() !== "" && finalizationMode !== "branch") {
16818
+ const epicOf = (key) => key.includes("-") ? key.slice(0, key.lastIndexOf("-")) : key;
16819
+ const epicId = epicOf(storyKey);
16820
+ const TERMINAL_PHASES = ["COMPLETE", "ESCALATED"];
16821
+ const isLastOfEpic = [..._stories.entries()].filter(([key]) => key !== storyKey && epicOf(key) === epicId).every(([, st]) => TERMINAL_PHASES.includes(st.phase));
16822
+ if (isLastOfEpic) {
16823
+ logger$27.info({
16824
+ storyKey,
16825
+ epicId,
16826
+ epicGateCommand
16827
+ }, "H3.4: last story of epic — running epic gate command");
16828
+ let gateOutput = "";
16829
+ let gatePassed = false;
16830
+ try {
16831
+ gateOutput = execSync(epicGateCommand, {
16832
+ cwd: projectRoot,
16833
+ encoding: "utf-8",
16834
+ stdio: [
16835
+ "ignore",
16836
+ "pipe",
16837
+ "pipe"
16838
+ ],
16839
+ timeout: 6e5,
16840
+ maxBuffer: 10 * 1024 * 1024
16841
+ });
16842
+ gatePassed = true;
16843
+ } catch (gateCmdErr) {
16844
+ const e = gateCmdErr;
16845
+ gateOutput = `${e.stdout ?? ""}${e.stderr ?? ""}`.trim() || (e.message ?? String(gateCmdErr));
16846
+ }
16847
+ if (!gatePassed) {
16848
+ logger$27.error({
16849
+ storyKey,
16850
+ epicId,
16851
+ output: gateOutput.slice(0, 500)
16852
+ }, "H3.4: epic gate command failed — halting finalization; branch preserved");
16853
+ updateStory(storyKey, {
16854
+ phase: "ESCALATED",
16855
+ error: "epic-gate-failed",
16856
+ completedAt: new Date().toISOString()
16857
+ });
16858
+ await emitEscalation({
16859
+ storyKey,
16860
+ lastVerdict: "epic-gate-failed",
16861
+ reviewCycles: completedReviewCycles,
16862
+ issues: [`epic gate command failed for epic ${epicId} (last story ${storyKey}): \`${epicGateCommand}\`\noutput (truncated):\n${gateOutput.slice(0, 4e3)}`]
16863
+ });
16864
+ await persistState();
16865
+ return "terminal";
16866
+ }
16867
+ logger$27.info({
16868
+ storyKey,
16869
+ epicId
16870
+ }, "H3.4: epic gate passed");
16871
+ }
16872
+ }
16749
16873
  if (finalizationMode === "branch" || finalizationMode === "pr") {
16750
16874
  let prUrl;
16751
16875
  if (finalizationMode === "pr") try {
@@ -16822,7 +16946,8 @@ function createImplementationOrchestrator(deps) {
16822
16946
  startBranch: _orchestratorStartBranch,
16823
16947
  worktreeManager: _worktreeManager,
16824
16948
  eventBus,
16825
- projectRoot
16949
+ projectRoot,
16950
+ mergeStrategy: config.mergeStrategy ?? "ff-only"
16826
16951
  });
16827
16952
  } catch (mergeErr) {
16828
16953
  const errMsg = mergeErr instanceof Error ? mergeErr.message : String(mergeErr);
@@ -16845,21 +16970,28 @@ function createImplementationOrchestrator(deps) {
16845
16970
  return "terminal";
16846
16971
  }
16847
16972
  if (!mergeResult.success) {
16973
+ const failReason = mergeResult.reason ?? "merge-conflict-detected";
16974
+ const issues = [];
16975
+ if (failReason === "parent-tree-dirtied-by-run") issues.push(`parent working tree has uncommitted changes to ${mergeResult.dirtiedFiles?.length ?? 0} file(s) the story also modified: ${(mergeResult.dirtiedFiles ?? []).join(", ")} — merging would entangle unreviewed parent edits with verified story content. Commit or stash the parent changes, then merge ${branchName} manually.`);
16976
+ else if (failReason === "ff-only-merge-not-possible") issues.push(`${_orchestratorStartBranch ?? "the start branch"} moved since ${branchName} was created and merge_strategy is ff-only — substrate will not synthesize a merge commit. Set finalization.merge_strategy: three-way (required for concurrent multi-story runs) or integrate the branch manually.`);
16977
+ else issues.push(`merge conflict in ${mergeResult.conflictingFiles?.length ?? 0} file(s): ${(mergeResult.conflictingFiles ?? []).join(", ")}`);
16848
16978
  logger$27.warn({
16849
16979
  storyKey,
16850
16980
  branchName,
16851
- conflictingFiles: mergeResult.conflictingFiles
16852
- }, "merge-to-main conflict — escalating story with merge-conflict-detected");
16981
+ reason: failReason,
16982
+ conflictingFiles: mergeResult.conflictingFiles,
16983
+ dirtiedFiles: mergeResult.dirtiedFiles
16984
+ }, `merge-to-main failed — escalating story with ${failReason}`);
16853
16985
  updateStory(storyKey, {
16854
16986
  phase: "ESCALATED",
16855
- error: "merge-conflict-detected",
16987
+ error: failReason,
16856
16988
  completedAt: new Date().toISOString()
16857
16989
  });
16858
16990
  await emitEscalation({
16859
16991
  storyKey,
16860
- lastVerdict: "merge-conflict-detected",
16992
+ lastVerdict: failReason,
16861
16993
  reviewCycles: completedReviewCycles,
16862
- issues: [`merge conflict in ${mergeResult.conflictingFiles?.length ?? 0} file(s): ${(mergeResult.conflictingFiles ?? []).join(", ")}`]
16994
+ issues
16863
16995
  });
16864
16996
  await persistState();
16865
16997
  return "terminal";
@@ -18116,7 +18248,13 @@ function createImplementationOrchestrator(deps) {
18116
18248
  }).trim();
18117
18249
  logger$27.info({ orchestratorStartBranch: _orchestratorStartBranch }, "Captured orchestrator start branch for merge-to-main");
18118
18250
  } catch (branchErr) {
18119
- logger$27.warn({ err: branchErr }, "Failed to capture orchestrator start branch — merge-to-main will skip worktree integration");
18251
+ if (config.noWorktree !== true) {
18252
+ logger$27.error({ err: branchErr }, "FATAL: failed to capture the orchestrator start branch (git rev-parse --abbrev-ref HEAD). Worktree finalization cannot work without it. Fix git in the project root or re-run with --no-worktree.");
18253
+ _state = "FAILED";
18254
+ _completedAt = new Date().toISOString();
18255
+ return getStatus();
18256
+ }
18257
+ logger$27.warn({ err: branchErr }, "Failed to capture orchestrator start branch — merge-to-main will skip worktree integration (--no-worktree run)");
18120
18258
  }
18121
18259
  for (const key of storyKeys) {
18122
18260
  const pendingState = {
@@ -46953,6 +47091,8 @@ async function runRunAction(options) {
46953
47091
  let meshProjectId;
46954
47092
  let configRetryBudget;
46955
47093
  let configFinalizationMode;
47094
+ let configMergeStrategy;
47095
+ let configEpicGateCommand;
46956
47096
  let configWorktreeCopyFiles;
46957
47097
  try {
46958
47098
  const configSystem = createConfigSystem({ projectConfigDir: dbDir });
@@ -46980,6 +47120,8 @@ async function runRunAction(options) {
46980
47120
  }
46981
47121
  if (typeof cfg.retry_budget === "number") configRetryBudget = cfg.retry_budget;
46982
47122
  if (cfg.finalization?.mode !== void 0) configFinalizationMode = cfg.finalization.mode;
47123
+ if (cfg.finalization?.merge_strategy !== void 0) configMergeStrategy = cfg.finalization.merge_strategy;
47124
+ if (cfg.finalization?.epic_gate_command !== void 0) configEpicGateCommand = cfg.finalization.epic_gate_command;
46983
47125
  if (Array.isArray(cfg.worktree?.copy_files) && cfg.worktree.copy_files.length > 0) {
46984
47126
  configWorktreeCopyFiles = [...cfg.worktree.copy_files];
46985
47127
  logger.info({ copyFiles: configWorktreeCopyFiles }, "Loaded worktree.copy_files from config");
@@ -47080,6 +47222,8 @@ async function runRunAction(options) {
47080
47222
  agentId,
47081
47223
  ...noWorktree === true ? { noWorktree: true } : {},
47082
47224
  ...finalization !== void 0 ? { finalizationMode: finalization } : configFinalizationMode !== void 0 ? { finalizationMode: configFinalizationMode } : {},
47225
+ ...configMergeStrategy !== void 0 ? { mergeStrategy: configMergeStrategy } : {},
47226
+ ...configEpicGateCommand !== void 0 ? { epicGateCommand: configEpicGateCommand } : {},
47083
47227
  ...configWorktreeCopyFiles !== void 0 ? { worktreeCopyFiles: configWorktreeCopyFiles } : {}
47084
47228
  });
47085
47229
  let storyKeys = [...parsedStoryKeys];
@@ -47644,6 +47788,8 @@ async function runRunAction(options) {
47644
47788
  probeAuthorStateIntegrating: resolvedProbeAuthorStateIntegrating,
47645
47789
  ...noWorktree === true ? { noWorktree: true } : {},
47646
47790
  ...finalization !== void 0 ? { finalizationMode: finalization } : configFinalizationMode !== void 0 ? { finalizationMode: configFinalizationMode } : {},
47791
+ ...configMergeStrategy !== void 0 ? { mergeStrategy: configMergeStrategy } : {},
47792
+ ...configEpicGateCommand !== void 0 ? { epicGateCommand: configEpicGateCommand } : {},
47647
47793
  ...configWorktreeCopyFiles !== void 0 ? { worktreeCopyFiles: configWorktreeCopyFiles } : {}
47648
47794
  },
47649
47795
  projectRoot,
@@ -47867,7 +48013,7 @@ async function runRunAction(options) {
47867
48013
  }
47868
48014
  }
47869
48015
  async function runFullPipeline(options) {
47870
- const { packName, packPath, dbDir, dbPath, startPhase, stopAfter, concept, concurrency, outputFormat, projectRoot, events: eventsFlag, skipUx, research: researchFlag, skipResearch: skipResearchFlag, skipPreflight, skipVerification, maxReviewCycles = 2, retryBudget, registry: injectedRegistry, tokenCeilings, stories: explicitStories, telemetryEnabled: fullTelemetryEnabled, telemetryPort: fullTelemetryPort, agentId, meshUrl: fpMeshUrl, meshProjectId: fpMeshProjectId, engineType: fpEngineType, probeAuthor, probeAuthorStateIntegrating: fpProbeAuthorStateIntegrating, noWorktree, worktreeCopyFiles: fpWorktreeCopyFiles, finalizationMode: fpFinalizationMode } = options;
48016
+ const { packName, packPath, dbDir, dbPath, startPhase, stopAfter, concept, concurrency, outputFormat, projectRoot, events: eventsFlag, skipUx, research: researchFlag, skipResearch: skipResearchFlag, skipPreflight, skipVerification, maxReviewCycles = 2, retryBudget, registry: injectedRegistry, tokenCeilings, stories: explicitStories, telemetryEnabled: fullTelemetryEnabled, telemetryPort: fullTelemetryPort, agentId, meshUrl: fpMeshUrl, meshProjectId: fpMeshProjectId, engineType: fpEngineType, probeAuthor, probeAuthorStateIntegrating: fpProbeAuthorStateIntegrating, noWorktree, worktreeCopyFiles: fpWorktreeCopyFiles, finalizationMode: fpFinalizationMode, mergeStrategy: fpMergeStrategy, epicGateCommand: fpEpicGateCommand } = options;
47871
48017
  if (!existsSync$1(dbDir)) mkdirSync$1(dbDir, { recursive: true });
47872
48018
  let doltServerFull = null;
47873
48019
  try {
@@ -48178,6 +48324,8 @@ async function runFullPipeline(options) {
48178
48324
  ...fpProbeAuthorStateIntegrating !== void 0 ? { probeAuthorStateIntegrating: fpProbeAuthorStateIntegrating } : {},
48179
48325
  ...noWorktree === true ? { noWorktree: true } : {},
48180
48326
  ...fpFinalizationMode !== void 0 ? { finalizationMode: fpFinalizationMode } : {},
48327
+ ...fpMergeStrategy !== void 0 ? { mergeStrategy: fpMergeStrategy } : {},
48328
+ ...fpEpicGateCommand !== void 0 ? { epicGateCommand: fpEpicGateCommand } : {},
48181
48329
  ...fpWorktreeCopyFiles !== void 0 ? { worktreeCopyFiles: fpWorktreeCopyFiles } : {}
48182
48330
  },
48183
48331
  projectRoot,
@@ -48348,7 +48496,7 @@ async function runFullPipeline(options) {
48348
48496
  */
48349
48497
  async function emitPreDispatchVersionAdvisory(currentVersion) {
48350
48498
  if (process.env["SUBSTRATE_NO_UPDATE_CHECK"] === "1") return;
48351
- const { createVersionManager } = await import("./version-manager-impl-BWqvme_f.js");
48499
+ const { createVersionManager } = await import("./version-manager-impl-_x1n4xZk.js");
48352
48500
  const vm = createVersionManager();
48353
48501
  const result = await vm.checkForUpdates(true);
48354
48502
  const gap = classifyVersionGap(currentVersion, result.latestVersion);
@@ -48455,4 +48603,4 @@ function registerRunCommand(program, version = "0.0.0", projectRoot = process.cw
48455
48603
 
48456
48604
  //#endregion
48457
48605
  export { AdapterTelemetryPersistence, AppError, DoltRepoMapMetaRepository, DoltSymbolRepository, ERR_REPO_MAP_STORAGE_WRITE, EpicIngester, GLOBSTAR$1 as GLOBSTAR, GitClient, GrammarLoader, Minimatch$1 as Minimatch, Minipass, RepoMapInjector, RepoMapModule, RepoMapQueryEngine, RepoMapStorage, SymbolParser, createContextCompiler, createDispatcher, createEventEmitter, createGitWorktreeManager, createImplementationOrchestrator, createPackLoader, createPhaseOrchestrator, createStopAfterGate, createTelemetryAdvisor, escape$1 as escape, formatPhaseCompletionSummary, getFactoryRunSummaries, getScenarioResultsForRun, getTwinRunsForRun, listGraphRuns, normalizeGraphSummaryToStatus, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveMaxReviewCycles, resolveProbeAuthorStateIntegrating, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runRunAction, runSolutioningPhase, unescape$1 as unescape, validateStopAfterFromConflict, wireNdjsonEmitter };
48458
- //# sourceMappingURL=run-BBVZdkEo.js.map
48606
+ //# sourceMappingURL=run-B9DV9sro.js.map
@@ -1,14 +1,14 @@
1
- import "./health-nQ_Txd5T.js";
1
+ import "./health-Aqc5cghP.js";
2
2
  import "./logger-KeHncl-f.js";
3
3
  import "./helpers-CElYrONe.js";
4
- import "./dist-DT378h1M.js";
5
- import { normalizeGraphSummaryToStatus, registerRunCommand, resolveMaxReviewCycles, resolveProbeAuthorStateIntegrating, runRunAction, wireNdjsonEmitter } from "./run-BBVZdkEo.js";
6
- import "./manifest-read-DlWwZpfO.js";
4
+ import "./dist-CZk5SeSt.js";
5
+ import { normalizeGraphSummaryToStatus, registerRunCommand, resolveMaxReviewCycles, resolveProbeAuthorStateIntegrating, runRunAction, wireNdjsonEmitter } from "./run-B9DV9sro.js";
6
+ import "./manifest-read-D6NAZgt8.js";
7
7
  import "./routing-DFxoKHDt.js";
8
8
  import "./work-graph-repository-DZyJv5pV.js";
9
9
  import "./decisions-CzSIEeGP.js";
10
10
  import "./decision-router-BAPpON_C.js";
11
- import "./interactive-prompt-xJ3K-IUQ.js";
11
+ import "./interactive-prompt-BLkX0iE_.js";
12
12
  import "./recovery-engine-BKGBeBnW.js";
13
13
 
14
14
  export { runRunAction };
@@ -1,4 +1,4 @@
1
- import { CoreEvents, DatabaseAdapter, TypedEventBus } from "../../../index-DaBYDiWn.js";
1
+ import { CoreEvents, DatabaseAdapter, TypedEventBus } from "../../../index-CvNLhgKV.js";
2
2
  import { z } from "zod";
3
3
 
4
4
  //#region packages/sdlc/dist/verification/findings.d.ts
@@ -1,4 +1,4 @@
1
- import { createVersionManager } from "./dist-DT378h1M.js";
1
+ import { createVersionManager } from "./dist-CZk5SeSt.js";
2
2
  import { execSync, spawn } from "child_process";
3
3
  import * as readline from "readline";
4
4
 
@@ -123,4 +123,4 @@ function registerUpgradeCommand(program) {
123
123
 
124
124
  //#endregion
125
125
  export { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand };
126
- //# sourceMappingURL=upgrade-BVHnUYUd.js.map
126
+ //# sourceMappingURL=upgrade-BEfZJU4K.js.map
@@ -1,5 +1,5 @@
1
- import "./dist-DT378h1M.js";
1
+ import "./dist-CZk5SeSt.js";
2
2
  import "./version-manager-impl-qFBiO4Eh.js";
3
- import { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand } from "./upgrade-BVHnUYUd.js";
3
+ import { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand } from "./upgrade-BEfZJU4K.js";
4
4
 
5
5
  export { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand };
@@ -1,4 +1,4 @@
1
- import { VersionManagerImpl, createVersionManager } from "./dist-DT378h1M.js";
1
+ import { VersionManagerImpl, createVersionManager } from "./dist-CZk5SeSt.js";
2
2
  import "./version-manager-impl-qFBiO4Eh.js";
3
3
 
4
4
  export { createVersionManager };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "substrate-ai",
3
- "version": "0.20.147",
3
+ "version": "0.20.148",
4
4
  "description": "Substrate — multi-agent orchestration daemon for AI coding agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,4 +0,0 @@
1
- import { AdapterRegistry } from "./dist-DT378h1M.js";
2
- import "./adapter-registry-DIcrxjH8.js";
3
-
4
- export { AdapterRegistry };