Functions

f
getChangedFilePathsInGitSince(
projectRoot: string,
ref: string,
timeoutMs?
): Task<ChangeScan, GitScanFailure>

Resolves the working-tree paths that differ from ref, plus all uncommitted modifications/additions, as absolute paths — or scope: 'everything' when a blast-radius file (package.json, tsconfig*.json, …) changed.

f
runGit(
args: string[],
cwd: string,
timeoutMs?,
command?: string
): Task<string>

Runs one git command with a hard upper bound on how long it can take.

Type Aliases

T
GitScanFailure = Failure.Of<GitScanFailed>

The failure a git-change scan declares — the E of its Task, the Err of .result().

Variables

v
BLAST_RADIUS_FILES: Set

Exact basenames whose modification invalidates the entire test suite. A change to any of these short-circuits getChangedFilePathsInGitSince to null, signalling the caller to skip filtering and run everything. The qunitx config lives inside package.json per project convention, so package.json alone covers it.

v
BLAST_RADIUS_PATTERNS: RegExp[]

Basename regexes with the same blast-radius semantics. Currently catches tsconfig.json and editor variants like tsconfig.test.json / tsconfig.build.json.

v
GIT_TIMEOUT_MS: 30000

Upper bound on a single git invocation. --changed already degrades to "run all tests" when git fails, so a stuck git should reject rather than wedge the run — without a bound the CLI hangs forever, since neither git nor the caller ever gives up. 30s is orders of magnitude above a healthy git status on a large repo, so it only fires on a genuine wedge.

v
GitScanFailed

git could not answer: not a repo, unknown ref, git missing, or it exceeded timeoutMs.