{"_id":"hookforge-cli","_rev":"11-10b798d118dbd6bceaf40793138887c5","name":"hookforge-cli","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"hookforge-cli","version":"0.1.0","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.1.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"dist/cli.js"},"dist":{"shasum":"678caf7c9fcb35a5358eb8066ff2cb7b2c4ebedc","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.1.0.tgz","fileCount":31,"integrity":"sha512-coVN5xAA2GhWPo0gS5cm0Lt0DKaxnSj3QkrSPaP065kBXU0cD6oAyj3pUudyV4bketN3lOTk/GcPL29nzBFgkw==","signatures":[{"sig":"MEQCH0dq4129pCCL3M9ecntU3ZeXI0avu8FfNs0nuxDvNw8CIQCcIj27XQsKxB9+W4J6pQftCn//JDHZCrbRe25mc3XOeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144605},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"c250c85740751a679ec808fe352f9012be2d9b26","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","prepack":"npm run build"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.1.0_1789508232631_0.3709653769917498","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"hookforge-cli","version":"0.1.1","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.1.1","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"dist/cli.js","hookforge-cli":"dist/cli.js"},"dist":{"shasum":"9ad3bf783db95f7f20343cd8d67452bb369d14b9","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.1.1.tgz","fileCount":31,"integrity":"sha512-W1CQNcciCekU/lQNhtD+taY9F08gZWyyH/ads5YUpnJoNQD4JtZxU8b2PqQGRGnk2e9VNuN6We1i9z70qoQU6A==","signatures":[{"sig":"MEUCIQCBQxmozcxsWWFXP6s6woAOKNGj2ydp+/uwUx7eoWbwjgIgXq0LgnSZqk4nlLzRUUdlnVkBR4sCnHwqOjCVACFNk7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEmMhfA8tpf9J9VvkrUp04uUh5m3wIqJfJiZI1eQZBWIAiAVkZVU5ZsmmeX2+DjhbMxZxhz7awp1w1kVIbFBM95VLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144643},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"465c8916d771f1e3049aa505c3ac4f31b42cedde","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","prepack":"npm run build"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.1.1_1789508457640_0.3429173616181047","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"hookforge-cli","version":"0.2.0","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"dist/cli.js","hookforge-cli":"dist/cli.js"},"dist":{"shasum":"eb6ef754f0235039782435b4fb8a72e9306de5e6","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.0.tgz","fileCount":35,"integrity":"sha512-ABf+UlGFS+c3LNgDuc4YsijbdgbT8n1THk14H55zdsEkcmhdzkQpBokk051tXMNVOsElK0PmDYjoDWjU5HTuTw==","signatures":[{"sig":"MEQCIE6vIFIvpoF43oxANvPo52LK60tuH0FqrDM+DD+8h+sHAiBN9SBIQCa9w0PCwPijLSl65+eYVZ9GzjfQwsw+/KivOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFbzI5dd4aYYoPCdGXbe5u2ssDxrelrv2npEmnsA4BhHAiEApF+YD3rXINWKVJXBEqsgdGeAKxAh6mxVnsjsIIONwM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220463},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2007e184bfa77b69e2453b19ecb99959c10d0185","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","prepack":"npm run build"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.0_1789536033661_0.2503456571400884","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"hookforge-cli","version":"0.2.1","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.1","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"dist/cli.js","hookforge-cli":"dist/cli.js"},"dist":{"shasum":"8c0e14a7b96cde96ae5e1bf7a0fd55c98668f4b4","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.1.tgz","fileCount":35,"integrity":"sha512-aCXZrEDAnH/PME9k0jMmh3KPxvoX8XAUYNACefqu64TfSeCKqyWd5vmk5dDdINCN4e6QQIzXETM34LXk4/WMAQ==","signatures":[{"sig":"MEUCIQCYfY9YVEVVPbUn7G+EE6RY7oaJUe72GnczJTG/gSIWfAIgF043W1SmH6BieuhJZs0q03FW52zLOdf07JkbmN8r18c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGcOw6Z/9n5yay35ftG7r5hNwxurFzjJux0k0lPWcUEWAiBfYaOtVOk/C49eaaWnl/8L+GqFz3mNsHmgdybI7TIRUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220463},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2007e184bfa77b69e2453b19ecb99959c10d0185","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","prepack":"npm run build"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.1_1789536296003_0.5827282277581449","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"hookforge-cli","version":"0.2.2","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.2","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge-cli":"dist/cli.js"},"dist":{"shasum":"1d23d36734e77c4a2837b5bf99bfbc684a92335f","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.2.tgz","fileCount":35,"integrity":"sha512-2lBPUSiHgw6DntjU0omiQSLEVzFzKqidA6WWECGfeViex5dEdBFS2XDBAwxyu1B/DKwk97rvfXx+4XiWAcfUyw==","signatures":[{"sig":"MEQCIElFCwoXWIW9bL0zLBTqNHDNUJoEfgZELn+YeTlJ7C6vAiAUSe6jUBGWWy0Zx0f+fgmXdieGX8CFr4F1kCRgBHU1dg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDTF3wYxLOupwAReHYIMnK8sXptwvLVBJbjEuYwtg4DVwIgQwvx7XBEprly6a7w8lY3Lw6gO6uZOaHNT00PWAfjcsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220370},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d7a35dfc64c50b6d6ef9123cf9116acbb84846aa","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.2_1789536670322_0.8682492613867454","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"hookforge-cli","version":"0.2.3","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.3","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge-cli":"dist/cli.js"},"dist":{"shasum":"0717edc27c7b39b0ee941fcb838a788d43bc51c5","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.3.tgz","fileCount":35,"integrity":"sha512-k1KHt1JQQUD7GmflSQIsvbYJoNaoB+70a9/5TxYDYeSw22xYw6ObQRb+RkveFb8ozFcLbmOIQj+Jtod89XQQOg==","signatures":[{"sig":"MEQCIAEods7tlfprUBklLBOhBNkEXkKMHK156MI/m83UBZe/AiB83ontQFeieNEUOLCF5jmJNVYEYPAB1/wcD9Qd3TxOVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIExlmgGer4jS/p39SB0tOR646T3EYoKOr0yUg3v+FVl8AiEAol/RuLSwI/SMTakiWKkYLBztNMWWtydvbAMtlcZle+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220431},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d7a35dfc64c50b6d6ef9123cf9116acbb84846aa","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.3_1789536997667_0.4567429398479055","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"hookforge-cli","version":"0.2.4","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.4","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"dist/cli.js","hookforge-cli":"dist/cli.js"},"dist":{"shasum":"a7d013b1f9e010ddd0df842507069b5bf5f242ea","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.4.tgz","fileCount":35,"integrity":"sha512-HNc6OFPm+aiFnsKaJnIX2X4c+O/2BY6CrYs/bd9r+L8Tgz6ORLpuymOOlzrr0+ES5KT0fixtfAW2/4f7sQwa5A==","signatures":[{"sig":"MEQCIBW2GmUDsCBAe3bJSYROYbXEcD8mBYBk2guOzVnU4T8UAiB7oFSnke+G6g9MMMS97C9l2AZvHdntbjsMX6hHwePIPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDVzj5j4xA5uuxXUajlphVhTaJ0Y+pNy2EmE1SRF0u62AIhAKaSb67lxiBLXMC77k3f3xzi4YSM4R1G/SFUfq3X8JYY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220493},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d7a35dfc64c50b6d6ef9123cf9116acbb84846aa","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.4_1789537147229_0.705032600831204","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"hookforge-cli","version":"0.2.5","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.5","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"bin.js","hookforge-cli":"bin.js"},"dist":{"shasum":"ebff2a794a1573795c54afbdebc4515849cdd6a3","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.5.tgz","fileCount":36,"integrity":"sha512-6DdIcAN+VNq5iS3yn5nlSdxQxltbDGjy8I/ljvunfthLtwGYzr6ahGRsQ6eXn1w3bgpw2HwuYkBhnCbJV2CdlQ==","signatures":[{"sig":"MEQCIHaHGi8PgxHhcAuJT/LBemG9XVRhX3feNDttyle2/exBAiAYlc1OGtjd8olph0e6ufbEfxtKkh5lWcoBCBUXlOD0Fw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDptAfKWH54XbKSW6F6UQTbILt1OqbIFWN0Kg64I3Uk2gIhAP67D86yl1UqungH3v5G7o8cAhpjoQzXZKnRKkBz5aKP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220542},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d7a35dfc64c50b6d6ef9123cf9116acbb84846aa","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.5_1789537185971_0.809314971166643","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"hookforge-cli","version":"0.2.6","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.6","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"bin.js","hookforge-cli":"bin.js"},"dist":{"shasum":"1f14d7cae6d22d7694d5e822edc7c99a52767ccb","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.6.tgz","fileCount":36,"integrity":"sha512-JDpi3cfuI6laZfH5igM88OHNV1463KewE/O2oAB13sUzmr5vdHwAX0LLbdzKDPStncjAVEXh4qD9eBi/u8GTww==","signatures":[{"sig":"MEQCIFzxaxeoL+cUufdgj4CUCUSbNDIc7JEomTOlpz7ZQc7bAiBbgV6NTFXnMmvqTnNCo2q/+A6QW7YnLhUpnw/dY88f0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDvjCKwSWEvc/V/otl89q9rPoYGmYeB9Q6W6eZLLhn0dAIhAImmfd5uFy1uwE0ITnbJ2XNfJWFE5ZtOPrlcIX9t5Vqf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220537},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d7a35dfc64c50b6d6ef9123cf9116acbb84846aa","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.6_1789537229622_0.7204685091179592","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"hookforge-cli","version":"0.2.7","keywords":["webhooks","testing","stripe","github","hmac","cli"],"license":"MIT","_id":"hookforge-cli@0.2.7","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"hookforge":"bin.js","hookforge-cli":"bin.js"},"dist":{"shasum":"9f3f75817433708f9932d0dacc371d6d8dcb7c0d","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.2.7.tgz","fileCount":36,"integrity":"sha512-r58Kr3zyF3ZfvPvzITsuNuzBsEBUNrKLvz6MZzfpNksNoA6vJpQ1SCQuZL7v9hYjCSlo0JD7DxhMmiZjf+KU6A==","signatures":[{"sig":"MEUCIDEIjvqmX2geGJBZ10tSG5y3vDY7L2k6RkiF0P8ThEq7AiEA0hY5LqV1KBlvqIGY8VEttrYY0PNKYapuzXXwT4mDHfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICn9huBY0LOUDIsh75RPOTmEcnkvZClz2qEahYh7dE2/AiB8WLJtoVrQ5uDj5qxvvNhqTP4TTCoKMfuF8/UC7XybJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219925},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"14a2c58b0c28935b6eee8947f116b49bfc46f8e1","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup"},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hookforge-cli_0.2.7_1789537524709_0.3499914624217688","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"hookforge-cli@0.3.0","bin":{"hookforge":"bin.js","hookforge-cli":"bin.js"},"dist":{"shasum":"056d7b22a5aeb057649037d5ca415b8f078de1bf","tarball":"https://registry.npmjs.org/hookforge-cli/-/hookforge-cli-0.3.0.tgz","fileCount":42,"integrity":"sha512-tV4W0ecI435JaNje34aDbZv6V3V3bGvDMC6ORv2p4T7v7HyOxfuYTV8VGA4Efbsq0NfEirsdx6UuOD5kJ4OkxQ==","signatures":[{"sig":"MEUCIQDhFA9DxHQMN2ofkKPmbN4fWJPlSv21nGxFVeycOyEPoAIgR1z73U1Xd/iHiWx/AdMZjeD+dJHg6G3ay8gqqG7/SQU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC2z4jXLtD+wML5m6pou67UOBxcEFveqEksP+ZRR4+eBAiEAkIc2yrvDxgzRGq6U/7uRJPXrtoIwy3+cdtYapSvgHTU="}],"unpackedSize":339112},"main":"./dist/index.cjs","name":"hookforge-cli","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"c3ba00aea4e475be9e0ac3d5e220f55e25eb85c2","license":"MIT","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup"},"version":"0.3.0","_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"keywords":["webhooks","testing","stripe","github","hmac","cli"],"_npmVersion":"11.11.0","description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","directories":{},"maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/hookforge-cli_0.3.0_1789543383584_0.22036363776941892"}}},"time":{"created":"2026-09-15T21:37:12.457Z","modified":"2026-09-16T07:23:03.887Z","0.1.0":"2026-09-15T21:37:12.781Z","0.1.1":"2026-09-15T21:40:57.743Z","0.2.0":"2026-09-16T05:20:33.762Z","0.2.1":"2026-09-16T05:24:56.106Z","0.2.2":"2026-09-16T05:31:10.420Z","0.2.3":"2026-09-16T05:36:37.772Z","0.2.4":"2026-09-16T05:39:07.331Z","0.2.5":"2026-09-16T05:39:46.054Z","0.2.6":"2026-09-16T05:40:29.713Z","0.2.7":"2026-09-16T05:45:24.803Z","0.3.0":"2026-09-16T07:23:03.670Z"},"license":"MIT","keywords":["webhooks","testing","stripe","github","hmac","cli"],"description":"Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts.","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"readme":"# hookforge\n\n[![npm version](https://img.shields.io/npm/v/hookforge-cli.svg?style=flat-square)](https://www.npmjs.com/package/hookforge-cli)\n[![CI](https://github.com/x7ssss/hookforge/actions/workflows/ci.yml/badge.svg)](https://github.com/x7ssss/hookforge/actions/workflows/ci.yml)\n[![Zero Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen.svg?style=flat-square)](https://www.npmjs.com/package/hookforge-cli)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE)\n\n> **Provider-accurate webhook traffic on your laptop. Zero tunnels, zero accounts, 0 outbound network requests.**\n\n---\n\n## Terminal Demo\n\nTest legitimate webhook handlers and signature rejection logic in milliseconds:\n\n```text\n# 1. Normal delivery -> 200 OK\n$ npx hookforge-cli stripe payment_intent.succeeded --to http://localhost:3000/api/webhooks\n\n[2026-09-16T09:00:00.124Z] STRIPE payment_intent.succeeded\n  Target:       http://localhost:3000/api/webhooks\n  Payload Size: 541 bytes\n  HTTP Status:  200 OK\n\n# 2. Tampered body (1 byte mutated, original signature kept) -> 400 Bad Request\n$ npx hookforge-cli stripe payment_intent.succeeded --to http://localhost:3000/api/webhooks --tamper\n\n[2026-09-16T09:00:01.402Z] STRIPE payment_intent.succeeded [TAMPERED]\n  Target:       http://localhost:3000/api/webhooks\n  Payload Size: 541 bytes\n  HTTP Status:  400 Bad Request\n```\n\n---\n\n## The Problem\n\nTesting webhook handlers in local development is traditionally painful and fragile:\n\n* **Tunnel Churn & Broken Workflows:** Setting up ngrok, Cloudflare Tunnels, or local tunnels requires third-party accounts, auth tokens, and yields dynamic URLs that expire or rotate whenever your process restarts.\n* **The `express.json()` Re-Serialization Trap:** Webhook signature verification relies on byte-exact HMAC matching. If your middleware parses and re-stringifies JSON payloads before verification, subtle differences in whitespace, Unicode escapes, or object key sorting corrupt signatures.\n* **Testing Chaos & Edge Cases is Impossible:** How do you simulate a replay attack? An expired timestamp? A payload altered in transit? Cloud providers will not send malformed or replayed signatures on demand to your development environment.\n\n**hookforge** solves this by acting as a provider-accurate signing engine and chaos generator running directly inside your Node.js runtime or CLI.\n\n---\n\n## Why hookforge vs Vendor CLIs vs ngrok\n\n| Feature | hookforge | Vendor CLIs (`stripe-cli`, `gh`) | ngrok / Tunnels |\n| :--- | :--- | :--- | :--- |\n| **Network Requirement** | **100% Offline** (localhost only) | Requires active internet connection | Requires active internet connection |\n| **Third-Party Accounts** | **Zero accounts**, zero API keys | Requires dashboard login & token | Requires ngrok account & auth token |\n| **Multi-Provider** | **Unified** (Stripe, GitHub, Shopify, Slack, Paddle, Resend, Twilio, Svix) | Fragmented (separate CLI per vendor) | Agnostic tunnel (does not generate webhooks) |\n| **Signature Verification Testing** | **Native** (recreates exact HMAC signatures) | Generates valid signatures only | Passes cloud signatures through tunnel |\n| **Chaos & Attack Simulation** | **Built-in** (`--tamper`, `--replay`, `--skew`) | **None** (cannot send malformed traffic) | **None** (cannot simulate attacks) |\n| **CI / Automated Test Suitability** | **Instant** (`npm install`, runs in headless CI) | Complex (requires mock services / secrets) | Poor (requires tunnels and public listeners) |\n| **Runtime Dependencies** | **0 dependencies** (Node built-ins only) | Standalone binary or heavy packages | Heavy binary daemon |\n| **Startup Overhead** | **<50ms** | Variable (cloud authentication handshake) | Variable (tunnel negotiation handshake) |\n\n---\n\n## Installation & Quickstart\n\n### 1. Interactive Zero-Arg Wizard\n\nSimply run `hookforge` with no arguments in any interactive terminal to launch the zero-configuration interactive wizard powered by Node.js built-in `readline`:\n\n```bash\nhookforge\n# or via npx\nnpx hookforge-cli\n```\n\n```text\nhookforge - Interactive Webhook Wizard\n\nSelect Provider:\n  1) stripe\n  2) github\n  3) shopify\n  4) svix\n  5) slack\n  6) paddle\n  7) resend\n  8) twilio\n\nEnter provider [1-8 or name] (default: stripe): 6\n\nSelect Event for paddle:\n  1) subscription.created\n  2) transaction.completed\n\nEnter event [1-2 or custom] (default: subscription.created): 1\n\nTarget URL (default: http://localhost:3000/api/webhooks): \nSecret key (optional, default: pdl_ntfset_test): \nTamper test? (y/N): n\n\n[2026-09-16T10:00:00.000Z] PADDLE subscription.created\n  Target:       http://localhost:3000/api/webhooks\n  Payload Size: 620 bytes\n  HTTP Status:  200 OK\n```\n\n---\n\n### 2. Direct CLI Runner (No Installation Required)\n\nFire authentic, cryptographically signed webhook payloads at your local server using `npx`:\n\n```bash\n# Send a valid Stripe payment_intent.succeeded event\nnpx hookforge-cli stripe payment_intent.succeeded --to http://localhost:3000/api/webhooks\n\n# Send a Paddle subscription.created webhook\nnpx hookforge-cli paddle subscription.created --to http://localhost:3000/api/webhooks\n\n# Send a Resend email.delivered webhook (Svix standard)\nnpx hookforge-cli resend email.delivered --to http://localhost:3000/api/webhooks\n\n# Send a Twilio message.received webhook\nnpx hookforge-cli twilio message.received --to http://localhost:3000/api/webhooks\n\n# Send a Shopify orders/create webhook\nnpx hookforge-cli shopify orders/create --to http://localhost:3000/api/webhooks\n\n# Send a Slack app_mention webhook\nnpx hookforge-cli slack app_mention --to http://localhost:3000/api/webhooks\n\n# Tamper 1 byte in the body to verify your signature rejection logic (returns 400/401)\nnpx hookforge-cli standard user.created --to http://localhost:3000/api/webhooks --tamper\n\n# Replay an event with identical timestamp and signature to test idempotency\nnpx hookforge-cli github push --to http://localhost:3000/api/webhooks --replay\n```\n\n### 3. Global Installation\n\nInstall globally to use the convenient `hookforge` alias directly anywhere in your terminal:\n\n```bash\nnpm install -g hookforge-cli\n```\n\n> **Binary Invocation:** Both `npx hookforge-cli` and the global alias command `hookforge` (as well as `hookforge-cli`) invoke the underlying binary identically.\n\n```bash\n# Using the hookforge alias\nhookforge stripe payment_intent.succeeded --to http://localhost:3000/api/webhooks\n\n# Using the full hookforge-cli command\nhookforge-cli shopify orders/create --to http://localhost:3000/api/webhooks\n```\n\n---\n\n### 4. Custom Payloads & Custom Headers\n\n`hookforge` guarantees strict byte-for-byte cryptographic integrity: signatures are always calculated against the exact resolved payload bytes (custom or template) without JSON formatting, key sorting alterations, or whitespace normalization.\n\n#### Inline Raw JSON (`--data` / `-d`)\nPass an inline raw JSON string directly on the command line:\n\n```bash\nhookforge stripe customer.subscription.deleted \\\n  --to http://localhost:3000/api/webhooks \\\n  -d '{\"id\": \"sub_custom_123\", \"status\": \"canceled\"}'\n```\n\n#### Custom Payload Files (`--file` / `-f`)\nLoad payload bytes from a relative or absolute JSON file:\n\n```bash\n# Relative file path\nhookforge paddle subscription.created \\\n  --to http://localhost:3000/api/webhooks \\\n  -f ./payloads/paddle-event.json\n\n# Absolute file path\nhookforge github push \\\n  --to http://localhost:3000/api/webhooks \\\n  --file /var/data/custom-push.json\n```\n\n#### Multiple Custom HTTP Headers (`--header` / `-H`)\nProvide one or more custom HTTP headers (e.g. for authentication, routing, or environment flags):\n\n```bash\nhookforge twilio message.received \\\n  --to http://localhost:3000/api/webhooks \\\n  -H \"Authorization: Bearer test_api_token\" \\\n  -H \"X-Source: local-integration-test\" \\\n  -H \"X-Environment: development\"\n```\n\n#### Piping via Stdin\nPipe custom JSON payloads directly from files or other CLI utilities:\n\n```bash\n# Pipe custom payload from file (auto-detected when piped)\ncat custom-order.json | hookforge shopify orders/create --to http://localhost:3000/api/webhooks\n\n# Pipe custom payload using explicit stdin flag\necho '{\"action\": \"custom_event\"}' | hookforge github push --to http://localhost:3000/api/webhooks --data -\n```\n\n---\n\n### CLI Options\n\nBoth `hookforge` and `hookforge-cli` accept identical syntax and options:\n\n```text\nhookforge <provider> <event> --to <target_url> [options]\n# or\nnpx hookforge-cli <provider> <event> --to <target_url> [options]\n# or interactive zero-arg wizard:\nhookforge\n\nARGUMENTS:\n  <provider>            Provider name (stripe | github | shopify | svix | standard | slack | paddle | resend | twilio)\n  <event>               Event name (e.g. payment_intent.succeeded, push, orders/create, subscription.created, email.sent, message.received)\n\nOPTIONS:\n  --to <url>            Target URL to send webhook to (required in non-interactive mode)\n  --secret <str>        Secret used to sign the webhook (default: provider default)\n  --tamper              Mutate 1 byte in payload body to test signature rejection\n  --replay              Send webhook then replay identical payload and headers\n  --skew <seconds>      Recalculate signature with a stale timestamp (seconds ago)\n  -d, --data <json>     Custom JSON string payload (or '-' to read from stdin)\n  -f, --file <path>     Path to custom JSON payload file (relative or absolute)\n  -H, --header <str>    Custom HTTP header (can be repeated, e.g. -H \"X-Custom: 123\")\n  -h, --help            Show help message\n  -v, --version         Show version\n```\n\n---\n\n## Programmatic API\n\nInstall `hookforge-cli` as a development dependency:\n\n```bash\nnpm install --save-dev hookforge-cli\n```\n\n### 1. `sign(provider, options)`\n\nA pure function that constructs provider-compliant headers and returns the payload strictly as a `Buffer` to guarantee byte integrity.\n\n```typescript\nimport { sign } from 'hookforge-cli';\n\n// Sign with realistic default fixtures\nconst payload = sign('stripe', {\n  event: 'payment_intent.succeeded',\n  secret: 'whsec_custom_secret',\n});\n\nconsole.log(payload.headers['stripe-signature']);\n// => \"t=1718000000,v1=9b1d...\"\nconsole.log(payload.rawBody);\n// => <Buffer 7b 22 69 64 22 3a 20 ...>\n```\n\n### 2. `send(url, signedPayload)`\n\nA lightweight wrapper around native `fetch` that POSTs the raw `Buffer` with an explicit `Content-Length` header without modifying bytes or encodings:\n\n```typescript\nimport { sign, send } from 'hookforge-cli';\n\nconst signed = sign('shopify');\n\n// Both parameter orders supported:\nconst res = await send('http://localhost:3000/api/webhooks', signed);\nconsole.log(res.status); // 200\n```\n\n### 3. Chaos Engineering: `tamper`, `replay`, and `skew`\n\nSimulate production edge cases, replay attacks, and network tampering in your automated integration tests:\n\n```typescript\nimport { sign, send, chaos } from 'hookforge-cli';\n\nconst original = sign('standard', { event: 'user.created' });\n\n// 1. Tamper: Mutates 1 byte in rawBody without changing signature headers\nconst tampered = chaos.tamper(original);\nconst resTampered = await send('http://localhost:3000/api/webhooks', tampered);\n// Expect your receiver to return 400 Bad Request!\n\n// 2. Replay: Preserves identical timestamp and signature headers\nconst replayed = chaos.replay(original);\nconst resReplayed = await send('http://localhost:3000/api/webhooks', replayed);\n// Test your database deduplication / idempotency key handling!\n\n// 3. Skew: Recalculates signature with an expired timestamp (e.g. 10 minutes ago)\nconst expired = chaos.skew(original, 600);\nconst resExpired = await send('http://localhost:3000/api/webhooks', expired);\n// Verify your timestamp tolerance guardrails!\n```\n\n### 4. `verify(payload, options?)`\n\nVerify cryptographic HMAC signatures in your test suite using constant-time comparisons across all supported providers:\n\n```typescript\nimport { sign, verify } from 'hookforge-cli';\n\nconst signed = sign('github', { event: 'push' });\nconst isValid = verify(signed); // true\n\nconst tampered = chaos.tamper(signed);\nconst isTamperedValid = verify(tampered); // false\n```\n\n---\n\n## Supported Providers\n\n| Provider | Signature Header | Signing Algorithm | Ecosystem Compatibility |\n| :--- | :--- | :--- | :--- |\n| **Stripe** | `stripe-signature` | HMAC-SHA256 hex (`t=${t},v1=${hex}`) over `${t}.${body}` | Stripe Payments, Billing, Connect |\n| **GitHub** | `x-hub-signature-256` | HMAC-SHA256 hex (`sha256=${hex}`) over raw body bytes | GitHub Apps, Webhooks, Actions |\n| **Standard / Svix** | `webhook-signature` | HMAC-SHA256 base64 (`v1,${base64}`) over `${id}.${t}.${body}` | Svix, Clerk, Linear, Supabase |\n| **Shopify** | `X-Shopify-Hmac-Sha256` | HMAC-SHA256 base64 digest over raw payload body | Shopify Apps, Checkout, Orders |\n| **Slack** | `X-Slack-Signature` | HMAC-SHA256 hex (`v0=${hex}`) over `v0:${timestamp}:${body}` | Slack Apps, Bolt, Events API |\n| **Paddle** | `Paddle-Signature` | HMAC-SHA256 hex (`ts=${ts};h1=${hex}`) over `${ts}:${body}` | Paddle Billing, Subscriptions, Checkout |\n| **Resend** | `svix-signature` | HMAC-SHA256 base64 (`v1,${base64}`) over `${id}.${timestamp}.${body}` | Resend Transactional Email (Svix Standard) |\n| **Twilio** | `X-Twilio-Signature` | HMAC-SHA1 base64 digest over `${targetUrl}${sortedFormOrBodyParams}` | Twilio SMS, Voice, Messaging Webhooks |\n\n---\n\n## Architecture & Zero-Dependency Guarantee\n\n* **Zero Runtime Dependencies:** `hookforge-cli` contains **0** production dependencies. It relies exclusively on Node.js built-ins (`node:crypto`, `node:util`) and global web standards (`fetch`, `Headers`, `Response`).\n* **Microsecond Startup:** No heavy CLI frameworks or bloated vendor SDKs to load before sending your event.\n* **Strict Byte Integrity:** The payload is held strictly as an immutable `Buffer`. We never re-stringify, format, or normalize JSON across signing and dispatch.\n* **Dual ESM + CommonJS:** Works seamlessly in modern ES modules (`import`) and legacy CommonJS (`require`).\n\n---\n\n## License\n\n[MIT](LICENSE) © 2026 hookforge contributors\n","readmeFilename":"README.md"}