| layout | default |
|---|---|
| title | Chapter 5: Context Engineering and State Control |
| nav_order | 5 |
| parent | CodeMachine CLI Tutorial |
Welcome to Chapter 5: Context Engineering and State Control. In this part of CodeMachine CLI Tutorial: Orchestrating Long-Running Coding Agent Workflows, you will build an intuitive mental model first, then move into concrete implementation details and practical production tradeoffs.
Context engineering in CodeMachine determines what each agent sees at each workflow step.
| Control | Purpose |
|---|---|
| scoped context injection | reduce noise and drift |
| dynamic state updates | preserve workflow continuity |
| context reset points | avoid stale accumulation |
You now have context controls for maintaining workflow quality across long runs.
Next: Chapter 6: Persistence and Long-Running Jobs
The LogFile interface in scripts/import-telemetry.ts handles a key part of this chapter's functionality:
}
interface LogFile {
version: number;
service: string;
exportedAt: string;
logCount: number;
logs: SerializedLog[];
}
// Parse command line arguments
function parseArgs(): Config {
const args = process.argv.slice(2);
const config: Config = {
lokiUrl: 'http://localhost:3100',
tempoUrl: 'http://localhost:4318',
logsOnly: false,
tracesOnly: false,
sourcePath: '',
};
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg === '--loki-url' && args[i + 1]) {
config.lokiUrl = args[++i];
} else if (arg === '--tempo-url' && args[i + 1]) {
config.tempoUrl = args[++i];
} else if (arg === '--logs-only') {
config.logsOnly = true;
} else if (arg === '--traces-only') {
config.tracesOnly = true;
} else if (!arg.startsWith('-')) {This interface is important because it defines how CodeMachine CLI Tutorial: Orchestrating Long-Running Coding Agent Workflows implements the patterns covered in this chapter.
The ensureImportedAgentsRegistered function in src/workflows/preflight.ts handles a key part of this chapter's functionality:
* resolveStep() can find agents from imported packages
*/
function ensureImportedAgentsRegistered(): void {
clearImportedAgents();
const importedPackages = getAllInstalledImports();
for (const imp of importedPackages) {
registerImportedAgents(imp.resolvedPaths.config);
}
}
/**
* Onboarding requirements - what the user needs to configure before workflow can start
*/
export interface OnboardingNeeds {
needsProjectName: boolean;
needsTrackSelection: boolean;
needsConditionsSelection: boolean;
needsControllerSelection: boolean;
/** @deprecated Controller is now pre-specified via controller() function */
controllerAgents: AgentDefinition[];
/** The loaded template for reference */
template: WorkflowTemplate;
}
/**
* Check what onboarding steps are needed before workflow can start
* Does NOT throw - returns the requirements for the UI to handle
*/
export async function checkOnboardingRequired(options: { cwd?: string } = {}): Promise<OnboardingNeeds> {
const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
const cmRoot = path.join(cwd, '.codemachine');This function is important because it defines how CodeMachine CLI Tutorial: Orchestrating Long-Running Coding Agent Workflows implements the patterns covered in this chapter.
The checkOnboardingRequired function in src/workflows/preflight.ts handles a key part of this chapter's functionality:
* Does NOT throw - returns the requirements for the UI to handle
*/
export async function checkOnboardingRequired(options: { cwd?: string } = {}): Promise<OnboardingNeeds> {
const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
const cmRoot = path.join(cwd, '.codemachine');
// Ensure workspace structure exists
await ensureWorkspaceStructure({ cwd });
// Ensure imported agents are registered before loading template
// This allows resolveStep() to find agents from imported packages
ensureImportedAgentsRegistered();
// Load template
const templatePath = await getTemplatePathFromTracking(cmRoot);
const { template } = await loadTemplateWithPath(cwd, templatePath);
// Check existing selections
const selectedTrack = await getSelectedTrack(cmRoot);
const conditionsSelected = await hasSelectedConditions(cmRoot);
const existingProjectName = await getProjectName(cmRoot);
// Determine what's needed
const hasTracks = !!(template.tracks && Object.keys(template.tracks.options).length > 0);
const hasConditionGroups = !!(template.conditionGroups && template.conditionGroups.length > 0);
const needsTrackSelection = hasTracks && !selectedTrack;
const needsConditionsSelection = hasConditionGroups && !conditionsSelected;
// TODO: Re-enable project name check - temporarily disabled due to persistence bug
const needsProjectName = false; // !existingProjectName;
// Controller is now pre-specified via controller() function - no selection needed
const needsControllerSelection = false;This function is important because it defines how CodeMachine CLI Tutorial: Orchestrating Long-Running Coding Agent Workflows implements the patterns covered in this chapter.
The checkSpecificationRequired function in src/workflows/preflight.ts handles a key part of this chapter's functionality:
* - Env: CODEMACHINE_SPEC_PATH
*/
export async function checkSpecificationRequired(options: { cwd?: string } = {}): Promise<void> {
const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
const cmRoot = path.join(cwd, '.codemachine');
const specificationPath = process.env.CODEMACHINE_SPEC_PATH
|| path.resolve(cwd, '.codemachine', 'inputs', 'specifications.md');
// Ensure workspace structure exists
await ensureWorkspaceStructure({ cwd });
// Ensure imported agents are registered before loading template
// This allows resolveStep() to find agents from imported packages
ensureImportedAgentsRegistered();
// Load template to check specification requirement
const templatePath = await getTemplatePathFromTracking(cmRoot);
const { template } = await loadTemplateWithPath(cwd, templatePath);
// Validate specification only if template requires it
if (template.specification === true) {
await validateSpecification(specificationPath);
}
}
/**
* Main pre-flight check - verifies workflow can start
* Throws ValidationError if workflow cannot start due to missing specification
* Returns onboarding needs if user configuration is required
*/
export async function checkWorkflowCanStart(options: { cwd?: string } = {}): Promise<OnboardingNeeds> {
const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();This function is important because it defines how CodeMachine CLI Tutorial: Orchestrating Long-Running Coding Agent Workflows implements the patterns covered in this chapter.
flowchart TD
A[LogFile]
B[ensureImportedAgentsRegistered]
C[checkOnboardingRequired]
D[checkSpecificationRequired]
A --> B
B --> C
C --> D