Jaunt
Reference

CLI

Every command, grouped by workflow, with flags and exit codes.

The jaunt entry point is jaunt.cli:main. Commands are grouped below by the job they do: authoring specs, building, testing, contract mode, the daemon, and project maintenance. New to Jaunt? Start with Quickstart instead.

Every generation command runs through the Codex engine and needs the codex CLI installed and authenticated (codex login). See Codex Engine.

Common flags

These apply to every generation command (build, test, status, check, watch, tree, specs, adopt, reconcile, eject). Per-command sections below list only the flags unique to that command.

FlagEffect
--root PATHProject root. Default: search upward from cwd for jaunt.toml.
--config PATHPath to jaunt.toml. Default: <root>/jaunt.toml.
--jobs NConcurrency override.
--target MODULE[:QUALNAME]Restrict work to one or more modules (repeatable; filtering is module-level).
--language {py,ts}Restrict a version-2 workspace to one language. TypeScript targets use ts:path#symbol.
--no-infer-depsDisable AST dependency inference; explicit deps= still applies.
--progress {auto,rich,plain,none}Progress mode. auto is rich on a TTY, plain lines off it.
--no-progressDisable progress output.
--no-cacheBypass the LLM response cache.
--jsonEmit a machine-readable envelope on stdout. See JSON Output.

Authoring

jaunt init

Scaffold a jaunt.toml, source/test directories, and a starter spec. The TypeScript starter intentionally leaves package metadata to the package manager; when no package.json exists, follow its printed npm init command before installing tools.

jaunt init
jaunt init --root /tmp/myproj
jaunt init --force
jaunt init --language ts
FlagEffect
--root PATHDirectory to create jaunt.toml in (default: cwd).
--forceOverwrite an existing jaunt.toml.
--language {py,ts}Choose the starter target (default: py).
--jsonMachine-readable output.

init takes no other common flags.

jaunt specs

List magic specs and the dependency graph between them.

jaunt specs
jaunt specs --module my_app.specs

Specs registered by a magic_module(__name__) call are marked [module]; decorated specs carry no marker. When a spec's effective kwargs are non-empty (a per-symbol option, or a module default it inherited), they print after the marker:

- mail:parse_email (mail.py) [module] kwargs={'prompt': 'All parsers are RFC 5322 strict.'}
FlagEffect
--module MODULERestrict output to one module.
--no-infer-depsExplicit deps only.
--jsonEmits specs and dependency_graph. Each spec carries "origin" ("module" or "decorator"), "kwargs" (the merged effective kwargs), and "newly_governed" (a module-origin spec with no artifact yet).

Module-origin specs that have never been built print with a [newly governed — first build] marker, so the first build a magic_module scan commissions is never a surprise.

For a TypeScript target, specs is static: the Node worker parses private *.jaunt.ts[x] inputs without executing them and reports ts: module and symbol IDs.

jaunt instructions

Print a project-aware agent primer: the authoring modes, the build/test loop, the command and exit-code reference, then a live snapshot of the current project (resolved [paths], engine/model, semantic-gate and repo-map settings, which modules are stale). Run before an initialized project exists, it prints the framework rules plus the full jaunt.toml schema and a note to run jaunt init.

jaunt instructions
jaunt instructions --json

--json emits {command, ok, text, project}, where project is the structured snapshot (or null with no jaunt.toml).

jaunt instructions is the single source of truth for the agent workflow. The bundled Claude Code / Codex skills are thin stubs that point here, so they cannot drift from the installed CLI.

Building

jaunt migrate --config-v2

Preview or apply the deterministic version-1 to version-2 configuration rewrite:

jaunt migrate --config-v2
jaunt migrate --config-v2 --apply

The action moves Python-specific settings under [target.py], verifies that the loaded Python compatibility view is unchanged, and makes no model call. It is separate from --merge-projects.

jaunt sync

