script-kit-testing
Installation
SKILL.md
Script Kit Testing
Testing infrastructure and patterns for Script Kit GPUI.
Test Directories
tests/smoke/- E2E tests (run via stdin JSON protocol)tests/sdk/- SDK tests (oftenbun run ...)
SDK Preload in Tests
import '../../scripts/kit-sdk'; // globals: arg(), div(), editor(), fields(), captureScreenshot(), getLayoutInfo(), ...
Test Output JSONL Format
{"test":"arg-string-choices","status":"running","timestamp":"2024-..."}
{"test":"arg-string-choices","status":"pass","result":"Apple","duration_ms":45,"timestamp":"2024-..."}
Status values: running | pass | fail | skip (with error/reason)
Minimal Test Skeleton
import '../../scripts/kit-sdk';
function log(test: string, status: string, extra: any = {}) {
console.log(JSON.stringify({ test, status, timestamp: new Date().toISOString(), ...extra }));
}
const name = "my-test";
log(name, "running");
const start = Date.now();
try {
const result = await arg("Pick", ["A", "B"]);
log(name, "pass", { result, duration_ms: Date.now() - start });
} catch (e) {
log(name, "fail", { error: String(e), duration_ms: Date.now() - start });
}
Running Tests
# TypeScript SDK tests
bun run scripts/test-runner.ts
bun run scripts/test-runner.ts tests/sdk/test-arg.ts
# E2E smoke tests via stdin
cargo build && echo '{"type":"run","path":"'"$(pwd)"'/tests/sdk/test-arg.ts"}' | ./target/debug/script-kit-gpui
echo '{"type":"run","path":"'"$(pwd)"'/tests/smoke/hello-world.ts"}' | SCRIPT_KIT_AI_LOG=1 ./target/debug/script-kit-gpui 2>&1
# Rust unit tests
cargo test
# System tests (clipboard, accessibility, macOS APIs)
cargo test --features system-tests
# Run ignored interactive tests
cargo test --features system-tests -- --ignored
Verification Gate (Before Every Commit)
cargo check && cargo clippy --all-targets -- -D warnings && cargo test
Feature-Gated System Tests
Tests that use clipboard, accessibility APIs, or other system resources:
#[cfg(feature = "system-tests")]
#[test]
fn test_clipboard_integration() { ... }
Test Helpers
fn test_scriptlet(name: &str, tool: &str, code: &str) -> Scriptlet {
Scriptlet { name: name.to_string(), tool: tool.to_string(), code: code.to_string(), ..Default::default() }
}
fn wrap_scripts(scripts: Vec<Script>) -> Vec<Arc<Script>> {
scripts.into_iter().map(Arc::new).collect()
}
Platform-Specific Tests
#[cfg(target_os = "macos")]
#[test]
fn test_macos_specific() { ... }
#[cfg(unix)]
#[test]
fn test_unix_signals() { ... }
Anti-Patterns
- DON'T use
cx.run()in unit tests (needs running app) - DON'T rely on global state between tests
- DON'T hardcode paths (
/Users/john/...) - use temp dirs - DON'T forget platform guards for OS-specific tests
- DON'T skip cleanup (env vars, temp files)
Weekly Installs
1
Repository
johnlindquist/s…kit-nextGitHub Stars
21
First Seen
Mar 21, 2026
Security Audits
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
warp1