with one click
gh-discussion-replier
// Professional English replier for GitHub Discussions. Use when a feature request is implemented, a question is answered, or community engagement is needed. Automates replying via the GitHub GraphQL API.
// Professional English replier for GitHub Discussions. Use when a feature request is implemented, a question is answered, or community engagement is needed. Automates replying via the GitHub GraphQL API.
Orchestrates the full release preparation flow for a plugin — version sync across 7+ files, bilingual release notes creation, and commit message drafting. Use before submitting a PR. Does NOT push or create a PR; that is handled by pr-submitter.
Orchestrates the full release preparation flow for a plugin — version sync across 7+ files, bilingual release notes creation, and commit message drafting. Use before submitting a PR. Does NOT push or create a PR; that is handled by pr-submitter.
Use when inspecting UI bugs in OpenWebUI plugins, taking screenshots of plugin output, capturing console errors, testing Action/Filter/Pipe plugins in the chat interface, or verifying plugin installation in the Admin panel. Triggered by: plugin UI bug, Action HTML output, screenshot, console error, plugin not working, login, admin panel, chat test, function install.
Generates a standardized single-file i18n Python plugin template based on project standards. Use when starting a new plugin development to skip boilerplate writing.
Orchestrates the full release preparation flow for a plugin — version sync across 7+ files, bilingual release notes creation, and commit message drafting. Use before submitting a PR. Does NOT push or create a PR; that is handled by pr-submitter.
Commit and push code to GitHub, then publish to OpenWebUI official marketplace without updating version. Use when fixing bugs or optimizing performance that doesn't warrant a version bump.
| name | gh-discussion-replier |
| description | Professional English replier for GitHub Discussions. Use when a feature request is implemented, a question is answered, or community engagement is needed. Automates replying via the GitHub GraphQL API. |
The gh-discussion-replier skill enables posting professional English replies to GitHub Discussions. Unlike issues, discussions use the GraphQL API for both reading and posting. This skill handles the full workflow: fetching context, checking star status, composing a reply, and posting.
bash .github/skills/gh-discussion-replier/scripts/check_discussion_star.sh <discussion_number>addDiscussionComment mutation (see below).import subprocess, json
def get_discussion(owner, repo, number):
query = '''
query($owner:String!, $repo:String!, $number:Int!) {
repository(owner:$owner, name:$repo) {
discussion(number:$number) {
id title body
author { login }
category { name }
comments(first:10) { nodes { body author { login } } }
}
}
}
'''
r = subprocess.run(['gh', 'api', 'graphql',
'-f', f'query={query}',
'-f', f'owner={owner}',
'-f', f'repo={repo}',
'-f', f'number={number}'],
capture_output=True, text=True)
return json.loads(r.stdout)['data']['repository']['discussion']
bash .github/skills/gh-discussion-replier/scripts/check_discussion_star.sh <discussion_number>
import subprocess, json
def post_discussion_reply(discussion_node_id, body):
mutation = '''
mutation($body:String!, $discussionId:ID!) {
addDiscussionComment(input:{body:$body, discussionId:$discussionId}) {
comment { id url }
}
}
'''
r = subprocess.run(['gh', 'api', 'graphql',
'-f', f'query={mutation}',
'-f', f'body={body}',
'-f', f'discussionId={discussion_node_id}'],
capture_output=True, text=True)
return json.loads(r.stdout)
import subprocess, json
OWNER = "Fu-Jie"
REPO = "openwebui-extensions"
# 1. Get discussion
disc = get_discussion(OWNER, REPO, 66)
disc_id = disc['id']
author = disc['author']['login']
category = disc['category']['name']
print(f"#{66} [{category}] by @{author}: {disc['title']}")
# 2. Check star
star_result = subprocess.run(
['bash', '.github/skills/gh-discussion-replier/scripts/check_discussion_star.sh', '66'],
capture_output=True, text=True)
has_starred = star_result.returncode == 0
# 3. Compose reply (select template based on category and star status)
body = "Your reply here..."
if not has_starred:
body += "\n\nIf you find this helpful, a star on [openwebui-extensions](https://github.com/Fu-Jie/openwebui-extensions) would be much appreciated! ⭐"
# 4. Post
result = post_discussion_reply(disc_id, body)
print(f"Posted: {result['data']['addDiscussionComment']['comment']['url']}")
| Category | Tone | Typical Action |
|---|---|---|
| Ideas | Appreciative, solution-oriented | Acknowledge or announce implementation |
| Q&A | Helpful, educational | Answer with technical detail |
| General | Warm, conversational | Follow up or redirect |
| Show and Tell | Enthusiastic, curious | Acknowledge, ask if feature-worthy |