{
"id": "agent-first-psql",
"name": "Agent-First PSQL",
"domain": "cmn.dev",
"synopsis": "Persistent PostgreSQL client for AI agents — JSONL in, JSONL out, connection lifecycle managed transparently",
"intent": [
"Give AI agents a persistent PostgreSQL client that reuses long-lived database connections and sessions, so agents send SQL requests as JSONL and receive structured JSONL responses without managing connection setup",
"Bridge ad-hoc psql shell usage and protocol-specific integrations by providing transport-neutral, agent-native request and response framing",
"Provide predictable machine-readable outputs for row sets, command status, and errors so agent workflows can branch without parsing human-formatted terminal output"
],
"changes": [
"Add startup log event emitted when --log startup or --verbose is used, reporting version, argv, all resolved CLI arguments, environment variable snapshot (AFPSQL_* and standard PG* vars), and full runtime config — giving agents observability into what connection parameters were actually resolved at startup",
"Add standard PostgreSQL environment variable fallback (PGHOST, PGPORT, PGUSER, PGDATABASE) with lower precedence than AFPSQL_* vars, allowing afpsql to pick up connection settings from environments where these variables are already set (CI, Docker, local dev shells)",
"Add Unix socket path support in connection string resolution — when host begins with '/', afpsql uses conninfo format instead of a URL, enabling connections through local Unix domain sockets (e.g. /var/run/postgresql) without manual DSN construction"
],
"license": "MIT",
"references": [
{
"uri": "cmn://cmn.dev/spore/blake3_eeb9f29b968d51855c8b8d60d8f97b64beff48e92405e005b7890b40503415e3",
"relation": "follows",
"reason": "All request/response fields use Agent-First Data suffix conventions and output formats"
},
{
"uri": "cmn://cmn.dev/spore/blake3_2a01314cb7f17a60ced10d02eb41bdde5d892577552bdb3c0199e361f96b5423",
"relation": "spawned_from"
}
],
"tree": {
"algorithm": "blob_tree_blake3_nfc",
"excludes": [
".git"
],
"ignore_rules": [
".gitignore"
]
}
}