mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-03-19 22:53:08 +00:00
Fix agent output summary for pipeline steps (#812)
* Changes from fix/agent-output-summary-for-pipeline-steps * feat: Optimize pipeline summary extraction and fix regex vulnerability * fix: Use fallback summary for pipeline steps when extraction fails * fix: Strip follow-up session scaffold from pipeline step fallback summaries
This commit is contained in:
@@ -15,7 +15,12 @@ import path from 'path';
|
||||
import { exec } from 'child_process';
|
||||
import { promisify } from 'util';
|
||||
import type { Feature, PlanningMode, ThinkingLevel, ReasoningEffort } from '@automaker/types';
|
||||
import { DEFAULT_MAX_CONCURRENCY, DEFAULT_MODELS, stripProviderPrefix } from '@automaker/types';
|
||||
import {
|
||||
DEFAULT_MAX_CONCURRENCY,
|
||||
DEFAULT_MODELS,
|
||||
stripProviderPrefix,
|
||||
isPipelineStatus,
|
||||
} from '@automaker/types';
|
||||
import { resolveModelString } from '@automaker/model-resolver';
|
||||
import { createLogger, loadContextFiles, classifyError } from '@automaker/utils';
|
||||
import { getFeatureDir } from '@automaker/platform';
|
||||
@@ -79,6 +84,37 @@ export class AutoModeServiceFacade {
|
||||
private readonly settingsService: SettingsService | null
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Determine if a feature is eligible to be picked up by the auto-mode loop.
|
||||
*
|
||||
* @param feature - The feature to check
|
||||
* @param branchName - The current worktree branch name (null for main)
|
||||
* @param primaryBranch - The resolved primary branch name for the project
|
||||
* @returns True if the feature is eligible for auto-dispatch
|
||||
*/
|
||||
public static isFeatureEligibleForAutoMode(
|
||||
feature: Feature,
|
||||
branchName: string | null,
|
||||
primaryBranch: string | null
|
||||
): boolean {
|
||||
const isEligibleStatus =
|
||||
feature.status === 'backlog' ||
|
||||
feature.status === 'ready' ||
|
||||
feature.status === 'interrupted' ||
|
||||
isPipelineStatus(feature.status);
|
||||
|
||||
if (!isEligibleStatus) return false;
|
||||
|
||||
// Filter by branch/worktree alignment
|
||||
if (branchName === null) {
|
||||
// For main worktree, include features with no branch or matching primary branch
|
||||
return !feature.branchName || (primaryBranch != null && feature.branchName === primaryBranch);
|
||||
} else {
|
||||
// For named worktrees, only include features matching that branch
|
||||
return feature.branchName === branchName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Classify and log an error at the facade boundary.
|
||||
* Emits an error event to the UI so failures are surfaced to the user.
|
||||
@@ -217,6 +253,7 @@ export class AutoModeServiceFacade {
|
||||
thinkingLevel?: ThinkingLevel;
|
||||
reasoningEffort?: ReasoningEffort;
|
||||
branchName?: string | null;
|
||||
status?: string; // Feature status for pipeline summary check
|
||||
[key: string]: unknown;
|
||||
}
|
||||
): Promise<void> => {
|
||||
@@ -300,6 +337,7 @@ export class AutoModeServiceFacade {
|
||||
thinkingLevel: opts?.thinkingLevel as ThinkingLevel | undefined,
|
||||
reasoningEffort: opts?.reasoningEffort as ReasoningEffort | undefined,
|
||||
branchName: opts?.branchName as string | null | undefined,
|
||||
status: opts?.status as string | undefined,
|
||||
provider,
|
||||
effectiveBareModel,
|
||||
credentials,
|
||||
@@ -373,12 +411,8 @@ export class AutoModeServiceFacade {
|
||||
if (branchName === null) {
|
||||
primaryBranch = await worktreeResolver.getCurrentBranch(pPath);
|
||||
}
|
||||
return features.filter(
|
||||
(f) =>
|
||||
(f.status === 'backlog' || f.status === 'ready') &&
|
||||
(branchName === null
|
||||
? !f.branchName || (primaryBranch && f.branchName === primaryBranch)
|
||||
: f.branchName === branchName)
|
||||
return features.filter((f) =>
|
||||
AutoModeServiceFacade.isFeatureEligibleForAutoMode(f, branchName, primaryBranch)
|
||||
);
|
||||
},
|
||||
(pPath, branchName, maxConcurrency) =>
|
||||
|
||||
Reference in New Issue
Block a user