Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
d77776b
feat: Squad.Agents.AI community NuGet for MAF integration
May 28, 2026
0f49470
docs: add PR body for #3
May 28, 2026
774906c
fix(SquadAgent): inherit AIAgent (was IChatClient force-cast)
May 28, 2026
186ac05
docs(SquadAgent): rewrite README — prerequisites, Hello World, troubl…
May 28, 2026
8814207
feat(SquadAgent): GitHubTokenProvider callback + redact options ToString
May 28, 2026
4537fe9
docs(SquadAgent): document GitHubTokenProvider callback for productio…
May 28, 2026
a34ad80
fix(SquadAgent): bind ConnectionStrings__squad via IConfigureOptions …
May 28, 2026
46a897c
docs(README): replace removed WithTeamRoot with positional teamRoot ctor
May 29, 2026
2c28882
test(squad-agents-ai): add routing integration tests
Jun 2, 2026
67f3862
ci(squad-agents-ai): add .NET build/test/pack workflow
Jun 2, 2026
2c6c3f4
ci(squad-agents-ai): NuGet publish workflow + Dependabot config
Jun 2, 2026
180b964
docs(squad-agents-ai): release-ready docs + .csproj packaging metadata
Jun 2, 2026
69661bf
ci(squad-agents-ai): switch release triggers to dev/main branch-driven
Jun 2, 2026
53d427d
docs+fix: PR #3 review pass — hygiene, XML docs, cliArgs, multi-named…
tamirdresher Jun 2, 2026
a030193
feat: Round 2 — keyed DI, BYOK delegate, routing gate, security harde…
tamirdresher Jun 2, 2026
84599f5
feat: add Squad.Agents.AI sample app demonstrating DI, keyed DI, BYOK…
tamirdresher Jun 2, 2026
2df1267
refactor(Squad.Agents.AI): co-locate sample under src/ and consolidat…
tamirdresher Jun 2, 2026
0397e19
chore(Squad.Agents.AI): remove outdated draft PR body file
tamirdresher Jun 2, 2026
ab11938
fix(Squad.Agents.AI): address PR #1207 reviewer feedback (12 items)
tamirdresher Jun 3, 2026
c5aab26
refactor(Squad.Agents.AI): adopt DelegatingAIAgent base + MAF ctor pa…
tamirdresher Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
version: 2
updates:
- package-ecosystem: "nuget"
directory: "/src/Squad.Agents.AI"
schedule:
interval: "weekly"
day: "monday"
time: "08:00"
timezone: "Etc/UTC"
open-pull-requests-limit: 5
labels: ["dependencies", "squad:belanna"]
commit-message:
prefix: "deps"
groups:
microsoft-ai-majors:
patterns:
- "Microsoft.Agents.AI*"
- "Microsoft.Extensions.AI"
update-types:
- "major"
microsoft-packages:
patterns:
- "Microsoft.*"
update-types:
- "minor"
- "patch"
ignore:
- dependency-name: "OpenTelemetry*"
update-types:
- "version-update:semver-major"

- package-ecosystem: "nuget"
directory: "/test/Squad.Agents.AI.Tests"
schedule:
interval: "weekly"
day: "monday"
time: "08:00"
timezone: "Etc/UTC"
open-pull-requests-limit: 5
labels: ["dependencies", "squad:belanna"]
commit-message:
prefix: "deps"
groups:
microsoft-ai-majors:
patterns:
- "Microsoft.Agents.AI*"
- "Microsoft.Extensions.AI"
update-types:
- "major"
microsoft-packages:
patterns:
- "Microsoft.*"
update-types:
- "minor"
- "patch"
ignore:
- dependency-name: "OpenTelemetry*"
update-types:
- "version-update:semver-major"

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "08:00"
timezone: "Etc/UTC"
open-pull-requests-limit: 5
labels: ["dependencies", "squad:belanna"]
commit-message:
prefix: "ci"
groups:
github-actions:
patterns:
- "*"
91 changes: 91 additions & 0 deletions .github/workflows/squad-agents-ai-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Squad.Agents.AI CI

on:
pull_request:
paths:
- 'src/Squad.Agents.AI/**'
- 'test/Squad.Agents.AI.Tests/**'
- 'src/Squad.Agents.AI/samples/Squad.Agents.AI.Sample/**'
- '.github/workflows/squad-agents-ai-ci.yml'
- 'Directory.*.props'
- 'Directory.*.json'
- 'global.json'
- 'nuget.config'
push:
branches: [main]
paths:
- 'src/Squad.Agents.AI/**'
- 'test/Squad.Agents.AI.Tests/**'
- 'src/Squad.Agents.AI/samples/Squad.Agents.AI.Sample/**'
- '.github/workflows/squad-agents-ai-ci.yml'
- 'Directory.*.props'
- 'Directory.*.json'
- 'global.json'
- 'nuget.config'

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
dotnet:
name: .NET ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]

env:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
DOTNET_NOLOGO: '1'

steps:
- uses: actions/checkout@v4

- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Restore package
run: dotnet restore src/Squad.Agents.AI/Squad.Agents.AI.csproj -p:NuGetAudit=true

- name: Restore tests
run: dotnet restore test/Squad.Agents.AI.Tests/Squad.Agents.AI.Tests.csproj -p:NuGetAudit=true

- name: Restore sample
run: dotnet restore src/Squad.Agents.AI/samples/Squad.Agents.AI.Sample/Squad.Agents.AI.Sample.csproj -p:NuGetAudit=true

- name: Build package
run: dotnet build src/Squad.Agents.AI/Squad.Agents.AI.csproj --no-restore -c Release

- name: Build tests
run: dotnet build test/Squad.Agents.AI.Tests/Squad.Agents.AI.Tests.csproj --no-restore -c Release

- name: Build sample
run: dotnet build src/Squad.Agents.AI/samples/Squad.Agents.AI.Sample/Squad.Agents.AI.Sample.csproj --no-restore -c Release

- name: Test
run: dotnet test test/Squad.Agents.AI.Tests/Squad.Agents.AI.Tests.csproj --no-build -c Release --logger trx --results-directory TestResults

- name: Pack
run: dotnet pack src/Squad.Agents.AI/Squad.Agents.AI.csproj --no-build -c Release -o nupkgs

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: squad-agents-ai-testresults-${{ matrix.os }}
path: TestResults
if-no-files-found: ignore

- name: Upload NuGet packages
uses: actions/upload-artifact@v4
with:
name: squad-agents-ai-nupkgs-${{ matrix.os }}
path: nupkgs
if-no-files-found: error
160 changes: 160 additions & 0 deletions .github/workflows/squad-agents-ai-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
# Requires repo secret NUGET_API_KEY. Generate at nuget.org → API Keys → Create.
#
# ## Failure recovery
# Publishing is branch-driven: dev creates prerelease NuGet packages, main creates stable NuGet
# packages, and workflow_dispatch remains an escape hatch. PACKAGE_VERSION is resolved once
# before build/test/pack/push and the nupkgs/* artifacts are uploaded before the registry write.
# If a run is interrupted after NuGet accepted the package but before the workflow completes,
# rerun the same workflow/run: NuGet package versions are immutable and `--skip-duplicate`
# turns already-published packages into no-ops while retrying anything not yet published.
# `cancel-in-progress: false` prevents a recovery rerun from canceling an in-flight publish.
# Dev prereleases use github.run_number in the prerelease field because it is monotonically
# increasing per workflow and participates in NuGet/SemVer ordering; reruns keep the same
# version intentionally, and `--skip-duplicate` makes that safe.

name: Squad.Agents.AI NuGet Release

on:
workflow_dispatch:
inputs:
version:
description: 'Optional NuGet package version override, for example 0.1.0-preview.123'
required: false
type: string
push:
branches:
- dev
- main
paths:
- 'src/Squad.Agents.AI/**'
- 'test/Squad.Agents.AI.Tests/**'
- 'Directory.*.props'
- 'global.json'

permissions:
contents: read

jobs:
publish:
name: Pack and publish NuGet package
runs-on: ubuntu-latest
concurrency:
group: squad-agents-ai-release-${{ github.ref }}
cancel-in-progress: false
env:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
DOTNET_NOLOGO: '1'

steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Resolve package version
id: version
shell: bash
run: |
set -euo pipefail

project_file="src/Squad.Agents.AI/Squad.Agents.AI.csproj"
csproj_version="$(sed -nE 's/^[[:space:]]*<Version>([^<]+)<\/Version>[[:space:]]*$/\1/p' "${project_file}" | head -n 1)"
manual_version="${{ inputs.version }}"
version_source=""

if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" && -n "${manual_version}" ]]; then
package_version="${manual_version}"
version_source="workflow_dispatch input"
else
if [[ -z "${csproj_version}" ]]; then
echo "::error::Could not find <Version> in ${project_file}."
exit 1
fi

case "${GITHUB_REF_NAME}" in
main)
# Stable releases mirror the Squad CLI's release workflow: the maintainer bumps
# the source version before merge, and the workflow publishes that exact version.
package_version="${csproj_version}"
version_source="${project_file}"
if [[ "${package_version}" == *-* ]]; then
echo "::error::main publishes stable packages; ${project_file} has prerelease version '${package_version}'. Bump it before merging."
exit 1
fi
;;
dev)
# The Squad CLI derives prereleases from the source version plus commit identity.
# For NuGet, build metadata does not give consumers monotonic prerelease ordering,
# so use github.run_number in the prerelease field instead.
stable_base="${csproj_version%%+*}"
stable_base="${stable_base%%-*}"
package_version="${stable_base}-preview.${GITHUB_RUN_NUMBER}"
version_source="${project_file} + github.run_number"
;;
*)
echo "::error::workflow_dispatch without a version input must run on dev or main; current ref is '${GITHUB_REF_NAME}'."
exit 1
;;
esac
fi

