ClaudeMods
☰
KO
● 0 명 접속 중 · 조회 0 회
후원프로젝트 제출
GitHub 저장소 · 작성자 schreibse

reminder-log

Claude Code가 세션별로 모델에 대해 주입한 알림을 집계합니다. 토큰 카운터와 반복된 속성 블록을 삭제합니다. /reminders는 지난 30 일수를 인쇄합니다.

schreibse@schreibse

schreibse/claude-code-mods/tree/main/reminder-log

번역 완료

이 mod 소개

Claude Code 모드

Personal Claude Code 모드: 대본의 스타일을 변경하고 주위에 행을 추가하는 기능 후크 플러그인 프롬프트를 표시하고 도구 호출에 반응합니다. Claude Code 2.1.287+, Linux에서 구축 및 사용되었습니다.

모드

| 모드 | 그것이 하는 일 | 명령 | 필요 | |---|---|---|---| | [조용한 배쉬](조용한 배쉬/) | One 라인 도구 행(✓ <description>, 실패 시 빨간색 ✗ exit N, 편집 시 +N −M, 호출 지속 시간 ≥10 s). 모든 도구의 결과 블록(Bash 출력, 편집 diff, WebFetch, MCP 및 에이전트 결과, 대화형 도구, SendUserFile 및 이미지 읽기는 그대로 유지), 완료된 읽기 전용 행(Read/Grep/Glob, ls 또는 git status와 같이 읽기 전용으로 실행된 엔진 호출), one가 실패하지 않는 한 축소된 도구 그룹을 숨깁니다. 시간 초과된 GitLab 파이프라인 대기 알림. PNG를 읽거나 보내거나 쓴 행 아래의 인라인 PNG 축소판, 상대 경로 포함 | /quiet는 모든 것을 다시 가져옵니다. /thumb [big] <path>는 PNG를 보여줍니다 | 썸네일용 ImageMagick(magick); 고양이 그래픽이 있는 터미널(herdr 참조) | | [조용한 회전자](조용한 회전자/) | 기발한 단어 대신 일반 스피너 단어(thinking, writing, running) 및 Took 1m 4s | – | – | | 사용률 | 프롬프트 아래 행: ctx 34% \| 5h 41% \| wk 86%, 80 %에서 노란색, 95 %에서 빨간색. Nx 저장소에서는 중간(claude.slice 사용량 + app.slice 압력)에 메모리가 있고 오른쪽에는 세션 자체 nx serve 프로젝트(▶ admin api) 및 지점의 파이프라인(수동 작업을 기다리는 경우 ci ⏳ test, ⏸) | – | gh / glab가 ​​파이프라인에 로그인되었습니다. 메모리용 systemd claude.slice | | 알림-로그 | Claude Code가 세션별로 모델에 대해 주입한 알림을 집계합니다. 토큰 카운터 삭제 및 반복 커밋 귀속 차단 | /reminders는 지난 30일의 집계를 인쇄합니다. – | | 미스터배너 | 생성, 병합, 승인 또는 검토된 각 MR✗ exit NQ 아래에 링크가 있는 컬러 카드 | – | gitlab 또는 glab / gh라는 GitLab MCP 서버 | | coderabbit-밴드 | 열려 있는 CodeRabbit 스레드(심각도별)와 현재 브랜치의 GitLab MR에 대한 nitpick을 링크와 함께 프롬프트 위에 표시합니다. 열려 있는 경우에만 표시 | /coderabbit는 카운트가 변경될 때까지 숨깁니다 | glab가 로그인되었습니다. GitLab 원격 | | 수정 | 프롬프트 및 도구 출력의 비밀은 ‹secret:…› 토큰으로 모델에 도달합니다. Write/Edit만이 이를 실제 값으로 되돌립니다. 수정 | – | PATH의 betterleaks || mem-guard | 노드 도구를 실행하는 Bash 명령은 메모리 제한 claude-cmd.slice 범위에 들어갑니다. 거부됨, 메시지의 수정 사항: --parallel=1 없는 --parallel=1, :lite 쌍이 있는 pnpm 스크립트, 작업자 캡이 없는 농담, 대괄호가 없는 패턴이 있는 pkill -f/QXZKQZXALQ, ci:local 및 슬라이스가 위에 있는 동안 과도한 실행 75 % 또는 압력을 받고 있습니다. mem-guard | – | 시스템 사용자 claude-cmd.slice, mem-guard 참조 | | 인계 | 스킬 플러스 모드: handover 스킬은 ~/.claude/handover.md에 대한 콜드 세션에 대한 one 문장 핸드오버를 작성합니다. 프롬프트 위의 밴드에 이를 표시하고 ✓ <description>Q(또는 14 일 이내에 동일한 폴더의 새 세션) 후에 Tab |을 사용하여 제안으로 프롬프트에서 한 번 기다립니다. /handover-copy가 복사하고 밴드를 숨깁니다 | – | | herdr-통지 | Claude가 권한, 답변 또는 새 프롬프트(플러그인이 아닌 Notification 후크)를 기다릴 때 GNOME 팝업이 나타납니다. 해당 창은 herdr의 초점이 맞춰진 one인 동안 건너뛰었습니다. 이를 클릭하면 Ghostty가 발생하고 해당 세션의 herdr 창에 초점이 맞춰집니다. 후크: "Notification": [{"matcher": "permission_prompt\|idle_prompt\|elicitation_dialog", "hooks": [{"type": "command", "command": "bash \"$HOME/.claude/skills/herdr-notify/notify.sh\""}]}] | – | herdr, 유령, notify-send, jq |

