diff --git a/docs/superpowers/contracts/i3blocks-tutor-rename-2026-10-12.json b/docs/superpowers/contracts/i3blocks-tutor-rename-2026-10-12.json new file mode 100644 index 00000000..a0129571 --- /dev/null +++ b/docs/superpowers/contracts/i3blocks-tutor-rename-2026-10-12.json @@ -0,0 +1,14 @@ +{ + "title": "i3 bar: automation_tutor block renamed to tutor", + "objective": "The bar's tutor block reads ~/.local/share/tutor/ledger.json and a click runs ~/src/tutor/run.sh; the daily-limits renderers show the gear for earned_time 0.9.0's 'tutor' earner.", + "acceptance_criteria": [ + "test_i3blocks_tutor.sh passes (counts, hidden at 4/4, unreadable ledger, click)", + "test_i3blocks_gaming_budget.sh passes", + "~/.config/i3blocks/tutor.sh prints 'tutor n/4' from the live ledger at the new path" + ], + "out_of_scope": [ + "What the block counts (rows vs minutes) -- unchanged", + "The tutor itself (kuhyx/tutor)" + ], + "verifier": "bash linux_configuration/tests/test_i3blocks_tutor.sh; bash linux_configuration/tests/test_i3blocks_gaming_budget.sh" +} diff --git a/docs/superpowers/evidence/i3blocks-tutor-rename-2026-10-12.json b/docs/superpowers/evidence/i3blocks-tutor-rename-2026-10-12.json new file mode 100644 index 00000000..2753713d --- /dev/null +++ b/docs/superpowers/evidence/i3blocks-tutor-rename-2026-10-12.json @@ -0,0 +1,36 @@ +{ + "intent": "The automation tutor is now just Tutor (own repo ~/src/tutor, data ~/.local/share/tutor, earned_time 0.9.0 earner 'tutor'); the i3 bar follows the rename.", + "scope": [ + "linux_configuration/i3blocks/tutor.sh (was automation_tutor.sh), the [tutor] stanza in linux_configuration/i3blocks/config, linux_configuration/tests/test_i3blocks_tutor.sh", + "gaming_budget.sh and shutdown_countdown.sh icon maps: earner 'tutor' gets the same gear as 'automation'", + "Non-goal: no change to what the block counts (still today's credit rows / 4)" + ], + "changes": [ + "Ledger default ~/.local/share/tutor/ledger.json (override TUTOR_LEDGER); click runs ~/src/tutor/run.sh (override TUTOR_RUN)", + "Block and test renamed; ~/.config/i3blocks/tutor.sh symlink replaces automation_tutor.sh", + "tutor: \"⚙\" added beside automation in the two daily-limits renderers" + ], + "verification": [ + { + "command": "bash linux_configuration/tests/test_i3blocks_tutor.sh", + "result": "pass", + "evidence": "tutor block: all checks passed" + }, + { + "command": "bash linux_configuration/tests/test_i3blocks_gaming_budget.sh", + "result": "pass", + "evidence": "All gaming_budget checks passed." + }, + { + "command": "~/.config/i3blocks/tutor.sh", + "result": "pass", + "evidence": "⚙ tutor 0/4 (live ledger at the new path)" + } + ], + "risks": [ + "The i3blocks config is symlinked, so the [tutor] stanza is live on the next i3blocks reload; until then the old stanza points at a removed symlink" + ], + "rollback": [ + "git revert the commit and re-link ~/.config/i3blocks/automation_tutor.sh" + ] +} diff --git a/linux_configuration/i3blocks/config b/linux_configuration/i3blocks/config index 322d5fef..f330570f 100644 --- a/linux_configuration/i3blocks/config +++ b/linux_configuration/i3blocks/config @@ -63,8 +63,8 @@ interval=30 command=~/.config/i3blocks/book_guard.sh interval=30 -[automation_tutor] -command=~/.config/i3blocks/automation_tutor.sh +[tutor] +command=~/.config/i3blocks/tutor.sh interval=30 [issue_dashboard] diff --git a/linux_configuration/i3blocks/gaming_budget.sh b/linux_configuration/i3blocks/gaming_budget.sh index ac41f80c..a260059a 100755 --- a/linux_configuration/i3blocks/gaming_budget.sh +++ b/linux_configuration/i3blocks/gaming_budget.sh @@ -54,7 +54,7 @@ render_limits() { def hm: . as $m | "\($m / 60 | floor)h\($m % 60 | tostring | if length < 2 then "0" + . else . end)"; def bonus_hm: if . < 60 then "\(.)m" else hm | sub("h00$"; "h") end; - {workout: "💪", leetcode: "🧩", reading: "📖", anki: "🗂", automation: "⚙"} as $icon + {workout: "💪", leetcode: "🧩", reading: "📖", anki: "🗂", automation: "⚙", tutor: "⚙"} as $icon | .gaming as $g | ([.earners[] | select(.status != "done" and .gaming_minutes > 0) | "+\($icon[.name] // .label)\(if .status == "unknown" then "?" else "" end)\(.gaming_minutes | bonus_hm)"] diff --git a/linux_configuration/i3blocks/shutdown_countdown.sh b/linux_configuration/i3blocks/shutdown_countdown.sh index dd0d79de..2c27af07 100755 --- a/linux_configuration/i3blocks/shutdown_countdown.sh +++ b/linux_configuration/i3blocks/shutdown_countdown.sh @@ -179,7 +179,7 @@ render_limits() { def bonus_hm: . as $m | if $m < 60 then "\($m)m" else "\($m / 60 | floor)h" + ($m % 60 | if . == 0 then "" else "\(.)" | if length < 2 then "0" + . else . end end) end; - {workout: "💪", leetcode: "🧩", reading: "📖", anki: "🗂", automation: "⚙"} as $icon + {workout: "💪", leetcode: "🧩", reading: "📖", anki: "🗂", automation: "⚙", tutor: "⚙"} as $icon | (.earners | map({(.name): .}) | add // {}) as $by | (.shutdown.applied // .shutdown.resolved) as $time | (.shutdown.ceiling) as $ceiling diff --git a/linux_configuration/i3blocks/automation_tutor.sh b/linux_configuration/i3blocks/tutor.sh similarity index 82% rename from linux_configuration/i3blocks/automation_tutor.sh rename to linux_configuration/i3blocks/tutor.sh index d85e7d11..5178ad3b 100755 --- a/linux_configuration/i3blocks/automation_tutor.sh +++ b/linux_configuration/i3blocks/tutor.sh @@ -1,9 +1,9 @@ #!/bin/bash # ============================================================================ -# Automation tutor status for i3blocks: today's credited 15-minute blocks. +# Tutor status for i3blocks: today's credited 15-minute blocks. # -# A click runs plc-lab's run.sh, which starts the tutor if it is down and +# A click runs ~/src/tutor/run.sh, which starts the tutor if it is down and # opens it in the browser -- nobody has to remember the port. Hidden once all # four blocks are in: nothing left to earn, nothing to click. # @@ -14,9 +14,9 @@ set -euo pipefail -readonly LEDGER="${AUTOMATION_TUTOR_LEDGER:-$HOME/.local/share/automation_tutor/ledger.json}" +readonly LEDGER="${TUTOR_LEDGER:-$HOME/.local/share/tutor/ledger.json}" # i3blocks' PATH has no ~/src: absolute path. -readonly RUN="${AUTOMATION_TUTOR_RUN:-$HOME/src/plc-lab/run.sh}" +readonly RUN="${TUTOR_RUN:-$HOME/src/tutor/run.sh}" readonly TARGET=4 readonly YELLOW='#F1FA8C' diff --git a/linux_configuration/tests/test_i3blocks_automation_tutor.sh b/linux_configuration/tests/test_i3blocks_tutor.sh similarity index 86% rename from linux_configuration/tests/test_i3blocks_automation_tutor.sh rename to linux_configuration/tests/test_i3blocks_tutor.sh index 36ff917c..666f7acf 100755 --- a/linux_configuration/tests/test_i3blocks_automation_tutor.sh +++ b/linux_configuration/tests/test_i3blocks_tutor.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Behaviour tests for the i3blocks automation_tutor block: today's credit +# Behaviour tests for the i3blocks tutor block: today's credit # count, the hidden 4/4 state, the unreadable-ledger warning and the click. # The ledger is a fixture and run.sh is a stub, so nothing reads the real # ledger and no tutor or browser is ever started. @@ -7,7 +7,7 @@ set -euo pipefail SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd) -BLOCK="$REPO_DIR/i3blocks/automation_tutor.sh" +BLOCK="$REPO_DIR/i3blocks/tutor.sh" TMP_DIR=$(mktemp -d) cleanup() { @@ -30,7 +30,7 @@ assert_eq() { } printf '{}' | jq -e . >/dev/null 2>&1 || - fail 'a working jq is required for the automation_tutor tests (pacman -S jq)' + fail 'a working jq is required for the tutor block tests (pacman -S jq)' BIN_DIR="$TMP_DIR/bin" mkdir -p "$BIN_DIR" @@ -57,7 +57,7 @@ ledger() { } run_block() { - AUTOMATION_TUTOR_LEDGER="$LEDGER" AUTOMATION_TUTOR_RUN="$BIN_DIR/run.sh" \ + TUTOR_LEDGER="$LEDGER" TUTOR_RUN="$BIN_DIR/run.sh" \ bash "$BLOCK" } @@ -65,7 +65,7 @@ line() { sed -n "${1}p" <<<"$2" } -printf 'Checking automation_tutor block states...\n' +printf 'Checking tutor block states...\n' rm -f "$LEDGER" out=$(run_block) @@ -103,4 +103,4 @@ for _ in 1 2 3 4 5 6 7 8 9 10; do done assert_eq 'clicked' "$(cat "$TMP_DIR/clicks" 2>/dev/null)" 'click runs run.sh' -printf 'automation_tutor block: all checks passed\n' +printf 'tutor block: all checks passed\n'