if [[ -z "${package_version}" ]]; then
echo "::error::PACKAGE_VERSION resolved to empty."
exit 1
fi

if [[ ! "${package_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$ ]]; then
echo "::error::PACKAGE_VERSION '${package_version}' from ${version_source} is not a SemVer 2.0 version."
exit 1
fi

echo "PACKAGE_VERSION=${package_version}" >> "${GITHUB_OUTPUT}"
echo "Resolved PACKAGE_VERSION=${package_version} (${version_source})"

- name: Verify NuGet API key
shell: bash
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
run: |
set -euo pipefail
if [[ -z "${NUGET_API_KEY}" ]]; then
echo "::error::Missing repo secret NUGET_API_KEY. Generate at nuget.org → API Keys → Create, then add it as a repository secret."
exit 1
fi

- name: Restore package
run: dotnet restore src/Squad.Agents.AI/Squad.Agents.AI.csproj

- name: Restore tests
run: dotnet restore test/Squad.Agents.AI.Tests/Squad.Agents.AI.Tests.csproj

- name: Build package
run: dotnet build src/Squad.Agents.AI/Squad.Agents.AI.csproj -c Release --no-restore -p:Version=${{ steps.version.outputs.PACKAGE_VERSION }}

- name: Build tests
run: dotnet build test/Squad.Agents.AI.Tests/Squad.Agents.AI.Tests.csproj -c Release --no-restore -p:Version=${{ steps.version.outputs.PACKAGE_VERSION }}

- name: Test
run: dotnet test test/Squad.Agents.AI.Tests/Squad.Agents.AI.Tests.csproj -c Release --no-build

- name: Pack
run: dotnet pack src/Squad.Agents.AI/Squad.Agents.AI.csproj -c Release --no-build -o nupkgs -p:Version=${{ steps.version.outputs.PACKAGE_VERSION }}

- name: Upload NuGet package artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: squad-agents-ai-nupkgs-${{ steps.version.outputs.PACKAGE_VERSION }}
path: nupkgs/*
if-no-files-found: ignore

- name: Push to NuGet.org
shell: bash
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
run: dotnet nuget push nupkgs/*.nupkg --source https://api.nuget.org/v3/index.json --api-key "${NUGET_API_KEY}" --skip-duplicate
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,8 @@ docs/tests/screenshots/
# Squad: PR-1200 picard local artifacts (do not commit)
.pr-body-new.md
.followup-issue-body.md

# .NET build output
bin/
obj/
artifacts/
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,14 @@ First stable release since v0.9.4 (April 25). Consumes 97 changesets (sdk: 50, c
### Internal / Tests / Docs
- (cli) docs: point README migration guide links to the published docs site

## [0.1.0-preview] - 2026-06-02

### Added — Squad.Agents.AI NuGet preview
- Added `Squad.Agents.AI`, a `net10.0` Microsoft Agent Framework package that exposes a Squad team as an `AIAgent`.
- Public surface: `SquadAgent`, `SquadAgentOptions`, `SquadConnectionFactory`, and `SquadServiceCollectionExtensions`.
- Added DI registration, PATH/URI connection-string parsing, GitHub token/provider options, and XML documentation for the public preview surface.
- Added README documentation for the `Squad.Agents.AI` package in `src/Squad.Agents.AI/README.md`.

## [0.9.0] - 2026-03-23

### Added — Personal Squad Governance Layer
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ Squad proposes a team — each member named from a persistent thematic cast. You

---

## .NET package preview

Building a .NET app that should call a Squad team as a Microsoft Agent Framework agent? `Squad.Agents.AI` is a preview NuGet package under [`src/Squad.Agents.AI`](src/Squad.Agents.AI/README.md). It registers a Squad-backed `AIAgent` in DI and targets early `0.1.0-preview` consumers.

## Upgrading

Upgrading Squad is a two-step process.
Expand Down
11 changes: 11 additions & 0 deletions Squad.Agents.AI.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<Solution>
<Folder Name="/src/">
<Project Path="src/Squad.Agents.AI/Squad.Agents.AI.csproj" />
</Folder>
<Folder Name="/test/">
<Project Path="test/Squad.Agents.AI.Tests/Squad.Agents.AI.Tests.csproj" />
</Folder>
<Folder Name="/samples/">
<Project Path="src/Squad.Agents.AI/samples/Squad.Agents.AI.Sample/Squad.Agents.AI.Sample.csproj" />
</Folder>
</Solution>
Loading
Loading