name: Agent marketplace release on: workflow_call: inputs: target_branch: description: Branch that receives release-please changes. required: false type: string default: main skill_root: description: Canonical skill directory relative to the repository root. required: false type: string default: skills claude_marketplace_file: description: Claude marketplace manifest relative to the repository root. required: false type: string default: .claude-plugin/marketplace.json claude_plugin_file: description: Claude plugin manifest relative to the repository root. required: false type: string default: .claude-plugin/plugin.json codex_plugin_root: description: Codex plugin root relative to the repository root. required: false type: string default: plugins/marketplace cursor_plugin_root: description: Cursor plugin root relative to the repository root. required: false type: string default: plugins/marketplace release_config_file: description: Release Please configuration file. required: false type: string default: release-please-config.json release_manifest_file: description: Release Please manifest file. required: false type: string default: .release-please-manifest.json package_paths: description: Space-separated paths to package into the release archive. required: false type: string default: skills .claude-plugin .cursor-plugin .agents plugins README.md CHANGELOG.md archive_name: description: Prefix used for the release archive. required: false type: string default: agent-marketplace claude_plugin_name: description: Claude plugin name used in the installation summary. required: false type: string default: marketplace claude_marketplace_name: description: Claude marketplace name used in the installation summary. required: false type: string default: marketplace codex_marketplace_name: description: Codex marketplace name shown in the installation summary. required: false type: string default: marketplace cursor_plugin_name: description: Cursor plugin name shown in the installation summary. required: false type: string default: marketplace publish_gitea: description: Upload the released archive to Gitea and write its URL to the summary. required: false type: boolean default: false gitea_url: description: Base URL of the Gitea instance. required: false type: string default: "" gitea_user: description: Gitea user or organization that owns the generic package. required: false type: string default: "" secrets: GITHUB_PAT: description: Optional GitHub token for release-please pull requests. required: false GITEA_TOKEN: description: Gitea token with permission to publish generic packages. required: false permissions: contents: write pull-requests: write concurrency: group: release-please cancel-in-progress: false jobs: release-please: runs-on: ubuntu-latest outputs: release_created: ${{ steps.release.outputs.release_created }} tag_name: ${{ steps.release.outputs.tag_name }} version: ${{ steps.release.outputs.version }} steps: - name: Create or update release PR id: release uses: googleapis/release-please-action@v4 with: token: ${{ secrets.GITHUB_PAT || github.token }} target-branch: ${{ inputs.target_branch }} config-file: ${{ inputs.release_config_file }} manifest-file: ${{ inputs.release_manifest_file }} publish: needs: release-please if: needs.release-please.outputs.release_created == 'true' runs-on: ubuntu-latest permissions: contents: write steps: - name: Check out released version uses: actions/checkout@v4 with: ref: ${{ needs.release-please.outputs.tag_name }} - name: Validate released marketplace uses: walter-base/common-workflow/actions/validate-agent-marketplace@master with: skill_root: ${{ inputs.skill_root }} claude_marketplace_file: ${{ inputs.claude_marketplace_file }} claude_plugin_file: ${{ inputs.claude_plugin_file }} codex_plugin_root: ${{ inputs.codex_plugin_root }} cursor_plugin_root: ${{ inputs.cursor_plugin_root }} - name: Build release archive env: VERSION: ${{ needs.release-please.outputs.version }} PACKAGE_PATHS: ${{ inputs.package_paths }} ARCHIVE_NAME: ${{ inputs.archive_name }} shell: bash run: | dir="${ARCHIVE_NAME}-${VERSION}" mkdir -p "dist/${dir}" for path in ${PACKAGE_PATHS}; do cp -R "$path" "dist/${dir}/" done tar -czf "dist/${dir}.tar.gz" -C dist "${dir}" - name: Upload archive to Gitea if: inputs.publish_gitea env: ARCHIVE_NAME: ${{ inputs.archive_name }} GITEA_URL: ${{ inputs.gitea_url }} GITEA_USER: ${{ inputs.gitea_user }} GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} VERSION: ${{ needs.release-please.outputs.version }} run: | : "${GITEA_URL:?Set gitea_url when publish_gitea is enabled}" : "${GITEA_USER:?Set gitea_user when publish_gitea is enabled}" : "${GITEA_TOKEN:?Pass GITEA_TOKEN when publish_gitea is enabled}" archive="${ARCHIVE_NAME}-${VERSION}.tar.gz" package_url="${GITEA_URL%/}/api/packages/${GITEA_USER}/generic/${ARCHIVE_NAME}/${VERSION}/${archive}" curl --fail-with-body --retry 3 \ --user "${GITEA_USER}:${GITEA_TOKEN}" \ --upload-file "dist/${archive}" \ "$package_url" cat >> "$GITHUB_STEP_SUMMARY" <> "$GITHUB_STEP_SUMMARY" <