Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions .github/workflows/opencode.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
name: opencode
name: opencode-review

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]

jobs:
opencode:
review:
if: |
github.event_name == 'pull_request' ||
contains(github.event.comment.body, ' /oc') ||
startsWith(github.event.comment.body, '/oc') ||
contains(github.event.comment.body, ' /opencode') ||
Expand All @@ -28,6 +31,6 @@ jobs:
- name: Run opencode
uses: anomalyco/opencode/github@latest

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

opencode github action available models minimax provider list

💡 Result:

OpenCode GitHub Action (anomalyco/opencode) does not appear to expose a single, static “available models for the MiniMax provider” list in its docs. Instead, OpenCode’s model support is driven by its internal/Models.dev registry; the model IDs you can use depend on what OpenCode has registered for the MiniMax provider at runtime. What we can confirm from current, cited sources: 1) Model ID format OpenCode expects the model string in the form provider_id/model_id [1]. 2) MiniMax model IDs that are used successfully with the OpenCode GitHub Action A public example workflow using the GitHub Action with MiniMax specifies the model as minimax/MiniMax-M2.7 [2]. 3) MiniMax models referenced in OpenCode docs (examples, not exhaustive) OpenCode’s “Models” documentation lists Minimax M2.1 as an example model (not stated as exhaustive) [1]. 4) Evidence that MiniMax provider model availability can lag or be incomplete An OpenCode GitHub Action issue shows that using minimax/MiniMax-M2.1 caused ProviderModelNotFoundError (suggestions empty), indicating that, at least at that time, OpenCode’s registry did not recognize that modelID for the MiniMax provider in the GitHub Action context [3]. Another issue notes that when a MiniMax model wasn’t on a model list, it was later merged/available [4]. 5) How to get the complete, authoritative list (recommended) OpenCode provides an endpoint to fetch the full list of available models and metadata: https://opencode.ai/zen/v1/models [5]. This is the closest thing to an up-to-date “provider -> models” list you can rely on, since the docs explicitly say the list is not necessarily exhaustive [1]. Practical answer to your “provider list” request - MiniMax provider ID (as used in OpenCode model IDs): minimax [2]. - MiniMax model IDs you can try today (from sources above): minimax/MiniMax-M2.7 [2], and minimax/MiniMax-M2.1 [1] (but note the provider-model registry can be temporarily out of sync, as shown in [3]). If you want, paste the output of https://opencode.ai/zen/v1/models filtered for providerId=miniMax (or share the raw JSON), and I can extract the exact MiniMax model IDs for 2026-06-02 from it.

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Show relevant workflow lines (around 32 and 36)
echo "=== .github/workflows/opencode.yml (around 25-45) ==="
nl -ba .github/workflows/opencode.yml | sed -n '20,50p'

echo
echo "=== Fetch OpenCode models endpoint and search for minimax-m2.5-free ==="
# Fetch and search; be resilient to minor JSON shape differences
curl -fsSL 'https://opencode.ai/zen/v1/models' | python3 - <<'PY'
import json,sys
data=json.load(sys.stdin)

def walk(obj):
    if isinstance(obj, dict):
        for k,v in obj.items():
            yield (k,v)
            yield from walk(v)
    elif isinstance(obj, list):
        for i,v in enumerate(obj):
            yield (i,v)
            yield from walk(v)

text_matches=[]
needle_substrings=[
  "minimax-m2.5-free",
  "Minimax-M2.5-Free",
  "minimax/m2.5",
  "M2.5-free",
  "m2.5-free",
  "opencode/minimax-m2.5-free",
]
# Convert whole JSON to string for robust substring checks
s=json.dumps(data)
for n in needle_substrings:
    if n in s:
        text_matches.append(n)

print("Substrings found in models JSON:", text_matches)

# If the JSON includes modelId fields, attempt to enumerate them
model_ids=set()
def collect(obj):
    if isinstance(obj, dict):
        for k,v in obj.items():
            if k.lower() in ("modelid","model_id","id","model","modelId".lower()):
                if isinstance(v,str):
                    model_ids.add(v)
            collect(v)
    elif isinstance(obj, list):
        for v in obj:
            collect(v)

collect(data)
# Print only those model ids containing minimax-m2.5-free / minimax
hits=sorted([mid for mid in model_ids if ("minimax" in mid.lower())])
print("Minimax-like model IDs discovered (showing up to 50):")
for mid in hits[:50]:
    print(" -", mid)

print()
target_exact="minimax-m2.5-free"
exact_hits=[mid for mid in model_ids if mid==target_exact or mid.lower()==target_exact]
print("Exact modelId matches for 'minimax-m2.5-free':", exact_hits)

