feat: Lifecycle hooks (#219)

* flatten lifecycle hooks into RepoSettings string fields

replace the separate LifecycleHook model with setupScript and
postCheckoutScript string fields directly on RepoSettings. move the UI
into the Agent settings section alongside environment variables and
custom instructions. delete the standalone lifecycle-hooks API route,
component, and schema since the existing settings PATCH endpoint
handles the new fields automatically.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: pass env to lifecycle hook spawn so scripts can use package managers

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Colin McDonnell <colinmcd94@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pullfrog[bot]
2026-02-06 07:16:14 +00:00
committed by pullfrog[bot]
parent 3a7145db1a
commit 1d59fd3d21
8 changed files with 358 additions and 262 deletions
+8 -12
View File
@@ -45,15 +45,19 @@ export function setupTestRepo(options: SetupOptions): void {
}
}
interface SetupGitParams {
export interface GitContext {
gitToken: string;
owner: string;
name: string;
event: PayloadEvent;
octokit: OctokitWithPlugins;
toolState: ToolState;
// restricted bash mode: disables git hooks to prevent token exfiltration
restricted: boolean;
postCheckoutScript: string | null;
}
export interface SetupGitParams extends GitContext {
event: PayloadEvent;
}
/**
@@ -149,15 +153,7 @@ export async function setupGit(params: SetupGitParams): Promise<void> {
// PR event: checkout PR branch using shared helper
const prNumber = params.event.issue_number;
// use shared checkout helper (handles fork remotes, push config, etc.)
// use shared checkout helper (handles fork remotes, push config, post-checkout hook)
// this updates toolState.pushUrl for fork PRs and sets toolState.issueNumber
await checkoutPrBranch({
octokit: params.octokit,
owner: params.owner,
name: params.name,
gitToken: params.gitToken,
pullNumber: prNumber,
toolState: params.toolState,
restricted: params.restricted,
});
await checkoutPrBranch(prNumber, params);
}