Releases: Kei-Ikeda/chirin
Release list
chirin 1.2.1
A documentation release. The extension is unchanged; the README it ships with is not. 🎐
Nothing to do on upgrade, and nothing gained by it either. Every file under dist/src is byte-for-byte identical to 1.2.0, as are the hook script, the icon, the walkthrough panels and both localization bundles. The only differences in the package are README.md and the version number, so 1.2.0 keeps working exactly as it does today. This release exists so that the Marketplace listing — which is this README — reads like an introduction rather than an essay.
- A quick start opens the README. Five steps, all in the Command Palette, ending where the setup ends. Reaching "how do I make it ring" used to mean scrolling past the etymology of a wind chime, a comparison table and an architecture diagram
- The reference stopped repeating itself. The line cap, the regex worker's budget and the
Stop-every-turn caveat were each written in three places; the annotated config example duplicated the template thatchirin: Create config filealready writes out with a comment on every field. 621 lines became 562, with every table intact - The threat model names its defenses in full.
execFileon an absolute/usr/bin/osascriptwith no shell involved and a--before the data; alog-linespoll that reads only the bytes appended past the offset it recorded last; a watcher lock whose timestamp goes stale so another window can steal it. All of it was already true — an outside review recommended three things the code had done since before 1.0.0, because the README had described them in words nobody was looking for chirin: Unknownsays what it means. It is a permission or I/O error, not a lock that jammed. A stale lock is taken over on its own
Install
code --install-extension kei-ikeda.chirinor download chirin-1.2.1.vsix below and run code --install-extension chirin-1.2.1.vsix.
Verify the download
shasum -a 256 chirin-1.2.1.vsixExpected:
8402847ca4f406376cebf445039406aff12353af75d721de02104a0826bb15da chirin-1.2.1.vsix
The same value is in the attached chirin-1.2.1.vsix.sha256.
chirin 1.2.0
A security review of the trust boundary, and of the reads that were still taking the container at its word. 🎐
Nothing to do on upgrade for most setups. The leader lock keeps the name it had in 1.1.0, so a 1.1.x window and a 1.2.0 window still elect one leader between them, and an existing chirin.json keeps working. The one thing worth a look: chirin now refuses a config, or a config directory, that is owned by another user, and a config directory it cannot write. If yours lives in ~/.config/chirin/ it already passes; if it does not, the reason now appears as a config error instead of quietly doing nothing.
- A rejected config keeps telling you so. A config swapped for a symlink, or grown past the 1MB cap, used to be reported once at most and then settle into "nothing changed" forever. A rejection is a verdict on the file rather than a value, so it is now re-reported until the file is actually fixed - including when the swap happens while a poll catches the file missing
- The config directory is checked for the write access the watcher lock needs. It is where the lock lives, so a directory chirin cannot write left every window failing to elect a leader, with nothing to show for it but a stalled election three heartbeats later. That is now a config error naming the directory
- The config is read through a bounded, validated handle. A regular file, at most 1MB, opened without following symlinks and without blocking on a FIFO, owned by you or by root and not group/other writable
- A tampered watcher lock is refused rather than followed. The lock is read the same way - no symlink, a regular file, at most 4096 bytes - and a window that finds its own lock replaced by a symlink steps down instead of writing through it
- A chatty log can no longer make chirin do unbounded work in one poll.
log-linesnow caps how many lines it decodes, splits and hashes per poll at 2000, counting blank and duplicate lines too. Past the cap, the newest lines win and the older ones are skipped with a warning naming the byte count - The warning about a config inside the workspace says what it can actually tell. It no longer states container writability as fact, and a remote workspace path it cannot map to the host is logged at debug rather than surfacing as a detected misconfiguration on the ordinary devcontainer path
Supply chain: an OpenSSF Scorecard workflow, explicit permissions on the CI workflow, and a package that carries no sources.
Install
code --install-extension kei-ikeda.chirinor download chirin-1.2.0.vsix below and run code --install-extension chirin-1.2.0.vsix.
Verify the download
shasum -a 256 chirin-1.2.0.vsixExpected:
795f15c7d58397bd35892ab04efbf2efee61555572b6a3caf569c08c71f9ff9f chirin-1.2.0.vsix
The same value is in the attached chirin-1.2.0.vsix.sha256.
chirin 1.1.0
Seven ways a notification could go missing, and the one that could take the whole window down with it. 🎐
Upgrading asks one thing of you: quit every VS Code window and reopen it. The leader lock is now named per configuration, so a 1.0.x window still holding the old watcher.lock would watch in parallel and notify twice. A leftover watcher.lock is inert and can be deleted or ignored.
- A runaway
regexcan no longer hold the extension host. Matching runs in a worker thread on a 1s budget and is terminated past it, and the rule is skipped for the rest of the session. Nothing on the evaluating thread can interrupt catastrophic backtracking, so the previous elapsed-time check only ever noticed afterwards - Two windows on different configs in one directory no longer suppress each other. The lock is
watcher-<digest of the config's resolved path>.lock - A config you have just fixed resumes watching on its own. A permission or syntax error used to hold until a reload
- A live leader can no longer be displaced. The lock is published by writing a private file and
linking it into place, so it is never briefly visible and empty - An event arriving right as watching starts now notifies. The baseline is taken as watching starts, not one poll later
- A permission or I/O failure in the lock protocol now surfaces instead of passing for healthy following
- Your own hooks survive the hook install. Removal matches the bundled command exactly, instead of any command that mentions the hook path
No config changes: an existing chirin.json keeps working.
Install
code --install-extension kei-ikeda.chirinor download chirin-1.1.0.vsix below and run code --install-extension chirin-1.1.0.vsix.
Verify the download
shasum -a 256 chirin-1.1.0.vsixExpected:
b8cb1d0c0e5e39e79f356e41f341ec39911d26b4c020dcf4e8c562dc16612c30 chirin-1.1.0.vsix
The same value is in the attached chirin-1.1.0.vsix.sha256.
chirin 1.0.2
Icon refresh. 🎐
- Icon: the breeze is now three identical, evenly spaced waves running the width of the picture, in place of the loose arcs of 1.0.1. Nothing else changed.
No behaviour changes. Upgrading from 1.0.1 needs nothing on your side.
Install
code --install-extension kei-ikeda.chirinor download chirin-1.0.2.vsix below and run code --install-extension chirin-1.0.2.vsix.
Verify the download
shasum -a 256 chirin-1.0.2.vsixExpected:
36b71cb5c628184b2a03342d93c007edfbe538a504d72b8ceaa89580d387a9c3 chirin-1.0.2.vsix
The same value is in the attached chirin-1.0.2.vsix.sha256.
chirin 1.0.1
Icon and description. 🎐
- Extension icon: a glass wind chime in a breeze, indigo and paper, so chirin is easy to spot in the Extensions view and on the Marketplace.
- Description: reworded in both English and Japanese to say that Claude Code hooks are the first use, not the only one; any file or log can be watched.
No behaviour changes. Upgrading from 1.0.0 needs nothing on your side.
Install
code --install-extension kei-ikeda.chirinor download chirin-1.0.1.vsix below and run code --install-extension chirin-1.0.1.vsix.
Verify the download
shasum -a 256 chirin-1.0.1.vsixExpected:
3ba3312dbe9493f68a5ec9204d1bdfb7913ad1825e4de289a8eb302403dc3e89 chirin-1.0.1.vsix
The same value is in the attached chirin-1.0.1.vsix.sha256.
chirin 1.0.0
First public release. 🎐
A zero-dependency VS Code extension that carries file changes to the macOS Notification Center — first of all, Claude Code hooks (Stop, Notification) that fire inside an egress-blocked devcontainer. No network, no npm dependencies, no bundler: unpacking the .vsix shows exactly the code that runs.
Install
code --install-extension chirin-1.0.0.vsixThen follow the "Set up chirin" walkthrough that opens in VS Code. Full documentation is in the README.
Verify the download
shasum -a 256 chirin-1.0.0.vsixExpected:
2f3291f5f246859f47ceea4219e8c44880016e4697f1d78781b5f566df8b7bac chirin-1.0.0.vsix
The same value is in the attached chirin-1.0.0.vsix.sha256. You can also build an identical artifact yourself with npm ci && npm run package.
Requirements
- macOS (Apple Silicon / Intel), VS Code 1.101 or later
- To use the hook inside a container, that container needs
nodeandbash