Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
f9691e8
chore(deps): add mysql_client for MySQL/MariaDB
ZhuchkaTriplesix Apr 11, 2026
d99cea1
Merge pull request #27 from QueryaHub/my_sql
ZhuchkaTriplesix Apr 11, 2026
f72fb08
ci build
ZhuchkaTriplesix Apr 18, 2026
fbf462a
theme: add Querya design tokens (querya_colors)
ZhuchkaTriplesix Apr 19, 2026
50378a8
theme: add Querya dark ColorScheme
ZhuchkaTriplesix Apr 19, 2026
1a545c2
theme: shared monospace stack for SQL editors
ZhuchkaTriplesix Apr 19, 2026
55dd7d0
theme: wire QueryaColorScheme and radius
ZhuchkaTriplesix Apr 19, 2026
05033aa
layout: responsive breakpoints and dialog insets
ZhuchkaTriplesix Apr 19, 2026
f6d6a0a
editor: placeholder for future SQL syntax highlighting
ZhuchkaTriplesix Apr 19, 2026
909ad5a
ui: SQL editor chrome with glow and inline decoration
ZhuchkaTriplesix Apr 19, 2026
8301367
connections: extract promptCreateConnection flow
ZhuchkaTriplesix Apr 19, 2026
b3abc60
ui: empty workspace hero and mock window
ZhuchkaTriplesix Apr 19, 2026
1e3ddc5
ui: apply SqlEditorChrome to query editor tab
ZhuchkaTriplesix Apr 19, 2026
1f84db5
ui: responsive SQL editor dialog chrome (PostgreSQL)
ZhuchkaTriplesix Apr 19, 2026
5229c19
ui: responsive SQL editor dialog chrome (MySQL)
ZhuchkaTriplesix Apr 19, 2026
4d7ff97
ui: SERVERS header, selection capsule, creation flow
ZhuchkaTriplesix Apr 19, 2026
ee6a28e
ui: title bar accent, borders, hero new connection flow
ZhuchkaTriplesix Apr 19, 2026
40f6bce
ui: show empty hero when no connection selected
ZhuchkaTriplesix Apr 19, 2026
91c0d37
test: workspace panel layout uses stub connection for splitter
ZhuchkaTriplesix Apr 19, 2026
e83e6e2
ui: adaptive database picker dialog and grid
ZhuchkaTriplesix Apr 19, 2026
3bf80b6
ui: adaptive dialog insets for driver manager
ZhuchkaTriplesix Apr 19, 2026
b3b1f6f
ui: adaptive dialog insets for new folder
ZhuchkaTriplesix Apr 19, 2026
487afb8
ui: adaptive dialog insets for PostgreSQL form
ZhuchkaTriplesix Apr 19, 2026
9015d22
ui: adaptive dialog insets for MySQL form
ZhuchkaTriplesix Apr 19, 2026
b26e9fb
ui: adaptive dialog insets for MongoDB form
ZhuchkaTriplesix Apr 19, 2026
f4c3011
ui: adaptive dialog insets for Redis form
ZhuchkaTriplesix Apr 19, 2026
61a0d34
ui: adaptive dialog insets for create MongoDB database
ZhuchkaTriplesix Apr 19, 2026
0a25ebc
ui: adaptive dialog insets for table privileges
ZhuchkaTriplesix Apr 19, 2026
27035d5
chore: update .gitignore
ZhuchkaTriplesix Apr 19, 2026
6f1e43a
Merge pull request #28 from QueryaHub/build-ci
ZhuchkaTriplesix Apr 19, 2026
04b9d12
fix
ZhuchkaTriplesix Apr 19, 2026
06f2022
Merge pull request #29 from QueryaHub/design
ZhuchkaTriplesix Apr 19, 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
2 changes: 1 addition & 1 deletion .flutter-plugins-dependencies
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.6.0\\\\","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite_darwin-2.4.2\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"path_provider_android","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_android-2.2.22\\\\","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_android","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite_android-2.4.2+2\\\\","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"bitsdojo_window_macos","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bitsdojo_window_macos-0.1.4\\\\","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.6.0\\\\","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite_darwin-2.4.2\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"bitsdojo_window_linux","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bitsdojo_window_linux-0.1.4\\\\","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_linux-2.2.1\\\\","native_build":false,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"bitsdojo_window_windows","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\bitsdojo_window_windows-0.1.6\\\\","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"C:\\\\Users\\\\junte\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_windows-2.3.0\\\\","native_build":false,"dependencies":[],"dev_dependency":false}],"web":[]},"dependencyGraph":[{"name":"bitsdojo_window","dependencies":["bitsdojo_window_windows","bitsdojo_window_macos","bitsdojo_window_linux"]},{"name":"bitsdojo_window_linux","dependencies":[]},{"name":"bitsdojo_window_macos","dependencies":[]},{"name":"bitsdojo_window_windows","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]}],"date_created":"2026-03-21 20:27:26.235937","version":"3.41.5","swift_package_manager_enabled":{"ios":false,"macos":false}}
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni_flutter","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/","native_build":true,"dependencies":["jni"],"dev_dependency":false},{"name":"path_provider_android","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/","native_build":false,"dependencies":["jni","jni_flutter"],"dev_dependency":false},{"name":"sqflite_android","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+3/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"bitsdojo_window_macos","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_macos-0.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"bitsdojo_window_linux","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_linux-0.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"bitsdojo_window_windows","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_windows-0.1.6/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"web":[]},"dependencyGraph":[{"name":"bitsdojo_window","dependencies":["bitsdojo_window_windows","bitsdojo_window_macos","bitsdojo_window_linux"]},{"name":"bitsdojo_window_linux","dependencies":[]},{"name":"bitsdojo_window_macos","dependencies":[]},{"name":"bitsdojo_window_windows","dependencies":[]},{"name":"jni","dependencies":[]},{"name":"jni_flutter","dependencies":["jni"]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":["jni","jni_flutter"]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]}],"date_created":"2026-04-19 12:51:07.216547","version":"3.41.6","swift_package_manager_enabled":{"ios":false,"macos":false}}
30 changes: 30 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ name: CI
on:
push:
branches: [ main, dev, '**-connector', '**-connection-pull' ]
tags:
- 'v*'
pull_request:
branches: [ main, dev ]

