<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/githooks, branch main</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-08-26T18:21:30+00:00</updated>
<entry>
<title>chore(hooks): anchor the sk- secret pattern on a word boundary</title>
<updated>2026-08-26T18:21:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-08-26T18:21:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=adff1ee51c7fcb32872ce7b2f39ed35c1daa5ed0'/>
<id>urn:sha1:adff1ee51c7fcb32872ce7b2f39ed35c1daa5ed0</id>
<content type='text'>
Unanchored, sk- followed by twenty word characters matched inside any hyphenated identifier ending in sk- (task-, risk-, disk-), which blocked a commit on an assertion naming task-missing-last-reviewed. A real key always starts its token. This brings the hook back in line with the language bundle's copy.
</content>
</entry>
<entry>
<title>chore: sync Elisp pre-commit hook wording</title>
<updated>2026-07-25T15:39:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-25T15:39:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=d5b9b94da207f6e5cffb7a57606f4eadb4823023'/>
<id>urn:sha1:d5b9b94da207f6e5cffb7a57606f4eadb4823023</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(githooks): stop the secret scan passing when it read nothing</title>
<updated>2026-07-24T14:02:29+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-24T14:02:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=1b86dd5b738d9b0b272f0d01b8913b2ae8938e78'/>
<id>urn:sha1:1b86dd5b738d9b0b272f0d01b8913b2ae8938e78</id>
<content type='text'>
- The scan piped git diff into grep and swallowed failures with || true.
- grep exits 1 on no matches, which is normal, so the guard had to stay.
- But it also hid a git failure, leaving nothing to scan and reporting clean.
- Now the diff is read on its own and a git failure aborts the commit.
- The staged-file list feeding the paren check had the same hole.
- New bats tests drive a broken git and pin both paths.
</content>
</entry>
<entry>
<title>fix: correct four wrong behaviors and drop three dead code paths</title>
<updated>2026-07-24T13:46:04+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-24T13:46:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=d9ab1074991ee3c4c680024b14d6de0475560380'/>
<id>urn:sha1:d9ab1074991ee3c4c680024b14d6de0475560380</id>
<content type='text'>
- yt-dlp downloads claimed completion when tsp had merely queued them.
- A fresh machine opened org links in EWW, not Chrome.
- ArchWiki search raised a raw error instead of the install hint.
- The pre-commit hook kept running when its cd failed.
- Removed a second device-grouping implementation nothing called.
- Removed a redundant epub advice that ran on every file visit.
- Removed a buffer-burying clause naming a mode Emacs doesn't define.
- Moved the Hugo bindings onto the custom prefix map.
- The ArchWiki docs path is now a variable, making it testable.
</content>
</entry>
<entry>
<title>chore: two-pass case handling in pre-commit secret scan</title>
<updated>2026-07-18T15:32:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-18T15:32:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=b5a7ac309217a1aeece1c043cf29002cfea6c9ef'/>
<id>urn:sha1:b5a7ac309217a1aeece1c043cf29002cfea6c9ef</id>
<content type='text'>
Split the patterns into a case-sensitive pass (AWS/sk-/PEM) and a case-insensitive one (keyword=value), so mixed-case base64 in an embedded image blob stops tripping the uppercase AWS-key pattern and blocking real commits.
</content>
</entry>
<entry>
<title>chore: sync bundled claude rules and git hooks</title>
<updated>2026-05-25T18:16:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-25T18:16:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=5e5296c57c88a3f3c0a1ee53ef60f3076eb67af2'/>
<id>urn:sha1:5e5296c57c88a3f3c0a1ee53ef60f3076eb67af2</id>
<content type='text'>
Routine sync of the .claude/rules and git hooks distributed with the language bundle. Adds the cross-project, emacs, interaction, todo-format, triggers, and working-files rules; refreshes the elisp and elisp-testing rules, the elisp validation hook, and the pre-commit hook.
</content>
</entry>
<entry>
<title>feat(ai-quick-ask): add cj/gptel-quick-ask one-shot command</title>
<updated>2026-05-16T06:48:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-16T06:48:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=3cd36aa22d0488c8f3bd393b9ce9d61af94eac07'/>
<id>urn:sha1:3cd36aa22d0488c8f3bd393b9ce9d61af94eac07</id>
<content type='text'>
New module `modules/ai-quick-ask.el`.  Bound to `C-; a q` via
`cj/ai-keymap` ("quick ask").

`cj/gptel-quick-ask` reads a prompt in the minibuffer, creates a
transient `*GPTel-Quick*` buffer in `cj/gptel-quick-mode` (a
special-mode derivative with `q` / `escape` / `c` bindings), inserts
"Q: &lt;prompt&gt;" plus a response marker, then calls `gptel-request`
with `:stream t` so the answer streams into the buffer.  Doesn't
touch `*AI-Assistant*`, doesn't autosave.

Two follow-up commands work in the buffer:

- `cj/gptel-quick-dismiss` (`q` / `escape`): delete the window and
  kill the buffer.  Idempotent when the buffer is absent.
- `cj/gptel-quick-continue` (`c`): extract the prompt + response,
  seed them into `*AI-Assistant*` under proper org headings (matching
  the `cj/gptel--fresh-org-prefix` shape), display the side window,
  then dismiss the quick buffer.

13 tests cover the pure helpers (initial-text shape, response
extraction across normal / multi-line / no-marker / empty inputs,
seed-text shape), the ask path (buffer created in right mode,
prompt recorded, gptel-request called, empty-prompt error), the
dismiss path (kills buffer / no-op when absent), and the continue
path (seeds `*AI-Assistant*`, dismisses quick buffer, errors
outside a quick buffer).  `gptel-request` is stubbed in tests so
nothing hits the network.
</content>
</entry>
<entry>
<title>chore(hooks): add tracked pre-commit hook via githooks/</title>
<updated>2026-04-19T12:54:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-19T12:54:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=11db5ad183d47212157124172a27bfbeb3d4c800'/>
<id>urn:sha1:11db5ad183d47212157124172a27bfbeb3d4c800</id>
<content type='text'>
Portable setup: pre-commit lives in githooks/ (tracked), activated
by `make install-hooks` which sets core.hooksPath. Survives fresh
clones.

The hook does two things on staged changes:
- Scans added lines for common credential patterns (AWS keys, sk-*
  tokens, BEGIN PRIVATE KEY blocks, api_key/password literals)
- Runs check-parens on staged .el files

Bypass with `git commit --no-verify` for confirmed false positives.
</content>
</entry>
</feed>
