Not in the top 1,000 by GitHub stars

GGGODLIN/claude-pr-review

Multi-axis PR review orchestration for Claude Code — 5 independent review perspectives, symmetric cross-verification, deterministic coverage assertion

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

skills/bitbucket-pr-mutation/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 4aa8f53d35a6

No earlier version was observed for comparison.

Compare on GitHub

skills/bitbucket-pr-review/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 4aa8f53d35a6

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 4aa8f53d35a6fb73f0472152c83d59a3a8057d57

114GitHub stars
0stars in 7 days
2skills in this repository
0commits in 30 days

Heat

0.3
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Oct 25, 2026114

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

bitbucket-pr-mutation

When your agent uses it

Use when a user asks Claude Code to create a Bitbucket pull request or perform any Bitbucket PR write, including description, title, state, review-decision or comment changes, merges, teammate-authored PR changes, and unsupported mutations. Do not use for read-only PR review, diff, status, or metadata queries.

What it loads into context

Frontmatter

75 tokens

Always available to the agent

SKILL.md

2,425 tokens

When the skill is activated

Reference documents

0 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Route
  2. Existing PR hard stop
  3. Scope and approval
  4. Self-Verify
  5. Apply
  6. 踩過的坑

Scripts executed separately

  • scripts/bitbucket_pr_workflow.py
  • scripts/bitbucket_pr_workflow/__init__.py
  • scripts/bitbucket_pr_workflow/api.py
  • scripts/bitbucket_pr_workflow/core.py
  • scripts/bitbucket_pr_workflow/description.py
  • scripts/bitbucket_pr_workflow/executor.py
  • scripts/bitbucket_pr_workflow/review.py
  • scripts/tests/test_api.py
  • scripts/tests/test_cli.py
  • scripts/tests/test_core.py
  • scripts/tests/test_description.py
  • scripts/tests/test_executor.py
  • scripts/tests/test_no_raw_bitbucket_writes.py
  • scripts/tests/test_review.py
  • scripts/tests/test_support.py

Files

  • SKILL.mdcore13,105 bytes
  • SKILL.mdcore13,105 bytes
  • scripts/bitbucket_pr_workflow.pyruns4,997 bytes
  • scripts/bitbucket_pr_workflow/__init__.pyruns253 bytes
  • scripts/bitbucket_pr_workflow/api.pyruns7,993 bytes
  • scripts/bitbucket_pr_workflow/core.pyruns2,510 bytes
  • scripts/bitbucket_pr_workflow/description.pyruns5,577 bytes
  • scripts/bitbucket_pr_workflow/executor.pyruns67,064 bytes
  • scripts/bitbucket_pr_workflow/review.pyruns7,121 bytes
  • scripts/tests/test_api.pyruns22,178 bytes
  • scripts/tests/test_cli.pyruns23,301 bytes
  • scripts/tests/test_core.pyruns2,091 bytes
  • scripts/tests/test_description.pyruns3,321 bytes
  • scripts/tests/test_executor.pyruns76,166 bytes
  • scripts/tests/test_no_raw_bitbucket_writes.pyruns8,358 bytes
  • scripts/tests/test_review.pyruns9,293 bytes
  • scripts/tests/test_support.pyruns9,790 bytes
Read SKILL.md

# Bitbucket PR Mutation

All first-party writes use `scripts/bitbucket_pr_workflow.py`; never use raw curl or another client.

## Route

- Read-only review or diff: use `bitbucket-pr-review`.
- Read-only status or metadata: outside this skill.
- V1: `create_pr`, `update_description`, `update_title`, `create_inline_comment`, `create_pr_comment`.
- Other writes: draft only and state `UNSUPPORTED_OPERATION`.

## Existing PR hard stop

Every existing-PR write first runs `inspect --input ...` with target metadata and optional drafts only. This read-only preflight returns the actor/author snapshot without requiring review basis or operations.
View the complete source on GitHub

Skills included

  • bitbucket-pr-mutation
  • bitbucket-pr-review

Repository facts

License
MIT
Created
Aug 11, 2026
Last pushed
Sep 18, 2026
Forks
10
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 20 notes
  • skills/bitbucket-pr-mutation/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/bitbucket-pr-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 120 signals by file

