Skip to main content

PhaseContext

Struct PhaseContext 

Source
pub struct PhaseContext<'a> {
Show 19 fields pub config: &'a Config, pub registry: &'a AgentRegistry, pub logger: &'a Logger, pub colors: &'a Colors, pub timer: &'a mut Timer, pub developer_agent: &'a str, pub reviewer_agent: &'a str, pub review_guidelines: Option<&'a ReviewGuidelines>, pub template_context: &'a TemplateContext, pub run_context: RunContext, pub execution_history: ExecutionHistory, pub executor: &'a dyn ProcessExecutor, pub executor_arc: Arc<dyn ProcessExecutor>, pub repo_root: &'a Path, pub workspace: &'a dyn Workspace, pub workspace_arc: Arc<dyn Workspace>, pub run_log_context: &'a RunLogContext, pub cloud_reporter: Option<&'a dyn CloudReporter>, pub cloud: &'a CloudConfig,
}
Expand description

Shared context for all pipeline phases.

This struct holds references to all the shared state that phases need to access. It is passed by mutable reference to each phase function.

§Phase Name Convention

When working with phase names (e.g., for log file naming), use lowercase identifiers with underscores for multi-word phases. The canonical phase names are:

  • "planning" - Planning phase
  • "analysis" - Analysis sub-phase of development (when role == AgentRole::Analysis)
  • "developer" - Development phase (when role == AgentRole::Developer)
  • "reviewer" - Review phase
  • "commit" - Commit message generation phase
  • "final_validation" - Final validation phase
  • "finalizing" - Finalizing phase
  • "complete" - Complete phase
  • "awaiting_dev_fix" - Awaiting dev fix phase
  • "interrupted" - Interrupted phase

These phase names are used for log file naming under .agent/logs-<run_id>/agents/ (e.g., planning_1.log, developer_2_a1.log).

When adding new phases or extending the phase system, maintain this lowercase convention for consistency.

Fields§

§config: &'a Config

Configuration settings for the pipeline.

§registry: &'a AgentRegistry

Agent registry for looking up agent configurations.

§logger: &'a Logger

Logger for output and diagnostics.

§colors: &'a Colors

Terminal color configuration.

§timer: &'a mut Timer

Timer for tracking elapsed time.

§developer_agent: &'a str

Name of the developer agent.

§reviewer_agent: &'a str

Name of the reviewer agent.

§review_guidelines: Option<&'a ReviewGuidelines>

Review guidelines based on detected project stack.

§template_context: &'a TemplateContext

Template context for loading user templates.

§run_context: RunContext

Run context for tracking execution lineage and state.

§execution_history: ExecutionHistory

Execution history for tracking pipeline steps.

§executor: &'a dyn ProcessExecutor

Process executor for external process execution.

§executor_arc: Arc<dyn ProcessExecutor>

Arc-wrapped executor for spawning into threads (e.g., idle timeout monitor).

§repo_root: &'a Path

Repository root path for explicit file operations.

This eliminates CWD dependencies by providing an explicit path for all file operations. Code should use repo_root.join("relative/path") instead of Path::new("relative/path").

§workspace: &'a dyn Workspace

Workspace for explicit path resolution and file operations.

Provides convenient methods for file operations and path resolution without depending on the current working directory.

This uses trait object (&dyn Workspace) for proper dependency injection:

  • Production code passes &WorkspaceFs (real filesystem)
  • Tests can pass &MemoryWorkspace (in-memory storage)
§workspace_arc: Arc<dyn Workspace>

Arc-wrapped workspace for spawning into threads (e.g., file activity monitor).

§run_log_context: &'a RunLogContext

Run log context for per-run log path resolution.

Provides paths to all log files under the per-run directory (.agent/logs-<run_id>/). This ensures all logs from a single pipeline invocation are grouped together for easy debugging.

§cloud_reporter: Option<&'a dyn CloudReporter>

Cloud reporter for progress updates (None in CLI mode).

When cloud mode is disabled, this is None and no cloud reporting occurs. When enabled, this is Some(&dyn CloudReporter) for API communication.

§cloud: &'a CloudConfig

Cloud configuration.

When cloud mode is disabled (enabled=false), all cloud-specific logic is skipped throughout the pipeline.

Implementations§

Source§

impl PhaseContext<'_>

Source

pub const fn record_developer_iteration(&mut self)

Record a completed developer iteration.

Source

pub const fn record_reviewer_pass(&mut self)

Record a completed reviewer pass.

Auto Trait Implementations§

§

impl<'a> Freeze for PhaseContext<'a>

§

impl<'a> !RefUnwindSafe for PhaseContext<'a>

§

impl<'a> Send for PhaseContext<'a>

§

impl<'a> Sync for PhaseContext<'a>

§

impl<'a> Unpin for PhaseContext<'a>

§

impl<'a> UnsafeUnpin for PhaseContext<'a>

§

impl<'a> !UnwindSafe for PhaseContext<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.