Skip to content

Upgrade to latest, setup AI tooling - #2

Open
haynesjm42 wants to merge 28 commits into
mainfrom
upgrade/hoist-v73.0.1-to-v86.2.0
Open

Upgrade to latest, setup AI tooling#2
haynesjm42 wants to merge 28 commits into
mainfrom
upgrade/hoist-v73.0.1-to-v86.2.0

Conversation

@haynesjm42

Copy link
Copy Markdown
Member

No description provided.

haynesjm42 added 28 commits July 1, 2026 18:39
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.
@haynesjm42
haynesjm42 requested a review from amcclain July 2, 2026 17:37
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.

1 participant