Works with the AI Agents you already use

    Claude CodeClaude CodeCursorCursorCodex CLICodex CLIMuseMuseDotsDots+21 more

    PR Description Writer — Summary, Changes + Test Plan

    1

    Unlike free PR writers, every line traces to your diff: summary, why, what changed per file, confirmed vs suggested tests, risks (migrations, deps, secrets), 3 titles. No invented tickets.

    $4

    Secure checkout via Stripe

    Money-back guarantee

    Converts to your local currency at checkout

    Security scanned
    PR Description Writer — Summary, Changes + Test Plan

    PR Description Writer — Summary, Changes + Test Plan

    Example session with this skill installed

    Draft the PR description for my branch fix-partition-usage -> main. Evidence below (git log --oneline main..HEAD, git diff --stat, git diff). Intent: hosts like [::1]:8080 broke because we split on ":".

    7203fea Fix IPv6 server name parsing
    de8429f Fix IPv6 session transactions

    src/flask/app.py | 11 +++++++----
    src/flask/testing.py | 2 +-
    tests/test_basic.py | 1 +
    tests/test_testing.py | 14 ++++++++++++++
    4 files changed, 23 insertions(+), 5 deletions(-)

    Tests I ran: pytest tests/test_testing.py::test_session_transaction_ipv6 tests/test_basic.py::test_run_from_config -> 9 passed on the branch; on main (514fc6b) the 2 new cases fail (2 failed, 7 passed).

    [full diff pasted: app.py run() now parses SERVER_NAME with urlsplit(f"//{server_name}") instead of server_name.partition(":"); testing.py session_transaction() uses urlsplit(ctx.request.host_url).hostname or "localhost"; new test case ("[::1]:8080" -> "::1", 8080) in test_run_from_config; new test test_session_transaction_ipv6]

    • Read your context and instructions
    • Compiled the pr description writer

    Pull request draft

    Recommended title

    Fix IPv6 host parsing in app.run() and test client session_transaction()

    Summary

    SERVER_NAME and request hosts were split on the first ":", so an IPv6 host such as [::1]:8080 was cut into the wrong host and port. Both places now parse the host with urllib.parse.urlsplit.

    Why

    "[::1]:8080".partition(":") returns host "[" and port ":1]:8080". With an IPv6 SERVER_NAME, app.run() picked the wrong host/port, and session_transaction() stored the session cookie for the wrong domain, so the next request did not see the session.

    What changed

    • src/flask/app.py (run): host and port come from urlsplit(f"//{server_name}"); port is used when it is not None (so port 0 still works); the t.cast(str, host) in the run_simple call is removed. (+7/-4)
    • src/flask/testing.py (session_transaction): cookie domain is urlsplit(ctx.request.host_url).hostname or "localhost". (+1/-1)
    • tests/test_basic.py: new test_run_from_config case [::1]:8080 -> host ::1, port 8080. (+1)
    • tests/test_testing.py: new test_session_transaction_ipv6 with base_url http://[::1]:8000/. (+14)

    Test plan

    • Confirmed: pytest tests/test_testing.py::test_session_transaction_ipv6 tests/test_basic.py::test_run_from_config -> 9 passed with this change (merge commit 05e9c6b).
    • Confirmed: the same 2 new cases fail on main before this change (514fc6b: 2 failed, 7 passed).
    • Suggested: run the full suite; app.run() with SERVER_NAME="localhost:0" and "localhost" (no port) should behave as before.

    Risks / rollout

    • Low. Behaviour changes only where the old split was wrong (hosts with extra colons). A SERVER_NAME with a non-numeric port now raises in urlsplit(...).port instead of in int(sn_port); same failure, different message.
    • No migrations, no new dependencies, no config changes. No secrets in the diff.

    Issue / ticket refs

    • None given. Not adding one.

    Title alternatives

    1. Parse IPv6 hosts with urlsplit instead of partition(":")
    2. Fix SERVER_NAME and session cookie domain for IPv6 hosts
    3. Handle [::1]:port in app.run() and session_transaction()

    Red flags / ask author

    • Is a CHANGES.rst entry expected for this fix? None is in the diff.

    Evidence used: 2 commits, 4 files, 23+/5- (diff stat + full diff). Nothing inferred beyond the diff.

    Connects securely to your tools. The creator never sees your data.

    About this skill

    Commit → PR description → Review

    Unlike free PR description writers, every line here traces back to your diff: tests are marked Confirmed (you ran them) or Suggested, risks are flagged from the code (migrations, new dependencies, config, secrets), and no ticket number or result is ever invented.

    Sample output: real run on a merged public PR (pallets/flask #6096, 2 commits, 4 files, +23/-5), 20 Oct 2026

    SectionWhat the skill wrote (unedited excerpt)
    TitleFix IPv6 host parsing in app.run() and test client session_transaction()
    Why"[::1]:8080".partition(":") returns host "[", so app.run() and the session cookie used the wrong host
    What changedapp.py run: host/port via urlsplit(f"//{server_name}"), port 0 still works (+7/-4); testing.py: cookie domain from urlsplit(host_url).hostname (+1/-1)
    Test planConfirmed: 9 passed with the change; the 2 new cases fail on main (2 failed, 7 passed). Suggested: full suite + SERVER_NAME without a port
    RisksLow; no migrations, no new dependencies, no secrets. Non-numeric port now fails in urlsplit instead of int()
    Ticket refs"None given. Not adding one."
    Ask authorIs a CHANGES.rst entry expected? None is in the diff

    Tested on a real public PR · works in Claude Code, Cursor and Codex · v1.0 updated Oct 2026 · questions answered within 24h

    Writing PR descriptions is a chore that leads to lazy summaries like "misc fixes" or "update files," which slows down reviews and hides risks. This skill turns raw git evidence into a description a busy reviewer can act on, and every claim is grounded in the diff.

    What it does

    • Evidence-based drafting: turns commit logs, diff hunks or a file list into a structured PR description (summary, why, what changed per file).
    • Risk flags: migrations, schema changes, new dependencies, config changes and secrets found in the diff go in a Risks section.
    • Test plan you can trust: steps you ran are marked Confirmed; everything else is marked Suggested.
    • Better titles: a recommended title plus 3 specific alternatives to replace vague branch names.
    • Integrity checks: no invented ticket numbers, CI results or numbers; missing facts become "ask author" questions.

    How it works

    1. Paste git log --oneline main..HEAD, git diff --stat and the diff (or the key hunks), plus one line of intent and any test output.
    2. The agent groups the changes by file and area and checks for risk patterns.
    3. You get the PR draft: title, summary, why, what changed, test plan, risks, ticket refs, title alternatives and questions for the author.
    4. Pick a title, confirm the suggested tests, paste it into GitHub, GitLab or Bitbucket.

    Who it's for

    Developers and leads who want reviewable PRs without writing them from scratch, and teams that want one consistent PR format.

    Pairs well with

    Known limitations

    Needs the diff or commit log pasted in (no direct access to private repositories). It does not open, push or merge PRs.

    How to use

    1. 1

      Connect your agent to the Agensi MCP

      Copy the prompt and paste it into Claude, ChatGPT, Cursor or any agent that supports MCP. It sets up the connection for you. Manual setup

    2. 2

      Sign in to Agensi

      Your agent shows a sign-in link. Sign in and click Allow.

    3. 3

      Ask for what you need

      Your agent loads this skill and uses it on your task. It always asks before any payment.

    Reviews

    No reviews yet

    Be one of the first to try it. Every listed skill goes through the trust checks below.

    Security scanned

    Checked by our 8-point scan before listing

    Fresh listing

    Recently published to Agensi

    Money-back guarantee

    Doesn't do what its page promises? You get your money back.

    Trust & safety

    Security scan

    Security scan passed 1 month ago

    Requires

    Git

    Listed1 month ago
    Updatedtoday

    What's inside

    Frequently Asked Questions