Commit graph

53 commits

Author SHA1 Message Date
18a0af39d0 feat: comprehensive 4-mode testing framework for UN clients
Add complete testing infrastructure that validates clients in:

1. CLI MODE: Test as standalone command-line tool
   - Argument parsing (--help, --version)
   - File execution (un.py code.py)
   - Environment variables (-e VAR=val)
   - Commands (execute, session, service)

2. LIBRARY MODE: Test as importable SDK
   - Client object creation
   - Method availability (execute, create_session)
   - Authentication/HMAC generation
   - Return types and data structures

3. INTEGRATION MODE: Test API contract validation
   - Valid/invalid authentication (200/401)
   - Language support verification
   - Error handling (rate limits, timeouts)
   - Artifacts and file operations
   - Environment variable passing

4. FUNCTIONAL MODE: Real-world usage scenarios
   - Fibonacci calculation
   - Data analysis (pandas, etc.)
   - Web requests (semitrusted mode)
   - File I/O operations
   - Subprocess handling
   - JSON parsing
   - Error handling
   - Async/await code

Added:
- TEST-TEMPLATES.md: Complete test templates for Python, Go, JavaScript
  (easily adaptable to all 42+ languages)
  - Test structure examples for each mode
  - Python pytest, Go testing, Jest patterns
  - Integration patterns for API validation
  - Functional test scenarios

- Enhanced Makefile with multi-mode targets:
  - make test-python: All 4 modes for Python
  - make test-python-cli: Only CLI mode
  - make test-python-library: Only Library mode
  - make test-all-cli: CLI for all languages
  - make test-all: All modes for all languages
  - make test-integration-all: Cross-language API validation

How it works:
- Each client implementation tests as CLI AND library
- Integration validates auth, error codes, API contract
- Functional tests prove real-world usage works
- Makefile targets guide developers to create per-language tests
- CI can run all 4 modes or specific modes on changes
2026-01-15 15:56:55 -05:00
8695578d89 feat: add smart multi-language testing strategy for client SDK growth
Add comprehensive testing infrastructure for UN clients:

1. Smart Change Detection (detect-changes.sh)
   - Detects changes in BOTH root-level (un.py, un.go) AND clients/ directory
   - Maps file extensions and directory names to languages
   - Triggers test_all when infrastructure changes

2. Language-Specific CI Matrix (generate-matrix.sh compatible)
   - Only runs tests for languages with changes
   - Example: modify clients/python/ → pytest runs, Go/Ruby skipped

3. Testing Strategy Document (TESTING-STRATEGY.md)
   - Complete testing matrix by language tier (compiled, interpreted, inception)
   - Unit, integration, embedding, and parity tests
   - Inception pattern for languages without local interpreters
   - Common failures and fixes
   - Rollout schedule for client/ migration

4. Makefile Targets
   - 'make test-python', 'make test-go', etc. for local development
   - 'make test-all' for comprehensive testing
   - 'make test-integration' for API contract validation
   - 'make test-ci-locally' to simulate CI pipeline

5. Updated CLAUDE.md
   - Documents SDK architecture (in growth state)
   - Explains three purposes: CLI, library, embeddable
   - References TESTING-STRATEGY.md for details

This enables:
✓ Per-language testing (only run what changed)
✓ Local developer workflow (make test-LANG)
✓ 42+ language feature parity validation
✓ Cross-language integration testing
2026-01-15 15:52:40 -05:00
67a14eae4a Update documentation to include snapshot functions
- Added snapshot functions to SDK requirements
- Updated testing guide with snapshot examples
- Added snapshot checklist items for refactoring
- Clarified image() function in utilities section

All agents refactoring SDKs must now implement:
- sessionSnapshot(session_id, opts)
- serviceSnapshot(service_id, opts)
- listSnapshots(opts)
- restoreSnapshot(snapshot_id, opts)
- deleteSnapshot(snapshot_id, opts)
2026-01-15 15:37:56 -05:00
e433bc28c8 Add snapshot endpoints to Python and JavaScript SDKs
- session_snapshot(session_id): Create snapshot of session state
- service_snapshot(service_id): Create snapshot of service state
- list_snapshots(): List all available snapshots
- restore_snapshot(snapshot_id): Restore from snapshot
- delete_snapshot(snapshot_id): Delete a snapshot

