--- /dev/null
+#!/bin/sh
+# Copyright (c) 2026 Jakub Czajka <jakub@ekhem.eu.org>
+# License: GPL-3.0 or later.
+#
+# ask-build-queue — Prompt the user to select Makefile targets and write a
+# per-session build queue file.
+
+# Don't prompt again if the queue is already populated.
+QUEUE_FILE="$CLAUDE_PROJECT_DIR/.claude/.build-queue.$CLAUDE_CODE_SESSION_ID"
+if [ -f "$QUEUE_FILE" ]; then
+ exit 0
+fi
+
+MAKEFILE="$CLAUDE_PROJECT_DIR/Makefile"
+
+# Print space-separated Makefile targets whose recipe mentions
+# guix reconfigure.
+build_targets() {
+ $GUIX_BIN/sed --regexp-extended --quiet \
+ '/^([a-zA-Z_-][a-zA-Z0-9_-]*):/h
+ /guix.*reconfigure/{g;s/^([a-zA-Z_-][a-zA-Z0-9_-]*):.*/\1/p}' \
+ "$1" | $GUIX_BIN/tr '\n' ' '
+}
+
+
+$GUIX_BIN/mkdir --parents "$CLAUDE_PROJECT_DIR/.claude"
+
+exec 1>&2
+echo "First, use AskUserQuestion (single-select) to ask whether to build at "
+echo "all. Options: [Build targets, Skip build]."
+echo ""
+echo "If Build, use AskUserQuestion (multiSelect, max 4) with these targets: "
+echo "$(build_targets "$MAKEFILE")."
+echo ""
+echo "Write selected targets to ${QUEUE_FILE} (one per line), then stop so the "
+echo "build begins."
+echo ""
+echo "If Skip: write an empty file (touch ${QUEUE_FILE})."
# └─ success ──► remove from queue ──► exit 2
# build next on re-stop
-# Print space-separated Makefile targets with guix reconfigure.
MAKEFILE="$CLAUDE_PROJECT_DIR/Makefile"
-build_targets() {
- $GUIX_BIN/sed --regexp-extended --quiet \
- '/^([a-zA-Z_-][a-zA-Z0-9_-]*):/h
- /guix.*reconfigure/{g;s/^([a-zA-Z_-][a-zA-Z0-9_-]*):.*/\1/p}' \
- "$1" | $GUIX_BIN/tr '\n' ' '
-}
if [ -z "$($HOME/.guix-home/profile/bin/git -C "$CLAUDE_PROJECT_DIR" \
status --porcelain --untracked-files=no)" ]; then
$GUIX_BIN/mkdir --parents "$CLAUDE_PROJECT_DIR/.claude"
QUEUE_FILE="$CLAUDE_PROJECT_DIR/.claude/.build-queue.$CLAUDE_CODE_SESSION_ID"
-# No queue file yet — ask the user which targets to build.
+# No queue file yet.
if [ ! -f "$QUEUE_FILE" ]; then
- exec 1>&2
- $GUIX_BIN/echo "First, use AskUserQuestion (single-select) to ask whether"
- $GUIX_BIN/echo "to build at all. Options: [Build targets, Skip build]."
- $GUIX_BIN/echo ""
- $GUIX_BIN/echo "If Build, use AskUserQuestion (multiSelect, max 4) with"
- $GUIX_BIN/echo "these targets: $(build_targets "$MAKEFILE")."
- $GUIX_BIN/echo ""
- $GUIX_BIN/echo "Write selected targets to ${QUEUE_FILE} (one per line),"
- $GUIX_BIN/echo "then stop so the build begins."
- $GUIX_BIN/echo ""
- $GUIX_BIN/echo "If Skip: write an empty file (touch ${QUEUE_FILE})."
+ "$CLAUDE_PROJECT_DIR/.claude/hooks/ask-build-queue"
exit 2
fi
- home-symlink-service-type (conf/home/symlink.scm) — symlinks files into the
home directory. Strips the first path component of each dotfile to derive its
$HOME-relative target.
+
+# Build Queue
+
+Populate the build queue early to avoid an extra dialog at Stop time. If the
+prompt looks like it will modify code (e.g. "add", "fix", "change", "implement",
+"refactor", "update", "create", "remove") and the build queue does not exist,
+run .claude/hooks/ask-build-queue to queue build targets before making changes.