From 139d836e81858378c1a8fb2f6af421571f5c8480 Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Tue, 17 Feb 2026 11:32:11 -0500 Subject: [PATCH] Swap lmstudio -> lmstudio-bin --- build/packages/shared.packages | 2 +- pkgbuilds/shared/lmstudio-bin/.SRCINFO | 23 ++ pkgbuilds/shared/lmstudio-bin/.gitignore | 9 + .../lmstudio-bin/LMStudio-bin Blueprint.md | 102 +++++++++ pkgbuilds/shared/lmstudio-bin/PKGBUILD | 41 ++++ .../shared/lmstudio-bin/PKGBUILD.template | 39 ++++ .../shared/lmstudio-bin/lmstudio-bin.install | 14 ++ .../shared/lmstudio-bin/lmstudio.desktop | 12 ++ pkgbuilds/shared/lmstudio-bin/lmstudio.png | Bin 0 -> 71002 bytes .../shared/lmstudio-bin/update_package.py | 204 ++++++++++++++++++ .../shared/lmstudio-bin/verify_git_hygiene.sh | 100 +++++++++ .../shared/lmstudio-bin/verify_system.sh | 49 +++++ pkgbuilds/shared/lmstudio/.SRCINFO | 20 -- pkgbuilds/shared/lmstudio/.nvchecker.toml | 3 - pkgbuilds/shared/lmstudio/PKGBUILD | 69 ------ 15 files changed, 594 insertions(+), 93 deletions(-) create mode 100644 pkgbuilds/shared/lmstudio-bin/.SRCINFO create mode 100644 pkgbuilds/shared/lmstudio-bin/.gitignore create mode 100644 pkgbuilds/shared/lmstudio-bin/LMStudio-bin Blueprint.md create mode 100644 pkgbuilds/shared/lmstudio-bin/PKGBUILD create mode 100644 pkgbuilds/shared/lmstudio-bin/PKGBUILD.template create mode 100644 pkgbuilds/shared/lmstudio-bin/lmstudio-bin.install create mode 100644 pkgbuilds/shared/lmstudio-bin/lmstudio.desktop create mode 100644 pkgbuilds/shared/lmstudio-bin/lmstudio.png create mode 100644 pkgbuilds/shared/lmstudio-bin/update_package.py create mode 100755 pkgbuilds/shared/lmstudio-bin/verify_git_hygiene.sh create mode 100755 pkgbuilds/shared/lmstudio-bin/verify_system.sh delete mode 100644 pkgbuilds/shared/lmstudio/.SRCINFO delete mode 100644 pkgbuilds/shared/lmstudio/.nvchecker.toml delete mode 100644 pkgbuilds/shared/lmstudio/PKGBUILD diff --git a/build/packages/shared.packages b/build/packages/shared.packages index 39888d9..c6b5f61 100644 --- a/build/packages/shared.packages +++ b/build/packages/shared.packages @@ -13,7 +13,7 @@ dropbox dropbox-cli github-copilot-cli hyprshade -lmstudio +lmstudio-bin localsend localsend-bin minecraft-launcher diff --git a/pkgbuilds/shared/lmstudio-bin/.SRCINFO b/pkgbuilds/shared/lmstudio-bin/.SRCINFO new file mode 100644 index 0000000..7901035 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/.SRCINFO @@ -0,0 +1,23 @@ +pkgbase = lmstudio-bin + pkgdesc = LM Studio - A desktop app for exploring and running large language models locally + pkgver = 0.4.2 + pkgrel = 2 + url = https://lmstudio.ai + install = lmstudio-bin.install + arch = x86_64 + license = EULA + depends = fuse2 + depends = zlib + depends = hicolor-icon-theme + depends = gtk3 + depends = nss + depends = libxcrypt-compat + options = !strip + source = https://installers.lmstudio.ai/linux/x64/0.4.2-2/LM-Studio-0.4.2-2-x64.AppImage + source = lmstudio.png + source = lmstudio.desktop + sha256sums = 2711a5aa0b2e2dc5bcd66388727b551521efd7dcd2168b880a1833fde81cf89d + sha256sums = 9f791789c959a11316328692807737a5f1bc1c170ae99ec04c56bfd8ee8263e5 + sha256sums = d5ac11aae025cd1cc0f9aa0713ee427dc6f46e4d1adac2a5948f93d8bbca705f + +pkgname = lmstudio-bin diff --git a/pkgbuilds/shared/lmstudio-bin/.gitignore b/pkgbuilds/shared/lmstudio-bin/.gitignore new file mode 100644 index 0000000..515c66a --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/.gitignore @@ -0,0 +1,9 @@ +pkg/ +src/ +*.AppImage +*.tar.gz +*.tar.xz +*.log +squashfs-root/ +__pycache__/ +*.pkg.tar.zst diff --git a/pkgbuilds/shared/lmstudio-bin/LMStudio-bin Blueprint.md b/pkgbuilds/shared/lmstudio-bin/LMStudio-bin Blueprint.md new file mode 100644 index 0000000..cd84b65 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/LMStudio-bin Blueprint.md @@ -0,0 +1,102 @@ +PROJECT BLUEPRINT: lmstudio-bin Maintenance Framework + +1. Executive Summary + +Project Name: lmstudio-bin + +Target Platform: Arch Linux (AUR) + +Upstream Software: LM Studio (Proprietary AppImage) + +This project provides an Arch User Repository (AUR) package for LM Studio. It employs a "Maintenance Bridge" architecture to convert dynamic upstream releases into deterministic, security-verified Arch Linux packages while adhering strictly to Arch Linux packaging standards for binary software. + +2. Core Objectives + +Correct Naming Convention: Utilize the -bin suffix as mandated by AUR guidelines for software distributed as pre-compiled binaries. + +Replacement of Legacy Packages: Explicitly provide and conflict with the abandoned lmstudio package to ensure a clean migration path for the community. + +Security & Determinism: Implement strict SHA256 checksum verification for every release, preventing "moving target" build failures. + +Full Desktop Integration: Ensure high-resolution icon support, XDG-compliant desktop entries, and taskbar grouping (StartupWMClass). + +3. Technical Architecture + +A. The Maintenance Engine (update_package.py) + +The heart of the project is a Python-based automation script that manages the lifecycle of a release. + +URL Resolution: Follows the latest redirect to identify the specific build version. + +Verification: Downloads the AppImage and calculates the SHA256 hash. + +Template Rendering: Injects metadata into PKGBUILD.template to produce a valid PKGBUILD. + +Metadata Generation: Automatically updates .SRCINFO for AUR indexing. + +B. Packaging Logic (PKGBUILD) + +The build process follows a specific lifecycle to ensure stability: + +Extraction Stage: Uses --appimage-extract within a temporary sandbox to access internal assets. + +Icon Strategy (Static Vendoring): +* Static Icon: The high-resolution (512x512) icon is vendored as `lmstudio.png` in the base repository. +* Optimization: Icons must be optimized to stay under the 500KB AUR repository blob limit. +* Rationale: Static vendoring prevents build-time extraction failures and ensures consistent visual presentation across versions without relying on internal AppImage layout stability. + +Binary Placement: Installs the AppImage to /opt/lm-studio/ and provides a symbolic link at /usr/bin/lm-studio. + +C. Lifecycle Management (.install) + +The .install script ensures the host system recognizes changes immediately upon installation, upgrade, or removal by triggering: + +update-desktop-database (Applications menu) + +gtk-update-icon-cache (Visual assets) + +4. Automation Workflow (For Orchestrator Reference) + +When updating to a new version, the orchestrator should follow this sequence: + +Sync: Pull latest changes from the AUR remote. + +Execute: Run ./update_package.py to fetch upstream changes and regenerate files. + +Validate: * Verify PKGBUILD version matches upstream. + +Run makepkg -f to test the build locally. + +Inspect pkg/ directory to ensure icon assets are present at /usr/share/icons/hicolor/512x512/apps/lmstudio-bin.png. + +Publish: * Refresh .SRCINFO (makepkg --printsrcinfo > .SRCINFO). + +Commit PKGBUILD, .SRCINFO, lmstudio.desktop, lmstudio.png, and lmstudio-bin.install. + +Push to origin master. + +5. Git Hygiene & AUR Constraints + +* Blob Limit: The AUR imposes a strict 512KB limit on individual file blobs. All vendored assets (like `lmstudio.png`) must be optimized to comply. +* Tracking Restrictions: Only source-of-truth files and metadata are permitted in the repository. Tracking of `src/` or `pkg/` directories is strictly prohibited. +* Verification: Use `verify_git_hygiene.sh` to audit the repository state before pushing to the AUR remote. + +6. Directory Structure + +. +├── PKGBUILD # Generated Arch Linux build script +├── PKGBUILD.template # Blueprint for the maintenance engine +├── .SRCINFO # AUR metadata index (auto-generated) +├── lmstudio.desktop # Desktop integration file +├── lmstudio.png # Static vendored icon (512x512) +├── lmstudio-bin.install # Post-install hooks for cache clearing +├── update_package.py # The Maintenance Engine script +├── verify_git_hygiene.sh # Hygiene enforcement script +└── LMStudio-bin Blueprint.md # This reference document + + +7. Maintenance Contacts & Authority + +Maintainer: madgoat (AUR) + +Package URL: https://aur.archlinux.org/packages/lmstudio-bin diff --git a/pkgbuilds/shared/lmstudio-bin/PKGBUILD b/pkgbuilds/shared/lmstudio-bin/PKGBUILD new file mode 100644 index 0000000..fd6b746 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/PKGBUILD @@ -0,0 +1,41 @@ +# Maintainer: noureddinex +pkgname=lmstudio-bin +pkgver=0.4.2 +pkgrel=2 +_pkgver=${pkgver}-${pkgrel} +pkgdesc="LM Studio - A desktop app for exploring and running large language models locally" +arch=('x86_64') +url="https://lmstudio.ai" +license=('EULA') +depends=('fuse2' 'zlib' 'hicolor-icon-theme' 'gtk3' 'nss' 'libxcrypt-compat') +options=('!strip') +install=lmstudio-bin.install +source=("https://installers.lmstudio.ai/linux/x64/${_pkgver}/LM-Studio-${_pkgver}-x64.AppImage" + "lmstudio.png" + "lmstudio.desktop") +sha256sums=('2711a5aa0b2e2dc5bcd66388727b551521efd7dcd2168b880a1833fde81cf89d' + '9f791789c959a11316328692807737a5f1bc1c170ae99ec04c56bfd8ee8263e5' + 'd5ac11aae025cd1cc0f9aa0713ee427dc6f46e4d1adac2a5948f93d8bbca705f') + +prepare() { + chmod +x "${srcdir}/${source[0]##*/}" +} + +package() { + # Create installation directory + install -dm755 "$pkgdir/opt/lm-studio" + + # Install AppImage + install -Dm755 "${srcdir}/${source[0]##*/}" "$pkgdir/opt/lm-studio/lm-studio.AppImage" + + # Install static icon + install -Dm644 "${srcdir}/lmstudio.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/lmstudio-bin.png" + install -Dm644 "${srcdir}/lmstudio.png" "${pkgdir}/usr/share/pixmaps/lmstudio-bin.png" + + # Desktop entry + install -Dm644 "$srcdir/lmstudio.desktop" "$pkgdir/usr/share/applications/lmstudio.desktop" + + # Symlink to binary + install -dm755 "$pkgdir/usr/bin" + ln -s /opt/lm-studio/lm-studio.AppImage "$pkgdir/usr/bin/lm-studio" +} diff --git a/pkgbuilds/shared/lmstudio-bin/PKGBUILD.template b/pkgbuilds/shared/lmstudio-bin/PKGBUILD.template new file mode 100644 index 0000000..4728874 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/PKGBUILD.template @@ -0,0 +1,39 @@ +pkgname=lmstudio-bin +pkgver={{version}} +pkgrel=1 +pkgdesc="LM Studio - A desktop app for exploring and running large language models locally" +arch=('x86_64') +url="https://lmstudio.ai" +license=('EULA') +depends=('fuse2' 'zlib' 'hicolor-icon-theme' 'gtk3' 'nss' 'libxcrypt-compat') +options=('!strip') +install=lmstudio-bin.install +source=("{{url}}" + "lmstudio.png" + "lmstudio.desktop") +sha256sums=('{{sha256}}' + '{{icon_sha256}}' + 'SKIP') + +prepare() { + chmod +x "${srcdir}/${source[0]##*/}" +} + +package() { + # Create installation directory + install -dm755 "$pkgdir/opt/lm-studio" + + # Install AppImage + install -Dm755 "${srcdir}/${source[0]##*/}" "$pkgdir/opt/lm-studio/lm-studio.AppImage" + + # Install static icon + install -Dm644 "${srcdir}/lmstudio.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/lmstudio-bin.png" + install -Dm644 "${srcdir}/lmstudio.png" "${pkgdir}/usr/share/pixmaps/lmstudio-bin.png" + + # Desktop entry + install -Dm644 "$srcdir/lmstudio.desktop" "$pkgdir/usr/share/applications/lmstudio.desktop" + + # Symlink to binary + install -dm755 "$pkgdir/usr/bin" + ln -s /opt/lm-studio/lm-studio.AppImage "$pkgdir/usr/bin/lm-studio" +} diff --git a/pkgbuilds/shared/lmstudio-bin/lmstudio-bin.install b/pkgbuilds/shared/lmstudio-bin/lmstudio-bin.install new file mode 100644 index 0000000..752e987 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/lmstudio-bin.install @@ -0,0 +1,14 @@ +post_install() { + update-desktop-database -q + gtk-update-icon-cache -ftq /usr/share/icons/hicolor +} + +post_upgrade() { + update-desktop-database -q + gtk-update-icon-cache -ftq /usr/share/icons/hicolor +} + +post_remove() { + update-desktop-database -q + gtk-update-icon-cache -ftq /usr/share/icons/hicolor +} diff --git a/pkgbuilds/shared/lmstudio-bin/lmstudio.desktop b/pkgbuilds/shared/lmstudio-bin/lmstudio.desktop new file mode 100644 index 0000000..e007ca8 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/lmstudio.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=LM Studio +GenericName=Large Language Model Studio +Comment=A desktop app for exploring and running large language models locally +Exec=lm-studio %U +Icon=lmstudio-bin +Type=Application +Categories=Development;ArtificialIntelligence; +Terminal=false +StartupNotify=true +StartupWMClass=LM Studio +MimeType=text/plain; diff --git a/pkgbuilds/shared/lmstudio-bin/lmstudio.png b/pkgbuilds/shared/lmstudio-bin/lmstudio.png new file mode 100644 index 0000000000000000000000000000000000000000..082d6d6ad8790b2860869d4a8c26eadb2c97bf51 GIT binary patch literal 71002 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�RqkjQL)fz0t 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 str: + """ + Follow redirects to resolve the final download URL. + Uses HEAD request to avoid downloading the full file. + """ + print(f"Resolving download URL: {redirect_url}") + + session = requests.Session() + response = session.head(redirect_url, allow_redirects=True) + response.raise_for_status() + + final_url = response.url + print(f"Resolved URL: {final_url}") + return final_url + + +def extract_version(filename: str) -> str: + """ + Extract semantic version from filename using regex. + Expected format: LM-Studio-X.Y.Z-x64.AppImage or LM-Studio-X.Y.Z-R-x64.AppImage + Extracts only X.Y.Z portion (pkgrel handled separately in PKGBUILD). + """ + match = re.search(r'LM-Studio-([\d.]+)-(?:\d+-)?x64\.AppImage', filename) + if match: + return match.group(1) + raise ValueError(f"Could not extract version from filename: {filename}") + + +def calculate_sha256(file_path: str) -> str: + """ + Calculate SHA256 checksum of a file. + Handles both AppImage and icon files with identical hashing logic. + """ + print(f"Calculating SHA256 for: {file_path}") + + sha256_hash = hashlib.sha256() + with open(file_path, "rb") as f: + for byte_block in iter(lambda: f.read(4096), b""): + sha256_hash.update(byte_block) + + checksum = sha256_hash.hexdigest() + print(f"SHA256: {checksum}") + return checksum + + +def download_file(url: str, file_path: str) -> None: + """ + Download file from URL if it doesn't already exist. + """ + path = Path(file_path) + if path.exists(): + print(f"File already exists: {file_path}") + return + + print(f"Downloading: {url}") + response = requests.get(url, stream=True) + response.raise_for_status() + + with open(file_path, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + + print(f"Downloaded: {file_path}") + + +def stage_install_file() -> None: + """ + Ensure lmstudio-bin.install file exists and is staged. + """ + install_path = Path("/home/madgoat/Documents/LMStudio-bin Aur/lmstudio-bin.install") + + if install_path.exists(): + print(f"✓ Install file present: {install_path}") + else: + print(f"Warning: Install file not found at {install_path}") + + +def render_template(template_path: str, output_path: str, version: str, url: str, sha256: str, icon_sha256: str) -> None: + """ + Render PKGBUILD from template by replacing placeholders. + + Placeholders: + - {{version}}: Semantic version extracted from filename + - {{url}}: Resolved download URL + - {{sha256}}: SHA256 checksum of the AppImage + - {{icon_sha256}}: SHA256 checksum of the static icon (lmstudio.png) + + The template includes sha256sums array with appimage hash, icon hash, and SKIP for .desktop file. + """ + print(f"Rendering template: {template_path} -> {output_path}") + + with open(template_path, "r") as f: + content = f.read() + + content = content.replace("{{version}}", version) + content = content.replace("{{url}}", url) + content = content.replace("{{sha256}}", sha256) + content = content.replace("{{icon_sha256}}", icon_sha256) + + with open(output_path, "w") as f: + f.write(content) + + print(f"Generated: {output_path}") + + +def generate_srcinfo() -> None: + """ + Generate .SRCINFO using makepkg --printsrcinfo. + """ + print("Generating .SRCINFO...") + + result = subprocess.run( + ["makepkg", "--printsrcinfo"], + capture_output=True, + text=True, + cwd="/home/madgoat/Documents/LMStudio-bin Aur" + ) + + if result.returncode != 0: + raise RuntimeError(f"makepkg failed: {result.stderr}") + + with open("/home/madgoat/Documents/LMStudio-bin Aur/.SRCINFO", "w") as f: + f.write(result.stdout) + + print("Generated: .SRCINFO") + + +def main(): + """ + Main maintenance engine workflow. + """ + print("=== LM Studio PKGBUILD Maintenance Engine ===\n") + + # Change to workspace directory + import os + os.chdir("/home/madgoat/Documents/LMStudio-bin Aur") + + # Step 1: Resolve download URL + final_url = resolve_download_url() + + # Step 2: Extract filename and version + filename = final_url.split("/")[-1] + version = extract_version(filename) + print(f"Detected version: {version}\n") + + # Step 3: Download file if missing + download_file(final_url, filename) + + # Step 4: Calculate SHA256 for AppImage + sha256 = calculate_sha256(filename) + print() + + # Step 5: Calculate SHA256 for static icon (lmstudio.png) + # Uses identical hashing logic as AppImage + icon_hash = calculate_sha256("lmstudio.png") + print() + + # Step 6: Stage install file + stage_install_file() + print() + + # Step 7: Render PKGBUILD from template + # The template uses {{sha256}} for the AppImage hash and {{icon_sha256}} for icon hash + # and the sha256sums array in the template includes both hashes plus 'SKIP' for .desktop file + render_template("PKGBUILD.template", "PKGBUILD", version, final_url, sha256, icon_hash) + print() + + # Step 8: Generate .SRCINFO + generate_srcinfo() + + print("\n=== Maintenance Engine Complete ===") + print(f"Version: {version}") + print(f"URL: {final_url}") + print(f"AppImage SHA256: {sha256}") + print(f"Icon SHA256: {icon_hash}") + print(f"SHA256sums: ('{sha256}' '{icon_hash}' 'SKIP')") + + +if __name__ == "__main__": + main() diff --git a/pkgbuilds/shared/lmstudio-bin/verify_git_hygiene.sh b/pkgbuilds/shared/lmstudio-bin/verify_git_hygiene.sh new file mode 100755 index 0000000..d9f5478 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/verify_git_hygiene.sh @@ -0,0 +1,100 @@ +#!/bin/bash +# Git Hygiene Verification Guard +# Updated: Explicitly allows lmstudio.png, verifies exclusion of src/ and pkg/ from history and staged index + +echo "=== Git Hygiene Verification Guard ===" +echo "" + +# Color codes +RED="\033[0;31m" +GREEN="\033[0;32m" +YELLOW="\033[1;33m" +NC="\033[0m" + +FAIL=0 + +# Check 1: Verify lmstudio.png is NOT ignored (explicitly allowed) +echo "Check 1: Verifying lmstudio.png is tracked/allowed..." +if git ls-files lmstudio.png 2>/dev/null | grep -q "lmstudio.png"; then + echo -e "${GREEN}✓ PASSED: lmstudio.png is tracked${NC}" +elif ! git check-ignore lmstudio.png 2>/dev/null; then + echo -e "${GREEN}✓ PASSED: lmstudio.png is not ignored${NC}" +else + echo -e "${YELLOW}⚠ WARNING: lmstudio.png appears to be in .gitignore${NC}" +fi +echo "" + +# Check 2: Verify src/ folder is NOT in git history +echo "Check 2: Verifying src/ folder is NOT in git history..." +SRC_IN_HISTORY=$(git log --all --full-history --name-only --format="" -- 'src/' 2>/dev/null | wc -l) +if [ "$SRC_IN_HISTORY" -gt 0 ]; then + echo -e "${RED}✗ FAILED: src/ folder found in git history${NC}" + FAIL=1 +else + echo -e "${GREEN}✓ PASSED: src/ folder is clean from history${NC}" +fi +echo "" + +# Check 3: Verify pkg/ folder is NOT in git history +echo "Check 3: Verifying pkg/ folder is NOT in git history..." +PKG_IN_HISTORY=$(git log --all --full-history --name-only --format="" -- 'pkg/' 2>/dev/null | wc -l) +if [ "$PKG_IN_HISTORY" -gt 0 ]; then + echo -e "${RED}✗ FAILED: pkg/ folder found in git history${NC}" + FAIL=1 +else + echo -e "${GREEN}✓ PASSED: pkg/ folder is clean from history${NC}" +fi +echo "" + +# Check 4: Verify src/ folder is NOT in staged index +echo "Check 4: Verifying src/ folder is NOT in staged index..." +SRC_STAGED=$(git diff --cached --name-only -- 'src/' 2>/dev/null | wc -l) +if [ "$SRC_STAGED" -gt 0 ]; then + echo -e "${RED}✗ FAILED: src/ folder has staged files${NC}" + git diff --cached --name-only -- 'src/' + FAIL=1 +else + echo -e "${GREEN}✓ PASSED: src/ folder is clean from staged index${NC}" +fi +echo "" + +# Check 5: Verify pkg/ folder is NOT in staged index +echo "Check 5: Verifying pkg/ folder is NOT in staged index..." +PKG_STAGED=$(git diff --cached --name-only -- 'pkg/' 2>/dev/null | wc -l) +if [ "$PKG_STAGED" -gt 0 ]; then + echo -e "${RED}✗ FAILED: pkg/ folder has staged files${NC}" + git diff --cached --name-only -- 'pkg/' + FAIL=1 +else + echo -e "${GREEN}✓ PASSED: pkg/ folder is clean from staged index${NC}" +fi +echo "" + +# Check 6: Verify no AppImages or packages are staged +echo "Check 6: Verifying NO binary extensions are staged..." +BINARY_STAGED=$(git diff --cached --name-only | grep -E "\.(AppImage|zst|tar\.gz)$" | wc -l) +if [ "$BINARY_STAGED" -gt 0 ]; then + echo -e "${RED}✗ FAILED: Binary files are staged!${NC}" + git diff --cached --name-only | grep -E "\.(AppImage|zst|tar\.gz)$" + FAIL=1 +else + echo -e "${GREEN}✓ PASSED: No binary extensions staged${NC}" +fi +echo "" + +# Check 7: Review staged changes +echo "Check 7: Reviewing staged changes summary..." +git diff --cached --stat +echo "" + +# Final result +echo "=== Verification Summary ===" +if [ "$FAIL" -eq 0 ]; then + echo -e "${GREEN}✓ All hygiene checks PASSED${NC}" + echo "Repository is ready for commit." + exit 0 +else + echo -e "${RED}✗ Some hygiene checks FAILED${NC}" + echo "Please fix the issues before committing." + exit 1 +fi diff --git a/pkgbuilds/shared/lmstudio-bin/verify_system.sh b/pkgbuilds/shared/lmstudio-bin/verify_system.sh new file mode 100755 index 0000000..ae151c9 --- /dev/null +++ b/pkgbuilds/shared/lmstudio-bin/verify_system.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# LM Studio AUR Package Verification Script +# Updated: Checks for vendored lmstudio.png in root, makes /usr/share checks informative in dev environments + +echo "=== LM Studio AUR Verification ===" +echo "" + +# 1. Vendored Icon Existence Check (Primary) +echo "[1/4] Checking Vendored Icon..." +if [ -f "./lmstudio.png" ]; then + echo "✓ Found vendored lmstudio.png in root" +else + echo "✗ MISSING: vendored lmstudio.png in root" + exit 1 +fi +echo "" + +# 2. System Icon Installation Check (Informative) +echo "[2/4] Checking System Icon Installation..." +if [ -f "/usr/share/pixmaps/lmstudio-bin.png" ]; then + echo "✓ Found lmstudio-bin pixmap icon in /usr/share" +else + echo "ℹ INFO: lmstudio-bin pixmap not in /usr/share (expected in non-installed dev environment)" +fi +echo "" + +# 3. Desktop File Verification +echo "[3/4] Verifying Desktop Entry..." +ICON_NAME=$(grep "^Icon=" lmstudio.desktop | cut -d'=' -f2) +if [ "$ICON_NAME" == "lmstudio-bin" ]; then + echo "✓ Desktop Icon name matches: $ICON_NAME" +else + echo "✗ Desktop Icon mismatch: $ICON_NAME (expected lmstudio-bin)" + exit 1 +fi +echo "" + +# 4. PKGBUILD Consistency +echo "[4/4] Verifying PKGBUILD Icon Mapping..." +grep -q "lmstudio.png" PKGBUILD +if [ $? -eq 0 ]; then + echo "✓ PKGBUILD contains lmstudio.png mapping" +else + echo "✗ PKGBUILD missing icon installation logic" + exit 1 +fi +echo "" + +echo "=== SYSTEM GREEN ===" diff --git a/pkgbuilds/shared/lmstudio/.SRCINFO b/pkgbuilds/shared/lmstudio/.SRCINFO deleted file mode 100644 index 1664afb..0000000 --- a/pkgbuilds/shared/lmstudio/.SRCINFO +++ /dev/null @@ -1,20 +0,0 @@ -pkgbase = lmstudio - pkgdesc = Discover, download, and run local LLMs - pkgver = 0.3.35.1 - pkgrel = 1 - url = https://lmstudio.ai/ - arch = x86_64 - license = LicenseRef-EULA - makedepends = squashfs-tools - makedepends = graphicsmagick - depends = zlib - depends = hicolor-icon-theme - depends = fuse2 - depends = clblast - noextract = lmstudio-0.3.35.1.AppImage - options = !strip - options = !debug - source = lmstudio-0.3.35.1.AppImage::https://installers.lmstudio.ai/linux/x64/0.3.35-1/LM-Studio-0.3.35-1-x64.AppImage - sha256sums = ad9bf98e91ff13b5eea1d26f1457c8d7c4bed24bbb419551d5cbff4840380953 - -pkgname = lmstudio diff --git a/pkgbuilds/shared/lmstudio/.nvchecker.toml b/pkgbuilds/shared/lmstudio/.nvchecker.toml deleted file mode 100644 index 1d5a5a5..0000000 --- a/pkgbuilds/shared/lmstudio/.nvchecker.toml +++ /dev/null @@ -1,3 +0,0 @@ -[lmstudio] -source = "cmd" -cmd = "curl -sIL -o /dev/null -w '%{url_effective}\\n' https://lmstudio.ai/download/latest/linux/x64 | sed -E 's|.*x64/([0-9]+\\.[0-9]+\\.[0-9]+)-([0-9]+).*|\\1.\\2|'" diff --git a/pkgbuilds/shared/lmstudio/PKGBUILD b/pkgbuilds/shared/lmstudio/PKGBUILD deleted file mode 100644 index 7750fda..0000000 --- a/pkgbuilds/shared/lmstudio/PKGBUILD +++ /dev/null @@ -1,69 +0,0 @@ -# Maintainer: envolution -# Contributor: SoleSoul -# shellcheck shell=bash disable=SC2034,SC2154 - -pkgname=lmstudio -_appname=lm-studio -pkgver=0.3.35.1 -_pkgver="${pkgver%.*}-${pkgver##*.}" -pkgrel=1 -pkgdesc="Discover, download, and run local LLMs" -arch=('x86_64') -url="https://lmstudio.ai/" -license=('LicenseRef-EULA') -depends=('zlib' 'hicolor-icon-theme' 'fuse2' 'clblast') -makedepends=('squashfs-tools' 'graphicsmagick') -options=(!strip !debug) -_appimage="${pkgname}-${pkgver}.AppImage" -source=("${_appimage}::https://installers.lmstudio.ai/linux/x64/${_pkgver}/LM-Studio-${_pkgver}-x64.AppImage") -sha256sums=('ad9bf98e91ff13b5eea1d26f1457c8d7c4bed24bbb419551d5cbff4840380953') -noextract=("${_appimage}") - -prepare() { - rm -rf squashfs-root - chmod +x "${_appimage}" - # get the files we need for packaging - offset=$(./"${_appimage}" --appimage-offset) - unset PAGER # unsquashfs is very picky about pager settings - unsquashfs -q -o "$offset" -d squashfs-root "${_appimage}" \ - "${_appname}.desktop" \ - "usr/share/icons/hicolor/0x0/apps/lm-studio.png" \ - "LICENSE.electron.txt" \ - "LICENSES.chromium.html" - # unsquashfs -o "$offset" -l "${_appimage}" | grep -i license -} - -build() { - # Adjust .desktop so it will work outside of AppImage container - sed -i -E "s|Exec=AppRun|Exec=env DESKTOPINTEGRATION=false /usr/bin/${pkgname}|" \ - "squashfs-root/${_appname}.desktop" - sed -i -E "s|Icon=.*|Icon=${pkgname}|" \ - "squashfs-root/${_appname}.desktop" -} - -package() { - # AppImage - install -Dm755 "${srcdir}/${_appimage}" "${pkgdir}/opt/${pkgname}/${_appname}.AppImage" - install -Dm644 "${srcdir}/squashfs-root/LICENSE"* -t "${pkgdir}/usr/share/licenses/${pkgname}" - install -Dm644 /dev/stdin "$pkgdir/usr/share/licenses/$pkgname/EULA" <<< "https://lmstudio.ai/app-terms" - - - # Desktop file - install -Dm644 "${srcdir}/squashfs-root/${_appname}.desktop" \ - "${pkgdir}/usr/share/applications/${pkgname}.desktop" - - #source icon from squashfs - src_icon="$srcdir/squashfs-root/usr/share/icons/hicolor/0x0/apps/lm-studio.png" - sizes=("16x16" "32x32" "48x48" "64x64" "128x128" "256x256") - - # Loop through each size and create resized icons - for size in "${sizes[@]}"; do - install -dm755 "${pkgdir}/usr/share/icons/hicolor/$size/apps" - gm convert "$src_icon" -resize "$size" "$pkgdir/usr/share/icons/hicolor/$size/apps/${pkgname}.png" - done - - # Symlink executable - install -dm755 "${pkgdir}/usr/bin" - ln -s "/opt/${pkgname}/${_appname}.AppImage" "${pkgdir}/usr/bin/${pkgname}" -} -# vim:set ts=2 sw=2 et: