Skip to content
Draft
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
2222320
0.1.5 Initial Commit
FooterManDev May 25, 2026
979dc6c
0.1.6 Initial Commit
FooterManDev May 25, 2026
d41eced
Merge remote-tracking branch 'origin/0.1.6-dev' into 0.1.6-dev
FooterManDev May 25, 2026
4fc00a9
Bump version
FooterManDev May 25, 2026
9535e14
Revert to older file versions to fix pesky bugs
FooterManDev May 25, 2026
d93c53e
Add tree-sitter-javascript as a git submodule
FooterManDev May 25, 2026
7589d82
Prevent running releases on branches other than main, and fix tree-si…
FooterManDev May 25, 2026
cb29ff7
Fix failing Windows build, exclude tree-sitter grammar if unavailable
FooterManDev May 25, 2026
90195da
Fix Java 21 only feature, and maybe fix Windows again
FooterManDev May 25, 2026
4fb172c
Windows fix attempt number 3
FooterManDev May 25, 2026
e950caf
Windows fix attempt number 4
FooterManDev May 25, 2026
b156fa2
Revert Qt from 6.11 to 6.9.3 because aqtinstall currently fails on th…
FooterManDev May 25, 2026
89958bc
Added Mod Database, Installed Mods Dock Panel, WIP Import Dialog. Som…
FooterManDev May 28, 2026
e9cfb98
Fixed some Gradle issues; added the maintained version of Shadow; add…
FooterManDev Jun 2, 2026
adb7ab5
Implemented CurseForge, improved Description handling, made some butt…
FooterManDev Jun 8, 2026
4a8d55a
Fix pages checks
FooterManDev Jun 8, 2026
c0de3ab
Improve AccountsPanel and ImportProjectDialog, add CurseForge and Mod…
FooterManDev Jun 14, 2026
bc4c8ab
Some better file handling
FooterManDev Jun 14, 2026
dbe70eb
Add Curse pack importing, uprooted some project generation code, add …
FooterManDev Jun 15, 2026
a834bbd
Small changes
FooterManDev Jun 15, 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
33 changes: 17 additions & 16 deletions .github/workflows/release-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set Up Java
uses: actions/setup-java@v4
Expand Down Expand Up @@ -188,26 +190,25 @@ jobs:
python -m pip install --upgrade aqtinstall

$qtHost = "windows"
$archOutput = python -m aqt list-qt $qtHost desktop --arch $env:QT_VERSION
$archs = $archOutput -split '\s+' | Where-Object { $_ -ne '' }
$archOutput = & python -m aqt list-qt $qtHost desktop --arch $env:QT_VERSION 2>&1
if ($LASTEXITCODE -ne 0) { throw "list-qt --arch failed" }
$archs = ($archOutput -join " ") -split '\s+' | Where-Object { $_ -ne '' }

$qtArch = $archs | Where-Object { $_ -match 'msvc' -and $_ -match '64' } | Select-Object -First 1
if (-not $qtArch) {
$qtArch = $archs | Where-Object { $_ -match '64' } | Select-Object -First 1
}
if (-not $qtArch) { $qtArch = $archs | Where-Object { $_ -match '64' } | Select-Object -First 1 }
if (-not $qtArch) { throw "Unable to resolve Qt architecture. Available: $($archs -join ', ')" }
$qtPlatform = "windows-x64"

if (-not $qtArch) {
throw "Unable to resolve Qt architecture for windows/x64. Available: $($archs -join ', ')"
}

$modulesOutput = python -m aqt list-qt $qtHost desktop --modules $env:QT_VERSION $qtArch
$modulesOutput = & python -m aqt list-qt $qtHost desktop --modules $env:QT_VERSION $qtArch 2>&1
if ($LASTEXITCODE -ne 0) { throw "list-qt --modules failed" }
if ($modulesOutput -match '\bqtsvg\b') {
Write-Host "Installing Qt with optional module qtsvg"
python -m aqt install-qt $qtHost desktop $env:QT_VERSION $qtArch -m qtsvg -O "$PWD\\.qt"
& python -m aqt install-qt $qtHost desktop $env:QT_VERSION $qtArch -m qtsvg -O "$PWD\\.qt"
if ($LASTEXITCODE -ne 0) { throw "install-qt (with qtsvg) failed" }
} else {
Write-Host "qtsvg module not available for $qtHost/$qtArch on Qt $env:QT_VERSION; installing base Qt only"
python -m aqt install-qt $qtHost desktop $env:QT_VERSION $qtArch -O "$PWD\\.qt"
Write-Host "qtsvg module not available; installing base Qt only"
& python -m aqt install-qt $qtHost desktop $env:QT_VERSION $qtArch -O "$PWD\\.qt"
if ($LASTEXITCODE -ne 0) { throw "install-qt failed" }
}