모델은 모델이 없을 때의 모습을 정확하게 볼 수 있습니다. 모드는 그려진 내용을 변경합니다. two 종류의 삽입된 알림을 삭제하는 알림 로그, 비밀을 숨기는 수정 및 mem-guard, systemd 범위 내에서 Node 명령을 실행하고 mem-guard: … 오류로 일부를 거부합니다.

Three 모드는 자체적으로 다음을 호출합니다.

  • mr-banner, MR 링크 없이 GitLab MCP 메모 또는 승인 응답이 있을 경우 호출 링크 및 제목에 대한 gitlab MCP 서버의 get_merge_request입니다. gh/QXZKQZXBAQ 명령 추가 비용이 들지 않습니다.
  • coderabbit-band는 GitLab origin 원격에 대해 glab를 폴링합니다. 60 타이머는 분기를 확인합니다. 가져오기(glab mr view 및 MR 토론의 모든 페이지)는 1분마다 실행됩니다. git push 후 15 분, 밴드가 무언가를 보여주는 동안 매 5 분, 그렇지 않으면 매 15 분, 스레드가 해결된 후 5가 한 번 발생합니다.
  • Nx 저장소의 사용률은 모든 10 s: nx serve 프로세스에 대한 ps 및 pwdx를 폴링합니다. docker inspect는 서버가 실행되는 컨테이너당 한 번씩 해당 Compose 프로젝트 디렉터리를 읽습니다. HEAD가 이동할 때 파이프라인(gh run list / glab ci get)을 가져옵니다. git push 다음에 15가 있습니다. 실행되는 동안 매분마다, 그렇지 않으면 매 5분마다.

설치

Claude Code는 세션 시작 시 ~/.claude/skills/ 아래의 모든 플러그인 폴더를 로드합니다.

  • 빈 ~/.claude/skills: 바로 복제합니다.
h
  git clone https://github.com/schreibse/claude-code-mods ~/.claude/skills
  
```-
 **기존 기술:** 다른 곳에서 복제하고 원하는 모드를 연결하세요.
```s
h
  git clone https://github.com/schreibse/claude-code-mods ~/src/claude-code-mods
  ln -s ~/src/claude-code-mods/quiet-bash ~/.claude/skills/quiet-bash   # per mod
  

새로운 세션이 그들을 선택합니다. 실행 중인 one에는 /exit 및 claude --continue가 필요합니다.

모드 제외: 해당 폴더를 삭제하거나 연결을 해제합니다. 단일 세션에 대해 one를 사용해 보세요. claude --plugin-dir ~/src/claude-code-mods/<mod>.

