{"_id":"@davehardy20/pi-safe-tools","name":"@davehardy20/pi-safe-tools","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@davehardy20/pi-safe-tools","version":"0.1.0","description":"Pi safety bundle: safe command runners, damage prevention, and secret redaction.","type":"module","keywords":["pi-package","pi-extension","safety","secret-guard","damage-prevention"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/davehardy20/pi-safe-tools.git"},"bugs":{"url":"https://github.com/davehardy20/pi-safe-tools/issues"},"homepage":"https://github.com/davehardy20/pi-safe-tools#readme","publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.build.json","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit"},"dependencies":{"yaml":"^2.7.1"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","typebox":"*"},"peerDependenciesMeta":{"@earendil-works/pi-coding-agent":{"optional":false},"typebox":{"optional":false}},"devDependencies":{"@earendil-works/pi-coding-agent":"^0.74.0","@types/node":"^24.7.2","typebox":"^1.1.24","typescript":"^5.9.3","vitest":"^3.2.4"},"pi":{"extensions":["./src/extensions/safe-command-tools.ts","./src/extensions/rm-rf-blocker.ts","./src/extensions/secret-guard.ts"]},"gitHead":"217f767ce2babb9cc1e1580ab1094d2ba96aa1db","_id":"@davehardy20/pi-safe-tools@0.1.0","_nodeVersion":"26.0.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-NdFSnovSZFBV7ZciqmbMpWln1Fps4MH79m2LPaSvaKYdHxv5jDG3eXjgDMqZyvQ3ifn4+6FnL8jTgpYA7/GDOg==","shasum":"16d2d0126e187cf9a964571d0f73b717d4d1fe1f","tarball":"https://registry.npmjs.org/@davehardy20/pi-safe-tools/-/pi-safe-tools-0.1.0.tgz","fileCount":12,"unpackedSize":111321,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD8fYWEYZAalCK9Qg2rfLG4VwrGhvYIxmxk2zSjx0hfAgIgaRfOa9KdE5rwUtc8AiendYCbEFK98bBaUTx+pqFpCtI="}]},"_npmUser":{"name":"davehardy20","email":"dave.hardy@protonmail.com"},"directories":{},"maintainers":[{"name":"davehardy20","email":"dave.hardy@protonmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-safe-tools_0.1.0_1779016975741_0.47279077342848175"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T11:22:55.668Z","0.1.0":"2026-05-17T11:22:55.877Z","modified":"2026-05-17T11:22:56.051Z"},"maintainers":[{"name":"davehardy20","email":"dave.hardy@protonmail.com"}],"description":"Pi safety bundle: safe command runners, damage prevention, and secret redaction.","homepage":"https://github.com/davehardy20/pi-safe-tools#readme","keywords":["pi-package","pi-extension","safety","secret-guard","damage-prevention"],"repository":{"type":"git","url":"git+https://github.com/davehardy20/pi-safe-tools.git"},"bugs":{"url":"https://github.com/davehardy20/pi-safe-tools/issues"},"license":"MIT","readme":"# @davehardy20/pi-safe-tools\n\nPi safety bundle: safe command runners, damage prevention, and secret redaction.\n\n## What it adds\n\n### Safe command runners\n\nSeven trusted tool wrappers that bypass bash and invoke executables directly with validated arguments:\n\n- **run_biome** — Biome lint/format check\n- **run_vitest** — Vitest test runner\n- **run_typecheck** — TypeScript `tsc --noEmit`\n- **run_pytest** — pytest test runner\n- **run_cargo_test** — Cargo test runner\n- **git_safe** — Restricted git operations (status, diff, add, commit, push, init) with secret-scan preflight\n- **gh_safe** — Restricted GitHub CLI operations (repo create, PR create/edit/merge/view)\n\n### Damage prevention (rm-rf-blocker)\n\nIntercepts every `tool_call` event and evaluates it against configurable rules:\n\n- Blocked command patterns (hard block)\n- Whitelist-mode bash policy (deny-by-default)\n- Zero-access path restrictions\n- Read-only path enforcement\n- No-delete path enforcement\n- Secret scanning in git add/commit/push\n- Confirmation prompts for dangerous commands\n\nRules are loaded from `~/.pi/damage-prevention-rules.yaml` (global) and `.pi/damage-prevention-rules.yaml` (project-local).\n\n### Secret guard\n\nRedacts secrets from four surfaces:\n\n1. **User input** — before it enters the session\n2. **Context messages** — before they are sent to the LLM\n3. **Bash tool calls** — before commands execute\n4. **Tool results** — before they are stored in conversation history\n\nSecret patterns cover API keys, tokens, credentials, and generic secret assignments.\n\n### Status command\n\n- **/safe-tools-status** — reports package name, version, source path, and loaded rule counts\n\n## Install\n\nFrom a local checkout during development:\n\n```bash\npi install /Users/dave/tools/pi-safe-tools\n```\n\nFrom git:\n\n```bash\npi install git:github.com/davehardy20/pi-safe-tools\n```\n\nFrom npm:\n\n```bash\npi install npm:@davehardy20/pi-safe-tools\n```\n\nFor one run only:\n\n```bash\npi -e /Users/dave/tools/pi-safe-tools\n```\n\n## Settings\n\nThe damage prevention rules are configured via `damage-prevention-rules.yaml`:\n\n- **Global**: `~/.pi/damage-prevention-rules.yaml`\n- **Project**: `<project-root>/.pi/damage-prevention-rules.yaml`\n\nSee the bundled default rules in `src/shared/damage-prevention-rules.ts` for the full schema.\n\nThe secret guard uses compiled regex patterns from `src/shared/secret-patterns.ts`.\n\n## Troubleshooting\n\nRun `/safe-tools-status` to confirm:\n\n- package name and version\n- loaded source path\n- damage-prevention rule source (default/global/project)\n- total rule count\n\nIf commands appear twice, Pi may be loading both the package and the old local extension. Disable or remove the old local auto-discovered extensions (`safe-command-tools.ts`, `rm-rf-blocker.ts`, `secret-guard.ts`) from `~/.pi/agent/extensions/` before reload verification.\n\n## Update flow\n\n1. Update the package repo\n2. Push to GitHub\n3. Run `pi update --extensions` or reinstall the package\n4. Run `/reload`\n\n`/reload` alone does not fetch newer package commits.\n\n## Build and test\n\n```bash\nnpm run typecheck\nnpm run build\nnpm test\n```\n","readmeFilename":"README.md","_rev":"1-4711a1a8eacec63fad71a3acd197a8b1"}