Files
sanderling/pkg/spec
pj eed99e58aa refactor: code organization cleanup (#35)
* chore: fix gitignore + decisions doc after web->inspect-ui rename

Update web/ references to inspect-ui/ in .gitignore and Makefile. Add
decisions.md tracking architectural decisions from code-org discussion.

* refactor: rename pkg/spec-api to pkg/spec

Aligns the directory name with the npm package name @sanderling/spec.
Updates Makefile, package.json directory field, and resolveSpecAPIPath.

* refactor(verifier): split bindings.go into types.go + bindings.go

Move shared public types (Action, ActionKind, LogEntry, Exception) to
types.go. bindings.go retains internal JS runtime wiring only.

* refactor(inspect): split runs.go into runs.go, runs_cache.go, runs_decode.go

runs.go: types (RunSummary, StepSummary, RunDetail, Run) and Scan.
runs_cache.go: Cache type, Open/Step/Detail methods, parseRun, scanSteps.
runs_decode.go: readMeta, tallyTrace, decodeStepSummary, validRunID.

* refactor: move android_env.go to internal/android/

Extracts Android device/AVD/adb logic into internal/android package.
Exports EnsureDevice, AdbReverse, AdbReverseRemove, EnvWithAndroidPlatformTools, AdbBinary.
Moves tests to internal/android/android_test.go. cmd/sanderling becomes a thin caller.

* refactor: extract test pipeline to internal/testrun/

runTestPipeline logic moves to testrun.Execute. buildDriver, resolveSpecAPIPath,
pickFreePort, and the progress logger move to internal/testrun/. cmd/sanderling/test_run.go
becomes a thin adapter. Tests follow their code.

* ci: update workflow paths after pkg/spec-api -> pkg/spec rename
2026-04-22 20:35:34 +07:00
..

@sanderling/spec

TypeScript spec API for sanderling, a property-based UI fuzzer for mobile apps.

Spec authors write specs in TypeScript that describe what an app should always do (safety invariants), generate weighted actions to exercise the app, and extract structured state from the accessibility tree. The sanderling CLI picks up the spec and drives the app under test.

Install

npm install --save-dev @sanderling/spec

Usage

import { extract, always, actions, Tap, weighted } from "@sanderling/spec";

export const spec = {
  extract: extract((tree) => ({
    onHomeScreen: tree.some((n) => n.text === "Home"),
  })),

  always: always(({ state }) => state.onHomeScreen || !state.startedOnHome),

  actions: actions(({ tree }) =>
    weighted([
      [1, Tap(tree.first((n) => n.text === "Checkout"))],
    ]),
  ),
};

Version compatibility

@sanderling/spec is released in lockstep with the sanderling CLI. Pin the same major/minor version as your installed sanderling binary.

License

Apache-2.0