Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
232 commits
Select commit Hold shift + click to select a range
64ed63e
fix(er): span table card headers across the card
qianmoQ Nov 1, 2026
f6bc3ec
refactor(plugin): name every capability declaration capabilities.json
qianmoQ Nov 1, 2026
2d07833
feat(convert): let format plugins declare their writer settings
qianmoQ Nov 1, 2026
9c3ca3b
feat(export): rebuild data export as a five-step wizard
qianmoQ Nov 1, 2026
058f928
feat(export): check and run database exports as background jobs
qianmoQ Nov 1, 2026
b738cb0
refactor(spi): drop the unused isSupportMeta flag
qianmoQ Nov 1, 2026
4172910
fix(web): title sign-in, sign-up and other untitled pages
qianmoQ Nov 1, 2026
09e6ae1
fix(source): skip configure fields sent without a value
qianmoQ Nov 1, 2026
7ea5fbc
fix(web): return to sign-in, sign-up and setup after reconnecting
qianmoQ Nov 1, 2026
84b9833
fix(web): send failed file downloads to the network page
qianmoQ Nov 1, 2026
e053489
feat(auth): let administrators turn on sign-in and sign-up features
qianmoQ Nov 1, 2026
4ea74b0
feat(web): add the System settings page
qianmoQ Nov 1, 2026
85c18b3
feat(web): rebuild sign-in and sign-up after the prototype
qianmoQ Nov 1, 2026
e5a5638
feat(ui): let MfInput take autofill hints and keep its colors when fi…
qianmoQ Nov 1, 2026
1e5c731
fix(web): fill the viewport on auth pages and tidy their fields
qianmoQ Nov 1, 2026
67910e7
fix(driver): keep the Redis and MongoDB drivers compatible with 2025.1.0
qianmoQ Nov 1, 2026
f5417d5
docs: rewrite the README
qianmoQ Nov 1, 2026
98a3baf
docs: drop default accounts and align all three READMEs
qianmoQ Nov 1, 2026
445c4a9
feat(auth): add GitHub, Google and OpenID Connect sign-in
qianmoQ Nov 1, 2026
7506f13
fix(plugin): load dependency jars of compiled plugin modules
qianmoQ Nov 1, 2026
f4706e0
fix(plugin): fall back to plugin jars for parent-first classes
qianmoQ Nov 1, 2026
24fdc20
feat(web): offer GitHub, Google and OpenID Connect sign-in
qianmoQ Nov 1, 2026
129d44d
style: indent a comment and end metadata.ts with a newline
qianmoQ Nov 1, 2026
1c2e2be
fix(web): stop sign-in provider fields from wrapping inputs in labels
qianmoQ Nov 1, 2026
850fd45
feat(web): lay out System settings as tabs beside their content
qianmoQ Nov 1, 2026
c5d05b0
fix(driver): read Redis keys written by other clients with SQL
qianmoQ Nov 1, 2026
ce4832f
test(driver): close result sets and compare driver classes exactly
qianmoQ Nov 1, 2026
2061ca5
test(redis): verify the plugin against Redis 6.2 and 7.4
qianmoQ Nov 1, 2026
f6ec2f0
fix(driver): return MongoDB query rows through execute and describe t…
qianmoQ Nov 1, 2026
e16b1ca
feat(mongo): list databases, collections and fields
qianmoQ Nov 1, 2026
aaf70ed
test(mongo): verify the plugin against MongoDB 6.0 and 7.0
qianmoQ Nov 1, 2026
d47d84d
feat(web): browse keys in the query page tree for key-value sources
qianmoQ Nov 1, 2026
ed64886
test(postgresql): verify the plugin against PostgreSQL 15, 16 and 17
qianmoQ Nov 1, 2026
9ca4b2d
fix(ui): keep dropdowns with a disabled trigger closed
qianmoQ Nov 1, 2026
102ce1e
fix(query): stop squeezing side panel search fields and lock dataset …
qianmoQ Nov 1, 2026
309b62b
test(timescale): verify the plugin against TimescaleDB 2.17 and 2.22
qianmoQ Nov 1, 2026
429c015
test(paradedb): verify the plugin against ParadeDB 0.15 and 0.19
qianmoQ Nov 1, 2026
7b47515
revert(web): drop the key-value mode of the query page tree
qianmoQ Nov 1, 2026
ff26f37
feat(driver): describe Redis as databases, keys and columns
qianmoQ Nov 1, 2026
4852f2f
refactor(redis): browse Redis like MySQL instead of a key-value works…
qianmoQ Nov 1, 2026
b250016
feat(neo4j): list the database, labels and properties
qianmoQ Nov 1, 2026
09bbe9d
fix(web): show column detail tabs only for declared capabilities
qianmoQ Nov 1, 2026
99f1465
fix(spi): list columns from drivers without IS_AUTOINCREMENT
qianmoQ Nov 1, 2026
c31787b
fix(monetdb): read the server version from sys.environment
qianmoQ Nov 1, 2026
74b7845
test(monetdb): verify the plugin against MonetDB Aug2024 and Mar2025
qianmoQ Nov 1, 2026
ccc1c37
fix(h2): keep the in-memory database between queries
qianmoQ Nov 1, 2026
a1dc00b
fix(h2): list databases, tables and columns from JDBC metadata
qianmoQ Nov 1, 2026
139fe7a
test(h2): verify the plugin against its bundled H2 2.1.214
qianmoQ Nov 1, 2026
f842962
fix(h2-tcp): list databases, tables and columns from JDBC metadata
qianmoQ Nov 1, 2026
6866ca0
test(h2-tcp): verify the plugin against an H2 2.1.214 TCP server
qianmoQ Nov 1, 2026
53d9599
fix(duckdb): open the database file in the configured directory
qianmoQ Nov 1, 2026
e622412
fix(duckdb): list tables from information_schema
qianmoQ Nov 1, 2026
5c1d443
test(duckdb): verify the plugin against its bundled DuckDB 1.0.0
qianmoQ Nov 1, 2026
1fd65d9
fix(compare): read compared columns through the plugin's column listing
qianmoQ Nov 1, 2026
4c26e20
docs(plugin): rewrite the plugin guides for JDBC and shared metadata
qianmoQ Nov 1, 2026
fb93611
fix(oracle): find the server version on Oracle AI Database 26ai
qianmoQ Nov 1, 2026
682684c
test(oracle): verify the plugin against Oracle Database 23ai and 26ai
qianmoQ Nov 1, 2026
9898187
fix(elasticsearch-8x): check the source without version()
qianmoQ Nov 1, 2026
d4ba1da
test(elasticsearch-8x): verify the plugin against Elasticsearch 8.15 …
qianmoQ Nov 1, 2026
205cfaf
fix(influxdb): check the source with SHOW DIAGNOSTICS
qianmoQ Nov 1, 2026
ade2c4a
fix(influxdb): list databases, measurements, tags and fields
qianmoQ Nov 1, 2026
975c89c
test(influxdb): verify the plugin against InfluxDB 1.8 and 1.11
qianmoQ Nov 1, 2026
7885984
test(trino): verify the plugin against Trino 470 and 476
qianmoQ Nov 1, 2026
fc5cb54
fix(iotdb): check the source with SHOW VERSION
qianmoQ Nov 1, 2026
fb92a21
fix(iotdb): list databases, devices and measurements with SHOW
qianmoQ Nov 1, 2026
f0f1728
test(iotdb): verify the plugin against IoTDB 1.3 and 2.0
qianmoQ Nov 1, 2026
b65fccb
fix(tdengine): read the server version with server_version()
qianmoQ Nov 1, 2026
d1a7efc
fix(tdengine): list columns and tags with DESCRIBE
qianmoQ Nov 1, 2026
669d0cf
fix(tdengine): list super tables and tables from information_schema
qianmoQ Nov 1, 2026
1974c49
test(tdengine): verify the plugin against TDengine 3.1 and 3.3
qianmoQ Nov 1, 2026
cfea491
docs(snowflake): say why the connector has no e2e test
qianmoQ Nov 1, 2026
98bbbbc
docs(hologres): say why the connector has no e2e test
qianmoQ Nov 1, 2026
53ef752
test(dm): verify the plugin against DM 8
qianmoQ Nov 1, 2026
70acbb1
fix(server): open java.nio for the Ignite JDBC driver
qianmoQ Nov 1, 2026
5936036
fix(ignite): report the server version from SYS.NODES
qianmoQ Nov 1, 2026
a38fdb1
fix(ignite): list schemas, tables and columns from JDBC metadata
qianmoQ Nov 1, 2026
2ca3e17
test(ignite): verify the plugin against Ignite 2.17 and 2.18
qianmoQ Nov 1, 2026
4a088c8
test(matrixone): verify the plugin against MatrixOne 3.0 and 4.2
qianmoQ Nov 1, 2026
8ba77f6
fix(dolphindb): report the version as text
qianmoQ Nov 1, 2026
27683e7
fix(dolphindb): list databases, tables and columns with DolphinDB fun…
qianmoQ Nov 1, 2026
02394ef
test(dolphindb): verify the plugin against DolphinDB 2.00 and 3.00
qianmoQ Nov 1, 2026
6aa3449
fix(solr): use the Solr 9 SQL JDBC driver
qianmoQ Nov 1, 2026
3f4db8d
fix(solr): pass the collection as a URL parameter and default to port…
qianmoQ Nov 1, 2026
ba99ed6
fix(solr): list collections and fields from Solr's metadata tables
qianmoQ Nov 1, 2026
d0c5253
test(solr): verify the plugin against Solr 9.4 and 9.11
qianmoQ Nov 1, 2026
ef12bbd
test(hive-2x): verify the plugin against HiveServer2 4.0 and 4.1
qianmoQ Nov 1, 2026
7a71698
test(presto): verify the plugin against PrestoDB 0.296 and 0.299
qianmoQ Nov 1, 2026
2d5387c
fix(service): read export and import columns through the plugin
qianmoQ Nov 1, 2026
d5b4d0f
fix(starrocks): report StarRocks' version, not the MySQL one it emulates
qianmoQ Nov 1, 2026
4fe6039
test(starrocks): verify the plugin against StarRocks 3.5 and 4.0
qianmoQ Nov 1, 2026
2033a43
fix(dremio): connect through the Arrow Flight SQL JDBC driver
qianmoQ Nov 1, 2026
323b439
test(dremio): verify the plugin against Dremio 25.2 and 26.0
qianmoQ Nov 1, 2026
f389fd6
test(sqlserver): verify the plugin against SQL Server 2019 and 2022
qianmoQ Nov 2, 2026
dc8338b
fix(doris): report Doris' version, not the MySQL one it emulates
qianmoQ Nov 2, 2026
fbad83d
fix(doris): default to the frontend's query port 9030
qianmoQ Nov 2, 2026
aa743a3
test(doris): verify the plugin against Doris 2.1 and 4.1
qianmoQ Nov 2, 2026
600639f
fix(pinot): check the source without a sample table
qianmoQ Nov 2, 2026
c964a6c
fix(pinot): list tables and columns without a schema
qianmoQ Nov 2, 2026
9b731d6
test(pinot): verify the plugin against Pinot 1.4 and 1.5
qianmoQ Nov 2, 2026
43028dd
fix(ydb): build the URL the YDB driver reads
qianmoQ Nov 2, 2026
c1ca1c9
fix(ydb): turn on autocommit
qianmoQ Nov 2, 2026
ff9bbba
fix(ydb): run CREATE, ALTER and DROP as scheme queries
qianmoQ Nov 2, 2026
336aeac
fix(ydb): list the database's tables and columns without a schema
qianmoQ Nov 2, 2026
65c7f47
test(ydb): verify the plugin against YDB 25.4 and 26.3
qianmoQ Nov 2, 2026
a6850a9
test(oceanbase): verify the plugin against OceanBase 4.2, 4.3 and 4.4
qianmoQ Nov 2, 2026
751bcef
test(db2): verify the plugin against Db2 11.5 and 12.1
qianmoQ Nov 2, 2026
b2aa4ba
fix(spi): list columns when the server can not look up primary keys
qianmoQ Nov 2, 2026
ca81f45
test(kyuubi): verify the plugin against Kyuubi 1.10 and 1.11
qianmoQ Nov 2, 2026
41c2263
test(server): expect 22 mapped entities
qianmoQ Nov 2, 2026
7e2b0ec
fix(history): list query history newest first
qianmoQ Nov 2, 2026
b424812
refactor(web): drop the list titles above every data table
qianmoQ Nov 2, 2026
8b1224e
test(plugin): skip dm e2e on foreign arch
qianmoQ Nov 2, 2026
0144b29
feat(settings): set file storage in system settings
qianmoQ Nov 2, 2026
e8eec50
feat(web): add a file storage tab to system settings
qianmoQ Nov 2, 2026
f65b2a1
test(plugin): pick e2e images by host arch
qianmoQ Nov 2, 2026
73f9e05
feat(web): show saved query results in a drawer with the shared table
qianmoQ Nov 2, 2026
9fa36ed
refactor(function): use MfTable for the import example, mapping and p…
qianmoQ Nov 2, 2026
43cf28b
build(web): drop dependencies nothing uses
qianmoQ Nov 2, 2026
09a408b
feat(settings): test file storage and runtime settings before saving
qianmoQ Nov 2, 2026
abc04d3
feat(web): move runtime settings into System settings with a test button
qianmoQ Nov 2, 2026
06f893d
fix(security): serve built web assets without a token
qianmoQ Nov 2, 2026
d138492
fix(web): show a spinner until the first page resolves
qianmoQ Nov 2, 2026
6c0543d
fix(web): drop the retired runtime settings menu
qianmoQ Nov 2, 2026
8a0b993
ci: install modules before running the test suite
qianmoQ Nov 2, 2026
7bd983c
refactor(executor): rename the Local executor to MetaForge
qianmoQ Nov 2, 2026
549216e
feat(executor): queue dataset syncs and track their state and metrics
qianmoQ Nov 2, 2026
ef61991
feat(executor): pipeline reads and writes and collect detailed metrics
qianmoQ Nov 2, 2026
b231d79
fix(web): show a spinner while the source wizard loads plugins
qianmoQ Nov 2, 2026
fcc2434
feat(query): rebuild result visualization from the prototype
qianmoQ Nov 4, 2026
92037dd
feat(report): refresh query charts in read-only transactions
qianmoQ Nov 4, 2026
2e1ed5f
feat(query): migrate to ECharts and add chart controls
qianmoQ Nov 4, 2026
afa2846
fix(plugin): key development modules by their directory name
qianmoQ Nov 4, 2026
7f3046c
build(store): generate the plugin catalogue from each module
qianmoQ Nov 4, 2026
ab8817c
feat(plugin): expose the store details shipped in each plugin
qianmoQ Nov 4, 2026
18b80b7
fix(ui): keep horizontal tab bars from scrolling vertically
qianmoQ Nov 4, 2026
d5fc259
feat(store): manage plugins safely and count verified downloads
qianmoQ Nov 4, 2026
1da2f67
feat(ui): let MfDrawer callers replace the body padding
qianmoQ Nov 4, 2026
386321e
feat(store): rebuild the plugin store from the prototype
qianmoQ Nov 4, 2026
9525eb9
feat(report): share reports through public links and iframe embeds
qianmoQ Nov 4, 2026
2785e60
feat(report): add report sharing and the public report page
qianmoQ Nov 4, 2026
1fbd28b
feat(report): expire share links and choose what the public page shows
qianmoQ Nov 4, 2026
af136b3
feat(report): add a share button with expiry and display settings
qianmoQ Nov 4, 2026
082e1fa
fix(report): open share links without sign-in and tidy the share dialog
qianmoQ Nov 4, 2026
fe1363f
feat(report): let shared reports offer their data and a CSV download
qianmoQ Nov 4, 2026
31aef5b
fix(report): keep share addresses intact and offer data downloads
qianmoQ Nov 4, 2026
ccfa891
feat(web): serve the web UI on history-routed page addresses
qianmoQ Nov 5, 2026
61e903c
feat(web): switch to history routing without #/ in addresses
qianmoQ Nov 5, 2026
eadc650
fix(ui): align table headers and stabilize numeric and menu controls
qianmoQ Nov 5, 2026
3a06ced
feat(visualization): support the full echarts series catalog
qianmoQ Nov 5, 2026
24430e3
feat(dashboard): build a complete visual studio for boards and screens
qianmoQ Nov 5, 2026
585fbda
fix(clickhouse): read index details from ClickHouse system tables
qianmoQ Nov 5, 2026
a8d2a9a
fix(source): load the workspace visibly and keep the tree still
qianmoQ Nov 5, 2026
c5ab63c
feat(notify): let channels declare the settings each user fills in
qianmoQ Nov 5, 2026
a58bcdd
feat(notify): deliver scene notices with per-user channel settings
qianmoQ Nov 5, 2026
942a36b
feat(notify): rebuild account notify page around channels and scenes
qianmoQ Nov 5, 2026
d401aef
feat(notify): raise scene notices from sources, reports and accounts
qianmoQ Nov 5, 2026
edc3a34
refactor(notify): show channels as wrapping cards with a settings drawer
qianmoQ Nov 5, 2026
1565a82
fix(notify): refresh header notifications without reloading the page
qianmoQ Nov 5, 2026
b613197
feat(notify): add a per-user notification inbox api
qianmoQ Nov 5, 2026
014a392
feat(notify): rebuild the notification center around a bell panel
qianmoQ Nov 5, 2026
1676490
style(notify): lay out the notification center like other list pages
qianmoQ Nov 5, 2026
e2262b0
fix(forms): align settings fields and keep feedback below controls
qianmoQ Nov 6, 2026
b5dae60
style(web): replace decorative glyphs with svg icons
qianmoQ Nov 6, 2026
79f5b27
feat(workflow): rebuild the studio around executor capabilities
qianmoQ Nov 6, 2026
e02f0b5
refactor(workflow): let executor plugins declare and compile workflows
qianmoQ Nov 6, 2026
16a7492
feat(workflow): drive the studio from executor declarations
qianmoQ Nov 6, 2026
9458cab
fix(workflow): connect ports by dragging between them
qianmoQ Nov 6, 2026
89b9ffe
fix(workflow): end connection arrows at the port rim
qianmoQ Nov 6, 2026
36543a7
fix(ui): keep input autofill paint inside the rounded frame
qianmoQ Nov 6, 2026
acd43fd
refactor(web): share the studio back link between dashboard pages
qianmoQ Nov 6, 2026
3e01de9
feat(workflow): read query columns and previews through source plugins
qianmoQ Nov 6, 2026
d72bdfa
feat(workflow): lay out the list and run details like other pages
qianmoQ Nov 6, 2026
ea25d23
feat(workflow): fill sink targets and edit SQL from source metadata
qianmoQ Nov 6, 2026
79ba14b
fix(spi): write batches with auto-commit on engines without transactions
qianmoQ Nov 6, 2026
73b6c47
fix(workflow): keep the run details menu fixed and scroll the content
qianmoQ Nov 6, 2026
66ebbac
feat(workflow): show the metrics each executor declares for its runs
qianmoQ Nov 6, 2026
77b74a2
fix(executor): count the batch committed when the writer closes
qianmoQ Nov 6, 2026
425ac85
build(server): leave application.properties out of the server jar
qianmoQ Nov 6, 2026
8798c8a
feat(workflow): return run start and finish times formatted by the se…
qianmoQ Nov 6, 2026
6b6c6a0
feat(workflow): split run details into tabs and chart the run metrics
qianmoQ Nov 6, 2026
2a106c9
fix(web): write every date as YYYY-MM-DD HH:mm:ss
qianmoQ Nov 6, 2026
bbd956c
fix(workflow): show run end times and translate execution stages
qianmoQ Nov 6, 2026
c9d8b1a
refactor(source): list column settings in MfTable
qianmoQ Nov 6, 2026
54cf869
feat(executor): report the source total once a run reads it completely
qianmoQ Nov 6, 2026
2e85912
fix(workflow): tolerate runs that report no or partial metrics
qianmoQ Nov 6, 2026
9e6ffea
feat(workflow): count the source before a run by default
qianmoQ Nov 6, 2026
2eb849c
feat(dataset): return sync transition times formatted by the server
qianmoQ Nov 6, 2026
4012e15
refactor(web): share run metrics, stages, log and layout components
qianmoQ Nov 6, 2026
3d494d2
feat(dataset): show sync records like workflow runs
qianmoQ Nov 6, 2026
5e69604
fix(dataset): label the dataset state on the sync records menu
qianmoQ Nov 6, 2026
df882ae
fix(ui): pin badge counts to the corner of the content they mark
qianmoQ Nov 6, 2026
7d910cb
fix(notify): open dataset sync notices on the sync records page
qianmoQ Nov 6, 2026
cbecf84
refactor(web): simplify page and editor panel headings
qianmoQ Nov 6, 2026
6d17780
feat(dataset): rebuild the adhoc query workspace
qianmoQ Nov 6, 2026
94fb6a8
feat(dashboard): add responsive resizable editor sidebars
qianmoQ Nov 6, 2026
eba83c6
fix(dataset): enable ad hoc queries once the dataset table exists
qianmoQ Nov 6, 2026
9ccff08
i18n(web): name visualization pages after what they show
qianmoQ Nov 6, 2026
afa4982
feat(dashboard): let users open a data screen as their home page
qianmoQ Nov 6, 2026
2c88f88
refactor(dataset): group adhoc properties into inspector cards
qianmoQ Nov 6, 2026
b943edf
fix(dashboard): show only the data screen on the home page
qianmoQ Nov 6, 2026
78cfba2
feat(home): redesign the default resource workspace
qianmoQ Nov 6, 2026
33d15ae
feat(dashboard): move data screens to /screen with a toolbar-free view
qianmoQ Nov 6, 2026
d7111e5
feat(dashboard): share data screens with users, roles and everyone
qianmoQ Nov 6, 2026
f3b0b69
feat(dashboard): add public links for data screens
qianmoQ Nov 6, 2026
390f818
fix(dashboard): prevent clipping in the sharing dialog
qianmoQ Nov 6, 2026
841e43d
feat(dashboard): add a searchable gallery with static previews
qianmoQ Nov 6, 2026
449e8e9
feat(home): add query activity charts and recent resources
qianmoQ Nov 6, 2026
cea2f9e
chore(server): document intentional singleton dependencies
qianmoQ Nov 6, 2026
5efaf08
feat(executor): split queries across parallel channels with a rate limit
qianmoQ Nov 7, 2026
881e458
fix(metrics): prevent overlapping chart legends and labels
qianmoQ Nov 7, 2026
927fd80
fix(home): count datasets without loading legacy rows
qianmoQ Nov 7, 2026
28f7a5c
fix(dataset): let fresh installs start and syncs run without pipelines
qianmoQ Nov 7, 2026
6806c04
feat(executor): tolerate write failures and pause, resume, retry syncs
qianmoQ Nov 7, 2026
d1cbe42
feat(charts): add centered loading states
qianmoQ Nov 7, 2026
44041e3
feat(web): show sync progress on the list and group runtime settings
qianmoQ Nov 7, 2026
99f9e48
docs(executor): document the sync executor and its settings
qianmoQ Nov 7, 2026
f1e3451
feat(dashboard): expand screen widgets and report filters
qianmoQ Nov 7, 2026
9777ee9
feat(store): fetch the plugin catalogue through the server
qianmoQ Nov 7, 2026
9272238
chore(store): use forgestats.devlive.org for the statistics service
qianmoQ Nov 7, 2026
f07feb8
ci(release): publish maven central like the grantforge flow
qianmoQ Nov 7, 2026
cfc8c92
feat(dashboard): add operations and inspection widgets
qianmoQ Nov 7, 2026
f73bd47
feat(dashboard): add business analytics widgets
qianmoQ Nov 7, 2026
a09fd9e
feat(settings): make runtime field groups collapsible
qianmoQ Nov 7, 2026
1a90f12
fix(persistence): pass the oracle and sqlserver matrix runs
qianmoQ Nov 7, 2026
b83b1bb
test(workflow): tolerate the run file lagging the success state
qianmoQ Nov 7, 2026
6363fb8
test(presto): drop the e2e that cannot run in a single-node container
qianmoQ Nov 7, 2026
790bfd4
test(e2e): retry while the coordinator reports no live nodes
qianmoQ Nov 7, 2026
ea1cbab
fix(presto): convert the gate deadline to millis
qianmoQ Nov 7, 2026
7ae8749
fix(presto): declare the gate's interrupted sleep
qianmoQ Nov 7, 2026
da8e97e
ci(tests): give the backend suite ninety minutes and gate trino
qianmoQ Nov 7, 2026
70e5fc2
test(sync): poll for the dataset release after a resumed run
qianmoQ Nov 7, 2026
f76d8c8
test(e2e): cap the scheduler containers' memory
qianmoQ Nov 7, 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
  •  
  •  
  •  
