junco · field spec · v0.4.0 · MIT
Markdown tickets in.
Pull requests out.
junco is a daemon on your machine that claims tickets from a folder — or GitHub issues you label — and drives a coding agent in an isolated git worktree until a draft pull request comes out.
npm install -g @ironforgesoftware/junco
MIT · runs entirely on your machine · bring your own inference endpoint
- designation
- harness-agnostic task-queue worker · local daemon
- input
- Markdown tickets (YAML frontmatter) · GitHub issues you label
- output
- draft pull requests · in-place answers · plan comments
- endpoint
- any OpenAI-compatible inference endpoint
- runtime
- Node ≥ 22.19 · git · gh
- records
- per-ticket JSONL transcripts · structured worker.log
How it works
-
Claim is one atomic rename —
inbox/toprocessing/— so two workers can never own the same ticket. - Four loop guards watch the agent's event stream; a supervisor nudges, escalates, then kills. A killed or timed-out run still gets its commits salvaged into a draft PR.
- junco runs the ticket's verification blocks in the worktree, then a critic reads the diff against the spec — a MISSING verdict buys exactly one corrective pass.
One ticket, end to end
$ junco submit fix-tide-rounding.mdsubmitted: ~/junco/inbox/fix-tide-rounding.md $ junco logs -f14:02:03 INFO worker online {"pid":51423}14:02:07 INFO claimed {"src":"inbox/fix-tide-rounding.md","dst":"processing/fix-tide-rounding.md"}14:14:41 INFO [fix-tide-rounding] spec verification: 2/2 checks passed14:14:58 INFO [fix-tide-rounding] critic: pass14:15:02 INFO [fix-tide-rounding] pushed junco/fix-tide-rounding (3 new commits)14:15:09 INFO [fix-tide-rounding] opened PR https://github.com/acme/reef-api/pull/5714:15:10 INFO [fix-tide-rounding] finalized (pr-flow) {"dst":"done/fix-tide-rounding.md","status":"completed"}14:15:11 INFO idle
The ticket
---
id: fix-tide-rounding
priority: normal
timeout_minutes: 30
repo: ~/code/reef-api
base_branch: main
pr_title: "fix: round tide heights to one decimal"
draft: true
---
# Round tide heights to one decimal
`TideTable.render()` prints raw floats. Round display values
to one decimal; leave the underlying data untouched.
## Steps
- [ ] Add `formatHeight()` in src/tideTable.ts; use it in `render()`.
- [ ] Commit: `git add -A && git commit -m "fix: round tide heights"`
## Verification
```bash
npm test
```
## Done when
- [ ] 1 commit on the branch; `npm test` green.
Without a repo: field this is a Q&A ticket — answered in place,
read-only, no git. junco schema prints the full frontmatter contract.
Capabilities
- Atomic claiming
- A ticket moves
inbox/ → processing/in one rename; ownership is never ambiguous. - Plans before code
- In GitHub mode the plan is an issue comment; nothing runs until a verified
junco:approvedlabel. - Supervised sessions
- Four loop guards on the event stream: nudge → escalate → kill. Every run leaves a JSONL transcript.
- Timeout salvage
- Commits made before the cutoff are pushed and opened as a draft PR instead of thrown away.
- Requeue with backoff
- Transient endpoint failures set
retry_countandnot_before, then return the ticket to the inbox. - Offline outbox
- Comments, labels, and PR pushes queue durably while GitHub is unreachable, then drain on reconnect.
- Local-first
- Your machine, your git, your
ghauth, any OpenAI-compatible inference endpoint. No third service. - A dashboard worth living in
- Repos, plans, approvals, queue, and open PRs in one fullscreen terminal UI with a command palette.
Sixty seconds to a running worker
Node ≥ 22.19, git, and an authenticated gh for PR flows.
npx @ironforgesoftware/junco # first run → setup wizard; afterwards → the daemon
junco submit my-task.md # a repo: field opens a PR; without one it answers in place
junco status # daemon · endpoint · queue at a glance
junco dashboard # or drive everything from the TUI
Contribute
junco is young, and the codebase is still small enough to hold in your head. ~1,100 tests run in a few seconds; ARCHITECTURE.md is accurate and maintained. For features, open an issue first — plans are cheap, rework isn't. junco dogfoods: it submits tickets against its own repository.
git clone https://github.com/ironforgesoftware/junco && cd junco
npm install && npm test # vitest, ~1,100 tests, a few seconds
Drop a ticket. Get a pull request.
npm install -g @ironforgesoftware/junco