Expand Down Expand Up @@ -44,3 +46,31 @@ jobs:

- name: Analyze code
run: flutter analyze

# Release smoke build: same tag also runs release.yml (artifacts). This job
# gates tags on a real linux release compile after tests + analyze.
build-linux-release:
name: Build Linux (release)
needs: [test, analyze]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.38.5'
channel: 'stable'
cache: true

- name: Get dependencies
run: flutter pub get

- name: Build Linux (release)
run: flutter build linux --release
98 changes: 79 additions & 19 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
# Сборка релизов и публикация в GitHub Releases.
# Запуск: создайте и запушьте тег, например v0.1.0:
# git tag v0.1.0
# git push origin v0.1.0
# Release: сборка артефактов → единая публикация с git-cliff и SHA256SUMS.
# Триггер: git tag v0.1.0 && git push origin v0.1.0
#
# Рекомендуемые коммиты: Conventional Commits (feat:, fix:, …) — см. cliff.toml

name: Release

on:
push:
tags:
- 'v*' # v0.1.0, v1.0.0, etc.
- 'v*'

permissions:
contents: write

concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false

jobs:
build-windows:
Expand Down Expand Up @@ -36,16 +43,11 @@ jobs:
$dir = "build\windows\x64\runner\Release"
Compress-Archive -Path "$dir\*" -DestinationPath "Querya-Desktop-$tag-windows.zip"

- name: Create Release and upload Windows
uses: softprops/action-gh-release@v2
- uses: actions/upload-artifact@v4
with:
tag_name: ${{ github.ref_name }}
name: Release ${{ github.ref_name }}
generate_release_notes: true
files: Querya-Desktop-${{ github.ref_name }}-windows.zip
allow_updates: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
name: bundle-windows
path: Querya-Desktop-${{ github.ref_name }}-windows.zip
if-no-files-found: error

build-linux:
name: Build Linux
Expand Down Expand Up @@ -74,15 +76,73 @@ jobs:
- name: Zip Linux artifact
run: |
cd build/linux/x64/release/bundle
zip -r ../../../../../../Querya-Desktop-${{ github.ref_name }}-linux.zip .
zip -r "${GITHUB_WORKSPACE}/Querya-Desktop-${{ github.ref_name }}-linux.zip" .

- uses: actions/upload-artifact@v4
with:
name: bundle-linux
path: Querya-Desktop-${{ github.ref_name }}-linux.zip
if-no-files-found: error

publish:
name: Publish GitHub Release
needs: [build-windows, build-linux]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- uses: taiki-e/install-action@v2
with:
tool: git-cliff@2.11.0

- uses: actions/download-artifact@v4
with:
path: artifacts
pattern: bundle-*
merge-multiple: true

- name: Layout distribution files
run: |
set -euo pipefail
mkdir -p dist
find artifacts -name '*.zip' -exec mv -t dist/ {} +
test "$(find dist -name '*.zip' | wc -l)" -eq 2
cd dist
sha256sum *.zip | tee SHA256SUMS.txt

