Universal Audit Log
npx claude-code-templates@latest --mod observability/universal-audit-log Scanned by NVIDIA SkillSpector
Automated static analysis (no LLM) · v2.12.0 · 2026-10-17
Partial analysis: some checks could not run on this component.
SkillSpector looks for patterns such as shell commands, credential access, network calls or unpinned dependencies. An observation is something worth reading in the files before you install, not a confirmed vulnerability. Components that run code locally, like hooks, MCP servers and security tooling, naturally show more of them.
- Agent Config Directory AccessAgent Snooping · README.md:30
- MCP server referenced without pinned version: 'npx claude-code-templates'.MCP Rug Pull · README.md:39
Learn more about NVIDIA SkillSpector.
Content
hooks/universal-audit-log.ts. Options: path, skipEvents, flushEvery, maxBytes (set in user or managed settings pluginConfigs, or /config). Run claude plugin validate on the installed folder to see every event it hooks and every $ call it makes.
universal-audit-log
One hook on "" sees every event: the engine's own (tool.call, prompt.submit,
turn., ...) and every other plugin's calls on $ (fs.read, http.fetch,
process.run, ...). It records one JSON line per dispatch: the event, who
raised it (next.origin: plugin and tier), how long it took and whether
something beneath denied or threw. The "after" placement, so the outcome is
recorded too; denials surface here as the value next(e) resolves to.
Lines are buffered in memory and flushed to a JSONL file through $.fs
(there is no append on $, so a flush reads the file, keeps its tail under
maxBytes, and writes it back) at the end of every turn and every
flushEvery events. The hook is never re-entered for its own $.fs calls,
so flushing from inside it does not recurse.
Seat this plugin FIRST (an org prepends it in managed settings) so nothing beneath it can bypass the log. A hook that fails is skipped by the engine (fail-open, logged in --debug-file), so it never blocks the session.
Options
path: string JSONL file, relative to the working directory (default ".claude/logs/mods-audit.jsonl")
skipEvents: string events not to record, comma-separated (default: the render / log chatter)
flushEvery: number flush after this many buffered lines (default 50)
maxBytes: number keep the file under this size, dropping the oldest lines (default 2 MiB)Declared in .claude-plugin/plugin.json (userConfig). Set them in /config, in user settings (~/.claude/settings.json, not project settings), with --settings <file> or in managed settings:
{ "pluginConfigs": { "universal-audit-log@skills-dir": { "options": { } } } }Install
npx claude-code-templates@latest --mod observability/universal-audit-log
claudeIt is written to .claude/skills/universal-audit-log/, which Claude Code auto-loads as universal-audit-log@skills-dir. For one session with hot reload: claude --plugin-dir .claude/skills/universal-audit-log. claude plugin validate .claude/skills/universal-audit-log prints every event it hooks and every $ call it makes.
Requirements. Mods are on by default in Claude Code 2.1.287+. Typed against Anthropic's declarations: https://github.com/anthropics/claude-code/tree/main/mods