nightshift
github.com/shaurya-sethi/nightshift- Category
- Developer Tools
- Rank
- No. 1559Tools index
Previous survey · No. 1492 ·
- Pricing
- Open Source
- Type
- TOOL
- Use case
- Coding
- Interfaces
- CLI
- GitHub
- 14 stars
- Latest release
- v0.3.1
- Date
About
A Rust CLI that autonomously works through a GitHub issue backlog overnight by handing each sub-issue to an installed coding agent (Claude Code, Codex, Cursor, Copilot CLI, and others), managing branching, PR creation, and merging until every issue linked to a PRD is resolved. It selects work using native GitHub parent/blocked-by relationships rather than parsing issue text, and offers per-issue agent, model, and reasoning-effort selection via an optional TUI.
What it does
Give it a spec written as a GitHub issue and it loops through the child tasks under that spec one at a time. Each pass resets the local checkout to the base branch, asks GitHub which labelled tasks have no open blockers, and takes the lowest-numbered one. It starts a brand-new coding-agent process, pipes in the spec, the task and a fixed checklist (branch, test first, open a pull request, self-review, squash merge, close the task), then waits. When the agent exits, it confirms on GitHub that the task is closed. If the task is still open, the loop halts and tells you.
Why it's ranked here
The core idea is sound and cleanly executed: task order comes from GitHub's native parent and blocked-by links, not from parsing prose, so the plan is deterministic and inspectable with a dry run. It is MIT licensed, installs with one Cargo command, and drives seven agent CLIs through one switch. Checking that the task really closed before moving on is the right guard for an unattended loop. The price of unattended is steep, though: every supported agent is launched with its approval prompts switched off, and the merge lands on your base branch with no human in between.
What's good
GitHub, git and the agent process each sit behind a small interface, so the loop is tested with fakes, and a dedicated fake-agent binary exercises the real process runner. Bad combinations fail before any work starts: asking for a model on an agent that has no model flag, or an effort level outside that agent's documented set, is rejected up front with a message naming the valid values. The prompt goes in over standard input, keeping large specs off the command line. Per-task agent, model and effort choices live only in memory and a half-finished picker never starts a run.
Tradeoffs
Claude Code runs with permission checks skipped, Cursor with force and trust, OpenCode with auto-approve, Copilot with allow-all. Meanwhile the spec and task bodies are pasted verbatim into the prompt, so anyone able to write a labelled task can steer an agent that needs no approval. Agent output is thrown away in both display modes, and a failure reports only the exit status, so diagnosing a bad night means digging through the agent's own history. It needs GitHub CLI 2.94 or newer. Work is strictly serial: one task, one agent, then the next.
How to use it well
Best fit: a solo developer or small team with a spec already broken into small, well-ordered tasks, running in a disposable machine or container where an unsupervised agent cannot touch anything that matters. Use the bundled skills to publish the spec and child tasks in the exact shape it expects, run a dry run to check the planned order, and add your own test and lint commands through an appended prompt file. Keep the ready label restricted to people you trust. It does not parallelise work, review code for you, or recover from a task the agent leaves open.
Technical notes+
src/main.rs wires GhCliAdapter, GitCliAdapter and ProcessAgentRunner into orchestrator::run; the Runtime struct in src/orchestrator.rs holds them as trait objects so tests swap fakes. run_loop calls ensure_hygiene on the base branch, fetch_issues (src/github.rs shells out to gh issue list --label ready-for-agent --state open --json number,title,body,parent,blockedBy), plan_order, then render_issue_prompt and agent_runner.run, and finally is_issue_closed, failing if the issue is still open. Agent::get_command in src/agent.rs hard-codes claude -p --dangerously-skip-permissions, agent -p --force --trust, agy -p --dangerously-skip-permissions, opencode run --auto, copilot --allow-all --no-ask-user and codex exec - --ephemeral. get_command_with_profile validates model and effort via ensure_model_supported and validate_reasoning_effort (OpenCode variants pass through). resolve in src/invocation_profile.rs applies whole-run model and effort only when the per-issue agent equals the default agent. Cargo.toml declares a feature-gated fake agent binary and the process_agent_runner test that requires it. docs/context-management.md documents the prompt skeleton and the nine built-in directives.
Observed
- License
- MIT
- Language
- Rust, 2024 edition
- Packaging
- Published on crates.io as nightshift-cli; installs a nightshift binary via cargo install
- Interface
- CLI with an optional full-screen terminal board (ratatui, crossterm)
- External requirements
- GitHub CLI 2.94.0 or newer, git, and one supported coding-agent CLI
- Supported agents
- Claude Code, Codex CLI, Antigravity CLI, Cursor, Pi, OpenCode, GitHub Copilot CLI
- Agent permissions
- Agents are launched with non-interactive approval-bypass flags
- Task selection
- Native GitHub parent and blocked-by relationships plus a ready-for-agent label; issue bodies are not parsed for ordering
- Testing
- Unit tests in source modules and a feature-gated fake-agent binary for process-runner integration tests
Read from README.md, Cargo.toml, src/main.rs, src/cli.rs, src/orchestrator.rs, src/agent.rs, src/github.rs, src/preflight.rs, src/invocation_profile.rs, docs/invocation-profiles.md, docs/context-management.md.
What it can do
Assign GitHub sub-issues to an installed coding agent for resolution
GitHub issue linked to a PRD → Resolved issue via coding agent
Merge pull requests once issues are resolved
Pull request → Merged code
Select next issue to work on using GitHub parent/blocked-by relationships
GitHub issue relationships → Selected issue
Configure per-issue coding agent, model, and reasoning effort via TUI
User selection in TUI → Issue-specific agent configuration
Loop through all sub-issues of a PRD until fully resolved
PRD identifier → Completed PRD
Tags
Tech Stack
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.