# vpn-switch - Project Instructions for Claude ## Quick Reference **Documentation:** - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) - Combinator architecture and design - [docs/REQUIREMENTS.md](docs/REQUIREMENTS.md) - Technical requirements - [docs/DESIGN_DECISIONS.md](docs/DESIGN_DECISIONS.md) - Key architectural decisions - [docs/DEBUGGING_GUIDE.md](docs/DEBUGGING_GUIDE.md) - Debugging methodology - [QUICK_REFERENCE.md](QUICK_REFERENCE.md) - Command cheatsheet - [COMMIT_CHECKLIST.md](COMMIT_CHECKLIST.md) - Definition of done - [README.md](README.md) - User documentation --- ## Project Description `vpn-switch` is a POSIX shell script to manage VPN connections (WireGuard, OpenVPN). **Core capabilities:** - Switch between VPN protocols and servers - Manage configuration files from any VPN provider - Handle firewall and DNS integration automatically - Session caching and resumption - Profile-based configuration (minimal/all/custom) - Database dump/restore for migration - One-switch debugging mode **Architecture:** Combinator-based implementation (~5100 lines) - Build-time metadata generation for fast dispatch - Intrinsic classification (underscore count determines behavior) - Per-function interpreter control (dry-run, logging, custom execution) - Environment isolation via `env -` pattern - Phase-based connect/disconnect scripts (modular, inspectable) - Modular includes (`include/*.sh` for protocol-specific code) --- ## Current Status: Phase 5 (Polish & Release Prep) 🚀 **Phase 4 COMPLETE!** ✅ Major features (inspect, robust init, phase backends) **Phase 3 COMPLETE!** ✅ OpenVPN, protocol-agnostic commands, phase-based scripts **Current Work:** - Documentation cleanup and synchronization - GNUmakefile for cross-platform installation (FreeBSD + Linux) - VPN_SWITCH_LIBDIR for FHS-compliant installation **Path to 1.0:** - **Phase 5**: Polish & release prep (docs, refactoring, ports) - **Phase 6**: Release candidate & 1.0 --- ## Development Guidelines ### Building & Testing ```bash # Generate metadata (only needed after function name changes or module definition changes) gmake metadata # Run tests gmake test # All tests gmake test-unit # Unit tests only gmake test-integration # Integration tests only gmake test-arch # Architecture tests only # Linting gmake check # Syntax check gmake shellcheck # ShellCheck linting gmake lint # Both # Installation gmake install # Install to /usr/local gmake install PREFIX=/usr # Install to /usr ``` ### Before Committing See [COMMIT_CHECKLIST.md](COMMIT_CHECKLIST.md) for full checklist. **Quick check:** ```bash gmake check # Syntax OK? gmake test-unit # Tests pass? ``` --- ## Key Architecture Concepts ### Combinator Pattern Functions are classified by underscore prefix: - `_func` (terminal): Output final data, use `cat` interpreter - `__func` (combinator): Output 1 vpn-switch command, use `sh` interpreter - `___func` (batch combinator): Output N vpn-switch commands **Execution flow:** ``` dispatch "$@" → resolve function → run function → pipe to interpreter ``` ### Directory Structure ``` vpn-switch/ ├── vpn-switch.sh # Main script (~5100 lines) ├── vpn-switch-*-test.sh # Test suites (unit, integration, architecture) ├── GNUmakefile # Build system (GNU make) ├── include/ # Modular code (database.sh, session.sh, etc.) ├── template/ # Templates │ ├── environment/ # Environment variable templates │ ├── phase/ # Phase scripts (connect/disconnect) │ └── platform/ # Platform-specific variables ├── scripts/ # Development scripts ├── files/ # Deployment files (rc.d, resolvconf helpers) ├── docs/ # Documentation └── test-configs/ # Test configuration files ``` ### Key Variables - `VPN_SWITCH_BASE` - Database directory (user data) - `VPN_SWITCH_LIBDIR` - Library directory (include/, template/) - `VPN_SWITCH_TEMPLATE_DIR` - Template directory (derived from LIBDIR) --- ## Debugging **Rule: 99% of issues are environment-related** ```bash # Check effective environment vpn-switch printenv # Enable tracing vpn-switch setenv VPN_SWITCH_RETENTION_DAYS_TRACE 1 vpn-switch cat $VPN_SWITCH_BASE/.log/*/*.trace ``` See [docs/DEBUGGING_GUIDE.md](docs/DEBUGGING_GUIDE.md) for detailed methodology. --- ## Testing **Test suites:** - `vpn-switch-unit-test.sh` - Unit tests (~374 assertions) - `vpn-switch-integration-test.sh` - Integration tests (~296 assertions) - `vpn-switch-architecture-test.sh` - Architecture pattern validation **Always capture output:** ```bash gmake test 2>&1 | tee /tmp/test-output.txt ``` --- ## Quick Command Reference ```bash # Connection vpn-switch start # Auto-detect protocol, start VPN vpn-switch stop # Stop all VPN sessions # Session management vpn-switch session list # List active sessions vpn-switch session save # Save current session # Config management vpn-switch wireguard import # Import config vpn-switch wireguard list # List configs vpn-switch openvpn import # Import OpenVPN config # Database vpn-switch bootstrap minimal # Initialize new database vpn-switch dump # Export database vpn-switch restore # Import database # Diagnostics vpn-switch inspect # Show system state vpn-switch validate # Validate database ``` --- ## Known Issues ### Grep Tool Limitation The ripgrep-based Grep tool may fail with certain patterns. Use bash grep as fallback: ```bash grep -n 'pattern' /path/to/file ``` --- *Project developed with assistance from Claude (Anthropic), October 2024 - December 2025.*