17 changes: 15 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ jobs:
tests:
name: Backend tests
runs-on: ubuntu-latest
timeout-minutes: 45
# The plugin e2e modules alone need well over half an hour: every scheduler-based
# engine (presto, trino) starts its own container per documented version.
timeout-minutes: 90
steps:
- uses: actions/checkout@v4

Expand All @@ -97,8 +99,19 @@ jobs:
# The root pom has no Surefire pin; Maven's default (2.12.4) cannot run
# JUnit 5 and silently executes zero tests. Invoke Surefire explicitly
# until the root pom pins the plugin version.
#
# Install first (skipping test execution) so downstream modules resolve
# packaged artifacts: the shaded drivers only exist after the package
# phase, and a bare test-compile would leave their plugin tests with a
# driver-less classpath.
- name: Build and install all modules
run: >
./mvnw -B clean install
-DskipTests -Dcheckstyle.skip -Dspotbugs.skip -Dgpg.skip
-Dskip.pnpm -Dskip.npm -Dskip.installnodenpm

- name: Run the JUnit 5 suite
run: >
./mvnw -B test-compile org.apache.maven.plugins:maven-surefire-plugin:3.2.2:test
./mvnw -B org.apache.maven.plugins:maven-surefire-plugin:3.2.2:test
-Dcheckstyle.skip -Dspotbugs.skip -Dgpg.skip
-Dskip.pnpm -Dskip.npm -Dskip.installnodenpm
143 changes: 115 additions & 28 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,46 +109,133 @@ jobs:
maven:
name: Publish to Maven Central
runs-on: ubuntu-latest
timeout-minutes: 60
timeout-minutes: 150
needs: build
env:
# Publishing to Maven Central is permanent, so it runs last and only when
# its secrets exist; a half-configured repository still releases the rest.
CENTRAL_CONFIGURED: ${{ secrets.CENTRAL_USERNAME != '' && secrets.GPG_PRIVATE_KEY != '' }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }}

