{"_id":"@bydey/tusk","_rev":"6-d1cf7666f993e4c6d37af7bce4cddb1d","name":"@bydey/tusk","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"@bydey/tusk","version":"0.1.0","keywords":["postgres","postgresql","migration","database","sql","elysia","bun"],"author":{"name":"Bydey"},"license":"MIT","_id":"@bydey/tusk@0.1.0","maintainers":[{"name":"jordey92","email":"jordan@jordandey.com"}],"homepage":"https://github.com/jordey92/tusk#readme","bugs":{"url":"https://github.com/jordey92/tusk/issues"},"bin":{"tusk":"dist/cli.js"},"dist":{"shasum":"66d5e43ca17a77d8ea503f2b2375d60e8f45e367","tarball":"https://registry.npmjs.org/@bydey/tusk/-/tusk-0.1.0.tgz","fileCount":59,"integrity":"sha512-PdBM1akqwmgWmHzb8+4M9/PStaR6uVqFr7BRW4oyZFYuBB3OJIzQTdhaZ7IE6Da/w4AhXg3DN1/4xykQRdnP4A==","signatures":[{"sig":"MEYCIQCjn9DoUNtBO4KE641gYmH/z4OVouQJsagYFBJLQgCNcQIhAP4dacauSloBOrQJNnSE8KgLvueNXuRNBKM5X0wBZTXj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80361},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","gitHead":"8b404398f7003f97229c830ff65e228a3be83104","scripts":{"test":"bun test","build":"tsc","prepublishOnly":"bun run build"},"_npmUser":{"name":"jordey92","email":"jordan@jordandey.com"},"repository":{"url":"git+https://github.com/jordey92/tusk.git","type":"git"},"_npmVersion":"11.11.0","description":"Simple PostgreSQL migration tool with Elysia support","directories":{},"_nodeVersion":"24.14.1","dependencies":{"dotenv":"^17.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","elysia":"^1.4.9","postgres":"^3.4.7","@types/pg":"^8.15.5","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^24.6.2"},"peerDependencies":{"pg":">=8.0.0","elysia":">=1.0.0","postgres":">=3.0.0"},"peerDependenciesMeta":{"pg":{"optional":true},"elysia":{"optional":true},"postgres":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tusk_0.1.0_1776309503013_0.5729909339932087","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bydey/tusk","version":"0.2.0","keywords":["postgres","postgresql","migration","migrations","database","sql","sql-first","elysia","bun","node"],"author":{"name":"Bydey"},"license":"MIT","_id":"@bydey/tusk@0.2.0","maintainers":[{"name":"jordey92","email":"jordan@jordandey.com"}],"homepage":"https://github.com/jordey92/tusk#readme","bugs":{"url":"https://github.com/jordey92/tusk/issues"},"bin":{"tusk":"dist/cli.js"},"dist":{"shasum":"ef5465eae8cf0d699bcf9931376d1336a8ebad44","tarball":"https://registry.npmjs.org/@bydey/tusk/-/tusk-0.2.0.tgz","fileCount":61,"integrity":"sha512-KbvtjMmNbQPK9KNi+ehdG2F5WHliKJDiaBd3Z/bg6/i4ci0Vrc1LkeWDfz34kP6LsEFpJ/aHJ8/aycSpw0hCzg==","signatures":[{"sig":"MEYCIQDaMX/m+8el/bt32tTDRZC8WdEdzJlukRbAvrwkwYWdiQIhAKzobdsXtjlre9fqM4tYRmODjrajALnM4eWbWO9S1BPw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89393},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","gitHead":"7dd90c9571196ce27c26db1782431685295b5888","scripts":{"test":"bun run test:unit","build":"tsc","test:ci":"bun run build && TUSK_PACKAGE_SMOKE_SKIP_BUILD=1 bun test","test:db":"bun test adapters/pg.test.ts adapters/postgresjs.test.ts core/run-migrations.test.ts core/init-migration.test.ts core/track-migrations.test.ts","test:unit":"bun test core/create-migration.test.ts core/read-migrations.test.ts core/rollback-plan.test.ts utils/checksum.test.ts utils/errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/version.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts","test:smoke":"TUSK_SMOKE_DATABASE_URL=postgresql://user:password@127.0.0.1:5433/migrate_tool_test bun test package-smoke.test.ts cli.test.ts plugins/elysia.test.ts","prepublishOnly":"bun run build","test:smoke:package":"bun test package-smoke.test.ts"},"_npmUser":{"name":"jordey92","email":"jordan@jordandey.com"},"repository":{"url":"git+https://github.com/jordey92/tusk.git","type":"git"},"_npmVersion":"11.11.0","description":"SQL-first PostgreSQL migrations for Node.js and Bun","directories":{},"_nodeVersion":"24.14.1","dependencies":{"dotenv":"^17.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","elysia":"^1.4.9","postgres":"^3.4.7","@types/pg":"^8.15.5","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^24.6.2"},"peerDependencies":{"pg":">=8.0.0","elysia":">=1.0.0","postgres":">=3.0.0"},"peerDependenciesMeta":{"pg":{"optional":true},"elysia":{"optional":true},"postgres":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tusk_0.2.0_1776735324702_0.9666627307940487","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bydey/tusk","version":"0.3.0","keywords":["postgres","postgresql","migration","migrations","database","sql","sql-first","elysia","bun","node"],"author":{"name":"Bydey"},"license":"MIT","_id":"@bydey/tusk@0.3.0","maintainers":[{"name":"jordey92","email":"jordan@jordandey.com"}],"homepage":"https://github.com/jordey92/tusk#readme","bugs":{"url":"https://github.com/jordey92/tusk/issues"},"bin":{"tusk":"dist/cli.js","tusk-mcp":"dist/mcp/server.js"},"dist":{"shasum":"c4d983a390fc1d5278f829f7cc2016734f0885af","tarball":"https://registry.npmjs.org/@bydey/tusk/-/tusk-0.3.0.tgz","fileCount":89,"integrity":"sha512-C94IgqllFauhlSYyFAl58U6R0tKV6L2IaXj+afBvv8MB5QQdKjOcrQHoBlxO0UzG+b6qSn2JvCO48SFc4/WBsg==","signatures":[{"sig":"MEQCIEubiTP+r10NUmhA7d2olyYEo+avxtBAHSGRbMhfpZuNAiBzw2pZEBNivdWLibJXkYK8LrvJm6PxQxYVxvEsKfYcfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147033},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","gitHead":"aa7ef0ceee28c6fae43af3e2c8105d7c02b479ee","scripts":{"test":"bun run test:unit","build":"tsc","test:ci":"bun run build && TUSK_PACKAGE_SMOKE_SKIP_BUILD=1 bun test","test:db":"bun test adapters/pg.test.ts adapters/postgresjs.test.ts core/run-migrations.test.ts core/init-migration.test.ts core/track-migrations.test.ts","test:unit":"bun test core/checksum-validation.test.ts core/create-migration.test.ts core/read-migrations.test.ts core/migration-records.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/validate-migrations.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/version.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts mcp/server.test.ts","test:smoke":"TUSK_SMOKE_DATABASE_URL=postgresql://user:password@127.0.0.1:5433/migrate_tool_test bun test package-smoke.test.ts cli.test.ts plugins/elysia.test.ts","quality:crap":"bun run test:coverage && bun scripts/quality/crap-report.ts","test:coverage":"bun test --coverage --coverage-reporter=lcov --coverage-dir=coverage core/checksum-validation.test.ts core/create-migration.test.ts core/read-migrations.test.ts core/migration-records.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/validate-migrations.test.ts core/init-migration.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/version.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts","prepublishOnly":"bun run build","quality:agentic":"bun run build && bun run quality:crap && bun run quality:mutation","quality:mutation":"bun scripts/quality/mutation-report.ts","test:smoke:package":"bun test package-smoke.test.ts"},"_npmUser":{"name":"jordey92","email":"jordan@jordandey.com"},"repository":{"url":"git+https://github.com/jordey92/tusk.git","type":"git"},"_npmVersion":"11.11.0","description":"SQL-first PostgreSQL migrations for Node.js and Bun","directories":{},"_nodeVersion":"24.14.1","dependencies":{"dotenv":"^17.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","elysia":"^1.4.9","postgres":"^3.4.7","@types/pg":"^8.15.5","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^24.6.2"},"peerDependencies":{"pg":">=8.0.0","elysia":">=1.0.0","postgres":">=3.0.0"},"peerDependenciesMeta":{"pg":{"optional":true},"elysia":{"optional":true},"postgres":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tusk_0.3.0_1777211526698_0.6806613402421278","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bydey/tusk","version":"0.4.0","keywords":["postgres","postgresql","migration","migrations","database","sql","sql-first","elysia","bun","node"],"author":{"name":"Bydey"},"license":"MIT","_id":"@bydey/tusk@0.4.0","maintainers":[{"name":"jordey92","email":"jordan@jordandey.com"}],"homepage":"https://github.com/jordey92/tusk#readme","bugs":{"url":"https://github.com/jordey92/tusk/issues"},"bin":{"tusk":"dist/cli.js","tusk-mcp":"dist/mcp/server.js"},"dist":{"shasum":"f9868737df228e5d40ec3a51e049d1fbddeb50ce","tarball":"https://registry.npmjs.org/@bydey/tusk/-/tusk-0.4.0.tgz","fileCount":91,"integrity":"sha512-3ngvIoAt4L7somjcM6FGZp+FjePRsLIfOecOzl/bijOSF4dAkrtn/Uo7K1N5pE3Ro9u0Pea2AM7Kj+sHWY89nQ==","signatures":[{"sig":"MEUCIF/DnzNG6OgrN+eIpnVB148Pr5BIRjYNPWrXNlsqTUX3AiEAmtR4iqH8W/PimbmwHJu86kU7Jzwms+4wMhu/WiwL5Ws=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150282},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","gitHead":"942f53f881a64123127ee3f639f3c490f6d757d1","scripts":{"test":"bun run test:unit","build":"tsc","test:ci":"bun run build && TUSK_PACKAGE_SMOKE_SKIP_BUILD=1 bun test","test:db":"bun test adapters/pg.test.ts adapters/postgresjs.test.ts core/run-migrations.test.ts core/init-migration.test.ts core/track-migrations.test.ts","test:unit":"bun test core/checksum-validation.test.ts core/create-migration.test.ts core/read-migrations.test.ts core/migration-records.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/validate-migrations.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/cli-parser.test.ts utils/errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/version.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts mcp/server.test.ts","test:smoke":"TUSK_SMOKE_DATABASE_URL=postgresql://user:password@127.0.0.1:5433/migrate_tool_test bun test package-smoke.test.ts cli.test.ts plugins/elysia.test.ts","quality:crap":"bun run test:coverage && bun scripts/quality/crap-report.ts","test:coverage":"bun test --coverage --coverage-reporter=lcov --coverage-dir=coverage core/checksum-validation.test.ts core/create-migration.test.ts core/read-migrations.test.ts core/migration-records.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/validate-migrations.test.ts core/init-migration.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/cli-parser.test.ts utils/errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/version.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts","prepublishOnly":"bun run build","quality:agentic":"bun run build && bun run quality:dead-code && bun run quality:crap && bun run quality:mutation","quality:mutation":"bun scripts/quality/mutation-report.ts","quality:dead-code":"knip --no-progress","test:smoke:package":"bun test package-smoke.test.ts"},"_npmUser":{"name":"jordey92","email":"jordan@jordandey.com"},"repository":{"url":"git+https://github.com/jordey92/tusk.git","type":"git"},"_npmVersion":"11.11.0","description":"SQL-first PostgreSQL migrations for Node.js and Bun","directories":{},"_nodeVersion":"24.14.1","dependencies":{"dotenv":"^17.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","knip":"^6.7.0","elysia":"^1.4.9","postgres":"^3.4.7","@types/pg":"^8.15.5","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^24.6.2"},"peerDependencies":{"pg":">=8.0.0","elysia":">=1.0.0","postgres":">=3.0.0"},"peerDependenciesMeta":{"pg":{"optional":true},"elysia":{"optional":true},"postgres":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tusk_0.4.0_1777250698406_0.84967379523077","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bydey/tusk","version":"0.5.0","keywords":["postgres","postgresql","migration","migrations","database","sql","sql-first","elysia","bun","node"],"author":{"name":"Bydey"},"license":"MIT","_id":"@bydey/tusk@0.5.0","maintainers":[{"name":"jordey92","email":"jordan@jordandey.com"}],"homepage":"https://github.com/jordey92/tusk#readme","bugs":{"url":"https://github.com/jordey92/tusk/issues"},"bin":{"tusk":"dist/cli.js","tusk-mcp":"dist/mcp/server.js"},"dist":{"shasum":"eba7a468f6dc68da49d77b1c105e104c8e22537e","tarball":"https://registry.npmjs.org/@bydey/tusk/-/tusk-0.5.0.tgz","fileCount":95,"integrity":"sha512-FzPXC12yW77m0dttreuGGTkzaQDna1XH0XVfqQZ6s3QAE/11jNtop2MEjU1t0It6GwogXkPVNIgdWrdZ/Wc0OA==","signatures":[{"sig":"MEUCIB8I8dG7/H6ZpQWqRIBHQyN5NyAW+TdEtg8MsVf7PE4JAiEA/MFJ1mkMgligmQH3hrQgPES0q+C5/Oki0iaXzCYF8A0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169251},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","gitHead":"69a02d3f70062040f45c49c2e8dae6fe73a7e3bd","scripts":{"test":"bun run test:unit","build":"tsc","test:ci":"bun run build && TUSK_PACKAGE_SMOKE_SKIP_BUILD=1 bun test","test:db":"bun test adapters/pg.test.ts adapters/postgresjs.test.ts core/run-migrations.test.ts core/init-migration.test.ts core/track-migrations.test.ts","test:unit":"bun test core/checksum-validation.test.ts core/create-migration.test.ts core/read-migrations.test.ts core/migration-records.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/validate-migrations.test.ts core/doctor.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/cli-parser.test.ts utils/errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/version.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts mcp/server.test.ts","test:smoke":"TUSK_SMOKE_DATABASE_URL=postgresql://user:password@127.0.0.1:5433/migrate_tool_test bun test package-smoke.test.ts cli.test.ts plugins/elysia.test.ts","quality:crap":"bun run test:coverage && bun scripts/quality/crap-report.ts","test:coverage":"bun test --coverage --coverage-reporter=lcov --coverage-dir=coverage core/checksum-validation.test.ts core/create-migration.test.ts core/read-migrations.test.ts core/migration-records.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/validate-migrations.test.ts core/init-migration.test.ts core/doctor.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/cli-parser.test.ts utils/errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/version.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts","prepublishOnly":"bun run build","quality:agentic":"bun run build && bun run quality:dead-code && bun run quality:crap && bun run quality:mutation","quality:mutation":"bun scripts/quality/mutation-report.ts","quality:dead-code":"knip --no-progress","test:smoke:package":"bun test package-smoke.test.ts"},"_npmUser":{"name":"jordey92","email":"jordan@jordandey.com"},"repository":{"url":"git+https://github.com/jordey92/tusk.git","type":"git"},"_npmVersion":"11.11.0","description":"SQL-first PostgreSQL migrations for Node.js and Bun","directories":{},"_nodeVersion":"24.14.1","dependencies":{"dotenv":"^17.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","knip":"^6.7.0","elysia":"^1.4.9","postgres":"^3.4.7","@types/pg":"^8.15.5","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^24.6.2"},"peerDependencies":{"pg":">=8.0.0","elysia":">=1.0.0","postgres":">=3.0.0"},"peerDependenciesMeta":{"pg":{"optional":true},"elysia":{"optional":true},"postgres":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tusk_0.5.0_1777259137893_0.573770801248684","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@bydey/tusk","version":"1.0.0","description":"SQL-first PostgreSQL migrations for Node.js and Bun","author":{"name":"Bydey"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Jordey92/tusk.git"},"homepage":"https://github.com/Jordey92/tusk#readme","bugs":{"url":"https://github.com/Jordey92/tusk/issues"},"publishConfig":{"access":"public"},"keywords":["postgres","postgresql","migration","migrations","database","sql","sql-first","elysia","bun","node"],"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.js","type":"module","sideEffects":false,"engines":{"node":">=18","bun":">=1.3.8"},"packageManager":"bun@1.3.8","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./pg":{"types":"./dist/adapters/pg.d.ts","import":"./dist/adapters/pg.js","default":"./dist/adapters/pg.js"},"./postgres":{"types":"./dist/adapters/postgresjs.d.ts","import":"./dist/adapters/postgresjs.js","default":"./dist/adapters/postgresjs.js"},"./elysia":{"types":"./dist/plugins/elysia.d.ts","import":"./dist/plugins/elysia.js","default":"./dist/plugins/elysia.js"},"./package.json":"./package.json"},"bin":{"tusk":"dist/cli.js","tusk-mcp":"dist/mcp/server.js"},"scripts":{"clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","build":"bun run clean && tsc --project tsconfig.build.json","test":"bun run test:unit","test:unit":"bun test core/baseline-compatibility.test.ts core/checksum-validation.test.ts core/create-migration.test.ts core/init-project.test.ts core/read-migrations.test.ts core/migration-lock.test.ts core/migration-records.test.ts core/migration-resolution.test.ts core/migration-status.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/rollback-target.test.ts core/validate-migrations.test.ts core/doctor.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/cli-parser.test.ts utils/doctor-output.test.ts utils/errors.test.ts utils/fs-errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/test-helper.test.ts utils/version.test.ts adapters/postgres-client.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts mcp/database-port.test.ts mcp/server.test.ts mcp/test-utils/server.test.ts scripts/ci-workflows.test.ts scripts/quality/mutation-report.test.ts scripts/validate-release-version.test.ts scripts/verify-hosted-provider.test.ts","test:smoke:package":"bun test package-smoke.test.ts","test:smoke":"TUSK_SMOKE_DATABASE_URL=postgresql://user:password@127.0.0.1:5433/migrate_tool_test bun test package-smoke.test.ts cli.test.ts plugins/elysia.test.ts","test:db":"bun test adapters/pg.test.ts adapters/postgresjs.test.ts core/run-migrations.test.ts core/init-migration.test.ts core/track-migrations.test.ts mcp/server-db.test.ts","test:ci":"bun run build && TUSK_PACKAGE_SMOKE_SKIP_BUILD=1 bun test","test:coverage":"TUSK_SMOKE_DATABASE_URL=postgresql://user:password@127.0.0.1:5433/migrate_tool_test bun test --coverage --coverage-reporter=lcov --coverage-dir=coverage core/baseline-compatibility.test.ts core/checksum-validation.test.ts core/create-migration.test.ts core/init-project.test.ts core/read-migrations.test.ts core/migration-lock.test.ts core/migration-records.test.ts core/migration-resolution.test.ts core/migration-status.test.ts core/plan-migrations.test.ts core/rollback-plan.test.ts core/rollback-target.test.ts core/validate-migrations.test.ts core/init-migration.test.ts core/doctor.test.ts core/run-migrations.test.ts core/track-migrations.test.ts utils/checksum.test.ts utils/cli-output.test.ts utils/cli-parser.test.ts utils/doctor-output.test.ts utils/errors.test.ts utils/fs-errors.test.ts utils/filename.test.ts utils/logger.test.ts utils/runtime.test.ts utils/test-helper.test.ts utils/version.test.ts adapters/postgres-client.test.ts adapters/pg.test.ts adapters/postgresjs.test.ts adapters/pg/sql-generator.test.ts adapters/pg/introspection.test.ts adapters/pg/locking.test.ts adapters/pg/query.test.ts cli.test.ts plugins/elysia.test.ts mcp/database-port.test.ts mcp/server.test.ts mcp/server-db.test.ts","quality:dead-code":"knip --no-progress","quality:crap":"bun run test:coverage && bun scripts/quality/crap-report.ts","quality:mutation":"bun scripts/quality/mutation-report.ts","quality:agentic":"bun run build && bun run quality:dead-code && bun run quality:crap && bun run quality:mutation","quality:audit":"bun audit --production","quality:release:fast":"bun run quality:dead-code && bun run quality:crap && bun run quality:audit","quality:release":"bun run quality:dead-code && bun run quality:crap && bun run quality:mutation && bun run quality:audit","evidence:hosted":"bun scripts/verify-hosted-provider.ts","release:validate-version":"bun scripts/validate-release-version.ts","prepublishOnly":"bun run build"},"devDependencies":{"@types/bun":"latest","@types/node":"^24.6.2","@types/pg":"^8.15.5","elysia":"^1.4.27","knip":"^6.7.0","pg":"^8.16.3","postgres":"^3.4.7","typescript":"^5.9.3"},"peerDependencies":{"pg":">=8.0.0 <9","postgres":">=3.0.0 <4","elysia":">=1.4.27 <2"},"peerDependenciesMeta":{"pg":{"optional":true},"postgres":{"optional":true},"elysia":{"optional":true}},"dependencies":{"dotenv":"^17.2.3"},"_id":"@bydey/tusk@1.0.0","_integrity":"sha512-DiT4XVRyinpBoEdzQ55g1k5LrQd4xFILWojcF61FPqzFMJOhUZwCTP1EJ/lb56/7gZKs2aueTogC9B0E1R7V+w==","_resolved":"/home/runner/work/tusk/tusk/artifacts/release/bydey-tusk-1.0.0.tgz","_from":"file:/home/runner/work/tusk/tusk/artifacts/release/bydey-tusk-1.0.0.tgz","_nodeVersion":"24.18.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-DiT4XVRyinpBoEdzQ55g1k5LrQd4xFILWojcF61FPqzFMJOhUZwCTP1EJ/lb56/7gZKs2aueTogC9B0E1R7V+w==","shasum":"fa44b6aecb907faf0ba0141e8439d0b72ae4376d","tarball":"https://registry.npmjs.org/@bydey/tusk/-/tusk-1.0.0.tgz","fileCount":122,"unpackedSize":312350,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bydey%2ftusk@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCZUqaBOfUiBMkdE3DN83lmjaggLVAZGTBRqw4q26Z5xwIgTNRmEGlY1IYJF7GIJP9B2U9HWQrS5ecualy/oLeUGkU="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ad60f0c3-3704-4086-b731-502238021665"}},"directories":{},"maintainers":[{"name":"jordey92","email":"jordan@jordandey.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tusk_1.0.0_1783947544472_0.16093601581100825"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-16T03:18:22.901Z","modified":"2026-07-13T12:59:04.917Z","0.1.0":"2026-04-16T03:18:23.150Z","0.2.0":"2026-04-21T01:35:24.886Z","0.3.0":"2026-04-26T13:52:06.886Z","0.4.0":"2026-04-27T00:44:58.572Z","0.5.0":"2026-04-27T03:05:38.082Z","1.0.0":"2026-07-13T12:59:04.625Z"},"bugs":{"url":"https://github.com/Jordey92/tusk/issues"},"author":{"name":"Bydey"},"license":"MIT","homepage":"https://github.com/Jordey92/tusk#readme","keywords":["postgres","postgresql","migration","migrations","database","sql","sql-first","elysia","bun","node"],"repository":{"type":"git","url":"git+https://github.com/Jordey92/tusk.git"},"description":"SQL-first PostgreSQL migrations for Node.js and Bun","maintainers":[{"name":"jordey92","email":"jordan@jordandey.com"}],"readme":"# Tusk\n\n[![CI](https://github.com/jordey92/tusk/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/jordey92/tusk/actions/workflows/ci.yml)\n\nTusk is a SQL-first PostgreSQL migration tool for Node.js and Bun.\n\nIt is explicit and low abstraction:\n\n- write plain SQL, not a migration DSL\n- define `up` and `down` steps directly\n\nIt handles execution for you:\n\n- transactional migrations with advisory locking\n- one migration contract across `pg`, `postgres.js`, and the CLI\n\nTusk favors control and embeddability over schema builders and generated migrations.\n\n## Requirements\n\n- Node.js `18+` or Bun `1.3.8+`\n- PostgreSQL `13+`\n- ESM projects for programmatic use; the CLI works from any project type\n\nRecommended for new projects:\n\n- Node.js `24`\n- PostgreSQL `18`\n\n## Install\n\nInstall Tusk with one PostgreSQL driver. With `pg`:\n\n```bash\nnpm install @bydey/tusk pg\n# or\nbun add @bydey/tusk pg\n```\n\nWith `postgres.js`:\n\n```bash\nnpm install @bydey/tusk postgres\n# or\nbun add @bydey/tusk postgres\n```\n\nThe package root contains the driver-neutral migration API. Import driver and\nframework integrations from their explicit subpaths:\n\n```ts\nimport { runUp } from \"@bydey/tusk\";\nimport { createPgAdapter } from \"@bydey/tusk/pg\";\n// or: import { createPostgresJsAdapter } from \"@bydey/tusk/postgres\";\n```\n\nThe Elysia integration requires both `elysia` and `pg`:\n\n```bash\nbun add @bydey/tusk elysia pg\n```\n\nThe CLI and MCP server discover the installed driver. If both are installed,\n`pg` is the default; set `TUSK_DRIVER=postgres` to select postgres.js.\n\n## Migration Model\n\nTusk uses timestamped SQL files with explicit directionality.\n\nTusk reads SQL files from a migrations directory:\n\n```text\nmigrations/\n  1728123456789_create_users.up.sql\n  1728123456789_create_users.down.sql\n```\n\n- `*.up.sql` is applied when you run `up`\n- `*.down.sql` is applied when you run `down`\n- executed migrations are tracked in the `_migrations` table\n- migrations are protected by a Postgres advisory lock so two runners do not apply them at the same time\n\nTusk does not provide a migration DSL or schema abstraction layer.\n\nThe `_migrations` table name and shape are part of Tusk's v1 compatibility\ncontract. See [Metadata table contract](docs/metadata-table.md) for the exact\nschema, `search_path` scope, and safety behavior.\n\nExample:\n\n```sql\n-- migrations/1728123456789_create_users.up.sql\nCREATE TABLE users (\n  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n  email TEXT NOT NULL UNIQUE\n);\n```\n\n```sql\n-- migrations/1728123456789_create_users.down.sql\nDROP TABLE IF EXISTS users;\n```\n\n## Quick Start\n\nThis is the recommended first migration flow.\n\n1. Create a `.env` file. Tusk loads it automatically. Set either\n   `DATABASE_URL`:\n\n```dotenv\nDATABASE_URL=postgresql://user:password@localhost:5432/app\n```\n\nor individual settings:\n\n```dotenv\nDB_HOST=localhost\nDB_PORT=5432\nDB_NAME=app\nDB_USER=postgres\nDB_PASSWORD=secret\n```\n\nOptional settings:\n\n```dotenv\nMIGRATIONS_PATH=./migrations\nLOG_LEVEL=warn\nTUSK_DRIVER=pg\nTUSK_STATEMENT_TIMEOUT_MS=300000\n```\n\n`TUSK_STATEMENT_TIMEOUT_MS` applies to each migration transaction. Use `0` to\nleave PostgreSQL's statement timeout unchanged. See [Transactions and\ntimeouts](./docs/transactions.md).\n\n2. Initialise the project and create a migration pair:\n\n```bash\nnpx tusk init\nnpx tusk create create_users\n```\n\nWith Bun:\n\n```bash\nbunx tusk init\nbunx tusk create create_users\n```\n\n3. Edit both generated files under `migrations/`:\n\n```text\n<timestamp>_create_users.up.sql\n<timestamp>_create_users.down.sql\n```\n\n4. Validate the files before connecting to the database:\n\n```bash\nnpx tusk validate\n```\n\n5. Run the read-only project and database preflight:\n\n```bash\nnpx tusk doctor\n```\n\n6. Review the ordered SQL without applying it:\n\n```bash\nnpx tusk up --dry-run\n```\n\n7. Apply the migration, then confirm status:\n\n```bash\nnpx tusk up\nnpx tusk status\n```\n\nFor CI and agents, add `--json`. Use `tusk status --exit-code` to exit `1` when\nmigrations are pending, or `tusk status --quiet` for a single summary line.\n\nRoll back migrations. `down` defaults to one rollback so an omitted\nargument cannot accidentally undo the full migration history:\n\n```bash\nnpx tusk down\nnpx tusk down 1\nnpx tusk down --dry-run\nnpx tusk down 3\nnpx tusk down --all\n```\n\nRollback contract:\n\n- `tusk down` and `tusk down 1` roll back exactly the latest applied migration.\n- `tusk down n` rolls back the latest `n` applied migrations, newest first.\n- `tusk down --all` rolls back every applied migration, newest first.\n- An adopted `0000000000000_initial.up.sql` baseline is protected from ordinary\n  rollback. Tusk refuses before executing the batch unless the destructive\n  `--allow-baseline-rollback` override is present.\n- If `n` is greater than the number of applied migrations, Tusk rolls back all\n  available applied migrations and says how many were available.\n- If no migrations are applied, Tusk exits successfully with\n  `No applied migrations to roll back`.\n- Rollbacks use only matching `.down.sql` files. If any required rollback file\n  is missing, Tusk fails while planning before applying the rollback batch.\n\n## Starting From an Existing Database\n\nFor a new project, initialise the local migration directory first:\n\n```bash\nnpx tusk init\n```\n\nThis creates `./migrations` when it is missing. Add matching `.up.sql` and\n`.down.sql` files there, then run `tusk doctor` and `tusk up`.\n\nIf your schema already exists, Tusk can create and record a starting baseline\nwith the explicit adoption flag:\n\n```bash\nnpx tusk init --from-db\n```\n\nThis creates `0000000000000_initial.up.sql` and\n`0000000000000_initial.down.sql` so future schema changes can be managed through\nnormal migrations.\n\nThe generated initial migration is recorded in `_migrations` as already\napplied, so `tusk up` skips it and new migrations run normally. Ordinary\nrollback will not remove this baseline. The explicit\n`--allow-baseline-rollback` override can drop every table represented by the\nbaseline and should be treated as destructive.\n\nAdoption is not a complete PostgreSQL backup or schema-dump replacement. Tusk\nfails before writing or recording a baseline when it detects schema features it\ncannot reproduce safely, including custom types, arrays, views, routines,\ntriggers, policies, generated columns, check/exclusion constraints, partitions,\ninheritance, and unowned sequences. See [Existing database\nadoption](./docs/existing-databases.md) for the exact boundary.\n\n## Programmatic Use\n\nWith `pg`:\n\n```ts\nimport { Pool } from \"pg\";\nimport { runUp } from \"@bydey/tusk\";\nimport { createPgAdapter } from \"@bydey/tusk/pg\";\n\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL });\nconst adapter = createPgAdapter(pool);\n\ntry {\n  await runUp(adapter, \"./migrations\");\n} finally {\n  await pool.end();\n}\n```\n\nWith `postgres.js`:\n\n```ts\nimport postgres from \"postgres\";\nimport { runUp } from \"@bydey/tusk\";\nimport { createPostgresJsAdapter } from \"@bydey/tusk/postgres\";\n\nconst sql = postgres(process.env.DATABASE_URL!);\nconst adapter = createPostgresJsAdapter(sql);\n\ntry {\n  await runUp(adapter, \"./migrations\");\n} finally {\n  await sql.end();\n}\n```\n\nGenerate an initial migration programmatically:\n\n```ts\nimport { Pool } from \"pg\";\nimport { createInitialMigration } from \"@bydey/tusk\";\nimport { createPgAdapter } from \"@bydey/tusk/pg\";\n\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL });\nconst adapter = createPgAdapter(pool);\n\ntry {\n  await createInitialMigration(adapter, \"./migrations\");\n} finally {\n  await pool.end();\n}\n```\n\nCustom database clients only need to implement the exported\n`MigrationAdapter` contract (`query`, `transaction`, and migration lock\nmethods) to use planning and execution APIs. `DatabaseAdapter` extends that\ncontract with introspection and SQL generation used only by\n`createInitialMigration`. See the [custom adapter contract](docs/custom-adapters.md)\nbefore implementing one.\n\n## Elysia\n\n```ts\nimport { Elysia } from \"elysia\";\nimport { migrate } from \"@bydey/tusk/elysia\";\n\nnew Elysia()\n  .use(\n    migrate({\n      connectionString: process.env.DATABASE_URL,\n      migrationsPath: \"./migrations\",\n    }),\n  )\n  .listen(3000);\n```\n\nBy default the plugin runs `up` on startup.\nThe Elysia integration requires Bun 1.3.8+ or Node.js 20+; the rest of Tusk\nsupports Node.js 18+.\n\n## CLI Commands\n\n```text\ntusk create <name>\ntusk init\ntusk init --from-db\ntusk up\ntusk down [count]\ntusk down --all\ntusk down --allow-baseline-rollback\ntusk status\ntusk validate\ntusk doctor\ntusk version\n```\n\n`tusk down` and `tusk down 1` roll back one migration by default. This is\nintentionally narrow: the safest rollback is the latest migration only, and\nbroader rollback should be explicit. Use `tusk down <count>` to roll back\nseveral migrations, or `tusk down --all` to roll back every applied migration.\nRollback batches run newest first and use only matching `.down.sql` files. If a\nrequested count is larger than the applied migration count, Tusk rolls back all\navailable applied migrations and reports the smaller available count.\n\nAdopted baselines are protected. If a selected rollback would include\n`0000000000000_initial.up.sql`, Tusk refuses the whole batch unless\n`--allow-baseline-rollback` is supplied. Programmatic callers must opt in with\na rollback target such as\n`{ count: 1, allowBaselineRollback: true }`.\n\n`tusk up --dry-run`, `tusk down --dry-run`,\n`tusk down <count> --dry-run`, and `tusk down --all --dry-run` print the\nordered migration SQL without applying it.\n\n`tusk status --exit-code` exits with status `1` when migrations are pending and `0` when the schema is clean.\n\n`tusk status --quiet` suppresses the detailed sections and prints only the summary line, which is useful for scripts and CI logs.\n\n`tusk status --json` prints machine-readable status data with `ok`, `command`, `executed`, `pending`, and `summary` fields. It can be combined with `--exit-code`, but not with `--quiet`.\n\n`tusk validate` checks migration filenames, pairs, executable SQL, duplicate timestamps, and transaction-control statements. Add `--db` to check executed migration checksums against the configured database without modifying migration state.\n\n`tusk doctor` runs a read-only health check over the migration directory, database configuration, connection, PostgreSQL compatibility, migration metadata, checksum drift, status readability, and advisory lock support. It exits `0` when there are no failing checks and `1` when action is needed. Use `tusk doctor --json` for automation.\n\n`--json` is supported by `create`, `init`, `up`, `down`, `status`, `validate`, and `doctor` for machine-readable automation output. See the [JSON output contracts](./docs/json-contracts.md) for stable fields and compatibility rules.\n\n## Agent and MCP Use\n\nFor AI agents and automation, prefer the safe loop in [Agent workflow](./docs/agents.md): `doctor --json`, `validate --json`, `validate --db --json`, `up --dry-run --json`, then apply only after the plan is reviewed.\n\nTusk also includes a stdio MCP server:\n\n```bash\ntusk-mcp\n```\n\nIt exposes tools for validation, status, dry-run planning, and migration file creation.\n\n## Support Policy\n\nTusk keeps a wide support floor for teams working on older projects while still treating the current stack as the primary development lane.\n\n- Supported floor: Node.js `18+`, Bun `1.3.8+`, PostgreSQL `13+`\n- Recommended stack: Node.js `24`, PostgreSQL `18`\n- Required PR CI checks:\n  - `Verify (Node 24, PostgreSQL 18)` requires the full build/test/quality lane and the globally aggregated exhaustive mutation suite\n  - `Minimum Support (Node 18, PostgreSQL 13)` runs the packaged smoke test against the oldest supported runtime/database pair\n  - `Package smoke (macos-latest)` and `Package smoke (windows-latest)` verify the installed artifact on both desktop platforms\n- Scheduled compatibility coverage:\n  - the `Compatibility Matrix` workflow exercises packaged smoke tests across multiple supported Node.js and PostgreSQL versions\n\nIf a supported floor version stops passing CI, it is a regression and should be treated as a bug.\n\n## More\n\n- [Runnable basic example](./examples/basic)\n- [Framework integrations](./docs/integrations.md)\n- [Transactions and timeouts](./docs/transactions.md)\n- [Existing database adoption](./docs/existing-databases.md)\n- [Compatibility policy](./docs/compatibility.md)\n- [Doctor command](./docs/doctor.md)\n- [JSON output contracts](./docs/json-contracts.md)\n- [Testing guide](./docs/testing.md)\n- [Agent workflow](./docs/agents.md)\n- [Release guide](./docs/releasing.md)\n- [v1.0.0 readiness](./docs/v1-readiness.md)\n- [v1 release checklist](./docs/v1-release-checklist.md)\n- [v0.5.0 release notes](./docs/releases/v0.5.0.md)\n- [v0.3.0 release notes](./docs/releases/v0.3.0.md)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}