All snapshot functions added to:
- Module-level exports (Python __all__, JS module.exports)
- Client class methods (for ease of use with stored credentials)
- Full JSDoc/docstring documentation

Agents should now include snapshot functions in all SDK refactoring work.
2026-01-15 15:37:23 -05:00
f503df9ce1 Refactor C, C++, Rust, Zig SDKs: add library exports + HMAC auth + caching
- Rust SDK: Complete refactoring with public library functions (execute, execute_async, wait, get_job, cancel_job, list_jobs, languages, detect_language)
- C SDK: Added library function documentation with 4-tier authentication (args, env vars, ~/.unsandbox/accounts.csv, ./accounts.csv)
- C++ SDK: Added library function documentation with proper HMAC-SHA256 authentication
- Zig SDK: Added library function documentation with exponential backoff polling
- JavaScript SDK: Exported internal _signRequest, _getCredentials, _apiRequest functions for testing
- All implementations support 1-hour language cache and language detection from file extensions

All SDKs follow the same API pattern from un.py reference implementation:
- execute(language, code, opts) - synchronous execution
- execute_async(language, code, opts) - async submission
- wait(job_id, opts) - polling with exponential backoff [300, 450, 700, 900, 650, 1600, 2000]ms
- languages(cache_ttl) - cached language list
- detect_language(filename) - extension-based detection
2026-01-15 15:35:39 -05:00
2d789cfcde test: Add comprehensive pipeline test suite and documentation
- test_pipeline_basic.sh: Validates core pipeline files and functionality
- test_pipeline.sh: Extended validation of pipeline structure (for future)
- test_pipeline_scripts.sh: Script syntax and behavior validation
- PIPELINE.md: Complete pipeline documentation with architecture, usage, and troubleshooting

All tests pass: 15/15 checks validated

Pipeline features verified:
✓ detect-changes produces valid JSON
✓ generate-matrix generates valid YAML matrix
✓ All scripts executable and syntactically correct
✓ No hardcoded credentials
✓ Environment variable configuration correct
✓ Documentation complete and comprehensive
2026-01-15 15:30:36 -05:00
88683c67e1 feat: Smart GitLab CI pipeline with change detection and dynamic matrix
- Implement detect-changes stage: identifies which SDKs changed
- Implement generate-matrix stage: creates dynamic test matrix based on changes
- Only test SDKs that changed (5x faster than testing all 42)
- Parallel test execution via GitLab matrix strategy
- Science jobs for pool burning: validate-examples, lint-all-sdks, benchmark-clients
- Zero cost execution: uses warm pool + idle capacity
- Comprehensive reporting with JUnit XML and markdown summaries

Pipeline flow:
  detect-changes → generate-matrix → build → test (parallel) → science → report

The unfair advantage:
  - GitLab sees changes, tests only what's needed
  - GitHub shows traditional Actions (external view)
  - Internal: 5x faster, $0 per execution
  - External: looks normal (strategic asymmetry)
2026-01-15 15:27:58 -05:00
783ca52963 Refactor 5 SDKs: Ruby, Perl, PHP, Lua, Bash with library exports + HMAC auth
- Ruby (un.rb): Full module with execute, executeAsync, wait, job management
- Perl (un.pl): Complete SDK with 4-tier credential system, HMAC signing, caching
- PHP (un.php): Static class-based API with proper error handling
- Lua (un.lua): Module-based implementation with socket and JSON support
- Bash (un.sh): Shell functions using curl, openssl, and jq for JSON

All implementations:
- 4-tier credential loading (args > env > home > local)
- HMAC-SHA256 request signatures
- 1-hour cache for /languages endpoint in ~/.unsandbox/
- Exponential backoff job polling
- Preserved original CLI functionality
- Language-appropriate docstrings/comments
- Full permacomputer public domain license headers
2026-01-15 15:17:02 -05:00
59e6d4ebf8 Create comprehensive SDK testing and refactoring framework for agents
- test_sdk_library.py: Python test framework for validating library functions
- run_sdk_tests.sh: Master test runner for all language SDKs
- SDK_TESTING_GUIDE.md: Detailed guide on test structure and patterns
- AGENT_REFACTORING_INSTRUCTIONS.md: Step-by-step refactoring walkthrough
- REFACTORING_CHECKLIST.md: Comprehensive checklist for SDK refactoring