# Also check provider/model composite formats if present
composites=[mid for mid in model_ids if "minimax" in mid.lower() and "/" in mid]
print("Composite IDs containing '/' and 'minimax' (up to 50):")
for mid in composites[:50]:
    print(" -", mid)
PY

Repository: creatorcluster/renderdragon.org

Length of output: 190


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== .github/workflows/opencode.yml (around 25-50) ==="
awk 'NR>=25 && NR<=50 {printf "%d\t%s\n", NR, $0}' .github/workflows/opencode.yml

echo
echo "=== Fetch OpenCode models endpoint and search for minimax-m2.5-free + minimax/m2.5 ==="
curl -fsSL 'https://opencode.ai/zen/v1/models' | python3 - <<'PY'
import json,sys
data=json.load(sys.stdin)

s=json.dumps(data)

needles=[
  "opencode/minimax-m2.5-free",
  "minimax-m2.5-free",
  "Minimax-M2.5-Free",
  "m2.5-free",
  "M2.5-free",
  "minimax-m2.5",
  "minimax/m2.5",
  "minimax/MiniMax-M2.5",
  "minimax/MiniMax-M2.5-Free",
]
found=[n for n in needles if n in s]
print("Needle substrings found in models JSON:", found)

model_ids=set()
def collect(obj):
    if isinstance(obj, dict):
        for k,v in obj.items():
            lk=k.lower()
            if lk in ("modelid","model_id","modelid".lower(),"modelid".lower()):
                if isinstance(v,str):
                    model_ids.add(v)
            # sometimes model id is under "id" or "modelId"
            if lk in ("modelid","model_id","modelid".lower(),"modelid".lower(),"modelid".lower(),"id","modelid"):
                pass
            if lk in ("modelid","model_id","modelid".lower()):
                pass
            # generic capture of likely id fields
            if lk in ("modelid","model_id","model","id","modelId"):
                if isinstance(v,str) and ("minimax" in v.lower() or "opencode" in v.lower()):
                    model_ids.add(v)
            collect(v)
    elif isinstance(obj, list):
        for v in obj:
            collect(v)

collect(data)

hits=[mid for mid in model_ids if "minimax" in mid.lower() and "m2.5" in mid.lower()]
print("\nMinimax-like model IDs discovered with 'm2.5' in them:")
for mid in sorted(hits)[:200]:
    print(" -", mid)
print("Total minimax 'm2.5' hits:", len(hits))

# If providerId/modelId pairs exist, try to filter by providerId
def extract_pairs(obj):
    pairs=[]
    if isinstance(obj, dict):
        provider=None
        model=None
        for k,v in obj.items():
            lk=k.lower()
            if lk in ("providerid","provider_id","provider"):
                if isinstance(v,str): provider=v
            if lk in ("modelid","model_id","modelid","model","id","modelId"):
                if isinstance(v,str): model=v
        if provider and model and "minimax" in provider.lower() and "minimax" in model.lower():
            pairs.append((provider, model))
        for v in obj.values():
            pairs.extend(extract_pairs(v))
    elif isinstance(obj, list):
        for v in obj:
            pairs.extend(extract_pairs(v))
    return pairs

pairs=extract_pairs(data)
# Deduplicate
pairs=sorted(set(pairs))
print("\nProvider/model pairs found (showing minimax provider only, up to 100):")
for p in pairs[:100]:
    print(" -", p[0], "/", p[1])
print("Total pairs:", len(pairs))
PY

Repository: creatorcluster/renderdragon.org

Length of output: 1359


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Request headers + first bytes from https://opencode.ai/zen/v1/models ==="
curl -sS -i --max-time 20 'https://opencode.ai/zen/v1/models' | head -n 40

echo
echo "=== Attempt to extract any model IDs containing 'minimax' from the raw response (no JSON parsing) ==="
curl -sS --max-time 20 'https://opencode.ai/zen/v1/models' | python3 - <<'PY'
import sys, re
s=sys.stdin.read()
# Print substrings around minimax
for m in re.finditer(r'(?i)[a-z0-9_-]{0,40}minimax[a-z0-9/_-]{0,80}', s):
    print(m.group(0))
PY

Repository: creatorcluster/renderdragon.org

Length of output: 4248


Pin the OpenCode action ref and fix the MiniMax model ID

  • anomalyco/opencode/github@latest is a floating tag—pin to a release tag or commit SHA for reproducibility.
  • model: opencode/minimax-m2.5-free doesn’t match the models currently returned by https://opencode.ai/zen/v1/models (MiniMax models include minimax-m2.5 and minimax-m2.7, but not minimax-m2.5-free). Update model: accordingly.
🧰 Tools
🪛 zizmor (1.25.2)

