Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2e14ef9
docs: add architecture, security, code of conduct, and contributing
dariomatias-dev Sep 6, 2026
4941726
fix(navigation): select database by name instead of label
dariomatias-dev Sep 12, 2026
780f741
ci: add renovate config, act runner pin, and PR template
dariomatias-dev Sep 12, 2026
8454faf
docs: document act and renovate in contributing guide
dariomatias-dev Sep 12, 2026
13f59fd
ci: add codecov config matching coverage script exclusions
dariomatias-dev Sep 12, 2026
7250d84
ci: add a pre-push hook running the quality gate
dariomatias-dev Sep 12, 2026
2a87e5b
docs: add CI, coverage, lints, and license badges to the README
dariomatias-dev Sep 12, 2026
9186965
ci: run the missing persistence integration suites
dariomatias-dev Sep 12, 2026
060166b
docs: add Architecture and Testing sections to the README
dariomatias-dev Sep 12, 2026
b0ef22d
docs: add Tests and Ripple effects sections to CLAUDE.md
dariomatias-dev Sep 12, 2026
5a5546e
refactor: extract design tokens into packages/app_ui
dariomatias-dev Sep 12, 2026
ebcb2cb
ci: add packages/app_ui to quality and vulnerability scan jobs
dariomatias-dev Sep 12, 2026
6a2c412
refactor: move simple leaf widgets into packages/app_ui
dariomatias-dev Sep 12, 2026
d3c5e49
ci: run app_ui tests with coverage and split Codecov flags
dariomatias-dev Sep 12, 2026
fd16686
refactor: move buttons into packages/app_ui
dariomatias-dev Sep 12, 2026
480adb7
ci: raise app_ui's coverage floor to 79%
dariomatias-dev Sep 12, 2026
e68ad83
refactor: move dialogs into packages/app_ui
dariomatias-dev Sep 12, 2026
be9010d
test: cover launchUrl failure paths in about and settings screens
dariomatias-dev Sep 12, 2026
d3a840e
docs: document the packages/app_ui split
dariomatias-dev Sep 12, 2026
2afff72
chore(scripts): check packages/app_ui in the local quality gate
dariomatias-dev Sep 12, 2026
a5fe4bb
chore(scripts): include packages in the workspace hash
dariomatias-dev Sep 12, 2026
df6d272
chore: allowlist project commands in settings.json
dariomatias-dev Sep 12, 2026
b0c7794
chore: ignore per-developer Claude Code state
dariomatias-dev Sep 12, 2026
3541125
fix(editor): point Flutter SDK to FVM stable symlink
dariomatias-dev Sep 12, 2026
68f6c3a
chore: exclude build/ from analysis in both packages
dariomatias-dev Sep 12, 2026
c76dcdd
fix(docs): reorder the README language selector
dariomatias-dev Sep 12, 2026
8a042ab
fix(ci): use a root-relative path in app_ui's coverage check
dariomatias-dev Sep 12, 2026
49f8a3d
test(database-visualizer): cover TableRelationPainter.paint
dariomatias-dev Sep 13, 2026
8403fe2
docs: standardize README structure across all three languages
dariomatias-dev Sep 20, 2026
c3d8ac7
docs: align guides with verify.sh scope and drop em dashes
dariomatias-dev Sep 20, 2026
4cd45ab
style: replace em dashes in comments and a test name
dariomatias-dev Sep 20, 2026
143c491
docs: indent README HTML blocks and mention app_ui in verify row
dariomatias-dev Sep 20, 2026
0033ddc
chore(main): release sql_studio 0.4.0
github-actions[bot] Sep 20, 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
1 change: 1 addition & 0 deletions .actrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-P ubuntu-latest=catthehacker/ubuntu:act-latest
24 changes: 22 additions & 2 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "scripts/format_edited_file.sh"
"command": "scripts/format_edited_file.sh",
"timeout": 30,
"statusMessage": "Formatting Dart..."
}
]
}
Expand All @@ -16,10 +19,27 @@
"hooks": [
{
"type": "command",
"command": "scripts/verify_stop_gate.sh"
"command": "scripts/verify_stop_gate.sh",
"timeout": 60,
"statusMessage": "Checking quality gate..."
}
]
}
]
},
"permissions": {
"allow": [
"Bash(./scripts/verify.sh)",
"Bash(./scripts/verify.sh:*)",
"Bash(./scripts/check_coverage.sh:*)",
"Bash(./scripts/check_l10n.sh)",
"Bash(./scripts/workspace_hash.sh)",
"Bash(fvm flutter analyze)",
"Bash(fvm flutter analyze:*)",
"Bash(fvm flutter test:*)",
"Bash(fvm flutter gen-l10n)",
"Bash(fvm flutter pub get)",
"Bash(fvm dart format:*)"
]
}
}
26 changes: 26 additions & 0 deletions .githooks/pre-push
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
#
# Runs the quality gate before a push, so a failure surfaces here rather than
# as a red CI run minutes later.
#
# Branch protection on main is what actually blocks a broken change. This hook
# is a local shortcut to the same answer, and `git push --no-verify` skips it.

set -euo pipefail

readonly root="$(git rev-parse --show-toplevel)"
cd "$root"

readonly deleted_ref="0000000000000000000000000000000000000000"

# stdin carries one line per ref being pushed: <local ref> <local sha>
# <remote ref> <remote sha>. A branch deletion has no commits to check.
pushing_commits=false
while read -r _ local_sha _ _; do
[[ "$local_sha" == "$deleted_ref" ]] && continue
pushing_commits=true
done