이 저장소는 기술 폴더 자체입니다, 따라서 .gitignore는 모든 것을 무시하고 각각을 다시 포함합니다. mod: 새 모드에는 !/<name>/ 라인이 필요합니다. 그렇지 않으면 git이 이를 볼 수 없습니다. .claude-plugin/types/가 생성되었습니다 엔진에 의해 추적되지 않은 상태로 유지됩니다.

수정: 토큰으로서의 비밀

betterleaks는 모델에 도달하기 전에 모든 프롬프트와 도구 결과를 검사합니다. 플래그가 지정된 각 값 ‹secret:xxxxxxxx›가 되며 나중에 나타날 때마다 숨겨진 상태로 유지됩니다. 다시는 인식하지 못할 것입니다.

| 모델의 전화 | 무슨 일이 일어나는가 | |---|---| | 토큰으로 쓰기, 편집, NotebookEdit | 실제 값은 파일에 기록됩니다 | | 파일이 보유한 비밀을 삭제하는 쓰기 | 거부됨: 편집 | | 에이전트, SendMessage, TodoWrite(토큰 포함) | 토큰으로 전달 | | 토큰이 포함된 기타 도구(Bash, WebFetch, MCP…) | 거부되었으므로 값이 절대 떠나지 않습니다 | | 모드가 더 이상 알지 못하는 토큰(다시 시작한 후) | 거부됨, 잘못 복원되지 않음 |

간단한 출력. Read, Grep 또는 Bash가 실행되기 전에 모든 파일에 호출 이름이 지정됩니다(Bash: 각 단어 즉, 기존 파일(1 MB의 최대 10)이 전체 검색되므로 cut -c1-60 .env, cut -d= -f2 또는 PEM 키의 몇 줄 읽기는 여전히 토큰으로 반환됩니다. 여러 줄 비밀은 한 줄씩 숨겨져 있습니다. Bash 단어는 각 세그먼트가 실행되는 디렉터리(cd sub && cut -c1-40 .env)에 대해 확인됩니다. ~/, $HOME/ 및 ${HOME}/는 홈 디렉터리로 확장됩니다.

규칙. betterleaks의 기본값과 redact/betterleaks.toml: Sentry DSN 키 및 클라이언트 일반 규칙에 비해 비밀이 너무 짧습니다. dev, local, test를 포함하는 클라이언트 비밀번호, example, changeme 또는 placeholder는 계속 표시되므로 로컬 개발 클라이언트는 명령에서 계속 작업합니다.

보장되지 않음:

  • 이미지; 뒤에 파일이 없는 출력, 짧게 자르기(git show HEAD:.env | cut …, printenv | cut …); 실제 값을 유지하는 기록 파일의 구조화된 도구 기록 (모델은 이를 읽지 않습니다).
  • 짧은 사전 스캔에서는 glob(cut -c1-40 *.env) 및 공백이 포함된 인용 경로가 누락됩니다.
  • 8 문자보다 짧은 값은 숨겨지지 않습니다.
  • Write/Edit에 의해 파일로 복원된 값은 변환되어 다시 읽을 수 있습니다(base64, rev, xxd) 또는 전송됨(curl -T file). redact는 우연히 모델의 컨텍스트에서 비밀을 유지합니다. 이는 이를 얻으려는 모델에 대한 샌드박스가 아닙니다.
  • ‹secret:…› 토큰을 인용하는 하위 에이전트의 보고서는 다른 도구 호출과 마찬가지로 거부됩니다. one를 들고 있습니다.

볼트는 세션 메모리에 있습니다. /exit는 이를 잊어버립니다.

상태 줄에 redacted N가 표시됩니다. N은 저장소 항목 수를 계산하므로 PEM 키는 줄당 한 번씩 계산됩니다. 알림은 숨기는 각 새 값에 대한 규칙의 이름을 지정합니다. betterleaks가 없으면 상태 표시줄에 다음과 같이 표시됩니다.off (no betterleaks)이며 아무것도 숨겨져 있지 않습니다. 실패한 더 나은 누출 실행은 그 호출을 남깁니다. 수정되지 않음(이미 저장소에 있는 값은 숨겨진 상태로 유지됨): one 연속 실패당 토스트, 상태 off (betterleaks)라고 말하고 다음 호출이 다시 검색됩니다.

mem-guard: Bash의 메모리 규칙

노드 도구의 이름을 지정하는 모든 Bash 명령(node, npx, pnpm, npm, yarn, nx, jest, vitest, playwright, tsc, /exitQ)는 다음과 같이 실행됩니다. systemd-run --user --scope --slice=claude-cmd.slice -p MemoryMax=30% -p MemorySwapMax=4% -- bash -c '…', 따라서 데스크탑을 종료하는 대신 137를 종료하면 오버런이 종료됩니다. 선도적인 cd … && 스테이 래퍼 외부에 있으므로 쉘의 디렉토리는 여전히 이동합니다.

규칙은 명령의 각 부분이 실행되는 내용을 읽습니다(&&, |, ;, &, $( ) 이후, 내부). bash -c '…', cd 다음)에는 언급만 하는 단어가 없으므로 다음과 같은 커밋 메시지가 표시됩니다. pkill -f 통과. 조사되지 않음: xargs, make, eval, 스크립트.

