)]}'
{
  "log": [
    {
      "commit": "4d95a3e362b375d3a6e13b02229a0714d2350700",
      "tree": "3a79cfab17ea057a71e16b5d554d1309e78c2347",
      "parents": [
        "3da9e63c423f8b93fc063416bc9c3abc213d0155",
        "c509f10a484ebdaed1f910143be8771a3d1dd03a"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Nov 04 13:33:33 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:33:33 2026 -0500"
      },
      "message": "Merge pull request #461 from amondel2/feature/grails-controller-creation-freeze\n\nFix IDE freeze when creating a Grails controller"
    },
    {
      "commit": "c509f10a484ebdaed1f910143be8771a3d1dd03a",
      "tree": "3a79cfab17ea057a71e16b5d554d1309e78c2347",
      "parents": [
        "d2d7155c8d839e2951fd8b2089086646af73df70"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Nov 04 10:54:26 2026 -0500"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Nov 04 10:54:26 2026 -0500"
      },
      "message": "Keep a console refresh, release the reservation on every exit, and pin the console behaviour with tests\n\nFollow-up to the review of the freeze fix:\n\n- GrailsConsole asks SaveAndSyncHandler for its throttled, asynchronous refresh of the\n  known local roots once a command has terminated (what External Tools do after a run)\n  instead of no refresh at all: Run Grails Command, the interceptor action and every other\n  caller without a refresh of its own relied on the console for generated files to appear.\n- executeProcessImpl releases the console reservation in a finally until the pooled waiter\n  has taken it over, so an exception from saveAllDocuments, from attaching the console or\n  from a cancellation can no longer leave myExecuting set forever on the background path,\n  nor start the next queued command beside an orphaned process; a process the console could\n  not attach is destroyed. The handoff catch no longer logs control-flow exceptions.\n- GenerateTestsAction refreshes the generated spec\u0027s expected path before the index lookup,\n  NewGrailsInterceptorAction declares its generated files, and afterCommand falls back to a\n  refresh of the target directory when a subclass declares none; it resolves files through\n  the application root\u0027s own file system.\n- Tests: a non-zero exit and an exception while starting the process release the console, a\n  submission from a pooled thread runs onDone on the EDT, queued commands run in order; the\n  native-access tests use JDKs with fixed version strings instead of branching on the test\n  JDK; NewGrailsXXXActionTest covers the generated-file expectations (including the\n  application-root package of a default-package artefact) and the auto-open; the expected\n  test paths per Grails layout are unit-tested.\n- The --enable-native-access javadoc no longer claims the option is unknown before JDK 22.\n"
    },
    {
      "commit": "d2d7155c8d839e2951fd8b2089086646af73df70",
      "tree": "fbce7d291b7dad3841190a59e71e645ee4e6bde6",
      "parents": [
        "cefd7c866e24932454d76b65d33f9ea9c8bf3ca9",
        "dcc1958539187fc18c710b39f0d3f89b98b3ff36"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:45:56 2026 -0500"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:45:56 2026 -0500"
      },
      "message": "Merge remote-tracking branch \u0027origin/feature/grails-controller-creation-freeze\u0027 into feature/grails-controller-creation-freeze\n"
    },
    {
      "commit": "cefd7c866e24932454d76b65d33f9ea9c8bf3ca9",
      "tree": "fbce7d291b7dad3841190a59e71e645ee4e6bde6",
      "parents": [
        "85897b61db8096bbce8ed3785bd054a025c3ff75",
        "bd664580e4675f3d89f7c321ab0260d52ecfbbe7"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:42:30 2026 -0500"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:44:47 2026 -0500"
      },
      "message": "Fix IDE freeze when creating a Grails controller\n\nRunning any \"New Grails artefact\" action froze the IDE with the\n\"IDE is frozen\" popup, in the worst case wedging the EDT for tens of\nseconds until the IDE had to be killed: the whole flow ran on the EDT\n(tool-window activation, saveAllDocuments, process startup), and\ncompletion ran a full-filesystem synchronous VFS refresh whose\nRefreshQueue session starved the EDT\u0027s write-intent permit.\n\nMove artefact creation and process startup off the EDT, defer\ntool-window activation, and replace the global/recursive VFS refreshes\nwith scoped per-file refreshes owned by each onDone handler. Funnel\nevery completion path (success, kill, failure, disposal) through\nteardown that always releases the console and drains the queue, so a\ncancellation from onDone cannot skip it and a failed command cannot\nwedge later ones. Queued process startup is handed off to a pooled\nthread so it never runs saveAllDocuments/process setup on the EDT.\n\nAlso pass --enable-native-access\u003dALL-UNNAMED to Grails launches on\nJDK 22+ to silence JLine\u0027s foreign-memory warnings (the flag aborts the\nJVM on older JDKs, hence the version gate), which also keeps CLI noise\nout of stderr so the console auto-hides on success again.\n"
    },
    {
      "commit": "dcc1958539187fc18c710b39f0d3f89b98b3ff36",
      "tree": "4c1905cae94d6ab20c7c73ca8fb901fbc9921d22",
      "parents": [
        "85897b61db8096bbce8ed3785bd054a025c3ff75",
        "bd664580e4675f3d89f7c321ab0260d52ecfbbe7"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:42:30 2026 -0500"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:42:30 2026 -0500"
      },
      "message": "Merge remote-tracking branch \u0027origin/feature/grails-controller-creation-freeze\u0027 into feature/grails-controller-creation-freeze\n\n# Conflicts:\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/runner/GrailsConsole.java\n"
    },
    {
      "commit": "85897b61db8096bbce8ed3785bd054a025c3ff75",
      "tree": "4c1905cae94d6ab20c7c73ca8fb901fbc9921d22",
      "parents": [
        "3da9e63c423f8b93fc063416bc9c3abc213d0155"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:25:05 2026 -0500"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:41:07 2026 -0500"
      },
      "message": "Fix IDE freeze when creating a Grails controller\n\nRunning any \"New Grails artefact\" action froze the IDE with the\n\"IDE is frozen\" popup, in the worst case wedging the EDT for tens of\nseconds until the IDE had to be killed: the whole flow ran on the EDT\n(tool-window activation, saveAllDocuments, process startup), and\ncompletion ran a full-filesystem synchronous VFS refresh whose\nRefreshQueue session starved the EDT\u0027s write-intent permit.\n\nMove artefact creation and process startup off the EDT, defer\ntool-window activation, and replace the global/recursive VFS refreshes\nwith scoped per-file refreshes owned by each onDone handler. Funnel\nevery completion path (success, kill, failure, disposal) through\nteardown that always releases the console and drains the queue, so a\ncancellation from onDone cannot skip it and a failed command cannot\nwedge later ones. Queued process startup is handed off to a pooled\nthread so it never runs saveAllDocuments/process setup on the EDT.\n\nAlso pass --enable-native-access\u003dALL-UNNAMED to Grails launches on\nJDK 22+ to silence JLine\u0027s foreign-memory warnings (the flag aborts the\nJVM on older JDKs, hence the version gate), which also keeps CLI noise\nout of stderr so the console auto-hides on success again.\n"
    },
    {
      "commit": "bd664580e4675f3d89f7c321ab0260d52ecfbbe7",
      "tree": "e002df1068fce47991f19ba324acc010df0ccd5e",
      "parents": [
        "3da9e63c423f8b93fc063416bc9c3abc213d0155"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:25:05 2026 -0500"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Nov 03 18:25:05 2026 -0500"
      },
      "message": "Fix IDE freeze when creating a Grails controller\n\nRunning any \"New Grails artefact\" action froze the IDE with the\n\"IDE is frozen\" popup, in the worst case wedging the EDT for tens of\nseconds until the IDE had to be killed: the whole flow ran on the EDT\n(tool-window activation, saveAllDocuments, process startup), and\ncompletion ran a full-filesystem synchronous VFS refresh whose\nRefreshQueue session starved the EDT\u0027s write-intent permit.\n\nMove artefact creation and process startup off the EDT, defer\ntool-window activation, and replace the global/recursive VFS refreshes\nwith scoped per-file refreshes owned by each onDone handler. Funnel\nevery completion path (success, kill, failure, disposal) through\nteardown that always releases the console and drains the queue, so a\ncancellation from onDone cannot skip it and a failed command cannot\nwedge later ones.\n\nAlso pass --enable-native-access\u003dALL-UNNAMED to Grails launches on\nJDK 22+ to silence JLine\u0027s foreign-memory warnings (the flag aborts the\nJVM on older JDKs, hence the version gate), which also keeps CLI noise\nout of stderr so the console auto-hides on success again.\n"
    },
    {
      "commit": "3da9e63c423f8b93fc063416bc9c3abc213d0155",
      "tree": "9a4d320523c5a1f125b916558c6aad8115194bd1",
      "parents": [
        "6a5884ffad3a58391b8c94f34515220f04f0e0bd",
        "62ed0fdc1ed54bb4c92416e4716cc7c20f8762ee"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Fri Oct 30 10:32:05 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 10:32:05 2026 -0400"
      },
      "message": "Merge pull request #459 from apache/fix/ci-jdk8-for-gradle-4.6\n\nInstall JDK 8 explicitly in CI and resolve the Gradle JVM before the test project exists"
    },
    {
      "commit": "62ed0fdc1ed54bb4c92416e4716cc7c20f8762ee",
      "tree": "9a4d320523c5a1f125b916558c6aad8115194bd1",
      "parents": [
        "6a5884ffad3a58391b8c94f34515220f04f0e0bd"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Fri Oct 30 10:00:35 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Fri Oct 30 10:00:35 2026 -0400"
      },
      "message": "Install JDK 8 explicitly in CI and resolve the Gradle JVM before the test project exists\n\nThe 263.0.1 release build failed on the ubuntu-26.04 runner image, which no longer ships\nTemurin 8: GradleGrailsImportingTest[Gradle-4.6, Grails-3.3.1] could not resolve a Gradle JVM,\nand because the resolver throws inside setUpInWriteAction() the platform tore the fixture down\nfrom under the write action, closeProject() refused, and the leaked project made\nGspResourceTagTest.testMove/testMove2 fail with \"Trying to get PSI for a file that is not\nincluded in the project model\".\n\nThe Build \u0026 Test and release jobs now run setup-java for JDK 8 and symlink it into\n/usr/lib/jvm, where the IDE\u0027s JavaHomeFinder looks. GradleImportingTestCase.setUpFixtures()\nresolves the Gradle JVM before the project fixture exists, so a missing JDK fails only the\nimport test; GradleImportingTestCaseJdkResolutionTest pins that.\n"
    },
    {
      "commit": "6a5884ffad3a58391b8c94f34515220f04f0e0bd",
      "tree": "efe7b6dbe6a6830fb5860b41552ee931038f97bd",
      "parents": [
        "27b98c7c15a3b5d20969673d4d1980ddce7655aa"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@apache.org",
        "time": "Fri Oct 30 08:47:43 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@apache.org",
        "time": "Fri Oct 30 08:47:43 2026 -0400"
      },
      "message": "Move workflow jobs to ubuntu-22.04\n\nThe ubuntu-24.04 runner pool is queueing for long periods under the ASF\norganisation\u0027s runner capacity; the ubuntu-22.04 pool has far less\ncontention. Pin every job to ubuntu-22.04.\n"
    },
    {
      "commit": "27b98c7c15a3b5d20969673d4d1980ddce7655aa",
      "tree": "bb51c167abec526317359dfb59863d5145d91218",
      "parents": [
        "047f6df44c18151d7644c429d87d0cfecddfe489"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@apache.org",
        "time": "Fri Oct 30 08:35:53 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@apache.org",
        "time": "Fri Oct 30 08:35:53 2026 -0400"
      },
      "message": "Pin workflow jobs to ubuntu-24.04 instead of ubuntu-latest\n\nubuntu-latest now resolves to the ubuntu-26.04 image and jobs that request\nit have been queueing for long periods under the ASF organisation\u0027s runner\ncapacity. Pin every job to the previous LTS image instead.\n"
    },
    {
      "commit": "047f6df44c18151d7644c429d87d0cfecddfe489",
      "tree": "bc7b865ddcb5d1adb88047444425a4eb8a7461a1",
      "parents": [
        "50cb473edc31d5dd0fb386b481e339ebbe298567",
        "9efc72801b4021debfb63342ed85df276013a279"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Oct 21 10:31:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:31:06 2026 -0400"
      },
      "message": "Merge pull request #455 from apache/vulnerability-scan\n\nReplace the Sonatype scan plugin with our own scanner, and ship an SBOM"
    },
    {
      "commit": "9efc72801b4021debfb63342ed85df276013a279",
      "tree": "cabf2ced50f57bc80a996fbb020a86b8b034071a",
      "parents": [
        "032ece12415af1b40e25d3c04ca5b818d4fac53e"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 18:00:35 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 18:00:35 2026 -0400"
      },
      "message": "Replace the Sonatype scan plugin with our own scanner, and ship an SBOM\n\nThe Sonatype scan-gradle-plugin\u0027s ossIndexAudit task is marked incompatible\nwith the configuration cache, so every build that ran it discarded the cache\nentry. Replace it with a port of grails-core\u0027s build-logic/vulnerability-scan,\nas this build\u0027s own code in org.apache.grails.intellij.build.scan:\n\n- vulnerabilityScan looks every project\u0027s resolved runtimeClasspath and\n  compileClasspath up in OSV and, when SONATYPE_GUIDE_USERNAME and\n  SONATYPE_GUIDE_TOKEN are set, Sonatype Guide. The credentials are read when\n  the scan runs, so they never enter the configuration cache entry, and the\n  answers are cached in the Gradle user home for an hour, in the directory\n  grails-core uses.\n- vulnerabilityScanReport, on the root project, summarizes every project\u0027s\n  scan in Markdown, including failed scans and exclusions that no longer\n  match anything.\n- The IntelliJ Platform\u0027s own bundledModule/bundledPlugin components are left\n  out of the scan, since no database knows them. java-legacy projects and\n  libs/testFramework scan runtimeClasspath only: their compile-only\n  dependencies are era-pinned stubs or JetBrains\u0027 test-framework jars, never\n  shipped.\n- The workflow keeps its weekly run, and a committer can now opt a pull\n  request in with the \"vulnerability scan\" label, which posts the summary as\n  a sticky comment.\n\nAdd a CycloneDX SBOM, as grails-core ships for its jars: the sbom task makes\nthe CycloneDX output reproducible (epoch or SOURCE_DATE_EPOCH timestamp,\ncontent-derived serial number, sorted dependencies) and records each\ndependency under the one license SbomLicensePolicy picks for it, failing on a\nlicense ASF policy does not permit. The plugin ZIP carries it as sbom.json\nnext to LICENSE and NOTICE, and the composed jar as META-INF/sbom.json with\nSbom-Location and Sbom-Format manifest attributes.\n\nBoth are covered by TestKit tests against stubs of the OSV and Sonatype Guide\nAPIs and a local Maven repository, with the configuration cache on and its\nproblems fatal.\n"
    },
    {
      "commit": "50cb473edc31d5dd0fb386b481e339ebbe298567",
      "tree": "0cc155700d700efc46b7029d77ea7d28d954bc42",
      "parents": [
        "032ece12415af1b40e25d3c04ca5b818d4fac53e",
        "331c9e6c875f91f363e7c9c614a5bc99c038f6b9"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 17:21:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 17:21:20 2026 -0400"
      },
      "message": "Merge pull request #441 from amondel2/feature/custom-folders\n\nFeature/custom folders"
    },
    {
      "commit": "331c9e6c875f91f363e7c9c614a5bc99c038f6b9",
      "tree": "1c9da24d2cdcd2cbd997186d2c1afda2611a4355",
      "parents": [
        "18042426dbea9461390edf7388ee207be0b24b07"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 17:15:02 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 17:18:35 2026 -0400"
      },
      "message": "Detect every Grails test phase under src, whichever module owns it\n\nThe Grails pane lifted only src/test, src/integration-test and\nsrc/functional-test out of the src node on imported projects. Custom phases\nwere meant to be found through the test roots registered on the module that\nowns src, but Gradle import gives every source set a module of its own whose\ncontent root is the phase directory, so that module registers no roots at\nall and a phase declared in testPhases (src/geb-test, src/freeze-test) stayed\nburied under src.\n\nPhases are now found from the test roots of every module, and by name for\nthe Grails testPhases layout, src/\u003cphase\u003e-test, which also covers a project\nbefore import and the import\u0027s habit of registering a custom source set as\nproduction sources. A lifted phase is titled the way the built-in ones are,\nby the phase rather than the directory: Tests:geb for src/geb-test or\nsrc/gebTest. Built-in phases list first, then the rest by name.\n\nGrails3NodeProviderGradleLayoutTest reproduces the imported layout with a\nheavy fixture, a root module owning src and a module per phase, and fails\non the old lookup; the light tests cover the name rule, the titles and the\norder.\n"
    },
    {
      "commit": "032ece12415af1b40e25d3c04ca5b818d4fac53e",
      "tree": "8816f6fe751c9b4784f4deacb6898520eb989b34",
      "parents": [
        "a88f1d91266e0afa0b99c711e30e9663de75dfda",
        "a9e855959b77b8c44b0b92ae3c38013bc7a0ae9b"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 16:51:12 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 16:51:12 2026 -0400"
      },
      "message": "Merge pull request #444 from apache/dependabot/github_actions/main/actions/upload-artifact-7.0.2\n\nBump actions/upload-artifact from 7.0.1 to 7.0.2"
    },
    {
      "commit": "a88f1d91266e0afa0b99c711e30e9663de75dfda",
      "tree": "96cf826d752c7899d7a34e7e43dd87be84928132",
      "parents": [
        "98a5638438a45bb2a36aeb77726ac390a62b750b",
        "af60dd8b804731f8ff8cba493f81bb0412c76f07"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 16:50:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 16:50:49 2026 -0400"
      },
      "message": "Recognise GORM data services declared as interfaces (#445)\n\n* Recognise GORM data services declared as interfaces\n\nA GORM data service is an interface (`@Service(Quest) interface\nQuestService`) whose implementation GORM generates at compile time, but\nevery artefact lookup in GrailsArtifact accepted GrClassDefinition only.\nThe domain-class toolbar therefore said \"Nothing here\" under \"Go To\nService\" for the service `generate-all` had just written, the interface\nitself got no toolbar, and the Spring bean discoverer skipped it, while a\nservice written as a class resolved fine.\n\nGrailsArtifact now asks a single `isArtefactDefinition` rule, which\nSERVICE overrides to admit GrInterfaceDefinition; getType, isInstance and\nthe instance cache all go through it, so interfaces under other artefact\ndirectories remain unrecognised. The lookups return GrTypeDefinition, the\ncommon supertype, and callers were widened accordingly. GrailsTestCase\u0027s\naddService/addController accept interface and trait declarations so the\ncase can be exercised in light fixtures.\n\nReported in the Grails 8 talk at https://github.com/kousen/holygrails8.\n\n* Say in the SERVICE javadoc that the @Service annotation is not checked\n\nThe comment claimed a data service is an interface annotated with\ngrails.gorm.services.Service, but isArtefactDefinition admits any interface\nand never looks at the annotation. Deliberately so: the annotation may not\nresolve. Reword the comment to match, and pin the behaviour with a test\nthat recognises an unannotated *Service interface under grails-app/services."
    },
    {
      "commit": "98a5638438a45bb2a36aeb77726ac390a62b750b",
      "tree": "9a2c5a82fc72dfc95405a16f6147d852a4ecb7ce",
      "parents": [
        "73363d7d413988cc6662677e7b22dff569e84197",
        "fe81004eaae3bfe09e7ed3c9052bf6b21f9876ad"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 16:50:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 16:50:06 2026 -0400"
      },
      "message": "Merge pull request #446 from apache/feature/scaffold-generated-actions\n\nModel @Scaffold: inherited superclass, in-body method hints, Structure view"
    },
    {
      "commit": "18042426dbea9461390edf7388ee207be0b24b07",
      "tree": "49efc832558fc2506462160ac1c44ef44e75bd3f",
      "parents": [
        "ef890674146f340e16b5a200c6f0697ef688df9b"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 16:42:56 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 16:42:56 2026 -0400"
      },
      "message": "Build Grails view children only when a node is expanded\n\nOpening the application node in the Grails pane sat on \"Loading...\" for a\nlong time on real projects. StructureTreeModel decides whether to draw a\nchild\u0027s expand arrow by building that child\u0027s children as soon as its parent\nis listed, so every artefact group\u0027s index search and the plugin search ran\nbefore the application\u0027s children appeared, on the tree\u0027s single background\nthread, restarted by every write action.\n\nGrailsApplicationNode, GrailsArtefactHandlerNode and GrailsPluginsNode now\nalways show the arrow, the way PsiDirectoryNode does for local directories,\nso their children are built when the node itself is expanded. Conventional\nartefacts are found by walking the handler\u0027s directory instead of running\nAllClassesSearch over every class name in the scope once per group, which is\nwhat each refresh of an expanded group costs after an edit.\n\nGrailsNodeLeafStateTest pins the leaf states and shows through a real\nStructureTreeModel that neither the providers nor a group\u0027s search run until\nthe node is expanded; GrailsArtefactsTest pins the directory-walk rule.\n"
    },
    {
      "commit": "ef890674146f340e16b5a200c6f0697ef688df9b",
      "tree": "824b6ec76b9d95e386b293de9a76c6b9d20d973c",
      "parents": [
        "dd808bfbb0ed7ebda2f960428662b32c2d1827d6"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 15:51:15 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 20 15:51:15 2026 -0400"
      },
      "message": "Allow external custom folders, keep configured order, rework settings list\n\nA custom folder may again be an absolute or ~ path anywhere on disk, and\na relative path may climb out of the application root with \"..\".\nFolderPaths is the one resolution rule for the provider, the settings\npage, the actions and the refresh listener. A folder outside the project\nlists its own contents, since the platform lists none for directories\nthe project does not cover, and the root/application nodes and the\nselect-in target accept files inside custom folders so Select Opened\nFile reaches them.\n\nFolders render in the configured order (project first) instead of\nalphabetically; each node carries its position and the comparator breaks\nthe shared-weight tie with it.\n\nThe settings page replaces the +/- text rows with a ToolbarDecorator\ntable: folder chooser, typed path, inline edit, remove, move up/down and\na per-row status. Apply refuses only a path that names a file.\n\nRemoves the dead GrailsPluginConfigurable and the implemented\nIMPROVEMENT-PLAN sections 2.8/2.9, and trims the README paragraph.\n"
    },
    {
      "commit": "dd808bfbb0ed7ebda2f960428662b32c2d1827d6",
      "tree": "7d16820abe0080ed684ba0b6df61257287e57d5e",
      "parents": [
        "33ca4e941b9c73efc99efb63935fb947b51ea5df"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Thu Oct 15 22:06:43 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Thu Oct 15 22:06:43 2026 -0400"
      },
      "message": "Add configurable custom folders to the Grails project view\n\nThe Grails pane rendered grails-app\u0027s fixed set of directories and the\ntest roots. This adds custom folders on top: paths (global defaults\nplus a per-project override) that appear as nodes under the application\nnode, editable on a settings page and manageable from the tree with Add\nas Custom Folder, Remove Custom Folder and Configure Custom Folders.\n\nThe shape that survived review, and why it is this shape:\n\n- Two node kinds behind one interface. A folder that resolves on disk is\n  a GrailsPsiDirectoryNode subclass, so its value is the PsiDirectory.\n  That is what makes the node traversable: an AbstractTreeNode\u003cString\u003e\n  puts no PSI_ELEMENT or VIRTUAL_FILE in the data context, and\n  ProjectViewNodeVisitor.getContent answers null for it, so the visitor\n  returns SKIP_CHILDREN even when the node\u0027s own contains() returns\n  true -- Reveal and Select Opened File dead-end and New, Copy Path,\n  Find in Files, Open In and Delete do nothing. A path that resolves to\n  nothing keeps a separate lightweight placeholder and is the only\n  AbstractTreeNode\u003cString\u003e left in the feature; it stays visible so a\n  typo is removable from the settings page rather than invisible.\n  GrailsCustomFolder exposes getConfiguredPath()/getNodeWeight(), so\n  GrailsNodeComparator and the three actions need a single instanceof.\n\n- One path base, the Grails application root, on both sides. Add used to\n  store a path relative to Project.getBaseDir() while the provider\n  resolved it against application.getRoot(), so in a multi-project build\n  with the app in app/, adding app/docs stored \"app/docs\" and rendered a\n  placeholder for app/app/docs. Both now go through\n  findApplication(dir).getRoot(), and getBaseDir() no longer appears in\n  plugin/src/main. A directory belonging to no Grails application is not\n  offered at all, and a directory outside the application root has no\n  path to store against that base.\n\n- No absolute paths. The provider resolves a relative path against the\n  application root and nothing else, and apply() rejects an absolute\n  path, an escaping \"..\", and a path resolving outside the root,\n  naming the row it came from. Validation normalizes the row before\n  checking it, so a stray leading space does not buy a path the trimmed\n  form would be refused. A stored path that stops resolving becomes a\n  placeholder rather than disappearing. External directories stay a\n  tracked follow-up in IMPROVEMENT-PLAN.md 2.8.\n\n- The cap is a setting, not a constant, and it is applied only when the\n  view is built. MAX_FOLDERS \u003d 3 was applied when folders were saved, so\n  lowering it would have deleted configuration. maxFolders is persisted\n  global state (default 6, range 1-20), edited with a spinner; lowering\n  it now changes what renders without touching what is stored. The four\n  copies of the normalize/dedupe loop collapse into FolderPaths.dedupe\n  and both MAX_FOLDERS constants are gone.\n\n- Refreshes go through a message bus. Pane refreshes used to be direct\n  GrailsProjectViewPanes.refresh calls from the services, so editing the\n  global defaults left every other open project stale and\n  FoldersChangedListener had no subscriber at all. A\n  GrailsCustomFoldersRefreshListener project activity subscribes to the\n  project topic, the new application topic and VFS_CHANGES, and\n  coalesces them through one flag held per project: one Apply costs one\n  rebuild per open project, and a build that creates build/ turns its\n  placeholder into a real folder. The flag is read off the project\n  rather than captured per execute() because postStartupActivity also\n  runs under unit-test mode, which would otherwise give two registrations\n  and two rebuilds for one change.\n\n- The settings page lives at Languages \u0026 Frameworks \u003e Grails, with no\n  empty parent page, and the two text areas are scrollable one-line rows\n  with a + button and a per-row remove. Any number of rows survives;\n  the cap truncates only the preview and the rendered tree. Global\n  defaults are validated on shape alone rather than against an\n  application root, because each open project has its own root and a\n  path that resolves in one need not resolve in another.\n\nSupporting changes: the three actions read\nPlatformCoreDataKeys.SELECTED_ITEMS rather than\ngetCurrentProjectViewPane().getSelectedPath(), so no update() touches\nthe Swing tree from its background thread; Add refuses a folder the\nGrails view already renders, project or global; GrailsApplicationManager\nstarts its upward walk at the file itself when the file has no content\nroot, so Gradle\u0027s excluded build/ and .gradle/ resolve to their\napplication instead of to nothing; a failing view provider is logged as\nan error rather than a warning.\n\nReveal is asserted through AbstractProjectViewPane.createVisitor, the\nvisitor the pane actually uses, rather than on the node\u0027s own contains()\n-- which is what made the original test unable to fail, since the node\nunder test returned true. README.md, IMPROVEMENT-PLAN.md 2.8 and the\nsettings page state one rule; the claim that hidden directories are\nfiltered was checked against the platform\u0027s default Ignored Files and\nFolders list and is false, so the docs were corrected rather than the\nclaim restated.\n\nThe feature is unreleased, so none of this reaches a user who was\nalready running it.\n\n# Conflicts:\n#\tIMPROVEMENT-PLAN.md\n#\tREADME.md\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/actions/AddCustomFolderAction.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/actions/ConfigureCustomFoldersAction.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/actions/RemoveCustomFolderAction.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/config/FolderPaths.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/config/GrailsCustomFoldersAppService.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/config/GrailsCustomFoldersConfigurable.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/config/GrailsCustomFoldersProjectService.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/projectView/impl/GrailsCustomFoldersNodeProvider.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/projectView/impl/GrailsNodeComparator.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/projectView/nodes/GrailsApplicationNode.java\n#\tplugin/src/main/java/org/apache/grails/intellij/plugin/projectView/nodes/GrailsCustomFolderNode.java\n#\tplugin/src/main/resources/META-INF/plugin.xml\n#\tplugin/src/test/java/org/apache/grails/intellij/plugin/actions/CustomFoldersActionTest.java\n#\tplugin/src/test/java/org/apache/grails/intellij/plugin/config/GrailsCustomFoldersAppServiceTest.java\n#\tplugin/src/test/java/org/apache/grails/intellij/plugin/config/GrailsCustomFoldersConfigurableTest.java\n#\tplugin/src/test/java/org/apache/grails/intellij/plugin/config/GrailsCustomFoldersProjectServiceTest.java\n#\tplugin/src/test/java/org/apache/grails/intellij/plugin/projectView/GrailsCustomFoldersPaneTest.java\n#\tplugin/src/test/java/org/apache/grails/intellij/plugin/projectView/impl/GrailsCustomFoldersNodeProviderTest.java\n"
    },
    {
      "commit": "fe81004eaae3bfe09e7ed3c9052bf6b21f9876ad",
      "tree": "8de26c7fa15fa635a2b93265f2c9f9634be50bf1",
      "parents": [
        "78eca5b3aada50877bdb2fe02939ddb5d3b3e237"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 15 20:26:41 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 15 20:26:41 2026 -0400"
      },
      "message": "Stop reading GroovyCompletionData.BUILT_IN_TYPES, private since 2026.3\n\nPlugin Verifier fails against the 2026.3 EAP (IU-263.6800.24) with an\n\"Illegal access to a private field\" compatibility problem: intellij-community\ncommit 0ea36d30ab (IDEA-390518) made GroovyCompletionData.BUILT_IN_TYPES\nprivate, and the GSP \u003c%! %\u003e declaration completion provider read it to offer\nthe primitive type keywords. On 2026.3 that read throws IllegalAccessError.\n\nKeep the nine primitive keywords in GrailsCompletionContributor and pass them\nto the still-public addKeywords. testModifiersInGspGroovyDeclaration now\nasserts all nine keywords are offered, not just \"int\", so the local list\nstays wired in.\n"
    },
    {
      "commit": "af60dd8b804731f8ff8cba493f81bb0412c76f07",
      "tree": "c9c976c30dd4da4ff4fd0321196a8e5aa92f0999",
      "parents": [
        "7bef7c74acf803d79badc603309e9ac5448a5e8e"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 15 20:11:31 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 15 20:11:31 2026 -0400"
      },
      "message": "Say in the SERVICE javadoc that the @Service annotation is not checked\n\nThe comment claimed a data service is an interface annotated with\ngrails.gorm.services.Service, but isArtefactDefinition admits any interface\nand never looks at the annotation. Deliberately so: the annotation may not\nresolve. Reword the comment to match, and pin the behaviour with a test\nthat recognises an unannotated *Service interface under grails-app/services.\n"
    },
    {
      "commit": "78eca5b3aada50877bdb2fe02939ddb5d3b3e237",
      "tree": "961c5bdfe30cbe864704134af79fb3bced5fcf0d",
      "parents": [
        "efcbeccc78211f36ed1cd4c6dc75eb4e3bbd600f"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 12 15:56:54 2026 +0100"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 12 15:56:54 2026 +0100"
      },
      "message": "Model @Scaffold: inherited superclass, in-body method hints, Structure view\n\n@Scaffold generates no methods. Grails\u0027 ScaffoldingControllerInjector and\nScaffoldingServiceInjector replace the class\u0027s superclass at compile time\n(Object becomes RestfulController\u003cDomain\u003e or GormService\u003cDomain\u003e, or the\nbase named in the annotation) and add a no-arg constructor. The IDE knew\nnothing of this, so a scaffolded controller showed no actions, a hand\nwritten `def show()` carried no \"overrides\" marker, and nothing told the\nuser what the annotation had done.\n\nScaffoldTransformationSupport sets the same superclass on the PSI through\nthe Groovy astTransformationSupport extension point, reading the\nannotation the way the injectors do: @Scaffold(Domain),\n@Scaffold(Base\u003cDomain\u003e), @Scaffold(value \u003d Base, domain \u003d Domain), the\n`domain` attribute alone, and the deprecated `static scaffold \u003d Domain`.\nA class with its own superclass is left alone, as the compiler rejects\nit. Completion, navigation, the override gutter marker and the structure\nview\u0027s inherited members then come from the platform.\n\nScaffoldInlayHintsProvider shows what was added: `extends\nRestfulController\u003cQuest\u003e` after the class name, and the inherited methods\nas greyed lines above the class\u0027s closing brace, indented like its own\nmembers, with the base\u0027s type parameter replaced by the domain. Above\neach method a comment names the annotation responsible, as written in the\nfile (`// @Scaffold(Quest) - inherited from RestfulController\u003cQuest\u003e`),\nand links back to it; a blank line separates the groups. A method the\nclass declares drops out, leaving the platform\u0027s override marker.\nCompiled Groovy bases carry trait methods and property accessors as\npublic methods, so the listing skips @Generated members, accessors and\n`$` names.\n\nScaffoldStructureViewExtension lists the same methods under the class\nnode in the Structure view, greyed and located in the base, without\n\"Show Inherited\"; with that toggle on the platform lists them itself, so\nthe extension adds nothing then.\n"
    },
    {
      "commit": "7bef7c74acf803d79badc603309e9ac5448a5e8e",
      "tree": "6a33db7c88f9a9560f7537774148ced87a05513d",
      "parents": [
        "efcbeccc78211f36ed1cd4c6dc75eb4e3bbd600f"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 12 14:48:25 2026 +0100"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 12 14:48:25 2026 +0100"
      },
      "message": "Recognise GORM data services declared as interfaces\n\nA GORM data service is an interface (`@Service(Quest) interface\nQuestService`) whose implementation GORM generates at compile time, but\nevery artefact lookup in GrailsArtifact accepted GrClassDefinition only.\nThe domain-class toolbar therefore said \"Nothing here\" under \"Go To\nService\" for the service `generate-all` had just written, the interface\nitself got no toolbar, and the Spring bean discoverer skipped it, while a\nservice written as a class resolved fine.\n\nGrailsArtifact now asks a single `isArtefactDefinition` rule, which\nSERVICE overrides to admit GrInterfaceDefinition; getType, isInstance and\nthe instance cache all go through it, so interfaces under other artefact\ndirectories remain unrecognised. The lookups return GrTypeDefinition, the\ncommon supertype, and callers were widened accordingly. GrailsTestCase\u0027s\naddService/addController accept interface and trait declarations so the\ncase can be exercised in light fixtures.\n\nReported in the Grails 8 talk at https://github.com/kousen/holygrails8.\n"
    },
    {
      "commit": "a9e855959b77b8c44b0b92ae3c38013bc7a0ae9b",
      "tree": "9fe8ae4d49062f3e937e6ac12bf037fd2b3b517e",
      "parents": [
        "73363d7d413988cc6662677e7b22dff569e84197"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 11 22:21:31 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 22:21:31 2026 +0000"
      },
      "message": "Bump actions/upload-artifact from 7.0.1 to 7.0.2\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.1 to 7.0.2.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a...cf430e030ddbb5b0abf93d22962f4752f3646cd9)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: 7.0.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "33ca4e941b9c73efc99efb63935fb947b51ea5df",
      "tree": "f513185de512d0852e5e0b431f540555d0cf9b0f",
      "parents": [
        "01093865474d6ec163d8c6b93752525a7d822242",
        "73363d7d413988cc6662677e7b22dff569e84197"
      ],
      "author": {
        "name": "Aaron",
        "email": "amondel2@gmail.com",
        "time": "Sun Oct 11 11:15:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 11:15:36 2026 -0400"
      },
      "message": "Merge branch \u0027apache:main\u0027 into feature/custom-folders\n"
    },
    {
      "commit": "73363d7d413988cc6662677e7b22dff569e84197",
      "tree": "3e2f29083209a5c7382a35ab788149b10c91397b",
      "parents": [
        "c345981d488f278edb65bb65ae7cc9781e5f8e27"
      ],
      "author": {
        "name": "Aaron",
        "email": "amondel2@gmail.com",
        "time": "Sun Oct 11 04:30:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 09:30:11 2026 +0100"
      },
      "message": "Correct node-label comments and pin the postprocess hook with a decorator test (#439)\n\nCorrect node-label comments and pin the postprocess hook with a decorator test (#439)\n\nFollow-up to #432. Corrects the comments, javadoc and AGENTS.md text that\ndescribe how GrailsPsiDirectoryNode titles a directory, and adds a\nregression test for the hook order.\n\n- postprocess runs only on the updated presentation, from\n  PresentableNodeDescriptor.getUpdatedPresentation. It never labels the\n  template: PresentationData.applyFrom fills only null or empty fields.\n- PsiDirectoryNode.updateImpl adds coloured fragments only when the\n  directory is a module content root and the file resolves to at least\n  one module. The no-modules fall-through needs\n  CodeInsightContexts.isSharedSourceSupportEnabled. Every other directory\n  gets setPresentableText from ProjectViewDirectoryHelper.getNodeName and\n  no fragments.\n- The title write must stay in postprocess. AbstractPsiBasedNode.doUpdate\n  runs updateImpl, then the ProjectViewNodeDecorators, and postprocess\n  only afterwards. GradleModuleDirectoryDecorator rewrites content-root\n  fragments, so a title written in updateImpl would be restyled or\n  suffixed with [module].\n\ntestTitleSurvivesProjectViewDecorators registers a decorator shaped like\nGradleModuleDirectoryDecorator\u0027s appendModuleName branch and asserts that\nupdate() draws only the title. It fails if the write moves into\nupdateImpl.\n\nComments, documentation and tests only; no behavior change."
    },
    {
      "commit": "01093865474d6ec163d8c6b93752525a7d822242",
      "tree": "07d62b71fd26fccef852652001e8a3c3224ecd17",
      "parents": [
        "7db19492fa24884a2033fbcf504ab51b88289339",
        "c345981d488f278edb65bb65ae7cc9781e5f8e27"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sat Oct 10 23:47:21 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sat Oct 10 23:47:21 2026 -0400"
      },
      "message": "Merge remote-tracking branch \u0027origin/main\u0027 into feature/custom-folders\n"
    },
    {
      "commit": "7db19492fa24884a2033fbcf504ab51b88289339",
      "tree": "07d62b71fd26fccef852652001e8a3c3224ecd17",
      "parents": [
        "2c702dbfd43e9468626687fa6d6958851b16eaca"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sat Oct 10 23:20:07 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sat Oct 10 23:20:07 2026 -0400"
      },
      "message": "Hide the add-custom-folder action for the project root\n\nThe project root is already the top of the Grails view, so adding it as a\ncustom folder would duplicate the whole project under the application node.\nAddCustomFolderAction now hides itself for the root in update() and makes\nactionPerformed a no-op for it, so a user-mapped shortcut cannot store the\nroot as a custom folder. Covers both entry points in CustomFoldersActionTest.\n"
    },
    {
      "commit": "2c702dbfd43e9468626687fa6d6958851b16eaca",
      "tree": "d3456bddfd6f805aed0974f22a8ec69d8ed188c5",
      "parents": [
        "93cad21e7655e576a09d31797a0d55bce35931b4"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Thu Oct 08 17:23:25 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Thu Oct 08 17:23:25 2026 -0400"
      },
      "message": "Hide remove action for global folders, consolidate path normalization, fix contains()\n"
    },
    {
      "commit": "93cad21e7655e576a09d31797a0d55bce35931b4",
      "tree": "987b197ea1a2736d25bbedc0571d62565d37b997",
      "parents": [
        "efcbeccc78211f36ed1cd4c6dc75eb4e3bbd600f"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Thu Oct 08 12:33:10 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Thu Oct 08 12:33:10 2026 -0400"
      },
      "message": "Combine project and global custom folders in the Grails view\n\nProject folders are now added to the global defaults (project first,\ncapped at three, deduplicated after path normalization) instead of\nreplacing them. Consolidates the settings into a single page with a\nlive preview and over-cap warning, adds project-view actions, and\nhardens the tree nodes against missing folders and provider failures.\n"
    },
    {
      "commit": "c345981d488f278edb65bb65ae7cc9781e5f8e27",
      "tree": "560a5e18a49ff51d934812043dc44038db567b11",
      "parents": [
        "efcbeccc78211f36ed1cd4c6dc75eb4e3bbd600f",
        "50f95aed7980717b1dd2bd42184c3889189f421d"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Oct 07 16:34:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 16:34:52 2026 -0400"
      },
      "message": "Merge pull request #440 from apache/merge-back-263.0.0\n\nchore: merge 263.0.0-\u003emain; bump to 263.0.1-SNAPSHOT"
    },
    {
      "commit": "50f95aed7980717b1dd2bd42184c3889189f421d",
      "tree": "8477ff6faaf32081a6569fe093aa51d426040a55",
      "parents": [
        "de254c47055793f48019c644b671bceb93853cb3"
      ],
      "author": {
        "name": "jdaugherty",
        "email": "jdaugherty@users.noreply.github.com",
        "time": "Wed Oct 07 20:34:13 2026 +0000"
      },
      "committer": {
        "name": "jdaugherty",
        "email": "jdaugherty@users.noreply.github.com",
        "time": "Wed Oct 07 20:34:13 2026 +0000"
      },
      "message": "[skip ci] Bump version to 263.0.1-SNAPSHOT\n"
    },
    {
      "commit": "efcbeccc78211f36ed1cd4c6dc75eb4e3bbd600f",
      "tree": "a2dbb5e286f97024506c9210d8383d26c6881504",
      "parents": [
        "9cf6b3479fa811ce1bef0a64c10da08fee142c8b",
        "8cb9e433d7982a7b8ed8d3f4bd531dc3e15d1d86"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 06 20:06:07 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:06:07 2026 -0400"
      },
      "message": "Merge pull request #432 from amondel2/feature/grails-view-nodes\n\nFeature/grails view nodes"
    },
    {
      "commit": "8cb9e433d7982a7b8ed8d3f4bd531dc3e15d1d86",
      "tree": "4c14bdfd0f550b86de416cf303d30b88a83f8631",
      "parents": [
        "0d8c31fbbdee80e43215f7f9fd6e6bb41bef6020"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 06 19:55:48 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 06 19:55:48 2026 -0400"
      },
      "message": "Correct node-label documentation and test content-root fragments\n"
    },
    {
      "commit": "9cf6b3479fa811ce1bef0a64c10da08fee142c8b",
      "tree": "ef187d8898f0aa0e1f211ab3e0fa8a8158599925",
      "parents": [
        "5a96362fe84a24902955693d7e48aa57697966b0",
        "32bb169466a1f8ad82b633d9f0c7cf4c3a66bd18"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Oct 06 19:35:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 19:35:10 2026 -0400"
      },
      "message": "Merge pull request #438 from apache/where-query-criteria-delegate\n\nResolve DetachedCriteria methods inside GORM where queries"
    },
    {
      "commit": "0d8c31fbbdee80e43215f7f9fd6e6bb41bef6020",
      "tree": "0d0743b5d0f9d119a7c4f93c870e1f91192e5cbd",
      "parents": [
        "89064a83be0067afe030f58ff5f065eec6667f3a"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 19:05:28 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 19:05:28 2026 -0400"
      },
      "message": "Fix NodeWeightsTest javadoc: ties do not fall through to the platform comparator\n\nGrailsNodeComparator returns the weight difference directly, so two nodes\nsharing a weight compare as 0 and their relative order is unspecified.\nThe old javadoc incorrectly said the order falls through to the platform\ncomparator.\n"
    },
    {
      "commit": "89064a83be0067afe030f58ff5f065eec6667f3a",
      "tree": "f27ec34adccec1f342edd4fed2d9e8163f53d086",
      "parents": [
        "d3b1e7a65c68d1cd4e1a44d7330772d66807c045"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 18:59:44 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 18:59:44 2026 -0400"
      },
      "message": "Update to remove false claim\n"
    },
    {
      "commit": "d3b1e7a65c68d1cd4e1a44d7330772d66807c045",
      "tree": "696d6c036b052c668ab7501555c67d4dda4c819f",
      "parents": [
        "b19e2035bc8d6895ab73a97585d6f0ce001f1ef1"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 08:09:59 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 08:09:59 2026 -0400"
      },
      "message": "Derive test-phase discovery from registered source roots\n\nReplace the shape-based fallback in findTestSourceDirectories with\nregistration-driven discovery: ask ModuleRootManager for the module\u0027s\nsource roots, keep the ones ProjectFileIndex.isInTestSourceContent\nreports as test content, and lift the direct child of src that contains\neach. This fixes two cases the shape-based rule got wrong:\n\n- A production root registered under src (e.g. src/generated/java as\n  SOURCE) is no longer lifted as a Tests node.\n- A custom phase registered as TEST_RESOURCE (e.g. src/smoke-test/\n  resources) is now found even without a Groovy/Java directory.\n\nThe conventional names (test, integration-test, functional-test) remain\nas a fallback for phases the module does not register, which is common\nbefore Gradle import.\n\nAlso adds a test for a test source root registered as a direct child\nof src (not a grandchild), and corrects the javadoc on\nfindTestSourceDirectories.\n"
    },
    {
      "commit": "b19e2035bc8d6895ab73a97585d6f0ce001f1ef1",
      "tree": "430cbb6acd9789437cb5cea73e858313c286e9f8",
      "parents": [
        "5a96362fe84a24902955693d7e48aa57697966b0"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 00:22:23 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Oct 06 00:22:23 2026 -0400"
      },
      "message": "Give Grails asset, translation, migration and test-root folders their own nodes\n\nThe Grails project view pane had no node for several directories that a\ngenerated app actually has, so they all collapsed into a single \"Other\nsources\" entry. This gives them dedicated nodes, and stops the nodes that\nnow own them from also claiming their contents.\n\nNew top-level nodes, each carrying the real directory as its location:\n\n  grails-app/i18n                  Translations\n  grails-app/assets/stylesheets    Stylesheets\n  grails-app/assets/images         Images\n  grails-app/assets/javascripts    JavaScripts\n  grails-app/utils                 Utils\n  grails-app/migrations            Migrations\n  grails-app/init                  Initialization\n  grails-app/conf                  Configuration\n\nRendered directory order is Images, JavaScripts, Stylesheets, Views,\nMigrations, Translations, Utils, Initialization, Configuration, Other\nsources, then src and the test roots. Services now sorts above\nControllers.\n\nThe Grails 3+ test source roots (src/test, src/integration-test,\nsrc/functional-test) are lifted out of the src node and titled with the\nGrails 2 phase labels, Tests:unit, Tests:integration and\nTests:functional, each with its real path as the location string. Test\nroots are discovered rather than matched against a fixed name list, so a\nproject\u0027s own testPhases entries are lifted too; src/main is never lifted.\n\nBecause those nodes own their directories now, the Other sources and src\nnodes must refuse to claim files beneath them, or Reveal in Project View\nexpands the node, finds nothing and dead-ends. PsiDirectoryNode.contains()\napplies a filter to the file itself only, never to its parent, so both\nnodes walk the file\u0027s ancestors to decide.\n\nThat consistency is structural, not incidental: GrailsViewItems holds the\nsingle definition of a directory being hidden from Other sources, and both\nthe filter and contains() consult it. One predicate means the two cannot\ndrift apart again, which is what the previous two implementations did.\n\nTwo corrections to Grails facts the code and docs had wrong:\n\n  - The kebab-case test roots are not a Grails 7 convention. They are the\n    Grails 3+ roots; IntegrationTestGradlePlugin has used\n    sourceFolderName \u003d \u0027src/integration-test\u0027 since Grails 3, and no Grails\n    version generates camelCase test roots.\n\n  - grails-forge does not generate grails-app/utils. GrailsBase creates no\n    grails-app/utils at all; the utils/.gitkeep comes from the legacy\n    grails-profiles/web/skeleton. Conversely init/ IS generated, by\n    grails-forge\u0027s GrailsApplication feature, which writes\n    grails-app/init/{packagePath}/Application.groovy and BootStrap.groovy.\n\nNode weights are now declared as literals in NodeWeights, including\nINTERCEPTORS_FOLDER and INIT_FOLDER, which were previously computed\nexpressions at their call sites and so invisible to NodeWeightsTest.\n\nTests assert rendered output rather than constant values: the ordering\ntests sort the real createNodes() output through GrailsNodeComparator, so\nthey catch a provider that stops emitting a node.\n\nLabelling a node needed a platform detail that no unit test could have\ncaught. PsiDirectoryNode builds the tree label from PresentationData\u0027s\ncoloured fragments, not from presentableText, and fills those fragments\nwith the directory\u0027s qualified path; setting presentableText therefore\nchanged nothing the renderer draws. GrailsPsiDirectoryNode now clears and\nre-adds the fragments in postprocess, the only hook that runs after the\nplatform has written the label. The rendering tests go through update()\nfor the same reason, and AGENTS.md records both traps under \"Project view\ngotchas\".\n\nUnrelated to the above, README.md\u0027s Requirements section said the plugin\n\"will not load in Community\", contradicting its own intro and\nCE-SUPPORT.md. It described the pre-content-module arrangement. Corrected\nto describe the current mechanism.\n"
    },
    {
      "commit": "32bb169466a1f8ad82b633d9f0c7cf4c3a66bd18",
      "tree": "ef187d8898f0aa0e1f211ab3e0fa8a8158599925",
      "parents": [
        "5a96362fe84a24902955693d7e48aa57697966b0"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 05 16:02:51 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 05 16:02:51 2026 -0400"
      },
      "message": "Resolve DetachedCriteria methods inside GORM where queries\n\nFrom GORM 4 on, where queries on a domain class come from the GormEntity\ntrait, and every GORM from 6.1 to Apache 8 declares where, whereAny,\nwhereLazy, find and findAll(Closure) without @DelegatesTo. GORM runs the\nclosure against a DetachedCriteria of the domain class, delegate first\n(GormStaticApi#where), but the IDE saw no delegate at all, so setAlias, eq,\nor and the other criteria methods neither resolved nor completed in\nPerson.where { }, and @CompileStatic code reported them as errors.\n\nDetachedCriteriaDelegatesToProvider now gives those closures a\nDetachedCriteria\u003cDomain\u003e delegate, DELEGATE_FIRST. Below GORM 4 the where\nmethods are light dynamic methods whose closures already get the criteria\nmethods from DetachedCriteriaClosureMemberProvider, so they are left alone.\nThe where query detection WhereQueryClosureMemberContributor used moves to\nDetachedCriteriaUtil so both share it.\n\nThe GormWhereQueryTest stubs declared @DelegatesTo(DetachedCriteria) on\nGormEntity, which real GORM never did and which hid this; they now match\nthe GORM signatures.\n"
    },
    {
      "commit": "5a96362fe84a24902955693d7e48aa57697966b0",
      "tree": "e8e1173fdb0ca3cf7d22ce1ce15bb9f274ab1794",
      "parents": [
        "de254c47055793f48019c644b671bceb93853cb3",
        "8571b2de684ab612e3509a78027f58ac4b54f40b"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 05 15:23:16 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 15:23:16 2026 -0400"
      },
      "message": "Merge pull request #437 from apache/validate-actions\n\nValidate GitHub Actions against the ASF approved list"
    },
    {
      "commit": "8571b2de684ab612e3509a78027f58ac4b54f40b",
      "tree": "e8e1173fdb0ca3cf7d22ce1ce15bb9f274ab1794",
      "parents": [
        "de254c47055793f48019c644b671bceb93853cb3"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 05 15:21:10 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Oct 05 15:21:10 2026 -0400"
      },
      "message": "Validate GitHub Actions against the ASF approved list\n\nPort grails-core\u0027s validateActions task, which checks every `uses:` entry\nin .github/workflows against apache/infrastructure-actions: actions/*,\ngithub/* and apache/* are auto-approved, anything else must be allowed at\nany version or pinned to a full SHA on the approved list. A trailing\nversion comment that disagrees with ASF\u0027s recorded tag is a warning.\n\nThe task lives in build-logic as a precompiled script plugin plus task\nclass, applied at the root and run by a new validate-actions workflow on\nworkflow changes and weekly, to catch a pinned SHA being delisted.\n\nDifferences from grails-core:\n- the allowlist URLs are task properties (defaulting to ASF) so the task\n  can be tested offline\n- docker:// references are skipped before the @ split, so a\n  digest-pinned image is no longer reported as an unapproved action\n- TestKit tests cover the policy; the root check now depends on\n  build-logic\u0027s check so they (and validatePlugins) run in CI\n"
    },
    {
      "commit": "de254c47055793f48019c644b671bceb93853cb3",
      "tree": "0eb74b1bfda3fa4779bc7be5de512d898bf0dac0",
      "parents": [
        "4e3fff214b8cdfd1748b6fa6c81cba4c5200acfd"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Oct 04 15:13:13 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Oct 04 15:13:13 2026 -0400"
      },
      "message": "Pin Gradle 9.8.0 in .sdkmanrc to match the wrapper\n\nDependabot bumped the wrapper to 9.8.0 but cannot update .sdkmanrc, so the\nsource distribution\u0027s gradle-bootstrap (and the verification scripts and\nDocker image that read .sdkmanrc) regenerated a 9.7.1 wrapper while CI\nreleased with 9.8.0. Bootstrapping with the new pin reproduces the committed\nwrapper byte for byte.\n\nCI now fails when the .sdkmanrc gradle pin and the wrapper distributionUrl\ndisagree, so the next wrapper bump cannot drift silently.\n\nThe Grails 8 importing test moves to Gradle 9.8.0 as well, which needs\nGrails 8.0.0-RC2: RC1\u0027s GrailsCliGradlePlugin calls Configuration.setVisible,\ndeprecated in 9.8.0, and these tests fail on deprecations.\n"
    },
    {
      "commit": "4e3fff214b8cdfd1748b6fa6c81cba4c5200acfd",
      "tree": "6931f70c68df8e16c7850142cfb33074b6a4b307",
      "parents": [
        "2416d8c352fd282f2cdcc2a4f57994fdc1b5fa08"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Oct 04 14:22:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 14:22:14 2026 -0400"
      },
      "message": "Increment to v263 to match intellij version"
    },
    {
      "commit": "2416d8c352fd282f2cdcc2a4f57994fdc1b5fa08",
      "tree": "795497a68c29d8e8c8b70af947486aac6b122892",
      "parents": [
        "45eb552c621c33cbacb044b04600929a07750c3c",
        "398ad1bb2a9ba2a960822f4625c082d28ab9a508"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Oct 04 10:46:53 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 10:46:53 2026 -0400"
      },
      "message": "Merge pull request #433 from fernando88to/main\n\nResolve domain properties inside GORM where queries"
    },
    {
      "commit": "398ad1bb2a9ba2a960822f4625c082d28ab9a508",
      "tree": "8294333cf0e495e77e14b11c34024f42835bd4cb",
      "parents": [
        "3fe27824e94c5549e42de575aad8b87ec3473a79"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Oct 04 10:20:02 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Oct 04 10:20:02 2026 -0400"
      },
      "message": "Keep explicit getter calls out of GORM where property resolution\n"
    },
    {
      "commit": "3fe27824e94c5549e42de575aad8b87ec3473a79",
      "tree": "d8bbd2935af6f77bd65bb2d03f532f626c8845b5",
      "parents": [
        "4bd15b5a822c278a66a40b8e011f5748946e4637"
      ],
      "author": {
        "name": "fernando henrique",
        "email": "fernando88to@gmail.com",
        "time": "Sun Oct 04 08:51:21 2026 -0300"
      },
      "committer": {
        "name": "fernando henrique",
        "email": "fernando88to@gmail.com",
        "time": "Sun Oct 04 08:51:21 2026 -0300"
      },
      "message": "Address review feedback on where query support.\n\nResolve where calls on a DetachedCriteria declared as a parameter or field, offer the domain properties in completion, and switch the test to English names.\n"
    },
    {
      "commit": "45eb552c621c33cbacb044b04600929a07750c3c",
      "tree": "e03c2902e14bbbfc1ff70d3ca0ca4fbe7937abaa",
      "parents": [
        "0c40c583a82d5796488ed1d24018885cf137cea3",
        "b86f5909a2a958f72b7feeeb11bcd97ebdc9e849"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sat Oct 03 23:01:37 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 23:01:37 2026 -0400"
      },
      "message": "Merge pull request #431 from apache/grails8-beans-dsl\n\nSupport the Grails 8 compile-time beans DSL"
    },
    {
      "commit": "b86f5909a2a958f72b7feeeb11bcd97ebdc9e849",
      "tree": "e03c2902e14bbbfc1ff70d3ca0ca4fbe7937abaa",
      "parents": [
        "a9fd382c8c11a4590ed64085fae79bc777c2eb76"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sat Oct 03 22:47:50 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sat Oct 03 22:47:50 2026 -0400"
      },
      "message": "Run the Community Edition tests on every pull request\n\nThe Community Edition job ran nightly or on demand only, so a pull request could break the plugin on IntelliJ IDEA Community without CI noticing. It now runs on every pull request and push as well, and still nightly to catch upstream Community changes.\n"
    },
    {
      "commit": "a9fd382c8c11a4590ed64085fae79bc777c2eb76",
      "tree": "85ea90ba86efe32c0659cb3cf23dceaf0be75b95",
      "parents": [
        "e208bffb325b0a65f805963a59d11858d50637f2"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sat Oct 03 22:47:50 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sat Oct 03 22:47:50 2026 -0400"
      },
      "message": "Align the beans DSL support with the Grails 8 compiler\n\nAddress the review of #431 against GlobalGrailsClassInjectorTransformation\nand GrailsBeansASTTransformation:\n\n- Recognise plugin descriptors as the compiler does, by a concrete class\n  named *GrailsPlugin, whatever it extends.\n- Without @GrailsBeans, claim a beans closure only when it looks like the\n  DSL, so an unrelated beans property is left alone.\n- Offer group only with a name, and not inside a group body.\n- Take the body only from the trailing closure of the outermost call.\n- Treat Foo.class as a type, and derive names from the resolved class, so\n  an import alias does not rename the bean.\n- Register .aliases(...) names with the bean, as Spring bean aliases.\n- Keep optional closure parameters optional on shared methods.\n- Search production sources only for hosts.\n- Cache the hosts\u0027 closures, declarations, shared members and bean\n  descriptors, giving the Spring model\u0027s recursion guard stable keys.\n"
    },
    {
      "commit": "4bd15b5a822c278a66a40b8e011f5748946e4637",
      "tree": "3b9f89df12d4b833b9b8257882fbafd8ee15662e",
      "parents": [
        "0c40c583a82d5796488ed1d24018885cf137cea3"
      ],
      "author": {
        "name": "fernando henrique",
        "email": "fernando88to@gmail.com",
        "time": "Sat Oct 03 10:11:51 2026 -0300"
      },
      "committer": {
        "name": "fernando henrique",
        "email": "fernando88to@gmail.com",
        "time": "Sat Oct 03 10:11:51 2026 -0300"
      },
      "message": "Resolve domain properties inside GORM where queries.\n\nBare property names in Person.where { active \u003d\u003d true } were left unresolved, which @GrailsCompileStatic reported as an error even though the code compiles. They now resolve through the getter, so navigation and rename go to the domain field.\n"
    },
    {
      "commit": "e208bffb325b0a65f805963a59d11858d50637f2",
      "tree": "ebeea698d3c847be9017e16cfc4c0c9bf5f26c2d",
      "parents": [
        "0c40c583a82d5796488ed1d24018885cf137cea3"
      ],
      "author": {
        "name": "Mattias Reichel",
        "email": "mattias.reichel@gmail.com",
        "time": "Fri Oct 02 14:48:06 2026 +0200"
      },
      "committer": {
        "name": "Mattias Reichel",
        "email": "mattias.reichel@gmail.com",
        "time": "Fri Oct 02 14:48:06 2026 +0200"
      },
      "message": "Support the Grails 8 compile-time beans DSL\n\nResolution, completion and documentation for the declarations of the\nbeans DSL and their qualifier chains, and for the field and method\nmembers shared by bean bodies. On Ultimate, the declared beans are\nregistered in the Spring model.\n\nFixes #430\n"
    },
    {
      "commit": "0c40c583a82d5796488ed1d24018885cf137cea3",
      "tree": "b1ac97508916be5ad10bd264fd80c3194f49796a",
      "parents": [
        "19fca5c9364d7a62056311dc5fa7af9b7c1c1241"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 02:49:10 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 02:49:10 2026 -0400"
      },
      "message": "do not reference test count in AGENTS\n"
    },
    {
      "commit": "19fca5c9364d7a62056311dc5fa7af9b7c1c1241",
      "tree": "7182bff856fcf6dbc1aa73cf7110e9dd362248c7",
      "parents": [
        "cfcc6855f2a46faacd7526d477d0697468c54f11",
        "05936054980dbd655ffb91ef4967347b81d3a384"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 02:10:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 02:10:44 2026 -0400"
      },
      "message": "Merge pull request #421 from apache/dependabot/gradle/build-logic/main/org.jetbrains.intellij.platform-intellij-platform-gradle-plugin-2.19.0\n\nBump org.jetbrains.intellij.platform:intellij-platform-gradle-plugin from 2.18.1 to 2.19.0 in /build-logic"
    },
    {
      "commit": "05936054980dbd655ffb91ef4967347b81d3a384",
      "tree": "7182bff856fcf6dbc1aa73cf7110e9dd362248c7",
      "parents": [
        "8f6e2d570c82825412041d7a0bbc83a9173dd448"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:49:12 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:49:12 2026 -0400"
      },
      "message": "Adapt the build to IntelliJ Platform Gradle Plugin 2.19.0\n\nTwo changes in 2.19.0 broke configuration of this build:\n\n* PublishPluginTask replaced its RegularFileProperty archiveFile with the\n  ConfigurableFileCollection archiveFiles when native plugin variants were\n  added, so the -PpublishArchive override in the intellij-plugin convention\n  failed with \"Could not set unknown property \u0027archiveFile\u0027\" as soon as any\n  task graph touched publishPlugin (./gradlew check buildPlugin). IPGP fills\n  archiveFiles with from() rather than a convention, so the override now\n  calls setFrom(), and only when the property is present.\n\n* The module plugin now tags each project dependency with\n  libraryelements\u003dcomposed-jar instead of forcing it on the whole classpath,\n  and keeps that compatible with a plain jar through its ComposedJarRule --\n  but only in the schema of projects that apply IPGP. The root project\u0027s\n  coverage aggregation resolves straight through :plugin to the plain library\n  projects, where the request matched nothing and surfaced as a capability\n  conflict (\"Cannot select module because of conflict with project ... Both\n  provide capability\") for every one of them. The coverage-aggregation\n  convention registers the same rule on the root schema.\n\nVerified with ./gradlew check buildPlugin (1104 tests), testCodeCoverageReport\n(instrumented classes still matched, non-zero coverage) and rat.\n"
    },
    {
      "commit": "8f6e2d570c82825412041d7a0bbc83a9173dd448",
      "tree": "7223023bd26acc9224e14a89554043bcd71f73e9",
      "parents": [
        "cfcc6855f2a46faacd7526d477d0697468c54f11"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 04:54:49 2026 +0000"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:38:54 2026 -0400"
      },
      "message": "Bump org.jetbrains.intellij.platform:intellij-platform-gradle-plugin\n\nBumps [org.jetbrains.intellij.platform:intellij-platform-gradle-plugin](https://github.com/JetBrains/intellij-platform-gradle-plugin) from 2.18.1 to 2.19.0.\n- [Release notes](https://github.com/JetBrains/intellij-platform-gradle-plugin/releases)\n- [Commits](https://github.com/JetBrains/intellij-platform-gradle-plugin/compare/2.18.1...2.19.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.jetbrains.intellij.platform:intellij-platform-gradle-plugin\n  dependency-version: 2.19.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "cfcc6855f2a46faacd7526d477d0697468c54f11",
      "tree": "047d7f9e6ad6377b9eecb67239f1491693dbde77",
      "parents": [
        "9794ff05fdafe82b812210a8ead26a5364206852",
        "b40209a6da1d63bd30dd9d19c73908b7f7ec0d46"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:30:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 01:30:25 2026 -0400"
      },
      "message": "Merge pull request #424 from fernando88to/main\n\nGrails 8 projects (Gradle 9) opened in IntelliJ were imported as plain Gradle projects,   not Grails projects:"
    },
    {
      "commit": "b40209a6da1d63bd30dd9d19c73908b7f7ec0d46",
      "tree": "a758527bf21085b360297d015f808eab2da37e23",
      "parents": [
        "d2c9c91959c4837ffe7bb8362869cb82772144f9"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:19:20 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:19:20 2026 -0400"
      },
      "message": "Report an unresolvable Grails shell in the Build tool window and tag the new importing tests\n\n- findResolvedVersion returned null whenever compileClasspath existed (an inverted null check\n  left over from debugging), so the grails-core fallback never ran and a project without a\n  grailsVersion property lost its Grails support.\n- The model builder now extends AbstractModelBuilderService so that a shell it cannot resolve\n  is reported through the ModelBuilderContext message reporter as a Build tool window warning,\n  naming the coordinates and the repository to add, instead of a line in the Gradle log only.\n  The Grails 8 import test asserts the message in the sync view.\n- GradleApacheGrailsImportingTest and GradleGrails6ImportingTest carry\n  @Category(UltimateOnlyTest.class) like GradleGrailsImportingTest, so the Community Edition\n  test task keeps skipping the importers built on the Gradle test framework.\n- The Grails 8 import test pins 8.0.0-RC1 on Gradle 9.7.1, the Gradle its shell depends on,\n  and leaves out the grails-gsp plugin: the RC1 GroovyPagePlugin trips a Gradle 10\n  deprecation under the \"fail\" warning mode the importing tests run with.\n"
    },
    {
      "commit": "d2c9c91959c4837ffe7bb8362869cb82772144f9",
      "tree": "aaaa48f9602288d43ed235ebfe3beb83b6bb090f",
      "parents": [
        "3f666a17ca771c8544a5f0d744e9fb3b3f3ea4b5",
        "843d6cb1dcb96603fcce308464390103baeee1a9"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:08:34 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 01:19:20 2026 -0400"
      },
      "message": "Merge apache/grails-intellij-plugin main into the Gradle 9 detection branch\n"
    },
    {
      "commit": "9794ff05fdafe82b812210a8ead26a5364206852",
      "tree": "e6219b1bd8447a9ac02e24732eb14efaaaafd648",
      "parents": [
        "cafdbb80ec74742b60f3f0a1bf06e0866bb3323f",
        "3e1f140272921ed48f42848864ab8f4c24e6d569"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:53:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:53:52 2026 -0400"
      },
      "message": "Merge pull request #418 from apache/dependabot/github_actions/main/github/codeql-action/init-4.38.0\n\nBump github/codeql-action/init from 4.37.9 to 4.38.0"
    },
    {
      "commit": "cafdbb80ec74742b60f3f0a1bf06e0866bb3323f",
      "tree": "e90a9c622667386df8e019c9dfd42f11ada424d2",
      "parents": [
        "b8ea106b445ad53822890d3fa7950d6ed6598852",
        "c611bfd96e6c0dc993f0bd92d4eef1508f1fb7c7"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:53:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:53:43 2026 -0400"
      },
      "message": "Merge pull request #27 from apache/dependabot/github_actions/main/gradle/actions/setup-gradle-6.3.0\n\nBump gradle/actions/setup-gradle from 6.2.0 to 6.3.0"
    },
    {
      "commit": "b8ea106b445ad53822890d3fa7950d6ed6598852",
      "tree": "e90a9c622667386df8e019c9dfd42f11ada424d2",
      "parents": [
        "6b14c4ba4b7bbcbe0c5b5f830ef5dacaf359fcf3",
        "183396bef2d8072772bbd17ba9de7c77adcf1f12"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:53:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:53:35 2026 -0400"
      },
      "message": "Merge pull request #417 from apache/dependabot/github_actions/main/actions/setup-java-6.0.1\n\nBump actions/setup-java from 6.0.0 to 6.0.1"
    },
    {
      "commit": "183396bef2d8072772bbd17ba9de7c77adcf1f12",
      "tree": "99017b8c81f7bb6114ce12d99961d994e026d857",
      "parents": [
        "280b4d661ad8b275f1893f474f39ef9b3fbdee0d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 04:53:22 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 04:53:22 2026 +0000"
      },
      "message": "Bump actions/setup-java from 6.0.0 to 6.0.1\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 6.0.0 to 6.0.1.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/dd06d9cba3e5552c54d9f8ea23572deb30010f7c...de7274f081f381c8f8158605e0321c36c376e2e6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 6.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "6b14c4ba4b7bbcbe0c5b5f830ef5dacaf359fcf3",
      "tree": "072d62ec7905cd09e18664b917f0b7dc4e083d1a",
      "parents": [
        "280b4d661ad8b275f1893f474f39ef9b3fbdee0d",
        "f679ba385bc6aecca266afc4d1836cd9089f87ae"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:53:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:53:11 2026 -0400"
      },
      "message": "Merge pull request #419 from apache/dependabot/github_actions/main/github/codeql-action/analyze-4.38.0\n\nBump github/codeql-action/analyze from 4.37.9 to 4.38.0"
    },
    {
      "commit": "280b4d661ad8b275f1893f474f39ef9b3fbdee0d",
      "tree": "4f46adbceee373263c47d7e4003ec58210d1686c",
      "parents": [
        "843d6cb1dcb96603fcce308464390103baeee1a9",
        "558e9c7c7fb36fff4b18d25f3c0d31663a098fa5"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:52:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:52:58 2026 -0400"
      },
      "message": "Merge pull request #420 from apache/dependabot/gradle/build-logic/main/org.nosphere.apache.rat-org.nosphere.apache.rat.gradle.plugin-0.11.0\n\nBump org.nosphere.apache.rat:org.nosphere.apache.rat.gradle.plugin from 0.8.2 to 0.11.0 in /build-logic"
    },
    {
      "commit": "843d6cb1dcb96603fcce308464390103baeee1a9",
      "tree": "3ab496e8d3be62d61d4742c2be7a4e86c1f9bb2a",
      "parents": [
        "05566d991d54e33d3216c50cdb08aa27b5c1257d",
        "c9929f7c806db997afaf423b01e8fad5b0a12bf8"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:52:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:52:44 2026 -0400"
      },
      "message": "Merge pull request #423 from apache/dependabot/github_actions/main/codecov/codecov-action-7.1.1\n\nBump codecov/codecov-action from 7.0.0 to 7.1.1"
    },
    {
      "commit": "05566d991d54e33d3216c50cdb08aa27b5c1257d",
      "tree": "28bfbfe27847a24e1037cc1e0b07b18bd04fbe5b",
      "parents": [
        "8223ffe5927a85f174e0620f828d66ba1068f840",
        "0664ccaf944d0c2e601d6795e2911521f976f4f4"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:51:26 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:51:26 2026 -0400"
      },
      "message": "Merge pull request #426 from apache/dependabot/gradle/main/gradle-wrapper-9.8.0\n\nBump gradle-wrapper from 9.7.1 to 9.8.0"
    },
    {
      "commit": "8223ffe5927a85f174e0620f828d66ba1068f840",
      "tree": "1970a58af8d56e96f56f2f0a920932cea58b8373",
      "parents": [
        "ecc4b771359113bd17288bdf7d7297c985dd665f",
        "c338a0905cebeff88f41a67e4e35e70150801b73"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:50:56 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 00:50:56 2026 -0400"
      },
      "message": "Merge pull request #427 from apache/intellij-ce-support\n\nIntellij CE support"
    },
    {
      "commit": "c338a0905cebeff88f41a67e4e35e70150801b73",
      "tree": "1970a58af8d56e96f56f2f0a920932cea58b8373",
      "parents": [
        "7e5e94cccaa1a89ac2d1bdde93b5eb6e94ecfbc6"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:48:38 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:48:38 2026 -0400"
      },
      "message": "Make JaCoCo see the plugin classes the tests actually run\n\nCodecov has reported 0% for the whole project because the coverage data\nnever contained a single plugin class. Two JaCoCo defaults are wrong for an\nIntelliJ plugin, and either one alone yields 0% for every class rather than an\nerror:\n\n- The tests load the plugin from the sandbox jars, which IPGP builds from the\n  instrumented classes (instrumentCode adds the @NotNull assertions). JaCoCo\n  keys execution data by class identity, so a report analysing build/classes\n  matches nothing. The per-project reports and the root aggregate now analyse\n  build/instrumented/instrumentCode where that task exists, and the plain\n  classes elsewhere.\n- IntelliJ\u0027s plugin class loaders define classes without a code-source\n  location, which the JaCoCo agent skips by default; the exec file held only\n  the Gradle test-worker classes. The Test tasks now set\n  includeNoLocationClasses, excluding jdk.internal.* as JaCoCo recommends.\n\nThe three new content modules join the aggregate, and AGENTS.md records both\nsettings. With the full suite the aggregate now reports 60% line coverage.\n"
    },
    {
      "commit": "7e5e94cccaa1a89ac2d1bdde93b5eb6e94ecfbc6",
      "tree": "ed3ab4d2728b5f549a704239a02529be30529b2e",
      "parents": [
        "2f6a2a7d33abb13590da5ecbff65ca9f5c7a23c6"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:28:25 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Oct 01 00:28:25 2026 -0400"
      },
      "message": "Update the documented test counts after merging #429\n"
    },
    {
      "commit": "2f6a2a7d33abb13590da5ecbff65ca9f5c7a23c6",
      "tree": "92e1559c83019b3accdd5bf319e12dc051eec66b",
      "parents": [
        "d2878b29dbd46a33dc676d032259f0edd710dd5b"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Wed Sep 30 22:53:58 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Wed Sep 30 22:53:58 2026 -0400"
      },
      "message": "Record the stale-build trap in the Common Issues table\n\nSwitching plugin builds does not rebuild them, so the sandbox keeps running the\nprevious classes and working code looks broken. Record the rebuild step and the\nusual tell: the Grails project view pane, which is only added once an\napplication is detected.\n"
    },
    {
      "commit": "d2878b29dbd46a33dc676d032259f0edd710dd5b",
      "tree": "0e263da253a4d9c73fc835748cbe8556f35fe610",
      "parents": [
        "37749e4414e6c0844b7dc4f853bdde6f3639797b"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Wed Sep 30 22:51:35 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Wed Sep 30 22:51:35 2026 -0400"
      },
      "message": "Never swallow IntelliJ control-flow exceptions in the guarded paths\n\nProcessCanceledException is a RuntimeException, so a broad catch sees it and\nthen logs, wraps or returns a fallback from it. That breaks cooperative\ncancellation, and the platform reports the swallowed cancellation as a plugin\nerror in its own right.\n\nControlFlowGuard is now the single place that recognises a ControlFlowException.\nFive call sites consult it before doing anything else:\n\n- GrailsApplicationProvider: a provider broken by an optional content module no\n  longer disables Grails detection outright - the remaining providers are still\n  tried, and the failure is logged once as a WARN that names the provider and\n  the root. A cancelled scan unwinds as a cancellation instead of looking like a\n  failed one.\n- GrailsConsole: the cancellation propagates, but myExecuting is released and the\n  process queue drained from a finally block, so a cancelled command cannot leave\n  the console permanently busy and queue every later command behind a queue\n  nothing drains again.\n- GrailsMethodNamedArgumentReferenceProvider: a cancellation arriving inside an\n  InvocationTargetException is re-thrown unchanged rather than wrapped twice.\n  Genuine reflective failures keep the RuntimeException wrap, which createRef\u0027s\n  signature requires.\n"
    },
    {
      "commit": "37749e4414e6c0844b7dc4f853bdde6f3639797b",
      "tree": "97a42605157d08cca16fcd881b2a4293b03244aa",
      "parents": [
        "5fe4ba4bbf74072e60e3bdbaf2b77cd0b169d239"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 17:38:33 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 17:44:03 2026 -0400"
      },
      "message": "Keep the Grails Forge wizard linking on IntelliJ 2026.3\n\nIntelliJ 2026.3 moved the web-starter API from Jackson 2 to Jackson 3, so\nWebStarterModuleBuilder.loadJsonData now returns tools.jackson.databind.JsonNode\ninstead of com.fasterxml.jackson.databind.JsonNode. The return type is part of\nthe JVM method descriptor, so the three calls in GrailsForgeModuleBuilder that\ncompile against 2026.2 do not link on 2026.3, which is what the Plugin Verifier\nhas been failing on for every build since the 2026.3 EAP entered the\nrecommended set.\n\nBoth releases still bundle Jackson 2, so the builder now performs the request\nitself through HttpRequests and parses the response with a Jackson 2\nObjectMapper, mirroring what the platform helper does. The existing JsonNode\ntraversal is unchanged.\n"
    },
    {
      "commit": "5fe4ba4bbf74072e60e3bdbaf2b77cd0b169d239",
      "tree": "a623de235d16ea7b7b8ec6626d2235e562bfae3d",
      "parents": [
        "c0b741e3813bd5cd580780c7e5549203a00ab844"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:21:58 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:21:58 2026 -0400"
      },
      "message": "Avoid two deprecated platform calls in the new code\n\nReadAction.compute and ExtensionPointName.addChangeListener are deprecated in\n2026.2; Application.runReadAction and the change listener on the extension\npoint itself are the supported equivalents. Both were flagged by the Ultimate\nPlugin Verifier run for this branch.\n"
    },
    {
      "commit": "c0b741e3813bd5cd580780c7e5549203a00ab844",
      "tree": "ef3a3900d67bffd27861d76411fefaa4324ff89a",
      "parents": [
        "2611846b9543581354dd59431bfd45cb4d4e73da"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:17:33 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:17:33 2026 -0400"
      },
      "message": "Allow the Community Edition CI job to run on demand\n\nThe job is nightly-only because it downloads the IdeaIC distribution; letting\n\"Run workflow\" trigger it too means a branch can be checked on Community\nEdition before it is merged, instead of waiting for the first nightly run.\n"
    },
    {
      "commit": "2611846b9543581354dd59431bfd45cb4d4e73da",
      "tree": "98be4d4e0cb231ab2288fd145258dfd38875556f",
      "parents": [
        "f3630953ece277a5c19140c056ab5ad038a363ab"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:10:42 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:10:42 2026 -0400"
      },
      "message": "Show why Grails support is off when the Gradle import failed\n\nGrails 3+ applications are only recognised from the data a successful Gradle\nimport produces, so a broken build script silently turns off the Grails view,\nthe console and all GSP support, which users read as a broken plugin.\n\nGrailsGradleSyncStatus tracks, per linked Gradle project, whether the last\nresolve or data import failed (from ExternalSystemTaskNotificationListener and\nProjectDataImportListener) or whether no successful import exists at all, and\nknows which grails-app folders that leaves unrecognised. Three indicators ask\nit:\n\n- the Grails project view pane stays visible and lists each such folder as a\n  warning node with the reason and the first line of the Gradle error;\n  double-clicking it reloads the Gradle project,\n- files under such a grails-app folder get an editor banner with \"Reload\n  Gradle Project\" and \"Show Build Output\" actions,\n- a one-shot balloon appears when an import fails for a project that has a\n  grails-app folder.\n\nA project whose latest import failed but that still has data from an earlier\nsuccessful one keeps working with that data, so nothing is reported for it.\n"
    },
    {
      "commit": "f3630953ece277a5c19140c056ab5ad038a363ab",
      "tree": "ce60b88f689727f08a430272aac20b71841b11c3",
      "parents": [
        "5fc4bdab8b73226227b46774f75641bee3cc25e5"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:10:35 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 30 15:10:35 2026 -0400"
      },
      "message": "Community Edition support via content modules for the Ultimate integrations\n\nRework of PR #422. The plugin stays a single ZIP that loads on IntelliJ IDEA\nCommunity Edition 2026.2+ with a reduced feature set, while Ultimate keeps\nevery feature it had.\n\nWhy the PR\u0027s design could not do that: a plugin-id dependency only exposes\nthat plugin\u0027s main module to the class loader, and the Ultimate plugins keep\ntheir classes in content modules (WebFacet in intellij.javaee.web, the Spring\nAPI in intellij.spring, DataSourceDetector in intellij.database). One optional\n\u003cdepends\u003e on com.intellij.javaee therefore left the web facet provider, the\ndata-source detector, the GORM persistence bridge and the EL highlighting\nunresolvable on Ultimate, and the Spring integration was deleted outright on\nthe incorrect premise that it was already broken. Neither the test suite\n(flat classpath) nor the Ultimate verifier (follows content-module\ndependencies) can see any of this; only runIde and the Community verifier do.\n\n- Spring integration restored as the content module pluginModules/spring,\n  which declares com.intellij.spring plus the intellij.spring and\n  intellij.spring.core modules. A new extension point,\n  org.intellij.grails.namedArgumentReferenceContributor, lets it add its\n  bean-name references to the shared named-argument provider.\n- Web facet provider and data-source detector moved into pluginModules/javaee\n  and pluginModules/database with exact plugin and module dependencies.\n- GORM persistence classes moved into pluginModules/hibernate, which now\n  declares com.intellij.persistence and com.intellij.javaee.jpa itself.\n- The main jar compiles against the Community API only; JavaScript, CSS and\n  EL stay behind class-presence guards and \u003cdepends optional\u003d\"true\"\u003e.\n- The JetBrains Ultimate verifier call in GspFileType is removed, the JSP\n  guards keyed on the Marketplace plugin id revert to main\u0027s behaviour, and\n  the servlet class names are plain constants.\n- verifyPlugin -PplatformEdition\u003dIC verifies the ideaIC distribution instead\n  of the Ultimate set, fails on unresolved classes outside the committed list\n  of guarded usages and on any unresolved required dependency; the nightly\n  job runs it together with testIdeCe.\n- Unrelated changes from the PR (project-view nodes and ordering, control\n  flow guards, provider hardening, version bump) are left out for separate\n  PRs. CE-SUPPORT.md describes the module design; AGENTS.md gains the rule.\n\nVerified: 1069 Ultimate tests, 996 Community-sandbox tests, Plugin Verifier\ncompatible on IU and IC 2026.2 (the 2026.3 EAP report is unchanged from\nmain), RAT clean.\n"
    },
    {
      "commit": "5fc4bdab8b73226227b46774f75641bee3cc25e5",
      "tree": "eafa340f42cd7130a3b4707878f7da202aff2ea7",
      "parents": [
        "03bef1505bf29173851350dc9553f52805a0b45f",
        "ecc4b771359113bd17288bdf7d7297c985dd665f"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Wed Sep 30 07:24:58 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Wed Sep 30 07:24:58 2026 -0400"
      },
      "message": "Merge remote-tracking branch \u0027origin/main\u0027 into feature/community-edition-support\n\n# Conflicts:\n#\tgradle.properties\n"
    },
    {
      "commit": "03bef1505bf29173851350dc9553f52805a0b45f",
      "tree": "72ec08df8555cb0f374bb3555f5896db892e4460",
      "parents": [
        "ce2962c633498aa7754c4754b6f813b296d74c86"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Sep 29 19:32:06 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Tue Sep 29 19:32:06 2026 -0400"
      },
      "message": "Bump version to 262.2.1-SNAPSHOT\n\nAdvance the project version to 262.2.1-SNAPSHOT, tracking the\n2026.2 platform line (platformVersion 2026.2.2, sinceBuild\n262.10315.125).\n"
    },
    {
      "commit": "0664ccaf944d0c2e601d6795e2911521f976f4f4",
      "tree": "c8277933c179c8911b34c06de8e52b3625ae98ea",
      "parents": [
        "ecc4b771359113bd17288bdf7d7297c985dd665f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 22:15:17 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 22:15:17 2026 +0000"
      },
      "message": "Bump gradle-wrapper from 9.7.1 to 9.8.0\n\nBumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.7.1 to 9.8.0.\n- [Release notes](https://github.com/gradle/gradle/releases)\n- [Commits](https://github.com/gradle/gradle/compare/v9.7.1...v9.8.0)\n\n---\nupdated-dependencies:\n- dependency-name: gradle-wrapper\n  dependency-version: 9.8.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "ce2962c633498aa7754c4754b6f813b296d74c86",
      "tree": "39e6a9e0b473589deb29d56f2543b50ee0150576",
      "parents": [
        "2a0d3e1905af52d45f1b7e8a260f063343f34a4e"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Mon Sep 28 00:29:23 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Mon Sep 28 00:29:23 2026 -0400"
      },
      "message": "Stop swallowing IntelliJ control-flow exceptions in broad catch blocks\n\nProcessCanceledException extends CancellationException, so it is a plain\nRuntimeException: every catch(RuntimeException) and catch(Throwable) written to\nprotect an optional code path also captures a cooperative cancellation, logs it\nand answers with a fallback. The platform reports a logged ProcessCanceledException\nback as a plugin error, so a cancelled scan looks like a broken one.\n\nControlFlowGuard is the one place that recognises ControlFlowException, a marker\ninterface, so the test covers more than ProcessCanceledException alone, and it\nre-throws unchanged and never wrapped. Apply it where a cancellation is actually\nreachable: the Grails application provider scan, whose only caller runs inside\nReadAction.nonBlocking; the Grails console onDone handler; the reflective\nprovider construction in named-argument reference resolution, where the JVM\ndelivers the cancellation inside an InvocationTargetException; and\nUltimatePluginGuard\u0027s reflective reads.\n\nEach guard goes after the state its catch block owns. GrailsConsole released\nmyExecuting and drained the process queue after the catch rather than in a\nfinally, so a propagated cancellation left the console permanently marked busy\nand every later command queued behind a queue nothing drained. GrailsConsoleTest\ncovers that and fails without the finally.\n\nDeliberately not applied everywhere: ensureScriptExists,\nMvcPluginUtil.parsePluginList, setProxyOld and GrailsModuleBuilder.setupModule do\nno cancellable work, and a guard there is noise that teaches the next reader to\npaste it everywhere.\n\nTwo smaller corrections ride along. The Grails application provider logs are now\nterse: their actionable copy and issues URL only ever reached idea.log, addressed\nto a user who never sees them. And ControlFlowGuard.unwrapControlFlow had no\ncaller, so it is gone rather than waiting for one.\n\nThe gradle.properties and plugin/build.gradle comments that pointed into tasks/\nnow stand alone, since a fresh checkout of this repository has no such directory.\nAGENTS.md\u0027s stale test counts are corrected against a full run, along with the\nclaim that test.idea.home.path lives in gradle.properties, which it does not.\n"
    },
    {
      "commit": "ecc4b771359113bd17288bdf7d7297c985dd665f",
      "tree": "ecdd694658b41d55d6ab741049e790f3fe27272f",
      "parents": [
        "e923df9eac3a13e5d56b949c35a409d9c5f9b760"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Sep 28 00:00:34 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Sep 28 00:00:45 2026 -0400"
      },
      "message": "Document website instructions\n"
    },
    {
      "commit": "e923df9eac3a13e5d56b949c35a409d9c5f9b760",
      "tree": "84b2dde2248350c3908b5e0fd727afac08fe1031",
      "parents": [
        "afec5f5592e847a5b865a7f1cce29e720f1cada4"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Sep 27 23:34:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 23:34:44 2026 -0400"
      },
      "message": "Upcase SVN Folder name"
    },
    {
      "commit": "afec5f5592e847a5b865a7f1cce29e720f1cada4",
      "tree": "3bf0545c18e9c05142e4b32b30c30dcc0294601a",
      "parents": [
        "ac1356c4f10daa18a7e21897a331e2e19840bb9b",
        "257df714730c26d6ef4a6fdefbfed0464546d8bd"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sun Sep 27 23:30:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 23:30:25 2026 -0400"
      },
      "message": "Merge pull request #425 from apache/merge-back-262.1.1\n\nchore: merge 262.1.1-\u003emain; bump to 262.1.2-SNAPSHOT"
    },
    {
      "commit": "257df714730c26d6ef4a6fdefbfed0464546d8bd",
      "tree": "3bf0545c18e9c05142e4b32b30c30dcc0294601a",
      "parents": [
        "ac1356c4f10daa18a7e21897a331e2e19840bb9b"
      ],
      "author": {
        "name": "jdaugherty",
        "email": "jdaugherty@users.noreply.github.com",
        "time": "Mon Sep 28 03:29:02 2026 +0000"
      },
      "committer": {
        "name": "jdaugherty",
        "email": "jdaugherty@users.noreply.github.com",
        "time": "Mon Sep 28 03:29:02 2026 +0000"
      },
      "message": "[skip ci] Bump version to 262.1.2-SNAPSHOT\n"
    },
    {
      "commit": "2a0d3e1905af52d45f1b7e8a260f063343f34a4e",
      "tree": "1d7c378d8c96fc74be2e37bbc94b305991b14350",
      "parents": [
        "18ee29ffca66053f7881c809e5d96bb81f133f40",
        "ac1356c4f10daa18a7e21897a331e2e19840bb9b"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sun Sep 27 21:23:46 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sun Sep 27 21:23:46 2026 -0400"
      },
      "message": "Merge branch \u0027main\u0027 (ac1356c) into feature/community-edition-support\n"
    },
    {
      "commit": "3f666a17ca771c8544a5f0d744e9fb3b3f3ea4b5",
      "tree": "f707605af1c4d391ba0ac5d2d1b6f26d01a59788",
      "parents": [
        "ac1356c4f10daa18a7e21897a331e2e19840bb9b"
      ],
      "author": {
        "name": "fernando henrique",
        "email": "fernando88to@gmail.com",
        "time": "Sun Sep 27 10:07:16 2026 -0300"
      },
      "committer": {
        "name": "fernando henrique",
        "email": "fernando88to@gmail.com",
        "time": "Sun Sep 27 10:07:16 2026 -0300"
      },
      "message": "Detect Grails 6,7 and 8 projects on Gradle 9 and create their run configuration.\n\nThe Gradle model builder failed on Gradle 9, so Grails 8 projects were not\n  recognized as Grails projects: no Grails run configuration, no \"New Grails\n  Controller\", and Ctrl+Alt+G did nothing.\n\n  - Resolve the Grails shell through a detached configuration. Gradle 9 rejects\n    copy() on the declarable-only \u0027implementation\u0027 configuration.\n  - Read grailsVersion with findProperty(). getProperties() emits Gradle 9\n    deprecation warnings.\n  - When grailsVersion is not set, take the version from the resolved\n    grails-core dependency, since the detached configuration gets no BOM.\n  - Keep the module a Grails module when the shell cannot be resolved (e.g.\n    org.grails:grails-shell was never published for 6.2.0). Only the Grails\n    command executor becomes unavailable.\n  - Offer Grails run configurations for Grails 6+ whenever the shell was\n    resolved, instead of never. run-app is created automatically on project\n    open again.\n\nFixes #396\n"
    },
    {
      "commit": "ac1356c4f10daa18a7e21897a331e2e19840bb9b",
      "tree": "dcd560adfccd4275bb2c5f2e1aebac47f807ee60",
      "parents": [
        "62525ade3632ad064acc8be0be0ec4817485ff0e"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 18:45:17 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 18:45:17 2026 -0400"
      },
      "message": "verification fixes\n"
    },
    {
      "commit": "62525ade3632ad064acc8be0be0ec4817485ff0e",
      "tree": "42398e50f1f2570f337e6aebd2d09f8eedf612d9",
      "parents": [
        "254fd461cd8a5e39f05fb1271b38060bf9b64a1c"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 17:56:16 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 17:56:16 2026 -0400"
      },
      "message": "Trim whitespace from the abort release tag input\n\nA trailing space in the release_tag workflow_dispatch input made every\nlookup in the abort miss its target: the dist/dev path, the GitHub\nRelease and the tag ref were all queried with the space still attached.\nEach removal is a no-op when its target is missing, so the run reported\nsuccess having deleted nothing.\n\nNormalise the input once up front, reject anything that is not a release\ntag, stop swallowing the tag deletion error, and verify at the end that\nthe staged artifacts, the GitHub Release and the tag are really gone.\n"
    },
    {
      "commit": "254fd461cd8a5e39f05fb1271b38060bf9b64a1c",
      "tree": "d9fa2c7772d1d413c92e987b0c0def6478107b73",
      "parents": [
        "28edcc81507d4b4767c5c794946c86d48dfdaf55"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 17:51:12 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 17:51:44 2026 -0400"
      },
      "message": "Fix build reproducibility issues\n"
    },
    {
      "commit": "28edcc81507d4b4767c5c794946c86d48dfdaf55",
      "tree": "a50aa02794822c555d92d3bd2856fb7ff8260e86",
      "parents": [
        "bf2a7feb51b2687f200caa1ba6302e36f403d116"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 12:35:01 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 12:35:01 2026 -0400"
      },
      "message": "Switch to snapshot"
    },
    {
      "commit": "bf2a7feb51b2687f200caa1ba6302e36f403d116",
      "tree": "8ddb2290a58101cfdde2ec1049cfe1beb71a2c9f",
      "parents": [
        "5ec9ac497293fcb8478b7db6e7fae7ef2360bbe9"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 12:14:30 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 23 12:14:30 2026 -0400"
      },
      "message": "Fix verification scripts\n"
    },
    {
      "commit": "c9929f7c806db997afaf423b01e8fad5b0a12bf8",
      "tree": "f0795b2d0cdd2f09d8c3a849677606a732400852",
      "parents": [
        "5ec9ac497293fcb8478b7db6e7fae7ef2360bbe9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 20 22:13:51 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 22:13:51 2026 +0000"
      },
      "message": "Bump codecov/codecov-action from 7.0.0 to 7.1.1\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 7.0.0 to 7.1.1.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/fb8b3582c8e4def4969c97caa2f19720cb33a72f...303a32d7a59b442fa8d48b6a1cc6825c09c847a5)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: 7.1.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "558e9c7c7fb36fff4b18d25f3c0d31663a098fa5",
      "tree": "57de70045aa2691b336931666f5f0cc275075a0f",
      "parents": [
        "5ec9ac497293fcb8478b7db6e7fae7ef2360bbe9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 14 22:15:08 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 22:15:08 2026 +0000"
      },
      "message": "Bump org.nosphere.apache.rat:org.nosphere.apache.rat.gradle.plugin\n\nBumps org.nosphere.apache.rat:org.nosphere.apache.rat.gradle.plugin from 0.8.2 to 0.11.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.nosphere.apache.rat:org.nosphere.apache.rat.gradle.plugin\n  dependency-version: 0.11.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "18ee29ffca66053f7881c809e5d96bb81f133f40",
      "tree": "450499b5ea7ad51e93cf3d09b7ee1a1a26ed50ac",
      "parents": [
        "cb0a0b0c1716b05da52ca5aad2e34b46ca0c12cb"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Mon Sep 14 13:36:30 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Mon Sep 14 13:36:30 2026 -0400"
      },
      "message": "Add Translations/assets view nodes and drop Spring-only integration\n\nRemove the Ultimate-only Spring Support integration so the plugin no longer\ndepends on com.intellij.spring: delete the spring package classes, the\nspring/maven/hibernate *-integration.xml extensions and their bundled-plugin\ndependencies, and register the Spring-free GrailsResourcesGroovyMemberContributor\nfor all editions. Reclassify GrailsSpringDSLTest to run on Community Edition.\n\nShow grails-app/i18n as a Translations node and the assets subfolders as\nStylesheets/Images/JavaScripts nodes, weighted so handlers sort before\ndirectories and Services sit above Controllers; hide these plus views/conf/init\nfrom the generic Other node.\n\nMake GrailsApplicationProvider tolerate a failing provider extension.\n\nUpdate README, CE-SUPPORT.md, AGENTS.md, and IMPROVEMENT-PLAN.md.\n"
    },
    {
      "commit": "f679ba385bc6aecca266afc4d1836cd9089f87ae",
      "tree": "7ce91ec48523fd0aad077f8506ae69726894cde6",
      "parents": [
        "5ec9ac497293fcb8478b7db6e7fae7ef2360bbe9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 13 22:14:40 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 13 22:14:40 2026 +0000"
      },
      "message": "Bump github/codeql-action/analyze from 4.37.9 to 4.38.0\n\nBumps [github/codeql-action/analyze](https://github.com/github/codeql-action) from 4.37.9 to 4.38.0.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/cdf488f595d80d6e07e03d4674febd5ab45fa938...b96794f015dfd88f77b49b1c93e0fa7110f94c63)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.38.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "3e1f140272921ed48f42848864ab8f4c24e6d569",
      "tree": "8be32ece82e04945c29b52a5d11181a239ade48a",
      "parents": [
        "5ec9ac497293fcb8478b7db6e7fae7ef2360bbe9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 13 22:13:57 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 13 22:13:57 2026 +0000"
      },
      "message": "Bump github/codeql-action/init from 4.37.9 to 4.38.0\n\nBumps [github/codeql-action/init](https://github.com/github/codeql-action) from 4.37.9 to 4.38.0.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/cdf488f595d80d6e07e03d4674febd5ab45fa938...b96794f015dfd88f77b49b1c93e0fa7110f94c63)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.38.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "cb0a0b0c1716b05da52ca5aad2e34b46ca0c12cb",
      "tree": "41d148165517950ad021d2c8da376f7426adbecc",
      "parents": [
        "05e771e3bcfaa0dcfdfe064419037125caf65282"
      ],
      "author": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sat Sep 12 21:54:52 2026 -0400"
      },
      "committer": {
        "name": "aaron",
        "email": "amondel2@gmail.com",
        "time": "Sat Sep 12 21:54:52 2026 -0400"
      },
      "message": "Keep the tasks/ planning documents out of the repository\n"
    }
  ],
  "next": "05e771e3bcfaa0dcfdfe064419037125caf65282"
}