skills/bitbucket-pr-mutation/SKILL.md

  • Network accessline 8
    All first-party writes use `scripts/bitbucket_pr_workflow.py`; never use raw curl or another client.
  • Network accessline 85
    - Unsupported and foreign-author writes must still trigger this skill before the hard stop. - Scope and apply in one message still means scope-only. - Raw curl or a generic client is never a shortcut.
  • Network accessline 86
    - Scope and apply in one message still means scope-only. - Raw curl or a generic client is never a shortcut. - The author/state stop was originally one blanket check sitting above operation parsing, so it blocked comments on a teammate's PR
  • Network accessline 87
    - Raw curl or a generic client is never a shortcut.

skills/bitbucket-pr-mutation/scripts/bitbucket_pr_workflow.py

  • Executable scriptline 1
    Executable file
  • Network accessline 25
    BASE_URL = 'https://api.bitbucket.org/2.0'
  • Access to secretsline 61
    [Credential-related source omitted]
  • Access to secretsline 62
    [Credential-related source omitted]

skills/bitbucket-pr-mutation/scripts/bitbucket_pr_workflow/__init__.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/bitbucket_pr_workflow/api.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    import base64 import http.client
  • Network accessline 4
    import http.client
  • Network accessline 28
    def redirect_request(     self,     req: urllib.request.Request,
  • Network accessline 29
    self,     req: urllib.request.Request,     fp: IO[bytes],
  • Network accessline 30
    req: urllib.request.Request,
  • Network accessline 32
    code: int,     msg: str,     headers: http.client.HTTPMessage,
  • Network accessline 33
    msg: str,     headers: http.client.HTTPMessage,     newurl: str,
  • Network accessline 34
    headers: http.client.HTTPMessage,
  • Network accessline 81
    path: str,   payload: bytes | None, ) -> tuple[urllib.request.Request | None, urllib.request.OpenerDirector | None]:
  • Network accessline 82
    payload: bytes | None, ) -> tuple[urllib.request.Request | None, urllib.request.OpenerDirector | None]:   try:
  • Network accessline 83
    ) -> tuple[urllib.request.Request | None, urllib.request.OpenerDirector | None]:
  • Network accessline 85
    [Credential-related source omitted]
  • Network accessline 86
    [Credential-related source omitted]
  • Network accessline 87
    request = urllib.request.Request(
  • Network accessline 110
    def _perform_request(   request: urllib.request.Request,
  • Network accessline 111
    request: urllib.request.Request,

skills/bitbucket-pr-mutation/scripts/bitbucket_pr_workflow/core.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/bitbucket_pr_workflow/description.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/bitbucket_pr_workflow/executor.py

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 189
    decoded = base64.b64decode(token, validate=True)

skills/bitbucket-pr-mutation/scripts/bitbucket_pr_workflow/review.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/tests/test_api.py

  • Executable scriptline 1
    Executable file
  • Network accessline 26
    def open(self, _request, timeout):     raise urllib.error.HTTPError(       'https://example.invalid/2.0/user',
  • Network accessline 27
    raise urllib.error.HTTPError(       'https://example.invalid/2.0/user',       403,
  • Network accessline 28
    'https://example.invalid/2.0/user',
  • Network accessline 152
    def test_client_repr_hides_credentials(self):     client = BitbucketClient(       'https://example.invalid/2.0',
  • Network accessline 153
    client = BitbucketClient(       'https://example.invalid/2.0',       'user@example.com',
  • Network accessline 154
    'https://example.invalid/2.0',
  • Network accessline 163
    def test_client_equality_includes_credentials(self):     first = BitbucketClient('https://example.invalid/2.0', 'first@example.com', 'token-a')
  • Network accessline 164
    first = BitbucketClient('https://example.invalid/2.0', 'first@example.com', 'token-a')
  • Network accessline 165
    same = BitbucketClient('https://example.invalid/2.0', 'first@example.com', 'token-a')
  • Network accessline 166
    different = BitbucketClient('https://example.invalid/2.0', 'second@example.com', 'token-b')
  • Network accessline 238
    def test_read_failure_closes_response_once(self):     prepared = urllib.request.Request('https://example.invalid/2.0/user')
  • Network accessline 239
    prepared = urllib.request.Request('https://example.invalid/2.0/user')
  • Network accessline 243
    return_value=(prepared, ReadFailureOpener(response)),     ):       client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'read-secret-token')
  • Network accessline 244
    ):       client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'read-secret-token')       error, frame_count, local_values = capture_failure(client.get_user)
  • Network accessline 245
    client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'read-secret-token')
  • Network accessline 257
    def test_success_response_close_failure_does_not_override_result(self):     prepared = urllib.request.Request('https://example.invalid/2.0/user')
  • Network accessline 258
    prepared = urllib.request.Request('https://example.invalid/2.0/user')
  • Network accessline 261
    return_value=(prepared, SuccessCloseFailureOpener()),     ):       client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'close-secret-token')
  • Network accessline 262
    ):       client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'close-secret-token')       self.assertEqual(client.get_user()['uuid'], '{actor}')
  • Network accessline 263
    client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'close-secret-token')
  • Network accessline 266
    def test_http_error_close_failure_preserves_sanitized_status(self):     prepared = urllib.request.Request('https://example.invalid/2.0/user')
  • Network accessline 267
    prepared = urllib.request.Request('https://example.invalid/2.0/user')
  • Network accessline 270
    return_value=(prepared, HttpErrorOpener()),     ):       client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'close-secret-token')
  • Network accessline 271
    ):       client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'close-secret-token')       error, frame_count, local_values = capture_failure(client.get_user)
  • Network accessline 272
    client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'close-secret-token')
  • Network accessline 328
    def test_serialization_failure_hides_token_from_traceback_locals(self):     client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'serialization-secret-token')
  • Network accessline 329
    client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'serialization-secret-token')
  • Network accessline 338
    def test_unexpected_serialization_failure_hides_request_data(self):     client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'runtime-secret-token')
  • Network accessline 339
    client = BitbucketClient('https://example.invalid/2.0', 'user@example.com', 'runtime-secret-token')
  • Network accessline 356
    def test_invalid_url_hides_token_from_traceback_locals(self):     client = BitbucketClient('http://[invalid', 'user@example.com', 'url-secret-token')
  • Network accessline 357
    client = BitbucketClient('http://[invalid', 'user@example.com', 'url-secret-token')
  • Network accessline 364
    def test_non_loopback_http_is_rejected_before_transport(self):     client = BitbucketClient('http://example.invalid/2.0', 'user@example.com', 'http-secret-token')
  • Network accessline 365
    client = BitbucketClient('http://example.invalid/2.0', 'user@example.com', 'http-secret-token')
  • Access to secretsline 388
    [Credential-related source omitted]
  • Network accessline 452
    def test_connection_failure_is_sanitized_transport_error(self):     with socket.socket() as listener:
  • Network accessline 453
    with socket.socket() as listener:
  • Network accessline 454
    listener.bind(('127.0.0.1', 0))       host, port = listener.getsockname()       client = BitbucketClient(f'http://{host}:{port}/2.0', 'user@example.com', 'secret-token', 0.1)
  • Network accessline 455
    host, port = listener.getsockname()       client = BitbucketClient(f'http://{host}:{port}/2.0', 'user@example.com', 'secret-token', 0.1)       error, frame_count, local_values = capture_failure(client.get_user)
  • Network accessline 456
    client = BitbucketClient(f'http://{host}:{port}/2.0', 'user@example.com', 'secret-token', 0.1)