가정 이 설정을 사용합니다. 메시지 이름은 다음과 같습니다.

  • claude-cmd.slice 사용자 유닛. 이것이 없으면 systemd는 자체 제한 없이 슬라이스를 만듭니다. 각 명령은 여전히 RAM의 30 %로 제한되지만 헤드룸 확인은 측정할 항목이 없으며 꺼진 상태로 유지됩니다.
i
  # ~/.config/systemd/user/claude-cmd.slice
  [Slice]
  MemoryMax=30%
  MemorySwapMax=4%
  
```systemd
는 백분율을 머신 RAM의 바이트로 변환합니다(27 GiB: 8.2G 및 1.1G).
  동일한 장치가 모든 기계에 적합니다. 기계가 무엇을 얻는지 확인하세요.
  `systemd-run --user --scope -q -p MemoryMax=30% -- sh -c 'cat /sys/fs/cgroup$(cut -d: -f3 /proc/self/cgroup)/memory.max'`
- 무거운 스크립트에 `:lite` 쌍(`lint:affected:lite`, `typecheck:lite`,
  `test:affected:lite`) 및 느린 `ci:local` 스크립트.

## 사용률: 적용되지 않음

- GitHub에는 분기의 최신 워크플로 실행만 표시됩니다.
- SSH 호스트 별칭(`git@work:org/repo`)을 사용하는 원격은 `ci no login (work)`로 읽힙니다.
  로그인되었습니다.
- 서버가 세션의 루트 내부에서 실행되거나 다음이 포함된 컨테이너에서 실행될 때 세션의 것으로 간주됩니다.
  거기에 프로젝트를 작성하세요. one 결제의 Two 세션 모두 해당 서버를 확인합니다.

## herdr: 이미지 및 링크

herdr(여기 Ghostty 내부)에서 Quiet-bash의 썸네일은
mr-banner, coderabbit-band 및 Claude의 자체 출력에 있는 대체 텍스트와 링크는 클릭할 수 없습니다.

**원인:** Claude Code는 `XTVERSION` 대답이 다음과 같은 터미널에 대해서만 키티 그래픽을 켭니다.
`kitty`(≥ 0.28) 또는 `ghostty`로 시작하며, 인식되는 터미널에 대해서만 하이퍼링크가 있습니다. 무리
둘 다 전달하지만 자체 이름으로 응답하므로 Claude Code는 둘 다 끕니다.

**수정:** Claude Code가 시작되기 전에 herdr 내부에서만 두 가지를 모두 강제로 설정합니다(시작 시 읽음).
```s
h
# ~/.bashrc.d/herdr-terminal.sh
if [ -n "$HERDR_ENV" ]; then
    export CLAUDE_CODE_FORCE_TERMINAL_IMAGES=1
    export FORCE_HYPERLINK=1
fi

또한 ~/.config/herdr/config.toml에서 herdr의 고양이 그래픽 패스스루(기본적으로 꺼져 있음)를 켜십시오.

l
[experimental]
kitty_graphics = true

그런 다음 herdr server reload-config, 새 herdr 창을 엽니다(이전 창은 이전 환경을 유지합니다). 거기에서 Claude Code를 시작하세요. 확인하세요: /thumb /path/to/some.png가 그림을 그려야 합니다.