Render TypeScript API mirrors, missing canonical facades, and typed unbuilt placeholders without calling a model:

jaunt sync
jaunt sync --target ts:src/tokens/index

The owner project must typecheck before the artifacts are committed. Existing custom facades are never overwritten. Sync may refresh the deterministic API mirror and its sidecar hash bookkeeping, but it never rewrites a built implementation's body or advances its provenance to a changed contract. Semantic and fingerprint re-stamps belong to build; compatible alpha artifact repairs belong to migrate --language ts. A synchronized placeholder keeps the editor green but remains unbuilt in status and check.

jaunt design

Ask Codex to propose the declaration and TSDoc for one @jauntDesign contract:

jaunt design --target ts:src/store/index#TokenStore
jaunt design --target ts:src/store/index#TokenStore --apply

The default prints a patch, leaves the spec unchanged, and records the exact proposal under .jaunt/. --apply requires that proposal, makes no model call, checks the source digest and dirty-tree policy, confines the patch to the marked declaration, and validates it before writing.

jaunt build

Generate implementation modules for @jaunt.magic specs. Stale dependents of a changed upstream API are rebuilt too.

jaunt build
jaunt build --force
jaunt build --target my_app.specs
jaunt build --jobs 16
jaunt build --language ts --target ts:src/tokens/index
FlagEffect
--forceRegenerate everything, ignoring digests.
--instruction "..."Extra build instruction appended to the prompt (repeatable).
--include-target-tests / --no-include-target-testsInclude targeted test-spec source in build prompts (default from [build] include_target_tests).
--no-auto-skillsSkip automatic PyPI or npm package skills this run.
--no-builtin-skillsDon't seed the bundled builtin skills into the Codex workspace.
--no-repo-mapDisable repo-map injection this run. See Repo Context.
--no-semantic-gateRebuild on every real change; skip the Layer B gate (Layer A still applies). See Change Detection.

--json reports generated, skipped, refrozen, failed, cost, and context_stats, plus needs_deps, emitted_stubs, and advisories when present — see JSON Output. The context_stats seeded-skills block is keyed skills_workspace_seeded (with the legacy skills_workspace alias for this release). The build plan flags any module-origin spec with no artifact yet as newly governed by module scan before generation starts.

jaunt watch

Watch source and test roots and rebuild on relevant Python or TypeScript changes. For [target.ts], Jaunt also watches the configured projects, package manifests, lockfiles, and Vitest config while excluding generated output.

jaunt watch
jaunt watch --test

Accepts the build-shaping flags (--instruction, --include-target-tests, --no-auto-skills, --no-builtin-skills) plus --test (run tests after each successful build). With --json, watch emits one envelope per rebuild cycle, not nested build/test documents.

jaunt status

Show which modules are stale or fresh, using the same dependency-driven freshness model as build (including modules invalidated by an upstream API change).

jaunt status
jaunt status --magic-only
FlagEffect
--magic-onlyProbe only generated-artifact freshness; skip contract and repo-map checks.

A module the next build resolves through the free re-stamp path reads stale (re-stamp: free) rather than stale (structural); when that module also carries legacy raise RuntimeError("spec stub") bodies, status hints jaunt migrate. Orphaned artifacts (a generated file whose spec is gone) list in their own section, reported under "orphans" in --json.

jaunt clean

Remove target-owned generated artifacts under the configured roots. Python removes __generated__ directories and header-marked .pyi stubs. TypeScript removes owned implementations, API mirrors, sidecars, and generated magic-test batteries while preserving private specs, public facades, and contract batteries.

jaunt clean
jaunt clean --dry-run
jaunt clean --orphans
FlagEffect
--dry-runList what would be removed without deleting.
--orphansRemove only orphaned artifacts, not the whole generated tree.
--jsonEmits would_remove.

