KilimcininKorOglu/claude-code-mods/tree/main/plugins/pin-note
pin-note
A Claude Code plugin that keeps notes you pin with `/pin-note` for the whole session and re-injects them verbatim into the model's context after each compaction and `/clear`, via a SessionStart hook, with per-session persistence in `$.store` and an off-by-default toggle.
About this mod
pin-note is a Claude Code plugin (verified manifest and hooks modules, L0 reach, no network/files/processes) that solves the problem of instructions you give early in a session being weakened or lost after a compaction or /clear. Commands: /pin-note (toggle and list pins), /pin-note on | off, /pin-note <note> to pin, /pin-note drop <n> to remove. Pinned notes are stored per session in $.store under the session id, so resumed sessions recover them; /clear starts a new session that inherits them. After a compaction or /clear, a SessionStart hook re-sends all pins as a numbered list, each exactly as typed, preceded by three lines explaining the notes' origin to reduce the model mistaking them for injected instructions. Install via claude plugin marketplace add KilimcininKorOglu/claude-code-mods then claude plugin install pin-note@kilimcininkoroglu-mods, restart, and run /pin-note on. Limits: notes only re-sent at compaction and /clear; old sessions' notes are never garbage-collected; no limit on note count or length.
Installation
Check the author's README for the marketplace and plugin name first. Commands may change as the repository evolves.
claude plugin marketplace add KilimcininKorOglu/claude-code-mods claude plugin install pin-note
Original text / README
pin-note
You tell the model early on "ask before every push", and after a compaction the summary has dropped the sentence or reworded it into something weaker; after /clear it is gone for good. This mod keeps the notes you pin with /pin-note for the whole session, and sends them to the model again, word for word, after each compaction and /clear.
What it does
-
/pin-note <note>pins a note. The model reads it at once, in the command's answer:pin-note: pinned note 1, kept for this session and sent to you again after each compaction and /clear: ask before every push -
After a compaction, and after
/clear, the notes go into the model's new context through aSessionStarthook, as one numbered list, each note as you typed it. Three lines above the list tell the model where the notes come from: you pinned them yourself with/pin-note, then the conversation was compacted or you ran/clear, and the pin-note plugin you turned on hands them back. Without those lines the model at times took a note for an injected instruction and did not follow it. One line tells you:pin-note: sent 1 pinned note(s) again after the compaction -
The notes belong to the session. They are kept in
$.storeunder the session's id, so a reloaded module and a resumed session find them again./clearstarts a new session, and the notes go with it. -
Nothing is sent at a session's start or at a resume, because the conversation there still holds the notes as you pinned them.
Measured on Claude Code 2.1.283 in live sessions with the sonnet model: after /compact the note reached the model's context, and after /clear the model, asked whether a note was pinned, wrote it word for word. A note that asked for one word at the end of every reply was pinned, then /clear and a new question followed, 20 times for each text: with the earlier one-line text the model refused the note 4 times, calling it injected; with the current text it followed the note all 20 times.
Command
/pin-note on or off, and the pinned notes, numbered
/pin-note on | off off by default; off keeps the notes and sends none
/pin-note <note> pins a note; the text is kept as typed, several lines too
/pin-note drop <n> takes note n out
While the mod is off, /pin-note <note> and drop are refused. on, off and drop <n> are the only command words, so a note may start with drop when no number alone follows it.
Install
claude plugin marketplace add KilimcininKorOglu/claude-code-mods
claude plugin install pin-note@kilimcininkoroglu-mods
Function hooks are early access. Claude Code 2.1.288 and later load them by default, so there is nothing to switch on.
After installing
- Restart Claude Code.
- Run
/pin-note on.
What it can reach
Validated with claude plugin validate on Claude Code 2.1.283:
❯ ./register.ts hooks: session.start, command.run{command=pin-note}, classic.SessionStart
❯ ./register.ts calls: $.command.register, $.session.id, $.store.get (via loadPins, readSettings), $.store.set (via runCommand, savePins), $.ui.log
Reach L0, no network, no files, no processes.
1. Reads: the notes you pin, and the session's id
2. Runs: nothing
3. Sends: nothing off the machine; the notes go into the model's context as you typed them
4. Persists: the on/off setting and each session's notes in $.store
5. Hostile input: a note is your own text and the model reads it as your instruction; nothing else is read
Limits
- The notes are sent again only at a compaction and at
/clear. A note you want gone from the context must be dropped and the context compacted, because a note the model already read stays in the conversation. - Every session's notes stay in
$.storeunder its id; nothing deletes the notes of an old session. - There is no limit on the number or length of notes, and every note goes into the context after each compaction.
Development
make install # eslint, typescript-eslint, typescript
make lint # complexity limit 10, the build fails above it
make typecheck # needs the /plugin-types output in .claude/types/
make validate
make test # claude plugin test
