Upgrade to latest, setup AI tooling - #2
Open
haynesjm42 wants to merge 28 commits into
Open
Conversation
Migrate AG Grid from scoped @ag-grid-community/* packages (v31) to the unified ag-grid-community/ag-grid-react packages (v34), per hop v76.0.0 breaking change notes. Updated Bootstrap.ts imports accordingly; cast AgGridReact to satisfy Hoist's installAgGrid typing against the new package's stricter class typing.
- tsconfig moduleResolution: Node -> bundler (required by v79.0.0) - Move TabContainer switcher toggle from TabContainerModel config (now repurposed for static/dynamic mode) to TabContainer component prop - Remove AppSpec.webSocketsEnabled (removed as planned; enabled by default)
Pin jquery to 3.x via resolutions per v80.0.0 note (golden-layout's loose jquery peer range would otherwise resolve to breaking 4.x).
- AuthModel.completeAuthAsync: Promise<boolean> -> Promise<IdentityInfo> per v81 breaking change (HoistAuthModel signature change) - Bump hoistCoreVersion 31.0.1 -> 36.3.0, satisfying v81's required hoist-core >= 36.1. Using the lowest version available on the new Maven Central home for hoist-core (see repo.xh.io note below). - Remove dead 'repo.xh.io' Maven repo from build.gradle - that host is decommissioned; hoist-core >= 36.3 now publishes to Maven Central, already covered by the existing mavenCentral() repository. Note: hoist-core has advanced well past 36.3 (latest is 40.1.0 on Maven Central) with its own intervening breaking changes. This upgrade only bumps to the minimum hoist-react v81 requires; a dedicated hoist-core upgrade reviewing grails-app/services and grails-app/controllers is a separate follow-up (see upgrade report).
No app-level migrations needed - no usages of the affected FetchService correlation ID instance properties, xh-popup--framed, xh-dash-tab selectors, or deprecated filter utilities. hoist-core already >= 36.3. This hop enables the hoist-react MCP server (requires @xh/hoist >= v82).
Bump hoistCoreVersion 36.3.0 -> 37.0.2 (required by v83 for TraceService and metrics publishing infra). No app-level code migrations needed - no downloadjs imports, deprecated static properties, or filter utilities in use.
Bump hoistCoreVersion 37.0.2 -> 38.0.0 (required, paired major release). No app-level code changes needed - no getClassName imports, no @fortawesome/free-brands-svg-icons dependency.
- AppModel.initAsync() now accepts and forwards InitContext per v85's tracing rework; propagate ctx.span into the init-time loadAsync() call for nested OTEL spans (recommended step). - No installServicesAsync call sites, no custom HoistService.initAsync overrides, no Swiper usage, no residual usages of the long-deprecated APIs removed in this release. - hoist-core >= 39.0 is only recommended here (span sampling); leaving at 38.0.0 for now.
- Bump ag-grid-community/ag-grid-react 34.3.1 -> 35.3.1 (required)
- Bump @xh/hoist-dev-utils 11.x -> 13.x (strongly recommended; fixes a
DashCanvas drag/resize crash and refreshes build tooling)
- Remove jquery resolution pin - golden-layout was forked in-house and
no longer depends on jQuery
- Migrate the deprecated {loadSpec} FetchOptions shorthand to the new
CallContext second-argument form on XH.fetchJson() in AppModel and
WorkModel (withSpan/FetchOptions.span/loadSpec are deprecated in favor
of the Runner API, removal scheduled for v88)
- No CodeInput, FileChooser, mobile DateInput, serializeIcon, or
mergePersistOptions usages requiring migration
- hoist-core >= 40.0.1 only required for MetricsService/Runner metrics,
which this app does not use; left at 38.0.0 for now
Unlocks eligibility for the hoist-core-mcp server and CLI tools (installHoistCoreTools Gradle task requires hoistCoreVersion >= 39.0), ahead of running /xh:onboard-app to bootstrap AI tooling.
- CLAUDE.md: Hoist architecture primer, reference-skill routing, and a Known Issue note on the Grails 6/7 blocker below - .mcp.json: hoist-react MCP server entry (stdio, node bin/hoist-mcp.mjs) - build.gradle: installHoistCoreTools task (hoist-core MCP+CLI launchers) added but NOT runnable yet - blocked by the Grails 6->7 requirement, see CLAUDE.md Known Issue section. Left in place since it's the correct canonical snippet and will work once that migration lands.
…I install
Grails 6.2.3/Groovy 3.0.23 predated hoist-core's Grails 7 requirement (introduced
in hoist-core v34); every hoist-core version resolvable from Maven Central needed
this migration regardless of target version. Used ~/xh/toolbox (master) as the
reference implementation.
- gradle.properties: drop groovyVersion/grailsGradlePluginVersion/
grailsHibernatePluginVersion/gormVersion/logback.version (now managed by the
Grails BOM); add majorJavaVersion=21, opentelemetry.version=1.62.0;
grailsVersion=7.1.1, hoistCoreVersion=40.1.0, hazelcast.version=5.7.0
- build.gradle: buildscript now uses org.apache.grails + grails-bom platform,
repo moved to repo.grails.org/grails/restricted, plugins{} block, Java
toolchain, mysql-connector-j (new groupId), grails-console, refreshed
installHoistCoreTools (dynamic version resolution + robust JAVA_HOME
fallback + scoped bin/.gitignore for the generated launchers)
- gradle-wrapper.properties: Gradle 7.6.4 -> 8.14.4
- settings.gradle: added (was missing) - rootProject.name + runHoistInline
composite-build support
- javax.servlet -> jakarta.servlet in AuthenticationService
- grails-app/conf/logback.groovy -> grails-app/init/io/xh/app/LogbackConfig.groovy
extending io.xh.hoist.LogbackConfig
- BootStrap.groovy: map-based ensureRequiredConfigsCreated/PrefsCreated/
RolesCreated -> typed ConfigSpec/PreferenceSpec/RoleSpec
- Installed hoist-core MCP+CLI tools (bin/hoist-core-{mcp,docs,symbols}),
added hoist-core entry to .mcp.json
- CLAUDE.md: replaced the Known Issue section with a Stack Versions section
Verified: ./gradlew compileGroovy, installHoistCoreTools, bootRun (live HTTP
checks against /xh/ping and a protected endpoint), and war all pass.
…with hoist-react v86
Comparing against ~/xh/toolbox (master) surfaced several gaps the earlier hops missed:
- highcharts 11.x -> 12.x: hoist-react v86's kit/highcharts.ts hard-requires
>=12.4.0 (installed 11.4.8 was silently disabling charts at runtime -
logError, not a build failure, so tsc/lint never caught it)
- Bootstrap.ts: Highcharts v12 modules self-register via side-effect import
instead of exporting a callable init function - migrated all module
imports accordingly. Also expanded the AG Grid module registration from
a single ClientSideRowModelModule to the full set of community modules
AG Grid 35 now requires for cell styling/selection/tooltips/etc, plus
provideGlobalGridOptions({theme: 'legacy'}) to keep the CSS-based theme
- devDependencies bumped to match toolbox: cross-env 10.x, eslint 10.x,
lint-staged 17.x, stylelint 17.x, stylelint-config-standard-scss 17.x,
typescript ~5.9.2
- Added @typescript-eslint/parser and scope-manager resolutions pinned to
8.x - our leaner dependency tree hoisted an older 8.32.1 that predates
an ESLint 10 API contract change (), crashing
eslint outright. toolbox's larger tree happens to hoist a newer version
by luck; pinning explicitly makes this deterministic here.
- Added lint:types script (folds tsc into lint:all) and updated the husky
pre-commit hook to only run it when relevant files are staged
- docker/tomcat: bumped to xhio/xh-tomcat:next-tc10-jdk21 (was
latest-jdk17 - Tomcat 9/javax, incompatible with the Grails 7/Jakarta
backend from the prior commit) and setenv.sh default Xmx 1G -> 2G to
match the Grails 7 memory footprint
- README.md: JDK 17 -> 21 (was stale after the Grails 7 migration)
- .gitignore: added .vscode/tasks.json, .claude/scheduled_tasks.lock, .tmp
- Added AGENTS.md (pointer to CLAUDE.md) and mise.toml (java=21) for
parity with toolbox's AI-tooling and dev-env conventions
Verified: yarn lint (eslint + stylelint + tsc) and ./gradlew compileGroovy
both pass.
Yarn classic is unmaintained and handles corporate proxies/registries worse than modern npm; npm's workspaces/overrides/lockfile now cover what yarn was providing. Diverges from toolbox (still on yarn) but is the right default for new client apps. - package.json: yarn scripts -> npm run, resolutions -> overrides, drop yarn packageManager pin - Replace yarn.lock with package-lock.json, remove .yarnrc/.yarn/ - Update husky pre-commit, eslint ignores, prettierignore, README, CLAUDE.md accordingly
Hoist's Admin Console (e.g. Activity Tracking tab) uses treeMode grids, which require AG Grid Enterprise's RowGroupingModule/TreeDataModule. Community-only was throwing AG Grid error #256 (module bean missing) on load. Matches toolbox's baseline enterprise module set and wires up the license via the existing jsLicenses config stub.
Restore the original commented-out license-setting pattern/comment; enterprise modules (row grouping/tree data) stay actively registered so the Admin Console's tree grids work without a license key set.
Toolbox uses this for hoist-react/hoist-core development against local checkouts; not relevant to apps built on this template. Removes settings.gradle and the now-unused runHoistInline gradle.properties flag. Gradle now infers rootProject.name from the directory name (previously pinned to 'hoistapp'), which self-adapts once an app renames its clone directory per the README's onboarding steps.
These forced a consistent @typescript-eslint/parser + scope-manager version to fix an ESLint 10 crash caused by yarn classic hoisting a stale scope-manager lacking addGlobals(). npm's resolver dedupes to a current, consistent version on its own - verified by removing the overrides and reinstalling: resolves cleanly to 8.62.1 tree-wide, identical package-lock.json, npm run lint passes.
Verified via Docker Hub API: latest-tc10-jdk21 exists and is a stable published tag (2026-05-13), not a nightly. next-tc10-jdk21 is toolbox's bleeding-edge tag (pushed today) - wrong default for a general app template. Matches this template's own historical convention of tracking latest-* rather than next-* tags.
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.
No description provided.