lab: Manual AFK run via the per-project ⋯ menu #62

Closed
opened 2026-06-01 12:22:10 +02:00 by dominik.polakovics · 2 comments

Parent

#61

What to build

The end-to-end tracer for AFK runs. Add a per-project context menu (native inline <details>) whose first item is Start AFK run. On click, lab claims the lowest open ready-for-agent issue from the project's own tracker and launches a seeded claude --remote-control session that resolves it in an isolated worktree and opens a PR. The run appears in the existing instances list badged AFK #N with its deep link; manual Stop ends it. No auto-reaping and no automatic launching yet — those are Slices 2 and 3.

Acceptance criteria

  • A button on each project card opens an inline native <details> menu — works with JS disabled, mobile-first (~44px target, single column).
  • The keyed-DOM morph preserves the menu's open state across background refreshes (add open to the client-owned attribute skip-list alongside value/checked/selected); verified with the ephemeral-jsdom oracle.
  • Forgejo detection: on a project whose origin is under git.cloonar.com the menu shows Start AFK run; on a non-Forgejo project it shows a disabled "needs a git.cloonar.com repo" line. Detection is cached per project path.
  • Clicking Start AFK run picks the lowest open ready-for-agent issue via tea, flips its label ready-for-agent → in-progress (creating the in-progress label once if missing), and rolls the flip back if the spawn then fails.
  • If no ready-for-agent issue exists, the action no-ops with a flash ("no ready-for-agent issues") and spawns nothing.
  • lab creates a git worktree at ~/.local/state/lab/worktrees/<project>~<N> on a new branch afk/<N> (root is outside the ~/projects/ scan root, so the scanner never lists it).
  • lab spawns claude --remote-control <project>~<slot>~afk-<N> --permission-mode auto --effort max \"<seed prompt with N>\" in that worktree; the deep link is captured exactly like an ordinary instance.
  • The run renders in the project's instances list badged AFK #N, with Open (deep link) and Stop.
  • Stopping the run removes its worktree; the afk/<N> branch and any pushed commits survive.
  • The lab systemd service has git and tea on its PATH (hosts/fw/vms/dev/modules/lab/default.nix).
  • The seed prompt matches ADR-0007 (read the issue, stay on afk/<N>, implement, verify, commit, push, open a PR with Closes #N).
  • Go unit tests cover the new pure logic (issue pick, the afk-<N> session-name encoding/parse, Forgejo detection).
  • Verified on a real Forgejo repo: click → an agent resolves a ready-for-agent issue and opens a PR with Closes #N; checked on a narrow screen.

Blocked by

None - can start immediately.

## Parent #61 ## What to build The end-to-end tracer for AFK runs. Add a per-project `⋯` context menu (native inline `<details>`) whose first item is **Start AFK run**. On click, `lab` claims the lowest open `ready-for-agent` issue from the project's own tracker and launches a seeded `claude --remote-control` session that resolves it in an isolated worktree and opens a PR. The run appears in the existing instances list badged `AFK #N` with its deep link; manual **Stop** ends it. No auto-reaping and no automatic launching yet — those are Slices 2 and 3. ## Acceptance criteria - [ ] A `⋯` button on each project card opens an inline native `<details>` menu — works with JS disabled, mobile-first (~44px target, single column). - [ ] The keyed-DOM morph preserves the menu's `open` state across background refreshes (add `open` to the client-owned attribute skip-list alongside `value/checked/selected`); verified with the ephemeral-jsdom oracle. - [ ] Forgejo detection: on a project whose `origin` is under `git.cloonar.com` the menu shows **Start AFK run**; on a non-Forgejo project it shows a disabled "needs a git.cloonar.com repo" line. Detection is cached per project path. - [ ] Clicking Start AFK run picks the lowest open `ready-for-agent` issue via `tea`, flips its label `ready-for-agent → in-progress` (creating the `in-progress` label once if missing), and rolls the flip back if the spawn then fails. - [ ] If no `ready-for-agent` issue exists, the action no-ops with a flash ("no ready-for-agent issues") and spawns nothing. - [ ] `lab` creates a git worktree at `~/.local/state/lab/worktrees/<project>~<N>` on a new branch `afk/<N>` (root is outside the `~/projects/` scan root, so the scanner never lists it). - [ ] `lab` spawns `claude --remote-control <project>~<slot>~afk-<N> --permission-mode auto --effort max \"<seed prompt with N>\"` in that worktree; the deep link is captured exactly like an ordinary instance. - [ ] The run renders in the project's instances list badged `AFK #N`, with Open (deep link) and Stop. - [ ] Stopping the run removes its worktree; the `afk/<N>` branch and any pushed commits survive. - [ ] The `lab` systemd service has `git` and `tea` on its PATH (`hosts/fw/vms/dev/modules/lab/default.nix`). - [ ] The seed prompt matches ADR-0007 (read the issue, stay on `afk/<N>`, implement, verify, commit, push, open a PR with `Closes #N`). - [ ] Go unit tests cover the new pure logic (issue pick, the `afk-<N>` session-name encoding/parse, Forgejo detection). - [ ] Verified on a real Forgejo repo: click → an agent resolves a `ready-for-agent` issue and opens a PR with `Closes #N`; checked on a narrow screen. ## Blocked by None - can start immediately.
Author
Owner

Note: the "Stopping the run removes its worktree" criterion is an interim simplification for this tracer. Slice 2 (#63) sets the final semantics — a user-initiated Stop keeps the worktree and leaves the issue in in-progress for manual requeue; only a confirmed-success reap deletes the worktree.

Note: the "Stopping the run removes its worktree" criterion is an interim simplification for this tracer. Slice 2 (#63) sets the final semantics — a user-initiated Stop keeps the worktree and leaves the issue in `in-progress` for manual requeue; only a confirmed-success reap deletes the worktree.
Author
Owner

This was generated by AI during triage.

Agent Brief

Category: enhancement

Summary: Build the end-to-end tracer for AFK runs — a per-project ⋯ menu whose Start AFK run action claims the lowest open ready-for-agent issue from the project's own Forgejo tracker and launches a seeded claude --remote-control session that resolves it in an isolated git worktree and opens a PR. Manual Stop only; no auto-reaping or automatic launching (those are #63/#64).

Read ADR-0007 (docs/adr/0007-lab-drives-afk-runs.md) and the AFK run / Instance (lab) glossary entries in CONTEXT.md first — they are the locked design this brief implements. The code is the lab Go service (the dev-microvm session launcher).

Current behavior:
lab lists git projects under the projects root and runs one or more claude --remote-control tmux sessions per project, each shown as an instance row with Open (deep link) and Stop. Sessions are spawned through a tmux wrapper (Sessions, exposing Start/StartCommand(name, dir, argv)/Stop/CaptureURL); the base spawn argv is claude --remote-control <name> --permission-mode auto --effort max — note the AFK-run flags already match the ordinary-instance default. Session identity is encoded by composeSessionName/parseSessionName over an instanceID{Project, Slot, Label}; a labelled instance takes slot ≥2, and sanitizeLabel restricts a label to [A-Za-z0-9._-]. Per-spawn workspace trust is seeded via SeedTrust. The UI is a server-rendered page progressively enhanced by an inline keyed-DOM morph; client-owned input state survives a background poll because the morph's attribute patcher skips value/checked/selected. Project discovery (Scan/hasGitMarker) treats any directory with a .git child — directory or file — as a project. There is currently no notion of AFK runs, worktrees, Forgejo detection, or tea/git shellouts.

Desired behavior (all additive — ordinary human-driven instances are unchanged):

  1. ⋯ menu. Each project card gains a ⋯ control that opens an inline native <details>/<summary> menu — functional with JS disabled, mobile-first (single column, ~44px targets). Its first item is Start AFK run.
  2. Open-state survives polling. The menu's open state must persist across background fragment refreshes. Add the <details> open attribute to the morph's client-owned attribute skip-list — in both the copy pass and the removal pass, exactly as value/checked/selected are handled. Verify with the ephemeral-jsdom oracle (per ADR-0004 there is no committed JS harness: drive a throwaway jsdom in /tmp, asserting with isEqualNode plus an identity oracle).
  3. Forgejo detection (cached per project path). A project whose origin remote is hosted on git.cloonar.com is Forgejo-backed → the menu shows an enabled Start AFK run; any other project shows a disabled "needs a git.cloonar.com repo" line. Detection also yields the owner/repo used to target tea. Cache the result in-memory per project path (remotes don't change within a process lifetime; a restart re-derives cheaply).
  4. Claim. Clicking Start AFK run queries the project's own tracker for the lowest-numbered open ready-for-agent issue, then claims it by flipping its label ready-for-agent → in-progress (creating the in-progress label on that repo once if it is missing). tea must be scoped to the target repo — e.g. by running it with the project directory as its working directory, which is how tea resolves the active repo. If the spawn then fails, roll the label flip back.
  5. Empty queue is a no-op. If no open ready-for-agent issue exists, spawn nothing and surface a brief, specific notice ("no ready-for-agent issues"), distinct from the generic action-error flash.
  6. Isolated worktree. Create a git worktree at <state>/lab/worktrees/<project>~<N> (where <state> is lab's per-user state dir, i.e. under ~/.local/state) on a new branch afk/<N>, N being the claimed issue number. Base the branch on the freshly-fetched default branch (git fetch, then fork from origin/<default>), not the main checkout's current HEAD. The worktrees root is deliberately outside the projects scan root, so Scan never lists a worktree as a bogus project (a worktree carries a .git file, which hasGitMarker matches).
  7. Spawn. Launch a claude --remote-control session in that worktree by reusing the existing tmux-spawn path (Sessions.StartCommand) with the base argv plus the seed prompt appended as the trailing argument. Encode the run as a labelled instance carrying afk-<N> (session name <project>~<slot>~afk-<N>), so the existing name parser recovers the issue number. Seed trust on the worktree dir before spawning (as ordinary starts do). Capture the claude.ai deep link exactly like an ordinary instance.
  8. Seed prompt. The prompt must direct the agent to: read issue #N on the project's own tracker; stay on branch afk/<N>; implement the change; verify it the way the project expects (run its tests/build/linters if present); commit; push; and open a PR against the project's default branch with a conventional-commit-style title and Closes #N in the body. Exact wording is yours; those are the required elements (per ADR-0007).
  9. Render. The run appears in the project's instances list badged AFK #N, with its Open (deep link) and a Stop button.
  10. Stop (interim Slice-1 semantics). Stopping an AFK run kills its session and removes its worktree; the afk/<N> branch and any pushed commits survive. (The final semantics — Stop keeps the worktree and parks the issue in in-progress for requeue — are #63's job; do not implement them here.)
  11. Service PATH. The lab systemd unit must have git and tea on its PATH (add pkgs.git and pkgs.tea to the service path).

Key interfaces:

  • Sessions — reuse StartCommand(name, dir, argv) for the AFK spawn (argv = base spawn argv with the seed prompt appended; the %s→name substitution it already performs still applies). No change to the tmux wrapper itself is expected.
  • Session-name scheme (composeSessionName/parseSessionName/instanceID) — encode the run as a labelled instance with Label = afk-<N>. Add a small pure helper that recognises an afk-<N> label and extracts N; unit-test it.
  • A new seam for tea and git — wrap the tea calls (list issues, add/remove label, create label) and the git fetch/git worktree calls behind small interfaces, mirroring how Sessions wraps tmux and Auth wraps claude auth. This keeps the selection/claim decision logic testable with a fake; the real shellouts are exercised only in live verification.
  • Forgejo detection — a pure function from a project's origin URL to (isForgejo, owner, repo); unit-test against git.cloonar.com and non-Forgejo origins.
  • Page model + live template — the instance view needs enough to render an AFK #N badge (derive it from the afk-<N> label, or carry an explicit flag/issue field). The card template gains the ⋯ <details> menu with the conditional Start-AFK-run / disabled line.
  • HTTP routes — a new POST action for starting an AFK run, mirroring the existing start/stop mux entries and the ok/fail fetch-vs-redirect convention. The existing per-instance Stop handler must additionally remove the worktree when the stopped session is an AFK run (detected from its afk-<N> label).
  • SeedTrust — call on the worktree dir before the spawn.
  • Service module (the lab NixOS unit, default.nix) — add pkgs.git and pkgs.tea to the unit path.
  • No new persisted Store fields are required for this slice: the run's issue number lives in the session name, and Forgejo detection is in-memory. autoEnabled/consecutiveFailures belong to later slices.

Acceptance criteria:

  • A ⋯ control on each project card opens an inline native <details> menu; functional with JS disabled; mobile-first (~44px targets, single column).
  • The menu's open state survives a background fragment refresh (the morph preserves the <details> open attribute); demonstrated via the ephemeral-jsdom oracle.
  • On a git.cloonar.com project the menu shows enabled Start AFK run; on any other project it shows a disabled "needs a git.cloonar.com repo" line; detection is cached per project path.
  • Start AFK run picks the lowest open ready-for-agent issue, flips its label ready-for-agent → in-progress (creating in-progress once if missing), and rolls the flip back if the spawn fails.
  • With no open ready-for-agent issue, the action spawns nothing and shows a specific "no ready-for-agent issues" notice.
  • A git worktree is created at <state>/lab/worktrees/<project>~<N> on branch afk/<N> forked from the freshly-fetched default branch; the worktrees root is outside the scan root and never appears as a project card.
  • The run spawns claude --remote-control (base argv + seed prompt) in the worktree, with the issue number encoded in the session name; the deep link is captured like an ordinary instance; trust is seeded on the worktree dir.
  • The seed prompt contains all required elements (read issue N, stay on afk/<N>, implement, verify, commit, push, open a PR with Closes #N).
  • The run renders badged AFK #N with Open and Stop.
  • Stopping the run removes its worktree; the afk/<N> branch and pushed commits survive. (Interim — see #63.)
  • The lab systemd unit has git and tea on its PATH.
  • Go unit tests cover the pure logic: lowest-issue selection, afk-<N> encode/parse, and Forgejo-origin detection. (Note: the repo pre-commit hook is eval-only and does NOT run Go tests — run go test ./... in the module locally.)

Out of scope (later slices / human steps):

  • Auto-reaping on PR-detected, and failure on session-death/timeout → #63 (this slice's Stop is manual and removes the worktree).
  • Final Stop semantics (keep the worktree, leave the issue in-progress for requeue) → #63.
  • Automatic launching, the per-project toggle, and the scheduler goroutine → #64.
  • Safety cap / 3-consecutive-failure pause / UI reset, and persisting autoEnabled/consecutiveFailures#65.
  • The "(N ready)" count hint → #66.
  • Live end-to-end verification (deploy to dev, click → watch a real autonomous PR appear with Closes #N, narrow-screen check) and the one-time tea login add on dev are dominik's post-merge acceptance steps — the agent cannot deploy. Deliver the code, the Go unit tests, and the jsdom-oracle check on a branch with a PR, and stop there.
> *This was generated by AI during triage.* ## Agent Brief **Category:** enhancement **Summary:** Build the end-to-end tracer for AFK runs — a per-project ⋯ menu whose **Start AFK run** action claims the lowest open `ready-for-agent` issue from the project's *own* Forgejo tracker and launches a seeded `claude --remote-control` session that resolves it in an isolated git worktree and opens a PR. Manual Stop only; no auto-reaping or automatic launching (those are #63/#64). Read **ADR-0007** (`docs/adr/0007-lab-drives-afk-runs.md`) and the **AFK run** / **Instance (lab)** glossary entries in `CONTEXT.md` first — they are the locked design this brief implements. The code is the `lab` Go service (the dev-microvm session launcher). **Current behavior:** `lab` lists git projects under the projects root and runs one or more `claude --remote-control` tmux sessions per project, each shown as an instance row with Open (deep link) and Stop. Sessions are spawned through a tmux wrapper (`Sessions`, exposing `Start`/`StartCommand(name, dir, argv)`/`Stop`/`CaptureURL`); the base spawn argv is `claude --remote-control <name> --permission-mode auto --effort max` — note the AFK-run flags already match the ordinary-instance default. Session identity is encoded by `composeSessionName`/`parseSessionName` over an `instanceID{Project, Slot, Label}`; a labelled instance takes slot ≥2, and `sanitizeLabel` restricts a label to `[A-Za-z0-9._-]`. Per-spawn workspace trust is seeded via `SeedTrust`. The UI is a server-rendered page progressively enhanced by an inline keyed-DOM morph; client-owned input state survives a background poll because the morph's attribute patcher skips `value`/`checked`/`selected`. Project discovery (`Scan`/`hasGitMarker`) treats any directory with a `.git` child — directory *or* file — as a project. There is currently no notion of AFK runs, worktrees, Forgejo detection, or `tea`/`git` shellouts. **Desired behavior** (all additive — ordinary human-driven instances are unchanged): 1. **⋯ menu.** Each project card gains a ⋯ control that opens an inline native `<details>`/`<summary>` menu — functional with JS disabled, mobile-first (single column, ~44px targets). Its first item is **Start AFK run**. 2. **Open-state survives polling.** The menu's open state must persist across background fragment refreshes. Add the `<details>` `open` attribute to the morph's client-owned attribute skip-list — in **both** the copy pass and the removal pass, exactly as `value`/`checked`/`selected` are handled. Verify with the ephemeral-jsdom oracle (per ADR-0004 there is no committed JS harness: drive a throwaway jsdom in /tmp, asserting with `isEqualNode` plus an identity oracle). 3. **Forgejo detection (cached per project path).** A project whose `origin` remote is hosted on `git.cloonar.com` is Forgejo-backed → the menu shows an enabled **Start AFK run**; any other project shows a disabled "needs a git.cloonar.com repo" line. Detection also yields the `owner/repo` used to target `tea`. Cache the result in-memory per project path (remotes don't change within a process lifetime; a restart re-derives cheaply). 4. **Claim.** Clicking **Start AFK run** queries the project's own tracker for the lowest-numbered open `ready-for-agent` issue, then claims it by flipping its label `ready-for-agent → in-progress` (creating the `in-progress` label on that repo once if it is missing). `tea` must be scoped to the *target* repo — e.g. by running it with the project directory as its working directory, which is how `tea` resolves the active repo. If the spawn then fails, roll the label flip back. 5. **Empty queue is a no-op.** If no open `ready-for-agent` issue exists, spawn nothing and surface a brief, specific notice ("no ready-for-agent issues"), distinct from the generic action-error flash. 6. **Isolated worktree.** Create a `git worktree` at `<state>/lab/worktrees/<project>~<N>` (where `<state>` is lab's per-user state dir, i.e. under `~/.local/state`) on a new branch `afk/<N>`, N being the claimed issue number. Base the branch on the freshly-fetched default branch (`git fetch`, then fork from `origin/<default>`), **not** the main checkout's current HEAD. The worktrees root is deliberately **outside** the projects scan root, so `Scan` never lists a worktree as a bogus project (a worktree carries a `.git` *file*, which `hasGitMarker` matches). 7. **Spawn.** Launch a `claude --remote-control` session in that worktree by reusing the existing tmux-spawn path (`Sessions.StartCommand`) with the base argv plus the seed prompt appended as the trailing argument. Encode the run as a labelled instance carrying `afk-<N>` (session name `<project>~<slot>~afk-<N>`), so the existing name parser recovers the issue number. Seed trust on the worktree dir before spawning (as ordinary starts do). Capture the claude.ai deep link exactly like an ordinary instance. 8. **Seed prompt.** The prompt must direct the agent to: read issue #N on the project's own tracker; stay on branch `afk/<N>`; implement the change; verify it the way the project expects (run its tests/build/linters if present); commit; push; and open a PR against the project's default branch with a conventional-commit-style title and `Closes #N` in the body. Exact wording is yours; those are the required elements (per ADR-0007). 9. **Render.** The run appears in the project's instances list badged **AFK #N**, with its Open (deep link) and a Stop button. 10. **Stop (interim Slice-1 semantics).** Stopping an AFK run kills its session and removes its worktree; the `afk/<N>` branch and any pushed commits survive. *(The final semantics — Stop keeps the worktree and parks the issue in `in-progress` for requeue — are #63's job; do not implement them here.)* 11. **Service PATH.** The `lab` systemd unit must have `git` and `tea` on its PATH (add `pkgs.git` and `pkgs.tea` to the service `path`). **Key interfaces:** - **`Sessions`** — reuse `StartCommand(name, dir, argv)` for the AFK spawn (argv = base spawn argv with the seed prompt appended; the `%s`→name substitution it already performs still applies). No change to the tmux wrapper itself is expected. - **Session-name scheme** (`composeSessionName`/`parseSessionName`/`instanceID`) — encode the run as a labelled instance with `Label = afk-<N>`. Add a small **pure** helper that recognises an `afk-<N>` label and extracts N; unit-test it. - **A new seam for `tea` and `git`** — wrap the `tea` calls (list issues, add/remove label, create label) and the `git fetch`/`git worktree` calls behind small interfaces, mirroring how `Sessions` wraps tmux and `Auth` wraps `claude auth`. This keeps the selection/claim decision logic testable with a fake; the real shellouts are exercised only in live verification. - **Forgejo detection** — a pure function from a project's `origin` URL to `(isForgejo, owner, repo)`; unit-test against `git.cloonar.com` and non-Forgejo origins. - **Page model + `live` template** — the instance view needs enough to render an **AFK #N** badge (derive it from the `afk-<N>` label, or carry an explicit flag/issue field). The card template gains the ⋯ `<details>` menu with the conditional Start-AFK-run / disabled line. - **HTTP routes** — a new POST action for starting an AFK run, mirroring the existing start/stop mux entries and the `ok`/`fail` fetch-vs-redirect convention. The existing per-instance Stop handler must additionally remove the worktree when the stopped session is an AFK run (detected from its `afk-<N>` label). - **`SeedTrust`** — call on the worktree dir before the spawn. - **Service module** (the `lab` NixOS unit, `default.nix`) — add `pkgs.git` and `pkgs.tea` to the unit `path`. - No new *persisted* `Store` fields are required for this slice: the run's issue number lives in the session name, and Forgejo detection is in-memory. `autoEnabled`/`consecutiveFailures` belong to later slices. **Acceptance criteria:** - [ ] A ⋯ control on each project card opens an inline native `<details>` menu; functional with JS disabled; mobile-first (~44px targets, single column). - [ ] The menu's open state survives a background fragment refresh (the morph preserves the `<details>` `open` attribute); demonstrated via the ephemeral-jsdom oracle. - [ ] On a `git.cloonar.com` project the menu shows enabled **Start AFK run**; on any other project it shows a disabled "needs a git.cloonar.com repo" line; detection is cached per project path. - [ ] **Start AFK run** picks the lowest open `ready-for-agent` issue, flips its label `ready-for-agent → in-progress` (creating `in-progress` once if missing), and rolls the flip back if the spawn fails. - [ ] With no open `ready-for-agent` issue, the action spawns nothing and shows a specific "no ready-for-agent issues" notice. - [ ] A `git worktree` is created at `<state>/lab/worktrees/<project>~<N>` on branch `afk/<N>` forked from the freshly-fetched default branch; the worktrees root is outside the scan root and never appears as a project card. - [ ] The run spawns `claude --remote-control` (base argv + seed prompt) in the worktree, with the issue number encoded in the session name; the deep link is captured like an ordinary instance; trust is seeded on the worktree dir. - [ ] The seed prompt contains all required elements (read issue N, stay on `afk/<N>`, implement, verify, commit, push, open a PR with `Closes #N`). - [ ] The run renders badged **AFK #N** with Open and Stop. - [ ] Stopping the run removes its worktree; the `afk/<N>` branch and pushed commits survive. *(Interim — see #63.)* - [ ] The `lab` systemd unit has `git` and `tea` on its PATH. - [ ] Go unit tests cover the pure logic: lowest-issue selection, `afk-<N>` encode/parse, and Forgejo-origin detection. *(Note: the repo pre-commit hook is eval-only and does NOT run Go tests — run `go test ./...` in the module locally.)* **Out of scope (later slices / human steps):** - Auto-reaping on PR-detected, and failure on session-death/timeout → **#63** (this slice's Stop is manual and removes the worktree). - Final Stop semantics (keep the worktree, leave the issue `in-progress` for requeue) → **#63**. - Automatic launching, the per-project toggle, and the scheduler goroutine → **#64**. - Safety cap / 3-consecutive-failure pause / UI reset, and persisting `autoEnabled`/`consecutiveFailures` → **#65**. - The "(N ready)" count hint → **#66**. - **Live end-to-end verification** (deploy to dev, click → watch a real autonomous PR appear with `Closes #N`, narrow-screen check) and the **one-time `tea login add` on dev** are **dominik's** post-merge acceptance steps — the agent cannot deploy. Deliver the code, the Go unit tests, and the jsdom-oracle check on a branch with a PR, and stop there.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Cloonar/nixos#62
No description provided.