Skip to content

feat: guided setup, 1.8.9 live editing, version-bound projects and undo - #1

Merged
KinjerJS merged 2 commits into
mainfrom
dev
Aug 17, 2026
Merged

feat: guided setup, 1.8.9 live editing, version-bound projects and undo#1
KinjerJS merged 2 commits into
mainfrom
dev

Conversation

@KinjerJS

Copy link
Copy Markdown
Owner

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.

  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.
Copilot AI lite review requested due to automatic review settings August 17, 2026 11:45

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 from targetVersions), 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.
@KinjerJS
KinjerJS merged commit 4bfcee8 into main Aug 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants