Skip to content

v1.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Oct 16:05
· 4 commits to main since this release

Changelog

  • 5a7392d fix(spill): keep the row count whole when the fallback footer is cut
  • ea201e7 fix(http): refuse token-less requests before their body and bound reads
  • 48647ec docs: correct the audit of a failed ask and the XDG_CONFIG_HOME rule
  • c357a16 fix(engine): replace bytes that are not UTF-8 in every query error
  • ecf050b fix(spill): make an existing spill directory 0700 before writing
  • b226986 fix(tools): keep resources/list within the 10 KB inline limit
  • f37ee8c test(engine): wait 30s for the server to end an oversized query
  • b735926 test(guard): name the Warm test after what it checks
  • 8102deb fix(serve): wait at most 2 seconds for the engine to close at exit
  • 494da19 fix(http): listen on IPv4 alone for any host but an IPv6 address
  • 4274472 fix(introspect): read pg_search and pg_profile values under 16 MiB
  • aaed7cf fix(spill): write no spill file under a path that is not UTF-8
  • 6688aaf docs: name the confirmation question as the one result past 10 KB
  • 6ec1351 fix(tools): cut a wrapped protocol error to the 10 KB limit
  • 02b7326 fix(tools): audit a tools/call that ends in a protocol error
  • 98bd802 chore(lint): enable modernize
  • 06e0ca1 refactor: adopt Go 1.26 idioms
  • 648e70d docs: split the safety model and pg_explain costing into short bullets
  • 0a26f66 ci(release): fail before GoReleaser unless server.json names the tag
  • 0d8d9d2 ci: drop the bench job: the test matrix already runs it on PG 15-18
  • b1fd580 chore: merge finish/surface
  • b600d1a chore: merge finish/bounds
  • e704f22 docs(introspect): say each definition is bounded, not their number
  • d83526d docs: name the protocol errors the 10 KB bound does not cover
  • 7b0ccc4 fix(explain): read the plan under 16 MiB so large plans are summarized
  • b545859 docs: say to move the .env files with config.json when upgrading
  • bc94ace fix(introspect): cut long definitions so pg_schema keeps within max_bytes
  • 5cee472 docs: say over --http the role check findings reach the first caller
  • 31288f0 fix(tools): audit every resources/read, also those the SDK turns away
  • 23ee101 fix(tools): list only the resources of connections already in use
  • 9a30ee8 fix(spill): cut the fallback notes so a long spill path keeps the limit
  • 4b753ae fix(engine): replace bytes that are not UTF-8 in column and type names
  • 8fd5a20 perf: compile the SQL parser in the background as the server starts
  • f124c72 docs: fix the upgrade steps: move config.json, rename server and rules
  • 7bacca0 fix: honour $XDG_CONFIG_HOME for the default config file
  • 6b9b72e fix(http): listen on IPv4 alone when --http names an IPv4 address
  • 773621b docs: say each run of bytes that are not UTF-8 becomes one U+FFFD
  • 370f5cd ci: pin actions by commit SHA, GoReleaser and the base image exactly; add Dependabot
  • 4b48079 fix(tools): show control and invisible formatting characters in the confirmation as escapes
  • cff62c6 test(engine): spell U+FFFD and é as escapes in the UTF-8 test
  • 567fe59 fix(tools): show and bind each connection's search_path in the confirmation, asked after its check
  • ef66457 fix(http): send a WWW-Authenticate Bearer challenge with every 401
  • aa00240 fix(tools): refuse an older client that cannot be asked during the call, whatever its _meta claims
  • 4410fd4 fix(engine): replace bytes that are not UTF-8 in values and errors, so 10 KB holds at the client
  • 5db1185 fix(tools): cut the name an unknown tool or prompt error echoes to 10 KB
  • ac0caea fix(registry): run the image as the user, who can read a private config
  • 2fb83c3 fix(tools): introduce the server by title, description and website
  • 19a808b fix(tools): cut the URI a resource-not-found error echoes to 10 KB
  • 78ad973 fix(http): cancel the calls still running when shutdown's 10s run out
  • 33f0e7d fix(http): require the token for OPTIONS * too, which net/http answered itself
  • 5182f9e fix(engine): hide a DSN that does not parse: it may hold a password
  • 2e81672 ci: fail on known vulnerabilities the code reaches, with govulncheck
  • 1655c57 fix(deps): require Go 1.26.9 and patch x/text, x/crypto, go-archive
  • 34d2366 test: cover doctor's failed role check, a failed spill cleanup and the fallback spill directory's errors
  • a7707fa test(tools): fail every tool on an unknown connection before any query, and cover the AWS status and error texts
  • f697bf4 test(spill): a Store without Now stamps and cleans up by the current time
  • 5908ad2 test(introspect): fail Profile when its sample fails or counts other columns
  • a8cc46e test(health): check the fixture through Check, and fail on results Postgres did not raise
  • d861347 test(guard): reject a statement nested anywhere in a query, and show parse errors without a position
  • 29d743a test(explain): fail Run on a plan or relation sizes it cannot read, and a nested loop without an outer side
  • aff4fd6 test(resolver): fetch secrets from a local Secrets Manager stand-in, and never cache a failed fetch
  • 456cf5b test(engine): cover Querier, QueryError.Error, an unresolvable DSN and an unencodable param
  • c64b9e6 test(testdb): cover Querier, Block, AppSQL and the harness's failure paths
  • 6db7833 refactor: remove inline comments
  • 7f90650 ci: keep the checkout's credentials out of every CI job
  • ac528db docs: name the golangci-lint version CI runs
  • 4ad562b test: set the deprecated readonly key through config.Parse, which CI's linter accepts
  • 8282322 docs: bring README and CONTRIBUTING in line with the merged lanes
  • 0d85512 test(tools): share auditedCall between the fan-out and confirmation tests
  • a02ce55 test: share testdb.ServerVersion instead of repeating the version query
  • 0b78d4f fix(cli): cancel the query when an HTTP client drops its request
  • c7307a9 chore: merge pgglass/pg18
  • d317a47 chore: merge pgglass/dist
  • b2a99da chore: merge pgglass/bench
  • 9e9670d chore: merge pgglass/confirm
  • 352166e chore: merge pgglass/resources
  • 5b62979 chore: merge pgglass/cli
  • 4a6bcb7 chore: merge pgglass/fixes
  • cc5f8d3 ci: test on PostgreSQL 18 and list the supported versions
  • c2ea4ec feat(explain): flag PostgreSQL 18 storage spills and keep per-loop rows to two decimals
  • f12a572 fix(introspect): name virtual generated columns among the reasons pg_profile samples
  • d85b12a fix(introspect): show a column under a NOT VALID not-null constraint as nullable
  • e62eb5a feat(preflight): warn of pg_signal_autovacuum_worker and pg_get_logical_snapshot_*
  • cd9f2da feat(guard): deny pg_buffercache_evict* and pg_logicalinspect's snapshot readers
  • e6409be docs: warn that HTTP on loopback without a token is open to every local user
  • 4db0acb docs: list the command line, doctor and HTTP in the README's docs table
  • 4c85930 fix(cli): bound doctor's credential lookup by its connect timeout
  • ea942e9 feat(cli): serve Streamable HTTP with --http, bearer token beyond loopback
  • 9eb1d1c feat(cli): add doctor to check the config and each connection's role
  • 655e4e1 feat(cli)!: read the config from --config, by default ~/.config/pgglass/config.json, and add --version
  • 50e7c0e test(tools): prove a client's cancellation of pg_query cancels its query on Postgres
  • cb82918 test(tools): overflow fan-out sections with 63-byte names and a long spill path, not names config refuses
  • 7ae58c4 fix(config): refuse a default_schema over 63 bytes at startup
  • 0dbda37 fix(tools): say inline when limit or max_rows cut pg_search's matches
  • a5b9b18 fix(explain): cost an EXISTS subquery for its first row, as the planner charges it
  • 7a7c3e8 fix(tools): keep "role check failed" in strict refusals whose audit Postgres refused
  • 72d6306 fix(health): say a long-running session's transaction is open that long, not its state
  • fa78e0e docs: link the token benchmark from the README and CONTRIBUTING
  • f16ddcf ci: run the token benchmark in a job of its own
  • 4513b7b test(bench): add a token benchmark checked against a baseline
  • e81e63a docs: say which variables to pass to the container
  • dcbf80b docs: document the install script, release archives, the Docker image and releasing
  • 3edf1d0 feat(registry): add server.json for the MCP Registry
  • 1482db7 feat(install): check the archive against checksums.txt and install every released platform
  • a05f459 ci(release): build macOS and Linux on amd64 and arm64 with SBOMs and a GHCR image, and attest them
  • 2ff1ff9 docs: document the table resources and their audit lines
  • 9b41bce feat(tools): expose tables as pgglass:// MCP resources for @-mentions
  • bd9d787 feat(tools): pass the role check without consuming its findings
  • 669014f feat(introspect): wrap ErrNotFound when Table finds no relation
  • e70b3c6 feat(tools): ask the user before running on confirm connections
  • 8aca1f5 feat(tools): title every tool, send usage instructions and negotiate the newest MCP revision
  • 01af1da chore: require Go 1.26, upgrade dependencies, go-sdk v1.8.0 and CI actions
  • 62c954c refactor!: rename the project to pgglass
  • 1177b53 fix(tools): spill every fanned-out section when the sections overflow
  • eacda8a fix(introspect): cut comments to 200 characters so long ones keep pg_schema within max_bytes
  • f96baa7 fix(tools): say when limit or max_rows cut a spilled pg_search
  • 6166946 fix(explain): drop the fell-short guess that flagged scans a LIMIT stopped early
  • 21b14cb test(tools): lead the long-name diff fixture's tables with their number
  • 2e59029 docs: name the spill path, not only long names, as what overflows fan-out sections
  • e724cd5 test(tools): size diffText's room from a spilled summary, now that linesOutput returns short lines inline
  • cfc89f3 chore: merge v2/polish2-tidy (pg_diff_schema names the side whose role check fails; long_running ages sessions by their transaction)
  • 7b70a0d chore: merge v2/polish2-bounds (names over 63 bytes are refused; spill drops Spill and Output, and its fallback cuts cells as the call does)
  • d5801d3 chore: merge v2/polish2-explain (pg_explain flags what runs under a LIMIT that fell short, and costs an inner OFFSET in full)
  • 4c241fe test(tools): state the exact worst-case sizes in the inline-bound comments
  • 6da1da1 fix(spill): cut cells in the no-file fallback only as the call does
  • a2c4978 refactor(spill): drop Spill and Output; linesOutput uses OutputWhole
  • 8d4673a fix(explain): flag what runs under a LIMIT that fell short, and cost an inner OFFSET in full
  • cc270f5 docs: list explain, health and guardtest in the project structure
  • f21f13c fix(tools): name view queries and open transactions in descriptions
  • 37dac27 fix: refuse connection and object names longer than Postgres keeps
  • e7f1ea6 fix(health): age a session in a transaction by its transaction, running or idle
  • 93574f9 test(tools): assert the long-schema refusal and fit pg_diff_schema's summary under its first line
  • 3059aa8 fix(tools): name the side whose role check fails in pg_diff_schema
  • ead2f0a docs: add the MIT license
  • eec89f5 fix(tools): keep fanned-out sections within the inline limit
  • 85b695c fix(tools): return pg_health's findings whole, not cut at 200 characters
  • 4e0303d fix(tools): keep every response within the inline limit
  • 6a2dc4e fix(explain): flag the scan under a window over the whole partition
  • 543911e test(health): gofmt health_test.go
  • e6d96f3 chore: merge v2/polish-tidy (deny pg_prewarm, drop the unbounded Schemas/Tables and Statement.SQL, rename the gap tests)
  • 882ea54 chore: merge v2/polish-health (pg_health counts client backends, ages idle transactions, ranks dead rows by count)
  • 0867b30 chore: merge v2/polish-diff (pg_diff_schema compares view queries and names the side that fails)
  • e52c463 chore: merge v2/polish-explain (pg_explain costs and flags what a LIMIT stops early by the share it reads)
  • 2eb2109 chore: merge v2/polish-spill (summaries and fan-out sections stay within the inline limit; spilled lines and profile values stay whole)
  • 71bb6e2 docs(health): tighten the long_running wording in the usage guide and its test
  • 25de5b6 fix(health): count only client backends against max_connections
  • df054ea fix(explain): stop flagging and overcosting what a LIMIT stops early
  • d9eb0b8 fix(tools): return pg_profile's values whole, not cut at 200 characters
  • e02816c fix(tools): always spill the lines a tool finds too large, whole
  • a1d5158 fix(health): age sessions idle in transaction by their transaction, not their last query
  • 080a6d5 fix(spill): keep summaries and fan-out sections within the inline limit
  • 3a74417 fix: compare view queries in pg_diff_schema and name the side that fails
  • 38d9231 fix(guard): deny pg_prewarm, which any role may run to evict the shared buffers' working set
  • f321f49 fix(health): rank dead_tuples by dead rows, so tiny tables no longer crowd out large ones
  • 305c083 refactor(explain): remove Statement.SQL, which only a test called, and test the statement through Run
  • 9b06016 refactor(introspect): remove the unbounded Schemas and Tables, which only tests called
  • 27663ea test(tools): name the gap tests after their behaviour and drop a check that cannot fail
  • c656da1 test(resolver): cover the env and dotenv sources' Status through StatusFor
  • 5adb6f8 fix(tools): spill pg_search matches past the inline limit
  • 4765436 fix(guard): deny autoprewarm_*, which let any role write a server file
  • a2861b8 docs: document all eight tools and what sets the server apart
  • b60cce6 refactor: dedupe the merged tools' text-result builders and definition tests
  • c02e8dc chore: merge v2/p4-fixes (credential refetch, bounded pg_schema listings, spill dir fallback, doc fixes)
  • 4c2d446 chore: merge v2/p4-health (pg_health, a server health report from statistics views)
  • 85773fc chore: merge v2/p4-explain (pg_explain, a compact plan summary with flags)
  • aeb8c93 chore: merge v2/p4-profile (pg_profile, column profiles from pg_stats or a sample)
  • 92a4f6a chore: merge v2/p4-diff (pg_diff_schema compares a schema on two connections)
  • 5f87978 chore: merge v2/p4-fanout (pg_query fan-out over up to 10 connections)
  • d20e33c test: skip the server-start test under -short and tidy a firstLines comment
  • aebb56a docs: qualify the search_path and default_transaction_read_only claims
  • 4e4fcc4 fix: spill to a private temp directory when there is no user cache directory
  • 2a902d2 fix(tools): bound pg_schema's catalog queries to 500 schemas or relations per listing
  • ff1504c feat(tools): add pg_health, a read-only server health report from statistics views
  • 9afa508 fix(preflight): flag EXECUTE on heap_force_*, pg_truncate_visibility_map and pg_log_standby_snapshot
  • 47a9dd2 feat(tools): add pg_profile, column profiles from pg_stats or a bounded sample
  • c83bb10 docs(engine): point the package doc to the guard's denylists instead of repeating them
  • b96b273 fix(resolver): key the AWS secret cache by aws_profile and secret_name
  • 490154d fix(engine): fetch cached credentials again when the server refuses them
  • 3b8e05d feat(tools): add pg_diff_schema to compare a schema on two connections
  • dea9802 feat(tools): add pg_explain, a compact plan summary with flags
  • ac248f8 feat(introspect): read a schema's structure in one query and diff two
  • 0948568 feat(tools): fan pg_query out over up to 10 connections at once
  • 79eefe6 fix(guard): deny setseed, whose seed for random() outlives the rollback
  • d4fb15b fix(engine): refuse a new connection whose DSN names another user, database or host
  • 60245c3 fix(guard): deny index maintenance and functions that take a transaction id
  • ed9a2d1 docs: bring README, docs and role-check comment in line with the merged fixes
  • cbe3be8 fix(tools): refuse a denied schema as pg_query's search_path in the tools, not the engine
  • a58b1bc chore: merge v2/fix55-tools (tools, spill and test-helper review fixes)
  • 000cc8f chore: merge v2/fix55-guard (guard denylists and preflight review fixes)
  • af35579 chore: merge v2/fix55-engine (engine, config and resolver review fixes)
  • a96e695 fix(guard): deny pg_surgery and visibility-map truncation
  • 9295089 docs(engine): say what the per-message headroom is for
  • 86681a9 fix(engine): refuse a search_path naming a schema the guard denies
  • f8594b2 test: replace four scan-one-value helpers with testdb.Value
  • 9c0b3fe test(tools): prove parallel calls on one connection overlap by their backends
  • e466136 fix(guard): deny pg_log_* functions
  • 5ba9b5b fix(tools): stop waiting for another call's role check when the call ends
  • b1f52ce build: build without cgo, like the release binaries
  • e22555d refactor(engine): drop the compile-only contract test and unexport limits
  • bfef36e test(preflight): index the session user's failing query by name
  • a7320c3 docs: describe the relation denylist in the guard's comments and fix corpus source tags
  • 621f041 fix(engine): fail on an oversized server message that comes before any row
  • 074dce2 docs(tools): say strict refuses critical findings, not every role that can write
  • f377079 fix: spill under the user cache directory instead of the shared temp directory
  • 224ff2d docs: say which findings are critical and add the PgBouncer read-only caveat
  • a376a8b feat(preflight): audit the session user and membership in superuser roles
  • 88b0d50 fix(engine): count 24 bytes per value against max_bytes
  • f70d673 refactor: share the unknown-connection error and format list, drop RLSEnabled, rely on Parse defaults
  • 9bd0f15 fix(engine): let a query waiting on a connection open give up with its context
  • b2e046a fix(tools): cut pg_schema output to the inline limit with a note
  • c294b9b fix(engine): resolve credentials again for each new connection
  • 29d001e fix(preflight): flag EXECUTE on pg_background, aws_s3, aws_lambda and more server-file functions
  • d1aec52 refactor(spill): summarize spills by column names and types, capped to fit inline
  • bd0083a fix(preflight): pin the audit's search_path to pg_catalog
  • e90aece fix(guard): deny pg_background and the aws_s3 and aws_lambda schemas
  • 7b9ab1c fix(guard): deny transaction-level advisory locks
  • 9cefdf5 fix(guard): deny pg_log_backend_memory_contexts, which signals other backends
  • 42052bd fix(config): bound the timeouts and spill_ttl_hours
  • 476aa4e test: drop compile-only contract tests, tautologies and harness self-tests
  • 3e8e1e7 fix(guard): deny catalogs that hold credentials, and get_raw_page
  • f94aeb1 fix(config): reject unknown keys in config.json
  • d3f55da test: replace enginetest and duplicated helpers with testdb.Querier, Conn and Image
  • 322955f fix(guard): deny table_to_xml* and xpath_table, which read a relation by name
  • 358311e fix(resolver): report a binary AWS secret instead of panicking
  • 294cb37 fix(resolver): build the AWS secret DSN as an escaped URL
  • 93934dc test(resolver): run TestRegisterSource serially; it races the parallel registry reads
  • 922e929 test(resolver): stop TestRegisterSource racing the parallel tests
  • b1b6550 fix: close server-config read bypass and per-field memory DoS
  • 31cad2e docs: describe the v2 tools, safety model and settings
  • 4326330 feat(tools): rewire the tools on guard, role check, engine and spill
  • 5484ed0 feat(engine): per-query max_rows; pin UTF8 and conforming strings
  • b8ebf03 fix(guard): deny functions whose effects outlive the rollback
  • 7a61923 feat: merge v2/introspect, catalog introspection with a TTL cache
  • ffbdfbd feat: merge v2/render-spill, result formats and the spill store
  • cac2e8f feat: merge v2/preflight, the connected-role audit
  • 80be2cd feat: merge v2/guard, the parser-based SQL guard
  • 83f7506 feat: merge v2/engine, the pooled READ ONLY query engine
  • c52fd5b feat(guard): parse SQL and allow only one read-only statement
  • 7b77b2d feat(engine): run each query in a rolled-back READ ONLY transaction on per-connection pools
  • 5fe8001 feat: implement render formats and the spill store
  • 791ec4d feat(introspect): catalog introspection with compact renders and a TTL cache
  • ccee856 feat(preflight): audit the connected role for write and escape privileges
  • 2033864 feat: add v2 package contracts and a testcontainers Postgres harness
  • 50da612 feat(config): add role_check, max_rows, max_bytes, lock timeout, spill TTL and format settings
  • 594312a ci: migrate golangci-lint config to v2 and pin golangci-lint v2.10.1
  • adde695 docs: slim down README and move detailed docs to docs/
  • 67aa722 fix(ci): rewrite golangci-lint config for v1 format compatibility
  • 722de9b docs: add contributing guide with branch strategy and source extension walkthrough
  • 5519730 docs: add usage guide with step-by-step examples and parallel query tips
  • 54cb6be feat: add 24h TTL to AWS secrets cache
  • 57761b8 refactor: restructure into internal/ packages following Go conventions
  • 126a2d5 refactor: split resolver into separate files by concern
  • b1a74bd refactor: extract fieldValidator for structured credential validation
  • 8c951d5 docs: add connection structure guide and extensibility reference
  • 08dd83d refactor: introduce CredentialSource interface for pluggable credential backends
  • b4de17e docs: add comprehensive README for open-source release
  • f9820d4 feat: add MCP server entrypoint with parallel query support
  • 17117a5 feat: add MCP tool handlers for list, query, and schema discovery
  • 3aa13de feat: add query output formatting and smart truncation
  • d9dccc2 feat: add connection pool with TTL, VPN check, and DSN handling
  • 9aca782 feat: add pluggable credential resolver with four source types
  • 846eaf6 feat: add flexible multi-source connection configuration
  • 25808b6 chore: add Go module definition and dependencies
  • 6bee76a chore: add project scaffolding and CI/CD configuration