relai init registers an agent project and generates simulator support.
Before you run it
Run it from the root of a git-tracked agent repository. The project should satisfy the project requirements. Runrelai setup first to configure machine-level RELAI credentials, or provide them when relai init prompts.
When project credentials already exist in .relai/config.toml, relai init reuses them without asking for them again. Otherwise, when user-level credentials exist in ~/.relai/config.toml, relai init reuses them for the project without prompting. Use --override-creds when this project should use different RELAI API credentials.
Options
Interactive runs may ask for RELAI credentials, permission to inspect untracked
project files or install dependencies, agent metadata, mock policies, and
whether to commit the RELAI-managed files. Full simulator validation must pass
before RELAI registers agent targets.
How initialization works
relai init uses one agentic workflow for every supported language. The CLI
creates a trusted language-specific seed, then the init agent inspects selected
repository files, reports its resolved dependencies and logical agent targets,
adapts the seed, and validates the simulator locally. There is no legacy
generation path or feature flag.
Common and language-specific simulator guidance is compiled into the CLI. The
agent can resolve dependencies through the selected Python, TypeScript, or Go
environment and inspect bounded declarations or source for named integration
points. It generates a project-owned adapter with explicit, behaviorally
verified capabilities; the RELAI SDK does not infer third-party framework
hooks. Repository and dependency reads remain bounded, sensitive paths stay
unavailable, and external local dependency roots require approval.
Approval modes
By default, init prompts for approval in an interactive terminal and pauses with an action-required checkpoint when stdin is non-interactive. Use--approval-mode require to request that pausing behavior explicitly, or
--approval-mode all to automatically approve every bounded action that would
otherwise ask for confirmation:
[permissions].profile = "workspace" separately when the init agent must be
allowed to edit application files. --approval-mode prompt requires an
interactive terminal.
After validation, RELAI asks you to select any discovered logical targets,
records the selected target-to-agent mappings, and registers them with the
backend. In an interactive terminal, it can then offer to commit the changed
.gitignore and .relai/ files. In a non-interactive terminal, it prints the
equivalent commit command instead.
Pause, resume, or restart
Initialization checkpoints its progress in.relai/init-session.json whenever
it needs an answer, approval, an external action, or recovery from an
interruption. Run relai init --resume to continue the same session. Resume
restores earlier model and tool progress, permission decisions, validation
progress, selected options, and completed phases; it cannot be combined with
--override-creds or --agent-target.
Run relai init --restart to discard an unfinished checkpoint and begin again.
If an unfinished session exists, interactive init offers to resume, restart, or
cancel; non-interactive init requires one of those flags. A completed init
removes the checkpoint.
Each session also writes a metadata-only diagnostic record under
.relai/runs/. It contains action names, statuses, request IDs, timings, and
token usage, but not prompts, source bodies, diffs, or raw command output.
Agent targets
Repositories with several logical agents can register each one as a named agent target. During interactive initialization, RELAI shows the discovered targets with their code entrypoint and, when available, runtime selector. Use Space to toggle each target and Enter to confirm the selection. RELAI creates one backend agent for every selected target and records the target-to-agent mapping in.relai/config.toml.
To select targets non-interactively, repeat --agent-target with discovered
target names:
--agent-target {target} explicitly.
What it creates
- project registration with the RELAI backend.
- simulator files under
.relai/simulator/. - runtime and mock manifests.
.relai/learning-env-context.json..relai/simulator.env.example.- a temporary local init checkpoint while initialization is paused or in progress; it is removed after completion.
- a metadata-only local diagnostic record under
.relai/runs/. - an interactive offer, or non-interactive instructions, to commit changed
.gitignoreand.relai/files.
.relai/, each created by its own command:
.relai/learning-envs/for learning environments, fromrelai learning-env..relai/evaluators/for evaluators, fromrelai evaluator..relai/benchmarks/for benchmarks, fromrelai benchmark..relai/runs/for simulation and optimizer run artifacts.
Mocking tools and components
During interactive initialization, RELAI may list agent tools, callable functions, or component dependencies that the generated simulator can replace with mocks. For each replaceable target,relai init shows the target, the kind
of target, RELAI’s recommendation, and the reason for that recommendation, then
asks whether to mock it:
Alwaysrecordsmock. Learning environments must provide a mock for that target.Neverrecordsdo_not_mock. Learning environments must let that target run normally.Dependsrecordsany. Each learning environment can decide whether that target should be mocked.
Always for calls that make simulations slow, flaky, expensive, unsafe, or
dependent on external state, such as network lookups, writes to third-party
systems, or calls that need production credentials. Use Never when the
component is part of the behavior you want RELAI to exercise directly, such as
local deterministic logic or a component-specific learning environment target.
Use Depends when the right choice varies by scenario.
Some targets are marked cannot_mock. RELAI records those decisions without
asking because the generated simulator cannot reliably replace that target, for
example a hosted tool that only runs remotely.
These choices record whether a target may be mocked, not how. To control
the mock’s behavior in a given scenario — a tool that always succeeds, or one
that returns a specific error the agent should handle — describe it in the
--prompt or --feedback when you create the learning
environment.
The final choices are written to .relai/mock-manifest.json and are checked
when you create or upload learning environments. If a component requires one of
its dependencies to be mocked, RELAI will reject Never for that target. If a
component needs a target to run live, RELAI will reject Always.
Example
Controlling project inputs with .relaiignore
Add a root-level .relaiignore file when some project files should stay out of
agentic init model context, other RELAI generation inputs, and optimizer
worktrees. It uses familiar .gitignore-style patterns, including comments,
globs, directory patterns, anchored paths, and negation. Replace the placeholder
names below with project-specific paths.
.relaiignore applies only to project files. RELAI-managed .relai/ runtime state is outside its scope, so required simulator harness files, manifests, learning environments, benchmarks, and run metadata continue to use RELAI’s built-in rules. The .relaiignore file itself is also treated as a local control file and is not sent as backend context.
If a command explicitly asks for an ignored project file, RELAI fails clearly instead of silently bypassing the boundary. For example, registering a benchmark with an ignored --csv, creating a learning environment from an ignored --log-file, or optimizing with an ignored runtime env file will report that the path is excluded by .relaiignore.
.relaiignore is independent of .gitignore: git can still track files that RELAI excludes from backend inputs and optimizer worktrees.
Common failures
- not running inside a git repository.
- missing RELAI credentials.
- missing required local tools.
- init model or local validation failure.
- an action that requires approval in a non-interactive terminal.
- an unfinished init session; resume it with
relai init --resumeor discard it withrelai init --restart. - missing runtime environment values required by the smoke test.
- tracked generated paths already have local changes.
- the project cannot expose a runnable local simulator surface.