Ready-made CI pipeline integration, such as GitHub Actions, is coming soon. Until then, use the headless setup on this page.
Declare that nobody is there
A headless session has no way to ask you anything. Declare it with either of these:workspace.run_driver: interactive in plurai.config.yaml wins over the variable. With neither set, a headless run stops at the first question and waits for an answer that never comes.
Then start your coding agent in its non-interactive mode, one stage per call:
- Claude Code
- Copilot CLI
- Codex CLI
Claude Code asks before reading the plugin’s own files, and nobody can answer that in CI. Add the plugin’s
folder as an extra working directory once. Print its path:Put it in Then run:
~/.claude/settings.json. The path has no version in it, so updates need no change:On Codex CLI,
codex exec runs no hook that is not trusted yet. Trust the plugin’s hooks in an interactive session first, and again after each plugin update. See Codex CLI.PLURAI_URL and PLURAI_TOKEN in the job’s environment. See Environment variables.
What happens to questions
Each question a command can ask is either a decision or something only you can supply.- A decision takes its declared default and the command continues.
- Something only you can supply (a key, credentials, a target) is recorded as a finding that says what is missing, and the step it guards does not run.
Answer in advance what needs you
Supply these before an unattended run. Without them, the step that needs them does not run:- Anonymization posture. Declare
anonymize: trueoranonymize: falseinplurai.config.yaml. There is no default: the plugin never picks one for you, and the run stops until you declare it. See Data and privacy. - Your agent’s model-provider key. Put it in the gitignored
.envfile in your agent’s folder. This is required on Copilot CLI, which strips provider keys from the shell. - Your observability key and project, if you record runs to LangSmith or Langfuse. Put the key in the same
.envfile, or declare observability off. - Where your agent is. Start the run from your agent’s folder.
PLURAI_AGENT_PATHcan narrow which agent is used, but it doesn’t replace starting there. - A blocker the suite raises, such as a fact only you know. Answer it in an interactive session, or declare the fact it asks for.
Approve harness edits in advance
While it builds the suite, the plugin sometimes finds a fix that belongs in your harness:simulate.py, its helpers, or a runner of your own that plurai.config.yaml declares as harness.entry_wrapper. These files are yours, so the plugin asks before it writes to them.
When nobody can be asked, the edit is declined: the fix stays unapplied, and the plugin reports the file and the diff it would have applied. To approve these fixes in advance, add a top-level key to plurai.config.yaml:
plurai.config.yaml
trueapproves harness edits when nobody can be asked. The plugin applies the diff and logs the question, the file path, the diff and the answer.false, or leaving the key out, keeps them unapplied and reported.- It applies only when nobody can be asked. In an interactive session you are still asked.
- The plugin never writes this key for you.
Long waits
Building the suite can take tens of minutes. In a headless session the plugin keeps the turn open and polls until each backend job finishes, because nothing wakes the session up later. A turn that dies on an API error is not retried for you: run the same command again and it resumes.Next steps
Configuration
workspace.run_driver, anonymize and approve_harness_edits.Save and switch environments
Commit an environment so CI runs the same suite.
Run the simulation
What a run does and where results appear.
Permissions
Running the plugin under auto permission mode.