# Imports the GPG key and injects the metaforge-ossrh server
# credentials into the Maven settings. The gpg-passphrase input is the
# NAME of the env variable holding the passphrase, provided below.
- name: Set up JDK 21 with signing and repository credentials
# The distribution and the store archives (dist/plugins) are built once
# here; the publishing steps below reuse them, so a deploy that fails
# half-way leaves nothing behind and re-running finishes the release.
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
cache: maven
gpg-private-key: ${{ secrets.GPG_SECRET }}
gpg-passphrase: GPG_PASSPHRASE
server-id: metaforge-ossrh
server-username: OSSRH_USERNAME
server-password: OSSRH_TOKEN

# Fails fast with a clear message when the key or passphrase is wrong,
# instead of stalling or failing halfway through the deploy.
- name: Verify the GPG signing key
- name: Build the distribution and the store archives
run: >
./mvnw -B clean install
-Dmaven.test.skip=true -Dcheckstyle.skip -Dspotbugs.skip -Dgpg.skip
-Dskip.pnpm -Dskip.npm -Dskip.installnodenpm

- uses: actions/setup-java@v4
if: env.CENTRAL_CONFIGURED == 'true'
with:
distribution: temurin
java-version: 21
cache: maven
# Publishing goes to Maven Central through the Central Portal with the
# server id "central"; the gpg-passphrase input is the NAME of the env
# variable holding the passphrase, provided below.
server-id: central
server-username: CENTRAL_USERNAME
server-password: CENTRAL_PASSWORD
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
gpg-passphrase: MAVEN_GPG_PASSPHRASE
- name: Publish the Maven artifacts to Maven Central
if: env.CENTRAL_CONFIGURED == 'true'
env:
GPG_PASSPHRASE: ${{ secrets.GPG_PASSWORD }}
CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }}
CENTRAL_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }}
MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
run: |
gpg --list-secret-keys --keyid-format long
echo 'metaforge signing check' | gpg --batch --yes --pinentry-mode loopback --passphrase "$GPG_PASSPHRASE" --local-user "$(gpg --list-secret-keys --keyid-format long --with-colons | awk -F: '/^sec/{print $5; exit}')" -o /tmp/signing-check.sig --sign
rm -f /tmp/signing-check.sig
version="$(./mvnw -B -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive \
-Dorg.slf4j.simpleLogger.defaultLogLevel=WARN exec:exec | tail -1)"
if curl --silent --fail --head --output /dev/null \
"https://repo1.maven.org/maven2/org/devlive/metaforge/metaforge/${version}/metaforge-${version}.pom"; then
echo "::notice::${version} is on Maven Central already"
exit 0
fi
./mvnw --batch-mode --no-transfer-progress -Prelease,central -Dcentral.skip=false \
-Dmaven.test.skip=true -Dcheckstyle.skip -Dspotbugs.skip \
-Dskip.pnpm -Dskip.npm -Dskip.installnodenpm deploy \
-pl '!test/metaforge-test-condor,!test/metaforge-test-convert,!test/metaforge-test-core,!test/metaforge-test-lib,!test/metaforge-test-executor,!test/metaforge-test-scheduler,!test/metaforge-test-fs,!test/metaforge-test-driver,!test/metaforge-test-parser,!test/metaforge-test-plugin'
- name: Skip Maven Central
if: env.CENTRAL_CONFIGURED != 'true'
run: echo "::notice::Maven Central skipped; set CENTRAL_USERNAME, CENTRAL_PASSWORD, GPG_PRIVATE_KEY and GPG_PASSPHRASE to publish there"

