Configuration

Config file

Semtest looks for a config file by walking up the directory tree from the current working directory. The first file found is used.

Searched in order:

  1. semtest.config.ts
  2. semtest.config.js
  3. semtest.config.mjs

defineConfig

Use the defineConfig helper for type-safe configuration:

import { defineConfig } from "@westopp/semtest";

export default defineConfig({
  output: "semtest-results/",
  llm: "claude-code-sonnet-4-6",
});

Properties

Property Type Default Description
testMatch string[] ["**/*.spec.md", "**/*.test.md"] Glob patterns for discovering test files
testPathIgnorePatterns string[] ["node_modules", "dist", ".git", "vendor"] Patterns to exclude from test discovery
output string "semtest-results/" Path to the report output directory
llm string "claude-code-sonnet-4-6" Model key specifying the tool and model. Run semtest list for all options.
timeout number 0 Per-test timeout in milliseconds. 0 means no timeout.
repeat number 1 Run each test N times
bail boolean | number false true to stop after the first failure, or a number to stop after N failures
verbose boolean false Show detailed per-test output
strict boolean false Exit code 2 on validation issues
skipValidation boolean false Skip post-run validation entirely
debug boolean false Log raw LLM output to a debug directory
timestamp boolean false Generate timestamped copies of the Markdown report
includePassing boolean false Include passing tests in the Markdown report
junit boolean false Generate a JUnit XML report
skipPermissionsIfPossible boolean false Skip tool permission prompts where supported

CLI precedence

CLI flags override config file values. The config file provides defaults; flags are overrides for individual runs.

# Config says strict: false, but this run uses strict mode
semtest run --strict

Full example

import { defineConfig } from "@westopp/semtest";

export default defineConfig({
  testMatch: ["**/*.spec.md"],
  testPathIgnorePatterns: ["node_modules", "dist", ".git", "vendor"],
  output: "semtest-results/",
  llm: "claude-code-opus-4-6",
  timeout: 120000,
  repeat: 1,
  bail: false,
  verbose: false,
  strict: true,
  skipValidation: false,
  debug: false,
  timestamp: true,
  includePassing: false,
  junit: true,
  skipPermissionsIfPossible: true,
});