{"_id":"@cobdfamily/dogcow","_rev":"9-f8a376f2c3dda286d8f01e8aeb8d5d0a","name":"@cobdfamily/dogcow","dist-tags":{"latest":"1.0.202608142223"},"versions":{"1.0.202606092035":{"name":"@cobdfamily/dogcow","version":"1.0.202606092035","license":"AGPL-3.0","_id":"@cobdfamily/dogcow@1.0.202606092035","maintainers":[{"name":"alex.jurgensen","email":"alex@cobd.ca"},{"name":"matt1211","email":"Matthew@cobd.ca"}],"homepage":"https://github.com/cobdfamily/dogcow#readme","bugs":{"url":"https://github.com/cobdfamily/dogcow/issues"},"bin":{"dogcow":"dogcow.js"},"dist":{"shasum":"8582c925df11b125ae3741354f0ba2c123dcc3ff","tarball":"https://registry.npmjs.org/@cobdfamily/dogcow/-/dogcow-1.0.202606092035.tgz","fileCount":20,"integrity":"sha512-Jr+AZH4tBZ6atpU92qNWjPj8+PG0VDZUtX22zjdJMWPqaW4lyp4azxzmX0oYzfqCq06UtBNLf8A5/Zz5orxViw==","signatures":[{"sig":"MEUCIG8vXPRAMWAxrOU96+YwajxxEIjRE5lUqrZl/u0ChCAQAiEApEZvYvYdAWUaEQq85F4316YWX630r8PUkNr+t/Vdrok=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167108},"main":"dogcow.js","type":"module","gitHead":"b52f6f0a425c74d7bdcd33af56c705b33ea530b1","scripts":{"test":"node --test","sounds":"node fetch-sounds.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e1c3c698-feea-4d59-92a8-8209fadbb01f"}},"repository":{"url":"git+https://github.com/cobdfamily/dogcow.git","type":"git"},"_npmVersion":"11.16.0","description":"Command-line REPL wrapper around an agentic-coding CLI with an interactive permission gate. Named after Clarus the DogCow. Moof!","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dogcow_1.0.202606092035_1781037323092_0.4014845593660685","host":"s3://npm-registry-packages-npm-production"}},"1.0.202606092047":{"name":"@cobdfamily/dogcow","version":"1.0.202606092047","license":"AGPL-3.0","_id":"@cobdfamily/dogcow@1.0.202606092047","maintainers":[{"name":"alex.jurgensen","email":"alex@cobd.ca"},{"name":"matt1211","email":"Matthew@cobd.ca"}],"homepage":"https://github.com/cobdfamily/dogcow#readme","bugs":{"url":"https://github.com/cobdfamily/dogcow/issues"},"bin":{"dogcow":"dogcow.js"},"dist":{"shasum":"368aadeb9a14ecce9be3547a495a1404c667c0dc","tarball":"https://registry.npmjs.org/@cobdfamily/dogcow/-/dogcow-1.0.202606092047.tgz","fileCount":20,"integrity":"sha512-vje9tLrMRODg+QIVnhoFWXZ82VRgo9bD9LiVmaiPBK+URW/bgTSLCmJBFPwoYSEiH5t3aWdhKFTe33rrNgaj1w==","signatures":[{"sig":"MEQCIDM/BcTx1u0oKT4/jRnHh7dbmihp6uUnAWsadDl5WFltAiAVvsm72OUBVfOG573wo8uhCzDR9kPqdWYqqHwB8oQYOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167108},"main":"dogcow.js","type":"module","gitHead":"2d9613a2a364c5042d25d29e64d3e149dace56d3","scripts":{"test":"node --test","sounds":"node fetch-sounds.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e1c3c698-feea-4d59-92a8-8209fadbb01f"}},"repository":{"url":"git+https://github.com/cobdfamily/dogcow.git","type":"git"},"_npmVersion":"11.16.0","description":"Command-line REPL wrapper around an agentic-coding CLI with an interactive permission gate. Named after Clarus the DogCow. Moof!","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dogcow_1.0.202606092047_1781038052395_0.9277942576489133","host":"s3://npm-registry-packages-npm-production"}},"1.0.202606100241":{"name":"@cobdfamily/dogcow","version":"1.0.202606100241","license":"AGPL-3.0","_id":"@cobdfamily/dogcow@1.0.202606100241","maintainers":[{"name":"alex.jurgensen","email":"alex@cobd.ca"},{"name":"matt1211","email":"Matthew@cobd.ca"}],"homepage":"https://github.com/cobdfamily/dogcow#readme","bugs":{"url":"https://github.com/cobdfamily/dogcow/issues"},"bin":{"dogcow":"dogcow.js"},"dist":{"shasum":"cd3bba63b7e6c67c1a9ad7a03377bab7ad11860a","tarball":"https://registry.npmjs.org/@cobdfamily/dogcow/-/dogcow-1.0.202606100241.tgz","fileCount":20,"integrity":"sha512-XxAzJaIqV/h+c9WlkFX/f7VmPwJXl+52S6INPfydoVeBaqwuiQTV7qkVPw1BUWMFLMV3HbXvw8wp1VfHpKFKsw==","signatures":[{"sig":"MEQCIE1D/W358SECVb5o+ZNihgy986NLT+r63+OciDocVHPQAiBfAcktOW/Qa3n9EP9Y+66/xkKv3Ho91KJ+LfiH1lS9Zg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167075},"main":"dogcow.js","type":"module","gitHead":"251a95450e7e93188c29a36a7ebb8750154f72f5","scripts":{"test":"node --test","sounds":"node fetch-sounds.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e1c3c698-feea-4d59-92a8-8209fadbb01f"}},"repository":{"url":"git+https://github.com/cobdfamily/dogcow.git","type":"git"},"_npmVersion":"11.16.0","description":"Command-line REPL wrapper around an agentic-coding CLI with an interactive permission gate. Named after Clarus the DogCow. Moof!","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dogcow_1.0.202606100241_1781059298610_0.7986356238370036","host":"s3://npm-registry-packages-npm-production"}},"1.0.202608142219":{"name":"@cobdfamily/dogcow","version":"1.0.202608142219","license":"AGPL-3.0","_id":"@cobdfamily/dogcow@1.0.202608142219","maintainers":[{"name":"alex.jurgensen","email":"alex@cobd.ca"},{"name":"matt1211","email":"Matthew@cobd.ca"}],"homepage":"https://github.com/cobdfamily/dogcow#readme","bugs":{"url":"https://github.com/cobdfamily/dogcow/issues"},"bin":{"dogcow":"dogcow.js"},"dist":{"shasum":"6276cf4995fb5c5cd37e16084ea4cfc8da98f74c","tarball":"https://registry.npmjs.org/@cobdfamily/dogcow/-/dogcow-1.0.202608142219.tgz","fileCount":20,"integrity":"sha512-y7h/nvV7pi33s6V8aGqzu8oXAColgIfGG08UoKHQ0sLEDuXGpMbQbf+z16YkdM730b7GiSsnoDFv6JStUrKtEg==","signatures":[{"sig":"MEUCIDDrIideDVgmPT9nSeXt0QGbhjFDBiZ6mTVEJISMWO/8AiEAoguvV8DZ9Gu1o8Bnk7u6xHR255QXaSCd8XI/j6Xltvw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177923},"main":"dogcow.js","type":"module","gitHead":"e76c130634054771819cbd64d3ce28d1ee4ae238","scripts":{"test":"node --test","sounds":"node fetch-sounds.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e1c3c698-feea-4d59-92a8-8209fadbb01f"}},"repository":{"url":"git+https://github.com/cobdfamily/dogcow.git","type":"git"},"_npmVersion":"12.0.2","description":"Command-line REPL wrapper around an agentic-coding CLI with an interactive permission gate. Named after Clarus the DogCow. Moof!","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dogcow_1.0.202608142219_1786745972443_0.5155132041362285","host":"s3://npm-registry-packages-npm-production"}},"1.0.202608142223":{"name":"@cobdfamily/dogcow","version":"1.0.202608142223","description":"Command-line REPL wrapper around an agentic-coding CLI with an interactive permission gate. Named after Clarus the DogCow. Moof!","license":"AGPL-3.0","type":"module","main":"dogcow.js","bin":{"dogcow":"dogcow.js"},"repository":{"type":"git","url":"git+https://github.com/cobdfamily/dogcow.git"},"bugs":{"url":"https://github.com/cobdfamily/dogcow/issues"},"homepage":"https://github.com/cobdfamily/dogcow#readme","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"scripts":{"sounds":"node fetch-sounds.js","test":"node --test"},"gitHead":"1c76a0813669d8e9d0d2b2024e9b65c880605c69","_id":"@cobdfamily/dogcow@1.0.202608142223","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-kJDM/IJR2kim1Ez+arpU2Irtm5PH6k9ooy448LV+fDZcSSA3JD10Ns1USGrKIN9QTAkm03CONNu6C8CSaPCxfQ==","shasum":"7870bab98f13af0bc7ea447d11e1973d940aca41","tarball":"https://registry.npmjs.org/@cobdfamily/dogcow/-/dogcow-1.0.202608142223.tgz","fileCount":20,"unpackedSize":178037,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGxVWfr4/3dk+/u221YDZG81h1qRZnAfoI9/OXxUIQI/AiEA91VgmHP+IJRflviFpQteAik4RHL3G8zPzFnKgHDxZ1w="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e1c3c698-feea-4d59-92a8-8209fadbb01f"}},"directories":{},"maintainers":[{"name":"alex.jurgensen","email":"alex@cobd.ca"},{"name":"matt1211","email":"Matthew@cobd.ca"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dogcow_1.0.202608142223_1786746226913_0.37255681663423146"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-09T20:18:51.962Z","modified":"2026-08-14T22:23:47.190Z","1.0.0":"2026-06-09T20:18:52.296Z","1.0.202606092030":"2026-06-09T20:30:12.761Z","1.0.202606092035":"2026-06-09T20:35:23.239Z","1.0.202606092047":"2026-06-09T20:47:32.586Z","1.0.202606100241":"2026-06-10T02:41:38.766Z","1.0.202608142219":"2026-08-14T22:19:32.598Z","1.0.202608142223":"2026-08-14T22:23:47.029Z"},"bugs":{"url":"https://github.com/cobdfamily/dogcow/issues"},"license":"AGPL-3.0","homepage":"https://github.com/cobdfamily/dogcow#readme","repository":{"type":"git","url":"git+https://github.com/cobdfamily/dogcow.git"},"description":"Command-line REPL wrapper around an agentic-coding CLI with an interactive permission gate. Named after Clarus the DogCow. Moof!","maintainers":[{"name":"alex.jurgensen","email":"alex@cobd.ca"},{"name":"matt1211","email":"Matthew@cobd.ca"}],"readme":"# dogcow\n\nCommand-line front-end named after Clarus the DogCow. It wraps an\nagentic-coding CLI in a small REPL and adds an interactive permission\ngate so tool use can be approved from the console. Claude Code is the\ndefault backend; Gemini and Codex ship too, and any other CLI can be\nadded as a drop-in file (see [Backends](#backends)).\n\n## Files\n\n- `dogcow.js` — main entrypoint and permission daemon\n- `dogcow-permissionshook.js` — PreToolUse hook client (relays to the daemon)\n- `permissions.js` — rule parsing, matching, and prompt rendering\n- `backends.js` — backend discovery, normalized-event contract, config store\n- `backends/*.js` — one descriptor per backend (`claude`, `gemini`, `codex`)\n- `askquestion.js` — AskUserQuestion picker answer-mapping (see [deferred.md](deferred.md))\n- `sessions.js` — persistent per-cwd Claude session id + transcript listing (see [Sessions](#sessions))\n- `silliness.js` / `clarus_phrases.json` — random status phrases\n- `moof.js` — optional Moof sound effect\n\n## Run\n\n```\nnode dogcow.js\n```\n\nType a request (capitalized text, or prefixed with `@dogcow` / `/ask`)\nto send it to the active backend; type a shell command to run it directly.\n\n## Backends\n\nA *backend* is a CLI dogcow drives. Each is a self-contained ES module in\n`backends/` that default-exports a descriptor (spawn args + a `parseEvent`\nmapping the CLI's stream to dogcow's normalized events). Discovery loads every\n`*.js` from the repo `backends/` dir **and** from\n`$XDG_CONFIG_HOME/dogcow/backends/` (defaulting to `~/.config/dogcow/backends/`),\nwhere a same-named file overrides a built-in. So:\n\n- **install only what you need** — a backend is available iff its file is\n  present; delete `backends/gemini.js` and gemini is gone.\n- **add a backend** — drop one `*.js` in your user backends dir. No core edit,\n  no publish step. Copy an existing descriptor as a template.\n\nShipped: `claude` (default), `gemini`, `codex`. When more than one backend is\ninstalled the active one prefixes the prompt (`claude] `); with a single backend\nthe prompt is just `] ` (which one is replying is obvious).\n\n- `/backend` — list backends and mark the active one.\n- `/backend <name>` — switch backend (persisted; effective next turn).\n\n### Permission gate vs. native approval\n\nThe numbered permission gate (below) is built on Claude Code's external\n`PreToolUse` hook, which dials back to dogcow over a socket. Only Claude exposes\nthat contract, so descriptors declare a `gate`:\n\n- `gate: \"hook\"` (claude) — the full numbered gate.\n- `gate: \"native\"` (gemini, codex) — dogcow does **not** gate; the CLI's own\n  approval mode owns allow/deny (`gemini --approval-mode …`, `codex --sandbox …`).\n  dogcow renders the stream, and in `default`/prompting modes the backend asks\n  in prose — answerable as your next message (same as Claude's headless\n  `AskUserQuestion` behaviour). See `deferred.md`.\n\n## Accounts\n\nMultiple accounts per backend are *profiles* — env overlays (credential vars +\nper-backend config dir) selected at spawn time. They live in\n`~/.config/dogcow/config.json`:\n\n```json\n{\n  \"active\": { \"backend\": \"claude\", \"profile\": \"default\" },\n  \"backends\": {\n    \"claude\": { \"profiles\": { \"default\": {}, \"team\": { \"env\": { \"CLAUDE_CONFIG_DIR\": \"/home/you/.claude-team\" } } } },\n    \"gemini\": { \"approvalMode\": \"default\", \"profiles\": { \"personal\": { \"env\": { \"GEMINI_API_KEY\": \"…\" } } } },\n    \"codex\":  { \"sandbox\": \"workspace-write\", \"profiles\": { \"work\": { \"env\": { \"CODEX_HOME\": \"/home/you/.codex-work\" } } } }\n  }\n}\n```\n\n- `/account` — list profiles for the active backend.\n- `/account <name>` — switch profile (persisted; effective next turn).\n\nBackend-specific knobs sit on the backend and are read by that descriptor:\n`approvalMode` (gemini), `sandbox` (codex), and for claude `model`, `effort`,\nand `subagents` (set by the commands below) plus two that are config-file only:\n\n- `fallbackModel` — comma-separated models to try when the primary is\n  overloaded, e.g. `\"claude-opus-4-8,claude-sonnet-5\"`. The primary is retried at\n  the start of each turn.\n- `maxBudgetUsd` — hard spend ceiling for a turn's API calls.\n\n## Models\n\nPick which model the active backend runs. Each backend declares its own\nselectable models; for `claude` these are the current Claude models:\n\n- `/model` — list the active backend's models (current marked `*`).\n- `/model <alias|id>` — switch model (persisted; effective next turn).\n\n```\nclaude] /model\n  models for claude:\n   * fable   claude-fable-5    Fable 5 (most capable; premium-priced)\n     opus    claude-opus-5     Opus 5 (complex agentic coding)\n     sonnet  claude-sonnet-5   Sonnet 5 (balanced)\n     haiku   claude-haiku-4-5  Haiku 4.5 (fastest)\n```\n\nEither the short alias (`/model opus`, always the latest of that tier) or the\nfull id (`/model claude-opus-4-8`, a pinned version) is accepted; the full id is\nwhat's persisted, to `config.backends.<name>.model`. With no override set,\ndogcow passes no `--model` and the backend CLI's own default model is used. A\nbackend that declares no `models` reports that selection is unsupported.\n\nThe list is one entry per current tier, so superseded generations (Opus 4.8,\nSonnet 4.6) are absent even though the API still serves them. Mythos 5 is absent\nfor a different reason: it is Project Glasswing invitation-only, so listing it\nwould offer most accounts a model they cannot run.\n\n## Effort\n\nHow hard the model works on each turn — deeper reasoning and more tool calls at\nthe top end, fewer tokens and lower latency at the bottom. Same interface as\n`/model`, backed by `claude --effort`:\n\n- `/effort` — list the levels (current marked `*`).\n- `/effort <level>` — switch (persisted; effective next turn).\n\n```\nclaude] /effort\n  efforts for claude:\n     low     low     scoped, fastest; skips deep reasoning\n     medium  medium  cost-saving step down from the default\n     high    high    the CLI default; balanced\n   * xhigh   xhigh   best for coding and agentic work\n     max     max     correctness over cost; can overthink\n```\n\nWith no override dogcow passes no `--effort` and the CLI's default (`high`)\napplies. `xhigh` is the level Claude Code itself defaults to for coding work.\n\n## Turn results\n\nThe claude backend's per-turn `result` event is normalized into the event\ncontract, which is how dogcow knows a turn **failed**: the CLI exits 0 having\nprinted nothing, so an errored turn used to be indistinguishable from a quiet\none. A failure prints its reason (`turn failed: error_during_execution:\noverloaded_error`); a success prints nothing, because the response is the report.\n\n- `/cost` — the last turn's outcome, spend, duration, and token usage.\n\nRate-limit warnings from the CLI are surfaced the same way, but only once a\nthreshold has actually been crossed (`rate limit: 77% of the seven-day limit\nused, resets 2026-08-14 10:00`).\n\n## Subagents\n\nClaude Code delegates to subagents (the `Task` tool), whose output does not\nappear in the parent stream by default — the turn goes quiet until the subagent\nfinishes. `--forward-subagent-text` streams their text and thinking, tagged with\nthe tool call that spawned them:\n\n- `/subagents` — report whether subagent output is shown.\n- `/subagents on|off` — toggle (persisted; effective next turn).\n\nOff by default: several agents running in parallel interleave their output into\none terminal. When on, forwarded lines are prefixed `[agent 01abcdef]` so each\nsubagent's output stays attributable.\n\n## Sessions\n\nFor the `claude` backend, dogcow pins one **persistent session per working\ndirectory** instead of resuming \"the most recent conversation\" (`--continue`),\nwhich is ambiguous if anything else uses `claude` in the same project. The\npinned id is stored in `~/.config/dogcow/sessions.json`; the first turn creates\nthe session (`--session-id`) and later turns resume it (`--resume`), so the same\nconversation is picked up across restarts.\n\nBecause dogcow uses Claude's own session store\n(`~/.claude/projects/<dir>/<id>.jsonl`), sessions can be managed like\n`claude --resume`:\n\n- `/session` — list this directory's sessions (active marked `*`), newest first,\n  with each session's first message.\n- `/session <n>` — switch the active session to the nth listed.\n- `/session new` — rotate to a fresh session (no memory flush; `/new` does both).\n- `/session delete <n>` — delete a session's transcript. Deleting the active one\n  rotates to a fresh session.\n\nOther backends are unaffected: `gemini` is stateless per turn and `codex`\nresumes its own last session, so `/session` reports that it is claude-only.\n\n## Slash commands\n\nTyping `/name [args]` runs `commands/name.sh` (with the args passed\nthrough) — e.g. `/clear` runs `commands/clear.sh`. Drop any executable-or-\nnot `*.sh` in `commands/` to add a command; they run with dogcow's\nenvironment (so `DOGCOW_SOCK` etc. are available). If no matching script\nexists the line falls through to the normal rules, so the built-in\n`/queue` / `/clearq` (below), `/ask …`, and absolute paths like\n`/usr/bin/foo` still work.\n\nBundled commands:\n\n- `/clear` — clear the screen and scrollback.\n- `/new` — wrap up and start fresh. It runs the prompt in `commands/new.md`\n  against the **current** session (edits allowed) so Claude saves anything worth\n  keeping to its long-term memory, clears the screen, and rotates dogcow to a\n  fresh session (see [Sessions](#sessions)). Edit `commands/new.md` to change\n  what gets remembered.\n\nThe `/queue` / `/clearq` (message queue), `/backend`, `/account`, `/model`,\n`/effort`, `/subagents`, `/cost`, and `/session` commands are built into dogcow\nrather than scripts in `commands/`.\n\n## Message queue\n\nWhile a turn is running you can keep typing. Each line is buffered and\ndispatched in order as the current turn finishes, the same way the\n`claude` CLI queues messages. While a turn is in flight:\n\n- `/queue` — list the pending messages\n- `/clearq` — drop everything queued\n\nA permission prompt that appears mid-turn still reads your answer\nnormally; the answer is not mistaken for a queued message.\n\n## Sounds\n\n`moof.js` plays classic Mac OS sounds from `~/Library/Sounds`\n(`Moof.aiff`, `Boing.aiff`, `Wild-eep.aiff`) and is a silent no-op when\nthey are absent. The sounds are Apple's and are not shipped in this\nrepo. `fetch-sounds.js` pulls them, per user, from a public Internet\nArchive item and saves them under the names the player expects:\n\n```\nnpm run sounds        # the three sounds dogcow plays\nnode fetch-sounds.js --all   # plus the rest of the classic set\n```\n\nLinux playback additionally needs `sox` (`play`); macOS uses the\nbuilt-in `afplay`.\n\n## Permission gate\n\nWhen the wrapped `claude` wants to use a tool, the `PreToolUse` hook\nconnects back to the daemon over a Unix socket and you get a numbered\nprompt:\n\n```\n1. Yes\n2. Yes, and don't ask again for `Bash(curl *)`\n...\nN. No, and tell me what to do differently\n```\n\nFor the gate to fire, `dogcow-permissionshook.js` must be registered\nas a `PreToolUse` hook in a settings file `claude` reads (e.g.\n`~/.claude/settings.json`):\n\n```json\n{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"*\",\n        \"hooks\": [\n          { \"type\": \"command\",\n            \"command\": \"node /absolute/path/to/dogcow/dogcow-permissionshook.js\" }\n        ]\n      }\n    ]\n  }\n}\n```\n\nThe hook is a no-op unless `DOGCOW_SOCK` is set (the daemon sets it),\nso it is safe to register globally. \"Don't ask again\" choices are\npersisted to `$XDG_CONFIG_HOME/dogcow/settings.local.json` (defaulting\nto `~/.config/dogcow/settings.local.json`), so the rule store stays\nwritable even when dogcow itself is installed to a root-owned prefix.\n\n## License\n\nAGPL-3.0 — see `LICENSE`.\n","readmeFilename":"README.md"}