$qtRoot = "$PWD\\.qt\\$env:QT_VERSION"
Expand Down Expand Up @@ -495,7 +496,7 @@ jobs:
permissions:
contents: write
needs: build
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch')
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || (github.ref == 'refs/heads/main' && github.event_name == 'workflow_dispatch'))
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -560,7 +561,7 @@ jobs:
needs: release
permissions:
contents: read
if: needs.release.result == 'success' && github.event_name != 'pull_request' && !(github.event_name == 'workflow_dispatch' && github.event.inputs.prerelease == 'true')
if: needs.release.result == 'success' && github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') && !(github.event_name == 'workflow_dispatch' && github.event.inputs.prerelease == 'true')
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -668,7 +669,7 @@ jobs:
needs: release
permissions:
contents: read
if: needs.release.result == 'success' && github.event_name != 'pull_request' && !(github.event_name == 'workflow_dispatch' && github.event.inputs.prerelease == 'true')
if: needs.release.result == 'success' && github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') && !(github.event_name == 'workflow_dispatch' && github.event.inputs.prerelease == 'true')
steps:
- name: Download wingetcreate
shell: pwsh
Expand Down
15 changes: 10 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ build/
!**/src/test/**/build/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
.idea/
*.iws
*.iml
*.ipr
Expand Down Expand Up @@ -47,4 +44,12 @@ bin/
local.properties

src/main/resources/icons
AppDir
AppDir
tools/registry-builder/target/
CMakeCache.txt
CMakeFiles/
Makefile
cmake_install.cmake
/CompanionMod/
hs_err_pid*.log
/.architectury-transformer/
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "tree-sitter-javascript"]
path = tree-sitter-javascript
url = https://github.com/tree-sitter/tree-sitter-javascript.git
45 changes: 45 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
## 0.1.6

---
### New
* Added an Animated Scrolling effect (**Experimental**, disabled by default).
* Added a Keymap system.
* Added a Rust utility which generates the Item database used by the Item Browser, and sets up KubeJS Typings.
* Added Code Completion (JS only for now).
* Added a Mod Config Editor Pane, which supports editing the following config types:
* TOML
* JSON, JSONC, JSON5
* Properties
* Yaml
* Forge CFG
* Added a Mod Browser Pane, currently supporting Modrinth. Curseforge implementation is on its way.
* Added an Item Browser dock panel.
* Added a ModPack detail dock panel.
* Added a context menu for Project Files.
* Added Project Files View Modes.
* Added custom Tooltip backgrounds (**Experimental**, disabled by default).
* KubeJS Extension. Provides Code Completion with dumped Typings, using FlatBuffers, with a Database as backup.
* Added Seasonal Events.
* Added ability to set a background image for the Project view.
* Added Auto-save.
* Added Rainbow Brackets (**Experimental**, disabled by default).
* Added Extensions panel to Dashboard.

### Gradle
* Added Tree-Sitter.
* Added extra Serialization libs for Mod Config parsing.
* Added some args to improve performance.

### Companion Mod
* Improved WebSocket connections.
* Added KubeJS Typings support.
* Added an Item renderer which then dumps for use in Tritium's Item Browser.

### Other
* General cleanup.
* Settings View opens faster.
* Listeners use Kotlin flows instead of array lists.
* Added better logging handling for Qt runtime warnings.
* Hopefully probably maybe possibly potentially fixed Icons DPR and scaling issues.
* Fixed window state geometry getting corrupted to oblivion due to band affiliation.
* LSPs work now, with support for JSON, XML and Python (needs some work on the installation / providing part).
122 changes: 116 additions & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,24 @@ plugins {
alias(libs.plugins.kotlin)
alias(libs.plugins.serialization)
alias(libs.plugins.ksp)
alias(libs.plugins.ktreesitter)
idea
id("com.github.johnrengelman.shadow") version "8.1.1"
id("com.gradleup.shadow") version "9.2.0"
}

ksp { arg("verbose", "true") }

val grammarDir = layout.projectDirectory.dir("tree-sitter-javascript").asFile

grammar {
grammarName.set("javascript")
baseDir.set(grammarDir)
className.set("TreeSitterJavascript")
packageName.set("io.github.tritium_launcher.launcher.ui.project.editor.treesitter.grammar")
}

group = "io.github.tritium_launcher.launcher"
version = "0.1.5"
version = "0.1.6"
val tritiumVersion = project.version.toString()

val os: OperatingSystem = OperatingSystem.current()
Expand All @@ -27,6 +37,8 @@ val qtOs = when {
else -> "unknown"
}

dependencyLocking { lockAllConfigurations() }

repositories {
mavenCentral()
}
Expand All @@ -45,9 +57,17 @@ configurations.configureEach {
}

dependencies {
// Kotlin
// Serialization
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.serialization.hocon)
implementation(libs.kotlinx.serialization.properties)
implementation(libs.kotlin.json5)
implementation(libs.ktoml.core)
implementation(libs.ktoml.file)
implementation(libs.yamlkt)
implementation(libs.knbt)

// Coroutines
implementation(libs.kotlinx.coroutines.core)

