Agent skill · software engineering · sundial-org

portable-tools

Build cross-device tools without hardcoding paths or account names

Why this skill is useful

Provides a methodology for building cross-device tools with specific patterns for configuration and error handling that the AI wouldn't reliably generate on its own.

What it needs

About 7k tokens when loaded. Last updated 2026-03-07. 639 stars on the source repository.

What this skill does

Portable Tools - Cross-Device Development Methodology Methodology for building tools that work across different devices, naming schemes, and configurations. Based on lessons from OAuth refresher debugging session (2026-01-23). Core Principle Never assume your device is the only device. Your local setup is just one of many possible configurations. Build for the general case, not the specific instance. --- The Three Questions (Before Writing Code) 1. "What varies between devices?" Before writing any code that reads configuration, data, or credentials: Ask: File paths? (macOS vs Linux, different home dirs) Account names? (user123 vs default vs oauth) Service names? (slight variations in spelling/capitalization) Data structure? (different versions, different formats) Environment? (different shells, different tools available) Example from OAuth refresher: ❌ Assumed: Account is always "claude" ✅ Reality: Could be "claude", "Claude Code", "default", etc. Action: List variables, make them configurable or auto-discoverable --- 2. "How do I prove this works?" Before claiming success: Require: Concrete BEFORE state (exact values) Concrete AFTER state (exact values) Proof they're different (side-by-side comparison) Example from OAuth refresher: Action: Always show data transformation with real values --- 3. "What happens when it breaks?" Before pushing to production: Test: Wrong configuration (intentionally break config) Missing data (remove expected fields) Multiple entries (ambiguous case) Edge cases (empty values, special characters) Example from OAuth refresher: Test with keychainaccount: "wrong-name" → Fallback should work Test with incomplete keychain data → Should fail gracefully with helpful error Action: Test failure modes, not just happy path --- Mandatory Patterns Pattern 1: Explicit Over Implicit ❌ Wrong: ✅ Correct: Rule: If a command can be ambiguous, make it explicit. …

How to use it

Reference it in AdaL, Claude Code, Cursor or any coding agent — nothing to install:

@skills sundial-org/portable-tools

View the source on GitHub

Browse the @skills marketplace