# The store catalogue and the statistics catalog are built from the very
# archives just deployed to Maven Central (dist/plugins holds copies), so
# one SHA-256 and size are valid for the Maven and CDN sources alike.
- name: Build the store catalogue and the statistics catalog
run: >
node configure/publish/build-metadata.mjs --dist dist/plugins --strict
--out dist/metadata.json --catalog dist/release-catalog.json
--commit "$GITHUB_SHA" --generation "$GITHUB_RUN_NUMBER" --released now

- name: Upload the catalogues
uses: actions/upload-artifact@v4
with:
name: store-catalogue
if-no-files-found: error
path: |
dist/metadata.json
dist/release-catalog.json

- name: Deploy to Maven Central
# Order: packages to the CDN -> catalog into ForgeStats -> public metadata.json.
# A failed step keeps the previous public catalogue, and re-running is safe.
- name: Publish the packages to the CDN
env:
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }}
GPG_PASSPHRASE: ${{ secrets.GPG_PASSWORD }}
run: >
./mvnw -B clean deploy -Pdeploy
-DskipTests -Dcheckstyle.skip -Dspotbugs.skip
-Dskip.pnpm -Dskip.npm -Dskip.installnodenpm
-Dgpg.passphrase="$GPG_PASSPHRASE"
-pl '!test/metaforge-test-condor,!test/metaforge-test-convert,!test/metaforge-test-core,!test/metaforge-test-lib,!test/metaforge-test-executor,!test/metaforge-test-scheduler,!test/metaforge-test-fs,!test/metaforge-test-driver,!test/metaforge-test-parser,!test/metaforge-test-plugin'
OSS_ACCESS_KEY_ID: ${{ secrets.OSS_ACCESS_KEY_ID }}
OSS_ACCESS_KEY_SECRET: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
OSS_ENDPOINT: ${{ secrets.OSS_ENDPOINT }}
OSS_BUCKET: ${{ secrets.OSS_BUCKET }}
run: |
if [ -z "$OSS_ACCESS_KEY_ID" ]; then
echo '::warning::OSS secrets are not set; skipping the CDN upload (the store falls back to Maven Central)'
exit 0
fi
# Official ossutil 1.x installer (same tool as configure/publish/publish-oss-artifact.sh).
curl -fsSL https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash
oss() { ossutil -e "$OSS_ENDPOINT" -i "$OSS_ACCESS_KEY_ID" -k "$OSS_ACCESS_KEY_SECRET" "$@"; }
jq -r '.plugins[] | .sources.cdn' dist/release-catalog.json | while read -r path; do
file="dist/plugins/$(basename "$path")"
oss cp "$file" "oss://$OSS_BUCKET/applications/metaforge/plugins/$path" -f
done

