diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index 326a11e..08efb22 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -122,12 +122,12 @@ jobs: done test "$passed" -gt 0 # checkout's shallow SHA fetch creates a local lightweight tag; retrieve the actual tag object. - git fetch --force origin refs/tags/v0.1.17:refs/tags/v0.1.17 - test "$(git rev-parse 'v0.1.17^{commit}')" = "$GITHUB_SHA" - test "$(git describe --tags --exact-match HEAD)" = v0.1.17 - test "$(git cat-file -t refs/tags/v0.1.17)" = tag - gh release create v0.1.17 --draft --verify-tag --title 'SQLX 0.1.17' --notes-file docs/release-notes.md dist/*.zip dist/manifest.json dist/SHA256SUMS dist/release-version.txt - gh release edit v0.1.17 --draft=false --latest + git fetch --force origin refs/tags/v0.1.18:refs/tags/v0.1.18 + test "$(git rev-parse 'v0.1.18^{commit}')" = "$GITHUB_SHA" + test "$(git describe --tags --exact-match HEAD)" = v0.1.18 + test "$(git cat-file -t refs/tags/v0.1.18)" = tag + gh release create v0.1.18 --draft --verify-tag --title 'SQLX 0.1.18' --notes-file docs/release-notes.md dist/*.zip dist/manifest.json dist/SHA256SUMS dist/release-version.txt + gh release edit v0.1.18 --draft=false --latest npm: needs: [assemble] if: github.event_name == 'push' || inputs.publish @@ -143,7 +143,7 @@ jobs: env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: | - test "$GITHUB_REF_NAME" = v0.1.17 + test "$GITHUB_REF_NAME" = v0.1.18 name=$(node -p 'require("./package.json").name') version=$(node -p 'require("./package.json").version') test "$version" = "${GITHUB_REF_NAME#v}" @@ -157,7 +157,7 @@ jobs: env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: | - test "$GITHUB_REF_NAME" = v0.1.17 + test "$GITHUB_REF_NAME" = v0.1.18 for package in dsh pi; do name=$(node -p "require('./${package}/package.json').name") version=$(node -p "require('./${package}/package.json').version") diff --git a/Cargo.lock b/Cargo.lock index 4113a0c..2a65103 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2420,7 +2420,7 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ottermind-sqlx" -version = "0.1.17" +version = "0.1.18" dependencies = [ "aes-gcm", "anyhow", @@ -3376,7 +3376,7 @@ dependencies = [ [[package]] name = "sqlx-driver-duckdb" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "base64 0.22.1", @@ -3387,7 +3387,7 @@ dependencies = [ [[package]] name = "sqlx-driver-mongodb" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "base64 0.22.1", @@ -3399,7 +3399,7 @@ dependencies = [ [[package]] name = "sqlx-driver-mysql" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "base64 0.22.1", @@ -3411,7 +3411,7 @@ dependencies = [ [[package]] name = "sqlx-driver-postgres" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "base64 0.22.1", @@ -3429,7 +3429,7 @@ dependencies = [ [[package]] name = "sqlx-driver-redis" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "base64 0.22.1", @@ -3441,7 +3441,7 @@ dependencies = [ [[package]] name = "sqlx-driver-sqlite" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "base64 0.22.1", @@ -3452,7 +3452,7 @@ dependencies = [ [[package]] name = "sqlx-protocol" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "serde", @@ -3461,7 +3461,7 @@ dependencies = [ [[package]] name = "sqlx-ui" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "axum", diff --git a/Cargo.toml b/Cargo.toml index 09c0753..7305c06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/protocol", "crates/cli", "crates/ui", "drivers/mysql", "drivers/postgres", "drivers/redis", "drivers/mongodb", "drivers/sqlite", "drivers/duckdb"] [workspace.package] -version = "0.1.17" +version = "0.1.18" edition = "2021" rust-version = "1.95" license-file = "LICENSE" diff --git a/README.md b/README.md index 7208767..840e832 100644 --- a/README.md +++ b/README.md @@ -397,7 +397,7 @@ For Oracle and SQL Server, build the JDBC worker and place its driver JARs along ```sh mvn -B -f java/jdbc/pom.xml package -cp java/jdbc/target/sqlx-jdbc-0.1.17.jar target/release/sqlx-jdbc.jar +cp java/jdbc/target/sqlx-jdbc-0.1.18.jar target/release/sqlx-jdbc.jar curl -fL https://repo.maven.apache.org/maven2/com/oracle/database/jdbc/ojdbc11/23.6.0.24.10/ojdbc11-23.6.0.24.10.jar -o target/release/ojdbc.jar curl -fL https://repo.maven.apache.org/maven2/com/microsoft/sqlserver/mssql-jdbc/12.10.1.jre11/mssql-jdbc-12.10.1.jre11.jar -o target/release/mssql-jdbc.jar ``` @@ -406,7 +406,7 @@ On Windows PowerShell: ```powershell mvn -B -f java/jdbc/pom.xml package -Copy-Item java/jdbc/target/sqlx-jdbc-0.1.17.jar target/release/sqlx-jdbc.jar +Copy-Item java/jdbc/target/sqlx-jdbc-0.1.18.jar target/release/sqlx-jdbc.jar Invoke-WebRequest 'https://repo.maven.apache.org/maven2/com/oracle/database/jdbc/ojdbc11/23.6.0.24.10/ojdbc11-23.6.0.24.10.jar' -OutFile target/release/ojdbc.jar Invoke-WebRequest 'https://repo.maven.apache.org/maven2/com/microsoft/sqlserver/mssql-jdbc/12.10.1.jre11/mssql-jdbc-12.10.1.jre11.jar' -OutFile target/release/mssql-jdbc.jar ``` diff --git a/docs/release-notes.md b/docs/release-notes.md index 95d9ce4..fc4d63e 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,26 +1,15 @@ -SQLX 0.1.17 connects to eight more databases, four of them with a driver you install once from the vendor. +SQLX 0.1.18 checks for updates after every invocation and follows the desktop schedule while doing it. -## New engines +## Update checks -- Presto, Hive, Apache Kylin and XuguDB join the engines whose driver ships with the release. Their JDBC components download like Oracle's or SQL Server's, and each one carries what its driver needs: Presto and Kylin their own dependencies, Hive its standalone driver and logging binding. -- IBM Db2, IBM Informix, SUNDB and GBase 8s connect with a driver their vendor does not allow SQLX to redistribute. `sqlx driver add --type --jar ` installs the jar you obtained: it checks that the jar really carries the engine's driver class, stores it in `/drivers//`, and every later command loads it. `sqlx driver list` shows where each engine's driver comes from and `sqlx driver remove --type ` takes it back. Running a statement without a driver fails before anything is downloaded and names the command to run. -- A jar you provide is loaded before the released one it replaces, so a newer vendor driver works for any engine without waiting for a release. - -## New in the JDBC worker - -- A driver that does not implement `isValid` or `getMoreResults` no longer turns a working statement into an error: GBase 8s reports both as a plain `SQLException`, and only a driver that says the method is unsupported ends the call early. -- A driver that prints to standard output while answering a query no longer corrupts the event stream, which is how Kylin's Avatica client behaved; the CLI reports such a line on standard error, with credentials redacted, and keeps reading. -- The Informix-derived engines receive their server instance and client locale in the URL, and the Kylin component carries the JAXB runtime that Java 11 removed from the JDK. - -## Availability - -- The DeepSeek Harness and Pi packages are published on npm: `dsh plugin --profile add @ottermind/sqlx-dsh` and `pi install npm:@ottermind/sqlx-pi`. Both install the `sqlx` CLI themselves when it is missing. -- The Codex and Claude Code plugins install from the `plugins` branch: `codex plugin marketplace add OtterMind/sqlx@plugins` and `claude plugin marketplace add OtterMind/sqlx@plugins`, then add `sqlx@ottermind`. Their task description now names the new engines. +- The opportunistic check no longer requires an interactive terminal. Piped and agent invocations schedule it too; it runs detached with its streams closed, so a caller sees no extra output and never waits for the network. The cached "update available" notice on standard error still appears only in an interactive session. +- Checks follow the repeating schedule the desktop applications use: 30 minutes after the first check, then 1, 2, 4 and 6 hours, and then from 30 minutes again. The round is stored with the check record, so it survives between invocations; a failed check retries after 15 minutes, and an updated CLI starts the schedule over. +- A `CI` environment variable skips the check, so build machines do not run it. `SQLX_NO_UPDATE_CHECK=1` still disables opportunistic checks everywhere; explicit update commands are unaffected. ## Upgrading From SQLX 0.1.2 or later, run `sqlx update check`, `sqlx update install`, and `sqlx update status`. Versions 0.1.0 and 0.1.1 need the [README installer](https://github.com/OtterMind/sqlx#install-the-cli) first. -CLI updates preserve running UI services and the selected plugin, saved datasources and stored results; downloaded components are cached per version and reused, so an upgrade only fetches components that changed. Update managed Skills separately with `sqlx skill update`. The 0.1.17 Skill is published with a `>=0.1.17, <0.2.0` CLI requirement, so update the CLI before the Skill; an older Skill keeps working with the older CLI it was installed with. +CLI updates preserve running UI services and the selected plugin, saved datasources and stored results; downloaded components are cached per version and reused, so an upgrade only fetches components that changed. Update managed Skills separately with `sqlx skill update`. The 0.1.18 Skill is published with a `>=0.1.18, <0.2.0` CLI requirement, so update the CLI before the Skill; an older Skill keeps working with the older CLI it was installed with. -**Full Changelog**: https://github.com/OtterMind/sqlx/compare/v0.1.16...v0.1.17 +**Full Changelog**: https://github.com/OtterMind/sqlx/compare/v0.1.17...v0.1.18 diff --git a/integrations/claude/plugins/sqlx/.claude-plugin/plugin.json b/integrations/claude/plugins/sqlx/.claude-plugin/plugin.json index 12ece90..81d6cc9 100644 --- a/integrations/claude/plugins/sqlx/.claude-plugin/plugin.json +++ b/integrations/claude/plugins/sqlx/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "sqlx", - "description": "List saved OtterMind SQLX datasources, test connections, run SQL against MySQL, MariaDB, TiDB, GreatSQL, OceanBase, PostgreSQL, CockroachDB, YugabyteDB, openGauss, Oracle, SQL Server, ClickHouse, Trino, StarRocks, Apache Doris, TDengine, Dameng, KingbaseES, Presto, Hive, Apache Kylin, XuguDB, Db2, Informix, SUNDB and GBase 8s, run Redis commands and MongoDB command documents, and open local result pages. Credentials stay in the SQLX data directory. Requires the sqlx CLI (0.1.17+) through the plugin launcher.", - "version": "0.1.17", + "description": "List saved OtterMind SQLX datasources, test connections, run SQL against MySQL, MariaDB, TiDB, GreatSQL, OceanBase, PostgreSQL, CockroachDB, YugabyteDB, openGauss, Oracle, SQL Server, ClickHouse, Trino, StarRocks, Apache Doris, TDengine, Dameng, KingbaseES, Presto, Hive, Apache Kylin, XuguDB, Db2, Informix, SUNDB and GBase 8s, run Redis commands and MongoDB command documents, and open local result pages. Credentials stay in the SQLX data directory. Requires the sqlx CLI (0.1.18+) through the plugin launcher.", + "version": "0.1.18", "author": { "name": "OtterMind" }, diff --git a/integrations/claude/plugins/sqlx/runtime.json b/integrations/claude/plugins/sqlx/runtime.json index 6dcac3d..b758d69 100644 --- a/integrations/claude/plugins/sqlx/runtime.json +++ b/integrations/claude/plugins/sqlx/runtime.json @@ -1,5 +1,5 @@ { - "plugin_version": "0.1.17", - "cli_min_version": "0.1.17", + "plugin_version": "0.1.18", + "cli_min_version": "0.1.18", "mcp_protocol": 1 } diff --git a/integrations/codex/plugins/sqlx/.codex-plugin/plugin.json b/integrations/codex/plugins/sqlx/.codex-plugin/plugin.json index edd3510..59cbf56 100644 --- a/integrations/codex/plugins/sqlx/.codex-plugin/plugin.json +++ b/integrations/codex/plugins/sqlx/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "sqlx", - "version": "0.1.17", - "description": "List saved OtterMind SQLX datasources, test connections, run SQL against MySQL, MariaDB, TiDB, GreatSQL, OceanBase, PostgreSQL, CockroachDB, YugabyteDB, openGauss, Oracle, SQL Server, ClickHouse, Trino, StarRocks, Apache Doris, TDengine, Dameng, KingbaseES, Presto, Hive, Apache Kylin, XuguDB, Db2, Informix, SUNDB and GBase 8s, run Redis commands and MongoDB command documents, and open local result pages. Credentials stay in the SQLX data directory. Requires the sqlx CLI (0.1.17+) through the plugin launcher.", + "version": "0.1.18", + "description": "List saved OtterMind SQLX datasources, test connections, run SQL against MySQL, MariaDB, TiDB, GreatSQL, OceanBase, PostgreSQL, CockroachDB, YugabyteDB, openGauss, Oracle, SQL Server, ClickHouse, Trino, StarRocks, Apache Doris, TDengine, Dameng, KingbaseES, Presto, Hive, Apache Kylin, XuguDB, Db2, Informix, SUNDB and GBase 8s, run Redis commands and MongoDB command documents, and open local result pages. Credentials stay in the SQLX data directory. Requires the sqlx CLI (0.1.18+) through the plugin launcher.", "author": { "name": "OtterMind" }, diff --git a/integrations/codex/plugins/sqlx/runtime.json b/integrations/codex/plugins/sqlx/runtime.json index 6dcac3d..b758d69 100644 --- a/integrations/codex/plugins/sqlx/runtime.json +++ b/integrations/codex/plugins/sqlx/runtime.json @@ -1,5 +1,5 @@ { - "plugin_version": "0.1.17", - "cli_min_version": "0.1.17", + "plugin_version": "0.1.18", + "cli_min_version": "0.1.18", "mcp_protocol": 1 } diff --git a/integrations/dsh/package.json b/integrations/dsh/package.json index 0b0dcb1..8c3f95a 100644 --- a/integrations/dsh/package.json +++ b/integrations/dsh/package.json @@ -1,6 +1,6 @@ { "name": "@ottermind/sqlx-dsh", - "version": "0.1.17", + "version": "0.1.18", "description": "OtterMind SQLX tools for DeepSeek Harness: list datasources, test connections, execute SQL and open local result pages.", "type": "module", "main": "lib/index.js", diff --git a/integrations/pi/package.json b/integrations/pi/package.json index 7b276de..2bb25db 100644 --- a/integrations/pi/package.json +++ b/integrations/pi/package.json @@ -1,6 +1,6 @@ { "name": "@ottermind/sqlx-pi", - "version": "0.1.17", + "version": "0.1.18", "description": "OtterMind SQLX tools for the Pi coding agent: list datasources, test connections, execute SQL and open local result pages.", "keywords": [ "pi-package", diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 86148ae..907a962 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -1,6 +1,6 @@ 4.0.0 - ai.ottermind.sqlxsqlx-jdbc0.1.17 + ai.ottermind.sqlxsqlx-jdbc0.1.18 17UTF-8 com.fasterxml.jackson.corejackson-databind2.18.6 diff --git a/packages/npm-installer/package.json b/packages/npm-installer/package.json index 21f4853..1523dff 100644 --- a/packages/npm-installer/package.json +++ b/packages/npm-installer/package.json @@ -1,6 +1,6 @@ { "name": "@ottermind/sqlx", - "version": "0.1.17", + "version": "0.1.18", "description": "Install or update the SQLX database CLI and its agent Skill.", "license": "LicenseRef-Chat2DB", "homepage": "https://github.com/OtterMind/sqlx#readme", diff --git a/scripts/manifest.py b/scripts/manifest.py index 35c258e..8df572c 100644 --- a/scripts/manifest.py +++ b/scripts/manifest.py @@ -10,7 +10,7 @@ def load_shared(): return module package_shared=load_shared() PLATFORMS=['macos-arm64','macos-x64','windows-x64','linux-arm64','linux-x64'] -DEFAULT_VERSION='0.1.17' +DEFAULT_VERSION='0.1.18' def required_components(): """Exactly the components the packaging scripts emit: per-platform plus once-for-all.""" per_platform=set(package.PLATFORM_KINDS)|set(package_shared.PLATFORM_KINDS) diff --git a/scripts/package-shared.py b/scripts/package-shared.py index dc4fdd7..8ea84a0 100644 --- a/scripts/package-shared.py +++ b/scripts/package-shared.py @@ -68,7 +68,7 @@ def get(url): if attempt==2:raise time.sleep(attempt+1) def main(): - p=argparse.ArgumentParser();p.add_argument('--version',default='0.1.17');p.add_argument('--output',type=Path,default=ROOT/'dist');a=p.parse_args();a.output.mkdir(parents=True,exist_ok=True) + p=argparse.ArgumentParser();p.add_argument('--version',default='0.1.18');p.add_argument('--output',type=Path,default=ROOT/'dist');a=p.parse_args();a.output.mkdir(parents=True,exist_ok=True) records={};base=f'https://github.com/OtterMind/sqlx/releases/download/v{a.version}/' def add(name,entries,entrypoint,version=None): # Every component must be declared above, so the release manifest gate stays in sync diff --git a/scripts/package.py b/scripts/package.py index f44f7a2..514e0f9 100644 --- a/scripts/package.py +++ b/scripts/package.py @@ -11,7 +11,7 @@ def archive(output,files): for source,name in files:z.write(source,name) return hashlib.sha256(output.read_bytes()).hexdigest() def main(): - p=argparse.ArgumentParser();p.add_argument('--platform',required=True);p.add_argument('--version',default='0.1.17');p.add_argument('--bin-dir',type=Path,default=ROOT/'target/release');p.add_argument('--output',type=Path,default=ROOT/'dist');a=p.parse_args() + p=argparse.ArgumentParser();p.add_argument('--platform',required=True);p.add_argument('--version',default='0.1.18');p.add_argument('--bin-dir',type=Path,default=ROOT/'target/release');p.add_argument('--output',type=Path,default=ROOT/'dist');a=p.parse_args() a.output.mkdir(parents=True,exist_ok=True);records={} suffix='.exe' if a.platform.startswith('windows-') else '' for kind,binary in BINARIES.items(): diff --git a/tests/updates.py b/tests/updates.py index 91ac02f..f7f1522 100644 --- a/tests/updates.py +++ b/tests/updates.py @@ -14,7 +14,7 @@ import zipfile ROOT = Path(__file__).resolve().parents[1] -CURRENT = "0.1.17" +CURRENT = "0.1.18" NEXT = "0.1.99" SUFFIX = ".exe" if os.name == "nt" else "" NAME = "sqlx" + SUFFIX