Plain jaunt clean wipes every generated directory and stub. --orphans narrows the sweep to artifacts whose spec no longer exists: the generated module, its .contract.json sidecar, its .pyi, and its generated tests or contract battery. It leaves fresh, still-governed output alone, and writes one orphan removed line to the journal per deletion. Combine with --dry-run to preview without deleting or journaling.

Testing

jaunt test

Generate held-out batteries, then run the target's protected test runner on only the generated files. Python uses pytest; TypeScript uses project-local Vitest.

jaunt test
jaunt test --no-build
jaunt test --no-run
jaunt test --pytest-args=-k --pytest-args email
jaunt test --language ts --target ts:src/tokens/index
FlagEffect
--no-buildSkip the build step.
--no-runGenerate tests without running the target's pytest or Vitest runner.
--pytest-args ARGExtra arg appended to pytest for Python targets (repeatable). TypeScript runner args are intentionally not accepted.
--no-semantic-gateRebuild on every real change; skip the Layer B gate.
--no-redact-derivedDebug only — feed full derived-tier failure detail into repair.

Generated tests split into a held-out set: Python cases use @pytest.mark.jaunt_tier("example" | "derived"); TypeScript batteries carry the same tier in protected reporter metadata. When a test fails and Jaunt regenerates the implementation, derived failures are redacted to a semantic case id and category so the implementation generator never sees the value, file, timing, or diagnostic location it could otherwise game; example failures keep authored evidence. --no-redact-derived disables that barrier and logs a warning — a debugging escape hatch only.

Fresh TypeScript batteries skip generation but still typecheck and run. Changes only to the protected runner or Vitest fingerprint deterministically reheader the unchanged battery and appear under refrozen; content-affecting drift and --force regenerate it.

Contract mode

Adopt committed code under docstring/TSDoc contracts and keep a derived pytest or Vitest battery in sync. See the Contract Mode guide and TypeScript target guide.

jaunt adopt

Add the target-language contract marker and derive its battery.

jaunt adopt my_app.slug:slugify
jaunt adopt src/slug.ts#slugify --language ts

Takes a positional Python module:func or TypeScript path.ts#symbol ref plus the common flags. Python adopts whole classes; TypeScript supports committed exported functions and concrete classes described in the TypeScript guide.

jaunt reconcile

Derive or refresh committed contract batteries. This is the only contract command that calls the model.

jaunt reconcile
jaunt reconcile --language ts

jaunt check

The single deterministic CI gate for both modes — no model, no API key. It verifies committed contract batteries and Python/TypeScript magic freshness, exiting 4 on any blocking drift: a contract that is unbuilt, stale-prose, signature-drift, or behavior-drift; or a magic module that is unbuilt or stale (including a missing or stale Python .pyi stub). TypeScript invalid-artifact diagnostics and unbuilt private spec modules block the same gate.

jaunt check
jaunt check --contracts-only
jaunt check --magic-only
FlagEffect
--contracts-onlyGate only contract batteries.
--magic-onlyGate only generated-artifact freshness for configured targets.

check also blocks on orphaned artifacts. A generated module, .pyi, or contract battery whose spec no longer exists exits 4 with a message naming the fix — jaunt clean --orphans, or restore the spec. A mid-refactor rename shows one orphan and one newly-governed spec and holds CI red until you rebuild, which is intentional.

--contracts-only and --magic-only are mutually exclusive. --json reports a magic block (fresh / stale / unbuilt, plus generated/stub/sidecar orphans) and a top-level orphans key for contract-battery orphans; see JSON Output. A project with no magic specs and no contract drift exits 0.

jaunt eject

Remove contract tracking; leave ordinary Python/pytest or TypeScript/Vitest code.

jaunt eject my_app.slug:slugify
jaunt eject src/slug.ts#slugify --language ts
jaunt eject ts:src/slug/index --language ts
jaunt eject --all
FlagEffect
--allEject every contract function.

Daemon

Background codegen from committed spec changes. See the Background Daemon guide.

jaunt daemon

