diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 0274d49..2544bcf 100755 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,4 +1,4 @@ -# Copilot Instructions for FriendlyKobold +# Copilot Instructions for Gerbil ### General Coding diff --git a/.github/workflows/aur-release.yml b/.github/workflows/aur-release.yml index 114387e..b34ea2b 100644 --- a/.github/workflows/aur-release.yml +++ b/.github/workflows/aur-release.yml @@ -50,7 +50,7 @@ jobs: const version = tag.replace(/^v/, ''); const authorName = packageJson.author.name; const authorEmail = packageJson.author.email; - const appImageUrl = `https://github.com/lone-cloud/friendly-kobold/releases/download/${tag}/Friendly.Kobold-${version}.AppImage`; + const appImageUrl = `https://github.com/lone-cloud/gerbil/releases/download/${tag}/Friendly.Kobold-${version}.AppImage`; core.setOutput('version', version); core.setOutput('tag', tag); @@ -97,7 +97,7 @@ jobs: # Download AppImage with retry for attempt in $(seq 1 $max_attempts); do echo "Attempt $attempt: Downloading AppImage..." - if curl -L -o "friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage" "${{ steps.release_info.outputs.appimage_url }}"; then + if curl -L -o "gerbil-${{ steps.release_info.outputs.version }}.AppImage" "${{ steps.release_info.outputs.appimage_url }}"; then echo "✅ AppImage downloaded successfully" break else @@ -113,7 +113,7 @@ jobs: # Download desktop file with retry for attempt in $(seq 1 $max_attempts); do echo "Attempt $attempt: Downloading desktop file..." - if curl -L -o "friendly-kobold.desktop" "https://raw.githubusercontent.com/lone-cloud/friendly-kobold/${{ inputs.tag }}/assets/friendly-kobold.desktop"; then + if curl -L -o "gerbil.desktop" "https://raw.githubusercontent.com/lone-cloud/gerbil/${{ inputs.tag }}/assets/gerbil.desktop"; then echo "✅ Desktop file downloaded successfully" break else @@ -127,15 +127,15 @@ jobs: done # Verify file sizes - appimage_size=$(stat -c%s "friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage") + appimage_size=$(stat -c%s "gerbil-${{ steps.release_info.outputs.version }}.AppImage") echo "AppImage size: $appimage_size bytes" if [ $appimage_size -lt 50000000 ]; then # Less than 50MB is suspicious echo "❌ AppImage seems too small ($appimage_size bytes), possible download issue" exit 1 fi - SHA256_APPIMAGE=$(sha256sum "friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage" | cut -d' ' -f1) - SHA256_DESKTOP=$(sha256sum "friendly-kobold.desktop" | cut -d' ' -f1) + SHA256_APPIMAGE=$(sha256sum "gerbil-${{ steps.release_info.outputs.version }}.AppImage" | cut -d' ' -f1) + SHA256_DESKTOP=$(sha256sum "gerbil.desktop" | cut -d' ' -f1) echo "sha256_appimage=$SHA256_APPIMAGE" >> $GITHUB_OUTPUT echo "sha256_desktop=$SHA256_DESKTOP" >> $GITHUB_OUTPUT @@ -147,62 +147,62 @@ jobs: run: | cat > PKGBUILD << 'EOF' # Maintainer: ${{ steps.release_info.outputs.author_name }} <${{ steps.release_info.outputs.author_email }}> - pkgname=friendly-kobold + pkgname=gerbil pkgver=${{ steps.release_info.outputs.version }} pkgrel=${{ inputs.pkgrel || '1' }} pkgdesc="A desktop app for running Large Language Models locally" arch=('x86_64') - url="https://github.com/lone-cloud/friendly-kobold" + url="https://github.com/lone-cloud/gerbil" license=('AGPL-3.0-or-later') depends=('gtk3' 'nss') optdepends=('alsa-lib: Audio support for sound effects' 'libxss: Screen saver detection support') - provides=('friendly-kobold') - conflicts=('friendly-kobold-git') - source=("friendly-kobold-${pkgver}.AppImage::${{ steps.release_info.outputs.appimage_url }}" - "friendly-kobold.desktop::https://raw.githubusercontent.com/lone-cloud/friendly-kobold/${{ steps.release_info.outputs.tag }}/assets/friendly-kobold.desktop") + provides=('gerbil') + conflicts=('gerbil-git') + source=("gerbil-${pkgver}.AppImage::${{ steps.release_info.outputs.appimage_url }}" + "gerbil.desktop::https://raw.githubusercontent.com/lone-cloud/gerbil/${{ steps.release_info.outputs.tag }}/assets/gerbil.desktop") sha256sums=('${{ steps.sha_calc.outputs.sha256_appimage }}' '${{ steps.sha_calc.outputs.sha256_desktop }}') prepare() { - chmod +x "friendly-kobold-${pkgver}.AppImage" - "./friendly-kobold-${pkgver}.AppImage" --appimage-extract + chmod +x "gerbil-${pkgver}.AppImage" + "./gerbil-${pkgver}.AppImage" --appimage-extract } package() { # Install the application - install -dm755 "${pkgdir}/opt/friendly-kobold" - cp -r squashfs-root/* "${pkgdir}/opt/friendly-kobold/" + install -dm755 "${pkgdir}/opt/gerbil" + cp -r squashfs-root/* "${pkgdir}/opt/gerbil/" # Fix permissions on extracted files - chmod -R 755 "${pkgdir}/opt/friendly-kobold/" + chmod -R 755 "${pkgdir}/opt/gerbil/" # Create executable wrapper install -dm755 "${pkgdir}/usr/bin" - cat > "${pkgdir}/usr/bin/friendly-kobold" << 'WRAPPER' + cat > "${pkgdir}/usr/bin/gerbil" << 'WRAPPER' #!/bin/bash - exec "/opt/friendly-kobold/Friendly Kobold" "$@" + exec "/opt/gerbil/Gerbil" "$@" WRAPPER - chmod +x "${pkgdir}/usr/bin/friendly-kobold" + chmod +x "${pkgdir}/usr/bin/gerbil" # Install desktop file from assets install -dm755 "${pkgdir}/usr/share/applications" - cp "${srcdir}/friendly-kobold.desktop" "${pkgdir}/usr/share/applications/" + cp "${srcdir}/gerbil.desktop" "${pkgdir}/usr/share/applications/" # Install icon to hicolor theme directory and pixmaps as fallback install -dm755 "${pkgdir}/usr/share/icons/hicolor/512x512/apps" install -dm755 "${pkgdir}/usr/share/pixmaps" # Try different possible icon locations - if [ -f "${pkgdir}/opt/friendly-kobold/resources/assets/icon.png" ]; then - cp "${pkgdir}/opt/friendly-kobold/resources/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/friendly-kobold.png" - cp "${pkgdir}/opt/friendly-kobold/resources/assets/icon.png" "${pkgdir}/usr/share/pixmaps/friendly-kobold.png" - elif [ -f "${pkgdir}/opt/friendly-kobold/assets/icon.png" ]; then - cp "${pkgdir}/opt/friendly-kobold/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/friendly-kobold.png" - cp "${pkgdir}/opt/friendly-kobold/assets/icon.png" "${pkgdir}/usr/share/pixmaps/friendly-kobold.png" - elif [ -f "${pkgdir}/opt/friendly-kobold/icon.png" ]; then - cp "${pkgdir}/opt/friendly-kobold/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/friendly-kobold.png" - cp "${pkgdir}/opt/friendly-kobold/icon.png" "${pkgdir}/usr/share/pixmaps/friendly-kobold.png" + if [ -f "${pkgdir}/opt/gerbil/resources/assets/icon.png" ]; then + cp "${pkgdir}/opt/gerbil/resources/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/gerbil.png" + cp "${pkgdir}/opt/gerbil/resources/assets/icon.png" "${pkgdir}/usr/share/pixmaps/gerbil.png" + elif [ -f "${pkgdir}/opt/gerbil/assets/icon.png" ]; then + cp "${pkgdir}/opt/gerbil/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/gerbil.png" + cp "${pkgdir}/opt/gerbil/assets/icon.png" "${pkgdir}/usr/share/pixmaps/gerbil.png" + elif [ -f "${pkgdir}/opt/gerbil/icon.png" ]; then + cp "${pkgdir}/opt/gerbil/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/gerbil.png" + cp "${pkgdir}/opt/gerbil/icon.png" "${pkgdir}/usr/share/pixmaps/gerbil.png" else echo "Warning: Could not find icon.png in expected locations" fi @@ -213,31 +213,31 @@ jobs: run: | # Create .SRCINFO file (required for AUR) cat > .SRCINFO << 'EOF' - pkgbase = friendly-kobold + pkgbase = gerbil pkgdesc = A desktop app for running Large Language Models locally pkgver = ${{ steps.release_info.outputs.version }} pkgrel = ${{ inputs.pkgrel || '1' }} - url = https://github.com/lone-cloud/friendly-kobold + url = https://github.com/lone-cloud/gerbil arch = x86_64 license = AGPL-3.0-or-later depends = gtk3 depends = nss optdepends = alsa-lib: Audio support for sound effects optdepends = libxss: Screen saver detection support - provides = friendly-kobold - conflicts = friendly-kobold-git - source = friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage::${{ steps.release_info.outputs.appimage_url }} - source = friendly-kobold.desktop::https://raw.githubusercontent.com/lone-cloud/friendly-kobold/${{ steps.release_info.outputs.tag }}/assets/friendly-kobold.desktop + provides = gerbil + conflicts = gerbil-git + source = gerbil-${{ steps.release_info.outputs.version }}.AppImage::${{ steps.release_info.outputs.appimage_url }} + source = gerbil.desktop::https://raw.githubusercontent.com/lone-cloud/gerbil/${{ steps.release_info.outputs.tag }}/assets/gerbil.desktop sha256sums = ${{ steps.sha_calc.outputs.sha256_appimage }} sha256sums = ${{ steps.sha_calc.outputs.sha256_desktop }} - pkgname = friendly-kobold + pkgname = gerbil EOF - name: Publish to AUR uses: KSXGitHub/github-actions-deploy-aur@v2.7.2 with: - pkgname: friendly-kobold + pkgname: gerbil pkgbuild: ./PKGBUILD commit_username: ${{ steps.release_info.outputs.author_name }} commit_email: ${{ steps.release_info.outputs.author_email }} @@ -249,16 +249,16 @@ jobs: run: | echo "## AUR Release Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "📦 **Package**: friendly-kobold" >> $GITHUB_STEP_SUMMARY + echo "📦 **Package**: gerbil" >> $GITHUB_STEP_SUMMARY echo "🔖 **Version**: ${{ steps.release_info.outputs.version }}" >> $GITHUB_STEP_SUMMARY - echo "🔗 **AUR Page**: https://aur.archlinux.org/packages/friendly-kobold" >> $GITHUB_STEP_SUMMARY + echo "🔗 **AUR Page**: https://aur.archlinux.org/packages/gerbil" >> $GITHUB_STEP_SUMMARY echo "✅ **Status**: Successfully published to AUR" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### Installation" >> $GITHUB_STEP_SUMMARY echo '```bash' >> $GITHUB_STEP_SUMMARY echo "# Using yay" >> $GITHUB_STEP_SUMMARY - echo "yay -S friendly-kobold" >> $GITHUB_STEP_SUMMARY + echo "yay -S gerbil" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "# Using paru" >> $GITHUB_STEP_SUMMARY - echo "paru -S friendly-kobold" >> $GITHUB_STEP_SUMMARY + echo "paru -S gerbil" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c7c0df0..0b8daae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -118,7 +118,7 @@ jobs: - name: Create Release run: | gh release create ${{ steps.tag.outputs.tag }} \ - --title "FriendlyKobold ${{ steps.tag.outputs.tag }}" \ + --title "Gerbil ${{ steps.tag.outputs.tag }}" \ --generate-notes env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 99eda43..3946998 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ -# Friendly Kobold +# Gerbil -A desktop app for running Large Language Models locally. -FriendlyKobold Icon +A simple desktop app to easily run Large Language Models locally through KoboldCpp. + +Gerbil Icon @@ -20,12 +21,12 @@ A desktop app for running Large Language Models locally. @@ -142,7 +142,7 @@ // Send IPC message directly since this is a simple modal if (window.electronAPI && window.electronAPI.app) { window.electronAPI.app.openExternal( - 'https://github.com/lone-cloud/friendly-kobold' + 'https://github.com/lone-cloud/gerbil' ); } } diff --git a/yarn.lock b/yarn.lock index 5f145fe..e647f7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3570,50 +3570,6 @@ __metadata: languageName: node linkType: hard -"friendly-kobold@workspace:.": - version: 0.0.0-use.local - resolution: "friendly-kobold@workspace:." - dependencies: - "@eslint/js": "npm:^9.34.0" - "@mantine/core": "npm:^8.2.7" - "@mantine/hooks": "npm:^8.2.7" - "@types/node": "npm:^24.3.0" - "@types/react": "npm:^19.1.12" - "@types/react-dom": "npm:^19.1.9" - "@typescript-eslint/eslint-plugin": "npm:^8.41.0" - "@typescript-eslint/parser": "npm:^8.41.0" - "@vitejs/plugin-react": "npm:^5.0.2" - axios: "npm:^1.11.0" - cross-env: "npm:^10.0.0" - electron: "npm:^37.4.0" - electron-builder: "npm:^26.0.12" - electron-vite: "npm:^4.0.0" - eslint: "npm:^9.34.0" - eslint-plugin-import: "npm:^2.32.0" - eslint-plugin-no-comments: "npm:^1.1.10" - eslint-plugin-react: "npm:^7.37.5" - eslint-plugin-react-hooks: "npm:^5.2.0" - eslint-plugin-react-refresh: "npm:^0.4.20" - eslint-plugin-sonarjs: "npm:^3.0.5" - execa: "npm:^9.6.0" - globals: "npm:^16.3.0" - husky: "npm:^9.1.7" - jiti: "npm:^2.5.1" - lint-staged: "npm:^16.1.5" - lucide-react: "npm:^0.542.0" - prettier: "npm:^3.6.2" - react: "npm:^19.1.1" - react-dom: "npm:^19.1.1" - rollup-plugin-visualizer: "npm:^6.0.3" - systeminformation: "npm:^5.27.8" - typescript: "npm:^5.9.2" - vite: "npm:^7.1.3" - winston: "npm:^3.17.0" - winston-daily-rotate-file: "npm:^5.0.0" - zustand: "npm:^5.0.8" - languageName: unknown - linkType: soft - "fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" @@ -3745,6 +3701,50 @@ __metadata: languageName: node linkType: hard +"gerbil@workspace:.": + version: 0.0.0-use.local + resolution: "gerbil@workspace:." + dependencies: + "@eslint/js": "npm:^9.34.0" + "@mantine/core": "npm:^8.2.7" + "@mantine/hooks": "npm:^8.2.7" + "@types/node": "npm:^24.3.0" + "@types/react": "npm:^19.1.12" + "@types/react-dom": "npm:^19.1.9" + "@typescript-eslint/eslint-plugin": "npm:^8.41.0" + "@typescript-eslint/parser": "npm:^8.41.0" + "@vitejs/plugin-react": "npm:^5.0.2" + axios: "npm:^1.11.0" + cross-env: "npm:^10.0.0" + electron: "npm:^37.4.0" + electron-builder: "npm:^26.0.12" + electron-vite: "npm:^4.0.0" + eslint: "npm:^9.34.0" + eslint-plugin-import: "npm:^2.32.0" + eslint-plugin-no-comments: "npm:^1.1.10" + eslint-plugin-react: "npm:^7.37.5" + eslint-plugin-react-hooks: "npm:^5.2.0" + eslint-plugin-react-refresh: "npm:^0.4.20" + eslint-plugin-sonarjs: "npm:^3.0.5" + execa: "npm:^9.6.0" + globals: "npm:^16.3.0" + husky: "npm:^9.1.7" + jiti: "npm:^2.5.1" + lint-staged: "npm:^16.1.5" + lucide-react: "npm:^0.542.0" + prettier: "npm:^3.6.2" + react: "npm:^19.1.1" + react-dom: "npm:^19.1.1" + rollup-plugin-visualizer: "npm:^6.0.3" + systeminformation: "npm:^5.27.8" + typescript: "npm:^5.9.2" + vite: "npm:^7.1.3" + winston: "npm:^3.17.0" + winston-daily-rotate-file: "npm:^5.0.0" + zustand: "npm:^5.0.8" + languageName: unknown + linkType: soft + "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5"