Breaking Changes
- npm sources: tokens are only sent to trusted registries, and
tokenEnvnames are restricted.registryandtokenEnvcome from the committedrulesync.jsonc, so a cloned repository could makerulesync installsend any environment variable as a Bearer token to a registry of its choosing.tokenEnvmust now beNPM_TOKENor end with_NPM_TOKEN(e.g.ACME_NPM_TOKEN);rulesync doctorreports other names asconfig/token-env-not-allowed. A token is only sent tohttps://registry.npmjs.orgor to a registry origin listed in theRULESYNC_NPM_TRUSTED_REGISTRIESenvironment variable (comma-separated). Private-registry users need to set that variable; unparseable entries are now reported with a warning. (#3557, #3582) fetch, gh project-scopeinstallandapm installrefuse to write or remove through symbolic links that resolve outside the project. Setups such as.rulesync -> ~/dotfiles/rulesynckeep working forgenerate, but those commands now fail with "Path resolves outside ... through a symbolic link" instead of writing outside the project. Under--frozen, an integrity mismatch now fails the source instead of only warning. (#3557, #3582)- Kiro CLI / Kiro IDE:
generate --deletealso sweeps nested agents.kiro-cliandkiro-idenow keep nested sources (.rulesync/subagents/team/planner.md→.kiro/agents/team/planner.json/.md), so hand-written nested.kiro/agents/**and~/.kiro/agents/**files are now orphan candidates. Import them first to keep them. (#3583) - Google Antigravity: matcher-less hook events are written as flat handler lists.
SessionStart,PreInvocation,PostInvocationandStopare now written directly under the event key, as Antigravity documents; the canonical MCPtypeis no longer written. Import still reads the older wrapped shape. (#3584)
What's Changed
New Features
- feat(hooks): honor matcher on copilot hooks (#3579)
- feat(xum): write Xum skill frontmatter (
xum:section, incl. path-scopedpaths) and stdio MCP env (#3581) - feat(subagents): support nested agent directories for kiro-cli and kiro-ide (#3583)
- feat(kimi-code): support
[mcp] default_deferredand document the widerdangerousCommandGuardswitch (#3585) - feat(zcode): pass the per-server MCP
alwaysLoadflag through (#3586) - feat(permissions): accept the omp
always-ask-cachedapproval mode (#3587) - feat(hermesagent): track Hermes Agent v0.22.3 hook events and MCP cost keys (#3589)
- feat(reasonix): author
tools.disabledandaskOnExternalOrigin, warn on a shadowed nested config (#3590)
Bug Fixes
- fix(security): guard npm tokens, symlinked writes and frozen integrity (#3557)
- fix(security): follow up on the symlink and npm token hardening (#3582)
- fix(claudecode): warn on
sandbox.allowNestedUserNamespaces(#3577) - fix(hooks): stop the false skipped-matcher warning for copilotcli (#3578)
- fix(deepagents): map MCP oauth to dcode's Slack-only
client_idshape (#3580) - fix(antigravity): flat hook lists for matcher-less events,
SessionStart, and no MCPtype(#3584) - fix(takt): drop
provider_optionskeys Takt rejects inconfig.yaml(#3588)
Other Changes
- chore: update Homebrew formula to v39.0.0 (#3567)
Contributors
Full Changelog: v39.0.0...v40.0.0