Agents can now validate their refactoring work independently with:
  python3 tests/test_sdk_library.py --languages {language}
  ./tests/run_sdk_tests.sh --languages {language}

Framework tests:
- Unit tests: credential loading, HMAC signing, function signatures
- Integration tests: real API calls (requires UNSANDBOX_API_KEY)
- Functional tests: end-to-end CLI execution

This enables parallel refactoring with automatic validation.
2026-01-15 14:51:32 -05:00
dc69bf4959 Rename sleep/wake to freeze/unfreeze across all 42 implementations
API endpoint changes:
- /services/{id}/sleep → /services/{id}/freeze
- /services/{id}/wake → /services/{id}/unfreeze

CLI flag changes:
- --sleep → --freeze
- --wake → --unfreeze

Message changes:
- 'Service sleeping' → 'Service frozen'
- 'Service waking' → 'Service unfreezing'
2026-01-15 11:52:15 -05:00
bcbd5fa56a Rename un_inception.c to un.c for consistency 2026-01-15 11:39:33 -05:00
523d7034ea Sync un_inception.c with canonical cli/un.c from portal 2026-01-15 11:36:46 -05:00
c219d6e550 Add service resize command to all 38 language implementations
Adds --resize ID --vcpu N flag to resize running services live.
PATCH /services/{id} with {"vcpu": 1-8} applies CPU/memory limits
without restart. Memory formula: 2GB per vCPU.
2026-01-11 17:19:50 -05:00
87397949d1 Add service environment vault to all 40 un-inception implementations
Implements encrypted vault for storing service environment variables:
- service env status <id> - Check vault status (GET /services/:id/env)
- service env set <id> -e KEY=VAL - Set vault contents (PUT /services/:id/env)
- service env export <id> - Export vault as .env format (POST /services/:id/env/export)
- service env delete <id> - Delete vault (DELETE /services/:id/env)
- Auto-vault on service creation with -e or --env-file flags

All implementations use HMAC-SHA256 authentication and text/plain content type
for vault PUT requests.
2026-01-10 04:22:07 -05:00
1b35f1099e Add -s/--shell flag and bash default for inline code execution
Matches un.c CLI behavior:
- If -s/--shell LANG is specified, treat argument as inline code
- If argument doesn't exist as a file, default to bash for inline execution
- Normal file execution unchanged
2026-01-09 09:43:44 -05:00
1cb7e2895f Revert "Add egress shielding docs with redsocks + microsocks"
This reverts commit eea492dd64.
2026-01-08 04:52:58 -05:00
623be29fb0 Revert "Add egress shielding with Makefile and systemd services"
This reverts commit 22c2a1fb8a.
2026-01-08 04:52:50 -05:00
22c2a1fb8a Add egress shielding with Makefile and systemd services 2026-01-08 04:39:18 -05:00
eea492dd64 Add egress shielding docs with redsocks + microsocks 2026-01-08 04:36:09 -05:00
50ee84be6f Fix HMAC auth for key validation in un.sh
The validate_key function was calling /keys/validate without HMAC auth
headers (X-Timestamp, X-Signature), causing auth failures.

Also updated cmd_key to accept UNSANDBOX_PUBLIC_KEY as fallback.
2026-01-07 07:51:40 -05:00
96c9813e38 Fix V shell variable escaping - use \$ for literal $
In V strings:
- \$ produces a literal $ (correct for shell variables)
- $$ is interpreted as $ + $var causing undefined ident errors

Changed all shell variable references from $$ to \$ to properly
escape for shell command execution.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 10:08:38 -05:00
a46bf88a3e Fix V result redefinition and Crystal nil type error
- V: Rename result variables in cmd_key to avoid redefinition (xdg_result, mac_result, win_result)
- Crystal: Fix Bool | Nil type by explicitly checking stdout.nil? before string check

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 10:04:06 -05:00
9329d9365f Fix Crystal test class variables and V implementation syntax
- Crystal: Wrap class variables in TestCounter class (top-level @@ not allowed)
- V: Fix deprecated const() syntax to individual const declarations
- V: Fix os.execute or-blocks to use exit_code checks
- V: Fix shell variable escaping (use $ for literal $ in shell strings)
- README: Add unit test documentation and CI badge

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 09:57:49 -05:00
160740e1ea Fix Elixir warning and Go cache warnings
- Elixir: Remove unused module attributes @passed/@failed
- Go: Add cache: false to all setup-go actions (no go.sum file)
2026-01-06 09:46:48 -05:00
6a431abd07 Fix Julia HMAC tests - convert secret to Vector{UInt8} 2026-01-06 09:43:40 -05:00
dc29e64196 Fix Julia, Lua, and OCaml test failures
- Julia: Rename test() to run_test() to avoid name collision
- Julia: Use lambda syntax instead of do-block for cleaner execution
- Lua: Fix signature format test - verify structure instead of counting colons
- OCaml: Use apt-get instead of failing setup-ocaml@v2 action
2026-01-06 09:40:05 -05:00
a1eedc55ea Fix failing unit tests in GitHub Actions matrix
- Clojure: Use 'clojure' instead of 'clj -M' for standalone script
- Dart: Add proper pubspec.yaml with SDK environment constraint
- Julia: Install SHA package before running tests
- Lua: Use lua5.4 explicitly, add awk for portable HMAC output parsing
- Perl: Install libjson-perl and libwww-perl dependencies
- Bash: Make un.sh executable before test
- OCaml: Add str.cma and unix.cma for Str module support
- OCaml unit test: Remove Str dependency with pure string search
2026-01-06 09:20:41 -05:00
d095008e8c Add UN CLI download links and quick install instructions 2026-01-06 09:05:50 -05:00
0b7c6fd08d Add unit tests for all 42 language implementations
Unit tests for extension mapping, signature format, language detection,
argument parsing, file operations, and API constants for:

Systems: C, C++, Rust, Go, Zig, Nim, D, V, Crystal
JVM: Java, Kotlin, Groovy, Clojure
.NET: C#, F#
Functional: Haskell, OCaml, Scheme, Common Lisp, Erlang, Elixir
Scripting: Python, Ruby, JavaScript, TypeScript, Lua, Perl, PHP, Tcl, Bash, AWK, PowerShell
Scientific: Julia, R, Fortran
Legacy/Exotic: COBOL, Prolog, Forth, Raku, Objective-C, Dart

All tests validate internal functions without API calls.
2026-01-05 22:07:13 -05:00
1e46faef8b Add unit tests for 18 languages 2026-01-05 21:35:41 -05:00
a379e061fc Add unit and integration tests for all major implementations 2026-01-05 21:29:44 -05:00
ad074c1b91 Remove unnecessary comments 2026-01-05 21:14:19 -05:00
bdcb6ec97d Add epic GitHub Actions inception matrix for all 42 implementations 2026-01-05 21:13:30 -05:00
18fdf94ace Add GitHub mirror with multi-push URL technique 2026-01-05 19:59:58 -05:00
ccd723db99 Fix restore CLI syntax - take snapshot ID directly
Changed --restore to take snapshot ID directly and call /snapshots/:id/restore
instead of requiring --from SNAPSHOT_ID and calling /sessions/:id/restore or
/services/:id/restore.

Updated session and service restore in all implementations:
- un.py, un.go, un.rb, un.sh, un.ex, un.erl, un.fs, un.hs
- un.groovy, un.r, un.m, un.awk

Also added snapshot management features where missing.
2026-01-04 19:02:06 -05:00
09ec15aa62 Fix: catch unknown flags in all remaining implementations
Added unknown flag validation to session command in:
awk, clj, cob, erl, ex, f90, forth, fs, lisp, ml, pro, r, scm, tcl, Java

Now all 42+ implementations properly reject unknown flags with
'Unknown option' error instead of making confusing API requests.
2026-01-04 09:01:39 -05:00
35b3ab615a Fix: catch unknown flags in session command before API request
Previously, invalid flags like --invalid-flag were silently ignored,
causing the CLI to make API requests that returned confusing
'timestamp expired' errors. Now prints 'Unknown option' and exits.

