{"_id":"@agntn/ciphers","_rev":"8-f66a0a426e1b36fef8cb6109eba7e01a","name":"@agntn/ciphers","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"@agntn/ciphers","version":"0.1.1","_id":"@agntn/ciphers@0.1.1","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"pi":{"extensions":["./packages/pi/extensions/*.ts"]},"bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"dist":{"shasum":"e7e8ca9bed7360b6df3d25300823a0276d236561","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.1.1.tgz","fileCount":85,"integrity":"sha512-uuyIXKk8+rfs9UgIDW6/TtWdXgDEk/YG+gVDz/MNVDKSvwT0ps+Vl6RRvgT4hO0mgtKucJODme84/bw/Eq3+8g==","signatures":[{"sig":"MEUCIQCuwaUgQRLcq1RYJd2B4qtQw0TzKUhD4dz/JbCcnRUcXwIgXnOTOUnNNxm+r+WLFy2YKp9oj585O51hptR4iH83GxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340784},"type":"module","_from":"file:agntn-ciphers-0.1.1.tgz","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"scripts":{"dev":"obuild --stub","lint":"vp lint","test":"vp test","build":"obuild","check":"vp check","format":"vp fmt","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json","format:check":"vp fmt --check"},"_npmUser":{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"},"_resolved":"/tmp/aebdc7719b1113ebd22cabe3b82f0168/agntn-ciphers-0.1.1.tgz","_integrity":"sha512-uuyIXKk8+rfs9UgIDW6/TtWdXgDEk/YG+gVDz/MNVDKSvwT0ps+Vl6RRvgT4hO0mgtKucJODme84/bw/Eq3+8g==","_npmVersion":"12.0.2","description":"Unified educational and puzzle cipher library for agents","directories":{},"_nodeVersion":"26.7.0","dependencies":{"citty":"^0.2.2","consola":"^3.4.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","obuild":"^0.4.36","typebox":"^1.1.39","vite-plus":"0.2.9","typescript":"^6.0.3","@types/node":"latest","changelogen":"^0.6.2","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"tmp":"tmp/ciphers_0.1.1_1786717097303_0.08880282537348005","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@agntn/ciphers","version":"0.1.2","_id":"@agntn/ciphers@0.1.2","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"pi":{"extensions":["./packages/pi/extensions/*.ts"]},"bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"dist":{"shasum":"26038169b02923a34d6936998bbc6af0852b10c2","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.1.2.tgz","fileCount":85,"integrity":"sha512-jnge/aVt7xLEisBqwQIiifCPvcIe4IkEkkCl9Vjp3CXhF/qpi9GPYS7iz48yUV8kyoDHa5O5JXoSQ8KllRc9GQ==","signatures":[{"sig":"MEQCIFYx3uuaAj4rLK922+PvXpsu+ocofHBw44HWp4l2M/QbAiA+0cC38rNI7udtDaruvHQpkvnTTXA2voWR14FibvfRPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340854},"type":"module","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"88f43654e0184a9971077a9fe1668a4ae375f464","scripts":{"dev":"obuild --stub","lint":"vp lint","test":"vp test","build":"obuild","check":"vp check","format":"vp fmt","prepack":"pnpm run build","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json","format:check":"vp fmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:36976e72-0ede-45c0-9506-3717485f4331"}},"_npmVersion":"11.12.1","description":"Unified educational and puzzle cipher library for agents","directories":{},"_nodeVersion":"25.9.0","dependencies":{"citty":"^0.2.2","consola":"^3.4.2"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsx":"^4.22.4","obuild":"^0.4.36","typebox":"^1.1.39","vite-plus":"0.2.9","typescript":"^6.0.3","@types/node":"latest","changelogen":"^0.6.2","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"tmp":"tmp/ciphers_0.1.2_1786717262131_0.5688547279090794","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@agntn/ciphers","version":"0.1.4","_id":"@agntn/ciphers@0.1.4","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"homepage":"https://github.com/agntn/ciphers#readme","bugs":{"url":"https://github.com/agntn/ciphers/issues"},"pi":{"extensions":["./packages/pi/extensions/*.ts"]},"bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"dist":{"shasum":"b5801c517756a3bd76417b5724b95b6b1f8e3d06","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.1.4.tgz","fileCount":102,"integrity":"sha512-6ywFkzSxzZxk5RtNP2SVg3Y7Pk7nMFMPSHnAf4M4J2oU3KQD76tzyyfVbYKKpfRHSWc5nyZkbxlji+kCTLjZQw==","signatures":[{"sig":"MEYCIQCCD+Fmn9nuaXqZC1duKfJOCzdpB7VKNAgvqNHdtruJXgIhAMVcwksgCRvkR+CWbpZsuFRjGWivnrPQdbGUYtKRI7S6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agntn%2fciphers@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1389802},"type":"module","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"174e65f3f91f718b5320dac85dfba58fc8a29206","scripts":{"dev":"obuild --stub","lint":"vp lint","test":"vp test","build":"obuild","check":"vp check","format":"vp fmt","prepack":"pnpm run build","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json","format:check":"vp fmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:36976e72-0ede-45c0-9506-3717485f4331"}},"repository":{"url":"git+https://github.com/agntn/ciphers.git","type":"git"},"_npmVersion":"11.12.1","description":"Unified educational and puzzle cipher library for agents","directories":{},"_nodeVersion":"25.9.0","dependencies":{"citty":"^0.2.2","consola":"^3.4.2","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsx":"^4.22.4","obuild":"^0.4.36","typebox":"^1.1.39","vite-plus":"0.2.9","typescript":"^6.0.3","@types/node":"latest","changelogen":"^0.6.2","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"tmp":"tmp/ciphers_0.1.4_1786970098350_0.6636567176022015","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@agntn/ciphers","version":"0.1.6","_id":"@agntn/ciphers@0.1.6","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"homepage":"https://github.com/agntn/ciphers#readme","bugs":{"url":"https://github.com/agntn/ciphers/issues"},"pi":{"extensions":["./packages/pi/extensions/*.ts"]},"bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"dist":{"shasum":"a35738f78a0898348326d879f6e993a0b35869c2","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.1.6.tgz","fileCount":110,"integrity":"sha512-+H+yvVy91/NmXEac9tVOKKlNSZZ5nNXLZ0Yk1+s1haKSKR+Z6FKMcSCa3vtkAmSfMf41kPfzu4vW1aXtLvJM1g==","signatures":[{"sig":"MEUCIDw6UaW1uMuwHtkukCq/YX5HXEzPoQ+vwFuw/exWvO8MAiEAj/dJ4XeawdNfYvVOsbLeJJ15rzv5B/OpBp5t0qUhMJE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agntn%2fciphers@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1435163},"type":"module","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"af23d444c109e5ac9f3b74bc02b042344813936c","scripts":{"dev":"obuild --stub","lint":"vp lint --tsconfig ./tsconfig.lint.json","test":"vp test","build":"obuild","check":"pnpm run format:check && pnpm run lint && pnpm run typecheck","format":"vp fmt","prepack":"pnpm run build","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json && tsc --noEmit -p tsconfig.lint.json","test:packed":"node test/eval-packed.mjs","format:check":"vp fmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:36976e72-0ede-45c0-9506-3717485f4331"}},"repository":{"url":"git+https://github.com/agntn/ciphers.git","type":"git"},"_npmVersion":"11.12.1","description":"Unified educational and puzzle cipher library for agents","directories":{},"_nodeVersion":"25.9.0","dependencies":{"citty":"^0.2.2","consola":"^3.4.2","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsx":"^4.22.4","oxfmt":"0.64.0","obuild":"^0.4.36","oxlint":"1.79.0","typebox":"^1.1.39","@agntn/ox":"^0.1.0","vite-plus":"0.3.0","typescript":"^6.0.3","@types/node":"latest","changelogen":"^0.6.2","oxlint-tsgolint":"7.0.2001","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"tmp":"tmp/ciphers_0.1.6_1788114180165_0.2586176514744729","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@agntn/ciphers","version":"0.1.7","_id":"@agntn/ciphers@0.1.7","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"homepage":"https://github.com/agntn/ciphers#readme","bugs":{"url":"https://github.com/agntn/ciphers/issues"},"pi":{"extensions":["./packages/pi/extensions/*.ts"]},"bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"dist":{"shasum":"fd8bc706c5312e517bac251fb60817cf7e3bce73","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.1.7.tgz","fileCount":189,"integrity":"sha512-bnJKY2rXXbIQRUlcItgvXDnmV4mqXme2yFxWqFsiVY6RF8Qlfs38GnZqK3KtQA2HdMFBBMzXYXDNY9ez3BrHlg==","signatures":[{"sig":"MEUCICE/iIffIBLPbyEXEmobch9gbnBV5jI11tXnk4sAhDpUAiEAkYxr72aFzf4bD038qXkiSn04gnUKpIZWTEvbOgcKm9c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDk00K50fpxwOmX+NbHwLes63PgO3U8JWl5355o8TVEnwIhAJwga9sZOltf1dhsV6hu5E9syot3GuPG8egOSfiP6DY2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agntn%2fciphers@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2658055},"type":"module","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"1e022a581972b71fd3e3b2dfc3e217b8e346accc","scripts":{"dev":"obuild --stub","docs":"pnpm --dir docs dev","lint":"vp lint --tsconfig ./tsconfig.lint.json","test":"vp test","build":"obuild","check":"pnpm run format:check && pnpm run lint && pnpm run typecheck","format":"vp fmt","prepack":"pnpm run build","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json && tsc --noEmit -p tsconfig.lint.json","test:packed":"node test/eval-packed.mjs","format:check":"vp fmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:36976e72-0ede-45c0-9506-3717485f4331"}},"repository":{"url":"git+https://github.com/agntn/ciphers.git","type":"git"},"_npmVersion":"11.12.1","description":"Unified educational and puzzle cipher library for agents","directories":{},"sideEffects":["./dist/cli.mjs"],"_nodeVersion":"25.9.0","dependencies":{"citty":"^0.2.2","consola":"^3.4.2","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsx":"^4.22.4","oxfmt":"0.64.0","obuild":"^0.4.36","oxlint":"1.79.0","typebox":"^1.1.39","@agntn/ox":"^0.1.0","vite-plus":"0.3.0","typescript":"^6.0.3","@types/node":"latest","changelogen":"^0.6.2","oxlint-tsgolint":"7.0.2001","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"tmp":"tmp/ciphers_0.1.7_1789575798863_0.260540506231282","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@agntn/ciphers","version":"0.1.8","_id":"@agntn/ciphers@0.1.8","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"homepage":"https://github.com/agntn/ciphers#readme","bugs":{"url":"https://github.com/agntn/ciphers/issues"},"pi":{"extensions":["./packages/pi/extensions/*.ts"]},"bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"dist":{"shasum":"6b54a72bfe6411c7b474bc6a18cd8fde9e1e586c","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.1.8.tgz","fileCount":190,"integrity":"sha512-xoOT1y+i/3BJX9it4KlxObFDSt5rVGdpY+KYsu0r28Pf5iLgEuUnd1pJjXsA/3L1Dqhye+cpTmnrVneGGywHBw==","signatures":[{"sig":"MEQCIDVxU16I0hUhyejZBBCWlAkruwybQIAOXBUwWGkz5G7iAiAeCbp1TatAegdPUsx14K5zUlaXWytnDR09JeaRbT+xKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC91Q42X/t2dF9DQywLaZXA0vDRfl5N2K2rj1xUosZ8fwIhAPjo1O2+QqaKCikhLPTjPavvnDJL6vUMDDJziFsZnvBT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agntn%2fciphers@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2679810},"type":"module","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"0af87faf2e193fc4cabe192ff7f82c16e7076640","scripts":{"dev":"obuild --stub","docs":"pnpm --dir docs dev","lint":"vp lint --tsconfig ./tsconfig.lint.json","test":"vp test","build":"obuild","check":"pnpm run format:check && pnpm run lint && pnpm run typecheck","format":"vp fmt","prepack":"pnpm run build","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json && tsc --noEmit -p tsconfig.lint.json","test:packed":"node test/eval-packed.mjs","format:check":"vp fmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:36976e72-0ede-45c0-9506-3717485f4331"}},"repository":{"url":"git+https://github.com/agntn/ciphers.git","type":"git"},"_npmVersion":"11.12.1","description":"Unified educational and puzzle cipher library for agents","directories":{},"sideEffects":["./dist/cli.mjs"],"_nodeVersion":"25.9.0","dependencies":{"citty":"0.2.2","consola":"3.4.2","@modelcontextprotocol/sdk":"1.30.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsx":"4.22.4","oxfmt":"0.68.0","obuild":"0.4.36","oxlint":"1.83.0","typebox":"1.1.39","@agntn/ox":"0.1.0","vite-plus":"0.3.0","typescript":"6.0.3","@types/node":"latest","changelogen":"0.6.2","oxlint-tsgolint":"7.0.2001","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"tmp":"tmp/ciphers_0.1.8_1789754316044_0.1448761192429111","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@agntn/ciphers","version":"0.1.9","_id":"@agntn/ciphers@0.1.9","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"homepage":"https://ciphers.agntn.dev","bugs":{"url":"https://github.com/agntn/ciphers/issues"},"pi":{"image":"https://ciphers.agntn.dev/image.png","extensions":["./packages/pi/extensions/*.ts"]},"bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"dist":{"shasum":"334183b636d0711ce99b7182c3bea0125f44d305","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.1.9.tgz","fileCount":192,"integrity":"sha512-S0IPuY9Rp0i+N16D7bO0y4/e8PKIbiIN12B1E5VQMF1/EE47c2ymmrfr1KguQTbIFIQLJxOM7WLMUPRSoyCQng==","signatures":[{"sig":"MEUCICRU/60P82fRXTawuqGHuNCPdhrlEApmS3vEgQtWCxfRAiEAiGS8Rm7hKeA/UBeaZ1BS1XV0+SQFic2hvhUo82P6TWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDL5XWzFsaFyAN53OM51p/1ZEfE+M5m3g+bWidfmJsfxgIhALvZLJOzB0xnB4hwtKbWeJtGay5kmy1w2fiIbXTD4sJY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agntn%2fciphers@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2583037},"type":"module","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"b49ddd5c0c0f16754a3283a0253209555a9e9114","scripts":{"dev":"obuild --stub","docs":"pnpm --dir docs dev","lint":"vp lint --tsconfig ./tsconfig.lint.json","test":"vp test","build":"obuild","check":"pnpm run format:check && pnpm run lint && pnpm run typecheck","format":"vp fmt","prepack":"pnpm run build","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json && tsc --noEmit -p tsconfig.lint.json","test:packed":"node test/eval-packed.mjs","format:check":"vp fmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:36976e72-0ede-45c0-9506-3717485f4331"}},"repository":{"url":"git+https://github.com/agntn/ciphers.git","type":"git"},"_npmVersion":"11.12.1","description":"Unified educational and puzzle cipher library for agents","directories":{},"sideEffects":["./dist/cli.mjs"],"_nodeVersion":"25.9.0","dependencies":{"citty":"0.2.2","consola":"3.4.2","@modelcontextprotocol/sdk":"1.30.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsx":"4.22.5","oxfmt":"0.68.0","obuild":"0.4.40","oxlint":"1.83.0","typebox":"1.1.39","@agntn/ox":"0.1.0","vite-plus":"0.3.2","typescript":"6.0.3","@types/node":"latest","changelogen":"0.6.2","oxlint-tsgolint":"7.0.2001","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"tmp":"tmp/ciphers_0.1.9_1789834539717_0.8946403121916993","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"pi":{"image":"https://ciphers.agntn.dev/image.png","extensions":["./packages/pi/extensions/*.ts"]},"_id":"@agntn/ciphers@0.2.0","bin":{"ciphers":"dist/cli.mjs"},"omp":{"extensions":["./packages/omp/extensions/ciphers.ts"]},"bugs":{"url":"https://github.com/agntn/ciphers/issues"},"dist":{"shasum":"2809a2434c18084f16aa724360ac6114c881a4ad","tarball":"https://registry.npmjs.org/@agntn/ciphers/-/ciphers-0.2.0.tgz","fileCount":49,"integrity":"sha512-kIWMJHslqAjuiynmvzu0lvI4xTfyDKdh/72DmI0Ho6nkIoLze/SZN2Y3/E2TfscLIXLopF54zCPK5mm+at2L/Q==","signatures":[{"sig":"MEUCIGcH9wNq+nvOB5yJnkYy1uvXZvenb0TrfDLnjLMN9uouAiEArjvfAaEG8eVydG9AEgPOsX5AYduHDP59xYyr5aD/9og=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDIH8N+2VmE9BVAc5wSFeYVHL1LJx+0V09fApLor7UFbwIgYY7H6MyQWBMHUENXA6f/FN2CnroDFZxLBlgx3k57ckM="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agntn%2fciphers@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1130495},"name":"@agntn/ciphers","type":"module","engines":{"node":">=25"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"9fd3b35a1d349ebcbbd070dc2a963bd33f13c5f1","license":"MIT","scripts":{"dev":"obuild --stub","docs":"pnpm --dir docs dev","lint":"vp lint --tsconfig ./tsconfig.lint.json","test":"vp test","build":"obuild","check":"pnpm run format:check && pnpm run lint && pnpm run typecheck","format":"vp fmt","prepack":"pnpm run build","release":"pnpm test && pnpm build && changelogen --release --push","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.omp.json && tsc --noEmit -p tsconfig.lint.json","test:packed":"node test/eval-packed.mjs","format:check":"vp fmt --check"},"version":"0.2.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:36976e72-0ede-45c0-9506-3717485f4331"}},"homepage":"https://ciphers.agntn.dev","repository":{"url":"git+https://github.com/agntn/ciphers.git","type":"git"},"_npmVersion":"11.12.1","description":"Unified educational and puzzle cipher library for agents","directories":{},"maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"sideEffects":["./dist/cli.mjs"],"_nodeVersion":"25.9.0","dependencies":{"citty":"0.2.2","consola":"3.4.2","@modelcontextprotocol/sdk":"1.30.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsx":"4.22.5","oxfmt":"0.68.0","obuild":"0.4.40","oxlint":"1.83.0","typebox":"1.1.39","@agntn/ox":"0.1.0","vite-plus":"0.3.2","typescript":"6.0.3","@types/node":"latest","changelogen":"0.6.2","oxlint-tsgolint":"7.0.2001","@oh-my-pi/omptype":"17.2.12","@earendil-works/pi-tui":"latest","@oh-my-pi/pi-coding-agent":"17.2.12","@earendil-works/pi-coding-agent":"latest"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ciphers_0.2.0_1790196209399_0.44382265720338254"}}},"time":{"created":"2026-08-14T14:18:17.139Z","modified":"2026-09-23T20:43:29.871Z","0.1.1":"2026-08-14T14:18:17.462Z","0.1.2":"2026-08-14T14:21:02.271Z","0.1.4":"2026-08-17T12:34:58.502Z","0.1.6":"2026-08-30T18:23:00.383Z","0.1.7":"2026-09-16T16:23:18.976Z","0.1.8":"2026-09-18T17:58:36.142Z","0.1.9":"2026-09-19T16:15:39.835Z","0.2.0":"2026-09-23T20:43:29.509Z"},"bugs":{"url":"https://github.com/agntn/ciphers/issues"},"homepage":"https://ciphers.agntn.dev","repository":{"url":"git+https://github.com/agntn/ciphers.git","type":"git"},"description":"Unified educational and puzzle cipher library for agents","maintainers":[{"name":"oritwoen","email":"dominik.opyd+1@gmail.com"}],"readme":"# @agntn/ciphers\n\n[![npm version](https://npmx.dev/api/registry/badge/version/@agntn/ciphers)](https://npmx.dev/package/@agntn/ciphers)\n[![npm downloads](https://npmx.dev/api/registry/badge/downloads/@agntn/ciphers)](https://npmx.dev/package/@agntn/ciphers)\n[![license](https://npmx.dev/api/registry/badge/license/@agntn/ciphers)](https://npmx.dev/package/@agntn/ciphers)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/agntn/ciphers)\n\n🔐 Twenty classical ciphers, one call. `ATTACK AT DAWN` goes in, `DWWDFN DW GDZQ` comes out, and the way back is the same call with `decode`. Terminal, TypeScript, agent or browser tab, and nothing ever leaves the machine.\n\n## Why?\n\nThe puzzle says the answer is in a Vigenère, so you open a cipher site. The key field wants uppercase, J quietly became I, and the third tab does Playfair differently than the second one. Now hand that to an agent and it will do the Vigenère in its head and be wrong from the fourth letter on, confidently. So: one `encode` and one `decode` with the same options everywhere, and five tools a model can call instead of counting on its fingers.\n\nDocs, and a playground where the library runs in your browser: [ciphers.agntn.dev](https://ciphers.agntn.dev).\n\n## ✨ Features\n\n- 🔡 **Twenty ciphers.** Caesar, ROT13, ROT47, Atbash, Vigenère, Beaufort, Autokey, Trithemius, Alberti, rail fence, affine, Playfair, Polybius, Morse, Bacon, tap code, columnar, ADFGVX, bifid and Enigma M3.\n- 🔁 **Same call on all of them.** `create('vigenere').encode(text, { key })`, swap the name and the options, and the result says which cipher, which operation and which options it actually used.\n- 🔨 **Brute force built in.** All 25 Caesar shifts in one command, so nobody has to try them by hand ever again.\n- 📊 **Frequencies and the index of coincidence.** Tells you whether it's one alphabet or several before you burn an hour on the wrong attack. English, Polish and Japanese romaji reference orders.\n- 🧭 **Ciphers describe themselves.** `info()` has the family, the options, the keyspace and whether encode and decode are the same thing, and the CLI, the tools and the playground all read it from there.\n- 🖥️ **CLI, library, MCP, Pi and OMP.** Five tools with one set of executors behind them, whichever one you're holding.\n- 🌐 **Runs in the browser too.** The playground imports the package into the page, nothing is posted anywhere.\n- 🧱 **Bounded on purpose.** Text and keys have a maximum length in every tool schema, so a model can't hand the process a novel to shift.\n- 🧩 **Your cipher in one class.** Extend `Cipher`, `register()` it, and `create()` finds it like any built-in.\n\n## 📦 Install\n\n```bash\npnpm add @agntn/ciphers\n```\n\nNode.js 25 or newer. No native anything, no network, no keys to sign up for, it's all string work.\n\n## 🚀 First call\n\n```bash\nnpx @agntn/ciphers encode caesar \"ATTACK AT DAWN\" --shift 3\n```\n\n```\nDWWDFN DW GDZQ\n```\n\nCipher name, text, the flags that cipher needs, and only the result on stdout, so it pipes. Got the ciphertext but not the shift?\n\n```bash\nciphers brute \"DWWDFN DW GDZQ\"\n```\n\n```\nℹ Caesar brute-force (shift 1-25):\n\n  shift= 1 → CVVCEM CV FCYP\n  shift= 2 → BUUBDL BU EBXO\n  shift= 3 → ATTACK AT DAWN\n  shift= 4 → ZSSZBJ ZS CZVM\n  shift= 5 → YRRYAI YR BYUL\n  shift= 6 → XQQXZH XQ AXTK\n  shift= 7 → WPPWYG WP ZWSJ\n  shift= 8 → VOOVXF VO YVRI\n  shift= 9 → UNNUWE UN XUQH\n  shift=10 → TMMTVD TM WTPG\n  shift=11 → SLLSUC SL VSOF\n  shift=12 → RKKRTB RK URNE\n  shift=13 → QJJQSA QJ TQMD\n  shift=14 → PIIPRZ PI SPLC\n  shift=15 → OHHOQY OH ROKB\n  shift=16 → NGGNPX NG QNJA\n  shift=17 → MFFMOW MF PMIZ\n  shift=18 → LEELNV LE OLHY\n  shift=19 → KDDKMU KD NKGX\n  shift=20 → JCCJLT JC MJFW\n  shift=21 → IBBIKS IB LIEV\n  shift=22 → HAAHJR HA KHDU\n  shift=23 → GZZGIQ GZ JGCT\n  shift=24 → FYYFHP FY IFBS\n  shift=25 → EXXEGO EX HEAR\n```\n\nShift 3, obviously. Shift 25 ends in HEAR, which is about as funny as a Caesar brute force gets ;)\n\nEnigma is in there too, the Wehrmacht M3 with rotors I, II and III and reflector B:\n\n```bash\nciphers encode enigma \"ATTACK AT DAWN\"\n```\n\n```\nBZHGNO CR RTCM\n```\n\n`decode` with the same settings gives the plaintext back, a rotor machine is its own inverse. The settings are `--positions`, `--rings` and `--plugboard`, and without them you get AAA, AAA and an empty board, the machine every tutorial starts on.\n\nA few more, same rules:\n\n```bash\nciphers encode vigenere \"ATTACK AT DAWN\" --key LEMON\nciphers decode atbash \"ZGGZXP ZG WZDM\"\nciphers encode tap-code \"HELP\"\nciphers frequency \"DWWDFN DW GDZQ\" --lang pl\nciphers info bifid\n```\n\n`frequency` prints the histogram and the index of coincidence. Around 0.065 it's one alphabet with English underneath (0.057 with Polish, about 0.082 with Japanese romaji), down near 0.038 the alphabet keeps changing and you want a key length, not a histogram.\n\n### Commands\n\n| Command     | What it does                                  | Example                                                |\n| ----------- | --------------------------------------------- | ------------------------------------------------------ |\n| `encode`    | Plaintext in, ciphertext out                  | `ciphers encode vigenere \"ATTACK AT DAWN\" --key LEMON` |\n| `decode`    | The other way, same flags                     | `ciphers decode vigenere \"LXFOPV EF RNHR\" --key LEMON` |\n| `brute`     | All 25 Caesar shifts                          | `ciphers brute \"DWWDFN DW GDZQ\"`                       |\n| `frequency` | Letter histogram and the index of coincidence | `ciphers frequency \"DWWDFN DW GDZQ\" --lang en`         |\n| `ciphers`   | Every cipher, `-v` adds the options           | `ciphers ciphers -v`                                   |\n| `info`      | One cipher's family, options and keyspace     | `ciphers info enigma`                                  |\n| `mcp`       | The MCP server on stdio                       | `ciphers mcp`                                          |\n\nA cipher's options are its flags: `--key`, `--transposition`, `--shift`, `--rails`, `--period`, `--letters`, `--a`, `--b` and the three Enigma ones. Which cipher takes which is `ciphers info <name>`, or the [CLI guide](https://ciphers.agntn.dev/guide/cli).\n\n## 🧠 Library\n\n```ts\nimport { create, resolveCipher, analyzeFrequency } from '@agntn/ciphers'\n\nconst vigenere = create('vigenere')\nconst { text } = vigenere.encode('ATTACK AT DAWN', { key: 'LEMON' })\nconsole.log(text) // LXFOPV EF RNHR\nconsole.log(vigenere.decode(text, { key: 'LEMON' }).text) // ATTACK AT DAWN\n\nconst enigma = resolveCipher('Enigma')\nconsole.log(enigma.encode('ATTACK AT DAWN').text) // BZHGNO CR RTCM\n\nconsole.log(analyzeFrequency('DWWDFN DW GDZQ', 'en')?.ic) // 0.13636363636363635\n```\n\nThat's nearly all of it. `create()` wants the exact registered name and hands you one cached instance per cipher. `resolveCipher()` lowercases and turns spaces into hyphens, so `'Rail Fence'` works and `'railfence'` doesn't, there is no fuzzy matching on purpose. Every result carries `cipher`, `operation` and the `options` that were applied, so one logged result is enough to repeat the call. Wrong key, shift out of range, unknown name: one `CipherError` family, and the message names the option or the cipher. The rest: [Transform](https://ciphers.agntn.dev/guide/transform), [Analysis](https://ciphers.agntn.dev/guide/analysis), [Custom ciphers](https://ciphers.agntn.dev/guide/custom).\n\n## 🔡 Ciphers\n\n| Cipher         | Family                      | Self-inverse | Options                                    |\n| -------------- | --------------------------- | :----------: | ------------------------------------------ |\n| **caesar**     | substitution-shift          |      ✗       | `--shift` (1-25, default 3)                |\n| **rot13**      | substitution-shift          |      ✓       | -                                          |\n| **rot47**      | substitution-shift          |      ✓       | -                                          |\n| **atbash**     | substitution-reflection     |      ✓       | -                                          |\n| **vigenere**   | polyalphabetic              |      ✗       | `--key` (required)                         |\n| **beaufort**   | polyalphabetic              |      ✓       | `--key` (required)                         |\n| **autokey**    | polyalphabetic              |      ✗       | `--key` (required)                         |\n| **trithemius** | polyalphabetic              |      ✗       | -                                          |\n| **alberti**    | polyalphabetic              |      ✗       | `--key`, `--period` (both required)        |\n| **rail-fence** | transposition               |      ✗       | `--rails` (default 3)                      |\n| **affine**     | substitution-multiplicative |      ✗       | `--a` (multiplier), `--b` (shift)          |\n| **playfair**   | digraph                     |      ✗       | `--key` (required)                         |\n| **polybius**   | fractionation               |      ✗       | `--key` (optional)                         |\n| **morse**      | fractionation               |      ✗       | -                                          |\n| **bacon**      | fractionation               |      ✗       | `--letters` (24 or 26, default 26)         |\n| **tap-code**   | fractionation               |      ✗       | -                                          |\n| **columnar**   | transposition               |      ✗       | `--key` (required)                         |\n| **adfgvx**     | fractionation               |      ✗       | `--key`, `--transposition` (both optional) |\n| **bifid**      | fractionation               |      ✗       | `--key` (optional), `--period` (default 5) |\n| **enigma**     | rotor                       |      ✓       | `--positions`, `--rings`, `--plugboard`    |\n\nPlayfair and Polybius fold J into I, tap code shares C and K, Bacon is the 26-letter variant unless `letters` says 24, and Alberti is a keyed disk that turns every `period` letters, not a reenactment of the original. One page per cipher, rules and vectors included: [Ciphers](https://ciphers.agntn.dev/ciphers).\n\n## 🤖 Agents\n\n```bash\nciphers mcp\npi install npm:@agntn/ciphers\nomp install @agntn/ciphers\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"ciphers\": { \"command\": \"npx\", \"args\": [\"-y\", \"@agntn/ciphers\", \"mcp\"] }\n  }\n}\n```\n\nFive tools, `cipher_encode`, `cipher_decode`, `cipher_brute_caesar`, `cipher_frequency` and `cipher_info`, the same five on all three. Arguments are checked against the schema before a cipher sees them, and a wrong key is a tool error with the reason in it, not a dead session. A model that doesn't know what Bifid takes calls `cipher_info` first, the encode and decode descriptions say so. And a decoded ciphertext is data: `IGNORE PREVIOUS INSTRUCTIONS` falling out of a ROT13 is the answer to the puzzle, not a new task. [Agents guide](https://ciphers.agntn.dev/guide/agents).\n\n## 🚫 What this does not do\n\nCryptography. Nothing in here keeps a secret from anyone with a laptop and an afternoon, and that's the point, it's for puzzles, CTFs and teaching. No hashing, no AES, no wallet keys. Keys and signatures are [@agntn/keys](https://github.com/agntn/keys), and even those want nothing to do with real money.\n\n## ➕ Adding a cipher\n\nWant a twenty-first? One class extending `Cipher` with `name()`, `info()`, `encode()` and `decode()`, then `register('name', YourCipher)` and `create('name')` works. A built-in goes into `builtins` instead, with a vector from somewhere other than the code under test. Walkthrough: [Custom ciphers](https://ciphers.agntn.dev/guide/custom).\n\n## 🛠️ Development\n\n```bash\npnpm install\npnpm dev          # obuild --stub\npnpm check        # oxfmt --check, oxlint, tsc over the library, the extensions and the tests\npnpm test         # vitest through vite-plus\npnpm build        # obuild\npnpm docs         # the Nuxt site, bundled straight from src/\n```\n\n## 💛 Thanks\n\nThis package gets built on tools that Anthropic and OpenAI hand to open source projects, [Claude for Open Source](https://claude.com/contact-sales/claude-for-oss) and [Codex for Open Source](https://developers.openai.com/community/codex-for-oss). Thank you <3\n\n## 📄 License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md","license":"MIT"}