Add section to CLAUDE.md with lessons learned from RPM signing:
- Research target system constraints before implementing
- Consider concurrency when multiple jobs push to same branch
- Test full pipeline before merging
- Common CI pitfalls table (GPG flags, push races, version formats)
Co-Authored-By: Claude <claude@anthropic.com>
Both APT and DNF repo update jobs push to gh-pages, and the
pages-build-deployment action also modifies it. This can cause
push failures when the ref changes between pull and push.
Added a retry loop (5 attempts with 5s delay) to handle this.
Co-Authored-By: Claude <claude@anthropic.com>
The repomd.xml.asc file persists in the gh-pages branch, causing
"gpg: signing failed: File exists" on subsequent releases.
Co-Authored-By: Claude <claude@anthropic.com>
The gpg --detach-sign command was failing in CI with:
gpg: cannot open '/dev/tty': No such device or address
Adding --batch flag allows GPG to run without TTY access.
Co-Authored-By: Claude <claude@anthropic.com>
RPM Version field cannot contain hyphens (they're used to separate
Version from Release). When a version like "1.1.799-1.3.3" is passed:
- Split into rpm_version="1.1.799" and rpm_release="1.3.3"
- Use these in the spec file instead of hardcoded Release: 1
This fixes the build error:
error: line 2: Illegal char '-' (0x2d) in: Version: 1.1.799-1.3.3
Co-Authored-By: Claude <claude@anthropic.com>
Add RPM package signing to the update-dnf-repo job so that packages
can be installed with gpgcheck=1 (the default in the repo file).
Changes:
- Install rpm package (provides rpmsign command)
- Configure ~/.rpmmacros with GPG signing settings
- Sign each RPM with rpmsign --addsign before createrepo_c
- Renamed loop variable from 'rpm' to 'rpm_file' to avoid conflicts
Fixes#191
Co-Authored-By: Claude <claude@anthropic.com>
The APT repository update was failing with exit code 254 because
reprepro rejected duplicate packages. When multiple releases use the
same Claude Desktop version (e.g., v1.3.0, v1.3.1, v1.3.2 all using
claude1.1.799), the packages had identical versions causing conflicts.
Changes:
- Add --release-tag flag to build.sh to accept the full release tag
- Extract wrapper version from tag (v1.3.2+claude1.1.799 -> 1.3.2)
- Append wrapper version as Debian revision suffix (1.1.799-1.3.2)
- Update CI workflows to pass release tag on tag builds
This ensures each release produces packages with unique versions that
APT can properly handle for upgrades (1.1.799-1.3.2 > 1.1.799-1.3.1).
Fixes workflow failure in run #21318689829
Co-Authored-By: Claude <claude@anthropic.com>
- Replace nested case statements with associative arrays in check_dependencies()
- Consolidate deb/rpm packaging handlers in run_packaging()
- Merge deb|rpm cases in print_next_steps()
- Fix escape inconsistency in build-rpm-package.sh heredoc
Co-Authored-By: Claude <claude@anthropic.com>
- Remove unused rpm_arch variable from build.sh
- Comment out unused maintainer parameter in build-rpm-package.sh
Co-Authored-By: Claude <claude@anthropic.com>
- Skip root user check when CI, GITHUB_ACTIONS env vars are set,
or when /.dockerenv exists (container detection)
- Skip sudo when already running as root for dependency installation
This fixes the RPM build failures in GitHub Actions where the
Fedora container runs as root by default.
Co-Authored-By: Claude <claude@anthropic.com>
- Update build-amd64.yml and build-arm64.yml to support RPM builds
using Fedora 42 container when artifact_suffix is 'rpm'
- Add RPM to artifact path patterns for upload
- Add rpm matrix entries for both amd64 and arm64 in ci.yml
- Download RPM artifacts in release job
RPM packages are now built alongside deb and AppImage for each release.
Co-Authored-By: Claude <claude@anthropic.com>
- Refactor detect_architecture() to use uname -m instead of dpkg
- Add detect_distro() to identify debian/rpm/unknown distro families
- Update check_dependencies() to support both apt (Debian) and dnf (Fedora)
- Add 'rpm' as valid build format with auto-detection based on distro
- Create scripts/build-rpm-package.sh for RPM package generation
- Update README with RPM/Fedora installation and build instructions
The build script now automatically selects the appropriate package format:
- Debian/Ubuntu: .deb (default)
- Fedora/RHEL: .rpm (default)
- Other: .AppImage (default)
Users can still override with --build deb|rpm|appimage on any distro.
Closes#187
Co-Authored-By: Claude <claude@anthropic.com>
reprepro requires Section and Priority fields in the control file.
Add these to build-deb-package.sh and use --section/--priority flags
in CI workflow for backwards compatibility with older packages.
Tested locally with reprepro and apt - repository works correctly.
Part of #185
Co-Authored-By: Claude <claude@anthropic.com>
- Add new "Using APT Repository" section as recommended installation method
- Include commands for adding GPG key and repository
- Update uninstallation section with APT removal instructions
- Update softprops/action-gh-release from v1 to v2 (fixes actionlint warning)
Part of #185
Co-Authored-By: Claude <claude@anthropic.com>
Add new workflow job that runs after release to update the APT
repository hosted on GitHub Pages:
- Downloads amd64 and arm64 .deb artifacts
- Uses reprepro to add packages to the repository
- Commits and pushes changes to gh-pages branch
Requires APT_GPG_PRIVATE_KEY secret to be configured.
Part of #185
Co-Authored-By: Claude <claude@anthropic.com>
Add guidance on reviewing code state at time of issue creation
to identify if issues have already been addressed in later commits.
Co-Authored-By: Claude <claude@anthropic.com>
Add documentation for fixing recurring API 401 errors caused by
cached OAuth token expiration. Credits MrEdwards007 for the fix
and links to issue #156 and the scripted solution.
Co-Authored-By: Claude <claude@anthropic.com>
These files are not used by the build process:
- Build script creates its own package.json in build/
- No CI workflows reference these files
- No node_modules exists in root
Fixes#182
Co-Authored-By: Claude <claude@anthropic.com>
Code simplifications from cdd-code-simplifier:
- Consolidate duplicate argument validation in build.sh
- Use early returns to reduce nesting depth
- Convert multi-line conditionals to single-line where clearer
- Simplify icon array in build-deb-package.sh
- Refactor appimagetool discovery loop in build-appimage.sh
Additional changes:
- Update Claude Desktop URLs to v1.1.673 (from main)
- Fix check-claude-version.yml patterns for lowercase variable names
- Add version check guidance to CLAUDE.md
Co-Authored-By: Claude <claude@anthropic.com>
Apply consistent bash style guide (style.ysap.sh) across all scripts:
- Change shebang to #!/usr/bin/env bash
- Remove set -e/set -euo pipefail, add explicit error handling
- Convert indentation from 4 spaces to tabs
- Use lowercase for variables, UPPERCASE only for exports/constants
- Use [[ ]] for conditionals, (( )) for arithmetic
- Use single quotes for literals, double quotes for expansion
- Remove emoji characters from output messages
Files refactored:
- build.sh (~991 lines)
- scripts/build-appimage.sh (~311 lines)
- scripts/build-deb-package.sh (~242 lines)
- scripts/launcher-common.sh (~95 lines)
Tested: AppImage build completes successfully in distrobox.
Fixes#179
Co-Authored-By: Claude <claude@anthropic.com>
Add project-level code simplifier agent adapted for bash/shell
scripting best practices. Includes guidelines for:
- Function organization and local variables
- Variable quoting and naming conventions
- Error handling patterns
- Shellcheck recommendations
Uses standalone agent in .claude/agents/ for project-specific use.
Also removes .claude/ from .gitignore to allow tracking.
Part of #179
Co-Authored-By: Claude <claude@anthropic.com>
- Create scripts/launcher-common.sh with shared functions:
- setup_logging(), log_message()
- detect_display_backend(), check_display()
- build_electron_args(), setup_electron_env()
- Update build-appimage.sh to use shared library
- Update build-deb-package.sh to use shared library
- Reduces duplication by ~94 lines
Part of #179
Co-Authored-By: Claude <claude@anthropic.com>
- Extract frame-fix-wrapper.js to scripts/frame-fix-wrapper.js
- Extract claude-native stub to scripts/claude-native-stub.js
- Remove duplicate claude-native stub (was defined twice)
- Reduces build.sh by ~145 lines
Part of #179
Co-Authored-By: Claude <claude@anthropic.com>
Update cleanup workflow to preserve recent runs for debugging purposes.
Now only deletes runs that are both:
- Not tied to a release tag (headBranch doesn't start with "v")
- Older than 3 days
Relates to #174
Add a scheduled GitHub Action that runs weekly (Thursday midnight UTC)
to delete workflow runs not tied to release tags. Preserves runs where
headBranch starts with "v" (release tags like v1.2.4+claude1.1.381).
Can also be triggered manually via workflow_dispatch.
Fixes#174