Agent skill
cross-platform
Cross-platform development patterns for macOS, Windows, and Linux
Install this agent skill to your Project
npx add-skill https://github.com/mylee04/code-notify/tree/main/.claude/skills/cross-platform
SKILL.md
Cross-Platform Development
When to Use
- Adding new platform support
- Writing platform-specific code
- Testing across platforms
Platform Detection
Bash (macOS/Linux)
detect_os() {
case "$(uname -s)" in
Darwin*) echo "macos" ;;
Linux*)
# Check for WSL
if grep -qi microsoft /proc/version 2>/dev/null; then
echo "wsl"
else
echo "linux"
fi
;;
CYGWIN*|MINGW*|MSYS*) echo "windows" ;;
*) echo "unknown" ;;
esac
}
PowerShell (Windows)
function Get-Platform {
if ($IsWindows -or $env:OS -eq "Windows_NT") {
return "windows"
} elseif ($IsLinux) {
return "linux"
} elseif ($IsMacOS) {
return "macos"
}
return "unknown"
}
Notification Tools by Platform
| Platform | Primary | Fallback |
|---|---|---|
| macOS | terminal-notifier | osascript |
| Linux | notify-send | zenity, wall |
| Windows | BurntToast | System.Windows.Forms |
| WSL | wsl-notify-send | notify-send |
Platform-Specific Patterns
macOS
send_macos_notification() {
local title="$1"
local message="$2"
if command -v terminal-notifier &> /dev/null; then
terminal-notifier \
-title "$title" \
-message "$message" \
-sound "Glass"
else
osascript -e "display notification \"$message\" with title \"$title\""
fi
}
Linux
send_linux_notification() {
local title="$1"
local message="$2"
if command -v notify-send &> /dev/null; then
notify-send "$title" "$message" \
--urgency=normal \
--app-name="Code-Notify"
elif command -v zenity &> /dev/null; then
zenity --notification --text="$title\n$message"
else
echo "[$title] $message" | wall 2>/dev/null
fi
}
Windows (PowerShell)
function Send-WindowsNotification {
param(
[string]$Title,
[string]$Message
)
if (Get-Module -ListAvailable -Name BurntToast) {
New-BurntToastNotification -Text $Title, $Message
} else {
Add-Type -AssemblyName System.Windows.Forms
$notification = New-Object System.Windows.Forms.NotifyIcon
$notification.Icon = [System.Drawing.SystemIcons]::Information
$notification.BalloonTipTitle = $Title
$notification.BalloonTipText = $Message
$notification.Visible = $true
$notification.ShowBalloonTip(10000)
}
}
WSL
send_wsl_notification() {
local title="$1"
local message="$2"
if command -v wsl-notify-send.exe &> /dev/null; then
wsl-notify-send.exe --category "$title" "$message"
else
# Fall back to Linux notification
send_linux_notification "$title" "$message"
fi
}
Path Handling
Unix vs Windows Paths
# Convert Unix path to Windows path (in WSL)
to_windows_path() {
local unix_path="$1"
wslpath -w "$unix_path"
}
# Convert Windows path to Unix path (in WSL)
to_unix_path() {
local win_path="$1"
wslpath -u "$win_path"
}
Home Directory
# Bash
HOME_DIR="$HOME"
# PowerShell
$HomeDir = $env:USERPROFILE
Git Handling Across Platforms
Safe Git Commands
# Works on all platforms
get_project_name() {
local git_root
if git rev-parse --git-dir &> /dev/null; then
git_root=$(git rev-parse --show-toplevel 2>/dev/null)
if [[ -n "$git_root" ]]; then
basename "$git_root"
return 0
fi
fi
basename "$PWD"
}
PowerShell Git Handling
function Get-ProjectName {
try {
$gitRoot = & git rev-parse --show-toplevel 2>$null
if ($LASTEXITCODE -eq 0 -and $gitRoot) {
return Split-Path $gitRoot -Leaf
}
} catch {
# Not in git repo
}
return Split-Path (Get-Location) -Leaf
}
Testing Strategy
CI/CD Matrix
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
Platform-Specific Tests
# test/test-platform.sh
test_current_platform() {
local os=$(detect_os)
case "$os" in
macos) test_macos_notification ;;
linux) test_linux_notification ;;
wsl) test_wsl_notification ;;
*) echo "Unknown platform: $os" ;;
esac
}
Common Pitfalls
-
Line Endings: Windows uses CRLF, Unix uses LF
- Use
.gitattributesto enforce line endings
- Use
-
Path Separators: Windows uses
\, Unix uses/- Use variables like
$HOMEinstead of hardcoded paths
- Use variables like
-
Case Sensitivity: Windows is case-insensitive
- Be consistent with file naming
-
Command Availability: Commands differ by platform
- Always check with
command -vbefore use
- Always check with
Success Metrics
- Works on macOS 10.14+
- Works on Ubuntu 20.04+
- Works on Windows 10+ (PowerShell 5.1+)
- Works on WSL2
- Graceful fallback when tools missing
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
shell-scripting
Shell scripting best practices for cross-platform CLI tools
verl-rl-training
Provides guidance for training LLMs with reinforcement learning using verl (Volcano Engine RL). Use when implementing RLHF, GRPO, PPO, or other RL algorithms for LLM post-training at scale with flexible infrastructure backends.
openrlhf-training
High-performance RLHF framework with Ray+vLLM acceleration. Use for PPO, GRPO, RLOO, DPO training of large models (7B-70B+). Built on Ray, vLLM, ZeRO-3. 2× faster than DeepSpeedChat with distributed architecture and GPU resource sharing.
gguf-quantization
GGUF format and llama.cpp quantization for efficient CPU/GPU inference. Use when deploying models on consumer hardware, Apple Silicon, or when needing flexible quantization from 2-8 bit without GPU requirements.
Claude Code Guide
Master guide for using Claude Code effectively. Includes configuration templates, prompting strategies "Thinking" keywords, debugging techniques, and best practices for interacting with the agent.
qdrant-vector-search
High-performance vector similarity search engine for RAG and semantic search. Use when building production RAG systems requiring fast nearest neighbor search, hybrid search with filtering, or scalable vector storage with Rust-powered performance.
Didn't find tool you were looking for?