- name: Import the statistics catalog into ForgeStats
env:
STATS_SSH_KEY: ${{ secrets.STATS_SSH_KEY }}
STATS_SSH_TARGET: ${{ secrets.STATS_SSH_TARGET }}
run: |
if [ -z "$STATS_SSH_KEY" ] || [ -z "$STATS_SSH_TARGET" ]; then
echo '::warning::ForgeStats secrets are not set; downloads of this release are not counted'
exit 0
fi
umask 077
printf '%s\n' "$STATS_SSH_KEY" > "$RUNNER_TEMP/stats-key"
digest=$(sha256sum dist/release-catalog.json | cut -d ' ' -f 1)
ssh -T -i "$RUNNER_TEMP/stats-key" -o BatchMode=yes -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new \
"$STATS_SSH_TARGET" "sudo -n /usr/local/sbin/forgestats-admin catalog metaforge $digest" < dist/release-catalog.json
rm -f "$RUNNER_TEMP/stats-key"

- name: Publish the store catalogue
env:
OSS_ACCESS_KEY_ID: ${{ secrets.OSS_ACCESS_KEY_ID }}
OSS_ACCESS_KEY_SECRET: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
OSS_ENDPOINT: ${{ secrets.OSS_ENDPOINT }}
OSS_BUCKET: ${{ secrets.OSS_BUCKET }}
run: |
if [ -z "$OSS_ACCESS_KEY_ID" ]; then
echo '::warning::OSS secrets are not set; publish dist/metadata.json from the store-catalogue artifact manually'
exit 0
fi
ossutil -e "$OSS_ENDPOINT" -i "$OSS_ACCESS_KEY_ID" -k "$OSS_ACCESS_KEY_SECRET" \
cp dist/metadata.json "oss://$OSS_BUCKET/applications/metaforge/metadata/metadata.json" -f
130 changes: 106 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@

