Recipes: check (lint+test+tape-test), lint, test, tape-test, record.
`just` with no args lists all recipes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resets the countdown for timer jobs and restarts the process for
service jobs. Disabled jobs are refused with a clear error message.
Accepts hex ID or name like all other management operations.
- restartJob() function with disabled-job guard
- getopts R:, manage_count, mutual-exclusion error messages updated
- 9 new tests in test.sh (112 total), 1 new tape command (24 total)
- README options table, names prose, and future-ideas checklist updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add -X <id|name> to stop, disable, and remove a job's unit files;
mutually exclusive with all other management options; 13 new tests
- Add demo/test-tapes.sh to verify all VHS tape commands run cleanly;
wired into pre-commit hook alongside test.sh (combined badge count)
- Rename demo job names to *_home variants to avoid clashing with real
user jobs; add per-tape preflight cleanup via -X
- Consolidate four demo GIFs into quickstart + all-features + editmode
screenshot; remove notifications/services tapes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extract printCrontabContent() shared by both -e and new -l, collecting
job data into arrays first so column widths can be computed for aligned
pipe separators. -l prints the same crontab format to stdout without
opening an editor, useful for scripting and quick inspection.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Document the new -s flag, add services demo GIF to the demo table,
add quick start and usage examples for persistent services, update
edit mode docs with the new:s syntax, and clarify how it works for
both timer and service job types.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Test cleanup now only removes jobs it created (tracked via
test_job_ids array) instead of nuking all systab_* units.
Fixes bug where running tests would delete real user jobs.
- Fix extract_id subshell issue: array appends in $() don't
propagate to parent, so use _extracted_id variable instead.
- Merge disable_job_by_id/enable_job_by_id into toggle_job_by_id.
- Update usage text: -D/-E/-L/-S now show <id|name> consistently.
- Fix pre-commit hook sed regex that only captured last digit of
multi-digit numbers; replaced with grep -oP.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract build_job_list helper (shared by show_status/list_logs)
- clean_jobs now calls remove_job instead of inline stop/disable/rm
- Extract status preamble in write_notify_lines (icon_pre/status_pre)
- Replace fragile list-timers tail/awk with systemctl show properties
- Combine consecutive sed -i calls into single invocations
- Simplify is_manage_mode check to use existing manage_count
- Make -o accept optional line count arg (-o 20 or just -o for default 10)
- Fix %%s escaping in unit files and document in CLAUDE.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fetches the last N lines of journal output (default 10) via
journalctl and includes them in desktop/email notification bodies.
Supports CLI (-o 5) and edit mode (o or o=5 flag syntax).
Also fixes systemd %s specifier expansion in email printf format
strings (must use %%s so systemd passes %s through to the shell).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Notifications now use ExecStopPost (fires on success and failure) with
status-aware icons/messages instead of ExecStartPost (success only).
Desktop uses dialog-information/dialog-error, email uses sendmail.
Flags (i, e=addr) are persisted as # SYSTAB_FLAGS= comments in service
files and exposed in edit mode via ID:flags syntax. Edit mode validates
schedules before applying (re-edit loop like crontab -e). -S and -L
accept an optional job ID to filter to a single job. Extract trim()
helper to replace inline whitespace-stripping idiom.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>