"$pushing_commits" || exit 0

exec "$root/scripts/verify.sh"
45 changes: 45 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
## What

<!-- What this change does, in a sentence or two. Link the issue it came from. -->

Closes #

## Why

<!-- The problem it solves. Skip only if the "What" already makes it obvious. -->

## Checklist

Tick what applies, delete what does not, and say why for anything left out.

**Code**

- [ ] Follows the existing structure: feature-first, `data`/`domain`/`presentation`, Riverpod for state (see `CLAUDE.md`)
- [ ] No inline colors, spacing, radii or text styles: everything comes from the shared design tokens
- [ ] No hardcoded user-facing text
- [ ] `Result<T>` matched with `when`/`switch`, never `is SuccessResult`/`is FailureResult`
- [ ] Logging goes through `AppLogger`; no SQL text, database names or other user data logged

**Tests**

- [ ] New logic has tests (repository, use case, view model, widget behaviour)
- [ ] A bug fix has a test that fails without the fix

**Generated and localized**

- [ ] `gen-l10n` re-run, output committed
- [ ] New strings added to all three ARB files (`en`, `es`, `pt`), each with a `description`

**Documentation**

- [ ] Docs in `docs/` updated in all three languages, if the change touched behaviour, structure or tooling
- [ ] README scripts table still accurate

**Gate**

- [ ] `./scripts/verify.sh` passes locally
- [ ] `act pull_request` run, if this touches `.github/workflows/`

## Notes for the reviewer

<!-- Anything deliberately left out, a trade-off taken, or a place worth a closer look. -->
66 changes: 63 additions & 3 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,62 @@ jobs:
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage/lcov.info
flags: app
name: sql_studio
fail_ci_if_error: false

app_ui:
name: packages/app_ui
runs-on: ubuntu-latest
timeout-minutes: 15
defaults:
run:
working-directory: packages/app_ui
steps:
- uses: actions/checkout@v7

- name: Read Flutter version from .fvmrc
id: flutter-version
run: echo "version=$(jq -r '.flutter' ../../.fvmrc)" >> "$GITHUB_OUTPUT"

- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ steps.flutter-version.outputs.version }}
channel: 'stable'
cache: true

- name: Install dependencies
run: flutter pub get

- name: Verify formatting
run: dart format --output=none --set-exit-if-changed lib/ test/

- name: Analyze
run: flutter analyze

- name: Test with coverage
run: flutter test --coverage

# A low interim floor: most components are still untested token
# classes (AppColors' ThemeExtension lerp/copyWith) waiting on later
# migration steps. Raise this as coverage catches up, not on faith.
- name: Check coverage threshold
run: ../../scripts/check_coverage.sh packages/app_ui/coverage/lcov.info 79

# lcov paths are relative to the package root; Codecov matches them
# against the repository, so they need the package prefix.
- name: Rewrite coverage paths to be repository-relative
run: sed -i 's|^SF:|SF:packages/app_ui/|' coverage/lcov.info

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: packages/app_ui/coverage/lcov.info
flags: app_ui
name: app_ui
fail_ci_if_error: false

build_apk:
name: Build release APK
needs: quality
Expand Down Expand Up @@ -177,6 +230,12 @@ jobs:
timeout 480 flutter test integration_test/delete_database_test.dart -d emulator-5554
adb -s emulator-5554 shell am force-stop br.com.dariomatias.sql_studio
timeout 480 flutter test integration_test/locale_switch_test.dart -d emulator-5554
adb -s emulator-5554 shell am force-stop br.com.dariomatias.sql_studio
timeout 480 flutter test integration_test/theme_persists_test.dart -d emulator-5554
adb -s emulator-5554 shell am force-stop br.com.dariomatias.sql_studio
timeout 480 flutter test integration_test/workspace_layout_persists_test.dart -d emulator-5554
adb -s emulator-5554 shell am force-stop br.com.dariomatias.sql_studio
timeout 480 flutter test integration_test/favorite_database_persists_test.dart -d emulator-5554

osv-scanner:
name: Scan dependencies for known vulnerabilities
Expand All @@ -188,11 +247,12 @@ jobs:
steps:
- uses: actions/checkout@v7

# Reads pubspec.lock against the OSV database, which carries pub
# advisories. The lockfile is what matters: the caret ranges in
# Reads the lockfiles against the OSV database, which carries pub
# advisories. The lockfile is what matters: the caret ranges in a
# pubspec.yaml say what could resolve, not what actually ships.
- name: Scan the lockfile
- name: Scan the lockfiles
uses: google/osv-scanner-action/osv-scanner-action@v2.5.1
with:
scan-args: |-
--lockfile=pubspec.lock
--lockfile=packages/app_ui/pubspec.lock
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ migrate_working_dir/
.pub-cache/
.pub/
/build/
packages/*/build/
/coverage/
packages/*/coverage/

# Symbolication related
app.*.symbols
Expand All @@ -49,3 +51,8 @@ app.*.map.json

# Local verify.sh pass stamp, read by the Stop hook.
/.claude/verify-stamp

# Per-developer Claude Code state: a personal permissions override, and
# worktrees created by isolated agent runs.
/.claude/settings.local.json
/.claude/worktrees/
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.3.0"
".": "0.4.0"
}
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"dart.flutterSdkPath": ".fvm/versions/3.41.6"
"dart.flutterSdkPath": ".fvm/flutter_sdk"
}
Loading