herdr-link-toast (Claude Code 모드가 아닌 herdr 플러그인)

herdr은 피드백 없이 백그라운드에서 Ctrl+클릭 링크를 열고 file:// 링크를 무시합니다. 전혀. herdr-link-toast는 xdg-open를 사용하여 http(s) 링크를 열고 다음을 표시합니다. 토스트. 또한 Quiet-bash의 썸네일 캡션에 있는 경로가 열립니다. `http://localhost/open-file/<

설치

먼저 작성자의 README에서 marketplace와 플러그인 이름을 확인하세요. 저장소 구조에 따라 명령어가 달라질 수 있습니다.

claude plugin marketplace add schreibse/claude-code-mods
claude plugin install reminder-log
원문 / README

claude-code-mods

Personal Claude Code mods: plugins of function hooks that restyle the transcript, add rows around the prompt and react to tool calls. Built and used on Claude Code 2.1.287+, Linux.

Mods

| Mod | What it does | Commands | Needs | |---|---|---|---| | quiet-bash | One-line tool rows (✓ <description>, red ✗ exit N on failure, +N −M on edits, duration for calls ≥10 s). Hides every tool's result block (Bash output, Edit diffs, WebFetch, MCP and Agent results; interactive tools, SendUserFile and image Reads keep theirs), finished read-only rows (Read/Grep/Glob, and calls the engine ran read-only like ls or git status), collapsed tool groups unless one failed, and timed-out GitLab pipeline-wait notices. Inline PNG thumbnails under rows that read, sent or wrote a PNG, relative paths included | /quiet brings it all back; /thumb [big] <path> shows a PNG | ImageMagick (magick) for thumbnails; a terminal with kitty graphics (see herdr) | | quiet-spinner | Plain spinner words (thinking, writing, running) and Took 1m 4s instead of the whimsical ones | – | – | | usage-percent | Row under the prompt: ctx 34% \| 5h 41% \| wk 86%, yellow from 80 %, red from 95 %. In Nx repos also memory in the middle (claude.slice usage + app.slice pressure) and on the right the session's own nx serve projects (▶ admin api) and the branch's pipeline (ci ⏳ test, ⏸ when it waits on a manual job) | – | gh / glab logged in for the pipeline; systemd claude.slice for memory | | reminder-log | Tallies the reminders Claude Code injects for the model, per session; drops the token counter and repeated commit attribution blocks | /reminders prints the tally of the last 30 days | – | | mr-banner | Colored card with a link under each MR/PR created, merged, approved or reviewed | – | GitLab MCP server named gitlab, or glab / gh | | coderabbit-band | Band above the prompt with the open CodeRabbit threads (by severity) and nitpicks of the current branch's GitLab MR, with a link. Shows only when something is open | /coderabbit hides it until the counts change | glab logged in; GitLab remote | | redact | Secrets in prompts and tool output reach the model as ‹secret:…› tokens; only Write/Edit turn them back into the real value. See redact | – | betterleaks on PATH | | mem-guard | Bash commands that run Node tools go into a memory-capped claude-cmd.slice scope. Refused, with the fix in the message: nx affected/run-many without --parallel=1, a pnpm script that has a :lite twin, jest without a worker cap, pkill -f/pgrep -f with an unbracketed pattern, ci:local, and heavy runs while the slice is above 75 % or under pressure. See mem-guard | – | a systemd user claude-cmd.slice, see mem-guard | | handover | Skill plus mod: the handover skill writes a one-sentence handover for a cold session to ~/.claude/handover.md; a band above the prompt shows it, and after /clear (or a new session in the same folder, within 14 days) it waits once in the prompt as a suggestion, taken with Tab | /handover-copy copies it and hides the band | – | | herdr-notify | GNOME popup when Claude waits for a permission, an answer or a new prompt (a Notification hook, not a plugin). Skipped while that pane is the focused one in herdr. Clicking it raises Ghostty and focuses that session's herdr pane. Hook: "Notification": [{"matcher": "permission_prompt\|idle_prompt\|elicitation_dialog", "hooks": [{"type": "command", "command": "bash \"$HOME/.claude/skills/herdr-notify/notify.sh\""}]}] | – | herdr, Ghostty, notify-send, jq |

