Skip to content

Commit 3b700de

Browse files
Ambient Code Botclaude
andcommitted
feat: post check runs on PRs with session link
When Amber works on a PR (via @ambient-code comment or batch fixer), post a GitHub check run with: - Status: success/failure/neutral based on session phase - Details URL: link directly to the Amber session in the UI This makes sessions visible in the PR checks tab. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 013f33f commit 3b700de

1 file changed

Lines changed: 58 additions & 2 deletions

File tree

.github/workflows/amber-issue-handler.yml

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ permissions:
2828
contents: read
2929
issues: write
3030
pull-requests: write
31+
checks: write
3132

3233
jobs:
3334
# -- Issue: labeled ambient-code:auto-fix → fresh session prompt --
@@ -274,10 +275,45 @@ jobs:
274275
wait: 'true'
275276
timeout: '0'
276277

278+
- name: Post check run on PR
279+
if: >-
280+
always()
281+
&& steps.context.outputs.is_fork != 'true'
282+
&& steps.context.outputs.type == 'pr'
283+
env:
284+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
285+
run: |
286+
SESSION_NAME="${{ steps.fix-session.outputs.session-name || steps.fix-issue-session.outputs.session-name || steps.custom-session.outputs.session-name }}"
287+
SESSION_URL="${{ steps.fix-session.outputs.session-url || steps.fix-issue-session.outputs.session-url || steps.custom-session.outputs.session-url }}"
288+
SESSION_PHASE="${{ steps.fix-session.outputs.session-phase || steps.fix-issue-session.outputs.session-phase || steps.custom-session.outputs.session-phase }}"
289+
290+
if [ -z "$SESSION_NAME" ]; then
291+
exit 0
292+
fi
293+
294+
# Get PR head SHA
295+
HEAD_SHA=$(gh pr view ${{ steps.context.outputs.number }} --repo "${{ github.repository }}" --json headRefOid --jq '.headRefOid')
296+
297+
# Map session phase to check conclusion
298+
case "$SESSION_PHASE" in
299+
Completed|Running) CONCLUSION="success" ;;
300+
Error|Failed) CONCLUSION="failure" ;;
301+
*) CONCLUSION="neutral" ;;
302+
esac
303+
304+
gh api "repos/${{ github.repository }}/check-runs" \
305+
-X POST \
306+
-f "name=Amber Session" \
307+
-f "head_sha=$HEAD_SHA" \
308+
-f "status=completed" \
309+
-f "conclusion=$CONCLUSION" \
310+
-f "details_url=$SESSION_URL" \
311+
-f "output[title]=Amber — ${{ steps.context.outputs.prompt_type }} prompt" \
312+
-f "output[summary]=Session \`$SESSION_NAME\` (phase: $SESSION_PHASE)" || true
313+
277314
- name: Session summary
278315
if: always() && steps.context.outputs.is_fork != 'true'
279316
run: |
280-
# Get session name from whichever step ran (only one will have output)
281317
SESSION_NAME="${{ steps.fix-session.outputs.session-name || steps.fix-issue-session.outputs.session-name || steps.custom-session.outputs.session-name }}"
282318
SESSION_PHASE="${{ steps.fix-session.outputs.session-phase || steps.fix-issue-session.outputs.session-phase || steps.custom-session.outputs.session-phase }}"
283319
@@ -369,6 +405,24 @@ jobs:
369405
print(f" Failed to start session: {e}")
370406
return False
371407
408+
def post_check_run(pr_number, session_name, status="in_progress"):
409+
"""Post a check run on the PR linking to the Amber session."""
410+
head_sha = gh("pr", "view", str(pr_number), "--repo", REPO, "--json", "headRefOid", "--jq", ".headRefOid")
411+
if not head_sha:
412+
return
413+
api_url_base = API_URL.rstrip("/").replace("/api", "")
414+
session_url = f"{api_url_base}/projects/{PROJECT}/sessions/{session_name}"
415+
conclusion = "success" if status == "completed" else "neutral"
416+
gh("api", f"repos/{REPO}/check-runs",
417+
"-X", "POST",
418+
"-f", "name=Amber Session",
419+
"-f", f"head_sha={head_sha}",
420+
"-f", "status=completed",
421+
"-f", f"conclusion={conclusion}",
422+
"-f", f"details_url={session_url}",
423+
"-f", "output[title]=Amber — batch fix",
424+
"-f", f"output[summary]=Session `{session_name}` triggered for PR #{pr_number}")
425+
372426
def create_session_api(prompt, session_name="", model="claude-opus-4-6"):
373427
"""Create a new session or send message to existing one."""
374428
@@ -476,7 +530,9 @@ jobs:
476530
5. Do not merge. Do not close. Do not force-push.
477531
6. If fundamentally broken beyond repair, add a comment explaining and stop."""
478532
479-
create_session_api(prompt, session_name=session_id)
533+
result_name = create_session_api(prompt, session_name=session_id)
534+
if result_name:
535+
post_check_run(number, result_name)
480536
481537
# Increment retry_count in frontmatter so circuit breaker advances
482538
if fm:

0 commit comments

Comments
 (0)