Skip to content

Improve shell config detection and PATH update logic #68

Improve shell config detection and PATH update logic

Improve shell config detection and PATH update logic #68

Workflow file for this run

name: Test AITools
on:
push:
branches:
- '**' # Run on all branches
paths-ignore:
- 'README.md'
- '**/*.png'
- '**/*.jpg'
- '**/*.jpeg'
- '**/*.gif'
- '**/*.svg'
- '**/*.ico'
- '**/*.webp'
jobs:
test:
strategy:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup PowerShell module cache
id: psmodulecache
uses: potatoqualitee/psmodulecache@v6.2.1
with:
modules-to-cache: PSFramework:1.7.249, Microsoft.PowerShell.ThreadJob:2.2.0, Pester:5.6.1
- name: Cache winget packages (Windows only)
if: runner.os == 'Windows'
uses: actions/cache@v4
with:
path: ~\AppData\Local\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalCache
key: ${{ runner.os }}-winget-${{ hashFiles('.github/workflows/*.yml') }}
restore-keys: |
${{ runner.os }}-winget-
- name: Setup PowerShell
shell: pwsh
run: |
Write-Host "PowerShell version: $($PSVersionTable.PSVersion)"
Write-Host "OS: $($PSVersionTable.OS)"
Write-Host "Platform: $($PSVersionTable.Platform)"
- name: Setup Node.js (required for Claude on Linux/macOS)
if: runner.os != 'Windows'
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Check if Install-AITool.ps1 changed
id: check_install_tool
shell: pwsh
run: |
# Get files changed in the current commit
$changed = git diff-tree --no-commit-id --name-only -r HEAD | Select-String -Pattern "Install-AITool.ps1"
if ($changed) {
echo "install_tool_changed=true" >> $env:GITHUB_OUTPUT
Write-Host "Install-AITool.ps1 has changed - will test Aider installation on Windows"
} else {
echo "install_tool_changed=false" >> $env:GITHUB_OUTPUT
Write-Host "Install-AITool.ps1 unchanged - will skip Aider on Windows"
}
- name: Install AI tools (skip Aider and Gemini on Windows for speed)
shell: pwsh
continue-on-error: true
run: |
Import-Module ./aitools.psd1 -Force
if ($IsWindows -or $env:OS -match 'Windows') {
Write-Host "Installing AI tools on Windows (skipping Aider and Gemini due to long install times)..."
$tools = @('Claude', 'Codex', 'Copilot')
foreach ($tool in $tools) {
Write-Host "Installing $tool..."
Install-AITool -Name $tool -SkipInitialization -Verbose
}
} else {
Write-Host "Installing all AI tools..."
Install-AITool -Name All -SkipInitialization -Verbose
}
- name: Install Aider and Gemini on Windows (only when Install-AITool.ps1 changes)
if: runner.os == 'Windows' && steps.check_install_tool.outputs.install_tool_changed == 'true'
shell: pwsh
continue-on-error: true
run: |
Import-Module ./aitools.psd1 -Force
Write-Host "Install-AITool.ps1 changed - testing Aider and Gemini installation..."
Install-AITool -Name Aider -SkipInitialization -Verbose
Install-AITool -Name Gemini -SkipInitialization -Verbose
- name: Verify at least Claude is installed
shell: pwsh
run: |
Import-Module ./aitools.psd1 -Force
$claude = Get-Command claude -ErrorAction SilentlyContinue
if (-not $claude) {
Write-Host "Claude not found, installing individually..."
Install-AITool -Name Claude -SkipInitialization -Verbose
# Refresh path after installation for current session
if ($IsWindows -or $env:OS -match 'Windows') {
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
} else {
# On Unix, npm global installs go to different locations
$npmBin = npm config get prefix 2>$null
if ($npmBin) {
$env:PATH = "$npmBin/bin:$env:PATH"
}
}
# Persist PATH to subsequent steps using GitHub Actions environment file
# This is necessary because each step starts a new shell session
if ($IsWindows -or $env:OS -match 'Windows') {
$newPath = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
# For Claude on Windows, explicitly add known installation paths
$claudePaths = @(
"$env:LOCALAPPDATA\Programs\Claude\resources\app\bin",
"$env:LOCALAPPDATA\Programs\Claude\resources\bin",
"$env:LOCALAPPDATA\Programs\Claude"
)
foreach ($claudePath in $claudePaths) {
if ((Test-Path $claudePath) -and (-not ($newPath -like "*$claudePath*"))) {
$newPath = "$claudePath;$newPath"
Write-Host "Added Claude installation path: $claudePath"
break
}
}
"PATH=$newPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
Write-Host "Updated GITHUB_PATH for subsequent steps"
} else {
$npmBin = npm config get prefix 2>$null
if ($npmBin) {
"$npmBin/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
Write-Host "Added npm bin to GITHUB_PATH: $npmBin/bin"
}
}
# Check again after path refresh
$claude = Get-Command claude -ErrorAction SilentlyContinue
if (-not $claude) {
Write-Warning "Claude still not found after installation. Checking npm global path..."
npm list -g --depth=0
}
} else {
Write-Host "Claude is installed"
& claude --version
}
- name: Set Claude as default
shell: pwsh
run: |
Import-Module ./aitools.psd1 -Force
# Verify claude is available before setting as default (to avoid Read-Host prompt)
$claude = Get-Command claude -ErrorAction SilentlyContinue
if ($claude) {
Write-Host "Setting Claude as default tool..."
Set-AIToolDefault -Tool Claude
} else {
Write-Error "Claude is not installed, cannot set as default"
exit 1
}
- name: Setup Claude OAuth Token
shell: pwsh
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
run: |
Write-Host "Setting up CLAUDE_CODE_OAUTH_TOKEN environment variable..."
if ([string]::IsNullOrEmpty($env:CLAUDE_CODE_OAUTH_TOKEN)) {
Write-Warning "CLAUDE_CODE_OAUTH_TOKEN is not set in secrets"
exit 1
}
Write-Host "CLAUDE_CODE_OAUTH_TOKEN is configured (length: $($env:CLAUDE_CODE_OAUTH_TOKEN.Length))"
- name: Test Invoke-AITool quick chat
shell: pwsh
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
run: |
Import-Module ./aitools.psd1 -Force
Write-Host "Testing Invoke-AITool with quick chat..."
$result = Invoke-AITool -Prompt "Hello" -Tool Claude
Write-Host "Chat result:"
$result | Format-List
- name: Clone dbatools repo at specific commit
shell: pwsh
run: |
Write-Host "Cloning dbatools repository at commit ed7f53d81f28cea1e4b691f2d92b8b6042802d12..."
git clone --depth 1 --single-branch --branch master https://github.com/dataplat/dbatools.git
cd dbatools
git fetch --depth 50 origin ed7f53d81f28cea1e4b691f2d92b8b6042802d12
git checkout ed7f53d81f28cea1e4b691f2d92b8b6042802d12
- name: Run Pester integration tests
shell: pwsh
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
run: |
Import-Module ./aitools.psd1 -Force
Write-Host "Installing Pester..."
Install-Module -Name Pester -Force -SkipPublisherCheck -MinimumVersion 5.0.0
Write-Host "Running Pester tests..."
$config = New-PesterConfiguration
$config.Run.Path = "Tests/aitools.Tests.ps1"
$config.Output.Verbosity = "Detailed"
$config.Run.Exit = $true
Invoke-Pester -Configuration $config
- name: Show git diff
shell: pwsh
run: |
Write-Host "Showing git diff of changes..."
Push-Location dbatools
git diff --color=always tests/Invoke-DbaDbShrink.Tests.ps1
Pop-Location