The model sees exactly what it would without them: the mods change what is drawn, except reminder-log, which drops two kinds of injected reminders, redact, which hides secrets, and mem-guard, which runs Node commands inside a systemd scope and refuses some with a mem-guard: … error.

Three mods call out on their own:

  • mr-banner, when a GitLab MCP note or approval answers without the MR's link, calls get_merge_request on the gitlab MCP server for the link and title. gh/glab commands cost nothing extra.
  • coderabbit-band polls glab for GitLab origin remotes: a 60 s timer checks the branch, and a fetch (glab mr view plus all pages of the MR's discussions) runs every minute for 15 min after a git push, every 5 min while the band shows something, every 15 min otherwise, and once 5 s after a thread is resolved.
  • usage-percent, in Nx repos, polls every 10 s: ps and pwdx for nx serve processes, and docker inspect once per container a server runs in, to read its compose project directory. The pipeline (gh run list / glab ci get) is fetched when HEAD moves, 15 s after a git push, every minute while it runs and every 5 min otherwise.

Install

Claude Code loads every plugin folder under ~/.claude/skills/ at session start.

  • Empty ~/.claude/skills: clone straight into it:
    git clone https://github.com/schreibse/claude-code-mods ~/.claude/skills
    
  • Existing skills there: clone elsewhere and link the mods you want:
    git clone https://github.com/schreibse/claude-code-mods ~/src/claude-code-mods
    ln -s ~/src/claude-code-mods/quiet-bash ~/.claude/skills/quiet-bash   # per mod
    

New sessions pick them up; a running one needs /exit and claude --continue.

Leave a mod out: delete or unlink its folder. Try one for a single session: claude --plugin-dir ~/src/claude-code-mods/<mod>.

This repo is the skills folder itself, so .gitignore ignores everything and re-includes each mod: a new mod needs a !/<name>/ line or git won't see it. .claude-plugin/types/ is generated by the engine and stays untracked.

redact: secrets as tokens

betterleaks scans every prompt and tool result before it reaches the model. Each value it flags becomes ‹secret:xxxxxxxx› and stays hidden wherever it appears later, even where the scanner would not recognise it again.

| The model's call | What happens | |---|---| | Write, Edit, NotebookEdit with a token | the real value is written to the file | | Write that would drop a secret the file holds | refused: use Edit | | Agent, SendMessage, TodoWrite with a token | passed on as the token | | Any other tool with a token (Bash, WebFetch, MCP …) | refused, so the value never leaves | | A token the mod no longer knows (after a restart) | refused, never restored wrongly |

Cut-short output. Before Read, Grep or Bash runs, every file the call names (Bash: each word that is an existing file, up to 10 of 1 MB) is scanned whole, so cut -c1-60 .env, cut -d= -f2 or a Read of a few lines from a PEM key still come back as tokens. Multi-line secrets are hidden line by line. Bash words resolve against the directory each segment runs in (cd sub && cut -c1-40 .env), and ~/, $HOME/ and ${HOME}/ expand to the home directory.

Rules. betterleaks' defaults plus redact/betterleaks.toml: Sentry DSN keys, and client secrets too short for the generic rules. A client secret containing dev, local, test, example, changeme or placeholder stays visible, so local dev clients keep working in commands.

Not covered:

  • images; output with no file behind it, cut short (git show HEAD:.env | cut …, printenv | cut …); the transcript file's structured tool records, which keep real values (the model does not read them).
  • the cut-short pre-scan misses globs (cut -c1-40 *.env) and quoted paths with spaces.
  • values shorter than 8 characters are never hidden.
  • a value restored into a file by Write/Edit can be read back transformed (base64, rev, xxd) or sent (curl -T file). redact keeps secrets out of the model's context by accident; it is not a sandbox against a model trying to get them.
  • a subagent's report that quotes a ‹secret:…› token is refused like any other tool call carrying one.

The vault lives in session memory: /exit forgets it.

The status line shows redacted N: N counts vault entries, so a PEM key counts once per line. A toast names the rule for each new value it hides. Without betterleaks the status line says off (no betterleaks) and nothing is hidden. A betterleaks run that fails leaves that call unredacted (values already in the vault stay hidden): one toast per failure streak, the status says off (betterleaks), and the next call scans again.

mem-guard: memory rules for Bash

Every Bash command that names a Node tool (node, npx, pnpm, npm, yarn, nx, jest, vitest, playwright, tsc, ngc) runs as systemd-run --user --scope --slice=claude-cmd.slice -p MemoryMax=30% -p MemorySwapMax=4% -- bash -c '…', so an overrun dies with exit 137 instead of taking the desktop down. Leading cd … && stay outside the wrapper, so the shell's directory still moves.

The rules read what each part of a command runs (after &&, |, ;, &, $( ), inside bash -c '…', following cd), never words it only mentions, so a commit message saying pkill -f passes. Not looked into: xargs, make, eval, scripts.

Assumes this setup; the messages name it:

  • a claude-cmd.slice user unit. Without it systemd makes the slice with no limit of its own: each command is still capped at 30 % of RAM, but the headroom check has nothing to measure and stays off:
    # ~/.config/systemd/user/claude-cmd.slice
    [Slice]
    MemoryMax=30%
    MemorySwapMax=4%
    
    systemd turns a percentage into bytes of the machine's RAM (on 27 GiB: 8.2G and 1.1G), so the same unit fits any machine. Check what a machine gets: systemd-run --user --scope -q -p MemoryMax=30% -- sh -c 'cat /sys/fs/cgroup$(cut -d: -f3 /proc/self/cgroup)/memory.max'
  • repos whose heavy scripts have a :lite twin (lint:affected:lite, typecheck:lite, test:affected:lite) and a slow ci:local script.

usage-percent: not covered

  • On GitHub only the newest workflow run of the branch is shown.
  • A remote using an SSH host alias (git@work:org/repo) reads as ci no login (work) though you are logged in.
  • A server counts as the session's when it runs inside the session's root, or in a container whose compose project lives there. Two sessions on one checkout both see its servers.

herdr: images and links

Under herdr (here inside Ghostty), quiet-bash's thumbnails draw only their alt text, and links in mr-banner, coderabbit-band and Claude's own output aren't clickable.

Cause: Claude Code turns on kitty graphics only for terminals whose XTVERSION answer is kitty (≥ 0.28) or starts with ghostty, and hyperlinks only for terminals it recognises. herdr forwards both, but answers with its own name, so Claude Code turns both off.

Fix: force both on, inside herdr only, before Claude Code starts (it reads them at startup):

# ~/.bashrc.d/herdr-terminal.sh
if [ -n "$HERDR_ENV" ]; then
    export CLAUDE_CODE_FORCE_TERMINAL_IMAGES=1
    export FORCE_HYPERLINK=1
fi

Also turn on herdr's kitty graphics passthrough (off by default) in ~/.config/herdr/config.toml:

[experimental]
kitty_graphics = true

Then herdr server reload-config, open a new herdr pane (old panes keep the old environment) and start Claude Code there. Check it: /thumb /path/to/some.png should draw the picture.

herdr-link-toast (a herdr plugin, not a Claude Code mod)

herdr opens a ctrl+clicked link in the background with no feedback, and ignores file:// links altogether. herdr-link-toast opens http(s) links with xdg-open and shows a toast. It also opens the path in quiet-bash's thumbnail captions, which link to http://localhost/open-file/<path> because file:// isn't clickable in herdr. Such a link opens only when the path ends in .png; any other gets a "Could not open link" toast. Needs python3. Install:

herdr plugin link ~/.claude/skills/herdr-link-toast

Without herdr, in plain kitty or Ghostty, none of this is needed. Terminals without the kitty graphics protocol show the thumbnail's alt text (its path).

Developing

Each mod is .claude-plugin/plugin.json, hooks/hooks.json and hooks/register.ts(x), plus types/index.d.ts when it keeps session state. Per mod:

claude plugin validate <mod>   # what it hooks and calls, and what the engine would refuse
claude plugin test <mod>       # its *.test.ts(x)
tsc -p <mod>                   # once the engine has laid .claude-plugin/types/

Edits in ~/.claude/skills hot-reload into running sessions that loaded the mod.

비슷한 프로젝트