{"_id":"@nanocollective/prompt-scrub","_rev":"7-1718da510ec62efe17b8548f853d5d28","name":"@nanocollective/prompt-scrub","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@nanocollective/prompt-scrub","version":"1.0.0","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"author":{"name":"Nano Collective"},"license":"MIT","_id":"@nanocollective/prompt-scrub@1.0.0","maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"ava":{"files":["tests/**/*.test.ts"],"extensions":["ts"],"nodeArguments":["--no-warnings","--import=tsx"],"workerThreads":false},"bin":{"prompt-scrub":"dist/cli/index.js"},"dist":{"shasum":"b538fc79f2787a4b4d4f83f1b465f99c9332470b","tarball":"https://registry.npmjs.org/@nanocollective/prompt-scrub/-/prompt-scrub-1.0.0.tgz","fileCount":99,"integrity":"sha512-qaNQXKraKOBJzXoYBqGBNt96eCCX3jZXJdfksM97IoIitqDmfUCpS0M7oXYzD2wfaxH1NtFtHUWcPoMJ2uNS7g==","signatures":[{"sig":"MEYCIQChvXqhKPFl7jhTZkNfgC+q70d9hOv6LDoOY+GEdyie6AIhAL6/Q9A6qXRmA7qOaMIcq0EkPnajfDm9r5Nq3mQvXvIc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128761},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"4ae969368e5b9c9acaf16e4bc863a2f45fe7c423","scripts":{"lint":"pnpm run test:lint","test":"pnpm run test:ava","build":"rm -rf dist && tsc && chmod +x dist/cli/index.js","check":"pnpm run test:all","format":"biome format --write .","pretest":"pnpm run test:types","test:all":"bash scripts/test.sh","test:ava":"ava","test:knip":"knip","test:lint":"biome lint .","test:audit":"pnpm audit --audit-level=high --ignore-unfixable","test:types":"tsc --noEmit","test:watch":"ava --watch","test:format":"biome ci --formatter-enabled=true --linter-enabled=false --assist-enabled=false .","test:coverage":"pnpm run test:ava:coverage","test:lint:fix":"biome lint --write --unsafe .","test:security":"semgrep scan --config auto --error","prepublishOnly":"pnpm run build","test:ava:coverage":"c8 --reporter=text --reporter=json-summary ava"},"_npmUser":{"name":"willlamerton","email":"william.lamerton@gmail.com"},"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"_npmVersion":"10.9.8","description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","directories":{"doc":"docs","test":"tests"},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.0.9","devDependencies":{"c8":"^11.0.0","ava":"^5.3.1","tsx":"^4.22.4","knip":"^6.23.0","typescript":"^6.0.3","@types/node":"^26.0.0","@biomejs/biome":"^2.5.1","@ava/typescript":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/prompt-scrub_1.0.0_1783281675239_0.9508595854775503","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@nanocollective/prompt-scrub","version":"1.0.1","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"author":{"name":"Nano Collective"},"license":"MIT","_id":"@nanocollective/prompt-scrub@1.0.1","maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"ava":{"files":["tests/**/*.test.ts"],"extensions":["ts"],"nodeArguments":["--no-warnings","--import=tsx"],"workerThreads":false},"bin":{"prompt-scrub":"dist/cli/index.js"},"dist":{"shasum":"59c83a0b1b3b0edd882dc91494a244181cdcba1c","tarball":"https://registry.npmjs.org/@nanocollective/prompt-scrub/-/prompt-scrub-1.0.1.tgz","fileCount":99,"integrity":"sha512-FxWrU5yFc25VNBUfr7g+y6xgjuCOWvOU2QFr0tOfaY24Qmqam1B0/IuC79DSnyVtdF+viCi4OQCAySG/W0l5OA==","signatures":[{"sig":"MEQCIGtajXGzgDA/W/HBQyxS4N9eT/eOh37fm1C9n7pMWaZyAiBOs9fXCG0VdQNkC36/BSB+XpL9E4SmBIoHyJ6N/FinaQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129650},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"d5d80d3fac61a282aa5944b9a889d725286ec04d","scripts":{"lint":"pnpm run test:lint","test":"pnpm run test:ava","build":"rm -rf dist && tsc && chmod +x dist/cli/index.js","check":"pnpm run test:all","format":"biome format --write .","prepare":"pnpm run build","pretest":"pnpm run test:types","test:all":"bash scripts/test.sh","test:ava":"ava","test:knip":"knip","test:lint":"biome lint .","test:audit":"pnpm audit --audit-level=high --ignore-unfixable","test:types":"tsc --noEmit","test:watch":"ava --watch","test:format":"biome ci --formatter-enabled=true --linter-enabled=false --assist-enabled=false .","test:coverage":"pnpm run test:ava:coverage","test:lint:fix":"biome lint --write --unsafe .","test:security":"semgrep scan --config auto --error","prepublishOnly":"pnpm run build","test:ava:coverage":"c8 --reporter=text --reporter=json-summary ava"},"_npmUser":{"name":"willlamerton","email":"william.lamerton@gmail.com"},"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"_npmVersion":"10.9.8","description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","directories":{"doc":"docs","test":"tests"},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.0.9","devDependencies":{"c8":"^11.0.0","ava":"^5.3.1","tsx":"^4.22.4","knip":"^6.23.0","typescript":"^6.0.3","@types/node":"^26.0.0","@biomejs/biome":"^2.5.1","@ava/typescript":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/prompt-scrub_1.0.1_1783519332991_0.5788533399785056","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@nanocollective/prompt-scrub","version":"1.0.2","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"author":{"name":"Nano Collective"},"license":"MIT","_id":"@nanocollective/prompt-scrub@1.0.2","maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"ava":{"files":["tests/**/*.test.ts"],"extensions":["ts"],"nodeArguments":["--no-warnings","--import=tsx"],"workerThreads":false},"bin":{"prompt-scrub":"dist/cli/index.js"},"dist":{"shasum":"8638b9e3cd727cca244ea8416aeb603d923029cf","tarball":"https://registry.npmjs.org/@nanocollective/prompt-scrub/-/prompt-scrub-1.0.2.tgz","fileCount":99,"integrity":"sha512-DtkkfBDpd8AWSYWiY3WHhA75/AqvZYlVYV9nRUMwS8SDF+LNgldi52I1t/tbhqerfko4Uc9nc0qG93UztJVQyQ==","signatures":[{"sig":"MEYCIQCy1XyJxWDoqYJyu+PYU+JLZ8pDv6Dlcn3ImcQt7xQlRQIhAJYD+X0uAA8CqZ3Jg/0Itl1nYCP956q0awFspJBWacwb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129650},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"7e6189e6f196c6163e114ab8f0fea66c284866fd","scripts":{"lint":"pnpm run test:lint","test":"pnpm run test:ava","build":"rm -rf dist && tsc && chmod +x dist/cli/index.js","check":"pnpm run test:all","format":"biome format --write .","prepare":"pnpm run build","pretest":"pnpm run test:types","test:all":"bash scripts/test.sh","test:ava":"ava","test:knip":"knip","test:lint":"biome lint .","test:audit":"pnpm audit --audit-level=high --ignore-unfixable","test:types":"tsc --noEmit","test:watch":"ava --watch","test:format":"biome ci --formatter-enabled=true --linter-enabled=false --assist-enabled=false .","test:coverage":"pnpm run test:ava:coverage","test:lint:fix":"biome lint --write --unsafe .","test:security":"semgrep scan --config auto --error","prepublishOnly":"pnpm run build","test:ava:coverage":"c8 --reporter=text --reporter=json-summary ava"},"_npmUser":{"name":"willlamerton","email":"william.lamerton@gmail.com"},"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"_npmVersion":"10.9.8","description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","directories":{"doc":"docs","test":"tests"},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.0.9","devDependencies":{"c8":"^11.0.0","ava":"^8.0.1","tsx":"^4.22.4","knip":"^6.25.0","typescript":"^6.0.3","@types/node":"^26.0.0","@biomejs/biome":"^2.5.2","@ava/typescript":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/prompt-scrub_1.0.2_1783635095810_0.39907013842267913","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@nanocollective/prompt-scrub","version":"1.1.0","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"author":{"name":"Nano Collective"},"license":"MIT","_id":"@nanocollective/prompt-scrub@1.1.0","maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"ava":{"files":["tests/**/*.test.ts"],"extensions":["ts"],"nodeArguments":["--no-warnings","--import=tsx"],"workerThreads":false},"bin":{"prompt-scrub":"dist/cli/index.js"},"dist":{"shasum":"36cb6db9c5488b21792a5db750954433e320cafa","tarball":"https://registry.npmjs.org/@nanocollective/prompt-scrub/-/prompt-scrub-1.1.0.tgz","fileCount":111,"integrity":"sha512-+aKmHE+TO8GEiWaO4j2740mBMZn7ClPNQcjlSleomxni94kZYJ1usjmfAyarp8ZbV8ZusdIM0U3GSKhwr0YVdg==","signatures":[{"sig":"MEQCIHN4LtqUPr3PJs17qSanApwkPHtYQCEZ7br0dWnecuRkAiBrJzPk38JDdazJDOZU+S8mv+fGW5QS1zrPXjiMtueosw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBXO5RJTj0aah7EVum3JOtKP3kIfkQXL83kr51CLrCZmAiADEsfzTL2KsarZgarglY5Do6sRxeo+lgCb0SAt9bO0Ag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@nanocollective%2fprompt-scrub@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":225162},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"38a7e895352df7a9be7674b40071dd27b90c2d1c","scripts":{"lint":"pnpm run test:lint","test":"pnpm run test:ava","build":"node -e \"require('fs').rmSync('dist', {recursive: true, force: true})\" && tsc","check":"pnpm run test:all","format":"biome format --write .","prepare":"pnpm run build","pretest":"pnpm run test:types","test:all":"bash scripts/test.sh","test:ava":"ava","changeset":"changeset","test:knip":"knip","test:lint":"biome lint .","test:audit":"pnpm audit --audit-level=high --ignore-unfixable","test:types":"tsc --noEmit","test:watch":"ava --watch","test:format":"biome ci --formatter-enabled=true --linter-enabled=false --assist-enabled=false .","test:coverage":"pnpm run test:ava:coverage","test:lint:fix":"biome lint --write --unsafe .","test:security":"semgrep scan --config auto --error","prepublishOnly":"pnpm run build","changeset:version":"changeset version && node scripts/normalize-changelog.js","test:ava:coverage":"c8 --reporter=text --reporter=json-summary ava"},"_npmUser":{"name":"willlamerton","email":"william.lamerton@gmail.com"},"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"_npmVersion":"10.9.8","description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","directories":{"doc":"docs","test":"tests"},"_nodeVersion":"22.23.2","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.0.9","devDependencies":{"c8":"^12.0.0","ava":"^8.0.1","tsx":"^4.23.12","knip":"^6.33.0","typescript":"^7.0.2","@types/node":"^26.4.0","@biomejs/biome":"^2.5.11","@ava/typescript":"^7.0.0","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/prompt-scrub_1.1.0_1789116564687_0.966471093731085","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@nanocollective/prompt-scrub","version":"1.2.0","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"author":{"name":"Nano Collective"},"license":"MIT","_id":"@nanocollective/prompt-scrub@1.2.0","maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"ava":{"files":["tests/**/*.test.ts"],"extensions":["ts"],"nodeArguments":["--no-warnings","--import=tsx"],"workerThreads":false},"bin":{"prompt-scrub":"dist/cli/index.js"},"dist":{"shasum":"1926ab4d1e7ad386ac33ad86cc185bc483d4922e","tarball":"https://registry.npmjs.org/@nanocollective/prompt-scrub/-/prompt-scrub-1.2.0.tgz","fileCount":123,"integrity":"sha512-4+79OoQ8JvJar0N5Ok2PjV0yxGhKjqN/MCe8K8PsX4YKpQorKP1XICR3E5QLb0OzP25AP83uCtYyL0FpZaCS8Q==","signatures":[{"sig":"MEUCIEoPTALLzLiGGcHWxmJh2gg4zTd+7dm9gCOyg4S3GTLLAiEAqMbtK8xry5u3Nv1tbXKXajLI2gP6WneuW0x9+gDLu3A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD8q04PSzQwFeYh2A5SIyYM24LZCvGcvDfWUtJQVFPFbgIgSrm4LLQVjwV3imsSmH+jdEwgz+JDc8xjZScBbVGrI/E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@nanocollective%2fprompt-scrub@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":254678},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"62f823de8719d6085baf14f90feec02f0c381389","scripts":{"lint":"pnpm run test:lint","test":"pnpm run test:ava","build":"node -e \"require('fs').rmSync('dist', {recursive: true, force: true})\" && tsc","check":"pnpm run test:all","format":"biome format --write .","prepare":"pnpm run build","pretest":"pnpm run test:types","test:all":"bash scripts/test.sh","test:ava":"ava","changeset":"changeset","test:knip":"knip","test:lint":"biome lint .","test:audit":"pnpm audit --audit-level=high --ignore-unfixable","test:types":"tsc --noEmit","test:watch":"ava --watch","test:format":"biome ci --formatter-enabled=true --linter-enabled=false --assist-enabled=false .","test:coverage":"pnpm run test:ava:coverage","test:lint:fix":"biome lint --write --unsafe .","test:security":"semgrep scan --config auto --error","prepublishOnly":"pnpm run build","changeset:version":"changeset version && node scripts/normalize-changelog.js","test:ava:coverage":"c8 --reporter=text --reporter=json-summary ava"},"_npmUser":{"name":"willlamerton","email":"william.lamerton@gmail.com"},"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"_npmVersion":"10.9.8","description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","directories":{"doc":"docs","test":"tests"},"_nodeVersion":"22.23.2","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.0.9","devDependencies":{"c8":"^12.0.0","ava":"^8.0.1","tsx":"^4.23.13","knip":"^6.34.0","typescript":"^7.0.2","@types/node":"^26.4.0","@biomejs/biome":"^2.5.11","@ava/typescript":"^7.0.0","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/prompt-scrub_1.2.0_1789118195817_0.139359209322083","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@nanocollective/prompt-scrub","version":"1.3.0","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"author":{"name":"Nano Collective"},"license":"MIT","_id":"@nanocollective/prompt-scrub@1.3.0","maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"ava":{"files":["tests/**/*.test.ts"],"extensions":["ts"],"nodeArguments":["--no-warnings","--import=tsx"],"workerThreads":false},"bin":{"prompt-scrub":"dist/cli/index.js"},"dist":{"shasum":"56f37bfb5356427189aca6df42e8d2f36f9fb7e7","tarball":"https://registry.npmjs.org/@nanocollective/prompt-scrub/-/prompt-scrub-1.3.0.tgz","fileCount":155,"integrity":"sha512-v7b/DpbA5zcPcvma1yvRb2d5ppDWWOXOzVZoxI794isvr5gKzDzFXd9U6WT+oIgGHyG4KvWKsZYpJnXmJq3TIQ==","signatures":[{"sig":"MEYCIQDSJljkrzFlYYXQpcRFGoc3B6bcqgv3L7VW66hwkVL9lgIhAJZE6OGtLlZmfVYfIP9sfi4a2qHeR2WyREmngSZe4Gau","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIF8ARiP1hyC3Tgp3lMTMV3RWi9vqq7oa1ZYt2efBIfH9AiEAtTJL6HmGgA8+2bfc5Xok1dtMl96QG46cepOz9zubqdA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@nanocollective%2fprompt-scrub@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":365733},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"eadae9fd0590d424e3091ba50a7747e9ced17643","scripts":{"lint":"pnpm run test:lint","test":"pnpm run test:ava","build":"node -e \"require('fs').rmSync('dist', {recursive: true, force: true})\" && tsc","check":"pnpm run test:all","format":"biome format --write .","prepare":"pnpm run build","pretest":"pnpm run test:types","test:all":"bash scripts/test.sh","test:ava":"ava","changeset":"changeset","test:knip":"knip","test:lint":"biome lint .","test:audit":"pnpm audit --audit-level=high --ignore-unfixable","test:types":"tsc --noEmit","test:watch":"ava --watch","test:format":"biome ci --formatter-enabled=true --linter-enabled=false --assist-enabled=false .","test:coverage":"pnpm run test:ava:coverage","test:lint:fix":"biome lint --write --unsafe .","test:security":"semgrep scan --config auto --error","prepublishOnly":"pnpm run build","changeset:version":"changeset version && node scripts/normalize-changelog.js","test:ava:coverage":"c8 --reporter=text --reporter=json-summary ava"},"_npmUser":{"name":"willlamerton","email":"william.lamerton@gmail.com"},"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"_npmVersion":"10.9.8","description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","directories":{"doc":"docs","test":"tests"},"_nodeVersion":"22.23.2","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.0.9","devDependencies":{"c8":"^12.0.0","ava":"^8.0.1","tsx":"^4.23.13","knip":"^6.34.0","typescript":"^7.0.2","@types/node":"^26.4.0","@biomejs/biome":"^2.5.11","@ava/typescript":"^7.0.0","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/prompt-scrub_1.3.0_1789383746864_0.9991530094274381","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"_id":"@nanocollective/prompt-scrub@1.4.0","ava":{"files":["tests/**/*.test.ts"],"extensions":["ts"],"nodeArguments":["--no-warnings","--import=tsx"],"workerThreads":false},"bin":{"prompt-scrub":"dist/cli/index.js"},"bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"dist":{"shasum":"1864c4adc1ee0c4e8d218ee0f6b0a4d283458679","tarball":"https://registry.npmjs.org/@nanocollective/prompt-scrub/-/prompt-scrub-1.4.0.tgz","fileCount":167,"integrity":"sha512-Vt8RNQzXppV9m8O1wHIekZUY/ZjT8GC/B96H5ihLl8u3r52KLNT9rACA+h+3bSr81BZWS1LrcgcN4zCixQ1nSQ==","signatures":[{"sig":"MEUCICfHS8GMOWm2hcv5sWFoP1yz/EFiuTVFoDJE/RbIh1/hAiEAz/LNnvPweVrLzDAtPXSr0u6MDJVgHDDO/5umpbbLG5g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDwiZ/prgPPevjL0G4/RZHz9GG7fd2dJDg3biFI4whirAiBaBJY6pKQMJP0J47A0uXTloLjnzvikxUXBvbB74sUe2Q=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@nanocollective%2fprompt-scrub@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":412175},"main":"./dist/index.js","name":"@nanocollective/prompt-scrub","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","author":{"name":"Nano Collective"},"engines":{"node":">=22"},"gitHead":"21f117b56ce7c79483568690be5eb2ccd79988dd","license":"MIT","scripts":{"lint":"pnpm run test:lint","test":"pnpm run test:ava","build":"node -e \"require('fs').rmSync('dist', {recursive: true, force: true})\" && tsc","check":"pnpm run test:all","format":"biome format --write .","prepare":"pnpm run build","pretest":"pnpm run test:types","test:all":"bash scripts/test.sh","test:ava":"ava","changeset":"changeset","test:knip":"knip","test:lint":"biome lint .","test:audit":"pnpm audit --audit-level=high --ignore-unfixable","test:types":"tsc --noEmit","test:watch":"ava --watch","test:format":"biome ci --formatter-enabled=true --linter-enabled=false --assist-enabled=false .","test:coverage":"pnpm run test:ava:coverage","test:lint:fix":"biome lint --write --unsafe .","test:security":"semgrep scan --config auto --error","prepublishOnly":"pnpm run build","changeset:version":"changeset version && node scripts/normalize-changelog.js","test:ava:coverage":"c8 --reporter=text --reporter=json-summary ava"},"version":"1.4.0","_npmUser":{"name":"willlamerton","email":"william.lamerton@gmail.com"},"homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"_npmVersion":"10.9.8","description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","directories":{"doc":"docs","test":"tests"},"maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.0.9","devDependencies":{"c8":"^12.0.0","ava":"^8.0.1","tsx":"^4.23.13","knip":"^6.34.0","typescript":"^7.0.2","@types/node":"^26.4.0","@biomejs/biome":"^2.5.11","@ava/typescript":"^7.0.0","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/prompt-scrub_1.4.0_1789385739715_0.8825588945232252"}}},"time":{"created":"2026-07-05T20:01:15.036Z","modified":"2026-09-14T11:35:40.148Z","1.0.0":"2026-07-05T20:01:15.392Z","1.0.1":"2026-07-08T14:02:13.169Z","1.0.2":"2026-07-09T22:11:35.953Z","1.1.0":"2026-09-11T08:49:24.805Z","1.2.0":"2026-09-11T09:16:35.902Z","1.3.0":"2026-09-14T11:02:26.964Z","1.4.0":"2026-09-14T11:35:39.820Z"},"bugs":{"url":"https://github.com/Nano-Collective/prompt-scrubber/issues"},"author":{"name":"Nano Collective"},"license":"MIT","homepage":"https://github.com/Nano-Collective/prompt-scrubber#readme","keywords":["prompt","privacy","redaction","pii","llm","scrubber","ai","sanitize"],"repository":{"url":"git+https://github.com/Nano-Collective/prompt-scrubber.git","type":"git"},"description":"`prompt-scrub` is a small open-source, local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM. It maps your sensitive data (emails, secrets, paths) to stable placeholders, allowing you to rehydr","maintainers":[{"name":"mrspence","email":"admin@matt-spence.com"},{"name":"willlamerton","email":"william.lamerton@gmail.com"}],"readme":"# prompt-scrub\n\nBuilt by the [Nano Collective](https://nanocollective.org) — a community collective building AI tooling not for profit, but for the community.\n\n`prompt-scrub` is a local-first utility designed to strip identifying content out of prompts and messages before they hit any cloud LLM.\n\n![Build Status](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/build.svg)\n![Coverage](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/coverage.svg)\n![Version](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/npm-version.svg)\n![Downloads](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/npm-downloads-monthly.svg)\n![License](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/npm-license.svg)\n![Repo Size](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/repo-size.svg)\n![Stars](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/stars.svg)\n![Forks](https://github.com/Nano-Collective/prompt-scrubber/raw/main/badges/forks.svg)\n\nIt maps sensitive data (emails, secrets, paths, URLs, phone numbers) to stable placeholders locally, allowing you to rehydrate the model's responses back to their original forms securely.\n\n## What it is / What it is not\n\n`prompt-scrub` reduces identity leakage at the **content layer**. It is **partial defence, not anonymity**.\n\n**What it does:**\n- Detects and replaces common identifying content (emails, paths, phone numbers, secrets, URLs) before your prompt leaves your machine.\n- Maps each value to a stable placeholder so the model's response can be rehydrated locally.\n- Gives you `inspect` (table of detected entities with confidence and method), `diff` (visual before/after), and `--min-confidence <0-1>` on `scrub`/`inspect` to drop anything below a threshold — so you can see what was detected, what was missed, and exactly what will be sent before you commit to sending.\n\n**What it does not do:**\n- It does not make you anonymous. A semantically identifying question (a niche bug only you have, your private codebase, your financial situation) remains identifying after scrubbing.\n- It does not address stylistic fingerprinting — the way you phrase things goes out unchanged.\n- It does not operate at the network or key layer. Your IP address, request timing, and headers are outside its scope.\n- Detectors can and do miss things. Always review the output before sending.\n\n> [!IMPORTANT]\n> A user who believes this tool makes them anonymous is worse off than one who never used it — they stop reading their prompts and trust the defaults. Always use `inspect` first to see what the tool actually found.\n\nRead the full [Threat Model](docs/features/threat-model.md) for a complete breakdown of what is and is not defended.\n\n## Quick Start\n\nInstall globally to use the CLI:\n\n```bash\nnpm install -g @nanocollective/prompt-scrub\n```\n\nOr install as a dependency in your Node.js project:\n\n```bash\nnpm install @nanocollective/prompt-scrub\n```\n\n### Recommended: Inspect first\n\nBefore scrubbing, run `inspect` on a real prompt to review what the tool detected before sending your prompt:\n\n```bash\necho \"My email is alice@acme.com and I work at /Users/alice/projects. My phone is +44-7700-900999.\" \\\n  | prompt-scrub inspect\n```\n\n```\nDetected entities:\n  [Email]    alice@acme.com                   → «Email_1»  (chars 12-26, confidence 0.95 exact-pattern)\n  [Path]     /Users/alice/projects.           → «Path_1»   (chars 41-63, confidence 0.80 structural)\n  [Phone]    +44-7700-900999                  → «Phone_1»  (chars 76-91, confidence 0.90 structural)\n\nNo session written.\nHash: 7e5eea933db987e10e10e259ebcfea9d3250d8a68925fd9360f515e3a4bfbba9\n```\n\nEach entity carries the confidence the detector assigned it: an exact vendor key pattern scores 0.99, a capitalised-word name guess only 0.5. Pass `--min-confidence <0-1>` to `scrub` or `inspect` to drop everything below a threshold. See [Confidence & Tiered Detection](docs/features/detectors.md#confidence--tiered-detection).\n\nThe hash is deterministic — the same prompt always produces the same hash, so you can verify cache stability across runs. Once you are satisfied with what `inspect` shows, run `diff` to see the replacements in place, then proceed with `scrub`.\n\n```bash\necho \"My email is alice@acme.com\" | prompt-scrub diff --no-color\n```\n\n```\n- My email is alice@acme.com\n+ My email is «Email_1»\n```\n\n## Usage Examples\n\n**CLI: Scrubbing text**\n```bash\necho \"My email is user@example.com\" | prompt-scrub scrub\n# stdout: My email is «Email_1»\n# stderr: Session ID: 6f1c2b90-...\n# stderr: Scrubbed: 1 entity (1 Email)   — pass -q/--quiet to suppress the summary\n\n# Only scrub what the detectors are confident about\necho \"My email is user@example.com\" | prompt-scrub scrub --min-confidence 0.9\n```\n\n**CLI: Encrypting session files at rest**\n\nLocal session files map placeholders like `«Secret_1»` back to your real secrets. If your laptop is stolen or another process on your account reads `~/.config/prompt-scrub/sessions/`, those secrets leak. Enable encryption to keep them protected on disk:\n\n```json\n// ~/.config/prompt-scrub/config.json\n{ \"encryptionEnabled\": true }\n```\n\nThen pass a passphrase via the `PROMPT_SCRUB_KEY` environment variable when running `scrub`/`rehydrate`/`sessions`:\n\n```bash\n# Read your passphrase from a secret manager; do NOT echo it inline — it will\n# land in your shell history.\nexport PROMPT_SCRUB_KEY\nread -rs PROMPT_SCRUB_KEY   # enter interactively\necho \"sk-1234567890abcdefghij\" | prompt-scrub scrub\n```\n\nIf `PROMPT_SCRUB_KEY` is unset and `stdin` is a TTY, `prompt-scrub` will prompt for the passphrase interactively (with input muted). Rehydrate on an encrypted session also requires the same key.\n\n> Note: `prompt-scrub` only reads the file `rehydrate` was asked about. If you only ever use `scrub`, the *output* (the scrubbed prompt) is safe to send anywhere regardless of encryption; encryption protects the *session file* on disk.\n\nTo migrate existing plaintext sessions after enabling encryption:\n\n```bash\nPROMPT_SCRUB_KEY=… prompt-scrub sessions encrypt\n```\n\n**CLI: Watch clipboard**\n```bash\n# Monitor clipboard and automatically scrub sensitive data\nprompt-scrub watch --clipboard\n\n# Watch a file\nprompt-scrub watch --file prompt.txt --once\n\n# Preview changes without writing anything\nprompt-scrub watch --file prompt.txt --dry-run --once\n```\n\nSee the [CLI Reference](docs/getting-started/cli.md#watch-mode) for all watch options and platform requirements.\n\n**CLI: Run a transparent scrubbing proxy**\n```bash\n# Point your SDK at the proxy instead of the upstream API.\nprompt-scrub proxy --target https://api.openai.com --port 8080 &\nexport OPENAI_BASE_URL=http://localhost:8080/v1\n\n# Any request your app sends to OpenAI is now scrubbed on the way out and\n# rehydrated on the way back, transparently. Streaming (SSE) responses work.\n```\n\nSee the [CLI Reference](docs/getting-started/cli.md#proxy-mode) for the full set of options and supported providers.\n\n**Node.js API: Scrubbing, Rehydrating, and Key Injection**\n```typescript\nimport {\n  scrub,\n  rehydrate,\n  setCachedEncryptionKey,\n} from '@nanocollective/prompt-scrub';\n\n// Optional: inject a key without relying on PROMPT_SCRUB_KEY / TTY prompting.\nsetCachedEncryptionKey(process.env.MY_APP_KEY ?? '');\n\nconst prompt = \"My key is sk-12345\";\nconst { scrubbedContent, sessionId } = scrub({ content: prompt });\nconsole.log(scrubbedContent); // \"My key is «Secret_1»\"\n\n// ... send to LLM ... get response \"I see your key is «Secret_1»\"\n\nconst { content } = rehydrate({\n  content: \"I see your key is «Secret_1»\",\n  sessionId,\n});\nconsole.log(content); // \"I see your key is sk-12345\"\n```\n\n## Configuration\n\n`prompt-scrub` reads an optional config file for extra rule packs, URL allowlisting, the active locale, a default confidence floor, session TTL, and encryption. Create one pre-filled with the default schema:\n\n```bash\nprompt-scrub init\n# Created config file at /home/alice/.config/prompt-scrub/config.json\n```\n\nPrint the configuration that is actually active — JSON on `stdout`, the path it came from on `stderr`:\n\n```bash\nprompt-scrub config show\n```\n\nSet `locale` (or pass `--locale de-DE` to `scrub`, `inspect`, or `watch`) to activate detectors from locale-specific rule packs. Built-in detectors are English-shaped and always run. A locale that activates no detector warns on `stderr` rather than silently scrubbing with English rules only.\n\nEntries that do not match the schema are reported and exit non-zero, so `config show` doubles as a config check in scripts. See the [CLI reference](docs/getting-started/cli.md#configuration) for the full schema and options.\n\n## Session Management & Garbage Collection\n\n`prompt-scrub` maps sensitive data to placeholders and stores these mappings in session files (by default in `~/.config/prompt-scrub/sessions/`).\n\nTo protect your privacy and save disk space, session files have a **Time-to-Live (TTL)**. By default, sessions that are older than **7 days** are automatically deleted when you run the `scrub` or `sessions list` commands. Active sessions (ones you interact with) will naturally have their TTL reset.\n\nYou can also manually prune expired sessions:\n```bash\nprompt-scrub sessions gc\n```\n\nTo configure the TTL, add `sessionTtlDays` to your `~/.config/prompt-scrub/config.json`:\n```json\n{\n  \"sessionTtlDays\": 14,\n  \"encryptionEnabled\": true\n}\n```\n\nOnce `encryptionEnabled` is on, run `prompt-scrub sessions encrypt` (passing `PROMPT_SCRUB_KEY`) to rewrite any plaintext sessions already on disk.\n\n## Documentation\n\nFull user guides and architecture details are in the [`docs/`](docs/) directory:\n- [Getting Started](docs/getting-started/index.md)\n- [Threat Model](docs/features/threat-model.md)\n- [Architecture](docs/features/index.md)\n\nRead the full whitepaper at [docs.nanocollective.org](https://docs.nanocollective.org).\n\n## Community\n\n- **Discord:** [Join the Nano Collective Discord](https://discord.gg/ktPDV6rekE)\n- **Contributing:** Read our [Contributing Guide](CONTRIBUTING.md) to get started.\n- **Issues:** Check the [GitHub Issues](https://github.com/Nano-Collective/prompt-scrubber/issues) for planned work or to report bugs.\n","readmeFilename":"README.md"}