<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-05-25T18:16:30+00:00</updated>
<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=e0f6b54f41384e8bfdc33810b370ca6eaca9298f'/>
<id>urn:sha1:e0f6b54f41384e8bfdc33810b370ca6eaca9298f</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=670117cccdbae4706dfaa5e05144c256c3a657f0'/>
<id>urn:sha1:670117cccdbae4706dfaa5e05144c256c3a657f0</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=c3b0057b4438ed3080b80fe0c8611683138c1bd5'/>
<id>urn:sha1:c3b0057b4438ed3080b80fe0c8611683138c1bd5</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>