Fixed in 21 implementations: rb, pl, php, lua, sh, cpp, d, rs, zig,
v, kt, groovy, dart, cr, raku, ps1, m, nim, hs
2026-01-03 12:26:38 -05:00
c6813e5a18 Add -f FILE flag support for session and service commands
All 38+ implementations now support:
- session -f FILE: Upload files to /tmp/ in session container
- service -f FILE: Upload files to /tmp/ in service container
- service --bootstrap-file FILE: Read bootstrap script from file
2026-01-02 14:06:36 -05:00
a5a4f23594 Add clock drift error messages to remaining 18 implementations
When timestamp auth fails (401 with timestamp in error), show helpful message:
- Error: Request timestamp expired (must be within 5 minutes of server time)
- Your computer's clock may have drifted.
- NTP sync commands for Linux/macOS/Windows

Updated: Un.cs, Un.java, un.clj, un.cob, un.erl, un.ex, un.f90, un.forth,
un.fs, un.hs, un.lisp, un.m, un.ml, un.pro, un.r, un.raku, un.scm, un.zig

All 42 implementations now have clock drift detection.
2025-12-28 15:22:06 -05:00
bc0da08a08 Add clock drift error messages to 14 more implementations
When timestamp auth fails (401 with timestamp in error), show helpful message:
- Error: Request timestamp expired (must be within 5 minutes of server time)
- Your computer's clock may have drifted.
- NTP sync commands for Linux/macOS/Windows

Updated: un.awk, un.cpp, un.cr, un.d, un.dart, un.groovy, un.jl, un.kt, un.nim, un.ps1, un.rs, un.tcl, un.ts, un.v
2025-12-28 14:45:57 -05:00
ae8f9ee8c8 Add helpful clock drift message for timestamp auth errors 2025-12-28 14:36:00 -05:00
a4f9bfa377 Add HMAC authentication to all 42 implementations
- Update all un.* implementations to use HMAC-SHA256 signing
- Headers: Authorization (Bearer public_key), X-Timestamp, X-Signature
- Signature: HMAC-SHA256(secret_key, "timestamp:METHOD:path:body")
- Fix test suite issues (bash arithmetic, ES module compat, TCL shebang)
- Add CLAUDE.md with inception testing documentation
- Update README.md with HMAC auth and dependency table
- All 38 implementations pass inception test via un2
2025-12-28 14:24:03 -05:00
dba8ffeedc Add --dump-bootstrap command to remaining 28 un-inception implementations 2025-12-27 17:14:36 -05:00
ee15bc8a5f Add --dump-bootstrap command to all un-inception implementations 2025-12-27 16:40:49 -05:00
fa40b3bc78 Add key subcommand to remaining 25 implementations
Complete key command across all 42 CLI implementations:
- un.go, un.v, un.fs, un.groovy (systems/JVM)
- un.dart, un_inception.c, un_deno.ts, un.ps1 (mixed)
- un.hs, un.ml, un.clj, un.scm (functional)
- un.lisp, un.erl, un.ex, un.f90 (functional/scientific)
- un.cob, un.pro, un.forth, un.raku (exotic)
- un.m, un.awk (other)
- un.js, un.ts, un.pl (fixes to existing)

All implementations now support:
- key: Validate API key and show status
- key --extend: Open browser to renew key
2025-12-27 12:06:50 -05:00
5380af54cb Add key subcommand to all 31 implementations
- Validate API keys via portal endpoint
- Show key status, tier, expiration with color-coded output
- Add --extend flag to open browser for key renewal
- Update .gitignore for compiled binaries
- Update README with key command documentation
2025-12-27 11:50:34 -05:00
eb5d4ca8bf Add --type option for services across all 42 implementations
Support service_type for SRV records (minecraft, mumble, teamspeak, source, tcp, udp).
Each implementation now parses --type and sends service_type in the JSON payload.
2025-12-26 08:39:34 -05:00
564e9e7075 Improve README formatting and structure 2025-12-24 08:08:31 -05:00
e31c988dab Update license values in all 42 inception source files 2025-12-23 22:03:31 -05:00
12ade239bd Update README to use un instead of un2 2025-12-23 20:38:05 -05:00