Skip to content

Repository files navigation

Relunar

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.

Why CLI-first

  • 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.

Install

npm install -g @dhruv2mars/relunar
relunar

During local development:

bun run verify

Real Daytona/GitHub E2E smoke test:

RELUNAR_GITHUB_TOKEN=... RELUNAR_DAYTONA_API_KEY=... bun run test:e2e

Quick Start

relunar
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" --comment

Repository Config

Create .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: 200

repro 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.txt

Auth

GitHub token resolution:

  1. RELUNAR_GITHUB_TOKEN
  2. gh auth token
  3. OS keychain value saved by relunar auth github --token <token>
  4. Local Relunar secret file saved by relunar auth github --token <token>

Daytona API key resolution:

  1. RELUNAR_DAYTONA_API_KEY
  2. OS keychain value saved by relunar auth daytona --api-key <key>
  3. Local Relunar secret file saved by relunar auth daytona --api-key <key>

Non-secret local settings live in:

~/.config/relunar/config.json

Secrets 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.

Commands

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 codex

Monorepo

packages/cli  Relunar CLI

Testbed

Use 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 123456

The 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

About

GitHub issues reproduction harness for coding agents

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages