console UI improvements and cleanup (#311)
* console UI improvements and cleanup - add verify workflow button and API endpoint for manual installation check - move env var check into PromptBox as blocking overlay (hoisted to RepoConsole) - extract FlagsCheatSheet modal, replace verbose flag hints everywhere - add info popovers for repo setup / post-checkout script descriptions - remove unused prAutoFixCiFailures schema fields and migration - default mentionAllowNonCollaborator to disabled for safety on public repos - update docs for triggers and getting started Co-authored-by: Cursor <cursoragent@cursor.com> * add diagnostic logging for push_branch bug investigation temporary [push-debug] logs to trace why getPushDestination falls back to origin/<localBranch> instead of using the correct remote branch name for same-repo PRs. Co-authored-by: Cursor <cursoragent@cursor.com> * add git config diagnostic to verify original bug cause Co-authored-by: Cursor <cursoragent@cursor.com> * temporarily disable StoredPushDest to test git config path Co-authored-by: Cursor <cursoragent@cursor.com> * remove diagnostic logging for push_branch investigation verified that StoredPushDest fix works correctly on preview repo. both the stored dest path and the git config fallback resolve to the correct remote branch in the GitHub Actions environment. Co-authored-by: Cursor <cursoragent@cursor.com> * fix formatting in AgentSettings and TriggersSettings Co-authored-by: Cursor <cursoragent@cursor.com> * pass derived env var state to PromptBox instead of raw secrets data eliminates duplicated derivation logic between RepoConsole and PromptBox by passing envVarMissing, envVarChecking, and agentKeyNames as props. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: prevent duplicate comment after PR review deletes progress comment progressCommentId now uses three states: undefined (no comment yet), number (active), null (deliberately deleted). After create_pull_request_review deletes the progress comment, subsequent report_progress calls skip instead of creating a new comment. Co-authored-by: Cursor <cursoragent@cursor.com> * effort descriptions, test ordering, husky, docs images, typo fix - rewrote delegation effort level descriptions to per-level breakdown - action-agents now waits for action-agnostic; action-agnostic waits for root - added husky + lint-staged (biome check --write on staged files) - updated triggers docs images and triggers.mdx content - fixed "figured" → "figures" typo on landing page - updated pnpm-lock.yaml Co-authored-by: Cursor <cursoragent@cursor.com> * Commit --------- Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
committed by
pullfrog[bot]
parent
e45c4a84a2
commit
97937f46f7
+27
-12
@@ -3,7 +3,7 @@ import { type } from "arktype";
|
||||
import { log } from "../utils/cli.ts";
|
||||
import { $git } from "../utils/gitAuth.ts";
|
||||
import { $ } from "../utils/shell.ts";
|
||||
import type { ToolContext } from "./server.ts";
|
||||
import type { StoredPushDest, ToolContext } from "./server.ts";
|
||||
import { execute, tool } from "./shared.ts";
|
||||
|
||||
type PushDestination = {
|
||||
@@ -14,17 +14,27 @@ type PushDestination = {
|
||||
|
||||
/**
|
||||
* get where git would actually push this branch.
|
||||
* reads branch.X.pushRemote and branch.X.merge set by checkout_pr.
|
||||
* prefers the stored destination from toolState (set by checkout_pr) when it
|
||||
* matches the current branch, because git config reads can silently fail in
|
||||
* certain environments causing pushes to the wrong remote branch.
|
||||
*
|
||||
* NOTE: we read git config directly instead of using @{push} because
|
||||
* push.default=simple (git's default) requires local/remote branch names
|
||||
* to match. since checkout_pr uses pr-N as the local name, @{push} resolves
|
||||
* to origin/pr-N instead of the actual remote branch.
|
||||
*
|
||||
* for branches created via checkout_pr: uses configured pushRemote/merge
|
||||
* for new branches (git checkout -b): falls back to origin/<branch>
|
||||
* falls back to reading branch.X.pushRemote and branch.X.merge from git config,
|
||||
* and finally to origin/<branch> for branches created without checkout_pr.
|
||||
*/
|
||||
function getPushDestination(branch: string): PushDestination {
|
||||
function getPushDestination(
|
||||
branch: string,
|
||||
storedDest: StoredPushDest | undefined
|
||||
): PushDestination {
|
||||
// prefer stored destination from checkout_pr when it matches the current branch
|
||||
if (storedDest && storedDest.localBranch === branch) {
|
||||
log.debug(`using stored push destination: ${storedDest.remoteName}/${storedDest.remoteBranch}`);
|
||||
const url = $("git", ["remote", "get-url", "--push", storedDest.remoteName], {
|
||||
log: false,
|
||||
}).trim();
|
||||
return { remoteName: storedDest.remoteName, remoteBranch: storedDest.remoteBranch, url };
|
||||
}
|
||||
|
||||
// fall back to git config (for branches not created by checkout_pr)
|
||||
try {
|
||||
const pushRemote = $("git", ["config", `branch.${branch}.pushRemote`], { log: false }).trim();
|
||||
const merge = $("git", ["config", `branch.${branch}.merge`], { log: false }).trim();
|
||||
@@ -49,6 +59,7 @@ function normalizeUrl(url: string): string {
|
||||
type ValidatePushParams = {
|
||||
branch: string;
|
||||
pushUrl: string;
|
||||
storedDest: StoredPushDest | undefined;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -56,7 +67,7 @@ type ValidatePushParams = {
|
||||
* pushUrl is set by setupGit (base repo) and updated by checkout_pr (fork repo).
|
||||
*/
|
||||
function validatePushDestination(params: ValidatePushParams): PushDestination {
|
||||
const dest = getPushDestination(params.branch);
|
||||
const dest = getPushDestination(params.branch, params.storedDest);
|
||||
|
||||
if (normalizeUrl(dest.url) !== normalizeUrl(params.pushUrl)) {
|
||||
throw new Error(
|
||||
@@ -102,7 +113,11 @@ export function PushBranchTool(ctx: ToolContext) {
|
||||
if (!pushUrl) {
|
||||
throw new Error("pushUrl not set - setupGit must run before push_branch");
|
||||
}
|
||||
const pushDest = validatePushDestination({ branch, pushUrl });
|
||||
const pushDest = validatePushDestination({
|
||||
branch,
|
||||
pushUrl,
|
||||
storedDest: ctx.toolState.pushDest,
|
||||
});
|
||||
|
||||
// block pushes to default branch in restricted mode
|
||||
if (pushPermission === "restricted" && pushDest.remoteBranch === defaultBranch) {
|
||||
|
||||
Reference in New Issue
Block a user