Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion packages/agent/src/server/agent-server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1374,6 +1374,12 @@ describe("AgentServer HTTP Mode", () => {
expect(prompt).toContain(
"Do NOT create a branch, commit, push, or open a pull request unless the user explicitly asks.",
);
expect(prompt).toContain(
"If the user does ask you to open a draft PR, open it first and do not block on long local checks",
);
expect(prompt).toContain("Opening the PR — do not block on long checks");
expect(prompt).toContain("assume the repo has CI");
expect(prompt).toContain("run the relevant checks as a follow-up task");
expect(prompt).toContain("Generated-By: PostHog Code");
expect(prompt).toContain("Task-Id: test-task-id");
expect(prompt).not.toContain("gh pr create --draft");
Expand Down Expand Up @@ -1401,6 +1407,7 @@ describe("AgentServer HTTP Mode", () => {
".github/pull_request_template.md",
"gh issue list --search",
"Closes #<n>",
"Opening the PR — do not block on long checks",
"Generated-By: PostHog Code",
"Task-Id: test-task-id",
],
Expand All @@ -1414,7 +1421,11 @@ describe("AgentServer HTTP Mode", () => {
"You may clone a repository and make local edits in that clone",
"Do NOT create branches, commits, push changes, or open pull requests in this run",
],
shouldNotContain: ["open a draft pull request", "gh pr create --draft"],
shouldNotContain: [
"open a draft pull request",
"gh pr create --draft",
"Opening the PR — do not block on long checks",
],
},
])(
"returns no-repository prompt for $label",
Expand All @@ -1440,6 +1451,10 @@ describe("AgentServer HTTP Mode", () => {
expect(prompt).toContain("posthog-code/");
expect(prompt).toContain("Create a draft pull request");
expect(prompt).toContain("gh pr create --draft");
expect(prompt).toContain(
"Open the draft PR without blocking on long local checks",
);
expect(prompt).toContain("Opening the PR — do not block on long checks");
expect(prompt).toContain("Generated-By: PostHog Code");
expect(prompt).toContain("Task-Id: test-task-id");
expect(prompt).toContain("Created with [PostHog Code]");
Expand Down
24 changes: 23 additions & 1 deletion packages/agent/src/server/agent-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1791,6 +1791,22 @@ we want:
Generated-By: PostHog Code
Task-Id: ${taskId}`;

const draftPrVerificationGuidance = `
## Opening the PR — do not block on long checks
When you open a draft pull request, open it FIRST, then handle verification.
- Do NOT gate draft-PR creation on long-running local checks (full typecheck, full
test suite, or package builds). A draft is the safety net, and by the time a draft is
requested the work is usually already at a point the user considers complete (often
with some tests already run).
- Committing is fast here: commits go through the \`git_signed_commit\` tool
(server-side), so there is no local pre-commit hook to wait on.
- After the draft is open, handle verification without blocking its creation. Do NOT
assume the repo has CI: if it does, let CI run the checks on the PR; if it has no CI
(or you are unsure) and you judge verification is warranted, tell the user and offer
to run the relevant checks as a follow-up task. For a quick local sanity check, prefer
fast, scoped checks (lint, or a typecheck of just the package you touched). Reserve the
full suite for before marking the PR ready for review.`;

const whyContextInstruction = ` - Add a brief **Why** to the body — one or two sentences capturing the reason the user asked for this change (the motivation, not a restatement of the diff). Keep it short.`;
const prFooter = slackThreadUrl
? `*Created with [PostHog Code](https://posthog.com/code?ref=pr) from a [Slack thread](${slackThreadUrl})*`
Expand Down Expand Up @@ -1848,7 +1864,9 @@ When the user explicitly asks to clone or work in a GitHub repository:
- Keep the PR description brief overall. Summarize only the most important changes — do NOT enumerate every change you made. A few sentences or bullets is plenty.
${whyContextInstruction.trimStart()}
- End the PR description with a horizontal rule followed by this footer line: ${prFooter}
- Do NOT create branches, commits, push changes, or open pull requests unless the user explicitly asks for that`;
- Do NOT create branches, commits, push changes, or open pull requests unless the user explicitly asks for that
- If the user does ask you to open a draft PR, open it first and do not block on long local checks (see below).
${draftPrVerificationGuidance}`;

return `${identityInstructions}
# Cloud Task Execution — No Repository Mode
Expand Down Expand Up @@ -1879,6 +1897,8 @@ Do the requested work, but stop with local changes ready for review.

Important:
- Do NOT create a branch, commit, push, or open a pull request unless the user explicitly asks.
- If the user does ask you to open a draft PR, open it first and do not block on long local checks (see below).
${draftPrVerificationGuidance}
${signedCommitInstructions}
`;
}
Expand All @@ -1903,6 +1923,8 @@ ${prFooter}

Important:
- Always create the PR as a draft. Do not ask for confirmation.
- Open the draft PR without blocking on long local checks (see below); handle verification after it is open.
${draftPrVerificationGuidance}
${signedCommitInstructions}
`;
}
Expand Down
Loading