jaunt daemon start     # foreground; Ctrl-C to stop
jaunt daemon status
jaunt daemon stop

start and status accept --root and --json; stop accepts --root.

jaunt jobs

Inspect job records and the pending-rebuild preview, and land or discard parked proposals.

jaunt jobs
jaunt jobs show <id> --full
jaunt jobs retry <id>
jaunt jobs land <id>
jaunt jobs land --all
jaunt jobs discard <id>
jaunt jobs wait --timeout 1800
SubcommandPurposeFlags
(bare) jobsJob records, pending rebuilds, latest heartbeat phase.--root, --json
show IDOne job record.--full (local detail log), --json
retry IDRetry landing a parked job.--force (land even if the spec changed since parking)
land [ID]Land a parked proposal as a provenance commit.--all, --json
discard IDMark a proposal DISCARDED and drop its patch.--json
wait [ID]Block until a job (or the daemon) is idle.--timeout N, --settle N, --progress, --json

Under the default propose-only mode ([daemon] auto_commit = false), green jobs are parked as proposals rather than committed:

  • jaunt jobs land <id> lands one proposal. It re-validates first: a stale spec digest, a mismatched branch, dirty target paths, or a 3-way apply conflict all refuse the land (exit 4); a stale digest or apply conflict also marks the proposal SUPERSEDED. jaunt jobs land has no --force; use jaunt jobs retry <id> --force to land despite a changed spec.
  • jaunt jobs land --all lands every fresh proposal in job-creation order, prints per-job outcomes, and exits 0 only when every attempted land succeeded, else 4.
  • jaunt jobs discard <id> drops a proposal and its patch artifact.

jaunt jobs wait blocks until the target job finishes, or (without an id) until the daemon is idle. A parked proposal (PROPOSED) counts as terminal-green, so wait returns 0 on it. --settle N sets the idle race-guard window; --timeout N exits 5 on timeout. Bad ids or wrong-state jobs exit 2.

Automation

PatternCommand
Agent loop (propose-only)git commit … && jaunt jobs wait --timeout 1800 && jaunt jobs land --all
Agent loop (auto-commit)git commit … && jaunt jobs wait --timeout 1800
NotificationsSet [daemon] notify_command to run your hook on proposed, landed, parked, or failed jobs.

jaunt log

Tail the JAUNT_LOG change journal that build, test, and daemon runs append to.

jaunt log
jaunt log -n 50          # 0 = all lines
jaunt log --module my_app.specs
FlagEffect
-n, --lines NNumber of lines (0 for all).
--module MODULEFilter by module name.
--root PATH, --jsonRoot override; machine-readable output.

jaunt guard

A PreToolUse hook for coding agents that reads a hook payload on stdin and warns when a tool call is about to touch files under the generated dir. See docs/hooks.md in the repo for Claude Code wiring.

jaunt guard
jaunt guard --generated-dir __generated__
FlagEffect
--generated-dir DIROverride the guarded dir (default from jaunt.toml or __generated__).

jaunt install-codex-plugin

Install Jaunt's first-party Codex plugin from the GitHub marketplace, or from a local clone for development.

jaunt install-codex-plugin
jaunt install-codex-plugin --local --root /path/to/jaunt
jaunt install-codex-plugin --json

jaunt install-claude-plugin

Install Jaunt's first-party Claude Code plugin with the matching GitHub or local marketplace flow.

jaunt install-claude-plugin
jaunt install-claude-plugin --local --root /path/to/jaunt
jaunt install-claude-plugin --json

Both installers are idempotent and use a 120-second timeout per CLI command.

Maintenance

jaunt tree

Maintain treedocs.yaml, the one-line-per-path repo map injected into build prompts. See Repo Context.

jaunt tree             # sync (AST-only descriptions by default)
jaunt tree --check     # CI gate: exit 4 if the tree is stale
jaunt tree --enrich    # force LLM enrichment this run
FlagEffect
--checkExit 4 if the tree is stale.
--enrich / --no-enrichForce or forbid LLM enrichment this run (default from [context] enrich).

