summaryrefslogtreecommitdiff
path: root/AGENTS.md
AgeCommit message (Collapse)Author
2026-10-01bin/wispr-keys: Flow dictation on the Caps Lock keyIgor Soarez
Push to talk on F20, Command Mode on Ctrl+F20, written into Flow's config.json because its settings screen refuses F20 without a modifier while its key listener accepts it. The key codes and action names come from reading Flow 1.6.1021's app.asar: shortcuts are keyed by macOS key codes string-sorted and joined with "+", f20 is 90, ctrl is 59, ptt is Push to talk and lens is Command Mode. splitKeybinds is kept in step so Flow cannot read back a disagreeing pair. A bin/ tool rather than a link/ part, though it was proposed as one. It has to quit and restart Flow for an edit to stick, and link.sh runs unattended after every sync: a part that can kill a dictation mid-sentence is a poor trade for a binding that can wait until someone asks for it. On demand it is also free to fail loudly, since nothing else's run depends on it. Flow ignores an AppleScript quit, so it gets a TERM; and it is launched by bundle id, because the bundle contains a second app also called "Wispr Flow" -- its Swift helper -- that `open -a` can start instead, which exits at once. The file as first found is kept as config.json.pre-wispr-keys.
2026-10-01hammerspoon: Caps Lock sends F20, and stays that wayIgor Soarez
hidutil remaps inside the IOKit HID driver, below the window server, so the key stops being Caps Lock before anything above the driver sees it: no toggle to suppress, and F20 is a real key to other apps, to System Settings shortcuts, to a password field. An eventtap cannot do this -- Caps Lock is not reachable from there, which is why hs.hid exists as its own IOKit module. What hidutil will not do is cover a keyboard attached after it ran, so dotlib re-applies on USB attach, on wake, and on a Caps Lock event. That last one is the general answer: a mapped keyboard cannot produce a Caps Lock event, so an event arriving at all is proof of a keyboard the remap missed, and the fault triggers its own repair. The watchers are there to get the common cases before a key is pressed, since the repairing press is spent repairing. No launchd job and no link/ part. The remap lives and dies with Hammerspoon, which already owns the keyboard on these machines, and a plist would only have bought independence from it for the second or two before it starts -- a user agent does not run at the login window either. Nothing is bound to f20 here; bind it like any other key. A machine gives the key back with capslock_off() from its local.lua, which loads last: shadowing cannot undo a side effect that has already run. hs.ipc is required so capslock_status() answers from a shell.
2026-09-28AGENTS.md is the file; CLAUDE.md imports itIgor Soarez
Every agent here except Claude Code reads AGENTS.md -- pi, codex, and aider now that its read: says so. The vendor-neutral name was the symlink and the Claude-specific one the real file, with a header saying the file was guidance "to Claude Code". Swapped, keeping history on the real file through git mv. Claude Code has read AGENTS.md directly since v2.1.277 and the machine this was done on is newer, so the obvious move was to delete CLAUDE.md. Checking the other machines first was worth it: four were on versions between 2.1.158 and 2.1.263, and a session on any of them would have found no instructions at all. So CLAUDE.md stays as one line, `@AGENTS.md`, which the documentation endorses for exactly this case and which -- unlike the symlink it replaces -- works on Windows and does not trip Claude Code's refusal to write through a symlink. The header says to delete it once every machine is current.
2026-09-22tree-sitter-cli, and: a read-only clone hands back a change requestIgor Soarez
An https clone of this repo cannot push -- the host serves it anonymously and refuses the push with a 403 -- and that is how a machine whose owner cannot hold a key gets it. An agent troubleshooting there would edit a tracked file, see the fix applied, and lose it at the next pull, or leave that clone unable to fast-forward and quietly cut off from changes. CLAUDE.md now says how to tell the two cases apart, and what to do instead: make it machine-local where a hook covers it, or hand back a change request -- paths, the actual diff, why, and how to verify -- stating that nothing was applied. AGENTS.md is a symlink to CLAUDE.md, so the agents that look for that name get the same file rather than a second copy to drift. tree-sitter-cli: nvim-treesitter generates and compiles its parsers with it.