Compare commits
3
Commits
v0.7.15
...
9e54240cd6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e54240cd6 | ||
|
|
cb86caba9e | ||
|
|
60d472dde2 |
+46
-53
@@ -6,38 +6,22 @@ This file is the **source of truth** for what Gridline is building. [AGENTS.md](
|
||||
|
||||
---
|
||||
|
||||
## ✅ Shipped (0.7.10)
|
||||
## 🎯 Next up (0.8.0)
|
||||
|
||||
- **Copy connection URL** — from a connection card's ⋮ menu, copy the connection string for use in env vars / other tools: **Copy connection URL** (includes the password, fetched from the OS keychain on demand) and **Copy connection URL (no password)** (safe to share). Builds `postgresql://` / `mysql://` / `sqlite://` / `redis://` strings with percent-encoded credentials and the PG `sslmode` appended.
|
||||
- **Version bump** 0.7.9 → **0.7.10**.
|
||||
- **Schema diff / compare** — two-database structure diff (tables, columns, indexes, constraints, views) with generated sync SQL; pairs naturally with DB-to-DB sync
|
||||
- **Query Workbench: multiple result sets** — one query, stacked result tabs instead of only the last result *(deferred from 0.7.0)*
|
||||
- **Query Workbench: result streaming to file** — export 500k+ rows without loading them all into memory
|
||||
- **MariaDB support** — wire-compatible with MySQL; largely falls out of the v0.7.0 MySQL work (new `db_type`, provider card, version/introspection differences)
|
||||
- **TimescaleDB support** — PostgreSQL extension; connects as regular PG, detect + surface hypertables/compression in the object tree
|
||||
- **PlanetScale preset** — managed MySQL (Vitess) provider card following the Supabase/NeonDB pattern
|
||||
|
||||
## ✅ Shipped (0.7.9)
|
||||
|
||||
- **macOS Finder launch fix** — the local store opens under the OS app-data directory instead of a cwd-relative `gridline.db` (Finder/LaunchServices launches run with cwd `/`, so the old path made the app silently exit with a Rust panic before the UI started).
|
||||
- **macOS ad-hoc code signing** — bundles are signed at build time (`bundle.macOS.signingIdentity "-"`, hardened runtime off), replacing the Xcode linker-only signature that macOS treated as unsigned ("damaged and can't be opened", silent Finder refusal). Users still get a one-time Gatekeeper prompt; README documents the `sudo xattr -dr com.apple.quarantine` workaround.
|
||||
- **Vendored OpenSSL for `ssh2`** — the release binary no longer links an absolute Homebrew `/opt/homebrew/.../libssl.3.dylib` path (dyld aborted on machines without it).
|
||||
- **Version bump** 0.7.8 → **0.7.9**.
|
||||
|
||||
## 🎯 Next up (0.8.0) — TBD
|
||||
|
||||
Scope to be determined.
|
||||
|
||||
## ✅ Shipped (0.7.8)
|
||||
|
||||
- **SQLite `.dump` support** — match the pg_dump UX for SQLite (backup a SQLite database to a portable SQL dump, restore it back)
|
||||
- **Backup / Restore / Sync for MySQL & SQLite** — extend the pg-only tooling today: SQLite backup/restore + MySQL via `mysqldump` (system-first; decide bundling)
|
||||
- **Excel (.xlsx) export** — alongside CSV/JSON/SQL/Markdown in the grid export toolbar
|
||||
- **Cancel long-running queries** — per-connection cancel button (`pg_cancel_backend` and equivalents) instead of waiting or killing the app
|
||||
- **Settings export / import** — share theme, accent, editor options, page sizes, and defaults across machines (JSON file)
|
||||
- **Windows/Linux title bar fix** — the macOS "Overlay" drag strip (`h-7` in `App.tsx`) renders on every Tauri platform, so Windows/Linux show a blank grabbable bar between the native title bar and the page; gate the strip to macOS only (native title bar already handles dragging elsewhere)
|
||||
- **SQLite table editor (Create/Edit Table)** — the visual Create Table / Edit Table flow is PostgreSQL-only today (`tableManagement` capability + PG-flavored SQL gen in `TableForm`); extend to SQLite: SQLite-aware type mapping (no `serial` — `INTEGER PRIMARY KEY AUTOINCREMENT` instead), `TEXT`/`REAL`/`BLOB`, and ALTER TABLE limits (`ADD COLUMN` can't add PK/UNIQUE, `DROP COLUMN` needs SQLite ≥3.35)
|
||||
- **Version bump** 0.7.7 → **0.7.8**.
|
||||
Suggested build order: MariaDB → PlanetScale + TimescaleDB → query workbench (streaming, then multiple result sets) → schema diff.
|
||||
|
||||
## 📋 In the queue
|
||||
|
||||
### Full Redis Support
|
||||
|
||||
Connection + test work today; **key browsing is explicitly not part of 0.7.0** — it stays gated behind an "unsupported" state. Goal: first-class Redis like the PG/SQLite/MySQL viewers.
|
||||
Connection + test only today — browsing stays gated behind a clean "unsupported" state. Goal: first-class Redis like the PG/SQLite/MySQL viewers.
|
||||
|
||||
- Key browser (pattern search, filter by type, TTL display, key count)
|
||||
- Value editors per type: string, list, hash, set, zset, stream, JSON
|
||||
@@ -46,28 +30,26 @@ Connection + test work today; **key browsing is explicitly not part of 0.7.0**
|
||||
|
||||
### Additional Database Types
|
||||
|
||||
- **MariaDB** (wire-compatible with MySQL — should largely fall out of the 0.7.0 MySQL work)
|
||||
- **TimescaleDB** (PostgreSQL extension — largely free once PG browsing is solid; surface hypertables/compression in the object tree)
|
||||
- Candidates after that: CockroachDB, DuckDB, SQL Server, MongoDB (drivers are heavier lifts — revisit with demand)
|
||||
MariaDB and TimescaleDB moved to [0.8.0](#-next-up-080). Remaining candidates: CockroachDB, DuckDB, SQL Server, MongoDB (drivers are heavier lifts — revisit with demand).
|
||||
|
||||
### Managed Database Support (beyond Supabase / Neon)
|
||||
|
||||
Supabase and NeonDB presets shipped in v0.7.0. Remaining candidates:
|
||||
Supabase and NeonDB presets shipped in v0.7.0; PlanetScale moved to [0.8.0](#-next-up-080). Remaining:
|
||||
|
||||
- **PlanetScale** (Vitess/MySQL)
|
||||
- **Turso** (libSQL)
|
||||
- **Turso** (libSQL — not SQLite over the wire; needs a `libsql` driver path in the Rust backend, not just a connection preset)
|
||||
- Provider detection guidance: paste a provider URL → Gridline auto-fills host/port/SSL mode; provider "connect" docs linked from the connection form
|
||||
|
||||
### Query Workbench Upgrades
|
||||
|
||||
- **Multiple result sets** — one query, multiple result tabs (stacked/scrollable) instead of only the last result *(deferred from 0.7.0)*
|
||||
- **Result streaming to file** — export 500k+ rows without loading them all into memory
|
||||
Multiple result sets and result streaming to file moved to [0.8.0](#-next-up-080). Remaining:
|
||||
|
||||
- **Visual query builder** — drag-and-drop tables/joins/filters that generate SQL (TablePlus has one; DB Pro plans one)
|
||||
|
||||
### Schema & Data Tooling
|
||||
|
||||
- **Schema diff / compare** — two-database structure diff that pairs naturally with DB-to-DB sync
|
||||
- **MySQL Objects view + schema visualizer** — functions/triggers/sequences/enums/extensions browsing and ER diagram for MySQL *(deferred from 0.7.0 and out of scope for the object-management release — PostgreSQL-only for now)*
|
||||
Schema diff / compare moved to [0.8.0](#-next-up-080). Remaining:
|
||||
|
||||
- **MySQL Objects view + schema visualizer** — functions/triggers/sequences/enums/extensions browsing and ER diagram for MySQL *(PostgreSQL-only today)*
|
||||
- **More export formats** — JSONL, Parquet alongside CSV/JSON/SQL/Markdown/Excel
|
||||
|
||||
## 🔮 Planned
|
||||
@@ -84,9 +66,9 @@ Bring-your-own-key — no bundled model, no paywall, key stored in the OS keycha
|
||||
|
||||
### Website & Docs
|
||||
|
||||
- Landing page with screenshots, feature tour, and download links
|
||||
The marketing site (`www/`, Astro) is live: landing page with screenshots, FAQ, and a changelog feed. Remaining:
|
||||
|
||||
- User documentation (connection setup, SSH/TLS, backup/sync, changes queue)
|
||||
- Blog / changelog feed
|
||||
|
||||
### UI/UX Improvements (rolling)
|
||||
|
||||
@@ -99,15 +81,37 @@ Continuous polish, tracked as issues rather than one-off milestones:
|
||||
- Session restore — reopen tabs and query state from the last session
|
||||
- Light-theme parity pass — dark is first-class; polish the light theme to match
|
||||
|
||||
Deferred from 0.7.0, slated for this bucket:
|
||||
Still deferred from 0.7.0, slated for this bucket:
|
||||
|
||||
- **Onboarding tour** — first-run walkthrough built around the Gridline Demo database; contextual tooltips per screen
|
||||
- **Settings export/import** — share theme, accent, editor options, page sizes, and defaults across machines (JSON file)
|
||||
- **SSH key management** — read/generate key pairs and paste private keys directly in the SSH tab (today: path inputs only)
|
||||
- **In-app changelog** — "What's new" panel fed from bundled release notes
|
||||
|
||||
---
|
||||
|
||||
## ✅ Shipped (0.7.10)
|
||||
|
||||
- **Copy connection URL** — from a connection card's ⋮ menu, copy the connection string for use in env vars / other tools: **Copy connection URL** (includes the password, fetched from the OS keychain on demand) and **Copy connection URL (no password)** (safe to share). Builds `postgresql://` / `mysql://` / `sqlite://` / `redis://` strings with percent-encoded credentials and the PG `sslmode` appended.
|
||||
- **Version bump** 0.7.9 → **0.7.10**.
|
||||
|
||||
## ✅ Shipped (0.7.9)
|
||||
|
||||
- **macOS Finder launch fix** — the local store opens under the OS app-data directory instead of a cwd-relative `gridline.db` (Finder/LaunchServices launches run with cwd `/`, so the old path made the app silently exit with a Rust panic before the UI started).
|
||||
- **macOS ad-hoc code signing** — bundles are signed at build time (`bundle.macOS.signingIdentity "-"`, hardened runtime off), replacing the Xcode linker-only signature that macOS treated as unsigned ("damaged and can't be opened", silent Finder refusal). Users still get a one-time Gatekeeper prompt; README documents the `sudo xattr -dr com.apple.quarantine` workaround.
|
||||
- **Vendored OpenSSL for `ssh2`** — the release binary no longer links an absolute Homebrew `/opt/homebrew/.../libssl.3.dylib` path (dyld aborted on machines without it).
|
||||
- **Version bump** 0.7.8 → **0.7.9**.
|
||||
|
||||
## ✅ Shipped (0.7.8)
|
||||
|
||||
- **SQLite `.dump` support** — backup a SQLite database to a portable SQL dump and restore it back, matching the pg_dump UX
|
||||
- **Backup / Restore / Sync for MySQL & SQLite** — the pg-only tooling extended: MySQL backup/restore via `mysqldump` (system-first) and DB-to-DB sync beyond PostgreSQL
|
||||
- **Excel (.xlsx) export** — alongside CSV/JSON/SQL/Markdown in the grid export toolbar
|
||||
- **Cancel long-running queries** — per-connection cancel button (`pg_cancel_backend` and equivalents) instead of waiting or killing the app
|
||||
- **Settings export / import** — share theme, accent, editor options, page sizes, and defaults across machines (JSON file)
|
||||
- **Windows/Linux title bar fix** — the macOS overlay drag strip (`h-7` in `App.tsx`) is now gated to macOS; Windows/Linux use the native title bar for dragging
|
||||
- **SQLite table editor (Create/Edit Table)** — the visual Create Table / Edit Table flow extended to SQLite: SQLite-aware type mapping (`INTEGER PRIMARY KEY AUTOINCREMENT` instead of `serial`, `TEXT`/`REAL`/`BLOB`) and ALTER TABLE limits respected (`ADD COLUMN` can't add PK/UNIQUE, `DROP COLUMN` needs SQLite ≥3.35)
|
||||
- **Version bump** 0.7.7 → **0.7.8**.
|
||||
|
||||
## ✅ Shipped (0.7.7)
|
||||
|
||||
### Admin follow-up
|
||||
@@ -151,24 +155,13 @@ Deferred from 0.7.0, slated for this bucket:
|
||||
- **Input styling sweep** — `rounded-full` → `rounded-lg` on all form controls.
|
||||
- **Version bump** 0.6.0 → **0.7.0**.
|
||||
|
||||
**Not in 0.7.0** (deferred, tracked above): Redis key browsing, MySQL Objects/ERD views, backup/restore/sync for MySQL + SQLite, multiple result sets, SSH key-file management, settings import/export, onboarding tour.
|
||||
**Deferred from 0.7.0**: Redis key browsing and MySQL Objects/ERD views (still in the queue); SSH key management and onboarding tour (planned). Since shipped elsewhere: backup/restore/sync for MySQL & SQLite and settings import/export (0.7.8); multiple result sets (slated for 0.8.0).
|
||||
|
||||
## ✅ Shipped
|
||||
## ✅ Shipped — earlier releases (pre-0.7.0)
|
||||
|
||||
- Full PostgreSQL object management — create/edit/drop staged through the changes queue (v0.7.6)
|
||||
- Enable Keychain toggle — opt-out password persistence (v0.7.6)
|
||||
- Objects view tabbed workspace (v0.7.6)
|
||||
- Bundled PG client tools — `pg_dump`/`pg_restore`/`psql` shipped with the app, system-first with bundled fallback (v0.7.5)
|
||||
- Schema CRUD — create/rename/drop schemas with CASCADE + dependency warning (v0.7.5)
|
||||
- Global object search — Cmd+K across all object types in the current schema (v0.7.5)
|
||||
- Copy as DDL for any object (v0.7.5)
|
||||
- Object dependencies — `pg_depend` view before destructive drops (v0.7.5)
|
||||
- Tauri 2.0 + React 19 + TypeScript 5.8 project shell
|
||||
- PostgreSQL and SQLite browse/query support
|
||||
- Full MySQL DB viewer — connect, browse, query, edit + changes queue (v0.7.0)
|
||||
- New Connection screen revamp — provider grid + Supabase/NeonDB managed-pg presets (v0.7.0)
|
||||
- DB viewer capability gating + Redis unsupported state (v0.7.0)
|
||||
- Connection management with URI parser, SSH tunnels, TLS, OS keychain
|
||||
- PostgreSQL and SQLite browse/query support
|
||||
- Workspace tree, folders, tags, favorites, recents
|
||||
- Multi-tab DB viewer with virtualized grid, server-side filtering/sorting
|
||||
- FK preview, JSON popover, inline cell editing, changes queue
|
||||
|
||||
@@ -3,6 +3,7 @@ import { describe, it, expect } from "vitest";
|
||||
// test free of a `node:fs` dependency so `tsc` (bun run build) stays clean.
|
||||
import agents from "../../../AGENTS.md?raw";
|
||||
import readme from "../../../README.md?raw";
|
||||
import landing from "../../../www/public/landing.js?raw";
|
||||
|
||||
describe("v0.7.15 docs coverage", () => {
|
||||
it("AGENTS.md marks inline cell editing complete", () => {
|
||||
@@ -69,4 +70,7 @@ describe("v0.7.15 docs coverage", () => {
|
||||
expect(readme).toContain("Gridline_0.7.15_aarch64.dmg");
|
||||
expect(readme).toContain("Gridline-0.7.15-1.x86_64.rpm");
|
||||
});
|
||||
it("landing.js platform download links point to v0.7.15", () => {
|
||||
expect(landing).toContain('const version = "0.7.15"');
|
||||
});
|
||||
});
|
||||
+21
-58
@@ -7,13 +7,12 @@
|
||||
#
|
||||
# Usage:
|
||||
# TAG=v0.7.11 ./scripts/release-mac.sh
|
||||
# (optionally set GITEA_TOKEN env var to override token lookup)
|
||||
#
|
||||
# The release is keyed by tag. The Linux/Windows job creates it on the first
|
||||
# tag push; this script finds it (creating it only if it somehow doesn't exist)
|
||||
# and attaches the two DMGs: Gridline_<ver>_aarch64.dmg and Gridline_<ver>_x64.dmg
|
||||
#
|
||||
# Token: reads $GITEA_TOKEN, else tries the tea CLI config, else prompts.
|
||||
# Auth: uses the `tea` CLI (OAuth token, auto-refreshed).
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
@@ -28,40 +27,15 @@ if [ -z "$TAG" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ---- resolve auth token ----------------------------------------------------
|
||||
get_token() {
|
||||
if [ -n "${GITEA_TOKEN:-}" ]; then
|
||||
echo "$GITEA_TOKEN"; return
|
||||
fi
|
||||
# Try tea's stored credentials if available.
|
||||
if command -v tea >/dev/null 2>&1; then
|
||||
# tea stores its token in a config under the platform app-support dir.
|
||||
local cfg
|
||||
cfg="$(find "$HOME/Library/Application Support" "$HOME/.config" \
|
||||
-maxdepth 2 -name 'config.yml' -path '*tea*' 2>/dev/null | head -1 || true)"
|
||||
if [ -n "$cfg" ]; then
|
||||
local tok
|
||||
tok="$(sed -n 's/.*token:[" ]*\([^" ]*\).*/\1/p' "$cfg" 2>/dev/null | head -1 || true)"
|
||||
if [ -n "$tok" ]; then echo "$tok"; return; fi
|
||||
fi
|
||||
fi
|
||||
# Fall back to the git credential store: tea's OAuth login stores an access
|
||||
# token as the password for every push to this remote, and Gitea accepts it
|
||||
# for API auth (Authorization: token <access_token>).
|
||||
local host cred
|
||||
host="${GITEA_SERVER#*://}"
|
||||
cred="$(printf 'protocol=https\nhost=%s\n\n' "$host" \
|
||||
| git credential fill 2>/dev/null | sed -n 's/^password=//p' | head -1 || true)"
|
||||
if [ -n "$cred" ]; then echo "$cred"; return; fi
|
||||
# Fail fast — continuing without a token fails only at the upload step,
|
||||
# after the whole build has run.
|
||||
echo "error: no Gitea token found" >&2
|
||||
echo " set GITEA_TOKEN, or run 'tea login' / 'git push' once so the" >&2
|
||||
echo " credential store has an entry for $host" >&2
|
||||
# ---- resolve auth (tea CLI) ------------------------------------------------
|
||||
# The `tea` CLI carries the OAuth token and refreshes it automatically, so the
|
||||
# release upload below uses `tea` rather than a raw curl + token. (The git
|
||||
# credential store can hold a stale access token and 401.)
|
||||
if ! command -v tea >/dev/null 2>&1; then
|
||||
echo "error: tea CLI not found (needed to upload release assets)" >&2
|
||||
echo " install it: https://gitea.com/gitea/tea" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
GITEA_TOKEN="$(get_token)"
|
||||
fi
|
||||
|
||||
# ---- macOS signing + notarization -----------------------------------------
|
||||
# Requires a "Developer ID Application" certificate in the login keychain and
|
||||
@@ -224,32 +198,21 @@ for APP in \
|
||||
done
|
||||
|
||||
# ---- create/ensure release + upload DMGs -----------------------------------
|
||||
API="${GITEA_SERVER}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}"
|
||||
AUTH="Authorization: token ${GITEA_TOKEN}"
|
||||
# Use `tea` for release management — it handles OAuth token refresh, unlike a
|
||||
# raw curl with a token from the git credential store (which can 401).
|
||||
cd "${WORKSPACE}"
|
||||
|
||||
echo ">> Ensuring release ${TAG} exists..."
|
||||
REL_ID=$(curl -fsS -H "$AUTH" "${API}/releases/tags/${TAG}" \
|
||||
| python3 -c "import sys,json;print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true)
|
||||
if [ -z "$REL_ID" ]; then
|
||||
BODY="Gridline ${VERSION} — macOS (built manually)."
|
||||
REL_ID=$(curl -fsS -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||
-d "{\"tag_name\":\"${TAG}\",\"name\":\"Gridline ${VERSION}\",\"body\":\"${BODY}\",\"draft\":true}" \
|
||||
"${API}/releases" \
|
||||
| python3 -c "import sys,json;print(json.load(sys.stdin)['id'])")
|
||||
if ! tea release list -o json 2>/dev/null | grep -q "\"${TAG}\""; then
|
||||
tea release create --tag "${TAG}" --title "Gridline ${VERSION}" \
|
||||
--note "Gridline ${VERSION} — macOS (built manually)." --draft
|
||||
else
|
||||
echo ">> Release ${TAG} already exists."
|
||||
fi
|
||||
|
||||
upload() {
|
||||
local file="$1"
|
||||
[ -f "$file" ] || { echo "missing $file" >&2; exit 1; }
|
||||
local name
|
||||
name=$(basename "$file")
|
||||
echo ">> uploading $name"
|
||||
curl -fsS -X POST -H "$AUTH" -H "Content-Type: application/octet-stream" \
|
||||
--data-binary "@$file" \
|
||||
"${API}/releases/${REL_ID}/assets?name=${name}"
|
||||
}
|
||||
|
||||
upload "${BUNDLE_ARM}/dmg/Gridline_${VERSION}_aarch64.dmg"
|
||||
upload "${BUNDLE_INTEL}/dmg/Gridline_${VERSION}_x64.dmg"
|
||||
echo ">> Uploading macOS DMGs..."
|
||||
tea releases assets create "${TAG}" \
|
||||
"${BUNDLE_ARM}/dmg/Gridline_${VERSION}_aarch64.dmg" \
|
||||
"${BUNDLE_INTEL}/dmg/Gridline_${VERSION}_x64.dmg"
|
||||
|
||||
echo "Done. Release: ${GITEA_SERVER}/${REPO_OWNER}/${REPO_NAME}/releases/tag/${TAG}"
|
||||
|
||||
Reference in New Issue
Block a user