- name: Generate changelog (git-cliff + GitHub API)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPO: ${{ github.repository }}
run: |
set -euo pipefail
TAG="${{ github.ref_name }}"
# Текст страницы релиза: без глобального header из cliff.toml
git-cliff --latest \
--config cliff.toml \
--strip header \
--github-token "$GITHUB_TOKEN" \
--github-repo "$GITHUB_REPO" \
-o release-body.md
# Вложение: полный фрагмент с header (удобно архивировать / копировать в docs)
git-cliff --latest \
--config cliff.toml \
--github-token "$GITHUB_TOKEN" \
--github-repo "$GITHUB_REPO" \
-o "CHANGELOG-${TAG}.md"

- name: Upload to Release (Linux)
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: Release ${{ github.ref_name }}
generate_release_notes: true
files: Querya-Desktop-${{ github.ref_name }}-linux.zip
allow_updates: true
body_path: release-body.md
fail_on_unmatched_files: true
files: |
dist/*.zip
dist/SHA256SUMS.txt
CHANGELOG-${{ github.ref_name }}.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ Thumbs.db
*.dll
*.exe
flutter_*.log
design-front
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@ A lightweight desktop client for SQL and NoSQL databases. Connect to PostgreSQL,
- **Cross-platform:** Windows, Linux, macOS (Flutter desktop).
- **Multi-database:** PostgreSQL, MySQL, Redis, MongoDB (more can be added).
- **UI:** Custom window (no system title bar), resizable left panel (connection tree) and bottom split (query editor / results), dark theme, [shadcn_flutter](https://pub.dev/packages/shadcn_flutter) components.
- **Flow:** Right-click “Servers” → “New connection” → pick database type → (future: connection form and query execution).
- **Flow:** Right-click “Servers” → “New connection” → pick database type → configure and save (stored in local SQLite).

## Database drivers

- **PostgreSQL** — `postgres` (Dart); browser, SQL workspace, table/view browsing, server stats.
- **MySQL / MariaDB** — `mysql_client` (Dart); browser (databases, tables, views), SQL workspace with configurable statement timeout, paginated table/view data (read-oriented browse SQL).
- **Redis** / **MongoDB** — see connection panels and workspace.

## Tech stack

Expand Down
84 changes: 84 additions & 0 deletions cliff.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# git-cliff — https://git-cliff.org/docs/configuration
# Conventional Commits: https://www.conventionalcommits.org/
#
# Явный remote: SSH origin (`git@github.com:…`) без этого даёт пустые ссылки в changelog.
# Форки могут переопределить секцию или задать GITHUB_REPO при генерации.

[remote.github]
owner = "QueryaHub"
repo = "Querya-Desktop"

[changelog]
header = """
# Changelog

Release history. Commit messages should follow [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, …) so entries group correctly.

"""
body = """
{%- macro commit_url(id) -%}
https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/commit/{{ id }}
{%- endmacro -%}

{% macro print_commit(commit) -%}
- {% if commit.scope %}**{{ commit.scope }}:** {% endif %}\
{% if commit.breaking %}[**breaking**] {% endif %}\
{{ commit.message | upper_first | trim }} — \
[`{{ commit.id | truncate(length=7, end="") }}`]({{ self::commit_url(id=commit.id) }})
{%- endmacro %}

{% if version %}
## [{{ version }}] — {{ timestamp | date(format="%Y-%m-%d") }}
{% if previous.version %}
[Compare {{ previous.version }}…{{ version }}](https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/compare/{{ previous.version }}..{{ version }})
{% endif %}
{% else %}
## [unreleased]
{% endif %}

{% for group, commits in commits | group_by(attribute="group") %}
### {{ group }}
{% for commit in commits -%}
{{ self::print_commit(commit=commit) }}
{% endfor %}
{% endfor %}
{%- if github %}
{%- set newbies = github.contributors | filter(attribute="is_first_time", value=true) %}
{%- if newbies | length != 0 %}

### New contributors
{% for c in newbies -%}
- @{{ c.username }}{% if c.pr_number %} ([#{{ c.pr_number }}](https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/pull/{{ c.pr_number }})){% endif %}
{% endfor %}
{%- endif %}
{%- endif %}
"""
footer = """
"""
trim = true

[git]
conventional_commits = true
# Включать и неконвенциональные коммиты (попадут в «Прочее»).
filter_unconventional = false
split_commits = false
commit_parsers = [
{ message = "^feat", group = "Features" },
{ message = "^fix", group = "Bug Fixes" },
{ message = "^doc", group = "Documentation" },
{ message = "^perf", group = "Performance" },
{ message = "^refactor", group = "Refactor" },
{ message = "^style", group = "Styling" },
{ message = "^test", group = "Tests" },
{ message = "^build", group = "Build" },
{ message = "^ci", group = "CI" },
{ message = "^chore", group = "Chore" },
{ message = "^revert", group = "Revert" },
{ message = ".*", group = "Other" },
]
protect_breaking_commits = true
filter_commits = false
tag_pattern = "v[0-9].*"
skip_tags = "beta|alpha|rc"
topo_order = false
sort_commits = "newest"
Loading
Loading