[error] 32-32: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/opencode.yml at line 32, Replace the floating action ref
"anomalyco/opencode/github@latest" with a pinned release tag or commit SHA
(e.g., a specific vX.Y.Z tag or full commit hash) to ensure reproducible CI
runs, and update the OpenCode model value from "opencode/minimax-m2.5-free" to a
valid model returned by the API such as "opencode/minimax-m2.5" (or
"opencode/minimax-m2.7") so the workflow's model key matches the available
MiniMax model IDs.

env:
KILO_API_KEY: ${{ secrets.KILO_API_KEY }}
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
with:
model: z-ai/glm-5
model: opencode/minimax-m2.5-free
10 changes: 5 additions & 5 deletions src/components/Partnership.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ const Partnership = () => {
url: "https://discord.gg/wXhHe5bVgz",
},
{
name: "Decour SMP",
description: 'Home to the best SMP experience you can get.',
logo: "/Dcore.png",
url: "https://dsc.gg/decoursmp",
name: 'Moon SMP',
description: 'Moon SMP is a Grind Based PvP and economy server making it fun and challenging.',
logo: 'https://images-ext-1.discordapp.net/external/p9bRAl2A-0LjGwG3zVUKV2dCq55_QIvrUE_lmBaAr5A/%3Fsize%3D4096/https/cdn.discordapp.com/icons/1063123986537525298/61c13fc9f21bf93eb15a93774a15d4a2.png?format=webp&quality=lossless&width=192&height=192',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Ephemeral Discord proxy URL for partner logo

The Moon SMP logo uses an images-ext-1.discordapp.net external proxy URL. Discord's external image proxy links are not guaranteed to be stable — they can expire or become inaccessible over time, leaving a broken image on the partnerships page. The direct CDN URL embedded inside the proxy path (cdn.discordapp.com/icons/1063123986537525298/61c13fc9f21bf93eb15a93774a15d4a2.png) is more reliable, or the image should be downloaded and served from the project's own assets.

url: 'https://discord.gg/ZKzu7r9JZV',
},
];
return (
Expand All @@ -55,7 +55,7 @@ const Partnership = () => {
</p>
</motion.div>

<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
<div className="grid grid-cols-1 sm:grid-cols-3 gap-8 max-w-5xl mx-auto">
{partners.map((partner, i) => (
<motion.div
key={partner.name}
Expand Down
10 changes: 10 additions & 0 deletions src/pages/Contact.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,16 @@ const teamMembers: TeamMember[] = [
discord: "https://discordapp.com/users/758322333437394944",
},
},
{
name: "Utkrista",
role: "Team Member - Resource Manager",
Comment on lines +89 to +91

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Ephemeral Discord proxy URL for team member avatar

Utkrista's avatar uses an images-ext-1.discordapp.net external proxy URL, the same pattern as the Moon SMP logo. These Discord proxy links can expire or become inaccessible, causing the avatar to break on the Contact/Team page. Prefer the direct cdn.discordapp.com/avatars/893688296130105375/b2419c4ac0b5591c7ec8324467c404e6.png URL or host the image in the project's own assets alongside the other team member assets.

avatar:
"https://images-ext-1.discordapp.net/external/9x3KDeC4d_wC4I9pT-XOYA6bY7VpDR8KK0w2sNEujZg/%3Fsize%3D1024/https/cdn.discordapp.com/avatars/893688296130105375/b2419c4ac0b5591c7ec8324467c404e6.png?format=webp&quality=lossless&width=537&height=537",
socials: {
website: "https://utkrista.tech/launcher/",
discord: "https://discordapp.com/users/1298482806430629959",
},
},
Comment on lines +89 to +98

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Discord user ID mismatch detected.

The avatar URL contains Discord user ID 893688296130105375 (Line 92-93), but the Discord profile link references a different user ID 1298482806430629959 (Line 96). This mismatch indicates either the avatar or the Discord link is incorrect, which could lead to privacy concerns or broken functionality.

Please verify which Discord user ID is correct and update the corresponding URL.

🔍 Expected format for verification

The avatar URL format:

https://.../avatars/{USER_ID}/{AVATAR_HASH}...

The Discord profile URL format:

https://discordapp.com/users/{USER_ID}

Both {USER_ID} values should match for the same user.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/Contact.tsx` around lines 89 - 98, The Discord user ID in the team
member object for name "Utkrista" is inconsistent between the avatar URL
(contains user ID 893688296130105375) and the socials.discord link (contains
user ID 1298482806430629959); verify the correct Discord user ID for this user
and update either the avatar string or the socials.discord URL so both use the
same {USER_ID} and follow the expected formats (avatar:
.../avatars/{USER_ID}/{AVATAR_HASH}..., profile:
https://discordapp.com/users/{USER_ID}), ensuring the properties name, avatar
and socials.discord within that "Utkrista" object remain consistent.

];

const Contact = () => {
Expand Down
Loading