From 123690a7f7623eea7d0a6def1ab560f93f719545 Mon Sep 17 00:00:00 2001 From: Jirka Date: Fri, 5 Dec 2025 02:31:18 +0100 Subject: [PATCH] Add CI/CD pipeline and NuGet package configuration - Add NuGet package metadata to .csproj (PackageId, Version, Authors, etc.) - Add package icon reference - Create build.yml workflow for PR validation - Create publish-nuget.yml workflow for automatic NuGet publishing - Add CI/CD badges to README.md - Add NuGet installation instructions - Set Example project as non-packable Relates to #3 --- .github/workflows/build.yml | 31 ++++++++ .github/workflows/publish-nuget.yml | 69 ++++++++++++++++++ README.md | 15 ++++ .../OpenCode.DotnetClient.Example.csproj | 3 +- olbrasoft-opencode-client.png | Bin 0 -> 5878 bytes .../OpenCode.DotnetClient.csproj | 24 +++++- 6 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/publish-nuget.yml create mode 100644 olbrasoft-opencode-client.png diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..7bac0e2 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,31 @@ +name: Build + +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Display .NET info + run: dotnet --info + + - name: Restore dependencies + run: dotnet restore + + - name: Build + run: dotnet build --configuration Release --no-restore + + - name: Test + run: dotnet test --configuration Release --no-build --verbosity normal diff --git a/.github/workflows/publish-nuget.yml b/.github/workflows/publish-nuget.yml new file mode 100644 index 0000000..a45c7cf --- /dev/null +++ b/.github/workflows/publish-nuget.yml @@ -0,0 +1,69 @@ +name: Build, Test & Publish NuGet Package + +on: + push: + branches: [ main ] + tags: [ 'v*' ] + pull_request: + branches: [ main ] + workflow_dispatch: + +permissions: + contents: read + checks: write + pull-requests: write + +env: + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + +jobs: + build-test-publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Display .NET info + run: dotnet --info + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build --configuration Release --no-restore + + - name: Run tests + run: dotnet test --configuration Release --no-build --verbosity normal + + - name: Pack NuGet packages + if: success() + run: dotnet pack --configuration Release --no-build --output ./artifacts + + - name: List artifacts + if: success() + run: ls -lh ./artifacts/ + + - name: Publish to NuGet.org + if: success() && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) + run: | + dotnet nuget push ./artifacts/*.nupkg \ + --source https://api.nuget.org/v3/index.json \ + --api-key ${{ secrets.NUGET_API_KEY }} \ + --skip-duplicate + + - name: Upload artifacts + if: success() + uses: actions/upload-artifact@v4 + with: + name: nuget-packages + path: ./artifacts/*.nupkg + retention-days: 30 diff --git a/README.md b/README.md index eb72a7e..1778cb8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # OpenCode.DotnetClient +[![Build](https://github.com/Olbrasoft/OpenCode.DotnetClient/actions/workflows/build.yml/badge.svg)](https://github.com/Olbrasoft/OpenCode.DotnetClient/actions/workflows/build.yml) +[![Publish NuGet](https://github.com/Olbrasoft/OpenCode.DotnetClient/actions/workflows/publish-nuget.yml/badge.svg)](https://github.com/Olbrasoft/OpenCode.DotnetClient/actions/workflows/publish-nuget.yml) +[![NuGet](https://img.shields.io/nuget/v/Olbrasoft.OpenCode.DotnetClient.svg)](https://www.nuget.org/packages/Olbrasoft.OpenCode.DotnetClient/) +[![NuGet Downloads](https://img.shields.io/nuget/dt/Olbrasoft.OpenCode.DotnetClient.svg)](https://www.nuget.org/packages/Olbrasoft.OpenCode.DotnetClient/) [![.NET](https://img.shields.io/badge/.NET-10.0-blue)](https://dotnet.microsoft.com/) [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE) @@ -29,6 +33,17 @@ This is a **Proof of Concept (POC)** .NET client for OpenCode API, built with: ## 📦 Installation +### NuGet Package + +```bash +dotnet add package Olbrasoft.OpenCode.DotnetClient +``` + +Or via Package Manager Console: +```powershell +Install-Package Olbrasoft.OpenCode.DotnetClient +``` + ### Prerequisites - .NET 10.0 SDK or later diff --git a/examples/OpenCode.DotnetClient.Example/OpenCode.DotnetClient.Example.csproj b/examples/OpenCode.DotnetClient.Example/OpenCode.DotnetClient.Example.csproj index 4dca036..7509acc 100644 --- a/examples/OpenCode.DotnetClient.Example/OpenCode.DotnetClient.Example.csproj +++ b/examples/OpenCode.DotnetClient.Example/OpenCode.DotnetClient.Example.csproj @@ -1,4 +1,4 @@ - + @@ -9,6 +9,7 @@ net10.0 enable enable + false diff --git a/olbrasoft-opencode-client.png b/olbrasoft-opencode-client.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff0256b3f66dd400509a2db01ad775e2d4c30dc GIT binary patch literal 5878 zcmVo00009a7bBm000id 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 + net10.0 enable enable + true + + + Olbrasoft.OpenCode.DotnetClient + 1.0.0 + Olbrasoft + Olbrasoft + .NET client library for OpenCode server API. Provides type-safe HTTP client for session management, prompt sending, message retrieval, and real-time SSE event streaming. + © Olbrasoft 2025 + MIT + https://github.com/Olbrasoft/OpenCode.DotnetClient + https://github.com/Olbrasoft/OpenCode.DotnetClient.git + git + OpenCode;AI;Agent;NET10;API;Client;LLM;Anthropic;Claude + olbrasoft-opencode-client.png + README.md + Version 1.0.0: Initial release with session management, prompt sending, message retrieval, todo support, and SSE event streaming. + + + + +