@dhruv2mars/relunar
v0.2.0
Published
CLI-first GitHub issue repro harness for coding agents
Maintainers
Readme
Relunar CLI
Relunar is a CLI-first GitHub issue repro harness for coding agents.
npm install -g @dhruv2mars/relunar
relunarRelunar is a harness, not an agent. Codex, Cursor, Claude Code, or a human decides what to run. Relunar handles GitHub issue reads, Daytona sandbox creation, repo clone, configured commands, logs, reports, cleanup, and optional issue comments.
First-Time Workflow
Machine setup once:
npm install -g @dhruv2mars/relunar
relunar setupRepo setup once inside each target repo:
cd target-repo
relunar init
relunar repo link owner/repo
relunar doctorDaily use:
relunar issues list --state open
relunar repro start 123
relunar repro exec <run-id> -- <command>
relunar repro finish <run-id> --outcome reproduced --summary "Observed issue behavior."
relunar runs list
relunar runs show <run-id>Agent use:
relunar doctor --json
relunar issues list --state open --limit 20 --json
relunar repro start 123
relunar repro exec <run-id> -- <command>
relunar runs show <run-id> --jsonPost a GitHub issue comment only when explicit:
relunar repro finish <run-id> --outcome reproduced --summary "Observed issue behavior." --commentRepository Config
relunar init creates .relunar.yml:
version: 1
setup:
- bun install
baseline:
- bun run typecheck
- bun test
sandbox:
image: node:22-bookworm
resources:
cpu: 4
memory: 8
disk: 10
commandTimeoutSeconds: 300
report:
maxLogLines: 200setup installs dependencies. baseline verifies environment readiness. repro start keeps the sandbox alive; repro upload and repro exec capture issue-specific evidence; repro finish requires evidence and a summary before it can comment and clean up. Set sandbox.image when the repo needs a runtime different from Daytona's default image. sandbox.resources requires an image and sets CPU cores, memory GiB, and disk GiB. Increase commandTimeoutSeconds for large repositories with long install or test commands. Reports are written locally:
.relunar/runs/<run-id>/
report.md
report.json
logs.txtAuth
GitHub 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>
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.
Real Daytona/GitHub E2E smoke test:
RELUNAR_GITHUB_TOKEN=... RELUNAR_DAYTONA_API_KEY=... bun run test:e2eOptional Daytona settings:
RELUNAR_DAYTONA_API_URL=https://app.daytona.io/api
RELUNAR_DAYTONA_TARGET=defaultCommands
relunar init
relunar setup
relunar doctor [--json]
relunar auth github [--token <token>]
relunar auth daytona --api-key <key> [--api-url <url>] [--target <target>]
relunar repo link owner/repo
relunar issues list [--state open|closed|all] [--limit N] [--json]
relunar repro start <issue-number>
relunar repro exec <run-id> -- <command>
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 runs list [--json]
relunar runs show <run-id> [--json]
relunar skills list|get|install [agent]