Adds SqlWorkbenchDeveloperPanelProvider (id sqlWorkbench, title "SQL Workbench", order 450, icon terminal), registered through DeveloperPanelsMetaData by SqlWorkbenchDeveloperPanelsMetaDataProducer (a qbit component producer in metadata/, so it runs only when the qbit is produced).
Available when the workbench runtime and app exist, the user has the workbench access permission (same check as the endpoints), and the table's backend is an RDBMS backend the workbench allows (allowedBackendNames / excludedBackendNames, via WorkbenchBackends.getTarget).
Panel: read-only SELECT for the record and one for the table (LIMIT 100; FETCH FIRST for generic dialects) in the backend's own table/column names (aliased to QQQ field names), identifiers quoted per dialect, primary key as an escaped/typed literal; backend, dialect, database table, read-only replica; links to /app/{prefixed sqlWorkbench}?sql=...&backend=... (opened as a new cell, never run); note that only what the user executes runs, under their workbench permissions.
RecordSql holds the SQL building (quoting, literals, MySQL backslash escaping).
qqq-snapshot profile now imports qqq-bom-pom:4.1.0-RC.4.
Dependencies
QQQ 4.1.0-RC.4 for the developer panel contract (QRun-IO/qqq#1076). CI will fail until RC.4 is on Maven Central; built and tested locally against 4.1.0-SNAPSHOT (-Dqqq.snapshot.version=4.1.0-SNAPSHOT).
Next UI ?sql=&backend= support on the workbench page: qqq-frontend-next #61.
Test plan
SqlWorkbenchDeveloperPanelProviderTest (5 tests): registration + panel through DeveloperPanelsAction; SQL for a table whose backend names differ, executed against H2 to prove it finds the row; string PK containing a quote; link encoding round-trip; prefixed app and replica reporting; writer sees identical SELECT-only panel; not available without permission, for a non-RDBMS backend, excluded / not-allowed backend, or missing app.
## Summary
- Adds `SqlWorkbenchDeveloperPanelProvider` (id `sqlWorkbench`, title "SQL Workbench", order 450, icon `terminal`), registered through `DeveloperPanelsMetaData` by `SqlWorkbenchDeveloperPanelsMetaDataProducer` (a qbit component producer in `metadata/`, so it runs only when the qbit is produced).
- **Available** when the workbench runtime and app exist, the user has the workbench access permission (same check as the endpoints), and the table's backend is an RDBMS backend the workbench allows (`allowedBackendNames` / `excludedBackendNames`, via `WorkbenchBackends.getTarget`).
- **Panel**: read-only `SELECT` for the record and one for the table (`LIMIT 100`; `FETCH FIRST` for generic dialects) in the backend's own table/column names (aliased to QQQ field names), identifiers quoted per dialect, primary key as an escaped/typed literal; backend, dialect, database table, read-only replica; links to `/app/{prefixed sqlWorkbench}?sql=...&backend=...` (opened as a new cell, never run); note that only what the user executes runs, under their workbench permissions.
- `RecordSql` holds the SQL building (quoting, literals, MySQL backslash escaping).
- README "Record developer panel" section, CHANGELOG Unreleased, CLAUDE.md/AGENTS.md.
- `qqq-snapshot` profile now imports `qqq-bom-pom:4.1.0-RC.4`.
## Dependencies
- QQQ **4.1.0-RC.4** for the developer panel contract (QRun-IO/qqq#1076). **CI will fail until RC.4 is on Maven Central**; built and tested locally against 4.1.0-SNAPSHOT (`-Dqqq.snapshot.version=4.1.0-SNAPSHOT`).
- Next UI `?sql=&backend=` support on the workbench page: qqq-frontend-next #61.
## Test plan
- [x] `SqlWorkbenchDeveloperPanelProviderTest` (5 tests): registration + panel through `DeveloperPanelsAction`; SQL for a table whose backend names differ, executed against H2 to prove it finds the row; string PK containing a quote; link encoding round-trip; prefixed app and replica reporting; writer sees identical SELECT-only panel; not available without permission, for a non-RDBMS backend, excluded / not-allowed backend, or missing app.
- [x] `./mvnw -o verify -Dqqq.snapshot.version=4.1.0-SNAPSHOT`: 107 unit + 6 integration tests green, JaCoCo checks met.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Heads-up from #9 (RC.3): /app/sqlWorkbench becomes the home dashboard and the notebook editor moves to the Runner child app (SqlWorkbenchRunnerAppMetaDataProducer.APP_NAME = sqlWorkbenchRunner). The panel's "open as a new cell" link should target /app/{prefixed sqlWorkbenchRunner}?sql=...&backend=... (the widget reads its query params wherever it is rendered). Whichever of #6 / #9 merges second should make that one-line change.
Heads-up from #9 (RC.3): `/app/sqlWorkbench` becomes the home dashboard and the notebook editor moves to the Runner child app (`SqlWorkbenchRunnerAppMetaDataProducer.APP_NAME` = `sqlWorkbenchRunner`). The panel's "open as a new cell" link should target `/app/{prefixed sqlWorkbenchRunner}?sql=...&backend=...` (the widget reads its query params wherever it is rendered). Whichever of #6 / #9 merges second should make that one-line change.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Release captain, for 1.0.0-RC.3: #7 (snake_case rename) and #9 (app home, Runner nav entry) are now on develop. The "open as a new cell" links must target the Runner page, /app/sqlWorkbenchRunner?sql=...&backend=..., not the app (/app/sqlWorkbench is now the app home dashboard). Today the link is built as "/app/" + appName (SqlWorkbench developer panel provider, around the ?sql= builder), and the tests assert /app/sqlWorkbench?sql= and /app/ops_sqlWorkbench?sql=. Please:
Release captain, for 1.0.0-RC.3: #7 (snake_case rename) and #9 (app home, Runner nav entry) are now on develop. The "open as a new cell" links must target the Runner page, **`/app/sqlWorkbenchRunner?sql=...&backend=...`**, not the app (`/app/sqlWorkbench` is now the app home dashboard). Today the link is built as `"/app/" + appName` (SqlWorkbench developer panel provider, around the `?sql=` builder), and the tests assert `/app/sqlWorkbench?sql=` and `/app/ops_sqlWorkbench?sql=`. Please:
1. merge develop (rename + #9) into this branch,
2. point the links at the Runner (keeping the table-name prefix behavior the `ops_` test covers) and update README line ~85 and the tests,
3. mark the PR ready when it's green.
I'll merge it and cut 1.0.0-RC.3 then.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
SqlWorkbenchDeveloperPanelProvider(idsqlWorkbench, title "SQL Workbench", order 450, iconterminal), registered throughDeveloperPanelsMetaDatabySqlWorkbenchDeveloperPanelsMetaDataProducer(a qbit component producer inmetadata/, so it runs only when the qbit is produced).allowedBackendNames/excludedBackendNames, viaWorkbenchBackends.getTarget).SELECTfor the record and one for the table (LIMIT 100;FETCH FIRSTfor generic dialects) in the backend's own table/column names (aliased to QQQ field names), identifiers quoted per dialect, primary key as an escaped/typed literal; backend, dialect, database table, read-only replica; links to/app/{prefixed sqlWorkbench}?sql=...&backend=...(opened as a new cell, never run); note that only what the user executes runs, under their workbench permissions.RecordSqlholds the SQL building (quoting, literals, MySQL backslash escaping).qqq-snapshotprofile now importsqqq-bom-pom:4.1.0-RC.4.Dependencies
-Dqqq.snapshot.version=4.1.0-SNAPSHOT).?sql=&backend=support on the workbench page: qqq-frontend-next #61.Test plan
SqlWorkbenchDeveloperPanelProviderTest(5 tests): registration + panel throughDeveloperPanelsAction; SQL for a table whose backend names differ, executed against H2 to prove it finds the row; string PK containing a quote; link encoding round-trip; prefixed app and replica reporting; writer sees identical SELECT-only panel; not available without permission, for a non-RDBMS backend, excluded / not-allowed backend, or missing app../mvnw -o verify -Dqqq.snapshot.version=4.1.0-SNAPSHOT: 107 unit + 6 integration tests green, JaCoCo checks met.🤖 Generated with Claude Code
Heads-up from #9 (RC.3):
/app/sqlWorkbenchbecomes the home dashboard and the notebook editor moves to the Runner child app (SqlWorkbenchRunnerAppMetaDataProducer.APP_NAME=sqlWorkbenchRunner). The panel's "open as a new cell" link should target/app/{prefixed sqlWorkbenchRunner}?sql=...&backend=...(the widget reads its query params wherever it is rendered). Whichever of #6 / #9 merges second should make that one-line change.🤖 Generated with Claude Code
Release captain, for 1.0.0-RC.3: #7 (snake_case rename) and #9 (app home, Runner nav entry) are now on develop. The "open as a new cell" links must target the Runner page,
/app/sqlWorkbenchRunner?sql=...&backend=..., not the app (/app/sqlWorkbenchis now the app home dashboard). Today the link is built as"/app/" + appName(SqlWorkbench developer panel provider, around the?sql=builder), and the tests assert/app/sqlWorkbench?sql=and/app/ops_sqlWorkbench?sql=. Please:ops_test covers) and update README line ~85 and the tests,I'll merge it and cut 1.0.0-RC.3 then.
🤖 Generated with Claude Code