{"_id":"ddlforge","_rev":"20-f7af64640ed56858c72b65cab1e993a5","name":"ddlforge","dist-tags":{"latest":"2.0.1"},"versions":{"0.1.0":{"name":"ddlforge","version":"0.1.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.1.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"404d8769bbabf1128e590ab5a01cc213080fe618","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.1.0.tgz","fileCount":83,"integrity":"sha512-CnqKK4sOInZwAX1aUAeoUxLh1GgJpLrGw7WtYC8w2q36SoODFaXvmskocgR/HX1AW0ODz64EMNddhCZ+OKTMNw==","signatures":[{"sig":"MEQCIQCsHrGwit2m49FAslZjbQn+42+lFrQW5B6oCcSOLctW/AIfDlj9//Uzqj4tZGYter8sBq1dyPsQ+5Eq/T5NRbx1NQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178513},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"195859e0d538f7cb4cc3b0545d1c55b79cfc044e","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.1.0_1789554046433_0.48402892722667246","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"ddlforge","version":"0.1.1","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.1.1","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"60ca0adab52127243d5458541f8ec6203fba8c0d","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.1.1.tgz","fileCount":83,"integrity":"sha512-cxYlvfsSTD0id/co4FzeS8wiwvaCYTU1bTM7Evbpf+V1mbuhn/9ysE7Sn3fV49jlRnZAvRQgVnRglApq0ucK7A==","signatures":[{"sig":"MEQCICOWPSHcEzwPe6Y1Mdsf4DoUS20jd40NhfoH2ryZuWafAiBP7jJuAIU/l1YETxGnhnd/bPCYG0vPjy72w23PDztAJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC7Lg/ctxissRjIYwB3bM/HWkvt8MHbiE/H1OQG2dSVxgIgNvcS5btKmDSwCA2/xMzR8N3ndPo95KctsuvLudn6wxY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178429},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"ee91540d7f162591cf22d8f1db3e1f44f56858ef","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.1.1_1789555318353_0.7367517689049257","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"ddlforge","version":"0.2.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.2.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"41ae8f2b0957b235194ec895f7a497999986f076","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.2.0.tgz","fileCount":95,"integrity":"sha512-6U6HneRtrRRfGgW8ccqwpucZyiiehv5y+yiU4eFD6oMI6lnr55i/AS2gOIZtCKoLIiwz3fhWbyoAzQLerlXW0A==","signatures":[{"sig":"MEQCIAg9TMjDF2G6NpabIM+y+sq/ECaqI+U2ySUSEgTXCW0eAiAS6oh5scFaPExe73fogQ2/7UHgaq4pBT2FyFU01oRHwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICu1pY8GzK69Vm7drsqLgGErszbX69vW4QHMay8qHCMSAiEA+rBoXDZg9iXGTmalZUg/2+qPwpbLs3PxzzArHWBb6Us=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259974},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"8a7ab57cf8548e35a49557cc32c56fa3ea8ae394","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.2.0_1789566747910_0.6283129008142461","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"ddlforge","version":"0.2.1","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.2.1","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"2e97feab7976e4b7aec6aebf0d8a743f137d64aa","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.2.1.tgz","fileCount":95,"integrity":"sha512-QeRjfkhRvO40MZgFIWbCJAF7OBofXgzHYxfyIE45EgC3tSa5CvblMhElM+Eqc0j7BxrQ8zXrmJGB6rC8sPnXOA==","signatures":[{"sig":"MEYCIQCzXiJsx7iEm7QaOLWT0JOWwP6KIPK+xy4NWgMYRVmmUQIhAJArCWG5vsbxowqX77RKEEKot6zPTwtAzPe4+xIWcBaP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAOz37eP2FgjNZBNsnCBrzefXKXleoO77iFFSZF/Cg8nAiBqb2gJZdJYyVFy1vT5qMcdq/0I0Dnqdo4y1rsiGPl2bg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269117},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"e7707a8a0aeb03372cfb6565cb79d75b89557e80","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.2.1_1789571653982_0.2513606022483408","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"ddlforge","version":"0.3.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.3.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"147a73a45951a2f50fd6950bc4becdda786b1a23","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.3.0.tgz","fileCount":111,"integrity":"sha512-Z+poqZkoRs4nBjgvkvh0Ayr7qqf1W+Ahj/gVPPGQrELl/4Qvod/9Pwf7Gy4ALk2fAraf0sH7a9CRisPWJ7pzoA==","signatures":[{"sig":"MEYCIQCq6yyl3Gv6zkzrvet4UMhx5F2xWY3aALT0j7ojyKchPgIhALNtL27zo5/nLxsyZx5t5mFikuekhzIBcB+PS49XLB1F","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHMe93VfrCMMoa6oEsqxbGh7LGZ896qvPypuS2xHXWP4AiAIvI+urxh5voJKbDvTYZI/dgAVqWDyVteiXSfSRundxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":305512},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"a62a83e9fbe42ea89ab2e2453a6ca6d501ba487e","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.3.0_1789586126474_0.7222980101084284","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"ddlforge","version":"0.5.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.5.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"9cba3f1a59b168a178b26d346c40948da5f24d0e","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.5.0.tgz","fileCount":115,"integrity":"sha512-eAWcLlTNVanfyg2pnQsNCbIY2jm1V7pu22iZGoc85IrRCypKyzMw51aGz+4uaTYs4666UmFRZpf+XL7tiv4LUg==","signatures":[{"sig":"MEYCIQDDq2koboZ4do9fDTSrvEnAS91ynr3qaq0BKvrhF3JrfwIhAMroRJLrMLeIAjbR9kHABjK4Q7lZLVkbWsXGttYvvjYO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDMcUfZpM5C5TPHywim2T3ASp09OsHEkztqWUpqwSPpBAiEA9dMy66Lx42arg0wyp0c4aPvEo+9h0SAvC34GLcVVY4M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344547},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"7617c01cd43c5c11647bc51b61451680b9d25f24","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.5.0_1789587602081_0.6524684241136567","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"ddlforge","version":"0.6.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.6.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"e874576ea107397122aa7e6624b0a1770d447a92","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.6.0.tgz","fileCount":163,"integrity":"sha512-nUu496S+zjIFotYe849pALt2F6H774CVmEDFvM4dmCbfx+dXEVKCCqJedTUCP9Az65pcj0cX4sJSEDnN0v5dCw==","signatures":[{"sig":"MEQCIGd6Dor1PP8i4qpkE+P7rjlqcozG8CGYlQSJ+X/jjqDMAiBQSXqNEiZR7U4qmdBU2rcMg6f6edFtXmGj089wzH2ZvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCXI9v7tIHcav1PtBNjlMcd4mPRbE6saa9p2W22b/1UBQIgFL8ZJ1U5Mi+rVT+t4bXeVXfHQAgJ5D7VHWPtUXAyEZk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":496631},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"061b238c321936b2ea0079bd5ac6cc08b90b3656","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.6.0_1789735972474_0.655436015267884","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"ddlforge","version":"0.7.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.7.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"09a2a1d2f40a4ce821752120613a73c81254ddea","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.7.0.tgz","fileCount":183,"integrity":"sha512-fZ5BvT3K6OebnNsbak3/aU5MOgUBHhQ4k2fhchAo3Z6qpvD4OLHfs6DVdjTlMvYl4i230G3ZDEFi9nXxM+6XPg==","signatures":[{"sig":"MEUCIQCzFAH74z68XOlV1gwTwLqnObf8AejUyg5V8Le+Ii8I7QIgQfMI1h6p8uyNzlGhSMHywXA3AJMSw7YHqVV87cYzypI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICowJrMoEyxyDoFcoaR5oz1S2D8795SqTeL5JKrcbnITAiEA5WKbgV4jxjhJIf/paU8ARPf8MfriOfCZ/kYEaKPdcm0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":576899},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"6cfd5a134bc2138b57e4d297e3a0696a838d5e58","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.7.0_1789754018060_0.1204409661821717","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"ddlforge","version":"0.8.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.8.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"49a78a1f9f09985c7ee7fe846fe97dfa375e5d93","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.8.0.tgz","fileCount":199,"integrity":"sha512-lwcQUAo05BBkhSMqaTfaYoKNH4eHDE9wen22ViMpNXhbs1OXFRXL4Spjr1U+wAWOgbzOKf6BWbnovQwbGe8Kpg==","signatures":[{"sig":"MEUCIQCiZdSRZDUxvFh89ryIXw1sOEI4cvSrn9TvvLMc9/UemQIgUYUVVFeGOHgrlTiBcSrBEztRWxzSRUkt5IRB0F+/2c4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEtD+aW85I3oXoYnuScuBpslk7TuA29N+MPb+E4fW6kMAiBTCM+9jHuhKSX1Yu2HPQlcrwa5TEddYiioS7UnqmOTKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":627181},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"395e3379bc739b6cddc5ad30f7057fccb341e0ee","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.8.0_1789759316229_0.20664463604947536","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"ddlforge","version":"0.9.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@0.9.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"5e1e90456e33350e6d18c8c214e592b837a2cf1b","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-0.9.0.tgz","fileCount":219,"integrity":"sha512-whvG1lxK7Y14r/v/k34c3wUd/SY3S+RztKcCfc/s2QedzLPVLLQUzlDEEP10i6Ds2z2w9oceTxZpPTRlZss2fg==","signatures":[{"sig":"MEQCIFIHZWJIPOi08J5NGYr1o6Ge5L2EFh1tdwLh9ksncQLlAiAQRjWD0kRY+L4GBOKV6pHrwMiVWbSrGsHLnZRP+F35QQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAdd4S8vG/ucZ8Ops9d4wxm9cKM6QkuK9fNCi0a1A95UAiEA8OQTn7Grc131GY6FScSx/ltGuJfw3RZzWkipGDY0w80=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":695010},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"85b67a237a4b47ff26cf4fc0c147f87125e97668","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_0.9.0_1789795235303_0.4246486795042388","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"ddlforge","version":"1.0.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.0.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"90aa28f9ae7646f8f17db327e6af8f5dc0a65b9a","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.0.0.tgz","fileCount":227,"integrity":"sha512-+M+qsqnOIvLYFOpuoNufrt53EHav1vQY2xzE+AQJI5sre7WSE7z7IPkL3Ke5Ped7FGIpO57DtyF+ayplQXzYzw==","signatures":[{"sig":"MEUCIQC7y5GEBJZM/WAHly82SYXt47q3LbbEjODm2xPJ17McRAIgZLGID3eSrk+OLCqts99liSIs+RXTETDlEEAkf7wNBiE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDz1JhrRgd4Wd6bwFaBn6pyYiLzN0zbgVxpk/I0cL70+gIhANrL8vilvoJkjq5EzoYV/9MxQ3QJ76GA0MhzzlZ3qDbR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":730412},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"0fcc5b43157754499e27bcb00620f1690c049654","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.0.0_1789810506605_0.008004675312115017","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"ddlforge","version":"1.1.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.1.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"e067411d4303b0a2b9f5c3c744368621c656edd4","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.1.0.tgz","fileCount":247,"integrity":"sha512-QHjIk0PbSN889lisvpkc0/nsXsrFaMDrX77o89DGIQYIEeuvyoHxdY8iVuZQia8YfawreRkcBIulpPm8wTQGeQ==","signatures":[{"sig":"MEUCIQDG423qWP+PPuumQtci4gGMhbTiLDd1kN7WA8gQP+sG4QIgL7LIi9z7m4cVAdTlek0T/9IPQ3a57var0kBv3bdKXX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAh+wpxDkClV+Ikdrn+nDf6EAFbg0Sr3i+VRQC97EFBvAiB2SEBATffbM50WsIsd4BSXkfHNFad42yPOF2/VZVjcYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":856573},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"5cb60b956e24f3e1dead3fe3b75aab4180b3c314","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.1.0_1789811037407_0.2647876231504642","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"ddlforge","version":"1.4.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.4.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"493b102764edad5648f843d968839324fd459046","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.4.0.tgz","fileCount":291,"integrity":"sha512-itVe18SSc/7EWrCf8e8a9DuP3NdRrklVWaTo2XSyvYRPnH/sE/pIgZ16IyrLrtKvlkjo25MvOu754MfYHMpVxQ==","signatures":[{"sig":"MEUCIGhjTjEq3M3YoGy7bIidbpH0fhDCeMRkzTz9Sea3psxCAiEAsGDUJX75uOkpj3jD5y5HgjkG++2OHI/UIsjtOTzaAsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG+Zn9qexmqkTAaDmTihkF7yPppy1kpBTxrg9wu/9An9AiEA9tBUGKxxtoFcBLaekfC9dn916j7s4uhh86Di9aM0q48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1052783},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"7dd9243f797e15a465cbd07825b5b0c005d21a57","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.4.0_1789815809895_0.7638340930501966","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"ddlforge","version":"1.5.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.5.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"d899be95184db6fb445a37fa9d18f2acc030fb39","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.5.0.tgz","fileCount":307,"integrity":"sha512-3a4BeKkVqONcA7TYGmLv4MySY9JEjyuRKvXoViijzbf4P14G/rpNRplwz4RtgDfCeCSuV0Cv3bV3hHnbe/wjuQ==","signatures":[{"sig":"MEUCIQCoMnpMj6dC2vRwC1FYfo/VBC0xpyWpc9DntRZBsVbdQgIgZ8JqLzgkF+qVrBGYMRksdu8D8jbIi6VXcM1Mt1MkM9k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDtg8qWhX+IfKgLOYwOhXuPfHsDWgB+tVqDz5SZlbM72AiBgjyp9QJP+sUQz6B3mPyBm1gomAQgTts6+TGy9+j7u8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1154597},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"886dd5741d74a7c5bfada9ba9c285542328c10d9","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js dist/test/preflight/diskGuard.test.js dist/test/preflight/replicationGuard.test.js dist/test/preflight/configAudit.test.js dist/test/preflight/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.5.0_1789817622536_0.016316194215798108","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"ddlforge","version":"1.6.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.6.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"22052a514554a9d95833e9b0164ffe9f99b84b05","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.6.0.tgz","fileCount":327,"integrity":"sha512-3vB1Ox4CPa042Q4BzOZSqOvkmS8aILUyOjxLxca0V5h7aAVaT4HdviCR6L2JWh4DFLk2NSxUCxz+HoAj3O7KCw==","signatures":[{"sig":"MEQCIFdrWdhASAya7q6cWws5YRcp6IwZ7zmCG5nWb3KAtvu2AiBBt1AbUUAQuMAMgztJxIb6YOV7zkz4whAjt53CFjElVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBOIp6gzmw0drIMFiDX4R5gcL9oC40sgmWRN8/pY3YqmAiBNEfR5AYUZTt1VTVfBJYwdhMdyX3dc0fRPYYWdHBlSOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1292890},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"23e5486ce989d569dc0ee65c9044b7d208979594","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js dist/test/preflight/diskGuard.test.js dist/test/preflight/replicationGuard.test.js dist/test/preflight/configAudit.test.js dist/test/preflight/cli.test.js dist/test/recovery/pitrGuard.test.js dist/test/recovery/backupAuditor.test.js dist/test/recovery/verifyRestore.test.js dist/test/recovery/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.6.0_1789840234401_0.1487999374780984","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"ddlforge","version":"1.7.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.7.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"f6c57f9304aac54088339e9111a659e6dac49d5a","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.7.0.tgz","fileCount":343,"integrity":"sha512-UTBBw2LR7hOeaCaIuU3457/gMgqADtGxo3rWC4yomkyazpJOHNKqqaTOU9l8mTyIe8sweuXn0/PstBSTAc7k3Q==","signatures":[{"sig":"MEUCIQCpZHTUtiKhSH9inqFNu3WLqsfcMkf5T0nDoMLK/sfxJAIgciflFhWLLuLw2WruP231TsE/1R/MsKq5b2wC9U4O4+c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIESkqn7ia5Jay7rEHxEr+It6rrRbjmrTUQnsg2bMbw03AiA9BbE4aL+0Qy7QemjzQhdwmhgmhxkHteS2Dm06prweQw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1380408},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"a6eaef759abcc0ad39bfc80fa7e66aeaafd29dab","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js dist/test/preflight/diskGuard.test.js dist/test/preflight/replicationGuard.test.js dist/test/preflight/configAudit.test.js dist/test/preflight/cli.test.js dist/test/recovery/pitrGuard.test.js dist/test/recovery/backupAuditor.test.js dist/test/recovery/verifyRestore.test.js dist/test/recovery/cli.test.js dist/test/compaction/bloatEstimator.test.js dist/test/compaction/repack.test.js dist/test/compaction/reindex.test.js dist/test/compaction/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.7.0_1789840947235_0.10520666727539196","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"ddlforge","version":"1.8.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.8.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"a96abd3716a42ab5f5fb21c132d6a73e54ec092c","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.8.0.tgz","fileCount":363,"integrity":"sha512-aWRNHPdVyoElwI9ulMq6OWUBGo61CAj+mRgKRAxy9STzlJuFt3NwasBJAC4Z+wGrkdjLhzlKywhKJm8oOQKyOg==","signatures":[{"sig":"MEUCIAQ//wHAaV+8bpbqNl4JPolVLIuIf5kK1NZEJC5SUg9NAiEAgEpCbH3oChKlzzzSs513+bk+rxPAPYQlmDU7yEhV/QA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDcnAo7tEjsllgpQqsXA1L26CuMlJQzuu+TTbLY0NzYVAiA+2j9dbNqxnEwKJZAfLOp/BBUvpr9nJf29lOCnH/zzgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1512149},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"73939b849fb1dc790da0f8b225fa5003d8d5bacc","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js dist/test/preflight/diskGuard.test.js dist/test/preflight/replicationGuard.test.js dist/test/preflight/configAudit.test.js dist/test/preflight/cli.test.js dist/test/recovery/pitrGuard.test.js dist/test/recovery/backupAuditor.test.js dist/test/recovery/verifyRestore.test.js dist/test/recovery/cli.test.js dist/test/compaction/bloatEstimator.test.js dist/test/compaction/repack.test.js dist/test/compaction/reindex.test.js dist/test/compaction/cli.test.js dist/test/distributed/tenantRouter.test.js dist/test/distributed/workerPool.test.js dist/test/distributed/twoPhaseCoordinator.test.js dist/test/distributed/driftAuditor.test.js dist/test/distributed/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.8.0_1789843370773_0.24531090557230129","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"ddlforge","version":"1.9.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@1.9.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"d81205cea4543e8c39aa305bcc44e922789b5ac4","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-1.9.0.tgz","fileCount":379,"integrity":"sha512-8gkNaMyo2F6HAmopG2hYWAUE5HsYr4yCDgsmF2oOSjFy9fvgq5DJZxkCm1j0WNfObyqnyMHEsTR4sptSg/Y1Pg==","signatures":[{"sig":"MEYCIQCc1kzLYkh5KKmrJiRNKXJ6Ic9PvpdbbCdARJ+CKJ25ZAIhAN+pWGaKrbEZOeb1BNt4TfBflsIqo6ZriMFn970wGYjO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDfMQnWN+CBsiLTtALbCLVOcmNGlDPt2GI92sD2WZCdswIgb4JtNXFkez+wWh6Knv3lMgrMIL3yH+4Lq2kDYnt0veE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1614941},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"6cc5dd98344e2a211a79d2faa0c01bc44aaa3d7e","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js dist/test/preflight/diskGuard.test.js dist/test/preflight/replicationGuard.test.js dist/test/preflight/configAudit.test.js dist/test/preflight/cli.test.js dist/test/recovery/pitrGuard.test.js dist/test/recovery/backupAuditor.test.js dist/test/recovery/verifyRestore.test.js dist/test/recovery/cli.test.js dist/test/compaction/bloatEstimator.test.js dist/test/compaction/repack.test.js dist/test/compaction/reindex.test.js dist/test/compaction/cli.test.js dist/test/distributed/tenantRouter.test.js dist/test/distributed/workerPool.test.js dist/test/distributed/twoPhaseCoordinator.test.js dist/test/distributed/driftAuditor.test.js dist/test/distributed/cli.test.js dist/test/advisor/telemetryHarvester.test.js dist/test/advisor/hypoSimulator.test.js dist/test/advisor/pruner.test.js dist/test/advisor/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_1.9.0_1789844191030_0.5890034111709932","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"ddlforge","version":"2.0.0","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"author":"","license":"MIT","_id":"ddlforge@2.0.0","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"d71bf140f54a85d1727e20acb487d55887e69df3","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-2.0.0.tgz","fileCount":403,"integrity":"sha512-Y+n6Hgy1e9dO3s7XVgcAbx2Icyb3KKp8qa4UU8HPX6/A4tiruW1gb4QQxKnkHayZwhsCYFnYaDhiWVIoWRF3+w==","signatures":[{"sig":"MEUCIQCAduoSc45PbBuuQus9eRQYLsdEgDPsqaqR8sviqm1kmgIgIei/NsrOBwAABwcQGmGkfKtF/14Lj3ljaeOQxyayp6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCtfrGDto4JTf2xjSTUsroI+LcmBUp0zmALkD7jAccKPAIhAJJt3u49MtIKgItoMPpjG7L7VESGwPEpa0zUH+j20on3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1720779},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"a7101641f7709686572be792d7d9851d70fa8ea5","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js dist/test/preflight/diskGuard.test.js dist/test/preflight/replicationGuard.test.js dist/test/preflight/configAudit.test.js dist/test/preflight/cli.test.js dist/test/recovery/pitrGuard.test.js dist/test/recovery/backupAuditor.test.js dist/test/recovery/verifyRestore.test.js dist/test/recovery/cli.test.js dist/test/compaction/bloatEstimator.test.js dist/test/compaction/repack.test.js dist/test/compaction/reindex.test.js dist/test/compaction/cli.test.js dist/test/distributed/tenantRouter.test.js dist/test/distributed/workerPool.test.js dist/test/distributed/twoPhaseCoordinator.test.js dist/test/distributed/driftAuditor.test.js dist/test/distributed/cli.test.js dist/test/advisor/telemetryHarvester.test.js dist/test/advisor/hypoSimulator.test.js dist/test/advisor/pruner.test.js dist/test/advisor/cli.test.js dist/test/mesh/meshOrchestrator.test.js dist/test/mesh/sequenceSync.test.js dist/test/mesh/cutoverCoordinator.test.js dist/test/mesh/rollbackPipeline.test.js dist/test/mesh/cli.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"tmp":"tmp/ddlforge_2.0.0_1789846402900_0.40965382855975974","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"_id":"ddlforge@2.0.1","bin":{"ddlforge":"dist/bin/ddlforge.js"},"dist":{"shasum":"7e49a5275f5dd7a8d790e31c45801a2c9b9f2816","tarball":"https://registry.npmjs.org/ddlforge/-/ddlforge-2.0.1.tgz","fileCount":407,"integrity":"sha512-I2kJ82tnTMIdAUbY10diqJM37s5u9vZdngz8E+ABBXVihm9NaqRdR2xR66L1T+4uN4HuuNh4BReTFgGt2n1g+g==","signatures":[{"sig":"MEUCIQC0LaMU4QBCncIjcCnbdEyVY5YWeD9w/sr/FqtgZyGYLQIgMvxm62xgIwn85nVfVuP+lFDYsRAKGSHpExZLEn081eM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD7CSa4Tzo0dTvwG36Y52Sa68Rdg9MG0RnzdpOjEC3UdAIhAKCvN95aUrozPVyflxeJifNRt+zbuatIsFsFyLNNiEl+"}],"unpackedSize":1739428},"main":"./dist/src/index.js","name":"ddlforge","type":"module","types":"./dist/src/index.d.ts","author":"","engines":{"node":">=20.0.0"},"gitHead":"6f8eee949a2e73aad55bf1b568bc55f48087e845","license":"MIT","scripts":{"test":"npm run test:build && node --test dist/test/analyzer.test.js dist/test/runner.test.js dist/test/linter.test.js dist/test/reporter.test.js dist/test/wrapper.test.js dist/test/fuzz-parser.test.js dist/test/remediations.test.js dist/test/rules/concurrencyRules.test.js dist/test/rules/v070Rules.test.js dist/test/orchestrator/slicer.test.js dist/test/orchestrator/ledger.test.js dist/test/orchestrator/cli.test.js dist/test/orchestrator/virtualSchema.test.js dist/test/orchestrator/dualWrite.test.js dist/test/orchestrator/backfill.test.js dist/test/orchestrator/contract.test.js dist/test/reporters/github.test.js dist/test/harness/testHarness.test.js dist/test/cluster/advisory.test.js dist/test/diff/comparator.test.js dist/test/diff/catalog.test.js dist/test/diff/cli.test.js dist/test/masking/triggers.test.js dist/test/masking/backfill.test.js dist/test/masking/advisor.test.js dist/test/masking/cli.test.js dist/test/cluster/circuitBreaker.test.js dist/test/cluster/deadlockGraph.test.js dist/test/cluster/cli.test.js dist/test/partition/convert.test.js dist/test/partition/attach.test.js dist/test/partition/detach.test.js dist/test/partition/maintenance.test.js dist/test/partition/cli.test.js dist/test/preflight/diskGuard.test.js dist/test/preflight/replicationGuard.test.js dist/test/preflight/configAudit.test.js dist/test/preflight/cli.test.js dist/test/recovery/pitrGuard.test.js dist/test/recovery/backupAuditor.test.js dist/test/recovery/verifyRestore.test.js dist/test/recovery/cli.test.js dist/test/compaction/bloatEstimator.test.js dist/test/compaction/repack.test.js dist/test/compaction/reindex.test.js dist/test/compaction/cli.test.js dist/test/distributed/tenantRouter.test.js dist/test/distributed/workerPool.test.js dist/test/distributed/twoPhaseCoordinator.test.js dist/test/distributed/driftAuditor.test.js dist/test/distributed/cli.test.js dist/test/advisor/telemetryHarvester.test.js dist/test/advisor/hypoSimulator.test.js dist/test/advisor/pruner.test.js dist/test/advisor/cli.test.js dist/test/mesh/meshOrchestrator.test.js dist/test/mesh/sequenceSync.test.js dist/test/mesh/cutoverCoordinator.test.js dist/test/mesh/rollbackPipeline.test.js dist/test/mesh/cli.test.js dist/test/demo.test.js","build":"tsc && node -e \"const fs=require('fs'); try{fs.chmodSync('dist/bin/ddlforge.js', 0o755)}catch{}\"","prepack":"node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\"","test:build":"tsc -p tsconfig.test.json","test:watch":"node --test --watch dist/test/analyzer.test.js dist/test/runner.test.js","build:action":"cd action && npm install && npx ncc build src/index.ts -o dist --license licenses.txt","prepublishOnly":"npm run build && node -e \"const fs=require('fs'); try{fs.rmSync('dist/test', {recursive:true, force:true})}catch{}\""},"version":"2.0.1","_npmUser":{"name":"plamkatawee","email":"nita45207@gmail.com"},"keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"_npmVersion":"11.11.0","description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","directories":{},"maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"_nodeVersion":"25.8.1","dependencies":{"pg":"^8.23.0","@actions/core":"^1.10.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/pg":"^8.23.1","typescript":"^5.8.2","@types/node":"^22.13.10","@vercel/ncc":"^0.38.3","@testcontainers/postgresql":"^10.24.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ddlforge_2.0.1_1789849283124_0.08991769912424608"}}},"time":{"created":"2026-09-16T10:20:46.248Z","modified":"2026-09-19T20:21:23.404Z","0.1.0":"2026-09-16T10:20:46.566Z","0.1.1":"2026-09-16T10:41:58.442Z","0.2.0":"2026-09-16T13:52:27.993Z","0.2.1":"2026-09-16T15:14:14.083Z","0.3.0":"2026-09-16T19:15:26.571Z","0.5.0":"2026-09-16T19:40:02.191Z","0.6.0":"2026-09-18T12:52:52.599Z","0.7.0":"2026-09-18T17:53:38.143Z","0.8.0":"2026-09-18T19:21:56.332Z","0.9.0":"2026-09-19T05:20:35.395Z","1.0.0":"2026-09-19T09:35:06.761Z","1.1.0":"2026-09-19T09:43:57.492Z","1.4.0":"2026-09-19T11:03:29.974Z","1.5.0":"2026-09-19T11:33:42.627Z","1.6.0":"2026-09-19T17:50:34.489Z","1.7.0":"2026-09-19T18:02:27.347Z","1.8.0":"2026-09-19T18:42:50.925Z","1.9.0":"2026-09-19T18:56:31.140Z","2.0.0":"2026-09-19T19:33:23.076Z","2.0.1":"2026-09-19T20:21:23.233Z"},"license":"MIT","keywords":["postgres","postgresql","migration","ddl","lock","linter","prisma","drizzle","zero-downtime"],"description":"Ultra-fast, zero-runtime-dependency Postgres migration lock linter and data-loss prevention engine CLI in Node.js 20+ and TypeScript","maintainers":[{"name":"plamkatawee","email":"nita45207@gmail.com"}],"readme":"# ddlforge\n\n> **ddlforge is the zero-downtime reliability guardian between your application deployments and PostgreSQL.**  \n> From pre-flight lock linting and autonomous circuit breaking to in-place table compaction and zero-data-loss Blue/Green migration meshes, ddlforge guarantees that schema migrations never take down your production database.\n\n[![npm version](https://img.shields.io/badge/npm-v2.0.0-blue.svg)](package.json)\n[![Node.js](https://img.shields.io/badge/Node.js-20%2B-green.svg)](https://nodejs.org)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5%2B-blue.svg)](https://www.typescriptlang.org)\n[![Tests](https://img.shields.io/badge/Tests-900%2B%20passing-brightgreen.svg)](test)\n[![Zero Runtime Dependencies](https://img.shields.io/badge/Check%20Deps-0-success.svg)](package.json)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Support on Ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/x7sss)\n\n---\n\n## ⚡ 60-Second Interactive Demo\n\nExperience ddlforge's lock pre-emption circuit breaker, statistical bloat estimator, and Blue/Green CDC cutover in your terminal without configuring a database:\n\n```bash\nnpx ddlforge demo\n```\n\n---\n\n## 🏛️ System Architecture\n\n```\n┌──────────────────────────────────────────────────────────────────────────────────┐\n│                                   ddlforge CLI                                   │\n│  CI / GitHub Actions  ──►  Static Lock Linter & Storage Forecaster (0 deps)      │\n│  ORM Deploys / CLI    ──►  Autonomous Lock Circuit Breaker & Queue Pre-emption   │\n└────────────────────────────────────────┬─────────────────────────────────────────┘\n                                         │\n                 ┌───────────────────────┼───────────────────────┐\n                 ▼                       ▼                       ▼\n     ┌──────────────────────┐┌──────────────────────┐┌──────────────────────┐\n     │  Online Table Repack ││ Live Schema Drift &  ││ Blue / Green Mesh    │\n     │  Shadow Defrag Engine││ Multi-Tenant Ledger  ││ Logical CDC Switch   │\n     └──────────┬───────────┘└──────────┬───────────┘└──────────┬───────────┘\n                │                       │                       │\n                ▼                       ▼                       ▼\n     ┌──────────────────────────────────────────────────────────────────────┐\n     │                          PostgreSQL Cluster                          │\n     │   Primary (Blue)  ◄────── Bi-Directional Parachute ──────► Target (Green)│\n     │   • Lock Queues Pre-empted     • Continuous WAL Archival Doctor      │\n     │   • HOT Updates Preserved      • Statistical Bloat Reclaimed         │\n     └──────────────────────────────────────────────────────────────────────┘\n```\n\n---\n\n## 🎯 Operational Problem vs. Solution Matrix\n\n| Operational Hazard / Production Problem | ddlforge Command | How ddlforge Solves It |\n|:----------------------------------------|:-----------------|:-----------------------|\n| **Traffic jams & lock queue pileups** | `ddlforge run`<br>`ddlforge top` | Pre-empts blocked DDL within milliseconds before connection pool saturation; visualizes lock contention trees and deadlocks in real time. |\n| **50M+ row monolithic table partitioning** | `ddlforge partition convert`<br>`ddlforge partition attach` | Online range partitioning via dual-write triggers, asynchronous keyset backfills, and atomic bounded cutover swaps without locking writes. |\n| **Out-of-disk & shared-volume panics** | `ddlforge preflight` | Simulates write blast radius, forecasts WAL surge volume, and verifies partition mount storage headroom before running DDL. |\n| **Unverified backups & broken archivers** | `ddlforge doctor`<br>`ddlforge verify-backup` | Continuous WAL archival inspection (`pg_stat_archiver`), replication slot retention auditing, and physical amcheck index corruption verification. |\n| **Vacuum Full table & index bloat** | `ddlforge compact estimate`<br>`ddlforge compact table`<br>`ddlforge compact index` | Mathematical tuple layout estimation without table scans; 5-phase zero-downtime online shadow repacking (`pg_repack` user-space pattern). |\n| **Multi-tenant schema drift & fleet updates** | `ddlforge tenant migrate`<br>`ddlforge tenant audit`<br>`ddlforge tenant sweep` | Bounded-concurrency fleet migrations (schema/database strategies), majority consensus drift detection, and 2PC distributed state ledger healing. |\n| **Over-indexing vs seq scan trade-offs** | `ddlforge advisor analyze`<br>`ddlforge advisor simulate`<br>`ddlforge advisor prune` | Autonomous query telemetry mining (HOT efficiency, R/W ratio), zero-overhead in-memory simulation (`hypopg`), and prefix-subsumed index pruning. |\n| **Major version upgrade (PG15 to PG18)** | `ddlforge mesh init`<br>`ddlforge mesh cutover`<br>`ddlforge mesh establish-rollback` | Zero-data-loss CDC logical replication mesh, exact fence LSN validation, sequence watermark padding, and reverse replication parachute (`origin=none`). |\n\n---\n\n## 🚀 5-Minute Quickstart\n\n### 1. Installation\n\n```bash\n# Global CLI\nnpm install -g ddlforge\n\n# Or use directly via npx\nnpx ddlforge --help\n```\n\n### 2. Configure Environment\n\nSet your connection string in your shell or `.env` file:\n\n```bash\nexport DATABASE_URL=\"postgresql://postgres:password@localhost:5432/mydb\"\n```\n\n### 3. Verify Database Health & Archiving\n\nRun the disaster recovery and WAL readiness doctor before running any major migrations:\n\n```bash\nddlforge doctor\n```\n\n```text\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n  ddlforge v2.0.0 — Continuous WAL Archiving & Disaster Readiness Doctor\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n[1] CONTINUOUS WAL ARCHIVING (pg_stat_archiver)\n  Status:                    [HEALTHY] - WAL archiving active and succeeding\n  Archived Segments:         14,892 segments (0 recent failures)\n  Last Archived WAL:         00000001000003A4000000F1 (18 seconds ago)\n\n[2] REPLICATION SLOTS & WAL RETENTION (pg_replication_slots)\n  - Slot: cdc_slot (logical) [ACTIVE] WAL Status: normal | Retained WAL: 16 MB\n\n──────────────────────────────────────────────────────────────────────\n  ✔ DISASTER RECOVERY READINESS: HEALTHY & READY FOR DDL\n```\n\n### 4. Execute Migrations Safely\n\nRun your migration with autonomous lock pre-emption and automatic lock-queue cancellation:\n\n```bash\nddlforge run ./migrations/20260920_add_column.sql --max-lock-ms 250 --retry-limit 5\n```\n\n---\n\n## 🛠️ ORM & Framework Integration\n\n### Prisma\n\nDrop `ddlforge wrap` directly in front of `prisma migrate deploy`. ddlforge inspects pending migration SQL files, evaluates zero-downtime rules, and intercepts blockers **before** running the deployment:\n\n```bash\n# Supervise Prisma migration deployment in CI/CD\nnpx ddlforge wrap -- npx prisma migrate deploy\n```\n\nAdd to your `package.json`:\n```json\n{\n  \"scripts\": {\n    \"db:migrate\": \"ddlforge wrap -- prisma migrate deploy\",\n    \"db:check\": \"ddlforge check ./prisma/migrations\"\n  }\n}\n```\n\n### Drizzle ORM\n\nWrap `drizzle-kit migrate` to protect live tables against unsafe constraints and missing `CONCURRENTLY` indexes:\n\n```bash\n# Supervise Drizzle deployments\nnpx ddlforge wrap --dir=./drizzle -- npx drizzle-kit migrate\n```\n\nAdd to your `package.json`:\n```json\n{\n  \"scripts\": {\n    \"db:migrate\": \"ddlforge wrap --dir=./drizzle -- drizzle-kit migrate\",\n    \"db:check\": \"ddlforge check ./drizzle\"\n  }\n}\n```\n\n### CI/CD Pipeline Gate (GitHub Actions)\n\nAdd this workflow to `.github/workflows/ddlforge-gate.yml` to automatically analyze PRs, annotate GitHub diffs, and test against ephemeral isolated containers:\n\n```yaml\nname: ddlforge Migration Reliability Gate\n\non:\n  pull_request:\n    paths:\n      - '**/migrations/**'\n      - '**/schema.prisma'\n      - '**/drizzle/**'\n      - '**/*.sql'\n\njobs:\n  ddlforge-gate:\n    name: Zero-Downtime Migration Inspection\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: 'npm'\n\n      - name: Install dependencies\n        run: npm ci\n\n      # 1. Zero-dependency static linting with PR inline diff annotations\n      - name: Lint Migration SQL\n        run: npx ddlforge check ./prisma/migrations --format github\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      # 2. Ephemeral container validation (samples lock hold times every 50ms)\n      - name: Ephemeral Container Lock Benchmark\n        run: npx ddlforge test --max-lock-ms 500\n```\n\n---\n\n## 📂 Concrete Production Examples\n\nComplete runnable examples with dockerized Postgres 16 environments are located in the [`examples/`](./examples/) directory:\n\n- **[`examples/01-safe-column-add/`](./examples/01-safe-column-add/)**: Adding a `NOT NULL` column with a default value to a 10M row table using expand/contract without locking writes.\n- **[`examples/02-partition-live-table/`](./examples/02-partition-live-table/)**: Converting a monolithic 50M+ row `events` table into monthly range partitions with zero application downtime.\n- **[`examples/03-ci-pipeline/`](./examples/03-ci-pipeline/)**: Ready-to-use GitHub Actions gate workflow with ephemeral container benchmarking.\n\nTo run any example:\n```bash\ndocker compose -f examples/docker-compose.yml up -d\nnpx tsx examples/01-safe-column-add/run.ts\n```\n\n---\n\n## 📖 Complete Rule Catalog & Zero-Downtime Recipes\n\n| Rule ID | Lock Level | Severity | Hazard | Zero-Downtime Recipe |\n|:--------|:-----------|:--------:|:-------|:---------------------|\n| `require-concurrent-index` | `SHARE` | **BLOCKER** | `CREATE INDEX` without `CONCURRENTLY` blocks all table writes (`INSERT`, `UPDATE`, `DELETE`). | Add `CONCURRENTLY` keyword: `CREATE INDEX CONCURRENTLY idx ON table(col);` (run outside transactions). |\n| `concurrent-index-in-transaction` | `NONE` | **BLOCKER** | PostgreSQL prohibits `CONCURRENTLY` inside transaction blocks (`BEGIN...COMMIT` or Prisma default). | Run outside transaction, or add `-- prisma:no-transaction` directive. |\n| `add-column-not-null-without-default` | `ACCESS EXCLUSIVE` | **BLOCKER** | `ADD COLUMN ... NOT NULL` without `DEFAULT` triggers full table scan and fails on populated tables. | Provide static `DEFAULT` (instant in PG 11+) or add nullable, backfill, and validate. |\n| `foreign-key-missing-not-valid` | `SHARE ROW EXCLUSIVE` | **BLOCKER** | Inline `FOREIGN KEY` addition holds write locks on both parent and child tables during validation. | 1. `ADD CONSTRAINT fk ... NOT VALID;`<br>2. `VALIDATE CONSTRAINT fk;` |\n| `check-constraint-not-valid` | `ACCESS EXCLUSIVE` | **BLOCKER** | Adding `CHECK (...)` without `NOT VALID` blocks all reads & writes during entire table scan. | 1. `ADD CONSTRAINT chk CHECK (...) NOT VALID;`<br>2. `VALIDATE CONSTRAINT chk;` |\n| `unique-constraint-using-index` | `SHARE` | **BLOCKER** | `ADD CONSTRAINT ... UNIQUE (cols)` directly locks writes while creating the unique index. | 1. `CREATE UNIQUE INDEX CONCURRENTLY idx ON t(cols);`<br>2. `ADD CONSTRAINT uq UNIQUE USING INDEX idx;` |\n| `prisma-silent-rename-data-loss` | `ACCESS EXCLUSIVE` | **BLOCKER** | Prisma defaults field renames to `DROP COLUMN` + `ADD COLUMN`, permanently deleting data. | Use `RENAME COLUMN old TO new;` or use `@map(\"old_name\")` in `schema.prisma`. |\n| `set-not-null-full-scan` | `ACCESS EXCLUSIVE` | **WARNING** (PG 12+)<br>**BLOCKER** (PG < 12) | Direct `ALTER COLUMN ... SET NOT NULL` forces synchronous full table scan under exclusive lock. | Add `CHECK (col IS NOT NULL) NOT VALID`, validate constraint, then apply `SET NOT NULL`. |\n| `unbatched-dml` | `ROW EXCLUSIVE` | **BLOCKER** (no `WHERE`)<br>**WARNING** (with `WHERE`) | Massive single-transaction `UPDATE`/`DELETE` generates heavy WAL bloat and lock convoys. | Batch in small slices (1,000–5,000 rows) via keyset pagination or add ignore directive. |\n| `session-advisory-lock` | `NONE` | **WARNING** | `pg_advisory_lock` leaks across connections in poolers (PgBouncer transaction mode). | Replace with transaction-scoped variants: `pg_advisory_xact_lock(...)`. |\n| `alter-column-type-rewrite` | `ACCESS EXCLUSIVE` | **BLOCKER** (rewrites)<br>**WARNING** (metadata-only) | `ALTER TABLE ... ALTER COLUMN ... TYPE` causes full physical table rewrite under `ACCESS EXCLUSIVE` lock in most cases. | 1. `ADD COLUMN col_new <new_type>;`<br>2. Backfill in batches.<br>3. `RENAME COLUMN col TO col_old; RENAME col_new TO col;`<br>4. `DROP COLUMN col_old;` |\n| `unindexed-foreign-key` | `NONE` | **WARNING** | Adding `FOREIGN KEY` without covering index on referencing columns causes sequential scan locks during parent updates/deletes. | 1. `CREATE INDEX CONCURRENTLY idx ON t(fk_cols);`<br>2. `ADD CONSTRAINT fk FOREIGN KEY (...) NOT VALID;`<br>3. `VALIDATE CONSTRAINT fk;` |\n| `drop-column-lock` | `ACCESS EXCLUSIVE` | **WARNING** | `DROP COLUMN` holds `ACCESS EXCLUSIVE` lock on the table, blocking all concurrent read and write operations. | 1. Deploy app code that stops reading/writing the column first.<br>2. Drop column in low-traffic maintenance window. |\n| `add-primary-key-missing-using-index` | `ACCESS EXCLUSIVE` | **BLOCKER** | `ADD PRIMARY KEY` without `USING INDEX` acquires `ACCESS EXCLUSIVE` lock and builds index synchronously, blocking all queries. | 1. `CREATE UNIQUE INDEX CONCURRENTLY idx ON t(cols);`<br>2. `ALTER TABLE t ADD CONSTRAINT pk PRIMARY KEY USING INDEX idx;` |\n| `detach-partition-non-concurrent` | `ACCESS EXCLUSIVE` | **BLOCKER** | `ALTER TABLE ... DETACH PARTITION` without `CONCURRENTLY` (PG 14+) blocks all read/write traffic across the partitioned table. | Use `ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY;` |\n| `reindex-missing-concurrently` | `SHARE` / `ACCESS EXCLUSIVE` | **BLOCKER** | Running `REINDEX` on table, index, or schema without `CONCURRENTLY` locks concurrent writes or reads. | Add `CONCURRENTLY` option: `REINDEX TABLE CONCURRENTLY t;` (run outside transactions). |\n| `enum-add-value-in-transaction` | `NONE` | **BLOCKER** | `ALTER TYPE ... ADD VALUE` cannot run inside transaction blocks or be referenced in the same transaction in PostgreSQL. | Run outside transactions or add `-- prisma:no-transaction` directive. |\n| `maintenance-command-detected` | `ACCESS EXCLUSIVE` | **BLOCKER** | `VACUUM FULL`, `CLUSTER`, or `TRUNCATE` in migration files causes severe global lockouts or instant data loss. | Use `ddlforge compact table` (user-space shadow repack) instead of `VACUUM FULL`. |\n\n---\n\n## 💻 Programmatic TypeScript API\n\n### Static Analysis (`MigrationAnalyzer`)\n\n```typescript\nimport { MigrationAnalyzer, formatTerminal, formatSarif } from 'ddlforge';\n\nconst analyzer = new MigrationAnalyzer();\nconst result = analyzer.analyze(`\n  ALTER TABLE users ADD CONSTRAINT uq_email UNIQUE (email);\n`, {\n  filePath: 'migrations/001.sql',\n  pgVersion: 16,\n});\n\nif (result.hasBlockers) {\n  console.log(formatTerminal([result]));\n  process.exit(1);\n}\n```\n\n### Automated Remediation Fixer (`applyFixes`)\n\n```typescript\nimport { MigrationAnalyzer, applyFixes } from 'ddlforge';\n\nconst analyzer = new MigrationAnalyzer();\nconst sql = `CREATE INDEX idx_users_email ON users (email);`;\nconst result = analyzer.analyze(sql);\n\nconst fixed = applyFixes(sql, result.findings);\nconsole.log(fixed.patchedSql);\n// Output: CREATE INDEX CONCURRENTLY idx_users_email ON users (email);\n```\n\n### Statistical Bloat Estimator (`estimateTableBloat`)\n\n```typescript\nimport { estimateTableBloat } from 'ddlforge';\n\nconst bloat = estimateTableBloat({\n  tableName: 'orders',\n  schemaName: 'public',\n  relpages: 120000,\n  reltuples: 5000000,\n  nullableColumns: 8,\n  avgDataWidth: 124,\n});\n\nconsole.log(`Bloat: ${bloat.bloatRatioPercent}% (${bloat.bloatBytes / (1024 * 1024)} MB)`);\n```\n\n---\n\n## 🧪 Testing & Reliability Metrics\n\n```bash\nnpm test\n```\n\n```text\nℹ tests 904\nℹ suites 242\nℹ pass 904\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ duration_ms 2450.12\n```\n\n- **Zero dependencies** for static linting (`ddlforge check`).\n- **Sub-15 millisecond** AST analysis across 100+ migration files.\n- **900+ tests** verifying lock taxonomies, partition state machines, and replication mesh cutovers.\n\n---\n\n## 📄 License\n\nMIT © [x7sss](https://github.com/x7ssss)\n","readmeFilename":"README.md"}