// KSP
Expand Down Expand Up @@ -82,10 +102,10 @@ dependencies {

// MSAL4j
implementation(libs.msal4j)
implementation(libs.jultoslf4j)

// Logback
implementation(libs.logback.classic)
implementation(libs.kotlin.reflect)

// LSP
implementation(libs.lsp4j)
Expand All @@ -94,11 +114,79 @@ dependencies {
implementation(libs.jna)
implementation(libs.jna.platform)

// CommonMark
implementation(libs.commonmark)
implementation(libs.commonmark.ext.gfm.tables)
implementation(libs.commonmark.ext.image.attributes)
implementation(libs.sqlite.jdbc)
implementation(libs.flatbuffers)

// Kotlin
implementation(libs.kotlin.reflect)

// KTreeSitter
implementation(libs.ktreesitter)

/* Test */

testImplementation(libs.bundles.test)
}

val nativeLibDir = layout.buildDirectory.dir("native/grammar")
val generatedGrammarDir = layout.buildDirectory.dir("generated")
val grammarCmakeLists = generatedGrammarDir.map { it.file("CMakeLists.txt") }
val grammarSourceDir = layout.projectDirectory.dir("tree-sitter-javascript/src")
val nativeGrammarLibName: String = when {
os.isWindows -> "ktreesitter-javascript.dll"
os.isMacOsX -> "libktreesitter-javascript.dylib"
else -> "libktreesitter-javascript.so"
}

val patchCmakeLists by tasks.registering {
description = "Fix CMakeLists.txt include path for tree-sitter header"
dependsOn(tasks.named("generateGrammarFiles"))
inputs.file(grammarCmakeLists)
outputs.file(grammarCmakeLists)
doLast {
val cmakeFile = grammarCmakeLists.get().asFile
val content = cmakeFile.readText().replace('\\', '/')
val fixed = content.replace(
"../../tree-sitter-javascript/bindings/c",
"../../tree-sitter-javascript/bindings/c ../../tree-sitter-javascript/bindings/c/tree_sitter"
)
if (fixed != content) {
cmakeFile.writeText(fixed)
}
}
}

val compileGrammarNative by tasks.registering {
description = "Compile tree-sitter JavaScript grammar via CMake"
dependsOn(tasks.named("generateGrammarFiles"), patchCmakeLists)
val cmakeBuildDir = nativeLibDir.get().asFile
val srcDir = generatedGrammarDir.get().asFile
inputs.dir(grammarSourceDir).optional()
inputs.dir(srcDir.resolve("src/jni"))
inputs.file(srcDir.resolve("CMakeLists.txt"))
outputs.file(cmakeBuildDir.resolve(nativeGrammarLibName))
onlyIf {
grammarSourceDir.asFile.exists()
}
doLast {
cmakeBuildDir.mkdirs()
ProcessBuilder("cmake", srcDir.path, "-DCMAKE_BUILD_TYPE=Release")
.directory(cmakeBuildDir)
.inheritIO()
.start()
.waitFor()
ProcessBuilder("cmake", "--build", ".", "--target", "ktreesitter-javascript", "--parallel")
.directory(cmakeBuildDir)
.inheritIO()
.start()
.waitFor()
}
}

sourceSets["main"].java.srcDirs("src/main/kotlin")

idea {
Expand All @@ -113,10 +201,22 @@ tasks.test {
}

tasks.processResources {
dependsOn(compileGrammarNative)

val nativeSubdir = when {
os.isWindows -> if (isArm64) "windows/arm64" else "windows/x64"
os.isMacOsX -> if (isArm64) "macos/arm64" else "macos/x64"
else -> if (isArm64) "linux/arm64" else "linux/x64"
}

inputs.property("version", tritiumVersion)
filesMatching("version.txt") {
expand("version" to tritiumVersion)
}

from(nativeLibDir.map { it.file(nativeGrammarLibName) }) {
into("lib/$nativeSubdir")
}
}

tasks.jar {
Expand Down Expand Up @@ -154,7 +254,17 @@ val preparePackageInput by tasks.registering(Sync::class) {
val compileKotlin: KotlinCompile by tasks
compileKotlin.apply {
compilerOptions {
freeCompilerArgs.set(listOf("-Xcontext-parameters"))
allWarningsAsErrors = true
incremental = true
freeCompilerArgs.set(listOf("-Xcontext-parameters", "-progressive"))
}
}

val compileJava: JavaCompile by tasks
compileJava.apply {
options.isIncremental = true
}

tasks.clean {
delete(nativeLibDir)
delete(generatedGrammarDir)
}
21 changes: 15 additions & 6 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
kotlin.code.style=official
kotlin.incremental=true
org.gradle.jvmargs=-Xmx4g -Xms512m \
-XX:+UseG1GC \
-XX:SoftRefLRUPolicyMSPerMB=50 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:+OptimizeStringConcat \
-XX:ReservedCodeCacheSize=512m \
-Dfile.encoding=UTF-8


org.gradle.parallel=true
org.gradle.caching=true
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m
org.gradle.parallel=true
org.gradle.workers.max=6
org.gradle.vfs.watch=true

kotlin.code.style=official
kotlin.incremental=true
kotlin.daemon.jvm.options=-Xmx2g -Xms256m
kotlin.build.report.output=file
ksp.incremental=false
Loading
Loading