Works with the AI Agents you already use

    Claude CodeClaude CodeCursorCursorCodex CLICodex CLIMuseMuseDotsDots+22 more

    Writing Pull Requests — Conventional Titles & Descriptions

    1

    Writes a conventional-commit PR title, commit message and short description from your diff, printed in chat to paste.

    Free

    Security scanned
    Writing Pull Requests — Conventional Titles & Descriptions

    Writing Pull Requests — Conventional Titles & Descriptions

    Example session with this skill installed

    Write the PR for this branch.

    diff --git a/src/auth/password-reset.ts b/src/auth/password-reset.ts
    @@ -21,6 +21,9 @@ export async function resetPassword(token: string, newPassword: string) {
       const record = await resetTokens.findByHash(sha256(token));
       if (!record) {
         throw new InvalidTokenError();
       }
    +  if (record.expiresAt.getTime() <= clock.now()) {
    +    throw new InvalidTokenError();
    +  }
       await users.updatePassword(record.userId, newPassword);
     }
    diff --git a/src/auth/password-reset.test.ts b/src/auth/password-reset.test.ts
    @@ -42,0 +43,11 @@ describe('resetPassword', () => {
    +  it('should_reject_token_when_expired', async () => {
    +    const token = await givenResetToken({ expiresAt: minutesAgo(1) });
    +
    +    await expect(resetPassword(token, 'N3w-passw0rd!')).rejects.toThrow(InvalidTokenError);
    +  });
    +
    +  it('should_reject_token_when_now_equals_expiry', async () => {
    +    const token = await givenResetToken({ expiresAt: clock.now() });
    +
    +    await expect(resetPassword(token, 'N3w-passw0rd!')).rejects.toThrow(InvalidTokenError);
    +  });
    
    • Read your context and instructions
    • Compiled the writing pull requests

    Summary. One intent: password reset tokens were accepted after their expiry time. The type is fix, the scope is auth (both files are under src/auth/), and the change is a single PR with no split needed. Diff inspected:

    $ git diff --stat main..HEAD
     src/auth/password-reset.test.ts | 11 +++++++++++
     src/auth/password-reset.ts      |  3 +++
     2 files changed, 14 insertions(+)
    
    TITLE: fix(auth): Reject expired password reset tokens
    
    COMMIT MESSAGE: fix(auth): Reject expired password reset tokens
    
    DESCRIPTION:
    
    ## Objective
    Stop accepting password reset links after their expiry time, so a leaked or old reset link can no longer change a user's password.
    
    ## Changes
    - Reject reset tokens whose expiry time has passed, including the exact expiry instant
    - Return the same invalid-token error used for unknown tokens, so expired and unknown tokens look identical
    - Add tests for an expired token and for the boundary at the expiry instant
    
    ## Notes
    - Root cause: `expiresAt` was stored when the token was issued but never checked on redemption.
    - Users holding an expired link from before this deploy must request a new one.
    

    Title length: 47 characters (limit 72). Description: about 100 words (limit 150).

    Next steps

    1. Paste the block into your PR. Nothing was written to a file, and no git commit, add or push was run.
    2. Consider a follow-up PR to make reset tokens single-use. It's a separate intent, so keeping it out of this PR keeps the title free of "and".

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

    About this skill

    PR titles like "Fix bug" and descriptions that list every changed file waste reviewers' time. Agents add two more problems: they commit for you and add AI footers. This skill produces a title, commit message and description a reviewer can read in seconds, and leaves committing to you.

    Workflow:

    1. Inspect the diff with git status and git diff --stat against the base (or --cached for staged changes), and identify the affected module and the dominant intent.
    2. Pick one type from the conventional-commit table (feat, fix, docs, style, refactor, perf, test, chore). If two types tie, the change is mixed and it asks whether to split the PR.
    3. Pick a scope from the diff paths, or omit it. It never invents one.
    4. Write the title in imperative mood, 72 characters or fewer, capitalized after the colon, with no trailing period and no "and".
    5. Write the description: a one-sentence Objective (the outcome, not the implementation), up to 5 verb-led Changes bullets, and Notes only when needed. Notes become mandatory for migrations, flags and breaking changes. 150 words maximum.
    6. Print the block in chat.

    Reference files:

    • templates.md: variants for feature, fix, refactor, perf, test, docs, chore, revert and breaking change (! syntax).
    • examples.md: common mistakes next to corrected versions, such as vague titles, multi-purpose titles, wrong tense, restating the diff, and burying the why.
    • shared/.../communication.md: answer-first writing, so the first line says what the PR does and why it's safe to merge.

    It pushes back on empty or mixed diffs. A learnings/ folder holds project-specific scopes and vocabulary.

    Hard rules: output goes to the chat, never to a file. It never runs git commit, add or push, and never adds AI attribution, Co-Authored-By trailers or "Generated with" footers.

    Free and MIT-licensed, part of the claude-skills-czl collection.

    Source on GitHub: this skill · full repository

    How to use

    Skills on Agensi run inside your AI agent. Copy the prompt, paste it into your agent, and it connects to Agensi and installs this skill for you. If a payment is needed, your agent shows it to you first.

    Reviews

    No reviews yet

    Be one of the first to try it. Every listed skill passes our trust checks below.

    Security scanned

    Passed our 8-point scan before listing

    Fresh listing

    Recently published to Agensi

    Free forever

    No account required to browse

    Trust & safety

    Security scanned

    Verified clean 11 days ago

    • Free to download with an account

    Listed11 days ago

    What's inside

    Frequently Asked Questions