skills/bitbucket-pr-mutation/scripts/tests/test_cli.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 25
    [Credential-related source omitted]
  • Access to secretsline 183
    [Credential-related source omitted]

skills/bitbucket-pr-mutation/scripts/tests/test_core.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/tests/test_description.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/tests/test_executor.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/tests/test_no_raw_bitbucket_writes.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 7
    [Credential-related source omitted]
  • Access to secretsline 9
    [Credential-related source omitted]
  • Access to secretsline 10
    [Credential-related source omitted]
  • Network accessline 134
    def test_curl_implicit_post_options_are_write_patterns(self):     commands = (       'curl --data "{}" https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',
  • Network accessline 135
    commands = (       'curl --data "{}" https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',       'curl --data-binary @payload.json https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',
  • Network accessline 136
    'curl --data "{}" https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',
  • Network accessline 137
    'curl --data-binary @payload.json https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',
  • Network accessline 138
    'curl --json "{}" https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',
  • Network accessline 139
    'curl -d "{}" https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',
  • Network accessline 140
    'curl -d@payload.json https://api.bitbucket.org/2.0/repositories/ws/repo/pullrequests/1/comments',

skills/bitbucket-pr-mutation/scripts/tests/test_review.py

  • Executable scriptline 1
    Executable file

skills/bitbucket-pr-mutation/scripts/tests/test_support.py

  • Executable scriptline 1
    Executable file
  • Network accessline 63
    def base_url(self) -> str:     host, port = self.server.server_address     return f'http://{host}:{port}/2.0'
  • Network accessline 65
    return f'http://{host}:{port}/2.0'
  • Network accessline 79
    payload = handler.rfile.read(length) if length else b''     parsed = json.loads(payload.decode('utf-8')) if payload else None     self.requests.append(CapturedRequest(handler.command, handler.path, payload, parsed))
  • Network accessline 80
    parsed = json.loads(payload.decode('utf-8')) if payload else None     self.requests.append(CapturedRequest(handler.command, handler.path, payload, parsed))     if not self.routes:
  • Network accessline 81
    self.requests.append(CapturedRequest(handler.command, handler.path, payload, parsed))
  • Network accessline 149
    'state': state,       'title': title,       'links': {'html': {'href': 'https://bitbucket.example/pr/7'}},
  • Network accessline 150
    'title': title,       'links': {'html': {'href': 'https://bitbucket.example/pr/7'}},     }
  • Network accessline 151
    'links': {'html': {'href': 'https://bitbucket.example/pr/7'}},
  • Network accessline 248
    'links': {           'html': {             'href': f'https://bitbucket.example/comment/{comment_id}',
  • Network accessline 249
    'html': {             'href': f'https://bitbucket.example/comment/{comment_id}',           },
  • Network accessline 250
    'href': f'https://bitbucket.example/comment/{comment_id}',
  • Network accessline 277
    'state': 'OPEN',         'title': body['title'],         'links': {'html': {'href': 'https://bitbucket.example/pr/8'}},
  • Network accessline 278
    'title': body['title'],         'links': {'html': {'href': 'https://bitbucket.example/pr/8'}},       }
  • Network accessline 279
    'links': {'html': {'href': 'https://bitbucket.example/pr/8'}},

skills/bitbucket-pr-review/SKILL.md

  • Network accessline 8
    > ⚠<U+FE0F> **本檔在契約測試底下**:`skills/bitbucket-pr-mutation/scripts/tests/test_no_raw_bitbucket_writes.py` 會讀本檔做內容斷言,並掃描全檔有無 raw curl POST/PUT/DELETE。改完跑:
  • Network accessline 18
    [Credential-related source omitted]
  • Network accessline 20
    - API Base: `https://api.bitbucket.org/2.0`
  • Network accessline 24
    **Step 0 — ALWAYS use `bb_api.sh`, NEVER raw curl with hand-crafted auth.** The helper handles token loading + Basic Auth + 302 redirects (`-sL`) in one place. Raw curl with manual `-u` flags has caused repeated 401s + diff-endpoint-returns
  • Network accessline 30
    That's it for read endpoints. Do not paste your own `curl -u ...` even "just to test"—the failure modes (401 / empty diff / wrong account) are the exact bugs this skill exists to prevent.
  • Network accessline 43
    If 401, the scoped API token may have expired. Direct user to regenerate at: https://id.atlassian.com/manage-profile/security/api-tokens
  • Network accessline 44
    https://id.atlassian.com/manage-profile/security/api-tokens
  • Network accessline 51
    Extract workspace, repo, and PR ID from the URL: `https://bitbucket.org/{workspace}/{repo}/pull-requests/{id}`
  • Network accessline 52
    `https://bitbucket.org/{workspace}/{repo}/pull-requests/{id}`

skills/bitbucket-pr-review/scripts/bb_api.sh

  • Executable scriptline 1
    #!/bin/bash
  • Access to secretsline 21
    [Credential-related source omitted]
  • Access to secretsline 29
    [Credential-related source omitted]
  • Network accessline 39
    ENDPOINT="$1" BASE_URL="https://api.bitbucket.org/2.0"
  • Network accessline 40
    BASE_URL="https://api.bitbucket.org/2.0"
  • Network accessline 42
    [Credential-related source omitted]
  • Access to secretsline 42
    [Credential-related source omitted]

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Signal confidence: 120 facts

and 70 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md skills/bitbucket-pr-mutation/SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md skills/bitbucket-pr-mutation/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skills/bitbucket-pr-mutation/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skills/bitbucket-pr-mutation/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skills/bitbucket-pr-mutation/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md skills/bitbucket-pr-mutation/SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.