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
c883bb1
Add quadrant-cli crate over QuadrantHost
mrquantumoff Sep 29, 2026
6fe9df3
Add settings commands to quadrant-cli
mrquantumoff Sep 29, 2026
cf4c940
Add modpack commands to quadrant-cli
mrquantumoff Sep 29, 2026
458f31a
Show installed file names in modpack show and updates
mrquantumoff Sep 29, 2026
81d5d1d
Add mod commands to quadrant-cli
mrquantumoff Sep 29, 2026
c0f3f8a
Leave the loader out of pack install messages
mrquantumoff Sep 29, 2026
1fe8b15
Add content and prism commands to quadrant-cli
mrquantumoff Sep 29, 2026
403c6e1
Add --keyring-service to quadrant-cli
mrquantumoff Sep 29, 2026
e786364
Add account commands and loopback sign-in to quadrant-cli
mrquantumoff Sep 29, 2026
b9bf88d
Add open command for deep links to quadrant-cli
mrquantumoff Sep 29, 2026
b6ed6bb
Add notifications commands to quadrant-cli
mrquantumoff Sep 29, 2026
527f67d
Add sync commands to quadrant-cli
mrquantumoff Sep 29, 2026
a2312f7
Create the export folder and count mods in the singular
mrquantumoff Sep 29, 2026
06a191b
Group global options in quadrant-cli help and order commands by task
mrquantumoff Sep 29, 2026
c8e5728
Document quadrant-cli
mrquantumoff Sep 29, 2026
2b63d8f
Scale modpack progress fractions to percent in quadrant-cli
mrquantumoff Sep 29, 2026
b4dc37d
Print each completed progress line once when stderr is not a terminal
mrquantumoff Sep 29, 2026
08b465b
Keep the sign-in loopback waiting past idle connections and foreign r…
mrquantumoff Sep 29, 2026
c36e859
Install into the target modpack's version and loader before saved cho…
mrquantumoff Sep 29, 2026
4da0704
Report mods modpack updates couldn't check and fail the command on them
mrquantumoff Sep 29, 2026
b44fad4
Keep installing dependencies after one fails with mod install --with-…
mrquantumoff Sep 29, 2026
135cf65
Spell out what notifications watch changes and end its JSON stream cl…
mrquantumoff Sep 29, 2026
90b4e73
Ask before an import or sync pull replaces a local modpack
mrquantumoff Sep 29, 2026
43cbd74
Ask before modpack export overwrites an existing file
mrquantumoff Sep 29, 2026
69b97ac
Require an existing folder for folder settings and the API key before…
mrquantumoff Sep 29, 2026
a81709c
Shell-quote the register commands modpack identify prints
mrquantumoff Sep 29, 2026
49c9eb4
Rename the CLI binary to quadrantmc
mrquantumoff Sep 29, 2026
69cf427
Add NSIS hooks that put the install folder on the user PATH
mrquantumoff Sep 29, 2026
188ba09
Bundle quadrantmc as a Tauri sidecar in packaging builds
mrquantumoff Sep 29, 2026
ab89b51
Install quadrantmc from the AUR package
mrquantumoff Sep 29, 2026
a30742e
Register quadrantmc in the Microsoft Store package
mrquantumoff Sep 29, 2026
7a78dec
Document how each package installs quadrantmc
mrquantumoff Sep 29, 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 .github/aur/PKGBUILD.template
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ prepare() {

package() {
install -Dm755 "${srcdir}/usr/bin/${pkgname%-bin}_next" "${pkgdir}/usr/bin/${pkgname%-bin}"
install -Dm755 "${srcdir}/usr/bin/quadrantmc" "${pkgdir}/usr/bin/quadrantmc"
cp -a "${srcdir}/usr/lib" "${pkgdir}/usr"
find "${srcdir}" -type f \( -name "*.png" -o -name "*.svg" \) -path "*share/icons/*" | while read -r _i; do
_extension="${_i##*.}"
Expand Down
38 changes: 26 additions & 12 deletions .github/workflows/msstore.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ jobs:
QUADRANT_OAUTH2_CLIENT_SECRET: ${{ secrets.QUADRANT_OAUTH2_CLIENT_SECRET }}
run: |
rustup target add ${{ matrix.triple }}
bun tauri build --config src-tauri/tauri.msstore.conf.json --target ${{ matrix.triple }}
bun tauri build --config src-tauri/tauri.cli.conf.json --config src-tauri/tauri.msstore.conf.json --target ${{ matrix.triple }}

- name: Upload built executable
uses: actions/upload-artifact@v4
Expand All @@ -78,6 +78,14 @@ jobs:
path: src-tauri/target/${{ matrix.triple }}/release/quadrant_next.exe
if-no-files-found: error

# The quadrantmc sidecar scripts/build-cli.ts built during the Tauri build.
- name: Upload built CLI
uses: actions/upload-artifact@v4
with:
name: cli-${{ matrix.arch }}
path: src-tauri/binaries/quadrantmc-${{ matrix.triple }}.exe
if-no-files-found: error

# Fan-in: assemble the MSIX bundle from both arch executables and submit it.
bundle-and-publish:
needs: build
Expand All @@ -102,21 +110,27 @@ jobs:
pattern: exe-*
path: artifacts

- name: Download built CLIs
uses: actions/download-artifact@v4
with:
pattern: cli-*
path: artifacts

- name: Stage executables for bundling
shell: pwsh
run: |
$map = @{
"exe-x64" = "src-tauri/target/x86_64-pc-windows-msvc/release"
"exe-arm64" = "src-tauri/target/aarch64-pc-windows-msvc/release"
}
foreach ($name in $map.Keys) {
$src = Join-Path "artifacts/$name" "quadrant_next.exe"
if (-not (Test-Path -Path $src -PathType Leaf)) {
throw "Missing artifact executable: $src"
$files = @(
@{ Src = "artifacts/exe-x64/quadrant_next.exe"; Dest = "src-tauri/target/x86_64-pc-windows-msvc/release/quadrant_next.exe" },
@{ Src = "artifacts/exe-arm64/quadrant_next.exe"; Dest = "src-tauri/target/aarch64-pc-windows-msvc/release/quadrant_next.exe" },
@{ Src = "artifacts/cli-x64/quadrantmc-x86_64-pc-windows-msvc.exe"; Dest = "src-tauri/binaries/quadrantmc-x86_64-pc-windows-msvc.exe" },
@{ Src = "artifacts/cli-arm64/quadrantmc-aarch64-pc-windows-msvc.exe"; Dest = "src-tauri/binaries/quadrantmc-aarch64-pc-windows-msvc.exe" }
)
foreach ($file in $files) {
if (-not (Test-Path -Path $file.Src -PathType Leaf)) {
throw "Missing artifact executable: $($file.Src)"
}
$destDir = $map[$name]
New-Item -ItemType Directory -Path $destDir -Force | Out-Null
Copy-Item -Path $src -Destination (Join-Path $destDir "quadrant_next.exe") -Force
New-Item -ItemType Directory -Path (Split-Path -Parent $file.Dest) -Force | Out-Null
Copy-Item -Path $file.Src -Destination $file.Dest -Force
}

- name: Build MSIX bundle
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ jobs:
releaseBody: "See the assets to download this version and install. Check out the [changelog on my blog](https://blog.mrquantumoff.dev)"
releaseDraft: false
prerelease: ${{ !endsWith(github.ref_name, 'stable') }}
args: ${{ matrix.args }}
# tauri.cli.conf.json builds quadrantmc and bundles it as a sidecar.
args: --config src-tauri/tauri.cli.conf.json ${{ matrix.args }}
tauriScript: "bun tauri"
tagName: ${{github.ref_name}}

Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/validate-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ jobs:
native:
- 'src-tauri/**'
- 'package.json'
- 'scripts/build-cli.ts'
- 'bun.lock'
- 'vite.config.ts'
- 'tsconfig*.json'
Expand Down Expand Up @@ -193,9 +194,11 @@ jobs:
save-if: ${{ github.ref == 'refs/heads/next' }}

# No separate renderer build: `tauri build` runs `beforeBuildCommand`
# (`bun run build`) itself, so building it here first ran tsc + vite twice.
# itself, so building it here first ran tsc + vite twice. The merged
# config's `beforeBuildCommand` also builds the quadrantmc sidecar, which
# the release packages bundle.
- name: Build Tauri shell
run: bun tauri build --no-bundle
run: bun tauri build --no-bundle --config src-tauri/tauri.cli.conf.json

validate-macos:
needs: changes
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,6 @@ ds-bundle/
.design-sync/quadrant-compiled.css
.design-sync/Inter-Font.ttf
.claude/

# quadrantmc sidecar, built by scripts/build-cli.ts
src-tauri/binaries/
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
| Renderer-only dev (Vite, browser) | `bun run dev` |
| Tauri dev (full desktop app) | `bun run dev:tauri` |
| Build shared renderer | `bun run build` (runs `tsc && vite build`) |
| Build Tauri app | `bun run build:tauri` |
| Build Tauri app | `bun run build:tauri` (merges `src-tauri/tauri.cli.conf.json`, which builds the `quadrantmc` CLI via `scripts/build-cli.ts` and bundles it as a sidecar; plain `bun tauri build` leaves it out) |
| Lint | `bun run lint` (ESLint flat config, `eslint.config.js`) |
| Tauri dev without proprietary features | `bun tauri dev -- -- --no-default-features` |
| Ad-hoc macOS DMG (no Apple cert) | `bun run tauri:macos:adhoc:build` |
Expand Down
29 changes: 28 additions & 1 deletion AppxManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
xmlns:desktop5="http://schemas.microsoft.com/appx/manifest/desktop/windows10/5"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"
xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap uap3 uap10 desktop rescap"
IgnorableNamespaces="uap uap3 uap5 uap10 desktop desktop4 rescap"
>
<Identity
Name="58734MrQuantumOFFDemirYer.MinecraftModpackManagerR"
Expand Down Expand Up @@ -88,6 +89,32 @@
</desktop:Extension>
</Extensions>
</Application>
<Application
Id="quadrantmc"
Executable="quadrantmc.exe"
EntryPoint="Windows.FullTrustApplication"
desktop4:SupportsMultipleInstances="true"
>
<uap:VisualElements
BackgroundColor="transparent"
DisplayName="quadrantmc"
Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png"
Description="Manage your modpacks and mods from a terminal."
AppListEntry="none"
/>
<Extensions>
<uap5:Extension
Category="windows.appExecutionAlias"
Executable="quadrantmc.exe"
EntryPoint="Windows.FullTrustApplication"
>
<uap5:AppExecutionAlias desktop4:Subsystem="console">
<uap5:ExecutionAlias Alias="quadrantmc.exe" />
</uap5:AppExecutionAlias>
</uap5:Extension>
</Extensions>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
Expand Down
1 change: 1 addition & 0 deletions AppxMappings.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[Files]
"src-tauri\target\release\quadrant_next.exe" "quadrant_next.exe"
"src-tauri\binaries\quadrantmc-x86_64-pc-windows-msvc.exe" "quadrantmc.exe"
"src-tauri\icons\Square150x150Logo.png" "Images\Square150x150Logo.png"
"src-tauri\icons\Square44x44Logo.png" "Images\Square44x44Logo.png"
"src-tauri\icons\StoreLogo.png" "Images\StoreLogo.png"
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@

- Collaborating on modpacks with your friends

- All of the above from a terminal with `quadrantmc`, see [docs/cli.md](docs/cli.md)

> [!WARNING]
>
> #### If app fails to apply your modpacks after installation, delete your mods folder.
Expand Down
Loading
Loading