Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
369 commits
Select commit Hold shift + click to select a range
704cb26
feat(linux): visual pending-state + Ctrl+S save shortcut
datlechin Apr 27, 2026
6f3f055
feat(linux): undo/redo + mark-delete + NULL sentinel italics
datlechin Apr 27, 2026
2bea0cc
feat(linux): close-with-unsaved-changes guard via AdwAlertDialog
datlechin Apr 27, 2026
453099d
feat(linux): app-level quit guard for any-tab pending changes
datlechin Apr 27, 2026
8db9c41
feat(linux): inline draft-row Insert (replaces InsertDialog modal)
datlechin Apr 27, 2026
e38176c
refactor(linux): drop modal Insert/Edit dialogs + dead row-mutation p…
datlechin Apr 27, 2026
7412350
fix(linux): cell-edit UX bugs — NULL sentinel, empty-input semantics,…
datlechin Apr 27, 2026
37ce574
datagrid: deep audit fixes — drivers, lifetime, async safety, UX
datlechin Apr 27, 2026
537732a
datagrid: performance hardening — column-view caching, text truncatio…
datlechin Apr 27, 2026
d41869e
datagrid: empty state + keyboard/clipboard polish
datlechin Apr 27, 2026
73bb8c6
datagrid: HIG polish — tabs, keyboard, bulk delete
datlechin Apr 27, 2026
4cb6139
datagrid: IME-safe cell-edit commit (CR5)
datlechin Apr 27, 2026
03d24e9
Merge remote-tracking branch 'origin/main' into linux
datlechin Apr 27, 2026
1ab48c5
datagrid: audit cleanup — wide tables, NULL i18n, shortcuts doc
datlechin Apr 27, 2026
926fa13
core: DDL builders + IndexInfo / ForeignKeyInfo (DDL UI #1)
datlechin Apr 27, 2026
282e5d1
drivers: fetch_indexes / fetch_foreign_keys (DDL UI #2)
datlechin Apr 27, 2026
0eafd36
services: structure_tracker + workspace persistence (DDL UI #3)
datlechin Apr 27, 2026
1a368b9
app: WorkspaceTab::Structure variant + DDL routing (DDL UI #4)
datlechin Apr 27, 2026
ee86f5d
sidebar: New Table button + Edit Structure / Drop context (DDL UI #5)
datlechin Apr 27, 2026
0a532d5
Merge remote-tracking branch 'origin/main' into linux
datlechin Apr 27, 2026
0d55557
structure: full Columns / Indexes / FKs / SQL Preview UI (DDL UI #6)
datlechin Apr 27, 2026
78193a1
audit: data-integrity fixes (DDL UI batch 1)
datlechin Apr 27, 2026
1fd1b9c
audit: HIG + API correctness fixes (DDL UI batch 2)
datlechin Apr 27, 2026
a247f61
audit: code-quality cleanup (DDL UI batch 3)
datlechin Apr 27, 2026
0767413
audit: deferred items — lazy popover, boxed-list rows, shortcuts (DDL…
datlechin Apr 28, 2026
eaf189e
audit: M+L tier polish (DDL UI batch 5-7)
datlechin Apr 28, 2026
857bfa2
fix(sidebar): right-click menu actions silently dropped
datlechin Apr 28, 2026
8981362
debug(sidebar): aggressive logging on context-menu chain
datlechin Apr 28, 2026
d870e96
fix(sidebar): revert lazy popover — eager set_parent at row init
datlechin Apr 28, 2026
41f11cb
refactor(sidebar): demote debug logs after fix verified
datlechin Apr 28, 2026
1463075
fix(structure): double title bar + 19 phantom pending changes
datlechin Apr 28, 2026
2167eda
fix(structure): Add buttons icon-only + tab title schema-disambig
datlechin Apr 28, 2026
94f5dfe
fix(structure): ViewSwitcher into HeaderBar, drop redundant title strip
datlechin Apr 28, 2026
9f98f31
fix: batch 1 critical security + data-integrity fixes
datlechin Apr 28, 2026
2d62139
feat(ui): unified Table tab with Data/Structure AdwViewSwitcher (M-1)
datlechin Apr 28, 2026
ff13130
refactor(ui): drop legacy WorkspaceTab::Browse, restrict Structure to…
datlechin Apr 28, 2026
81e63da
fix(ui): sidebar tooltip + schema-aware search filter (M-2)
datlechin Apr 28, 2026
c09ae86
feat(editor): multi-result tabs for multi-statement scripts (M-3)
datlechin Apr 28, 2026
51db14e
fix(ui): browse paginator → gtk::ActionBar (D-2)
datlechin Apr 28, 2026
226d766
fix(ui): batch-A audit follow-ups — panic fix + cleanup
datlechin Apr 28, 2026
c63c097
feat: batch B — data-loss guards, query timeout, banner mutex
datlechin Apr 28, 2026
0d3a620
ci(postgres): pin testcontainer to postgres:16-alpine
datlechin Apr 28, 2026
f0691f5
feat(ui): batch E — Index/FK form dialogs + Duplicate row action
datlechin Apr 28, 2026
bbc7714
fix(mysql): use column_type for data_type so tinyint(1) detects as bool
datlechin Apr 28, 2026
9d1c7cd
fix: deep-audit findings — multi-attr alter, RefCell, close-after-save
datlechin Apr 28, 2026
22482d8
fix(grid): column sort beyond 1st click — listen to order-notify too
datlechin Apr 28, 2026
db40202
fix(grid): undo reverts tracker but not the cell — root-cause
datlechin Apr 28, 2026
3a53c0a
fix(grid): cell shows pending edit + reverts on undo (root-cause)
datlechin Apr 28, 2026
b8297c7
refactor: tighten dead-code allows post-integration
datlechin Apr 28, 2026
c192756
refactor(linux): native polish — Browse cell editor, dialogs, sidebar…
datlechin Apr 29, 2026
d8656b5
refactor(linux): rewrite Structure tab to snapshot+diff with native w…
datlechin Apr 29, 2026
bfe7141
feat(grid): right-click on empty area below last row → Insert row
datlechin Apr 29, 2026
f90ad6e
refactor(structure): collapse driver_can_alter_* triplet, extract ind…
datlechin Apr 29, 2026
1658e87
fix(grid): clearer change-tracking visuals — (auto) sentinel, thicker…
datlechin Apr 29, 2026
a5009a2
fix(grid): empty-space menu must not fire when right-click hits a cell
datlechin Apr 29, 2026
1869cd3
fix(grid): cell + empty-space context menus — eagerly parent PopoverM…
datlechin Apr 29, 2026
951878d
refactor(grid): single shared PopoverMenu at ColumnView level — nativ…
datlechin Apr 29, 2026
b58d1c3
fix(ui): sidebar native polish — caption-heading, aligned margin, emp…
datlechin Apr 29, 2026
efe1b66
fix(welcome): confirm destructive remove of saved connections via Adw…
datlechin Apr 29, 2026
72ac41d
fix(welcome): align CTA copy to state/instruction/action + sort conne…
datlechin Apr 29, 2026
86c2923
fix(connect-dialog): Enter submits form, busy label only on the runni…
datlechin Apr 29, 2026
02531f4
fix(editor): Esc cancels query, drop preserves existing buffer, font-…
datlechin Apr 29, 2026
cdd69a0
fix(ui): close-with-pending dialogs name the tab + factual GNOME-HIG …
datlechin Apr 29, 2026
3874970
fix(prefs): trigger button is flat with ellipsis, storage row tooltip…
datlechin Apr 29, 2026
7e8549a
fix(prefs): clear keyboard focus on page map so mouse-scroll doesn't …
datlechin Apr 29, 2026
beb5cea
Revert "fix(prefs): clear keyboard focus on page map so mouse-scroll …
datlechin Apr 29, 2026
2864bd8
fix(history): confirm bulk-delete via AdwAlertDialog before wiping se…
datlechin Apr 29, 2026
307ea13
style: apply cargo fmt --all
datlechin Apr 29, 2026
cd00db1
feat(linux): reopen closed tab, format SQL, recency-first connections
datlechin Apr 29, 2026
f9e7c10
refactor(structure-tab): split into columns / indexes / fks submodules
datlechin Apr 29, 2026
04f1629
ci(linux): run Fast checks inside ubuntu:25.10 for glib 2.82+
datlechin Apr 29, 2026
916e6e0
refactor(linux): UX polish — Structure tab, Browse paginator, status …
datlechin Apr 29, 2026
4b749a0
refactor(linux): structure dialogs, toast UX, search-bar focus restore
datlechin Apr 29, 2026
3f835ac
docs(linux): bring ARCHITECTURE.md up to date
datlechin Apr 29, 2026
226c1fe
feat(linux): visible multi-row select feedback + Esc to clear
datlechin Apr 29, 2026
e8999d2
fix(linux): clear selection after Delete + correct row lookup with dr…
datlechin Apr 30, 2026
defefb2
Merge branch 'main' into linux
datlechin Apr 30, 2026
f6e46af
feat(linux): drafts in multi-select Delete + tracker tests
datlechin Apr 30, 2026
9c4e099
test(linux): extract build_persisted_row_key + 6 unit tests
datlechin Apr 30, 2026
1bf4209
feat(linux): show CREATE TABLE + run statement at cursor
datlechin Apr 30, 2026
c4d7d23
feat(linux): Ctrl+/ toggles SQL line comment in editor
datlechin Apr 30, 2026
fef1d6f
feat(linux): per-table WHERE filter dialog with full operator set
datlechin Apr 30, 2026
bfd639a
refactor(linux): filter goes inline + raw SQL escape hatch
datlechin Apr 30, 2026
74059c7
fix(linux): compact filter strip — fix the bloated layout
datlechin Apr 30, 2026
8e5d410
refactor(linux): raw SQL becomes the primary filter input
datlechin Apr 30, 2026
2f8e5ee
Merge branch 'main' into linux
datlechin May 13, 2026
f20f695
fix(linux): filter button no longer adopts system accent color
datlechin May 14, 2026
3efac69
fix(linux): bundle funnel-symbolic icon so the filter button renders
datlechin May 14, 2026
a29d6f1
refactor(linux): filter button uses text label instead of bundled icon
datlechin May 14, 2026
1d7d029
refactor(linux): drop find-on-page, Ctrl+F now opens the filter
datlechin May 14, 2026
25da10c
refactor(linux): drop mutation toolbar, move Insert to per-table Head…
datlechin May 14, 2026
ea70d3c
fix(linux): empty workspace gains 'Open SQL editor' CTA + global Ctrl+T
datlechin May 14, 2026
939f8da
refactor(linux): drop in-tab Data/Structure switcher; Structure becom…
datlechin May 14, 2026
c521531
fix(linux): drop the gap above the grid (flat top-bar on BrowseTab)
datlechin May 14, 2026
241e454
fix(linux): remove the lingering top-bar slot above the browse grid
datlechin May 14, 2026
4a38a9b
refactor(linux): collapse browse top-bar slot via reveal-top-bars ins…
datlechin May 14, 2026
4838120
fix(linux): inserting a draft on an empty table now flips the grid in…
datlechin May 14, 2026
92a177c
fix(linux): defer scroll-to-draft past the empty→grid stack flip to a…
datlechin May 14, 2026
67d3af4
fix(linux): drop empty-state stack child to stop the bounds.y == 0 cr…
datlechin May 14, 2026
89c1384
fix(linux): substitute schema columns for empty driver results so hea…
datlechin May 14, 2026
ed067bf
refactor(linux): drop the leftmost-cell ribbon on changed rows; tint …
datlechin May 14, 2026
e66feb0
style(app): apply rustfmt to satisfy CI format check (#1954) (#1955)
Seha16 Jul 25, 2026
77262e0
feat(drivers): add SQL Server driver via tiberius (#1957) (#1958)
Seha16 Jul 26, 2026
d8add7f
docs(linux): refresh ROADMAP against shipped Phase 2/3 work (#1978)
cozyGarage Jul 29, 2026
e464bd0
chore(linux): merge main into linux and restore the PluginKit symlink
datlechin Jul 29, 2026
120101e
chore(linux): restore the .local-deps ignore rule the merge dropped
datlechin Jul 29, 2026
e4c9735
feat(drivers): add ClickHouse driver via official clickhouse crate (#…
cozyGarage Jul 29, 2026
eaa9463
feat(drivers): Windows integrated (Kerberos) auth for SQL Server (#19…
Seha16 Aug 3, 2026
9363fb5
feat(linux): add result grid context menu with Copy as and Export Res…
Seha16 Sep 8, 2026
143dfc7
chore(deps): remove unused dependencies and the storage to ssh edge
datlechin Sep 14, 2026
320e65d
fix(core): escape backslashes in ClickHouse quoted identifiers
datlechin Sep 14, 2026
c65e967
fix(core): neutralise only textual cells in CSV export
datlechin Sep 14, 2026
c3af59a
build(deps): pin tiberius to tiberius-rs main for rustls 0.23 and gua…
datlechin Sep 14, 2026
95ce426
build(deps): upgrade gettext-rs to 0.8 and call setlocale before thre…
datlechin Sep 14, 2026
e7c0c03
build(deps): upgrade russh to 0.63 for RUSTSEC-2026-0153 and RUSTSEC-…
datlechin Sep 14, 2026
e69dba2
refactor(core): write CSV and TSV through the csv crate
datlechin Sep 14, 2026
da0b6a0
build(linux): pin Rust 1.98 and deny unwrap, expect and panic workspa…
datlechin Sep 14, 2026
969b0a6
feat(core): add endpoint, TLS, liveness, transport, SSH failure and c…
datlechin Sep 14, 2026
efcf0f5
build(linux): split the tablepro_app library from its binary and add …
datlechin Sep 14, 2026
43eea7e
feat(core): add a grammar-aware SQL script planner
datlechin Sep 14, 2026
869df6f
ci(linux): run each driver docker suite through cargo-nextest per pac…
datlechin Sep 14, 2026
d034300
feat(ssh): add the system OpenSSH transport with an askpass bridge
datlechin Sep 14, 2026
1da0822
feat(core): add lossless value types
datlechin Sep 14, 2026
d4b9d38
build(deps): use aws-lc-rs as the only crypto provider and enforce so…
datlechin Sep 14, 2026
29b0a26
test(app): add GTK test helpers and run tests headless with the GTK t…
datlechin Sep 14, 2026
76b4685
refactor(storage): store the final SSH connection model
datlechin Sep 14, 2026
92d8160
build(deps): gate SQL Server Kerberos behind a kerberos cargo feature
datlechin Sep 14, 2026
70835e1
feat(net): add tablepro-net with the direct TCP dialer and rustls cli…
datlechin Sep 14, 2026
e82eced
ci(linux): delete the local CI mirror script and list the fast-job co…
datlechin Sep 14, 2026
b0ce575
test(linux): add shared container fixtures with a generated test PKI …
datlechin Sep 14, 2026
19b8f4e
build(deps): migrate to sqlx 0.9 with system SQLite and aws-lc-rs TLS
datlechin Sep 15, 2026
e20b6aa
refactor(linux)!: adopt app ID app.tablepro.TablePro and binary tablepro
datlechin Sep 15, 2026
52230dd
build(app): add the option_env! config module and an embedded GResour…
datlechin Sep 15, 2026
8c291ff
build(linux): add the meson build, desktop data and a GNOME 50 Devel …
datlechin Sep 15, 2026
9437223
build(linux): declare the GNOME 50 floor and replace the shortcuts wi…
datlechin Sep 15, 2026
cfc33e2
fix(linux): replace removed emblem icons with stock and bundled symbo…
datlechin Sep 15, 2026
d47f399
feat(storage): add the GSettings schema and a typed AppSettings wrapper
datlechin Sep 15, 2026
65a0a18
feat(linux): store preferences, window geometry and the editor font i…
datlechin Sep 15, 2026
5e2cb1d
refactor(linux): use gettext keywords with plural and context support
datlechin Sep 15, 2026
79b0c98
feat(linux): configure logging from RUST_LOG with profile defaults
datlechin Sep 15, 2026
e4c5b16
refactor(storage): resolve paths through GLib and write private files…
datlechin Sep 15, 2026
ad3d221
feat(core): add column type, SQL syntax and referential action types
datlechin Sep 15, 2026
4e4b074
feat(storage): version the query history with embedded migrations
datlechin Sep 15, 2026
c00f3f9
fix(storage): never overwrite an unreadable connection list
datlechin Sep 15, 2026
427af08
fix(storage): surface keyring failures, unlock before reading and lab…
datlechin Sep 15, 2026
ff33490
refactor(app): run background work on an app-owned runtime with panic…
datlechin Sep 15, 2026
a327c1f
refactor(app): coalesce column width and filter settings writes off t…
datlechin Sep 15, 2026
fdcb04d
refactor(app): route the last background work through Tasks and ban t…
datlechin Sep 15, 2026
5613d75
test(storage): prove history and connection stores keep no process-wi…
datlechin Sep 15, 2026
5be2eb9
fix(app): submit form dialogs with Enter
datlechin Sep 15, 2026
7485ae7
feat(app): add pure session health, attempt and key primitives
datlechin Sep 15, 2026
3d83362
fix(connect-dialog): open with the chosen driver's defaults and repor…
datlechin Sep 15, 2026
c50deae
fix(app): coalesce column width and filter writes and keep unreadable…
datlechin Sep 15, 2026
aa00220
feat(app): keep editor text as untruncated drafts written off the mai…
datlechin Sep 15, 2026
2658299
fix(preferences): apply history retention on the scheduled prune and …
datlechin Sep 15, 2026
74672a7
feat(core): add the statement, result and column types the driver con…
datlechin Sep 15, 2026
84e2590
feat(core): add the metadata, row-key and page types the contract swi…
datlechin Sep 15, 2026
b2c75ae
feat(core): parse cell and filter text against the column's own type
datlechin Sep 15, 2026
745d78a
feat(core): build row writes through a dialect instead of per-engine …
datlechin Sep 15, 2026
f4260f4
feat(core): build filter SQL through the dialect with typed values
datlechin Sep 15, 2026
e861c99
feat(drivers)!: read every value in the form the server sent it
datlechin Sep 15, 2026
14dd128
feat(core)!: say what a driver failure was, not just that one happened
datlechin Sep 15, 2026
f4a80e2
feat(core): stop a running statement and know what the write left behind
datlechin Sep 15, 2026
7a4ee6e
feat(core): add the session, capability and write types the contract …
datlechin Sep 15, 2026
92aea71
fix(core): export values at the precision their column declares
datlechin Sep 15, 2026
7889f6f
fix(editor): keep statements sqlformat would change unformatted
datlechin Sep 15, 2026
0975023
feat(editor): run the statement the cursor is in, and show which one
datlechin Sep 15, 2026
f3cbf73
fix(linux): rebuild the GSettings schema when it changes and cover SQ…
datlechin Sep 15, 2026
3bcd8df
fix(structure): apply a column rename instead of dropping it silently
datlechin Sep 16, 2026
26720d5
test(app): stop the startup suite hanging on a developer's own schema
datlechin Sep 16, 2026
19f7798
test(app): wait on the toast rather than polling the history database
datlechin Sep 16, 2026
7057814
feat(export): offer Markdown, HTML and XML alongside CSV and JSON
datlechin Sep 16, 2026
ec75581
feat(export): write a result back out as INSERT statements
datlechin Sep 17, 2026
d627cb6
fix(i18n): extract the strings the app actually calls
datlechin Sep 17, 2026
8263223
feat(logging): write structured lines when TABLEPRO_LOG_FORMAT asks f…
datlechin Sep 17, 2026
af64abc
docs(roadmap): tick what ships and say what the open items are waitin…
datlechin Sep 17, 2026
2c60487
feat(connections): duplicate a saved connection
datlechin Sep 17, 2026
7eeb3d1
feat(editor): open a SQL file into the editor
datlechin Sep 17, 2026
0d58ab5
feat(history): record the statements the app runs, not only the typed…
datlechin Sep 17, 2026
9e00c03
feat(structure): read and edit column comments
datlechin Sep 17, 2026
86ce651
feat(queries): save a query under a name and reopen it later
datlechin Sep 17, 2026
7e175e0
feat(connections): colour tag a saved connection
datlechin Sep 17, 2026
b1175d7
feat(connections): import and export the connection list
datlechin Sep 17, 2026
e58e205
feat(connections): file saved connections into groups
datlechin Sep 17, 2026
e508f68
feat(export): write results as an Excel workbook
datlechin Sep 17, 2026
d91c70a
feat(import): read a CSV file into a table
datlechin Sep 17, 2026
8168803
ci(linux): install git before the checkout in the container jobs
datlechin Sep 17, 2026
55528b8
fix(ssh): read the host key fingerprint line from OpenSSH 9 as well
datlechin Sep 17, 2026
0e50b58
chore(linux): merge main into linux
datlechin Sep 18, 2026
18ed8f6
chore(linux): merge main into linux
datlechin Sep 18, 2026
0e542e3
chore(linux): drop files main already deleted
datlechin Sep 18, 2026
616319d
build(linux): drop unused dependencies and the local sysroot script
datlechin Oct 11, 2026
06794b8
chore(linux): merge main into linux
datlechin Oct 11, 2026
12d0ad5
chore(linux): add the Linux profile to fix-issue (#3354)
datlechin Oct 12, 2026
902bdab
fix(linux): keep the secrets step off the developer's login keyring (…
datlechin Oct 12, 2026
726c221
refactor(linux)!: switch the Linux app to driver contract v2 (#3358)
datlechin Oct 13, 2026
1155d3e
fix(linux-core): keep a finished call from cancelling its caller (#3398)
datlechin Oct 13, 2026
afed2d3
refactor(linux): remediation steps 31 to 39 (#3403)
datlechin Oct 13, 2026
b4f346c
refactor(linux): finish remediation steps 31 to 39 (#3410)
datlechin Oct 14, 2026
9497897
refactor(linux): finish remediation steps 40 to 45 (#3413)
datlechin Oct 14, 2026
52e6661
fix(linux): address the review findings on steps 40 to 45 (#3416)
datlechin Oct 14, 2026
60c18f0
chore(linux): merge main into linux
datlechin Oct 14, 2026
54fb890
refactor(linux): finish remediation steps 46 to 55 (#3420)
datlechin Oct 14, 2026
c423710
fix(linux-postgres): wait for the server to take a cancel request (#3…
datlechin Oct 15, 2026
0216f0f
fix(linux): start the ClickHouse fixture without a blind HTTP wait (#…
datlechin Oct 15, 2026
7108d19
refactor(linux): finish remediation steps 56 to 66 (#3433)
datlechin Oct 15, 2026
611c958
fix(linux): address the review findings on steps 56 to 66 (#3434)
datlechin Oct 15, 2026
20ed724
fix(linux): require the GLES library GTK loads at runtime in the rpm …
datlechin Oct 15, 2026
2d70892
fix(linux-grid): ask about cell edits on close and stop the close han…
datlechin Oct 16, 2026
0dc3914
build(linux): a PPA and COPR as the release channels, Flathub later (…
datlechin Oct 16, 2026
45d49a2
build(linux): allow the yanked zip 8.6.0 rust_xlsxwriter still needs …
datlechin Oct 16, 2026
c0abf6c
fix(linux): keep the session record through new-window and early quit…
datlechin Oct 16, 2026
1898e11
fix(linux-clickhouse): read the process list before the query log (#3…
datlechin Oct 16, 2026
1f49c4f
fix(linux): make the Confirm Before Deleting Rows switch take effect …
datlechin Oct 16, 2026
abbeac4
build(linux): extract path-qualified gettext calls with gettext 1.0 (…
datlechin Oct 16, 2026
f839acf
fix(linux-ssh): offer no key replace under StrictHostKeyChecking yes …
datlechin Oct 16, 2026
7eb5552
build(linux): regenerate the POT template with every path-qualified c…
datlechin Oct 16, 2026
b9c61c9
fix(linux-sqlite): let SQLite decide what holds a dropped column (#3455)
datlechin Oct 16, 2026
7cd300f
docs(linux): link the upstream issues behind two workarounds (#3457)
datlechin Oct 16, 2026
42c12e2
chore(linux): merge main into linux
datlechin Oct 17, 2026
2075808
docs: list linux/CHANGELOG.md in the changelog rule's row
datlechin Oct 17, 2026
3254237
docs: state once that agent-docs checks the Area rules rows
datlechin Oct 17, 2026
76894c8
docs(linux): correct the roadmap and state each release criterion (#3…
datlechin Oct 17, 2026
61adf1b
build(linux): allow the zip extraction advisories nothing here reache…
datlechin Oct 17, 2026
6fd0d19
docs(linux): say table pages use OFFSET and what the a11y audit cover…
datlechin Oct 17, 2026
a67dcf2
build(linux): release notes, JSON upgraders, arm64, hotfix, user docs…
datlechin Oct 17, 2026
e753982
fix(linux): SSH on .deb and .rpm, editor and JSON hangs, crash report…
datlechin Oct 17, 2026
247d604
chore(linux): regenerate the translation template (#3466)
datlechin Oct 17, 2026
b2427d3
fix(linux): TLS file checks, connect errors and keyring wording (#3467)
datlechin Oct 17, 2026
59ce1b0
fix(linux): seek paging, lazy tab restore, grid speed, narrow bottom …
datlechin Oct 17, 2026
21518c1
fix(linux): strict MySQL saves in the server zone, PostgreSQL data fi…
datlechin Oct 17, 2026
b1eb585
fix(linux): keep imported ids and empty strings, batch CSV import, XL…
datlechin Oct 17, 2026
26eeaf2
fix(linux): SQLite drop and rowid guards, ClickHouse keys, lost sessi…
datlechin Oct 17, 2026
5649cae
fix(linux): keyboard sort, named fields, focus hand-off, announcement…
datlechin Oct 17, 2026
ed4a0fa
fix(linux): pass the table and generated columns to the array export …
datlechin Oct 17, 2026
d8df6d5
feat(linux): sidebar refresh, save to .sql, and visible storage error…
datlechin Oct 17, 2026
dd536e5
test(linux): drop imported open times and fix two test races (#3500)
datlechin Oct 18, 2026
a14a288
chore(linux): merge main into linux
datlechin Oct 18, 2026
9be4e9c
test(linux): accept a cursor-stopped read in the row-limit case (#3527)
datlechin Oct 18, 2026
db7f618
docs(linux): update the roadmap for the merged release fixes (#3528)
datlechin Oct 18, 2026
212f9dc
docs(linux): name driver test paths from the linux root (#3529)
datlechin Oct 18, 2026
1b13f79
docs(linux): drop the dated plans, audit and dependency review (#3530)
datlechin Oct 18, 2026
8b434d7
ci(linux): make main the home of the Linux app (#3532)
datlechin Oct 18, 2026
3c8164d
refactor(linux): conventional Cargo manifests and module files (#3533)
datlechin Oct 18, 2026
559396b
build(linux): towncrier fragments for the Linux changelog (#3534)
datlechin Oct 18, 2026
37fed4f
chore(linux): own ignore, editorconfig and generated-file attributes …
datlechin Oct 18, 2026
f46d384
test(linux): wait for the parked banner text, format the session modu…
datlechin Oct 18, 2026
96a5e8b
chore(linux): finish the cleanup before the merge into main (#3537)
datlechin Oct 18, 2026
a1f4b71
chore(linux): regenerate the translation template
datlechin Oct 18, 2026
8a06bc0
ci(linux): run the Linux workflow on pushes to main only
datlechin Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 6 additions & 6 deletions .claude/rules/changelog.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
---
paths:
- "CHANGELOG.md"
- "changelog.d/**/*"
- "towncrier.toml"
- "**/CHANGELOG.md"
- "**/changelog.d/**/*"
- "**/towncrier.toml"
---

# Changelog

Unreleased changes are towncrier fragments in `changelog.d/`. A release turns them into a `CHANGELOG.md` section with `scripts/release/notes.py assemble` (`RELEASING.md`, Notes).
Unreleased changes are towncrier fragments in `changelog.d/`. A release turns them into a `CHANGELOG.md` section with `scripts/release/notes.py assemble` (`RELEASING.md`, Notes). The Linux app is a second towncrier project under the same rules, in `linux/changelog.d/` and `linux/CHANGELOG.md`; its release runs `towncrier build --dir linux` (`linux/docs/releasing.md`).

- **One file per user-visible change**, named `changelog.d/<PR>.<type>.md`: `<PR>` is the pull request that adds it, `<type>` is `added`, `changed`, `deprecated`, `removed`, `fixed` or `security`. A second entry of the same type in one PR adds a counter, as `towncrier create` does: `3452.fixed.1.md`, then `.2`. The counter does not order entries.
- **One line, at most 120 characters, ending with a period.** Added and Changed name the new thing (`Open in Window for row inspector text fields.`); Fixed names the bug, not the fix (`Empty context menu when right-clicking a read-only inspector field.`). No file paths or type names.
- **No refs, no credit, no `- ` prefix.** towncrier links the PR named by the file and adds the bullet; `notes.py` adds ` by @login` when the PR's author is not a maintainer.
- **One entry per thing a user would notice.** Defects with the same visible symptom share an entry.
- **No fragment** for a fix to something still unreleased (edit that fragment instead) or for a docs-only change.
- **Only a `chore(release): vX.Y.Z` PR edits `CHANGELOG.md`.**
- **Only a `chore(release): vX.Y.Z` PR edits `CHANGELOG.md`**, and only a `chore(release): linux-vX.Y.Z` PR edits `linux/CHANGELOG.md`.
- **The lead block and `[CRITICAL]`**: `RELEASING.md`, Notes and Channels.
- `scripts/ci/check-changelog.py` checks the fragments' text, the headings and the lead blocks in Repo Hygiene, then `towncrier build --draft --version 0.0.0` renders the fragments. towncrier refuses an unknown type and a non-numeric PR number (`ignore`, `issue_pattern`). In PR title, `--pr` checks that a PR into main names each new fragment after itself, that only a release PR edits `CHANGELOG.md`, and that a release PR changes nothing else.
- `scripts/ci/check-changelog.py` checks both projects' fragment text, headings and lead blocks in Repo Hygiene, then `towncrier build --draft --version 0.0.0` renders the root fragments; `--dir linux` renders the Linux ones. towncrier refuses an unknown type and a non-numeric PR number (`ignore`, `issue_pattern`). In PR title, `--pr` checks that a PR into main names each new fragment after itself, that only a release PR edits a `CHANGELOG.md`, and that a release PR changes nothing else; a Linux one also sets the version.
9 changes: 5 additions & 4 deletions .claude/rules/ci.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ The required check names are in `AGENTS.md` (CI). Reading a red check: `.claude/
- `shellcheck --severity=warning` on every `*.sh` under `scripts` and `.claude/skills`;
- the tooling tests: `scripts/ci/test_*.py`, `scripts/lib/test_*.py`, `scripts/test_localization.py` and `scripts/ci/test_libs_release.sh`;
- `scripts/release/test_*.py` on Python 3.9 from `actions/setup-python`, in a venv that installs `scripts/release/requirements.txt` with `pip --require-hashes`;
- in the same venv, `check-changelog.py` and `towncrier build --draft --version 0.0.0`, which fails on a fragment name it cannot parse;
- in the same venv, `check-changelog.py` and `towncrier build --draft --version 0.0.0` for the root and `--dir linux`, which fails on a fragment name it cannot parse;
- `check-lib-sourcing.py`, `check-plugin-manifest.py`, `check-plugin-provides.py`, `check-deployment-target.sh`, `check-ios-shared-isolation.py`;
- `localization.py plugins` and `plugins --target ios`;
- `check-string-catalogs.py`, `check-license-inventory.py`, `check-entitlements.py`, `check-test-plans.py`;
Expand All @@ -119,23 +119,24 @@ The required check names are in `AGENTS.md` (CI). Reading a red check: `.claude/
- `ios` watches `TableProMobile/`, `Libs/`, `Plugins/TableProPluginKit/` (the package target is a symlink to it), and every `../` path it reads out of `TableProMobile/project.yml`.
- `oracle` watches `Packages/TableProOracle/`; `hana` watches `Native/HanaBridge/`. Each suite also watches its own workflow.
- `release` watches what the Release build reads: the app, plugin, package, native, config and libs folders, `project.yml`, the app's `Package.resolved`, `.github/plugin-registry.json`, the release scripts it runs (`build.sh`, `package.sh`, `registry.py`, `version.py`, `notes.py`), the build and CI scripts it runs and the setup actions. It skips `Plugins/*Tests/` and `Packages/*/Tests/`.
- `linux` watches `linux/`, the docs and banned-words scripts the Linux fast job runs, the detector itself and the three Linux workflows.
- A path a suite newly reads joins that suite's pattern in the same change, or the suite skips on it.
- `CHANGELOG.md` and `changelog.d/` are on no suite's pattern: the What's New phase writes nothing at `0.0.0-dev`, and Repo Hygiene renders every fragment and section instead.

## What runs where

- A pull request: both changes jobs; macOS Tests and iOS and Package Tests unless their detector says false (Oracle only when its detector is not false); SwiftLint; Repo Hygiene; PR title. `AllPlugins` only when the `plugins` detector is not false.
- A push to main or `release/**`: the same minus PR title, plus Release Build; never cancelled, `AllPlugins` always, the SPM cache saved on a miss. Every code push runs both plans in full; a docs-only or changelog-only push skips the suites through the detector.
- A `v*` tag runs only `release.yml`. The test workflows never run on a tag.
- A `v*` tag runs only `release.yml`, and a `linux-v*` tag only `release-linux.yml`, which calls `linux-packages.yml`. The test workflows never run on a tag.
- `workflow_dispatch` exists on every workflow except `pr-title.yml` and `release.yml`.
- `build-linux.yml` is on `main` only for its Monday schedule, which GitHub runs from the default branch. Until the Linux app's directory lands on `main`, every build job skips and `weekly-dispatch` starts the workflow on the branch the `LINUX_BRANCH` variable names (the linux branch when unset), whose testing guide describes the jobs.
- `build-linux.yml` builds and tests the Linux app (`linux/docs/testing.md`, CI). Its `Changes (Linux)` job skips the rest when nothing under `linux/` or the scripts and workflows it reads changed, and its `Linux` job gates on all of them.

## Caches and runner budget

- Swift package checkouts live in `~/.spm-cache`, keyed `spm-<os>-<hash of the app's Package.resolved>` with prefix restore. macOS Tests saves it only on a push and only on a miss: a cache saved on a PR ref is visible to that PR alone.
- `release.yml` restores that cache and never saves it, since a save in tag scope is unreadable from other refs.
- `release-build.yml` restores it and leaves the save to macOS Tests.
- There is no other cache: no libs or DerivedData cache, and none in the iOS, plugin or Ubuntu workflows.
- There is no other Apple cache: no libs or DerivedData cache, and none in the iOS or plugin workflows. The Linux jobs cache Cargo builds through `Swatinem/rust-cache` and the Flatpak build.
- CI fits the GitHub Free and Pro plans: no paid larger runner, no self-hosted Mac. At most 5 macOS jobs run at once, and main runs queue behind PR runs for those slots.

## Writing workflow and lint code
Expand Down
54 changes: 54 additions & 0 deletions .claude/skills/fix-issue/references/platform-linux.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Platform: Linux

The native Linux app. Every profile has these seven sections in this order, so a value is always in the same place.

## Covers

A report from Linux. The code is `linux/`: a Cargo workspace of crates under `linux/crates/` (the GTK app, the UI-free core, storage, sessions, networking, SSH and one crate per driver), built by Meson. Drivers are linked in at compile time; there are no plugins. A fix lands in one or more crates; name them.

## Base

- Worktree base: `origin/main`.
- Pull request base: `main`.

## Done

`linux/AGENTS.md`, plus the root `AGENTS.md` principles and writing style it points to. Under Claude Code, `linux/CLAUDE.md` loads it once a file under `linux/` is read; read it by path anyway in Phase 0, since the worktree path is not guaranteed to trigger that. Codex does not load it at all, so read it yourself.

## Native standard

GTK 4 and libadwaita, used the way the GNOME Human Interface Guidelines describe, with the widget the toolkit already provides before anything drawn by hand. The version floor is GNOME 50: GTK 4.22, libadwaita 1.9, GtkSourceView 5.18, GLib 2.88. The compiler enforces it through the binding crates' feature gates, so an API above the floor does not build.

Sources, the API ground truth and how to build a probe: `references/research-linux.md`.

## Verify

Pass `--platform linux`, which a Linux machine picks by default. Every step runs inside `<tree>/linux` with the environment `meson devenv` gives Cargo.

| Step | When |
| --- | --- |
| `setup` | a new tree; `linux/meson.build`, `linux/meson.options` or a file under `linux/data/` changed |
| `build` | always |
| `test <package> [filter]` | always, for each crate you changed |
| `test` | before the pull request: every suite, as the CI fast job runs them |
| `lint` | always: rustfmt, then clippy with and without default features |
| `data` | a desktop entry, the GSettings schema, the metainfo or the icons changed |
| `l10n` | a user-facing string or a file that holds them changed |
| `docker <package>` | a driver, SSH or anything they connect through changed |
| `secrets` | `tablepro-storage` secret handling changed |
| `dist` | `meson.build` install rules changed (commit first) |

- The first step after a merge from the base is `setup`.
- Pick packages by what you changed: `grep -rl <name> linux/crates --include='*.rs'`. Package names are in each crate's `Cargo.toml`.
- Extra review pass: none beyond the security pass.
- Traps and remedies: `references/verification-linux.md`.

## Screen

Run the app from the tree with `meson devenv -C _build ./crates/app/tablepro` inside `linux/`. A development build uses its own application ID and data directories, so it never touches an installed one; point the `XDG_*_HOME` variables at a scratch directory as well when the shot must not show the user's real connections. Nothing drives the app from a script yet: only `app.*` actions reach D-Bus, and the window's actions do not. Launch it in the state the shot needs and capture with the `org.freedesktop.portal.Screenshot` portal, which GNOME allows for an unsandboxed caller; `org.gnome.Shell.Screenshot` refuses. The portal captures the whole screen, so crop to the window. Dark and light: `ADW_DEBUG_COLOR_SCHEME=force-dark` or `force-light`.

## Ship

- A user-visible change gets one fragment in `linux/changelog.d/` (`.claude/rules/changelog.md`), never in the root `changelog.d/`, which is the macOS release notes.
- Commit scope `linux`, or `linux-<area>` for one area of the app.
- A probe worth keeping becomes a test in the crate it measures; the Linux workspace keeps no separate probe directory.
47 changes: 47 additions & 0 deletions .claude/skills/fix-issue/references/research-linux.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Research sources: Linux

Where to find the correct behavior for the Linux app, and what counts as evidence for it. The method is in the research brief (`references/lanes.md`); this file is the sources.

## GNOME platform

- **API ground truth: the GObject Introspection files** under `/usr/share/gir-1.0/` (`Gtk-4.0.gir`, `Adw-1.gir`, `GtkSource-5.gir`, `Gio-2.0.gir`; GLib's is under `/usr/lib/<multiarch>/gir-1.0/`). Each symbol carries the version that introduced it, so `grep -n -A3 '<class name="Sidebar"' /usr/share/gir-1.0/Adw-1.gir` answers whether it is at or below the floor. The C headers say the same with `GDK_AVAILABLE_IN_4_22`, `ADW_AVAILABLE_IN_1_9` and `GTK_SOURCE_AVAILABLE_IN_5_18`.
- **The Rust bindings** gate each symbol behind a feature such as `v4_22` or `v1_9`. The workspace enables the GNOME 50 set in `linux/Cargo.toml`, so read the gate in the crate's source when the question is whether a binding exists: it is under `linux/_build/cargo-home/registry/src/` once the tree has been built.
- **The web documentation is newer than the floor.** docs.gtk.org and the GtkSourceView site document later releases than GNOME 50, and even the installed GIR files carry the odd newer symbol. A web page gives the intent; the GIR version and the feature gate settle whether TablePro can use it.
- **GNOME Human Interface Guidelines**: `https://developer.gnome.org/hig/`. For a database client the pages that matter most are header bars, sidebars, utility panes, boxed lists, list and column views, selection mode, tabs, search, menus, dialogs, toasts, banners, placeholders, keyboard and accessibility. Quote the rule; "the HIG says so" without a quote is not evidence.
- **API references**: GTK at `https://docs.gtk.org/gtk4/`, libadwaita for the floor at `https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.9/`, GtkSourceView at `https://gnome.pages.gitlab.gnome.org/gtksourceview/gtksourceview5/`, gtk4-rs at `https://gtk-rs.org/gtk4-rs/stable/latest/docs/gtk4/`, libadwaita-rs at `https://world.pages.gitlab.gnome.org/Rust/libadwaita-rs/stable/latest/docs/libadwaita/`. The Relm4 book trails the version in `linux/Cargo.lock`, so read the locked crate's source for Relm4.
- **freedesktop specifications**, for anything that talks to the desktop: Secret Service (`https://specifications.freedesktop.org/secret-service/latest/`), XDG Desktop Portal (`https://flatpak.github.io/xdg-desktop-portal/docs/api-reference.html`), Desktop Entry (`https://specifications.freedesktop.org/desktop-entry/latest/`), AppStream (validate locally with `appstreamcli validate --explain`) and the Flathub MetaInfo guidelines (`https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines`).
- **TablePro's own decisions** in `linux/docs/decisions/` and `linux/ARCHITECTURE.md`: a fix must not contradict a recorded decision without saying so.

## Dependencies

The source is the crate as compiled, not a web page.

- Versions are in `linux/Cargo.lock`. A crate pinned to a git revision is in `linux/Cargo.toml`, and its checkout is under `linux/_build/cargo-home/git/checkouts/`.
- Read the crate's source at that version under `linux/_build/cargo-home/registry/src/`, with the doc comments for each item in play and what a call returns when it cannot do the job.
- System libraries the binary links (SQLite, MIT Kerberos, GTK) are the installed versions; `pkg-config --modversion <name>` gives each.
- Where the source does not settle it, measure: a test against the real engine (marked `#[ignore = "requires docker"]` when it needs a container) or a scratch Cargo project that links what we link. The workspace has no mocks, so a probe uses the real thing.

## Comparable clients

A Linux user describing how something "should" work is usually describing one of these. None of them is a GTK app, so they answer what capability users expect, never how it should look.

| Client | Why read it | Where |
| --- | --- | --- |
| DBeaver | The default database client on Linux; widest driver and dialect coverage | `github.com/dbeaver/dbeaver` |
| DataGrip | Deepest SQL tooling; take the capability, not the interaction | `jetbrains.com/datagrip` |
| Beekeeper Studio | Open source, ships Linux builds | `github.com/beekeeper-studio/beekeeper-studio` |
| DbGate | Open source, cross-engine | `github.com/dbgate/dbgate` |
| pgAdmin 4 | The PostgreSQL reference tool | `github.com/pgadmin-org/pgadmin4` |
| DB Browser for SQLite | The SQLite reference tool | `github.com/sqlitebrowser/sqlitebrowser` |

For how a surface should look and behave, read GNOME applications built on the same stack:

| Application | Read it for | Where |
| --- | --- | --- |
| libadwaita demo | One page per pattern, in its `demo` folder | `gitlab.gnome.org/GNOME/libadwaita` |
| GNOME Text Editor | A GtkSourceView editor with tabs, a sidebar and search | `gitlab.gnome.org/GNOME/gnome-text-editor` |
| GNOME Builder | Panes, a source editor, search and trees at IDE scale | `gitlab.gnome.org/GNOME/gnome-builder` |
| Loupe, Snapshot, Fractal | Rust apps with the same Meson and Cargo shape | `gitlab.gnome.org/GNOME/loupe`, `gitlab.gnome.org/GNOME/snapshot`, `gitlab.gnome.org/World/fractal` |
| Nautilus | Sidebars, column views and selection mode | `gitlab.gnome.org/GNOME/nautilus` |

None of these can be run from here, so every claim about one is confirmed from a source you read or marked inferred.
Loading
Loading