Conversation
Adapters and install
- New Forge 1.8.9 adapter covering [1.8.8, 1.9), verified in game: the
mod loads, blocks register and place. It builds on ForgeGradle 2.1
with its own Gradle wrapper, since RetroFuturaGradle covers only
1.7.10 and 1.12.2, and CI builds it under Java 8.
- Adapter coverage is a table of narrow ranges carrying a built or
planned status, so the launcher never offers live editing it cannot
deliver. A range claims only the versions its jar was compiled for.
- Pre-2018 Forge installers have no headless client mode. Which path an
installer needs is read from its own install_profile.json rather than
guessed from a version number, and that generation is unpacked
directly.
- Pressing Stop is no longer reported as a crash: an exit is classified
from whether it was requested, its code and its signal.
Launcher
- Opens on a five-step guide that reads live state instead of ticking
checkboxes, so it cannot claim something is done when it is not. Once
all five pass it folds into a dashboard.
- Animated splash while the launcher starts, empty states, toasts in
place of inline banners, and a reason in the tooltip of every disabled
control.
- Block and item previews rotate with the pointer: the projection takes
yaw and pitch, culls faces by normal, and fits at any angle.
- A project targets a Minecraft version, preselected when it opens.
Launching another one lists what would break in its files and offers
to rewrite them: the 1.9 parent trap and the 1.13 vanilla texture
folders.
- A model declaring both a parent and its own elements renders as its
parent below 1.9 — detected in the editor and fixable in one click.
- Changes announce themselves with an Undo action: deletes, renames,
display names, texture removals, model rewrites. Inverses live in the
main process; deleted files wait in a per-session stash.
- Error banners can be dismissed and clear once they stop applying.
- Ella 0.2.0, shown in the sidebar and checked against package.json.
Docs and housekeeping
- architecture.md, and why 1.7.10 and older cannot be supported: the
JSON model system arrived in 1.8, so there is no file to edit.
- README covers the guided setup, the version binding and undo.
- Stop tracking tsc's incremental cache; it describes one machine's
last build and conflicts on every branch.
304 launcher tests pass.
BREAKING CHANGE: project.json replaces `targetVersions` with
`targetVersion`; manifests carrying the array are migrated on load.
There was a problem hiding this comment.
Pull request overview
This PR expands Ella’s launcher + adapter ecosystem to support guided setup, version-bound projects with compatibility checks/migrations, undoable file operations, and adds a new Forge 1.8.9 adapter/toolchain path; it also bumps the overall version to 0.2.0 and updates docs/tests accordingly.
Changes:
- Add a guided 5-step setup workflow (derived from live facts) plus UI upgrades (home view, empty states, toasts, improved settings/logs/export UX).
- Bind projects to a single
targetVersion(with legacy migration fromtargetVersions), add version-change planning + model migration for known silent breakages. - Introduce undo infrastructure (registry + per-session trash stash), targeted slot writes for settings changes, legacy Forge installer handling, and a Forge 1.8.9 adapter build.
Reviewed changes
Copilot reviewed 93 out of 96 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Updates feature/status overview and adapter coverage notes |
| mod/ella-core/build.gradle | Bumps core version to 0.2.0 |
| mod/adapters/forge-modern/src/main/java/dev/ella/forgemodern/EllaMod.java | Bumps adapter version constant to 0.2.0 |
| mod/adapters/forge-modern/build.gradle | Bumps forge-modern version to 0.2.0 |
| mod/adapters/forge-1.8.9/src/main/resources/pack.mcmeta | Adds pack metadata for 1.8.9 adapter |
| mod/adapters/forge-1.8.9/src/main/resources/mcmod.info | Adds 1.8.9 adapter mod metadata template |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/Sounds.java | Adds 1.8.9 sound mapping helper |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/Registration.java | Registers slot pool blocks/items + models for 1.8.9 |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/ForgeHost.java | Implements EllaHost for 1.8.9 with scheduling + actions |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/EllaResources.java | Injects workspace resource pack via reflection on 1.8.9 |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/EllaMod.java | Adds 1.8.9 mod entrypoint + accepted MC range + startup |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/EllaLogBridge.java | Bridges EllaLog to Forge Log4j |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/EllaItemBlock.java | Hides unbound placeholder blocks from creative tab |
| mod/adapters/forge-1.8.9/src/main/java/dev/ella/forge189/EllaItem.java | Placeholder item reading live SlotSettings on 1.8.9 |
| mod/adapters/forge-1.8.9/gradlew.bat | Adds per-adapter Gradle wrapper script (Windows) |
| mod/adapters/forge-1.8.9/gradle/wrapper/gradle-wrapper.properties | Adds Gradle 2.14.1 wrapper config for 1.8.9 build |
| mod/adapters/forge-1.8.9/gradle.properties | Sets JVM heap + Java 8 guidance for FG2.1 builds |
| mod/adapters/forge-1.8.9/build.gradle | Adds ForgeGradle 2.1 build for 1.8.9 adapter |
| mod/adapters/forge-1.12.2/src/main/java/dev/ella/forge112/EllaMod.java | Adds accepted MC range + bumps version to 0.2.0 |
| mod/adapters/forge-1.12.2/build.gradle | Bumps forge-1.12.2 version to 0.2.0 |
| launcher/test/workflow.test.ts | Tests for guided setup workflow logic + i18n coverage |
| launcher/test/version.test.ts | Updates adapter routing tests for new 1.8.9 bucket |
| launcher/test/textures.test.ts | Updates texture listing expectations (particle slot) |
| launcher/test/session-exit.test.ts | Adds tests for exit classification (Stop vs crash) |
| launcher/test/pack-project.test.ts | Tests targeted slot writes + project version migration |
| launcher/test/model-preview.test.ts | Adds extensive turntable/visibility/fit projection tests |
| launcher/test/model-compat.test.ts | Adds tests for 1.8 parent-trap detection + fix |
| launcher/test/forge-install.test.ts | Tests legacy Forge installer profile detection |
| launcher/test/app.test.ts | Ensures APP_VERSION matches package.json version |
| launcher/test/adapter-ranges.test.ts | Ensures adapter range declarations match launcher ADAPTERS |
| launcher/src/shared/workflow.ts | Implements guided setup step derivation from facts |
| launcher/src/shared/version.ts | Updates ADAPTERS with built 1.8.8–<1.9 coverage |
| launcher/src/shared/version-compat.ts | Adds model/texture compat inspection + migration logic |
| launcher/src/shared/project.ts | Replaces targetVersions with targetVersion + legacy defaults |
| launcher/src/shared/model-compat.ts | Detects/removes 1.8 parent-overrides-elements trap |
| launcher/src/shared/ipc.ts | Extends IPC with version-change planning/apply + undo + resolve |
| launcher/src/shared/app.ts | Centralizes APP_NAME/APP_VERSION for main/renderer |
| launcher/src/renderer/src/views/SettingsView.tsx | Redesigns settings UI + Blockbench resolution feedback + toasts |
| launcher/src/renderer/src/views/LogsView.tsx | Improves logs header/status display |
| launcher/src/renderer/src/views/ExportView.tsx | Adds empty state + toasts + improved export UI |
| launcher/src/renderer/src/versions.ts | Adds hook for installed versions list (renderer utility) |
| launcher/src/renderer/src/session.ts | Adds version-change gating flow to launches |
| launcher/src/renderer/src/navigation.ts | Centralizes navigation config + adds home view |
| launcher/src/renderer/src/main.tsx | Wraps app in ToastProvider |
| launcher/src/renderer/src/facts.ts | Collects workflow facts + preferredVersion logic |
| launcher/src/renderer/src/components/VersionChangeDialog.tsx | Adds confirmation dialog for version-bound projects |
| launcher/src/renderer/src/components/Toast.tsx | Adds toast system incl. undoable toasts |
| launcher/src/renderer/src/components/TexturePanel.tsx | Clears stale errors on new actions; signature change for onError |
| launcher/src/renderer/src/components/StatusBar.tsx | Enhances status bar with icons/progress label |
| launcher/src/renderer/src/components/SettingsForm.tsx | Adds draft + debounced saves + non-overlapping writes |
| launcher/src/renderer/src/components/QuickNewEntry.tsx | Refactors quick-create to include kind toggle inside composer |
| launcher/src/renderer/src/components/QuickLaunch.tsx | Launches via requestLaunch + warns when deviating from targetVersion |
| launcher/src/renderer/src/components/ModelPreview.tsx | Adds interactive turntable preview + keyboard controls |
| launcher/src/renderer/src/components/Icon.tsx | Adds new icons + tweaks editor icon rendering |
| launcher/src/renderer/src/components/ErrorBanner.tsx | Adds dismissible, state-clearing inline error banner |
| launcher/src/renderer/src/components/EntryHeader.tsx | Adds interactive preview + clears errors on edits |
| launcher/src/renderer/src/components/EmptyState.tsx | Adds reusable empty-state component |
| launcher/src/renderer/src/App.tsx | Adds home view, workflow facts, undo subscription, version-change dialog |
| launcher/src/preload/index.ts | Wires new IPC channels (version change, undo, resolve, remove parent) |
| launcher/src/main/version-change.ts | Adds plan/apply version change with model migration IO |
| launcher/src/main/undo.ts | Adds UndoRegistry for one-shot inverses |
| launcher/src/main/trash.ts | Adds per-session trash stash for undoable deletes |
| launcher/src/main/textures.ts | Adds restoreTexture support + richer removeTexture result |
| launcher/src/main/splash.ts | Adds animated splash window shown during launcher startup |
| launcher/src/main/session.ts | Adds exit classification + targeted slot pack writes + ignore generated outputs |
| launcher/src/main/project.ts | Implements targetVersion migration, undoable entry deletion/restore, removeModelParent |
| launcher/src/main/pack.ts | Makes default block model self-contained; adds targeted slot writer |
| launcher/src/main/minecraft/launch.ts | Uses APP_* constants; adds missing-classpath preflight error |
| launcher/src/main/minecraft/install.ts | Extracts reusable libraryDownloadTasks for legacy Forge installs |
| launcher/src/main/minecraft/forge.ts | Adds legacy installer unpack path based on install_profile.json |
| launcher/src/main/diagnostics.ts | Uses APP_VERSION in crash diagnostics |
| launcher/src/main/blockbench.ts | Adds ignore predicate option to watchDirectory |
| launcher/package.json | Bumps launcher version to 0.2.0 |
| launcher/package-lock.json | Updates lockfile version fields to 0.2.0 |
| docs/protocol.md | Updates protocol example adapterVersion |
| docs/project-format.md | Documents targetVersion + legacy migration behavior |
| docs/building.md | Updates build instructions/toolchains for new 1.8.9 adapter |
| docs/architecture.md | Documents new compat traps, legacy Forge installers, workflow, slot write paths |
| .gitignore | Ignores *.tsbuildinfo; broadens wrapper jar exception for nested adapter wrapper |
| .github/workflows/build.yml | Adds CI build step for forge-1.8.9 with Java 8 + its wrapper |
Files not reviewed (1)
- launcher/package-lock.json: Generated file
Suppressed comments (1)
launcher/src/renderer/src/components/SettingsForm.tsx:118
- The cleanup calls flush() during unmount/entry switch. If flush() updates React state (setSaving), this can cause “setState on unmounted component” warnings. After making flush() support a silent mode, call flush(false) from cleanup.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+78
to
+95
| const flush = async (): Promise<void> => { | ||
| // One writer at a time. Anything that arrives mid-write is picked up by the loop | ||
| // below rather than racing the request already in flight. | ||
| if (flushing.current) return; | ||
|
|
||
| flushing.current = true; | ||
| setSaving(true); | ||
| try { | ||
| while (pending.current) { | ||
| const { entryId: target, patch } = pending.current; | ||
| pending.current = null; | ||
| await onChangeRef.current(target, patch); | ||
| } | ||
| } finally { | ||
| flushing.current = false; | ||
| setSaving(false); | ||
| } | ||
| }; |
Comment on lines
+70
to
+87
| for (const relative of await listStashed(directory)) { | ||
| const from = path.join(directory, ...relative.split('/')); | ||
| const to = path.join(root, ...relative.split('/')); | ||
|
|
||
| // `rename` replaces an existing destination silently, so it is checked first. | ||
| if (await stat(to).then(() => true, () => false)) continue; | ||
|
|
||
| await mkdir(path.dirname(to), { recursive: true }); | ||
| try { | ||
| await rename(from, to); | ||
| restored.push(relative); | ||
| } catch { | ||
| // Left in the stash; the purge on the next project open clears it. | ||
| } | ||
| } | ||
|
|
||
| await rm(directory, { recursive: true, force: true }); | ||
| return restored; |
Committed as 100644, so the runner refused it with "Permission denied" before Gradle ever started. core.filemode is false on Windows, where the file was added, so the bit has to be set in the index by hand. Only this adapter is affected: the other two run the system `gradle`, and it is the only build carrying its own wrapper.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adapters and install
Launcher
Docs and housekeeping
304 launcher tests pass.
BREAKING CHANGE: project.json replaces
targetVersionswithtargetVersion; manifests carrying the array are migrated on load.