Relunar is a CLI-first repro harness for coding agents.
Ask Codex, Cursor, Claude Code, or another coding agent to reproduce GitHub issues. Relunar handles deterministic plumbing: GitHub issue reads, Daytona sandbox creation, repository clone, configured commands, local reports, logs, cleanup, and optional GitHub issue comments.
Relunar is a harness, not an agent. Your coding agent decides which issues matter, whether extra context is needed, and when a report is good enough.
- No hosted service in v1.
- No central Relunar custody of user secrets.
- Maintainers use their own GitHub and Daytona accounts.
- Commands are visible, local, and composable.
- GitHub comments are explicit with
--comment.
npm install -g @dhruv2mars/relunar
relunarDuring local development:
bun run verifyReal Daytona/GitHub E2E smoke test:
RELUNAR_GITHUB_TOKEN=... RELUNAR_DAYTONA_API_KEY=... bun run test:e2erelunar
relunar setup
relunar repo link owner/repo
relunar doctor
relunar issues list --state open --limit 20 --json
relunar repro start 123
relunar repro upload <run-id> ./repro.ts repro.ts
relunar repro exec <run-id> --claim "Compiler crashes on the supplied input" --expect-exit 1 --stderr-match "compiler crash" -- bun repro.ts
relunar repro finish <run-id> --outcome reproduced --evidence probe-1 --summary "Compiler crashes on the supplied input." --repro-steps "1. Run bun repro.ts" --observed "Compiler exits 1 with compiler crash." --expected "Compilation succeeds." --environment "Node 22" --commentCreate .relunar.yml in the target repository:
version: 1
setup:
- bun install
baseline:
- bun run typecheck
- bun test
# Optional. Use a repo-compatible image when the Daytona language image has
# an incompatible runtime. For example, TypeScript's testbed pins Node 22.
sandbox:
image: node:22-bookworm
resources:
cpu: 4
memory: 8
disk: 10
workspace:
workdir: repo
submodules: false
lfs: false
environment:
variables:
CI: "true"
passthrough:
- TEST_API_TOKEN
services:
- name: app
start: bun run dev
ready: curl -fsS http://127.0.0.1:3000/health
stop: pkill -f "bun run dev"
artifacts:
collect:
- test-results/**
commandTimeoutSeconds: 300
report:
maxLogLines: 200repro start clones the linked GitHub repo into a persistent Daytona sandbox, prepares the configured workspace, services, environment, setup, and baseline. Agents then run probes with explicit exit/output/file/duration assertions. Conclusive outcomes require every repeated probe and optional control to satisfy its assertions. repro finish records a complete maintainer narrative and verified trust; comment publication is explicit, previewable, retryable, and idempotent. Configured artifacts are downloaded before cleanup. Use relunar sandboxes list and dry-run relunar sandboxes gc to recover leaked resources.
Setup commands complete before services launch. Service start commands may be ordinary foreground processes; Relunar detaches them, waits on ready, records startup evidence, and runs the baseline only after readiness succeeds.
.relunar/runs/<run-id>/
report.md
report.json
logs.txtGitHub token resolution:
RELUNAR_GITHUB_TOKENgh auth token- OS keychain value saved by
relunar auth github --token <token> - Local Relunar secret file saved by
relunar auth github --token <token>
Daytona API key resolution:
RELUNAR_DAYTONA_API_KEY- OS keychain value saved by
relunar auth daytona --api-key <key> - Local Relunar secret file saved by
relunar auth daytona --api-key <key>
Non-secret local settings live in:
~/.config/relunar/config.jsonSecrets are never stored in the repository. On macOS, Relunar prefers the OS keychain. On Linux, Windows, or when macOS keychain access is unavailable, Relunar stores secrets in ~/.config/relunar/secrets.json with owner-only file permissions where the platform supports them.
relunar init
relunar setup
relunar doctor
relunar auth github
relunar auth daytona
relunar repo link owner/repo
relunar issues list --state open --limit 20 --json
relunar repro start 123
relunar repro exec <run-id> -- <command>
relunar repro evidence <run-id> --json
relunar repro upload <run-id> <local-path> <remote-path>
relunar repro finish <run-id> --outcome reproduced|not-reproduced|blocked --summary <text> [--comment]
relunar repro abort <run-id>
relunar repro comment preview <run-id>
relunar repro comment post <run-id>
relunar repro cleanup <run-id>
relunar runs list
relunar runs show <run-id>
relunar sandboxes list
relunar sandboxes gc [--confirm]
relunar skills list
relunar skills get codex
relunar skills install codexpackages/cli Relunar CLIUse docs/testbed.md for the local Fastify OSS testbed workflow.
The published npm package is @dhruv2mars/relunar. It ships the relunar executable from compiled dist/index.js and is released from tags like v0.1.0.
Configure npm trusted publishing once before tagging a release:
bun run release:trust -- --otp 123456The trust command must use npm 11.15.0 or newer and must include --allow-publish. Do not type the placeholder form --otp <6-digit-code> in zsh; angle brackets are shell redirection.
Turborepo runs builds, tests, and typechecking:
bun run build
bun run test
bun run typecheck