# Source build of opencode 1.19.5 for openEuler 24.03 LTS SP4 (x86_64). # # Adapted from the openEuler EUR reference SRPM (user_76c6f026/oed-opencode-2509, # opencode-1.19.5-1), which itself was rebuilt from the 24.03 LTS SP4 source # build. The EUR upload endpoint rejects SRPMs of a few MB, so the reference # spec fetched the upstream archive in %prep from a reachable GitHub proxy. # This COPR build ships the archive in the SRPM instead (Source0) and %prep # prefers it, so the build does not depend on a proxy being reachable. Node.js # and Bun come from Huawei Cloud mirrors and the npm dependency tree from the # Huawei npm mirror. The models.dev snapshot is small enough to ship compressed # in the SRPM (Source1), keeping the build off the models.dev network API. # # The upstream source is pruned to the CLI + embedded Web UI workspace closure # (console/stats/desktop/docs/web/storybook/slack/identity/containers/cli/ # sdk-next/function removed). The ghostty-web dependency, which upstream pins # to a GitHub commit, is switched to the published 0.3.0 npm package so the # build does not need GitHub access. # # topdir: opencode-1.19.5 # Bun's single-file output embeds the version metadata in ELF sections; any # strip (find-debuginfo/brp-strip) removes them and makes `opencode --version` # fall back to the Bun runtime default, so both are disabled. %global debug_package %{nil} %global __strip /bin/true %global node_version 24.18.0 %global node_sha256 55aa7153f9d88f28d765fcdad5ae6945b5c0f98a36881703817e4c450fa76742 %global bun_version 1.4.4 %global bun_sha256 93ca5a2abe45f3bcac6dd55baff8bb06c4ac824b70f89650b54e5c8b80dbef18 %global src_proxy https://ghfast.top/https://github.com/anomalyco/opencode/archive/refs/tags/v1.19.5.tar.gz Name: opencode Version: 1.19.5 Release: 1%{?dist} Summary: The open source coding agent License: MIT URL: https://github.com/anomalyco/opencode # Source0 carries the upstream tarball (opencode-1.19.5/ top-level dir). Source0: opencode-1.19.5.tar.gz Source1: models-api.json.xz # The build downloads x86_64 Node.js/Bun binaries and produces a linux-x64 # Bun single-file executable; only x86_64 builds are supported. ExclusiveArch: x86_64 BuildRequires: bash BuildRequires: ca-certificates BuildRequires: chrpath BuildRequires: coreutils BuildRequires: cpio BuildRequires: curl BuildRequires: findutils BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: git BuildRequires: glibc-devel BuildRequires: grep BuildRequires: gzip BuildRequires: make BuildRequires: patch BuildRequires: python3 BuildRequires: sed BuildRequires: tar BuildRequires: unzip BuildRequires: which BuildRequires: xz BuildRequires: zip Requires: glibc %description opencode is an AI-powered development tool that runs coding agents in the terminal. This package is compiled from the upstream TypeScript source using Bun, and includes the embedded Web UI. It requires only glibc at runtime; Node.js and Bun are not needed after installation. %prep cd %{_builddir} # The upstream archive ships inside the SRPM as Source0, so %prep needs no # network access. A network fetch of the ~70 MB source from a GitHub proxy # stalled during an earlier build and burned the whole build wall clock, so # the in-SRPM archive is used first; the proxies remain only as a fallback # for the zero-byte placeholder case. src_ok=0 if [ -s "%{SOURCE0}" ] && \ tar -tzf "%{SOURCE0}" 2>/dev/null | grep -q '^opencode-1.19.5/'; then echo "Using source archive shipped in the SRPM: %{SOURCE0}" cp -f "%{SOURCE0}" src.tar.gz src_ok=1 fi if [ "${src_ok}" != "1" ]; then for url in \ "%{src_proxy}" \ "https://gh.llkk.cc/https://github.com/anomalyco/opencode/archive/refs/tags/v1.19.5.tar.gz" \ "https://gh-proxy.com/https://github.com/anomalyco/opencode/archive/refs/tags/v1.19.5.tar.gz"; do echo "Fetching source from ${url}" if curl --fail --location --retry 2 --connect-timeout 30 --max-time 900 \ --output src.tar.gz "${url}"; then if tar -tzf src.tar.gz 2>/dev/null | grep -q '^opencode-1.19.5/'; then src_ok=1 break fi fi rm -f src.tar.gz done fi if [ "${src_ok}" != "1" ]; then echo "ERROR: no source mirror was reachable" >&2 exit 1 fi tar -xzf src.tar.gz cd opencode-1.19.5 # The in-SRPM archive is re-packed from the upstream git clone; drop any VCS # metadata so the build tree matches the upstream tag archive layout. rm -rf .git # Keep only the CLI + embedded-Web-UI workspace closure. rm -rf packages/console packages/stats packages/enterprise packages/desktop \ packages/docs packages/web packages/storybook packages/slack \ packages/identity packages/containers packages/cli packages/sdk-next \ packages/function # Tests, docs, and marketing assets are not build inputs. rm -rf packages/*/test packages/*/tests packages/*/e2e packages/*/test-browser \ packages/*/bench packages/*/storybook packages/*/docs packages/*/examples \ packages/*/example packages/*/__tests__ packages/*/README* \ packages/*/*/test packages/*/*/tests packages/*/*/e2e \ packages/*/*/README* sdks github nix infra specs .github README* \ AGENTS.md CONTRIBUTING.md STATS.md CONTEXT.md perf screenshot-*.png # packages/script (@opencode-ai/script) reads .github/TEAM_MEMBERS at module # load time (top-level await), so the pruning above must leave that file in # place; otherwise `bun run script/build.ts` fails with ENOENT. Only release # tooling consumes the team list, so a stub is enough for the build. mkdir -p .github printf '# build stub: team list is only used by upstream release tooling\n' \ > .github/TEAM_MEMBERS python3 - <<'PY' import json import os path = "package.json" data = json.load(open(path)) data["workspaces"]["packages"] = [ x for x in data["workspaces"]["packages"] if x not in ("packages/console/*", "packages/stats/*", "packages/slack") and not (x == "packages/sdk/js" and not os.path.isdir(x)) ] json.dump(data, open(path, "w"), indent=2) open(path, "a").write("\n") path = "packages/app/package.json" data = json.load(open(path)) data["dependencies"]["ghostty-web"] = "0.3.0" json.dump(data, open(path, "w"), indent=2) open(path, "a").write("\n") PY xz -dc %{SOURCE1} > models-api.json %build cd opencode-1.19.5 export HOME="%{_builddir}/%{name}-%{version}/.home" mkdir -p "$HOME" # Node.js 24.18.0 (the chroot only ships 20.x; upstream needs >= 22). curl --fail --location --retry 3 --connect-timeout 30 \ --output node.tar.xz \ "https://mirrors.huaweicloud.com/nodejs/v%{node_version}/node-v%{node_version}-linux-x64.tar.xz" echo '%{node_sha256} node.tar.xz' | sha256sum -c - mkdir -p "$HOME/node" tar -xJf node.tar.xz -C "$HOME/node" --strip-components=1 export PATH="$HOME/node/bin:$PATH" node --version npm --version # Bun 1.4.4 from the npm platform package curl --fail --location --retry 3 --connect-timeout 30 \ --output bun.tgz \ "https://mirrors.huaweicloud.com/repository/npm/@oven/bun-linux-x64/-/bun-linux-x64-%{bun_version}.tgz" echo '%{bun_sha256} bun.tgz' | sha256sum -c - mkdir -p "$HOME/bun" tar -xzf bun.tgz -C "$HOME/bun" --strip-components=1 export PATH="$HOME/bun/bin:$PATH" bun --version export npm_config_registry="https://mirrors.huaweicloud.com/repository/npm/" export NPM_CONFIG_REGISTRY="$npm_config_registry" export BUN_CONFIG_REGISTRY="$npm_config_registry" export npm_config_prefix="$HOME/npm-global" export NPM_CONFIG_PREFIX="$npm_config_prefix" mkdir -p "$npm_config_prefix" export PATH="$npm_config_prefix/bin:$PATH" npm install -g node-gyp node-gyp --version export BUN_INSTALL_CACHE_DIR="$HOME/bun-cache" export BUN_CONFIG_DISABLE_ANALYTICS=1 export MODELS_DEV_API_JSON="$PWD/models-api.json" export OPENCODE_VERSION="%{version}" export OPENCODE_CHANNEL="prod" export USE_HARD_LINKS=false export HUSKY=0 bun install bun run --cwd packages/core fix-node-pty || : cd packages/opencode bun run script/build.ts --single %install cd opencode-1.19.5 install -Dpm 0755 packages/opencode/dist/opencode-linux-x64/bin/opencode %{buildroot}%{_bindir}/opencode install -Dpm 0644 LICENSE %{buildroot}%{_licensedir}/%{name}/LICENSE %check %{buildroot}%{_bindir}/opencode --version | grep -qx '%{version}' %files %license %{_licensedir}/%{name}/LICENSE %{_bindir}/opencode %changelog * Fri Oct 30 2026 user_76c6f026 - 1.19.5-1 - Build opencode 1.19.5 from source for openEuler 24.03 LTS SP4 x86_64 - Adapt EUR reference spec (25.09) to the 24.03 LTS SP4 chroot - Carry the upstream source archive in the SRPM (no build-time GitHub proxy) - Provision Node.js 24.18.0 / Bun 1.4.4 from Huawei Cloud mirrors (sha256 verified) and resolve the npm tree from the Huawei npm mirror - Ship the models.dev snapshot as Source1 instead of fetching it at build time; switch ghostty-web to the published 0.3.0 package