periplon 0.2.0

Rust SDK for building multi-agent AI workflows and automation
Documentation
name: Release

on:
  push:
    tags:
      - 'v*.*.*'
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to release (e.g., v0.1.0)'
        required: true
        type: string

env:
  CARGO_TERM_COLOR: always

jobs:
  # Create GitHub release
  create-release:
    name: Create Release
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
      version: ${{ steps.get_version.outputs.version }}
    steps:
      - uses: actions/checkout@v4

      - name: Get version
        id: get_version
        run: |
          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
            echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
          else
            echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
          fi

      - name: Create release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.get_version.outputs.version }}
          release_name: Release ${{ steps.get_version.outputs.version }}
          draft: false
          prerelease: ${{ contains(steps.get_version.outputs.version, 'alpha') || contains(steps.get_version.outputs.version, 'beta') || contains(steps.get_version.outputs.version, 'rc') }}
          body: |
            ## Release ${{ steps.get_version.outputs.version }}

            ### Downloads

            #### TUI Binary (periplon-tui)
            - **Linux x86_64**: `periplon-tui-linux-x86_64`
            - **Linux ARM64**: `periplon-tui-linux-aarch64`
            - **macOS x86_64**: `periplon-tui-macos-x86_64`
            - **macOS ARM64** (Apple Silicon): `periplon-tui-macos-aarch64`
            - **Windows x86_64**: `periplon-tui-windows-x86_64.exe`

            #### DSL Executor Binary (periplon-executor)
            - **Linux x86_64**: `periplon-executor-linux-x86_64`
            - **macOS x86_64**: `periplon-executor-macos-x86_64`
            - **macOS ARM64**: `periplon-executor-macos-aarch64`
            - **Windows x86_64**: `periplon-executor-windows-x86_64.exe`

            ### Installation

            #### Quick Install (Unix)
            ```bash
            # TUI
            curl -LO https://github.com/${{ github.repository }}/releases/download/${{ steps.get_version.outputs.version }}/periplon-tui-<platform>
            chmod +x periplon-tui-<platform>
            sudo mv periplon-tui-<platform> /usr/local/bin/periplon-tui

            # Executor
            curl -LO https://github.com/${{ github.repository }}/releases/download/${{ steps.get_version.outputs.version }}/periplon-executor-<platform>
            chmod +x periplon-executor-<platform>
            sudo mv periplon-executor-<platform> /usr/local/bin/periplon-executor
            ```

            #### Verify Checksums
            ```bash
            # Download checksum file
            curl -LO https://github.com/${{ github.repository }}/releases/download/${{ steps.get_version.outputs.version }}/SHA256SUMS

            # Verify
            shasum -a 256 -c SHA256SUMS
            ```

            ### What's Changed
            - Full changelog: https://github.com/${{ github.repository }}/compare/${{ steps.get_version.outputs.version }}

  # Build and upload TUI binaries
  release-tui:
    name: Release TUI (${{ matrix.target }})
    needs: create-release
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            artifact_name: periplon-tui
            asset_name: periplon-tui-linux-x86_64

          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            artifact_name: periplon-tui
            asset_name: periplon-tui-linux-aarch64

          - os: macos-latest
            target: x86_64-apple-darwin
            artifact_name: periplon-tui
            asset_name: periplon-tui-macos-x86_64

          - os: macos-latest
            target: aarch64-apple-darwin
            artifact_name: periplon-tui
            asset_name: periplon-tui-macos-aarch64

          - os: windows-latest
            target: x86_64-pc-windows-msvc
            artifact_name: periplon-tui.exe
            asset_name: periplon-tui-windows-x86_64.exe

    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Install cross-compilation tools (Linux ARM64)
        if: matrix.target == 'aarch64-unknown-linux-gnu'
        run: |
          sudo apt-get update
          sudo apt-get install -y gcc-aarch64-linux-gnu

      - name: Build release binary
        run: cargo build --release --bin periplon-tui --features tui --target ${{ matrix.target }}

      - name: Strip binary (Unix)
        if: matrix.os != 'windows-latest'
        run: strip target/${{ matrix.target }}/release/${{ matrix.artifact_name }}

      - name: Calculate checksum (Unix)
        if: matrix.os != 'windows-latest'
        run: |
          cd target/${{ matrix.target }}/release
          shasum -a 256 ${{ matrix.artifact_name }} > ${{ matrix.asset_name }}.sha256
          cat ${{ matrix.asset_name }}.sha256

      - name: Calculate checksum (Windows)
        if: matrix.os == 'windows-latest'
        shell: pwsh
        run: |
          cd target/${{ matrix.target }}/release
          $hash = Get-FileHash -Path ${{ matrix.artifact_name }} -Algorithm SHA256
          "$($hash.Hash)  ${{ matrix.artifact_name }}" | Out-File -FilePath ${{ matrix.asset_name }}.sha256
          Get-Content ${{ matrix.asset_name }}.sha256

      - name: Rename binary
        run: |
          cd target/${{ matrix.target }}/release
          mv ${{ matrix.artifact_name }} ${{ matrix.asset_name }}

      - name: Upload binary
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: target/${{ matrix.target }}/release/${{ matrix.asset_name }}
          asset_name: ${{ matrix.asset_name }}
          asset_content_type: application/octet-stream

      - name: Upload checksum
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: target/${{ matrix.target }}/release/${{ matrix.asset_name }}.sha256
          asset_name: ${{ matrix.asset_name }}.sha256
          asset_content_type: text/plain

  # Build and upload DSL executor binaries
  release-executor:
    name: Release Executor (${{ matrix.target }})
    needs: create-release
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            artifact_name: periplon-executor
            asset_name: periplon-executor-linux-x86_64

          - os: macos-latest
            target: x86_64-apple-darwin
            artifact_name: periplon-executor
            asset_name: periplon-executor-macos-x86_64

          - os: macos-latest
            target: aarch64-apple-darwin
            artifact_name: periplon-executor
            asset_name: periplon-executor-macos-aarch64

          - os: windows-latest
            target: x86_64-pc-windows-msvc
            artifact_name: periplon-executor.exe
            asset_name: periplon-executor-windows-x86_64.exe

    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Build release binary
        run: cargo build --release --bin periplon-executor --target ${{ matrix.target }}

      - name: Strip binary (Unix)
        if: matrix.os != 'windows-latest'
        run: strip target/${{ matrix.target }}/release/${{ matrix.artifact_name }}

      - name: Calculate checksum (Unix)
        if: matrix.os != 'windows-latest'
        run: |
          cd target/${{ matrix.target }}/release
          shasum -a 256 ${{ matrix.artifact_name }} > ${{ matrix.asset_name }}.sha256

      - name: Calculate checksum (Windows)
        if: matrix.os == 'windows-latest'
        shell: pwsh
        run: |
          cd target/${{ matrix.target }}/release
          $hash = Get-FileHash -Path ${{ matrix.artifact_name }} -Algorithm SHA256
          "$($hash.Hash)  ${{ matrix.artifact_name }}" | Out-File -FilePath ${{ matrix.asset_name }}.sha256

      - name: Rename binary
        run: |
          cd target/${{ matrix.target }}/release
          mv ${{ matrix.artifact_name }} ${{ matrix.asset_name }}

      - name: Upload binary
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: target/${{ matrix.target }}/release/${{ matrix.asset_name }}
          asset_name: ${{ matrix.asset_name }}
          asset_content_type: application/octet-stream

      - name: Upload checksum
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: target/${{ matrix.target }}/release/${{ matrix.asset_name }}.sha256
          asset_name: ${{ matrix.asset_name }}.sha256
          asset_content_type: text/plain

  # Publish to crates.io
  publish-crate:
    name: Publish to crates.io
    needs: [create-release, release-tui, release-executor]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Publish to crates.io
        run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
        continue-on-error: true

  # Create combined checksum file
  create-checksums:
    name: Create Combined Checksums
    needs: [release-tui, release-executor]
    runs-on: ubuntu-latest
    steps:
      - name: Download all release assets
        uses: actions/download-artifact@v4
        with:
          path: ./artifacts

      - name: Combine checksums
        run: |
          cat ./artifacts/**/*.sha256 > SHA256SUMS
          cat SHA256SUMS

      - name: Upload combined checksums
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: SHA256SUMS
          asset_name: SHA256SUMS
          asset_content_type: text/plain