CODE-0002 · gemini-3.5-flash (default)
import re

SEMVER_REGEX = re.compile(
    r'^(?P<major>0|[1-9]\d*)\.'
    r'(?P<minor>0|[1-9]\d*)\.'
    r'(?P<patch>0|[1-9]\d*)'
    r'(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?'
    r'(?:\+(?P<build>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'
)

def parse_semver(s):
    if not isinstance(s, str):
        return None
    match = SEMVER_REGEX.match(s)
    if not match:
        return None
    
    gd = match.groupdict()
    return {
        "major": int(gd["major"]),
        "minor": int(gd["minor"]),
        "patch": int(gd["patch"]),
        "prerelease": gd["prerelease"],
        "build": gd["build"]
    }