+ #!/usr/bin/env bash
+
+ set -euo pipefail
+
+ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
+ PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)"
+ ANI_BIN="${PROJECT_ROOT}/ani"
+
+ TEMP_REPO=""
+ TEMP_RCFILE=""
+
+ usage() {
+ cat <<'EOF'
+ Create a disposable Pijul repo for manually testing `pijul:record-with-intent-tags`.
+
+ Usage:
+ scripts/pijul-record-with-intent-tags-test-helper
+
+ Behavior:
+ - Creates a temporary repo with a recorded baseline and pending changes.
+ - Opens an interactive shell inside that repo.
+ - Prints the exact command to run and the files/hunks worth selecting.
+ - Deletes the temporary repo automatically when you exit the shell.
+
+ Inside the test shell:
+ - Run `record_test` to execute the record-with-tags command against the temp repo.
+ - Run `end_test` or `exit` when you are done.
+ EOF
+ }
+
+ cleanup() {
+ local exit_code=$?
+
+ trap - EXIT INT TERM HUP
+
+ if [[ -n "${TEMP_RCFILE}" && -f "${TEMP_RCFILE}" ]]; then
+ rm -f "${TEMP_RCFILE}"
+ fi
+
+ if [[ -n "${TEMP_REPO}" && -d "${TEMP_REPO}" ]]; then
+ rm -rf "${TEMP_REPO}"
+ printf '\nCleaned up temporary repo: %s\n' "${TEMP_REPO}"
+ fi
+
+ exit "${exit_code}"
+ }
+
+ require_command() {
+ local command_name="$1"
+
+ if ! command -v "${command_name}" >/dev/null 2>&1; then
+ printf 'Missing required command: %s\n' "${command_name}" >&2
+ exit 1
+ fi
+ }
+
+ write_initial_files() {
+ cat > "${TEMP_REPO}/README.md" <<'EOF'
+ # Demo repo for ani
+
+ This repo exists only for testing `pijul:record-with-intent-tags`.
+
+ ## Quick notes
+
+ - Start with an initial recorded change.
+ - Add multiple unrecorded hunks afterward.
+ - Use the helper command to try selecting only part of the work.
+
+ ## Checklist
+
+ 1. Run the ani command.
+ 2. Pick a tag or skip it.
+ 3. Enter a message.
+ 4. Select only the README hunks.
+ EOF
+
+ cat > "${TEMP_REPO}/notes.txt" <<'EOF'
+ notes
+ - baseline entry
+ EOF
+ }
+
+ write_pending_changes() {
+ cat > "${TEMP_REPO}/README.md" <<'EOF'
+ # Demo repo for ani
+
+ This repo exists only for testing `pijul:record-with-intent-tags`.
+ Try recording only the README hunks first.
+
+ ## Quick notes
+
+ - Start with an initial recorded change.
+ - Add multiple unrecorded hunks afterward.
+ - Use the helper command to try selecting only part of the work.
+
+ ## Checklist
+
+ 1. Run the ani command.
+ 2. Pick a tag or skip it.
+ 3. Enter a message.
+ 4. Select only the README hunks.
+ 5. Confirm that `notes.txt` is still pending afterward.
+
+ ## Expected result
+
+ If you only record the README hunks, `pijul diff --short` should still show `M notes.txt`.
+ EOF
+
+ cat > "${TEMP_REPO}/notes.txt" <<'EOF'
+ notes
+ - baseline entry
+ - leave this file unselected during the first test run
+ EOF
+ }
+
+ create_temp_repo() {
+ TEMP_REPO="$(mktemp -d "${TMPDIR:-/tmp}/ani-pijul-record-test.XXXXXX")"
+
+ pijul init "${TEMP_REPO}" >/dev/null
+
+ write_initial_files
+
+ (
+ cd "${TEMP_REPO}"
+ pijul add README.md notes.txt >/dev/null
+ EDITOR=true pijul record -m 'feat(test-helper): seed demo repo' >/dev/null
+ )
+
+ write_pending_changes
+ }
+
+ create_rcfile() {
+ TEMP_RCFILE="$(mktemp "${TMPDIR:-/tmp}/ani-pijul-record-shell.XXXXXX")"
+
+ cat > "${TEMP_RCFILE}" <<'EOF'
+ record_test() {
+ "${ANI_RECORD_TEST_ANI}" pijul:record-with-intent-tags --repository "${PWD}" "$@"
+ }
+
+ end_test() {
+ exit
+ }
+
+ export PS1='(ani-record-test) \w $ '
+ EOF
+ }
+
+ print_instructions() {
+ cat <<EOF
+ Temporary repo ready:
+ ${TEMP_REPO}
+
+ Changed files waiting to be recorded:
+ - README.md (multiple hunks)
+ - notes.txt (leave this unselected on your first run)
+
+ Inside the shell, run:
+ record_test
+
+ Exact command:
+ ${ANI_BIN} pijul:record-with-intent-tags --repository "${TEMP_REPO}"
+
+ Suggested manual check:
+ 1. Run \`record_test\`.
+ 2. Enter any message you want.
+ 3. In the hunk picker, select only the README.md hunks.
+ 4. After it records, run: pijul diff --short
+ 5. You should still see: M notes.txt
+
+ When you are done, type \`end_test\` or just \`exit\`.
+ The helper will remove the temp repo automatically.
+ EOF
+ }
+
+ open_test_shell() {
+ (
+ cd "${TEMP_REPO}"
+ export ANI_RECORD_TEST_ANI="${ANI_BIN}"
+ export ANI_RECORD_TEST_REPO="${TEMP_REPO}"
+ bash --noprofile --rcfile "${TEMP_RCFILE}" -i
+ )
+ }
+
+ main() {
+ case "${1-}" in
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ "")
+ ;;
+ *)
+ printf 'Unexpected argument: %s\n\n' "${1}" >&2
+ usage >&2
+ exit 1
+ ;;
+ esac
+
+ require_command pijul
+ require_command bash
+
+ if [[ ! -x "${ANI_BIN}" ]]; then
+ printf 'Expected ani executable at %s\n' "${ANI_BIN}" >&2
+ exit 1
+ fi
+
+ trap cleanup EXIT INT TERM HUP
+
+ create_temp_repo
+ create_rcfile
+ print_instructions
+ open_test_shell
+ }
+
+ main "$@"