Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
72aeafe
chore: add vitest and typecheck scripts
dancixx Aug 10, 2026
a16d18a
feat: escape separators and encode NULL distinctly in the wire format
dancixx Aug 10, 2026
a28f4fa
feat: apply row edits as one parameterized transaction
dancixx Aug 10, 2026
72268eb
fix: address tabs by id instead of index
dancixx Aug 10, 2026
39e9dbf
fix: cancel the query the user asked for, not the project's newest
dancixx Aug 10, 2026
91e617b
chore: ignore build output, generated schemas and agent notes
dancixx Aug 10, 2026
1817a49
perf: stream results into pages and drop the snapshot mirror
dancixx Aug 10, 2026
32b6e42
chore: gate CI on the checks that would have caught this release's bugs
dancixx Aug 10, 2026
e07f1c4
fix: give the connection pools a runtime so they can build
dancixx Aug 10, 2026
f0a8d01
fix: repair project deletion, CSV import, and Postgres error messages
dancixx Aug 10, 2026
8d90174
feat: add a schema index for the editor's language features
dancixx Aug 10, 2026
41b1e7b
feat: drive SQL completion from the parser instead of regexes
dancixx Aug 10, 2026
c689a03
fix: register SQL completion on the editor's own Monaco instance
dancixx Aug 10, 2026
9835238
fix: surface completion failures instead of showing an empty widget
dancixx Aug 10, 2026
dab3706
fix: keep completion readable and stop it registering twice
dancixx Aug 10, 2026
2858019
feat: accept a suggestion on Enter only when it completes something
dancixx Aug 10, 2026
090946b
fix: do not repeat a schema the user already typed
dancixx Aug 10, 2026
33e7fbd
perf: stop the footer readout walking every process every second
dancixx Aug 10, 2026
d33a940
feat: wait for a schema snapshot the first time it is needed
dancixx Aug 10, 2026
46f591b
fix: wait for the schema fetch already running
dancixx Aug 10, 2026
7293182
Merge remote-tracking branch 'origin/main' into fix/1.2.0-stabilization
dancixx Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/workflows/frontend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Frontend

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

jobs:
check:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: yarn

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Version consistency
run: node scripts/check-version.mjs

- name: Lint and format
run: yarn check:ci

- name: Typecheck
run: yarn typecheck

- name: Test
run: yarn test
11 changes: 7 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ jobs:
with:
node-version: lts/*

- name: Install Rust nightly
uses: dtolnay/rust-toolchain@nightly
with:
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
# Toolchain version comes from src-tauri/rust-toolchain.toml.
- name: Install Rust targets
if: matrix.platform == 'macos-latest'
run: rustup target add aarch64-apple-darwin x86_64-apple-darwin

- name: Install dependencies (ubuntu only)
if: matrix.platform == 'ubuntu-22.04'
Expand All @@ -55,6 +55,9 @@ jobs:
- name: Install frontend dependencies
run: yarn install --frozen-lockfile

- name: Version consistency
run: node scripts/check-version.mjs

- name: Resolve release tag
id: release_meta
shell: bash
Expand Down
54 changes: 0 additions & 54 deletions .github/workflows/rust-clippy.yml

This file was deleted.

75 changes: 56 additions & 19 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Rust

on:
push:
branches: [ "main" ]
branches: ["main"]
pull_request:
branches: [ "main" ]
branches: ["main"]

env:
CARGO_TERM_COLOR: always
Expand All @@ -14,25 +14,62 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4

- name: Install Rust nightly
uses: dtolnay/rust-toolchain@nightly
# Toolchain comes from src-tauri/rust-toolchain.toml.
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev libjavascriptcoregtk-4.1-dev

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev libjavascriptcoregtk-4.1-dev
- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: "./src-tauri -> target"

- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: "./src-tauri -> target"
- name: Format
run: cargo fmt --check
working-directory: src-tauri

- name: Build
run: cargo build --verbose
working-directory: src-tauri
- name: Clippy
run: cargo clippy --all-targets -- -D warnings
working-directory: src-tauri

- name: Run tests
run: cargo test --verbose
working-directory: src-tauri
- name: Test
run: cargo test
working-directory: src-tauri

integration:
runs-on: ubuntu-latest

services:
postgres:
image: postgres:16
env:
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5

steps:
- uses: actions/checkout@v4

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev libjavascriptcoregtk-4.1-dev

- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: "./src-tauri -> target"

- name: Row mutation tests against PostgreSQL
run: cargo test --test row_mutations -- --ignored
working-directory: src-tauri
env:
RSQL_TEST_DATABASE_URL: postgres://postgres:postgres@localhost:5432/postgres
15 changes: 7 additions & 8 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,15 @@ dist-ssr
*.sw?

# Rust/Tauri build output
/target
/src-tauri/target
target/
**/gen/schemas/

