From 436afe41ab17b2b4c49f9ef4bab05a5ca8043fbd Mon Sep 17 00:00:00 2001 From: Walter Cheng Date: Sat, 18 Jul 2026 09:58:11 -0400 Subject: [PATCH 1/5] fix: resolve marketplace name from artifact --- .github/workflows/agent-marketplace-release.yaml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/agent-marketplace-release.yaml b/.github/workflows/agent-marketplace-release.yaml index 7e415eb..e956158 100644 --- a/.github/workflows/agent-marketplace-release.yaml +++ b/.github/workflows/agent-marketplace-release.yaml @@ -206,10 +206,13 @@ jobs: mkdir -p "\$(dirname "\$install_dir")" mv "\$tmp_dir/extracted/${ARCHIVE_NAME}-\${version}" "\$install_dir" + marketplace_name="\$(jq -r '.name // empty' "\$install_dir/.claude-plugin/marketplace.json")" + : "\${marketplace_name:?Claude marketplace manifest is missing a name}" claude plugin marketplace remove '${CLAUDE_MARKETPLACE_NAME}' >/dev/null 2>&1 || true + claude plugin marketplace remove "\$marketplace_name" >/dev/null 2>&1 || true claude plugin marketplace add "\$install_dir" - claude plugin install '${CLAUDE_PLUGIN_NAME}@${CLAUDE_MARKETPLACE_NAME}' - echo "Installed ${CLAUDE_PLUGIN_NAME} for Claude Code from Gitea." + claude plugin install "${CLAUDE_PLUGIN_NAME}@\$marketplace_name" + echo "Installed ${CLAUDE_PLUGIN_NAME} for Claude Code from Gitea marketplace \$marketplace_name." EOF chmod +x "dist/install-${ARCHIVE_NAME}-claude-${VERSION}.sh" @@ -230,10 +233,13 @@ jobs: mkdir -p "\$(dirname "\$install_dir")" mv "\$tmp_dir/extracted/${ARCHIVE_NAME}-\${version}" "\$install_dir" + marketplace_name="\$(jq -r '.name // empty' "\$install_dir/.agents/plugins/marketplace.json")" + : "\${marketplace_name:?Codex marketplace manifest is missing a name}" codex plugin marketplace remove '${CODEX_MARKETPLACE_NAME}' >/dev/null 2>&1 || true + codex plugin marketplace remove "\$marketplace_name" >/dev/null 2>&1 || true codex plugin marketplace add "\$install_dir" - codex plugin add '${CODEX_PLUGIN_NAME}@${CODEX_MARKETPLACE_NAME}' - echo "Installed ${CODEX_PLUGIN_NAME} for Codex from Gitea." + codex plugin add "${CODEX_PLUGIN_NAME}@\$marketplace_name" + echo "Installed ${CODEX_PLUGIN_NAME} for Codex from Gitea marketplace \$marketplace_name." EOF chmod +x "dist/install-${ARCHIVE_NAME}-codex-${VERSION}.sh" From 2e9ae2942495d79f78f8365c69a4fd0c0605480b Mon Sep 17 00:00:00 2001 From: Walter Cheng Date: Sat, 18 Jul 2026 10:08:40 -0400 Subject: [PATCH 2/5] feat: publish installers for all agents --- .../workflows/agent-marketplace-release.yaml | 106 ++++++++++++++++-- 1 file changed, 98 insertions(+), 8 deletions(-) diff --git a/.github/workflows/agent-marketplace-release.yaml b/.github/workflows/agent-marketplace-release.yaml index e956158..bc7a2fd 100644 --- a/.github/workflows/agent-marketplace-release.yaml +++ b/.github/workflows/agent-marketplace-release.yaml @@ -63,6 +63,16 @@ on: required: false type: string default: agent-marketplace-codex + opencode_package_name: + description: Public Gitea generic package name for the OpenCode release artifact. + required: false + type: string + default: agent-marketplace-opencode + cursor_package_name: + description: Public Gitea generic package name for the Cursor release artifact. + required: false + type: string + default: agent-marketplace-cursor claude_plugin_name: description: Claude plugin name used in the installation summary. required: false @@ -89,7 +99,7 @@ on: type: string default: marketplace publish_gitea: - description: Upload public Claude and Codex installer packages to Gitea. + description: Upload public installers for Claude, Codex, OpenCode, and Cursor to Gitea. required: false type: boolean default: false @@ -171,6 +181,8 @@ jobs: done tar -czf "dist/${ARCHIVE_NAME}-claude-${VERSION}.tar.gz" -C dist "${dir}" tar -czf "dist/${ARCHIVE_NAME}-codex-${VERSION}.tar.gz" -C dist "${dir}" + tar -czf "dist/${ARCHIVE_NAME}-opencode-${VERSION}.tar.gz" -C dist "${dir}" + tar -czf "dist/${ARCHIVE_NAME}-cursor-${VERSION}.tar.gz" -C dist "${dir}" - name: Build Gitea installers if: inputs.publish_gitea @@ -178,6 +190,8 @@ jobs: ARCHIVE_NAME: ${{ inputs.archive_name }} CLAUDE_PACKAGE_NAME: ${{ inputs.claude_package_name }} CODEX_PACKAGE_NAME: ${{ inputs.codex_package_name }} + OPENCODE_PACKAGE_NAME: ${{ inputs.opencode_package_name }} + CURSOR_PACKAGE_NAME: ${{ inputs.cursor_package_name }} GITEA_URL: ${{ inputs.gitea_url }} GITEA_USER: ${{ inputs.gitea_user }} VERSION: ${{ needs.release-please.outputs.version }} @@ -243,6 +257,50 @@ jobs: EOF chmod +x "dist/install-${ARCHIVE_NAME}-codex-${VERSION}.sh" + cat > "dist/install-${ARCHIVE_NAME}-opencode-${VERSION}.sh" < "dist/install-${ARCHIVE_NAME}-cursor-${VERSION}.sh" <> "$GITHUB_OUTPUT" echo "codex_installer_url=${codex_base}/${codex_installer}" >> "$GITHUB_OUTPUT" + echo "opencode_installer_url=${opencode_base}/${opencode_installer}" >> "$GITHUB_OUTPUT" + echo "cursor_installer_url=${cursor_base}/${cursor_installer}" >> "$GITHUB_OUTPUT" - name: Upload archive to GitHub Release if: ${{ !inputs.publish_gitea }} @@ -300,12 +372,14 @@ jobs: CURSOR_PLUGIN_NAME: ${{ inputs.cursor_plugin_name }} GITEA_CLAUDE_INSTALLER_URL: ${{ steps.gitea.outputs.claude_installer_url }} GITEA_CODEX_INSTALLER_URL: ${{ steps.gitea.outputs.codex_installer_url }} + GITEA_OPENCODE_INSTALLER_URL: ${{ steps.gitea.outputs.opencode_installer_url }} + GITEA_CURSOR_INSTALLER_URL: ${{ steps.gitea.outputs.cursor_installer_url }} run: | { printf '# Agent plugin %s\n\n' "$VERSION" printf 'Release tag: `%s`\n\n' "$TAG" - if [[ -n "$GITEA_CLAUDE_INSTALLER_URL" && -n "$GITEA_CODEX_INSTALLER_URL" ]]; then + if [[ -n "$GITEA_CLAUDE_INSTALLER_URL" && -n "$GITEA_CODEX_INSTALLER_URL" && -n "$GITEA_OPENCODE_INSTALLER_URL" && -n "$GITEA_CURSOR_INSTALLER_URL" ]]; then printf '## Claude Code\n\n' printf '%s\n' '```bash' printf 'curl --fail --location --output install-claude.sh "%s"\n' "$GITEA_CLAUDE_INSTALLER_URL" @@ -333,11 +407,27 @@ jobs: printf '%s\n\n' '```' fi - printf '## OpenCode and Cursor\n\n' - printf '%s\n' '```bash' - printf 'npx skills add %s/%s/tree/%s/%s --agent opencode --skill '\''*'\'' --yes --global\n' "$SERVER_URL" "$REPOSITORY" "$TAG" "$SKILL_ROOT" - printf 'npx skills add %s/%s/tree/%s/%s --agent cursor --skill '\''*'\'' --yes --global\n' "$SERVER_URL" "$REPOSITORY" "$TAG" "$SKILL_ROOT" - printf '%s\n' '```' + if [[ -n "$GITEA_OPENCODE_INSTALLER_URL" && -n "$GITEA_CURSOR_INSTALLER_URL" ]]; then + printf '## OpenCode\n\n' + printf '%s\n' '```bash' + printf 'curl --fail --location --output install-opencode.sh "%s"\n' "$GITEA_OPENCODE_INSTALLER_URL" + printf 'chmod +x install-opencode.sh\n' + printf './install-opencode.sh\n' + printf '%s\n\n' '```' + + printf '## Cursor\n\n' + printf '%s\n' '```bash' + printf 'curl --fail --location --output install-cursor.sh "%s"\n' "$GITEA_CURSOR_INSTALLER_URL" + printf 'chmod +x install-cursor.sh\n' + printf './install-cursor.sh\n' + printf '%s\n\n' '```' + else + printf '## OpenCode and Cursor\n\n' + printf '%s\n' '```bash' + printf 'npx skills add %s/%s/tree/%s/%s --agent opencode --skill '\''*'\'' --yes --global\n' "$SERVER_URL" "$REPOSITORY" "$TAG" "$SKILL_ROOT" + printf 'npx skills add %s/%s/tree/%s/%s --agent cursor --skill '\''*'\'' --yes --global\n' "$SERVER_URL" "$REPOSITORY" "$TAG" "$SKILL_ROOT" + printf '%s\n' '```' + fi if [[ -n "$GITEA_CLAUDE_INSTALLER_URL" && -n "$GITEA_CODEX_INSTALLER_URL" ]]; then printf '\nInstallers are public Gitea artifacts; no Gitea token is required.\n' From da039268e869353e74bfc8ebc57fc087bfc8c98f Mon Sep 17 00:00:00 2001 From: Walter Cheng Date: Sat, 18 Jul 2026 10:45:31 -0400 Subject: [PATCH 3/5] refactor: use one agent installer archive --- .../workflows/agent-marketplace-release.yaml | 143 +++++++----------- 1 file changed, 58 insertions(+), 85 deletions(-) diff --git a/.github/workflows/agent-marketplace-release.yaml b/.github/workflows/agent-marketplace-release.yaml index bc7a2fd..77d84d2 100644 --- a/.github/workflows/agent-marketplace-release.yaml +++ b/.github/workflows/agent-marketplace-release.yaml @@ -53,26 +53,11 @@ on: required: false type: string default: agent-marketplace - claude_package_name: - description: Public Gitea generic package name for the Claude release artifact. + gitea_package_name: + description: Public Gitea generic package name for the release artifact. required: false type: string - default: agent-marketplace-claude - codex_package_name: - description: Public Gitea generic package name for the Codex release artifact. - required: false - type: string - default: agent-marketplace-codex - opencode_package_name: - description: Public Gitea generic package name for the OpenCode release artifact. - required: false - type: string - default: agent-marketplace-opencode - cursor_package_name: - description: Public Gitea generic package name for the Cursor release artifact. - required: false - type: string - default: agent-marketplace-cursor + default: agent-marketplace claude_plugin_name: description: Claude plugin name used in the installation summary. required: false @@ -179,37 +164,32 @@ jobs: for path in ${PACKAGE_PATHS}; do cp -R "$path" "dist/${dir}/" done - tar -czf "dist/${ARCHIVE_NAME}-claude-${VERSION}.tar.gz" -C dist "${dir}" - tar -czf "dist/${ARCHIVE_NAME}-codex-${VERSION}.tar.gz" -C dist "${dir}" - tar -czf "dist/${ARCHIVE_NAME}-opencode-${VERSION}.tar.gz" -C dist "${dir}" - tar -czf "dist/${ARCHIVE_NAME}-cursor-${VERSION}.tar.gz" -C dist "${dir}" + tar -czf "dist/${ARCHIVE_NAME}-${VERSION}.tar.gz" -C dist "${dir}" - name: Build Gitea installers if: inputs.publish_gitea env: ARCHIVE_NAME: ${{ inputs.archive_name }} - CLAUDE_PACKAGE_NAME: ${{ inputs.claude_package_name }} - CODEX_PACKAGE_NAME: ${{ inputs.codex_package_name }} - OPENCODE_PACKAGE_NAME: ${{ inputs.opencode_package_name }} - CURSOR_PACKAGE_NAME: ${{ inputs.cursor_package_name }} + GITEA_PACKAGE_NAME: ${{ inputs.gitea_package_name }} GITEA_URL: ${{ inputs.gitea_url }} GITEA_USER: ${{ inputs.gitea_user }} VERSION: ${{ needs.release-please.outputs.version }} - CLAUDE_PLUGIN_NAME: ${{ inputs.claude_plugin_name }} - CLAUDE_MARKETPLACE_NAME: ${{ inputs.claude_marketplace_name }} - CODEX_PLUGIN_NAME: ${{ inputs.codex_plugin_name }} - CODEX_MARKETPLACE_NAME: ${{ inputs.codex_marketplace_name }} shell: bash run: | : "${GITEA_URL:?Set gitea_url when publish_gitea is enabled}" : "${GITEA_USER:?Set gitea_user when publish_gitea is enabled}" - cat > "dist/install-${ARCHIVE_NAME}-claude-${VERSION}.sh" < "dist/install-${ARCHIVE_NAME}-${VERSION}.sh" <&2; exit 2 ;; + esac + install_dir="\${MEDIVA_PLUGIN_DIR:-\$HOME/.local/share/${ARCHIVE_NAME}/\$agent}" + archive_url="${GITEA_URL%/}/api/packages/${GITEA_USER}/generic/${GITEA_PACKAGE_NAME}/\${version}/${ARCHIVE_NAME}-\${version}.tar.gz" tmp_dir="\$(mktemp -d)" trap 'rm -rf "\$tmp_dir"' EXIT @@ -220,16 +200,32 @@ jobs: mkdir -p "\$(dirname "\$install_dir")" mv "\$tmp_dir/extracted/${ARCHIVE_NAME}-\${version}" "\$install_dir" - marketplace_name="\$(jq -r '.name // empty' "\$install_dir/.claude-plugin/marketplace.json")" - : "\${marketplace_name:?Claude marketplace manifest is missing a name}" - claude plugin marketplace remove '${CLAUDE_MARKETPLACE_NAME}' >/dev/null 2>&1 || true - claude plugin marketplace remove "\$marketplace_name" >/dev/null 2>&1 || true - claude plugin marketplace add "\$install_dir" - claude plugin install "${CLAUDE_PLUGIN_NAME}@\$marketplace_name" - echo "Installed ${CLAUDE_PLUGIN_NAME} for Claude Code from Gitea marketplace \$marketplace_name." + case "\$agent" in + claude) + marketplace_name="\$(jq -r '.name // empty' "\$install_dir/.claude-plugin/marketplace.json")" + : "\${marketplace_name:?Claude marketplace manifest is missing a name}" + claude plugin marketplace remove "\$marketplace_name" >/dev/null 2>&1 || true + claude plugin marketplace add "\$install_dir" + plugin_name="\$(jq -r '.plugins[0].name // empty' "\$install_dir/.claude-plugin/marketplace.json")" + claude plugin install "\$plugin_name@\$marketplace_name" + ;; + codex) + marketplace_name="\$(jq -r '.name // empty' "\$install_dir/.agents/plugins/marketplace.json")" + : "\${marketplace_name:?Codex marketplace manifest is missing a name}" + codex plugin marketplace remove "\$marketplace_name" >/dev/null 2>&1 || true + codex plugin marketplace add "\$install_dir" + plugin_name="\$(jq -r '.plugins[0].name // empty' "\$install_dir/.agents/plugins/marketplace.json")" + codex plugin add "\$plugin_name@\$marketplace_name" + ;; + opencode|cursor) + npx --yes skills add "\$install_dir/skills" --agent "\$agent" --skill '*' --yes --global + ;; + esac + echo "Installed skills for \$agent from Gitea." EOF - chmod +x "dist/install-${ARCHIVE_NAME}-claude-${VERSION}.sh" + chmod +x "dist/install-${ARCHIVE_NAME}-${VERSION}.sh" + if false; then cat > "dist/install-${ARCHIVE_NAME}-codex-${VERSION}.sh" <> "$GITHUB_OUTPUT" - echo "codex_installer_url=${codex_base}/${codex_installer}" >> "$GITHUB_OUTPUT" - echo "opencode_installer_url=${opencode_base}/${opencode_installer}" >> "$GITHUB_OUTPUT" - echo "cursor_installer_url=${cursor_base}/${cursor_installer}" >> "$GITHUB_OUTPUT" + echo "installer_url=${package_base}/${installer}" >> "$GITHUB_OUTPUT" - name: Upload archive to GitHub Release if: ${{ !inputs.publish_gitea }} @@ -370,28 +346,25 @@ jobs: CODEX_PLUGIN_NAME: ${{ inputs.codex_plugin_name }} CODEX_MARKETPLACE_NAME: ${{ inputs.codex_marketplace_name }} CURSOR_PLUGIN_NAME: ${{ inputs.cursor_plugin_name }} - GITEA_CLAUDE_INSTALLER_URL: ${{ steps.gitea.outputs.claude_installer_url }} - GITEA_CODEX_INSTALLER_URL: ${{ steps.gitea.outputs.codex_installer_url }} - GITEA_OPENCODE_INSTALLER_URL: ${{ steps.gitea.outputs.opencode_installer_url }} - GITEA_CURSOR_INSTALLER_URL: ${{ steps.gitea.outputs.cursor_installer_url }} + GITEA_INSTALLER_URL: ${{ steps.gitea.outputs.installer_url }} run: | { printf '# Agent plugin %s\n\n' "$VERSION" printf 'Release tag: `%s`\n\n' "$TAG" - if [[ -n "$GITEA_CLAUDE_INSTALLER_URL" && -n "$GITEA_CODEX_INSTALLER_URL" && -n "$GITEA_OPENCODE_INSTALLER_URL" && -n "$GITEA_CURSOR_INSTALLER_URL" ]]; then + if [[ -n "$GITEA_INSTALLER_URL" ]]; then printf '## Claude Code\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-claude.sh "%s"\n' "$GITEA_CLAUDE_INSTALLER_URL" + printf 'curl --fail --location --output install-claude.sh "%s"\n' "$GITEA_INSTALLER_URL" printf 'chmod +x install-claude.sh\n' - printf './install-claude.sh\n' + printf './install-claude.sh claude\n' printf '%s\n\n' '```' printf '## Codex\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-codex.sh "%s"\n' "$GITEA_CODEX_INSTALLER_URL" + printf 'curl --fail --location --output install-codex.sh "%s"\n' "$GITEA_INSTALLER_URL" printf 'chmod +x install-codex.sh\n' - printf './install-codex.sh\n' + printf './install-codex.sh codex\n' printf '%s\n\n' '```' else printf '## Claude Code\n\n' @@ -407,19 +380,19 @@ jobs: printf '%s\n\n' '```' fi - if [[ -n "$GITEA_OPENCODE_INSTALLER_URL" && -n "$GITEA_CURSOR_INSTALLER_URL" ]]; then + if [[ -n "$GITEA_INSTALLER_URL" ]]; then printf '## OpenCode\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-opencode.sh "%s"\n' "$GITEA_OPENCODE_INSTALLER_URL" + printf 'curl --fail --location --output install-opencode.sh "%s"\n' "$GITEA_INSTALLER_URL" printf 'chmod +x install-opencode.sh\n' - printf './install-opencode.sh\n' + printf './install-opencode.sh opencode\n' printf '%s\n\n' '```' printf '## Cursor\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-cursor.sh "%s"\n' "$GITEA_CURSOR_INSTALLER_URL" + printf 'curl --fail --location --output install-cursor.sh "%s"\n' "$GITEA_INSTALLER_URL" printf 'chmod +x install-cursor.sh\n' - printf './install-cursor.sh\n' + printf './install-cursor.sh cursor\n' printf '%s\n\n' '```' else printf '## OpenCode and Cursor\n\n' @@ -429,7 +402,7 @@ jobs: printf '%s\n' '```' fi - if [[ -n "$GITEA_CLAUDE_INSTALLER_URL" && -n "$GITEA_CODEX_INSTALLER_URL" ]]; then + if [[ -n "$GITEA_INSTALLER_URL" ]]; then printf '\nInstallers are public Gitea artifacts; no Gitea token is required.\n' fi } >> "$GITHUB_STEP_SUMMARY" From 2f9e4b7ba33f84ca05aa06c14930742ae9bd0658 Mon Sep 17 00:00:00 2001 From: Walter Cheng Date: Sat, 18 Jul 2026 10:57:55 -0400 Subject: [PATCH 4/5] feat: add archive update command --- .../workflows/agent-marketplace-release.yaml | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/.github/workflows/agent-marketplace-release.yaml b/.github/workflows/agent-marketplace-release.yaml index 77d84d2..04760ca 100644 --- a/.github/workflows/agent-marketplace-release.yaml +++ b/.github/workflows/agent-marketplace-release.yaml @@ -182,12 +182,27 @@ jobs: #!/usr/bin/env bash set -euo pipefail - agent="\${1:-}" + command="\${1:-}" + agent="\$command" version="\${2:-${VERSION}}" + if [[ "\$command" == update ]]; then + agent="\${2:-all}" + version="latest" + fi + if [[ "\$command" == update && "\$agent" == all ]]; then + for target in claude codex opencode cursor; do + "\$0" "\$target" latest + done + exit 0 + fi case "\$agent" in claude|codex|opencode|cursor) ;; - *) echo "Usage: \$0 {claude|codex|opencode|cursor} [version]" >&2; exit 2 ;; + *) echo "Usage: \$0 {claude|codex|opencode|cursor} [version] | update [agent|all]" >&2; exit 2 ;; esac + if [[ "\$version" == latest ]]; then + version="\$(curl --fail --location --retry 3 "${GITEA_URL%/}/api/v1/packages/${GITEA_USER}/generic/${GITEA_PACKAGE_NAME}/-/latest" | jq -r '.version // empty')" + : "\${version:?Gitea did not return a latest package version}" + fi install_dir="\${MEDIVA_PLUGIN_DIR:-\$HOME/.local/share/${ARCHIVE_NAME}/\$agent}" archive_url="${GITEA_URL%/}/api/packages/${GITEA_USER}/generic/${GITEA_PACKAGE_NAME}/\${version}/${ARCHIVE_NAME}-\${version}.tar.gz" tmp_dir="\$(mktemp -d)" @@ -338,6 +353,7 @@ jobs: env: VERSION: ${{ needs.release-please.outputs.version }} TAG: ${{ needs.release-please.outputs.tag_name }} + ARCHIVE_NAME: ${{ inputs.archive_name }} REPOSITORY: ${{ github.repository }} SERVER_URL: ${{ github.server_url }} SKILL_ROOT: ${{ inputs.skill_root }} @@ -403,6 +419,9 @@ jobs: fi if [[ -n "$GITEA_INSTALLER_URL" ]]; then - printf '\nInstallers are public Gitea artifacts; no Gitea token is required.\n' + printf '\nUpdate all installed agents later with:\n\n%s\n\n' '```bash' + printf './install-%s-%s.sh update all\n' "$ARCHIVE_NAME" "$VERSION" + printf '%s\n' '```' + printf 'Installers are public Gitea artifacts; no Gitea token is required.\n' fi } >> "$GITHUB_STEP_SUMMARY" From 70ab41b51b48adc85ffaef726063fa47c4e0120c Mon Sep 17 00:00:00 2001 From: Walter Cheng Date: Sat, 18 Jul 2026 10:59:35 -0400 Subject: [PATCH 5/5] fix: use one installer in release summary --- .../workflows/agent-marketplace-release.yaml | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/.github/workflows/agent-marketplace-release.yaml b/.github/workflows/agent-marketplace-release.yaml index 04760ca..6ba39d4 100644 --- a/.github/workflows/agent-marketplace-release.yaml +++ b/.github/workflows/agent-marketplace-release.yaml @@ -371,16 +371,14 @@ jobs: if [[ -n "$GITEA_INSTALLER_URL" ]]; then printf '## Claude Code\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-claude.sh "%s"\n' "$GITEA_INSTALLER_URL" - printf 'chmod +x install-claude.sh\n' - printf './install-claude.sh claude\n' + printf 'curl --fail --location --output install-%s.sh "%s"\n' "$ARCHIVE_NAME" "$GITEA_INSTALLER_URL" + printf 'chmod +x install-%s.sh\n' "$ARCHIVE_NAME" + printf './install-%s.sh claude\n' "$ARCHIVE_NAME" printf '%s\n\n' '```' printf '## Codex\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-codex.sh "%s"\n' "$GITEA_INSTALLER_URL" - printf 'chmod +x install-codex.sh\n' - printf './install-codex.sh codex\n' + printf './install-%s.sh codex\n' "$ARCHIVE_NAME" printf '%s\n\n' '```' else printf '## Claude Code\n\n' @@ -399,16 +397,12 @@ jobs: if [[ -n "$GITEA_INSTALLER_URL" ]]; then printf '## OpenCode\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-opencode.sh "%s"\n' "$GITEA_INSTALLER_URL" - printf 'chmod +x install-opencode.sh\n' - printf './install-opencode.sh opencode\n' + printf './install-%s.sh opencode\n' "$ARCHIVE_NAME" printf '%s\n\n' '```' printf '## Cursor\n\n' printf '%s\n' '```bash' - printf 'curl --fail --location --output install-cursor.sh "%s"\n' "$GITEA_INSTALLER_URL" - printf 'chmod +x install-cursor.sh\n' - printf './install-cursor.sh cursor\n' + printf './install-%s.sh cursor\n' "$ARCHIVE_NAME" printf '%s\n\n' '```' else printf '## OpenCode and Cursor\n\n'