# MetaForge

---
**Integrated software for data transformation, integration, and visualization**

![Visitors](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2FEdurtIO%2Fmetaforge.git&countColor=%23263759&style=flat&labelStyle=none)
[![](https://tokei.rs/b1/github/EdurtIO/metaforge)](https://github.com/EdurtIO/metaforge)
![version](https://img.shields.io/github/v/release/EdurtIO/metaforge.svg)
---

[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
![GitHub Release Date](https://img.shields.io/github/release-date/EdurtIO/metaforge?style=flat-square)
![version](https://img.shields.io/github/v/release/EdurtIO/metaforge.svg)

![Docker Automated build](https://img.shields.io/docker/automated/devliveorg/metaforge)
[![Docker Automated build](https://img.shields.io/docker/automated/devliveorg/metaforge)](https://hub.docker.com/r/devliveorg/metaforge)
![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/devliveorg/metaforge?style=flat-square)
![Docker Pulls](https://img.shields.io/docker/pulls/devliveorg/metaforge?style=flat-square)

Expand All @@ -23,28 +21,118 @@

</div>

### What is metaforge?
## What is MetaForge?

---

MetaForge is integrated software for data transformation, integration, and visualization. It supports a wide variety of data sources — relational databases, NoSQL databases, big data engines, message queues and file systems — and lets you manage multiple data sources, query and transform data, build datasets, and create charts and monitoring views.

## Features

---

MetaForge is integrated software for data transformation, integration, and visualization. Support a variety of data sources, file types, big data related database, relational database, NoSQL database, etc. Through the software can realize the management of multiple data sources, the data under the source of various operations conversion, making data charts, monitoring data sources and other functions.
- **Data source management** — connect, test and manage 50+ data sources from a single console
- **SQL query console** — IDE-style editor with syntax highlighting, formatting, execution history and export
- **Datasets** — build reusable datasets from tables or ad-hoc queries, preview data and define column metadata
- **Visualization** — drag-and-drop dashboards with tables, pies and more chart types
- **Reports** — schedule and share reports
- **Workflows** — chain data jobs into repeatable workflows
- **File storage** — read and write files through Aliyun OSS, Amazon S3, HDFS, local storage and more
- **Notifications** — DingTalk, email and other channels for job and system events
- **AI assistant** — chat with your data through configured AI providers
- **Plugin architecture** — every connector, converter and storage backend is a hot-loadable plugin
- **Administration** — users, roles, menus and runtime configuration with fine-grained permissions

## Requirements

| Username | Password |
|:---------:|:------------|
| `metaforge` | `123456789` |
| `admin` | `12345678` |
---

| Dependency | Version |
|:-----------|:---------------------------------------------|
| JDK | 21 |
| Maven | 3.9+ (wrapper `./mvnw` included) |
| Node.js | 20 |
| pnpm | 9.13.2 |

### Require
## Getting Started

---

> Must-read for users: Be sure to execute the following command after cloning the code locally
> Must-read for users: be sure to execute the following command after cloning the code locally

```bash
cp configure/git-hook/* .git/hooks
chmod 700 .git/hooks/*
```

### Run the backend (development)

Run the main class `org.devlive.metaforge.server.MetaForge` (module `core/metaforge-server`) from your IDE.
The server starts on [http://localhost:9096](http://localhost:9096). On first launch the setup wizard guides you through
selecting the metadata database (embedded H2 by default, or MySQL / PostgreSQL / SQL Server / Oracle) and creating the
administrator account.

### Run the frontend (development)

```bash
pnpm install
pnpm --filter metaforge-web dev
```

The web console starts on [http://localhost:3001](http://localhost:3001) and proxies API calls to the backend.

### Build for production

```bash
# Frontend
pnpm --filter metaforge-web build

# Backend + distribution package (the server serves the built frontend
# from core/metaforge-web/dist; the tarball lands in dist/)
./mvnw -T1C clean package -DskipTests
```

## Docker

---

```bash
docker pull devliveorg/metaforge:latest
docker run -d --name metaforge -p 9096:9096 devliveorg/metaforge:latest
```

Or unpack the distribution built locally (`dist/metaforge-server-2026.0.0-bin.tar.gz`) and run `bin/startup.sh`.

## Project Structure

---

```
metaforge
├── client # Command line client
├── configure # Default configuration and plugin manifests
├── core
│ ├── metaforge-captcha # Captcha generation
│ ├── metaforge-common # Shared utilities and enums
│ ├── metaforge-condor # Scheduling integration
│ ├── metaforge-server # Spring Boot server (REST API entry point)
│ ├── metaforge-service # Domain services and persistence
│ ├── metaforge-security # Security configuration
│ ├── metaforge-sql # SQL statement builders
│ ├── metaforge-spi # Plugin SPI contracts
│ ├── metaforge-web # Vue 3 + Tailwind web console
├── convert # Data converters (JSON, CSV, XML, ...)
├── driver # Database drivers (Redis, MongoDB, ...)
├── executor # Execution engines
├── fs # File storage plugins (OSS, S3, local, ...)
├── lib # Shared libraries (HTTP client, logging, shell)
├── notify # Notification channels (DingTalk, ...)
├── parser # SQL parsers (MySQL, Trino, ...)
├── plugin # Data source plugins (50+ connectors)
├── scheduler # Job scheduling
└── shaded # Shaded third-party integrations
```

## Supported Connectors

---
Expand Down Expand Up @@ -105,17 +193,11 @@ Here are some of the major database solutions that are supported:
<a href="https://dolphindb.com/"><img src="docs/assets/plugin/dolphindb.svg" alt="DolphinDB" height="60"/></a>
</div>

## System architecture

---

<img src="docs/assets/architecture.jpg" width="100%" />

## Stargazers over time
## Documentation

---

[![Star History Chart](https://star-history.dera.page/svg?repos=devlive-community/metaforge&type=Timeline)](https://star-history.dera.page/#devlive-community/metaforge&Timeline)
[Extended documentation for MetaForge](https://metaforge.devlive.org)

## Join Us

Expand All @@ -131,11 +213,11 @@ Please visit [Issues 950](https://github.com/devlive-community/metaforge/issues/
[![App Store](https://img.shields.io/badge/App%20Store-Rainbond-brightgreen?style=flat-square)](https://www.rainbond.com/)
[![Vue 3](https://img.shields.io/badge/UI-Vue%203%20%2B%20Tailwind-brightgreen?style=flat-square)](https://vuejs.org/)

## Installation and Configuration
## Stargazers over time

---

[Extended documentation for MetaForge](https://metaforge.devlive.org)
[![Star History Chart](https://star-history.dera.page/svg?repos=devlive-community/metaforge&type=Timeline)](https://star-history.dera.page/#devlive-community/metaforge&Timeline)

## Contributors

Expand Down
Loading
Loading