jaunt cache

Inspect or clear the LLM response cache under .jaunt/.

jaunt cache info
jaunt cache clear

Both accept --root, --config, and --json.

jaunt skill

Manage project-local skills under .agents/skills/.

jaunt skill list
jaunt skill show rich
jaunt skill add rich --description "Rich usage notes" --lib rich
jaunt skill remove rich -f
jaunt skill import --from /path/to/skills-dir
jaunt skill refresh
jaunt skill build rich

Two subcommands generate content through the Codex engine: skill build <name> expands a user-managed checked-in skill (it must already exist with --lib metadata, usually from skill add <name> --lib <package>), and skill refresh regenerates Jaunt-managed auto skills. Both drive codex exec under the hood.

jaunt migrate

Plan or apply mechanical migrations. The default is always a dry run: jaunt migrate prints what it would change and exits 0, while jaunt migrate --apply writes the validated plan. Neither mode calls the model.

jaunt migrate
jaunt migrate --apply
jaunt migrate --apply --allow-newly-governed
jaunt migrate --language ts
jaunt migrate --language ts --apply

For Python targets, the command handles two source and stub migrations:

  • Legacy stub bodies. A raise RuntimeError("spec stub") body — the form the old scaffold emitted — is rewritten to ..., and the generated header is re-stamped over the untouched body, so the conversion is free. For a symbol that is already a spec this is a re-stamp. For a currently ungoverned function in a magic_module file, rewriting its body would newly govern it and commission a first build, so migrate lists it as would newly govern and skips it unless you pass --allow-newly-governed.
  • Stub re-emission. When a committed .pyi is stale only because _STUB_FORMAT_VERSION bumped in a past release, migrate --apply re-renders it without a build. This retires the 1.4.2 wart where jaunt check reported stubs stale until you ran jaunt build once.

For a TypeScript-only version-2 root, plain jaunt migrate selects TypeScript. Use --language ts explicitly in a mixed Python/TypeScript root. The worker analyzes the current project and proposes only deterministic artifact work:

  • create or repair the API mirror, canonical facade, typed unbuilt placeholder, and sidecar;
  • re-stamp a compatible built implementation when only its tool fingerprint or deterministic artifacts are stale;
  • report model-rebuild when the contract changed or an alpha protocol, IR, or route is incompatible.

The TypeScript migration records exact input hashes and commits its complete write set through the recoverable artifact transaction. An apply refuses a stale plan or dirty worktree unless --force is present. Preview-era private specs, facades, or loader layouts that do not map unambiguously to the current route are reported as manual-intervention; Jaunt does not rename or rewrite them.

FlagEffect
--applyWrite the planned changes. Refuses on a dirty git tree unless --force.
--forceApply despite uncommitted changes.
--language {py,ts}Select one target. Plain migrate selects TypeScript only when [target.ts] is the sole configured target.
--allow-newly-governedAlso rewrite legacy bodies that would newly govern a symbol.
--jsonEmit {applied, actions: [...]}. TypeScript plans also include plan_digest, diagnostics, blocked, and requires_rebuild.

Every applied change is printed file by file. After an apply on a legacy-body project, jaunt status reports the module fresh with no model call.

jaunt eval

jaunt eval is not currently supported under the Codex engine (a rework is pending). The command exits 2. The provider/compare benchmarking suite predates the Codex cutover and will return in a future release.

Exit codes

CodeMeaning
0Success
2Config, discovery, or dependency-cycle error; bad or wrong-state job id
3Generation error (LLM / backend / validation / import)
4Pytest/Vitest failure, contract check/reconcile block, stale tree --check, or a daemon job failed/parked during jobs wait
5Timeout while waiting for daemon jobs

Next: Configuration.

On this page