# Local sled databases
project_db
query_db

/src-tauri/project_db# Local databases (should never be committed)
src-tauri/project_db/
src-tauri/query_db/
project_db/
query_db/

*.db
.claude

# Agent working notes
docs/superpowers/
14 changes: 9 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "rsql",
"private": true,
"version": "1.1.5",
"version": "1.2.0",
"license": "MIT",
"type": "module",
"scripts": {
Expand All @@ -12,7 +12,10 @@
"format": "biome format --write .",
"lint": "biome lint .",
"check": "biome check --write .",
"check:ci": "biome check ."
"check:ci": "biome check .",
"typecheck": "tsc --noEmit",
"test": "vitest run",
"test:watch": "vitest"
},
"dependencies": {
"@glideapps/glide-data-grid": "^6.0.3",
Expand All @@ -34,8 +37,8 @@
"lodash": "^4.17.23",
"lucide-react": "^0.454.0",
"marked": "^17.0.4",
"monaco-editor": "^0.53.0",
"monaco-sql-languages": "^1.0.0",
"monaco-editor": "0.55.0",
"monaco-sql-languages": "^1.2.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-responsive-carousel": "^3.2.23",
Expand All @@ -55,6 +58,7 @@
"tailwindcss": "^4.1.13",
"tw-animate-css": "^1.3.3",
"typescript": "~5.8.3",
"vite": "^7.0.4"
"vite": "^7.0.4",
"vitest": "^3.2.4"
}
}
70 changes: 70 additions & 0 deletions scripts/check-version.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#!/usr/bin/env node
/**
* The release version lives in three files that must agree; the git history
* shows them drifting apart more than once. Run this in CI and as the first
* step of a release.
*
* With --set <version> it writes that version to all three instead of checking.
*/

import { readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";

const root = join(dirname(fileURLToPath(import.meta.url)), "..");

const sources = [
{
path: "package.json",
read: (text) => JSON.parse(text).version,
write: (text, version) => text.replace(/("version":\s*)"[^"]*"/, `$1"${version}"`),
},
{
path: "src-tauri/tauri.conf.json",
read: (text) => JSON.parse(text).version,
write: (text, version) => text.replace(/("version":\s*)"[^"]*"/, `$1"${version}"`),
},
{
path: "src-tauri/Cargo.toml",
read: (text) => text.match(/^version\s*=\s*"([^"]+)"/m)?.[1],
write: (text, version) => text.replace(/^(version\s*=\s*)"[^"]*"/m, `$1"${version}"`),
},
];

const setIndex = process.argv.indexOf("--set");
const target = setIndex === -1 ? null : process.argv[setIndex + 1];

if (setIndex !== -1 && !/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(target ?? "")) {
console.error(`Not a valid semver version: ${target ?? "(missing)"}`);
process.exit(1);
}

if (target) {
for (const source of sources) {
const file = join(root, source.path);
writeFileSync(file, source.write(readFileSync(file, "utf8"), target));
console.log(`${source.path} -> ${target}`);
}
process.exit(0);
}

const found = sources.map((source) => ({
path: source.path,
version: source.read(readFileSync(join(root, source.path), "utf8")),
}));

const missing = found.filter((entry) => !entry.version);
if (missing.length > 0) {
for (const entry of missing) console.error(`No version found in ${entry.path}`);
process.exit(1);
}

const distinct = [...new Set(found.map((entry) => entry.version))];
if (distinct.length > 1) {
console.error("Version mismatch:");
for (const entry of found) console.error(` ${entry.path}: ${entry.version}`);
console.error("\nRun `node scripts/check-version.mjs --set <version>` to align them.");
process.exit(1);
}

console.log(`Version ${distinct[0]} is consistent across all three files.`);
Loading
Loading