feat(@scripts): ✨ add voice toggle command
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
fedabb0924
commit
45daeb61ba
2 changed files with 64 additions and 0 deletions
48
bin/rclaude
48
bin/rclaude
|
|
@ -1026,6 +1026,53 @@ if [ "${RCLAUDE_LIB_ONLY:-0}" = "1" ]; then
|
|||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
|
||||
cmd_voice() {
|
||||
# `rclaude voice` — toggle / inspect the rvoice push-to-talk binding.
|
||||
# rvoice itself is a separate script (bin/rvoice) driven by Hammerspoon.
|
||||
# This subcommand just gates whether the Hammerspoon tap is active by
|
||||
# writing/removing a sentinel file the lua module checks at load.
|
||||
_flag=${XDG_STATE_HOME:-$HOME/.local/state}/rclaude/voice-disabled
|
||||
mkdir -p "$(dirname "$_flag")" 2>/dev/null
|
||||
_action=${1:-status}
|
||||
case $_action in
|
||||
on|enable)
|
||||
rm -f "$_flag"
|
||||
_reload_hammerspoon
|
||||
echo "rvoice: enabled (Right ⌥ = push-to-talk)" ;;
|
||||
off|disable)
|
||||
: > "$_flag"
|
||||
_reload_hammerspoon
|
||||
echo "rvoice: disabled (delete $_flag or 'rclaude voice on' to re-enable)" ;;
|
||||
status)
|
||||
if [ -f "$_flag" ]; then echo "rvoice: disabled"
|
||||
else echo "rvoice: enabled"; fi
|
||||
command -v rvoice >/dev/null 2>&1 \
|
||||
&& echo " rvoice binary: $(command -v rvoice)" \
|
||||
|| echo " rvoice binary: NOT INSTALLED" ;;
|
||||
test|target)
|
||||
command -v rvoice >/dev/null 2>&1 || { echo "rclaude: rvoice not on PATH" >&2; exit 1; }
|
||||
rvoice target ;;
|
||||
log)
|
||||
command -v rvoice >/dev/null 2>&1 && rvoice log ;;
|
||||
*)
|
||||
cat <<EOF
|
||||
usage: rclaude voice {on|off|status|target|log}
|
||||
|
||||
on/off toggle Hammerspoon push-to-talk binding
|
||||
status show whether voice is enabled
|
||||
target show what host/tmux session rvoice would inject into
|
||||
log tail the rvoice action log
|
||||
EOF
|
||||
exit 2 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Tell a running Hammerspoon to reload its config (so the voice on/off
|
||||
# sentinel takes effect immediately). No-op if Hammerspoon isn't running.
|
||||
_reload_hammerspoon() {
|
||||
osascript -e 'tell application "Hammerspoon" to reload config' 2>/dev/null || true
|
||||
}
|
||||
|
||||
cmd_setup() {
|
||||
# Args:
|
||||
# (none) → install on every host in scan_hosts
|
||||
|
|
@ -1051,6 +1098,7 @@ case ${1:-} in
|
|||
resume) shift; cmd_resume "$@"; exit ;;
|
||||
triage) shift; cmd_triage "$@"; exit ;;
|
||||
setup|install) shift; cmd_setup "$@"; exit ;;
|
||||
voice) shift; cmd_voice "$@"; exit ;;
|
||||
-v|--version) cmd_version; exit ;;
|
||||
-h|--help|help) cmd_help; exit ;;
|
||||
esac
|
||||
|
|
|
|||
|
|
@ -33,6 +33,22 @@ end
|
|||
local RVOICE = resolveRvoice()
|
||||
local holding = false
|
||||
|
||||
-- rvoice can be toggled off via `rclaude voice off`, which drops a sentinel
|
||||
-- file. If present at load time, skip starting the eventtap entirely so the
|
||||
-- Right-⌥ key behaves normally. `rclaude voice on` calls reloadConfig which
|
||||
-- re-runs this module.
|
||||
local DISABLE_FLAG = (os.getenv("XDG_STATE_HOME") or (os.getenv("HOME") .. "/.local/state"))
|
||||
.. "/rclaude/voice-disabled"
|
||||
local function isDisabled()
|
||||
local f = io.open(DISABLE_FLAG, "r")
|
||||
if f then f:close(); return true end
|
||||
return false
|
||||
end
|
||||
if isDisabled() then
|
||||
hs.alert.show("rvoice: disabled (rclaude voice on to re-enable)")
|
||||
return {}
|
||||
end
|
||||
|
||||
-- Run rvoice <cmd> in the background; capture stderr to the system log so
|
||||
-- failures are visible via Hammerspoon's console.
|
||||
local function run(cmd)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue