)]}'
{
  "log": [
    {
      "commit": "9c83647be916ef6740f8864d8f5197338215d9c7",
      "tree": "6006b8599fc2cbda097f9384dd920e552b67dcc8",
      "parents": [
        "692766c0ca1c6232702f5289a21ba5a7aca41775"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Sat Aug 01 07:18:07 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 01 07:18:07 2026 +0000"
      },
      "message": "Post-release 262.19039.1: changelog + bump to 262.19043.1 (#133)\n\nCo-authored-by: GitHub Action \u003caction@github.com\u003e"
    },
    {
      "commit": "692766c0ca1c6232702f5289a21ba5a7aca41775",
      "tree": "21ff059267561f65bcfa6a02d981e81bacb89ffa",
      "parents": [
        "e09fd34155dc3e9c26b2c479d9f76fc0e25f7b52"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Jul 27 11:51:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 09:51:58 2026 +0000"
      },
      "message": "Clear Show Diagram Plugin Verifier deprecated APIs (#132)\n\n* docs: design for Show Diagram deprecated API cleanup\n\nCapture the approved plan to drop the deprecated Point createNodeComponent\noverride and migrate remaining ReadAction.compute call sites.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: plan for Show Diagram deprecated API cleanup\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): migrate leftover ReadAction.compute call sites\n\nUse ReadAction.nonBlocking().executeSynchronously() in VfsResolver and\nStrutsDiagramProviderTest to match the 2026.2 cancellable read-action API.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): drop deprecated Point createNodeComponent override\n\nKeep the NodeRealizer overload for compact label nodes; remove the\ndeprecated Point overload flagged by Plugin Verifier on 2026.2.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: changelog for Show Diagram deprecated API cleanup\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "e09fd34155dc3e9c26b2c479d9f76fc0e25f7b52",
      "tree": "a80988abe0903be0d4da77cb36c71892c12ae3fb",
      "parents": [
        "cca858690de914ab4872b92e8b831e723ea8ba82"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sun Jul 26 10:55:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 08:55:49 2026 +0000"
      },
      "message": "Show Diagram: space multi-result edge labels in LTR (#128) (#131)\n\n* docs: design for Show Diagram result edge label spacing (#128)\n\nCapture the approved spacing-only approach: Maven/Gradle-style\nminimal node/layer distance 20 on the custom LTR layouter.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: plan Show Diagram result edge label spacing (#128)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test(diagram): require Maven-style Show Diagram layouter distances (#128)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): space Show Diagram result edge labels in LTR (#128)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: note Show Diagram result edge label spacing (#128)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: amend #128 spacing design above platform defaults\n\nRecord why Maven/Gradle\u0027s unlabeled 20/20 compaction is unsuitable and choose a moderate 40/60 bump for labeled LTR graphs.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): use 40/60 layouter distances (#128)\n\nRaise node and layer spacing above IU defaults so multi-result labels have meaningful vertical and horizontal room.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "cca858690de914ab4872b92e8b831e723ea8ba82",
      "tree": "035cf21c3c7a1100f4ee7c77ca89dbfe03c3ba32",
      "parents": [
        "c556cc4f10f50580985d76b2d612bcfa725fdc75"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sun Jul 26 09:17:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 07:17:31 2026 +0000"
      },
      "message": "Show Diagram: fix stale result path after Dom edit (#126) (#130)\n\n* docs: design Show Diagram stale result path fix (#126)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: plan Show Diagram stale result path fix (#126)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): identify Show Diagram nodes by PSI pointer (#126)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): harden pointer equals/hashCode contract (#126)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): merge Show Diagram presentables on Dom refresh (#126)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: note Show Diagram stale result path fix (#126)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): tighten #126 refresh tests and merge keys\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): recreate Show Diagram labels when result path changes (#126)\n\nPointer-only identifying equality kept createLabelNode chrome after Dom\nedits. Include presentable name in StrutsDiagramItem equality so smart\nmode replaces path-changed nodes.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): drop Show Diagram DomEvent auto-refresh (#126)\n\nRebuild only via Refresh Data Model so XML edits stay snappy and path\nlabels update when the user explicitly refreshes.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "c556cc4f10f50580985d76b2d612bcfa725fdc75",
      "tree": "5e7ec1199bd059828c09ef432a61d1d6c60f9491",
      "parents": [
        "d9751d79a0a526f4085110ea7f1175a98bc73ab4"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sun Jul 26 05:32:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 03:32:00 2026 +0000"
      },
      "message": "Show Diagram: add arrowheads on action → result edges (#125) (#129)\n\n* docs: design Show Diagram result edge arrowheads (#125)\n\nCapture the approved approach: Builder-based solid + ANGLE\nrelationships for labeled edges; keep DEPENDENCY for package→action.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: plan Show Diagram result edge arrowheads (#125)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test(diagram): require ANGLE arrowheads on labeled Show Diagram edges (#125)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): add ANGLE arrowheads on labeled Show Diagram edges (#125)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test(diagram): use getTargetArrow and tidy #125 docs\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "d9751d79a0a526f4085110ea7f1175a98bc73ab4",
      "tree": "5d628a7f49951a0178bdc90b049ec15e012576cc",
      "parents": [
        "14f162eb99380f1b29117bec57b1c510940b655d"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sun Jul 26 05:05:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 05:05:34 2026 +0200"
      },
      "message": "Show Diagram: left-to-right hierarchic layout (#122) (#124)\n\n* docs: design Show Diagram left-to-right layout (#122)\n\nCapture the refreshed #122 approach: Maven-style custom hierarchic\nLTR layouter with soft preference for user-selected layout algorithms.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: plan Show Diagram left-to-right layout (#122)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test(diagram): require Show Diagram LTR custom layouter (#122)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(diagram): use LTR hierarchic Show Diagram layouter (#122)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: changelog Show Diagram LTR layout (#122)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test(diagram): assert useDefaultLayouter stays false for LTR (#122)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "14f162eb99380f1b29117bec57b1c510940b655d",
      "tree": "84e1fa5500e7ecf9d9e5f8c163fa2a523de8c609",
      "parents": [
        "fc7862c79816c876cd565cfb6d5dd4bbc25d61b0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jul 25 22:30:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 20:30:31 2026 +0000"
      },
      "message": "Show Diagram: use compact icon+label nodes (#120) (#123)\n\n* docs: add design for Show Diagram compact label nodes (#120)\n\nCapture the approved approach: CommonDiagramExtras.createLabelNode\nchrome, Swing tab untouched, automated component-type smoke tests.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add implementation plan for Show Diagram compact nodes (#120)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test(diagram): assert Show Diagram uses compact label nodes (#120)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(diagram): use compact icon+label nodes in Show Diagram (#120)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: note compact Show Diagram nodes in changelog (#120)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): cover NodeRealizer node chrome path and keep zoom animations off (#120)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "fc7862c79816c876cd565cfb6d5dd4bbc25d61b0",
      "tree": "90a03b5adb20ac1e8e280f896b79b0dfe5d36639",
      "parents": [
        "cee696e56eda9c38e979b55f28fad3374634c66a"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jul 25 21:34:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 19:34:45 2026 +0000"
      },
      "message": "Migrate Diagram tab to IntelliJ Show Diagram API (#117) (#119)\n\n* docs: add design for Diagrams API migration (#117)\n\nCapture the approved Show Diagram host swap: hard com.intellij.diagram\ndependency, keep toolkit-neutral model/presentation, remove the Swing tab.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add implementation plan for Diagrams API migration (#117)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* build: hard-depend on IntelliJ Diagrams plugin for #117\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(diagram): extract DomEvent same-file helpers for Diagrams host\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(diagram): register Show Diagram provider for Struts configs\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(diagram): map Struts snapshot into API nodes\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test(diagram): assert snapshot-to-API edge triple mapping\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(diagram): refresh model on same-file DomEvents\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): refresh presentation after DomEvents\n\nBuild diagram API objects under the non-blocking read action so the EDT only swaps collections and requests a builder refresh.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* refactor(diagram): remove Swing Diagram tab in favor of Show Diagram\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: changelog and package-info for Diagrams API migration\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): preserve node identity across VFS resolution\n\nResolve snapshot node IDs from diagram FQNs and prevent callers from mutating the live diagram collections.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(diagram): keep Swing Diagram tab alongside Show Diagram\n\nRestore the PerspectiveFileEditor host so both UIs can be compared\nwhile the Diagrams API presentation is polished.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): navigate to XML on Show Diagram double-click\n\nEditor-mode double-click uses EditNodeHandler, not DiagramNode.navigate().\nWire Extras + PSI data context so Jump to Source works as well.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "cee696e56eda9c38e979b55f28fad3374634c66a",
      "tree": "0b2017144ae38a17edad99a7a56db55518e32d7f",
      "parents": [
        "ac069074160a74ecdd1e77abca3eb0e264c9a865"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jul 25 16:56:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 16:56:57 2026 +0200"
      },
      "message": "fix(diagram): restore blank Diagram tab on IntelliJ 2026.2 (#118)\n\n* docs: add design for blank Diagram tab on 262\n\nCapture the agreed Approach 1 fix: harden PerspectiveFileEditor lifecycle\nand placeholder sizing; keep Diagrams API migration as future work.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add implementation plan for blank Diagram tab on 262\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): size EMPTY/UNAVAILABLE panels so placeholders are visible\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): always apply built model and call super on tab select\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: changelog and #117 link for Diagram blank-tab fix\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(diagram): address final blank-tab review findings\n\nAdd lifecycle regression coverage and coalesce duplicate model builds while clarifying the defensive sizing behavior.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "ac069074160a74ecdd1e77abca3eb0e264c9a865",
      "tree": "aad000b18828733d76daa91e4ce683eade7f3578",
      "parents": [
        "4a11ebcb9b3f3c6da409f4227b9d3eb53043fb66"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jul 25 13:01:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 11:01:22 2026 +0000"
      },
      "message": "build: declare JavaScript/JSP/CSS v2 content modules for 2026.2 (#103) (#116)\n\n* docs: add JavaScript v2 modules implementation plan\n\nTask-by-task plan for #103: declare parser/backend modules, verify with\nbuild/verifier/tests/runIde, escalate only with classloader evidence.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add JavaScript v2 modules design for #103\n\nCapture the agreed minimal fix: declare parser/backend content modules\non top of the existing JavaScript plugin dependency, escalate only with\nclassloader evidence, and verify with build/verifier/tests plus runIde smoke.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* build: declare JavaScript v2 content modules for 2026.2\n\nAdd intellij.javascript.parser and intellij.javascript.backend so\nStruts taglib JS injectors can load under the fully v2 JavaScript plugin.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* build: declare intellij.javaee.jsp.shared for 2026.2 JSP APIs\n\nNewJspFileType/JspxFileType live in the JSP shared content module;\nplugin id com.intellij.jsp alone is insufficient under the v2 model.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* build: declare CSS v2 content modules for taglib references\n\nCssFileType and CssInHtmlClassOrIdReferenceProvider require intellij.css\nand intellij.css.backend under the 2026.2 v2 plugin model.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: record JavaScript v2 content modules in changelog\n\nDocument the 2026.2 JavaScript modular dependency fix for #103.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "4a11ebcb9b3f3c6da409f4227b9d3eb53043fb66",
      "tree": "97857f2e1591369c1035c5820cec4b531bb65697",
      "parents": [
        "ef0a52da26191f53a737f0fd91457abdee34d328"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Jul 25 09:20:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 09:20:16 2026 +0200"
      },
      "message": "ci(deps): bump actions/checkout from 7.0.0 to 7.0.1 (#114)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 7.0.0 to 7.0.1.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 7.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\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ef0a52da26191f53a737f0fd91457abdee34d328",
      "tree": "905a9fc214201cf37cd35430ed7ccf406beb786e",
      "parents": [
        "3448fce1e44c707318fc3f1e1c4d44f69518ee93"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Jul 25 09:20:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 09:20:07 2026 +0200"
      },
      "message": "ci(deps): bump actions/setup-java from 5.4.0 to 5.6.0 (#113)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.4.0 to 5.6.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/1bcf9fb12cf4aa7d266a90ae39939e61372fe520...03ad4de0992f5dab5e18fcb136590ce7c4a0ac95)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.6.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "3448fce1e44c707318fc3f1e1c4d44f69518ee93",
      "tree": "fe267e2d6d7baebb1498706c4683fd30fbd66c69",
      "parents": [
        "7afa132e79221e09d5d3be4d135ae57ad1e4b8d7"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jul 25 09:02:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 09:02:35 2026 +0200"
      },
      "message": "build: target IntelliJ IDEA 2026.2 (262) with Java 25 (#115)\n\n* docs: add IntelliJ 2026.2 (262) compatibility design\n\nCapture the agreed upgrade scope: 262-only target, Java 25, full verify/test bar, no Marketplace release in this work.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: sync 262 design with current pluginVersion\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add IntelliJ 2026.2 compatibility implementation plan\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* build: target IntelliJ 2026.2 (262) with Java 25\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* build: use Qodana 2026.2-eap image tag\n\nStable jetbrains/qodana-jvm:2026.2 is not published yet.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* build: bump IntelliJ Platform Gradle Plugin for 2026.2 tests\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix: adapt tests for IntelliJ 2026.2\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: record IntelliJ 2026.2 and Java 25 upgrade\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "7afa132e79221e09d5d3be4d135ae57ad1e4b8d7",
      "tree": "0b9a1582db8630b1d552d00635ba9e8d49bae6a1",
      "parents": [
        "acc0caa48b8664ef46497d28b1faa8229d87ae00"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 06:48:26 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 06:48:26 2026 +0000"
      },
      "message": "Post-release 261.19027.1: changelog + bump to 261.19039.1 (#112)\n\nCo-authored-by: GitHub Action \u003caction@github.com\u003e"
    },
    {
      "commit": "acc0caa48b8664ef46497d28b1faa8229d87ae00",
      "tree": "1ec05cd49786e641caed8c1161673390ecdc9d5d",
      "parents": [
        "948df5d88546ba72cc59e8d24fad2bd78f24b208"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jul 02 16:58:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 14:58:40 2026 +0000"
      },
      "message": "Struts 7 action detection + @StrutsParameter quick-fix (#110)\n\n* fix(inspection): detect Struts 7 actions via modern Action interface\n\nRecognize actions implementing org.apache.struts2.action.Action (Struts 7+)\nin addition to the legacy com.opensymphony.xwork2.Action, and check the\naction interface independently of the Convention plugin. Only the *Action\nnaming convention remains gated behind Convention plugin presence.\n\nThis lets the @StrutsParameter inspection cover convention/interface-based\nactions on Struts 7, where the legacy XWork Action interface no longer exists.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat(inspection): add \"Annotate with @StrutsParameter\" quick-fix\n\nOffer a one-click fix on the missing-annotation warning that inserts\n@StrutsParameter on the flagged field or setter and shortens the import.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "948df5d88546ba72cc59e8d24fad2bd78f24b208",
      "tree": "36b667b26b79b0e6c01fec637504d57cb00a7959",
      "parents": [
        "655260c8aebdb2203501e4343829399acc678a63"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jul 02 16:42:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 16:42:33 2026 +0200"
      },
      "message": "Add @StrutsParameter missing-annotation inspection (#109)\n\n* docs: add StrutsParameter inspection design\n\nDocument the first Java inspection slice for identifying Struts action\nmembers that need @StrutsParameter when annotation-based binding is enabled.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add StrutsParameter inspection implementation plan\n\nBreak the Java inspection work into test-first tasks covering fixtures,\nutilities, inspection registration, and verification.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: cover StrutsParameter annotation inspection\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: use non-action name in StrutsParameter inspection test\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat: add StrutsParameter inspection utilities\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat: inspect missing StrutsParameter annotations\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: create StrutsParameter inspection fixtures with project files\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: register StrutsParameter fixtures as struts.xml\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix: parse Struts requireAnnotations constant as string\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add changelog entry for StrutsParameter inspection\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: avoid shadowing Struts file set helper overload\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "655260c8aebdb2203501e4343829399acc678a63",
      "tree": "a0ff9db309e1198ee4928cbbfc9f87eb31a38f8d",
      "parents": [
        "52e1b5981cf9c96f665bc9e797140ef80b31dd27"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jul 02 13:07:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 13:07:53 2026 +0200"
      },
      "message": "Add Struts 7.2.1 metadata support (#108)\n\n* docs: add Struts 7.2.1 support design\n\nCapture the focused metadata compatibility scope for Struts 7.2.1\nbefore implementation planning.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add Struts 7.2.1 support implementation plan\n\nBreak the approved metadata compatibility design into concrete TDD\nimplementation tasks.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: cover Struts 7.2.1 constant metadata completions\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: use subset assertion for Struts 7.2.1 constants\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat: update Struts 7.2.1 constant metadata\n\nAdd annotation-required parameter constants, jakarta-stream multipart\nparser, html5/css_xhtml theme values, and strikeout for deprecated ajax\ntheme in constant completion.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat: update Struts theme completion variants\n\nAdd css_xhtml and html5 themes and mark ajax as deprecated in JSP tag\ntheme completion.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat: detect modern Struts filter class in web.xml\n\nRecognize org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter\nfor web.xml constant completion alongside legacy filter classes.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add changelog entry for Struts 7.2.1 metadata support\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "52e1b5981cf9c96f665bc9e797140ef80b31dd27",
      "tree": "17694a141cc07fc8f7027eb26f85466d7c8e21f6",
      "parents": [
        "5e198efd2e74985d56e4316f3f352df41e18d5ca"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jul 02 10:05:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 10:05:01 2026 +0200"
      },
      "message": "ci: require Struts version review before preparing release (#107)\n\nAdd a required workflow_dispatch checkbox to Prepare Release and fail\nearly with a checklist error when it is not confirmed. Document the\ncheck in the README pre-release checklist.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "5e198efd2e74985d56e4316f3f352df41e18d5ca",
      "tree": "5c213a018fc0b9c63909862a485b7f9cd205a4c3",
      "parents": [
        "6545fce54d0024f1e58fda0a1e8467f2335aa6df"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jul 02 08:20:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 06:20:27 2026 +0000"
      },
      "message": "docs: document full release process and fix setup-gradle deprecation (#106)\n\nExpand the README release section to match the actual CI, nightly,\nprepare, and release workflows. Replace deprecated\ngradle-home-cache-cleanup with cache-cleanup: always in all workflows.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "6545fce54d0024f1e58fda0a1e8467f2335aa6df",
      "tree": "6a2e9d31dfd20e79f2e733fcfd4b179c2395ce2a",
      "parents": [
        "00be75a6016700373c6948738c4169fe60ef23a3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 01 06:40:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 06:40:24 2026 +0200"
      },
      "message": "ci(deps): bump actions/cache from 6.0.0 to 6.1.0 (#104)\n\nBumps [actions/cache](https://github.com/actions/cache) from 6.0.0 to 6.1.0.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/2c8a9bd7457de244a408f35966fab2fb45fda9c8...55cc8345863c7cc4c66a329aec7e433d2d1c52a9)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "00be75a6016700373c6948738c4169fe60ef23a3",
      "tree": "374234f68072328840cfeb457fdabaa44decf53b",
      "parents": [
        "ac08207c4c6eb31b9a97e2b93073196417def1f1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 01 06:40:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 06:40:15 2026 +0200"
      },
      "message": "ci(deps): bump actions/setup-java from 5.3.0 to 5.4.0 (#105)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.3.0 to 5.4.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/ad2b38190b15e4d6bdf0c97fb4fca8412226d287...1bcf9fb12cf4aa7d266a90ae39939e61372fe520)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ac08207c4c6eb31b9a97e2b93073196417def1f1",
      "tree": "141c266f70eda79b1ac6a50d6db0dc56547d6e40",
      "parents": [
        "6311474547b91675a38419f14789c053f9825a82"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Jun 27 08:01:03 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 27 08:01:03 2026 +0000"
      },
      "message": "ci(deps): bump JetBrains/qodana-action from 2026.1.0 to 2026.1.3 (#90)\n\nBumps [JetBrains/qodana-action](https://github.com/jetbrains/qodana-action) from 2026.1.0 to 2026.1.3.\n- [Release notes](https://github.com/jetbrains/qodana-action/releases)\n- [Commits](https://github.com/jetbrains/qodana-action/compare/d7b5ec2fbec32197ef447c450e00589ed5f34fd5...4861e015da555e86a72b862892aba6c2b93e6891)\n\n---\nupdated-dependencies:\n- dependency-name: JetBrains/qodana-action\n  dependency-version: 2026.1.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "6311474547b91675a38419f14789c053f9825a82",
      "tree": "288bfa66a79950463dec7c0b826e6387d7c9a107",
      "parents": [
        "45db4e41490f05ac623e88045da8ad5ca99b75f2"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Fri Jun 26 08:53:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 08:53:33 2026 +0200"
      },
      "message": "Fix namespace-relative JSP result path resolution and validation (#102)\n\n* Add spec and plan for namespace-relative JSP path resolution fix.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Add StrutsResultPathUtil for namespace-relative result paths.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Normalize namespace-relative paths in dispatch result references.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Suppress symbol errors for namespace-relative dispatch result paths.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Add tests for namespace-relative JSP result path resolution.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix: limit JSP-only symbol error suppression in result inspection.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Document fix for namespace-relative JSP result paths.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix: restore result path completion and missing JSP validation\n\nUse a proper NamespaceRelativeFileReferenceSet for IntelliJ 2026.1, default\nto dispatcher when no result type is declared, and highlight unresolved JSP\npaths via StrutsResultPathAnnotator with a Create file intention.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "45db4e41490f05ac623e88045da8ad5ca99b75f2",
      "tree": "ad090187f3a42ecb295bc27c4ecc6167ac1f0c3f",
      "parents": [
        "1a2d77af08c0f67476d887f318e51c71ef4010e0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jun 25 20:45:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 18:45:40 2026 +0000"
      },
      "message": "feat: auto-refresh Diagram tab on struts.xml DOM changes (#101)\n\n* test: add DOM file-filter helpers for diagram auto-refresh\n\nExtract isDomElementInFile for unit testing before wiring the listener.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* test: cover diagram editor select/deselect notify lifecycle\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* feat: auto-refresh Diagram tab on struts.xml DOM changes\n\nRegister a debounced DomEventListener while the Diagram tab is active\nand rebuild immediately on tab selection. Closes #97.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: note Diagram tab auto-refresh in CHANGELOG\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* docs: add design spec and implementation plan for diagram auto-refresh\n\nDocument the brainstorming output and task plan for issue #97.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "1a2d77af08c0f67476d887f318e51c71ef4010e0",
      "tree": "a6b5a1a5465eb456bf84f63e38a1feaf9c824732",
      "parents": [
        "f86c5a561ae5e9e935c6fdc69fe0faea984e5932"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jun 25 16:07:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 14:07:59 2026 +0000"
      },
      "message": "ci: enable GitHub Issues for the repository (#95)\n\nASF repos have Issues disabled by default. Enable via github.features.issues\nin .asf.yaml; issue notifications already route to issues@struts.apache.org.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "f86c5a561ae5e9e935c6fdc69fe0faea984e5932",
      "tree": "052ca59cf5a63302d0e21aa1d98bc985d84a2e1f",
      "parents": [
        "37012a0bdb006a6e1ed5641f43cddcd863d9a93f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jun 25 15:45:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 15:45:47 2026 +0200"
      },
      "message": "ci(deps): bump actions/setup-java from 5.2.0 to 5.3.0 (#91)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.2.0 to 5.3.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/be666c2fcd27ec809703dec50e508c2fdc7f6654...ad2b38190b15e4d6bdf0c97fb4fca8412226d287)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "37012a0bdb006a6e1ed5641f43cddcd863d9a93f",
      "tree": "e8af3ce9380800bf6e5d61edbe276ced5f5634ab",
      "parents": [
        "9394888cd692adb1b1288033e580fbb4f7d460ea"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jun 25 15:44:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 15:44:40 2026 +0200"
      },
      "message": "ci(deps): bump gradle/actions from 6.1.0 to 6.2.0 (#89)\n\nBumps [gradle/actions](https://github.com/gradle/actions) from 6.1.0 to 6.2.0.\n- [Release notes](https://github.com/gradle/actions/releases)\n- [Commits](https://github.com/gradle/actions/compare/50e97c2cd7a37755bbfafc9c5b7cafaece252f6e...3f131e8634966bd73d06cc69884922b02e6faf92)\n\n---\nupdated-dependencies:\n- dependency-name: gradle/actions\n  dependency-version: 6.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9394888cd692adb1b1288033e580fbb4f7d460ea",
      "tree": "d3c17b440c0b6cad563151e2bdb821e0b0b1fce0",
      "parents": [
        "e8d3add1b79ec807e414ef98f5ac5904d4d6ecda"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jun 25 15:43:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 13:43:30 2026 +0000"
      },
      "message": "refactor: remove deprecated Graph editor tab (#94)\n\nThe legacy Graph tab used deprecated GraphBuilder APIs and has been\nfully replaced by the Diagram tab. Remove the com.intellij.struts2.graph\npackage, its plugin.xml registration, and the enableGraphEditor JVM property.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "e8d3add1b79ec807e414ef98f5ac5904d4d6ecda",
      "tree": "0262b22fceda3b507c3baeb47bea34b8890224a9",
      "parents": [
        "607a40b2b51f443a8943a2e1977bddf2d96a0ff7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 24 06:04:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 06:04:05 2026 +0200"
      },
      "message": "ci(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#93)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "607a40b2b51f443a8943a2e1977bddf2d96a0ff7",
      "tree": "4c29ab8e6f39314962a5997fd099be32ddbc9444",
      "parents": [
        "284971588774b65f39169fee3a7e2960d42de881"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 24 06:03:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 06:03:57 2026 +0200"
      },
      "message": "ci(deps): bump actions/cache from 5.0.5 to 6.0.0 (#92)\n\nBumps [actions/cache](https://github.com/actions/cache) from 5.0.5 to 6.0.0.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/27d5ce7f107fe9357f9df03efb73ab90386fccae...2c8a9bd7457de244a408f35966fab2fb45fda9c8)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "284971588774b65f39169fee3a7e2960d42de881",
      "tree": "f2060b5e8c344d0cdabba6f4bb09e3f2627cae40",
      "parents": [
        "676874e9f99fc22fc1c4a3e6c9aecca63dca7ac8"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Jun 11 07:18:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 05:18:13 2026 +0000"
      },
      "message": "ci: pin Marketplace ZIP Signer to 0.1.43 (#88)\n\nThe nightly/release workflows intermittently fail at signPlugin with\n\"No Marketplace ZIP Signer executable found\" even though zipSigner() is\ndeclared. With no version pinned, a stale Gradle cache restored by\ngradle/actions (e.g. saved by a non-signing build.yml run) can leave the\nsigning configuration empty. Pinning the version makes the signer\ndependency deterministically resolvable.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "676874e9f99fc22fc1c4a3e6c9aecca63dca7ac8",
      "tree": "ac35b8f3d1726f5e938c32d1898f159db6f832c9",
      "parents": [
        "62b168cc66d16df59cc9bbbebd46cdee915ed6d5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 10 07:20:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 07:20:25 2026 +0200"
      },
      "message": "ci(deps): bump actions/checkout from 6.0.2 to 6.0.3 (#86)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 6.0.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "62b168cc66d16df59cc9bbbebd46cdee915ed6d5",
      "tree": "5a370716dce21a0f18fe904ce9417f0cfa4dc2e6",
      "parents": [
        "00c6d0be53a28baac87e5b1b28993316a9113488"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 10 07:20:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 07:20:13 2026 +0200"
      },
      "message": "ci(deps): bump codecov/codecov-action from 6.0.1 to 7.0.0 (#87)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.1 to 7.0.0.\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/e79a6962e0d4c0c17b229090214935d2e33f8354...fb8b3582c8e4def4969c97caa2f19720cb33a72f)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "00c6d0be53a28baac87e5b1b28993316a9113488",
      "tree": "722319ba96923fe63682ee5a22f0fcb2404abd45",
      "parents": [
        "11d5ad4a5d1783fbc67650f21df02f311370a43d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed May 20 07:33:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 07:33:28 2026 +0200"
      },
      "message": "ci(deps): bump codecov/codecov-action from 6.0.0 to 6.0.1 (#85)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.0 to 6.0.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/57e3a136b779b570ffcdbf80b3bdc90e7fab3de2...e79a6962e0d4c0c17b229090214935d2e33f8354)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\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\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "11d5ad4a5d1783fbc67650f21df02f311370a43d",
      "tree": "dddfb5a04703aa66e05182a8cd532b9780736616",
      "parents": [
        "2a514e180f82543799c57250bfa6bee3065aec92"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 29 06:49:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 06:49:39 2026 +0200"
      },
      "message": "ci(deps): bump JetBrains/qodana-action from 2025.3.2 to 2026.1.0 (#84)\n\nBumps [JetBrains/qodana-action](https://github.com/jetbrains/qodana-action) from 2025.3.2 to 2026.1.0.\n- [Release notes](https://github.com/jetbrains/qodana-action/releases)\n- [Commits](https://github.com/jetbrains/qodana-action/compare/89eb4357efd2b52e639f3216e63edaf33b82622b...d7b5ec2fbec32197ef447c450e00589ed5f34fd5)\n\n---\nupdated-dependencies:\n- dependency-name: JetBrains/qodana-action\n  dependency-version: 2026.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2a514e180f82543799c57250bfa6bee3065aec92",
      "tree": "50a0ec52fe0f75880768d2ddc364eebc20e60a54",
      "parents": [
        "74aa6b5e1e148b830a0fed452ea9b359cb493029"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Apr 28 14:58:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:58:04 2026 +0000"
      },
      "message": "Bump pluginVersion to 261.19027.1 (#83)\n\nManual application of the post-release version-bump rule (#82) for\nthe already-published v261.19017.1, which predates that automation.\nBUILD increased by 10 (count of nightly tags between v252.18980.1\nand v261.19017.1)."
    },
    {
      "commit": "74aa6b5e1e148b830a0fed452ea9b359cb493029",
      "tree": "00904e779efd98c8b40ba9d3742862ef7e1d2217",
      "parents": [
        "4c93e3f465680cd9725806028313b6ca867d53b0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Apr 28 14:50:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:50:56 2026 +0000"
      },
      "message": "ci(release): auto-bump pluginVersion after publish (#82)\n\nAfter the plugin is published to Marketplace, count nightly tags\nbetween the previous release tag and the current one (each nightly\nrepresents one code change). Bump the BUILD segment of pluginVersion\nin gradle.properties by that count and roll the change into the\nexisting post-release PR alongside the changelog patch.\n\nRequires fetch-depth: 0 on checkout so the version-bump step can\nwalk tag history."
    },
    {
      "commit": "4c93e3f465680cd9725806028313b6ca867d53b0",
      "tree": "0d45d134d4ffbc499d7de3bbb27d3bb8ec14839e",
      "parents": [
        "8ac1cc99b12bcc44b0e671acdf0c4356715bbf03"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Apr 28 14:42:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:42:58 2026 +0000"
      },
      "message": "Changelog update - 261.19017.1 (#81)"
    },
    {
      "commit": "8ac1cc99b12bcc44b0e671acdf0c4356715bbf03",
      "tree": "52d33d80b6aecbfa0f5668c7033b79c4523534dc",
      "parents": [
        "737899c5bc2b0ccc10f2c85d4b0f430c23d3f1e0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Apr 28 14:39:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:39:19 2026 +0000"
      },
      "message": "ci(release): skip duplicate asset upload in publish workflow (#80)\n\nThe Prepare Release workflow already attaches the plugin zip to the\nGitHub pre-release. Re-uploading from the publish workflow fails with\n\"asset under the same name already exists\" once the pre-release is\npromoted. Removing the redundant step also keeps the published bits\nidentical to what PMC voted on."
    },
    {
      "commit": "737899c5bc2b0ccc10f2c85d4b0f430c23d3f1e0",
      "tree": "aaac761e9557ed5cd9ebfb748b6ca67faf9a2731",
      "parents": [
        "c5687264b679ec58f463191d269f233af8cf7a7f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 15 07:47:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 07:47:02 2026 +0200"
      },
      "message": "ci(deps): bump actions/github-script from 8.0.0 to 9.0.0 (#79)\n\nBumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3)\n\n---\nupdated-dependencies:\n- dependency-name: actions/github-script\n  dependency-version: 9.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "c5687264b679ec58f463191d269f233af8cf7a7f",
      "tree": "615820b02bfa92b03696599387e232761bd4cdb9",
      "parents": [
        "2a42a69f17ca1ce2cfd7da489e708c04f54be835"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 15 07:06:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 07:06:07 2026 +0200"
      },
      "message": "ci(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 (#78)\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.0 to 7.0.1.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: 7.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\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2a42a69f17ca1ce2cfd7da489e708c04f54be835",
      "tree": "c1f98ddeca6c8528c4c69d9c5e48ca0e0e76b782",
      "parents": [
        "213f10266134f06e84118a40638362e1e04baad3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 15 07:05:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 07:05:57 2026 +0200"
      },
      "message": "ci(deps): bump actions/cache from 5.0.4 to 5.0.5 (#77)\n\nBumps [actions/cache](https://github.com/actions/cache) from 5.0.4 to 5.0.5.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/668228422ae6a00e4ad889ee87cd7109ec5666a7...27d5ce7f107fe9357f9df03efb73ab90386fccae)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: 5.0.5\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "213f10266134f06e84118a40638362e1e04baad3",
      "tree": "9d71a156f53a5365d045254c2bbe1bc2cf9e3c6c",
      "parents": [
        "93e15012cdb6805f7742bf6ec15ed72b1dae8e3b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 13 08:05:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 08:05:52 2026 +0200"
      },
      "message": "ci(deps): bump gradle/actions from 6.0.1 to 6.1.0 (#72)\n\nBumps [gradle/actions](https://github.com/gradle/actions) from 6.0.1 to 6.1.0.\n- [Release notes](https://github.com/gradle/actions/releases)\n- [Commits](https://github.com/gradle/actions/compare/39e147cb9de83bb9910b8ef8bd7fff0ee20fcd6f...50e97c2cd7a37755bbfafc9c5b7cafaece252f6e)\n\n---\nupdated-dependencies:\n- dependency-name: gradle/actions\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "93e15012cdb6805f7742bf6ec15ed72b1dae8e3b",
      "tree": "deb49a7c6647fd2b679b1dbc9ae7215e1b0fa20d",
      "parents": [
        "e1dada96f801c094469ae5ed99868fbc52781c41"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Apr 13 07:52:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 07:52:17 2026 +0200"
      },
      "message": "feat(diagram): resolve chain/redirect results as action-to-action edges (#76)\n\nExtend the Struts config diagram to handle redirectAction, chain, and\nredirect-action result types. When a result target resolves to an action\nin the same file, the model emits an action→action edge instead of an\nunresolvable RESULT node. External/unresolvable targets fall back to a\nlabeled RESULT node with a descriptive arrow label.\n\n- Add resolveChainOrRedirectTarget() helper that extracts target from\n  tag body text or \u003cparam name\u003d\"actionName\"\u003e/\u003cparam name\u003d\"namespace\"\u003e\n- Refactor build() into a two-pass approach: first create nodes and map\n  XmlTag→node for stable identity, then process results\n- Draw same-column (action→action) edges as dashed curves looping from\n  the source\u0027s right edge below both nodes to the target\u0027s left edge\n- Build model asynchronously via ReadAction.nonBlocking to avoid\n  write-intent lock violations on project open\n- Add test fixtures and tests for body-based and param-based redirect\n\nMade-with: Cursor"
    },
    {
      "commit": "e1dada96f801c094469ae5ed99868fbc52781c41",
      "tree": "bfc080732f017b466c6f6348a56738516f9f980c",
      "parents": [
        "367a26177ad18ccd8485d38dca38c9e241cd02f0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Apr 09 06:57:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 04:57:59 2026 +0000"
      },
      "message": "ci(nightly): derive version from pluginVersion instead of tags (#75)\n\nRead the middle segment from pluginVersion in gradle.properties instead\nof computing it from the latest non-nightly git tag. Nightly counter\nincrements within the same middle segment and resets automatically when\npluginVersion is bumped for a new release.\n\nMade-with: Cursor"
    },
    {
      "commit": "367a26177ad18ccd8485d38dca38c9e241cd02f0",
      "tree": "7cc0622f2e40d7c6fb71198da3037bf85865c01c",
      "parents": [
        "52d36b45d43e2b286b1362a37c5239a09182f77b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 17:47:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 15:47:42 2026 +0000"
      },
      "message": "ci(depenedabot): add cooldown (#74)"
    },
    {
      "commit": "52d36b45d43e2b286b1362a37c5239a09182f77b",
      "tree": "cc792fc59fe91efd30c20eea486f10bca60247dc",
      "parents": [
        "729be85dd41664443abaa6699df3e2992d14c949"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 08:03:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 06:03:16 2026 +0000"
      },
      "message": "ci: fix plugin version and build concurrency policy (#73)\n\nBump pluginVersion to 261.19017.1 to maintain monotonic build numbering\n(18980 from latest non-nightly tag v252.18980.1 + 37 commits since).\n\nOnly cancel in-progress CI runs for pull requests, allowing main-branch\nbuilds to complete independently.\n\nMade-with: Cursor"
    },
    {
      "commit": "729be85dd41664443abaa6699df3e2992d14c949",
      "tree": "e82671f61be7a486259eaf250295dcfa2cf100e4",
      "parents": [
        "f150c72b4dfbf292c6fdcbdbadce7ef5c0f20373"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 06:49:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 06:49:19 2026 +0200"
      },
      "message": "refactor: remove experimental CreateBeanPropertyFixes dependency (#71)\n\nDrop usage of the experimental `CreateBeanPropertyFixes` API from\n`BeanPropertyPathReference` and the delegating quick-fix aggregation\nin `ResultParamNameCustomConverter.MergingBeanPropertyPathReference`.\n\nThis eliminates the plugin verifier warning about referencing an\n`@ApiStatus.Experimental` class that may change in future IntelliJ\nPlatform releases. Bean-property resolution, completion, highlighting,\nand rename/bind behavior are unaffected.\n\n🤖 Generated by AI Assistant\n\nMade-with: Cursor"
    },
    {
      "commit": "f150c72b4dfbf292c6fdcbdbadce7ef5c0f20373",
      "tree": "712565090a1b904a117fe4fda91909b2869035ac",
      "parents": [
        "1db91af1a81353113c251ed9c958bd63ed2d4aa2"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 06:48:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 06:48:59 2026 +0200"
      },
      "message": "refactor: replace deprecated EXTEND_CLASS_NAMES with SUPER_CLASSES (#70)\n\nReplace JavaClassReferenceProvider.EXTEND_CLASS_NAMES (deprecated, scheduled\nfor removal) with the supported SUPER_CLASSES option in ConstantValueClassConverter.\n\nGuard the option so it is only set when baseClass is non-empty, preserving\nthe existing \"any concrete non-interface class\" semantics for constants like\nstruts.configuration and struts.mapper.class that intentionally pass \"\".\n\n🤖 Generated by AI Assistant\n\nMade-with: Cursor"
    },
    {
      "commit": "1db91af1a81353113c251ed9c958bd63ed2d4aa2",
      "tree": "74aad352a698d53cf3218effb7c718cd95d320d0",
      "parents": [
        "2327654ded8e20009b12d73fb39caba712956160"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 06:48:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 06:48:48 2026 +0200"
      },
      "message": "refactor(facet): replace deprecated CheckboxTreeBase constructor with explicit CheckPolicy (#69)\n\nThe 2-arg CheckboxTreeBase(renderer, root) constructor is deprecated in\nIntelliJ Platform 2026.1 because it relies on an implicit default check\npolicy. Replace it with the non-deprecated 3-arg form that takes an\nexplicit CheckPolicy matching the previous default behavior\n(checkChildren\u003dtrue, uncheckChildren\u003dtrue, checkParent\u003dfalse,\nuncheckParent\u003dtrue).\n\nMade-with: Cursor"
    },
    {
      "commit": "2327654ded8e20009b12d73fb39caba712956160",
      "tree": "8493c5007bb5ef444c9279a2cb5ab32520dd9a0f",
      "parents": [
        "3e90c47c140fa47f68f080d72d1c83a8449150a9"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 06:48:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 06:48:31 2026 +0200"
      },
      "message": "refactor(facet): migrate FacetConfiguration persistence to PersistentStateComponent (#68)\n\nReplace deprecated readExternal()/writeExternal() overrides in\nStrutsFacetConfiguration with PersistentStateComponent\u003cElement\u003e,\nfollowing the migration path documented in the IntelliJ Platform SDK.\n\nUses PersistentStateComponent\u003cElement\u003e to preserve the exact existing\nXML structure (fileset/file/propertiesKeys tags) for full backward\ncompatibility with saved .iml facet configuration.\n\nAlso removes redundant ModificationTracker interface (already inherited\nfrom SimpleModificationTracker superclass).\n\nMade-with: Cursor"
    },
    {
      "commit": "3e90c47c140fa47f68f080d72d1c83a8449150a9",
      "tree": "115e731a24bcd80608a8bbd1ec2c7acd43c94428",
      "parents": [
        "956eb454f271814a12f42dd7c0ad941d6e1e6b19"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 06:48:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 06:48:16 2026 +0200"
      },
      "message": "feat(annotator): warn when Web facet is missing for Struts modules (#67)\n\nAdds early feedback when a Struts-configured module has no WebFacet,\nwhich prevents JSP result path resolution and Diagram navigation.\n\n- WebFacetChecker: shared predicate reused by annotator and initializer\n- StrutsWebFacetCheckingAnnotator: file-level warning on struts.xml with\n  quick action to open module facet settings\n- StrutsFrameworkInitializer: one-time notification per affected module\n  on project open\n- Struts2ProjectDescriptorBuilder.withoutWebFacet(): test support for\n  omitting WebFacet in light tests\n\nFollow-up to PR #66 (DTD validation).\n\nMade-with: Cursor"
    },
    {
      "commit": "956eb454f271814a12f42dd7c0ad941d6e1e6b19",
      "tree": "4bd974afbc87cbebd17a64d856a8702df5efff7d",
      "parents": [
        "53d382f7dce31a72763a8f6e2a1bebad8cfda37f"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Apr 08 06:48:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 06:48:01 2026 +0200"
      },
      "message": "feat: add read-only Diagram tab for struts.xml config visualization (#65)\n\n* feat: add read-only Diagram tab for struts.xml config visualization\n\nIntroduce a lightweight Swing-based Diagram tab alongside the existing\n(disabled-by-default) Graph tab. The new tab renders packages, actions,\nand results in a hierarchical layout with tooltips and click-to-navigate,\nwithout depending on the deprecated GraphBuilder APIs.\n\nNew components:\n- diagram/model: toolkit-neutral DTOs (node, edge, snapshot builder)\n- diagram/presentation: reusable tooltip/navigation helpers\n- diagram/ui: custom Swing renderer with hover and double-click support\n- diagram/fileEditor: PerspectiveFileEditorProvider + editor registration\n\nMade-with: Cursor\n\n* test: add Diagram file editor provider tests and migration boundary docs\n\nAdd focused tests for Struts2DiagramFileEditorProvider verifying it\naccepts struts.xml in file sets and rejects plain XML, JSP, and Java\nfiles. Document the toolkit-neutral model layer as the migration\nboundary between the current Swing renderer and a future Diagrams API.\n\nMade-with: Cursor\n\n* fix: resolve threading violations in Diagram tab\n\nPrecompute tooltip HTML and navigation pointers during model snapshot\ncreation (under read action) so Swing event handlers on the EDT never\naccess DOM/PSI directly.\n\nChanges:\n- StrutsDiagramNode: replace DomElement with precomputed tooltipHtml\n  and SmartPsiElementPointer for navigation\n- StrutsConfigDiagramModel.build(): compute tooltips and create smart\n  pointers during snapshot (must be called under read action)\n- StrutsDiagramPresentation: split into computeTooltipHtml (build-time)\n  and navigateToElement (EDT-safe via ReadAction.nonBlocking)\n- Struts2DiagramFileEditor: wrap build() in ReadAction.nonBlocking\n  with progress dialog for initial load\n- Struts2DiagramComponent: use precomputed node.getTooltipHtml()\n  instead of calling into DOM on hover\n\nMade-with: Cursor\n\n* feat(diagram): show local packages only and add early DTD validation\n\nDiagram model now resolves packages from the file-local StrutsRoot DOM\ninstead of the merged StrutsModel, so only the current struts.xml\u0027s\npackages/actions/results are displayed.\n\nDTD validation is extracted into a shared StrutsDtdValidator helper and\nwired into Struts2ModelInspection.checkFileElement() as a file-level\nwarning, so users see http:// vs https:// issues while editing rather\nthan only when opening the Diagram tab. The Diagram-specific\nnotification is removed since the inspection now covers it earlier.\n\n- Add StrutsDtdValidator shared helper for DTD URI checks\n- Add DTD check to Struts2ModelInspection with WARNING severity\n- Remove Diagram-side DTD notification (replaced by inspection)\n- Handle null model in Struts2DiagramFileEditor.reset()\n- Add StrutsConfigDiagramModelTest for local-file filtering\n- Add StrutsDtdValidatorTest for DTD validation logic\n- Add highlighting test for valid https:// DTD\n\nMade-with: Cursor\n\n* fix(diagram): use EDT-safe read action for node navigation\n\nReplace ReadAction.nonBlocking().executeSynchronously() with\nApplication.runReadAction(Computable) in navigateToElement() so\ndouble-clicking a Diagram node no longer throws an EDT assertion.\n\nThe NBRA path asserts background-thread usage, but the mouse handler\nalways runs on the EDT. The regular runReadAction is appropriate here\nsince the work is just a SmartPsiElementPointer dereference.\n\nAdds a regression test verifying pointer resolution through the\nsame Application.runReadAction path.\n\nMade-with: Cursor\n\n* feat(diagram): harden MVP with explicit states and clearer fallbacks\n\nUnify the editor rebuild path so initial load and reset() always\nreflect the current model state instead of retaining stale content.\nAdd LOADED/EMPTY/UNAVAILABLE states to the diagram component with\ncentered placeholder messages for non-loaded states. Replace raw\n??? placeholders with descriptive labels ((unresolved path),\n(unnamed), (unknown type)). Extend tests to cover empty files,\nnull models, rebuild transitions, and label clarity.\n\nMade-with: Cursor\n\n* fix(diagram): use stable element identity for diagram nodes\n\nReplace display-based equals/hashCode (kind+name) in StrutsDiagramNode\nwith a stable ID derived from the backing XML element\u0027s text offset.\nThis prevents node collisions when duplicate action names or result\npaths exist across packages.\n\nAdd focused tests for duplicate-name regression, edge topology and\nlabels, editor lifecycle (creation and reset), and DTD validator\nclassification outcomes.\n\nMade-with: Cursor"
    },
    {
      "commit": "53d382f7dce31a72763a8f6e2a1bebad8cfda37f",
      "tree": "28dff7c7bb1d31ec5bce020da553e3ec8fa57839",
      "parents": [
        "3476c457ea22cfafd776ea8bec78f014bc2570ed"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sun Apr 05 12:44:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 12:44:01 2026 +0200"
      },
      "message": "feat(inspection): add early DTD validation for Struts config files (#66)\n\nSurface invalid DOCTYPE SYSTEM URIs (http:// instead of https://, or\nunrecognized URIs) as a file-level warning in Struts2ModelInspection,\nso users discover the issue while editing struts.xml rather than only\nwhen opening the Diagram tab.\n\n- Extract StrutsDtdValidator as a shared helper for DTD URI checks\n- Call the validator from Struts2ModelInspection.checkFileElement()\n- Add message keys for both http-vs-https and unrecognized DTD warnings\n- Add StrutsDtdValidatorTest (unit) and highlighting regression test\n\nMade-with: Cursor"
    },
    {
      "commit": "3476c457ea22cfafd776ea8bec78f014bc2570ed",
      "tree": "1f61f2d0c8d09339f0878661c7982deb6e5e6242",
      "parents": [
        "8e780749cee9c0790f773615c7f0b3cab9d37e1b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sun Apr 05 10:38:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 10:38:54 2026 +0200"
      },
      "message": "feat: disable deprecated Graph editor tab by default (#64)\n\nThe Graph editor tab uses deprecated IntelliJ Platform APIs\n(GraphBuilder, GraphBuilderFactory) that can cause IDE freezes on\nnewer platform versions. Gate the feature behind a JVM system property\nso it is hidden by default. Users who need the graph view can opt in\nwith -Dcom.intellij.struts2.enableGraphEditor\u003dtrue via\nHelp | Edit Custom VM Options.\n\nMade-with: Cursor"
    },
    {
      "commit": "8e780749cee9c0790f773615c7f0b3cab9d37e1b",
      "tree": "4f98d714e668f149d88e69da0409d3daf32d71e4",
      "parents": [
        "14612d756755613d0f1ed7aa463a7ac7c2ed63bb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Apr 04 15:29:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 15:29:52 2026 +0200"
      },
      "message": "ci(deps): bump gradle/actions from 5.0.2 to 6.0.1 (#63)\n\nBumps [gradle/actions](https://github.com/gradle/actions) from 5.0.2 to 6.0.1.\n- [Release notes](https://github.com/gradle/actions/releases)\n- [Commits](https://github.com/gradle/actions/compare/0723195856401067f7a2779048b490ace7a47d7c...39e147cb9de83bb9910b8ef8bd7fff0ee20fcd6f)\n\n---\nupdated-dependencies:\n- dependency-name: gradle/actions\n  dependency-version: 6.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "14612d756755613d0f1ed7aa463a7ac7c2ed63bb",
      "tree": "a9d9b95db4bfc24f82c8bfd90865c1c4dbb9a30f",
      "parents": [
        "8ba647192211528384a1bd719ba90257664df472"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Apr 04 15:29:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 15:29:40 2026 +0200"
      },
      "message": "ci(deps): bump codecov/codecov-action from 5.5.3 to 6.0.0 (#62)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.3 to 6.0.0.\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/1af58845a975a7985b0beb0cbe6fbbb71a41dbad...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8ba647192211528384a1bd719ba90257664df472",
      "tree": "972037f6fe5d2c508520483765c3e13f4a586e60",
      "parents": [
        "8fcc9d2a92c5a857c891ed4460b56149d0b0adee"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Apr 04 15:29:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 15:29:25 2026 +0200"
      },
      "message": "Update plugin to support IntelliJ Platform 2026.1 (#61)\n\n* build: target IntelliJ Platform 2026.1 (build 261)\n\n- Upgrade platformVersion to 2026.1 (build 261)\n- Update pluginSinceBuild/pluginUntilBuild to 261/261.*\n- Update IntelliJ Platform Gradle Plugin to 2.13.1 (requires Gradle 9)\n- Update Gradle wrapper to 9.0.0\n- Update Qodana linter to jetbrains/qodana-jvm:2026.1\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix: replace deprecated ReadAction.compute() in StrutsFrameworkInitializer\n\n* fix: replace deprecated ReadAction.compute() in Struts2ProblemFileHighlightFilter\n\n* fix: replace deprecated ReadAction.compute() in StrutsConstantHelper\n\n* fix: replace deprecated ReadAction.compute() in Struts2GraphFileEditor\n\n* fix: use non-deprecated DaemonCodeAnalyzer.restart() with reason parameter\n\n* fix: remove deprecated CompletionType.CLASS_NAME registration\n\nCompletionType.CLASS_NAME is deprecated (marked for removal).\nThe BASIC completion type already covers class name completion.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* docs: update CHANGELOG for 2026.1 platform upgrade\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix: resolve test compilation for IntelliJ 2026.1\n\n- Add TestFrameworkType.Plugin.Java for Java test framework classes\n- Add jetCheck dependency from JitPack for property-based tests\n- Replace deprecated CompletionType.CLASS_NAME in test\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix: add JSON plugin dependency required by JavaScript in 2026.1\n\nThe JavaScript plugin in IntelliJ 2026.1 now depends on the\nintellij.json.backend module from the JSON plugin. Without this\ndependency, JavaScript fails to load in the test sandbox, which\ncascades to prevent the Struts plugin from loading (242/294 test\nfailures). Also adjust completion test expectations for mock JDK.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix: revert Qodana linter to 2025.3 (2026.1 image not yet published)\n\nThe jetbrains/qodana-jvm:2026.1 Docker image does not exist yet,\ncausing the Inspect code CI job to fail.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* Revert \"fix: revert Qodana linter to 2025.3 (2026.1 image not yet published)\"\n\nThis reverts commit 38f98f4d0c8a9a029fb71f0b9adc068143afc460.\n\n* ci: allow Qodana to fail until 2026.1 image is published\n\nThe jetbrains/qodana-jvm:2026.1 Docker image is not yet available.\nAdd continue-on-error so it doesn\u0027t block PRs in the meantime.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8fcc9d2a92c5a857c891ed4460b56149d0b0adee",
      "tree": "84549a6e3787bb323837d66f5d5e847d456850d7",
      "parents": [
        "26ae22d6681f1ceccf2c4882ea8e07c44e905c30",
        "5605aa581bcc9f0f444572e524a91ab7c8f011b0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Thu Mar 26 11:43:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 11:43:42 2026 +0100"
      },
      "message": "Merge pull request #59 from apache/ci/pin-actions-to-sha\n\nci: pin all GitHub Actions to SHA hashes"
    },
    {
      "commit": "5605aa581bcc9f0f444572e524a91ab7c8f011b0",
      "tree": "84549a6e3787bb323837d66f5d5e847d456850d7",
      "parents": [
        "a6dc6f55f15ae2d07e660399fc4578bcbe686fa9"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Mar 26 11:41:56 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Mar 26 11:41:56 2026 +0100"
      },
      "message": "ci: re-trigger workflow after infrastructure-actions sync\n"
    },
    {
      "commit": "a6dc6f55f15ae2d07e660399fc4578bcbe686fa9",
      "tree": "84549a6e3787bb323837d66f5d5e847d456850d7",
      "parents": [
        "972b54edc2963ca06e491e1ede9e2115e72e48a6"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Mar 24 12:39:29 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Mar 24 12:39:29 2026 +0100"
      },
      "message": "ci: trigger workflow re-run after infrastructure-actions approval\n"
    },
    {
      "commit": "972b54edc2963ca06e491e1ede9e2115e72e48a6",
      "tree": "84549a6e3787bb323837d66f5d5e847d456850d7",
      "parents": [
        "26ae22d6681f1ceccf2c4882ea8e07c44e905c30"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Mar 22 18:29:38 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Mar 22 18:29:38 2026 +0100"
      },
      "message": "ci: pin all GitHub Actions to SHA hashes for supply chain security\n\nPin all action references to commit SHAs instead of mutable tags,\nfollowing ASF infrastructure-actions allowed list where available.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "26ae22d6681f1ceccf2c4882ea8e07c44e905c30",
      "tree": "7440247daf40e11929869525d689ff60b37f1ae6",
      "parents": [
        "738932eef41e96e4ed58970d85c0ee5716b3d9ee"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Mar 18 06:58:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 06:58:21 2026 +0100"
      },
      "message": "ci(deps): bump JetBrains/qodana-action from 2025.3.1 to 2025.3.2 (#58)\n\nBumps [JetBrains/qodana-action](https://github.com/jetbrains/qodana-action) from 2025.3.1 to 2025.3.2.\n- [Release notes](https://github.com/jetbrains/qodana-action/releases)\n- [Commits](https://github.com/jetbrains/qodana-action/compare/v2025.3.1...v2025.3.2)\n\n---\nupdated-dependencies:\n- dependency-name: JetBrains/qodana-action\n  dependency-version: 2025.3.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "738932eef41e96e4ed58970d85c0ee5716b3d9ee",
      "tree": "f37e4285df8c6781845653a523df12c5e8350e6b",
      "parents": [
        "0e3110f833247cd94cd89cc5c3ce7414721b493e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Mar 04 06:32:41 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 04 06:32:41 2026 +0100"
      },
      "message": "ci(deps): bump actions/upload-artifact from 6 to 7 (#57)\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "0e3110f833247cd94cd89cc5c3ce7414721b493e",
      "tree": "f80b4892d4e3a78eb9c68c62394dfc3d7de55a7f",
      "parents": [
        "5b343e6809e77287d8f6e9406d54efb840c1e653",
        "78c0a3d46d929bef0a776bcd1a7408fa8dae0840"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Feb 25 08:34:06 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 08:34:06 2026 +0100"
      },
      "message": "Merge pull request #56 from apache/docs/update-changelog\n\ndocs: update changelog with unreleased changes since v252.18978.1"
    },
    {
      "commit": "78c0a3d46d929bef0a776bcd1a7408fa8dae0840",
      "tree": "13a6287f1d4630689a848200941fcc5366c52402",
      "parents": [
        "ec1182218e2a8ad399876fcec18457074072a5d6"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 08:24:42 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 08:24:42 2026 +0100"
      },
      "message": "docs: update changelog with unreleased changes since v252.18978.1\n\nAdd all changes merged since the last release: deprecated API fixes,\nQodana warning resolutions, nullability fixes, DTD path fix, CI\nworkflow improvements (nightly schedule, two-phase release, PR\nartifact comments), and documentation cleanup.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "5b343e6809e77287d8f6e9406d54efb840c1e653",
      "tree": "c40edbad6081dc5c9e8a6df4678de68378b04873",
      "parents": [
        "ec1182218e2a8ad399876fcec18457074072a5d6",
        "0d823445bfb399a1dc8d367e36623dbd27d4af3a"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Feb 25 07:54:22 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 07:54:22 2026 +0100"
      },
      "message": "Merge pull request #55 from apache/ci/replace-nightly-prereleases-with-tags\n\nci(nightly): replace GitHub pre-releases with lightweight git tags"
    },
    {
      "commit": "0d823445bfb399a1dc8d367e36623dbd27d4af3a",
      "tree": "1c9d1671f25c50b013d4db3a29bc66871cd5e363",
      "parents": [
        "ba51c4b0d6d5b96c2258dd6e7e951495062b215b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 07:45:53 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 07:45:53 2026 +0100"
      },
      "message": "ci(nightly): replace GitHub pre-releases with lightweight git tags\n\nSwitch nightly workflow from creating GitHub pre-releases to using\nlightweight git tags for change detection and version tracking.\nThe plugin is already distributed via JetBrains Marketplace nightly\nchannel and workflow artifacts, making pre-releases redundant.\n\nChanges:\n- Replace `gh release list` queries with `git tag` lookups\n- Remove `Delete Previous Pre-release` step\n- Replace `Create Pre-release` step with `Create Nightly Tag`\n- Add `fetch-depth: 0` to nightly-release checkout for tag access\n- Remove unnecessary GH_TOKEN env vars\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ec1182218e2a8ad399876fcec18457074072a5d6",
      "tree": "99d2429dd1ca1c32b50e11656badb222dedaefa3",
      "parents": [
        "ba51c4b0d6d5b96c2258dd6e7e951495062b215b",
        "c0b64aec6c4abec7a5cfe91133c4f3b46495dfb9"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Feb 25 07:35:19 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 07:35:19 2026 +0100"
      },
      "message": "Merge pull request #54 from apache/fix/deprecated-api-warnings\n\nfix: resolve deprecated API warnings from Marketplace verification"
    },
    {
      "commit": "c0b64aec6c4abec7a5cfe91133c4f3b46495dfb9",
      "tree": "99d2429dd1ca1c32b50e11656badb222dedaefa3",
      "parents": [
        "ba51c4b0d6d5b96c2258dd6e7e951495062b215b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 07:26:07 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 07:26:07 2026 +0100"
      },
      "message": "fix: resolve deprecated API warnings from Marketplace verification\n\n- Migrate DaemonCodeAnalyzer.restart() to restart(PsiFile) overload\n- Suppress GraphBuilder.queueUpdate()/initialize() deprecations (no replacement)\n- Suppress FacetConfiguration.readExternal/writeExternal deprecations (no replacement)\n- Suppress CheckboxTreeBase constructor deprecation (no replacement)\n- Add migration note pointing to Diagrams API as future replacement\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ba51c4b0d6d5b96c2258dd6e7e951495062b215b",
      "tree": "b7f593234fe1e65e1cc3f28c2ac998eeb815d185",
      "parents": [
        "1d295e533e1f397d5d891184f470b371f501e601",
        "c5099a94589ff50bfc13f71beb2db8824df61bc3"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Feb 25 07:04:09 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 07:04:09 2026 +0100"
      },
      "message": "Merge pull request #53 from apache/fix/nightly-version-generation\n\nfix(ci): exclude pre-releases when resolving nightly build number"
    },
    {
      "commit": "c5099a94589ff50bfc13f71beb2db8824df61bc3",
      "tree": "b7f593234fe1e65e1cc3f28c2ac998eeb815d185",
      "parents": [
        "1d295e533e1f397d5d891184f470b371f501e601"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 06:55:29 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Feb 25 06:55:29 2026 +0100"
      },
      "message": "fix(ci): exclude pre-releases when resolving latest build number\n\nThe nightly version generator fetched the most recent release\n(including pre-releases) to determine the next build number.\nWhen the latest release was a nightly (e.g., v253.18981-nightly.1),\nthe sed pattern failed to extract the build number, producing\nbroken versions like \"253.-nightly.2\".\n\nAdd --exclude-pre-releases flag and remove obsolete fallback defaults\nthat are no longer needed now that stable releases exist.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "1d295e533e1f397d5d891184f470b371f501e601",
      "tree": "ebbbc9007197594f53b5ff2a23f4d46e01157a8e",
      "parents": [
        "194d39166ca6605148495fe2cda334b178b49970"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Feb 25 06:47:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 06:47:46 2026 +0100"
      },
      "message": "fix: resolve 22 Qodana warnings from CI analysis (#52)\n\n- Exclude src/main/gen from Qodana scanning (9 generated code warnings)\n- Replace redundant Collection.addAll() with constructor initialization\n- Fix 7 incorrect string capitalization warnings in bundle and source\n- Remove unnecessary null check before equals() in StrutsFileSet\n- Replace string concatenation in loop with StringBuilder\n- Suppress unstable API warnings with no public replacements\n- Migrate Struts2GraphComponent from DataProvider to UiDataProvider\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "194d39166ca6605148495fe2cda334b178b49970",
      "tree": "3f616301021c429963d042a864ceba269e131b6f",
      "parents": [
        "86308a011073b7d376c1304a6db06031f4554b03"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Feb 24 15:25:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 24 15:25:52 2026 +0100"
      },
      "message": "fix: resolve 21 critical nullability/NPE warnings from Qodana CI (#51)\n\nAdd null guards and fix nullable annotations across 15 files to prevent\npotential runtime NPE crashes identified by Qodana static analysis:\n\n- ResultNode: replace FileTypes.UNKNOWN.getIcon() with AllIcons.FileTypes.Unknown\n- Struts2GlobalVariableProvider (freemarker): null-guard action.getXmlTag()\n- ActionPathResultContributor: null-guard action.getXmlTag() in getVariants()\n- ActionChainOrRedirectResultContributor: same pattern in getVariants()\n- GoToActionSymbolProvider: null-guard action.getXmlTag() in addItems()\n- ResultActionPropertyReferenceProvider: null-guard result.getXmlTag(), simplify dead Math.max()\n- StrutsConstantValueReference: null-guard getErrorMessage() return\n- CreateValidationXmlIntention: null-guard action.getName().getStringValue()\n- ExtendableClassConverterSpringContributor: null-guard getPossibleSubClasses()\n- ConstantValueConverterImpl: null-guard domElement.getXmlTag()\n- HardcodedActionUrlInspection: assert buildTag result non-null\n- ValidatorManagerImpl: null-guard clazz.getName()\n- GotoRelatedActionProvider: null-guard pathReference.resolve()\n- StrutsConventionImplicitUsageProvider: null-guard psiClass.getName()\n- StrutsDataModel: fix @Nullable to @NotNull on createGroupNodeRealizer()\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "86308a011073b7d376c1304a6db06031f4554b03",
      "tree": "35670e37d22ae5d5011fe5b2285f00e76515c9f8",
      "parents": [
        "ae3f9930ac41e8ca06dcfc50bd1a3eda78f97c36",
        "b95b90505a2ac464ef11aed593eedf3b68588b2c"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Feb 24 10:35:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 24 10:35:42 2026 +0100"
      },
      "message": "Merge pull request #50 from apache/fix/nightly-prerelease-filter\n\nfix(ci): filter nightly workflow to only target nightly pre-releases"
    },
    {
      "commit": "b95b90505a2ac464ef11aed593eedf3b68588b2c",
      "tree": "620a0ba760fbc649fec9249930d50055b90cf22a",
      "parents": [
        "99f0faa9d772020d504686eff2dbd7552def3482"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Feb 24 10:28:04 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Feb 24 10:28:04 2026 +0100"
      },
      "message": "fix(ci): filter nightly workflow to only target nightly pre-releases\n\nAdd `| select(contains(\"nightly\"))` to three jq filters in the nightly\nworkflow so it no longer interferes with release candidate pre-releases\ncreated by prepare_release.yml:\n\n- check-changes: baseline commit count uses last nightly tag only\n- version generation: nightly counter derived from nightly releases only\n- delete step: only deletes previous nightly pre-releases\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ae3f9930ac41e8ca06dcfc50bd1a3eda78f97c36",
      "tree": "66b6e005442274a1d522aa370453be4633259731",
      "parents": [
        "99f0faa9d772020d504686eff2dbd7552def3482",
        "bf53c2b2620f6ee94567f0f677089c7082cb302e"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Feb 24 10:13:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 24 10:13:38 2026 +0100"
      },
      "message": "Merge pull request #49 from apache/ci/merge-pr-artifact-comment-into-build\n\nci: merge PR artifact comment into build workflow"
    },
    {
      "commit": "bf53c2b2620f6ee94567f0f677089c7082cb302e",
      "tree": "66b6e005442274a1d522aa370453be4633259731",
      "parents": [
        "99f0faa9d772020d504686eff2dbd7552def3482"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Feb 24 10:04:57 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Feb 24 10:04:57 2026 +0100"
      },
      "message": "ci: merge PR artifact comment into build workflow\n\nThe workflow_run-based pr-artifact.yml fails for cross-fork PRs because\nthe pull_requests array is empty. Moving the comment logic directly into\nbuild.yml as a conditional job eliminates this issue by using the natively\navailable context.payload.pull_request.number.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "99f0faa9d772020d504686eff2dbd7552def3482",
      "tree": "bae602bbaa22016e63ca48cd9010b461a350ab93",
      "parents": [
        "ab368341cc00d02e8d13476ad3d614636cf581f8",
        "7e9a6ca86cc7e624ba56d90a00567a57a56db0ce"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Tue Feb 24 07:33:07 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 24 07:33:07 2026 +0100"
      },
      "message": "Merge pull request #48 from apache/fix/nightly-version-collision\n\nci(nightly): fix version collision in nightly workflow"
    },
    {
      "commit": "7e9a6ca86cc7e624ba56d90a00567a57a56db0ce",
      "tree": "bae602bbaa22016e63ca48cd9010b461a350ab93",
      "parents": [
        "ab368341cc00d02e8d13476ad3d614636cf581f8"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Feb 24 07:25:44 2026 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Feb 24 07:25:44 2026 +0100"
      },
      "message": "ci(nightly): fix version collision in nightly workflow\n\nTwo bugs caused nightly uploads to fail with duplicate version errors:\n\n1. Branch prefix was read from pluginSinceBuild (252) instead of\n   pluginVersion (253), producing wrong version numbers.\n\n2. Nightly counter was hardcoded to .1, so re-triggers or retained\n   Marketplace versions caused collisions. Now increments the counter\n   from the latest pre-release tag.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ab368341cc00d02e8d13476ad3d614636cf581f8",
      "tree": "724a5bc62653e7c330048996acef929386b20552",
      "parents": [
        "d20f34935bbf5f04a9b3557987d6f2a73a4dbdeb"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Feb 23 20:16:23 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 20:16:23 2026 +0100"
      },
      "message": "config(github): enables automerge of PRs (#46)\n\n"
    },
    {
      "commit": "d20f34935bbf5f04a9b3557987d6f2a73a4dbdeb",
      "tree": "c9b945593bd11d91b7ca7eb9a05a7e0978cf8572",
      "parents": [
        "629dab4579272c93eb96e5752f36becfdbf5ee0d"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Feb 23 20:16:10 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 20:16:10 2026 +0100"
      },
      "message": "docs: clean up README by removing template boilerplate (#45)\n\nReplace IntelliJ Platform Plugin Template boilerplate with project-specific\ncontent: correct plugin description, actual Java test locations, real Gradle\ncommands. Remove non-existent UI tests, Qodana, and Run configurations sections.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "629dab4579272c93eb96e5752f36becfdbf5ee0d",
      "tree": "a0eca9a458c0502615928112b7389362d313d063",
      "parents": [
        "4937d77dfea8e76b0547902df8093a607bc2c84b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Feb 23 20:15:43 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 20:15:43 2026 +0100"
      },
      "message": "ci: convert pre-release from per-push to nightly schedule (#47)\n\nMove the createPrerelease job out of build.yml into a dedicated\nnightly.yml workflow that runs daily at 2:00 AM UTC. The new workflow\nchecks for new commits since the last pre-release before building,\navoiding redundant nightly versions when multiple PRs merge in a day.\nManual trigger via workflow_dispatch is also supported.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "4937d77dfea8e76b0547902df8093a607bc2c84b",
      "tree": "d5f11f384ac6191a8b139b6174b4c5cc42ff0858",
      "parents": [
        "8c776641d266b7d58a1e09f32c88ec0e480dfaaf"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Feb 23 18:00:40 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 18:00:40 2026 +0100"
      },
      "message": "ci: add two-phase release workflow with prepare and publish steps (#44)\n\nAdd prepare_release.yml workflow (manual dispatch) that builds the plugin,\ncreates a git tag, and publishes a GitHub pre-release for PMC review.\nWhen the pre-release is promoted to a full release, the existing release.yml\nfires and publishes to the Marketplace Stable channel.\n\nAlso fixes:\n- release.yml trigger narrowed to [released] only (was [prereleased, released])\n- build.yml nightly builds now publish to Marketplace nightly channel\n- build.yml HEREDOC bug in pre-release notes creation\n- README.md documents the full release process\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8c776641d266b7d58a1e09f32c88ec0e480dfaaf",
      "tree": "4ee0e85c177d63efac1bae37fef5a16304893e13",
      "parents": [
        "f6de54f2525c23c8cdc8ee38fd98ccc055972793"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Feb 23 17:19:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 17:19:33 2026 +0100"
      },
      "message": "fix: strip leading slash from DTD resource path (#43)\n\nIn IntelliJ 2025.3, PluginClassLoader.findResource() no longer resolves\nresource paths with a leading `/`. Remove the leading slash from\nDTD_PATH to fix marketplace verification error.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "f6de54f2525c23c8cdc8ee38fd98ccc055972793",
      "tree": "b06560b90a952051650aaeb4edea336cf747c4e5",
      "parents": [
        "ecb2c8768ea8b0c1147afb46ebafd3cadc2df2d0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Mon Feb 23 15:07:43 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 15:07:43 2026 +0100"
      },
      "message": "fix: remediate private and deprecated API usages for marketplace approval (#42)\n\nReplace internal and deprecated IntelliJ Platform APIs to pass\nJetBrains Marketplace verification for plugin version 253.x.\n\nChanges:\n- Replace IconManager.loadRasterizedIcon() with IconLoader.getIcon()\n- Replace WebFacet.getWebRoots(boolean) with getWebRoots()\n- Replace AnActionButton with DumbAwareAction in toolbar\n- Replace IdeFocusManager.doWhenFocusSettlesDown() with requestFocus()\n- Replace ResourceRegistrar.addStdResource(Class) with ClassLoader version\n- Replace FilenameIndex.getFilesByName() with getVirtualFilesByName()\n- Replace deprecated URL(String) constructor with URI.create().toURL()\n- Document GraphBuilder internal API usage (no public replacement)\n- Document EXTEND_CLASS_NAMES deprecation (no replacement available)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ecb2c8768ea8b0c1147afb46ebafd3cadc2df2d0",
      "tree": "c48aced222f13739c8a3aea6aa489dea6c3bd155",
      "parents": [
        "167bd7c319bac7085e79824b89254731817d60ac"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Wed Jan 21 16:48:20 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 21 16:48:20 2026 +0100"
      },
      "message": "feat: WW-5563 add support for IntelliJ Platform 2025.3 (#29)\n\n* build: upgrade to IntelliJ Platform 2025.3\n\n- Update platformVersion to 2025.3 (build 253.x)\n- Update pluginSinceBuild/pluginUntilBuild to 252-253.*\n- Upgrade org.jetbrains.intellij.platform plugin to 2.10.4\n- Upgrade Gradle to 8.13 (required by platform plugin)\n- Migrate to unified intellijIdea() dependency (2025.3 unified distribution)\n- Update Qodana linter and action to 2025.3\n- Fix CreateFileAction API change (Icon -\u003e Supplier\u003cIcon\u003e)\n- Fix removed BuildableRootsChangeRescanningInfo.addModule() API\n- Temporarily disable 25 tests for 2025.3 compatibility fixes\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* fix(facet): populate file sets when framework is detected\n\n- Add setupFacet() override to StrutsFrameworkDetector to automatically\n  add detected struts.xml files to file sets when user clicks \"Configure\"\n- Fix key mismatch in StrutsFrameworkInitializer (was storing with\n  project.getName() but retrieving with project.getLocationHash())\n- Fix NPE in StrutsFrameworkInitializer fallback logic that called\n  performInitialization with null facet\n- Refactor framework initialization to use modern ProjectActivity pattern\n- Update various files for IntelliJ Platform 2025.3 compatibility\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* chore: update plugin vendor and add custom icon\n\n- Change vendor from JetBrains to Apache Software Foundation\n- Add custom plugin icon (Apache feather logo) at 40x40 resolution\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* Mutes some verifications issues as the plugin was already uploaded into Marketplace\n\n* build: configure plugin verifier mute options in gradle\n\nMove -mute options from command-line (which caused parsing errors) to\nbuild.gradle.kts pluginVerification.freeArgs configuration.\n\nThis plugin was donated by JetBrains and retains its original ID\n\u0027com.intellij.struts2\u0027 for backwards compatibility.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* Upgrades IntelliJ Platform Gradle Plugin\n\n* Disables continue-on-error\n\n* build: disable configuration cache in CI workflow\n\nWork around XML parsing issues in IntelliJ Platform Gradle Plugin\nwhen resolving bundled plugin dependencies with configuration cache.\n\nThe error \"Recursive lookup of IvyModule.Dependency.Artifact\" occurs\nduring dependency resolution for bundled plugins like com.intellij.javaee.web.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "167bd7c319bac7085e79824b89254731817d60ac",
      "tree": "1f451250381fd79141220c93fafd54ce3e2d89d7",
      "parents": [
        "330738160d06fb8d64eb5e3c128d7f92dc98f6a7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jan 14 06:43:56 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 14 06:43:56 2026 +0100"
      },
      "message": "ci(deps): bump actions/upload-artifact from 4 to 6 (#41)\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 6.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "330738160d06fb8d64eb5e3c128d7f92dc98f6a7",
      "tree": "de9bd0e8beee0d6b2c2a1335652dc7109ced4526",
      "parents": [
        "a7b937671dd243a26eab022aa8017bc3ba880e76"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jan 14 06:43:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 14 06:43:46 2026 +0100"
      },
      "message": "ci(deps): bump gradle/actions from 3 to 5 (#40)\n\nBumps [gradle/actions](https://github.com/gradle/actions) from 3 to 5.\n- [Release notes](https://github.com/gradle/actions/releases)\n- [Commits](https://github.com/gradle/actions/compare/v3...v5)\n\n---\nupdated-dependencies:\n- dependency-name: gradle/actions\n  dependency-version: \u00275\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a7b937671dd243a26eab022aa8017bc3ba880e76",
      "tree": "fae38429d605624fc6fc0a7aff07cb3a012cb1cb",
      "parents": [
        "52a0f65396a1ae8dadf175713550385ad753e631"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jan 14 06:43:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 14 06:43:24 2026 +0100"
      },
      "message": "ci(deps): bump actions/checkout from 4 to 6 (#39)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "52a0f65396a1ae8dadf175713550385ad753e631",
      "tree": "db0d5ad7938f341b86f6c5e5e4c23f83db194134",
      "parents": [
        "a5d72ac274b2af09f04905c61046e3a757c57b14"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jan 11 08:21:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 11 08:21:24 2026 +0100"
      },
      "message": "ci(deps): bump actions/setup-java from 4 to 5 (#36)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 4 to 5.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: \u00275\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a5d72ac274b2af09f04905c61046e3a757c57b14",
      "tree": "3f08c195629ba899f7584e75d0067fc2bd539e2d",
      "parents": [
        "fd60b9b8db21875c71be43d7b58aba4a8351af09"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jan 11 08:21:12 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 11 08:21:12 2026 +0100"
      },
      "message": "ci(deps): bump actions/cache from 4 to 5 (#35)\n\nBumps [actions/cache](https://github.com/actions/cache) from 4 to 5.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: \u00275\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "fd60b9b8db21875c71be43d7b58aba4a8351af09",
      "tree": "c30cacd9a95300d945e06d913d966183700e604e",
      "parents": [
        "441c4554433ac20d7fdeff01fe978e31d625ff44"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jan 11 08:20:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 11 08:20:52 2026 +0100"
      },
      "message": "ci(deps): bump codecov/codecov-action from 4 to 5 (#34)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.\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/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: \u00275\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "441c4554433ac20d7fdeff01fe978e31d625ff44",
      "tree": "d83280b8ea888a5e0925aa238bcf1032a4c92546",
      "parents": [
        "fdd2848a0d38b5d75a254e85c4b0b42dfcf7f367"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jan 11 08:20:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 11 08:20:39 2026 +0100"
      },
      "message": "ci(deps): bump JetBrains/qodana-action from 2024.2.6 to 2025.3.1 (#33)\n\nBumps [JetBrains/qodana-action](https://github.com/jetbrains/qodana-action) from 2024.2.6 to 2025.3.1.\n- [Release notes](https://github.com/jetbrains/qodana-action/releases)\n- [Commits](https://github.com/jetbrains/qodana-action/compare/v2024.2.6...v2025.3.1)\n\n---\nupdated-dependencies:\n- dependency-name: JetBrains/qodana-action\n  dependency-version: 2025.3.1\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "fdd2848a0d38b5d75a254e85c4b0b42dfcf7f367",
      "tree": "63801e9c68bd9ae8104701820bec99ca386cb5df",
      "parents": [
        "12305b0efb00873597700c3b68682ce1c8d367b6"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jan 10 21:06:28 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 21:06:28 2026 +0100"
      },
      "message": "chore: add GitHub repository metadata to .asf.yaml (#38)\n\nAdd description, homepage URL, and labels configuration for the\nGitHub repository to improve discoverability and organization.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "12305b0efb00873597700c3b68682ce1c8d367b6",
      "tree": "76ccfd78674e9d203dc2f4d992b1b8b3aef7105c",
      "parents": [
        "37e82b156212f497f001467dfb9ab3236eaa9a1a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Jan 10 21:00:35 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 21:00:35 2026 +0100"
      },
      "message": "ci(deps): bump actions/github-script from 7 to 8 (#32)\n\nBumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/v7...v8)\n\n---\nupdated-dependencies:\n- dependency-name: actions/github-script\n  dependency-version: \u00278\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "37e82b156212f497f001467dfb9ab3236eaa9a1a",
      "tree": "aa4970fa5c6edc2496e9eaaa6deec196d64586ea",
      "parents": [
        "221b7986702ed3beeff5b42e153cbf8785e986ac"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jan 10 20:51:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 20:51:21 2026 +0100"
      },
      "message": "fix(ci): resolve Dependabot PR comment permission error (#37)\n\nMove PR artifact comment logic to dedicated workflow triggered by\nworkflow_run. This fixes the \"Resource not accessible by integration\"\n403 error on Dependabot PRs by running in repository context with\nproper permissions.\n\nChanges:\n- Remove inline comment step from build.yml\n- Add new pr-artifact.yml workflow with workflow_run trigger\n- Skip comment workflow for Dependabot PRs (not needed for deps updates)\n- Skip artifact preparation and upload for Dependabot PRs\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "221b7986702ed3beeff5b42e153cbf8785e986ac",
      "tree": "911252d6a361551cf573177fa88beeae89411dc5",
      "parents": [
        "793ecb90fa2d406092a5f33321dabfd5cdc6b0aa"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jan 10 20:04:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 20:04:03 2026 +0100"
      },
      "message": "feat(ci): add artifact download for PR builds (#30)\n\n* feat(ci): add artifact download for PR builds\n\n- Add artifact preparation and upload steps to build job\n- Add sticky PR comment with download link to artifacts\n- Enables reviewers to test plugin without building locally\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* fix(ci): replace third-party action with actions/github-script\n\nReplace marocchino/sticky-pull-request-comment with actions/github-script\nto comply with Apache\u0027s requirement that all actions must be from\napproved repositories (GitHub-owned actions are allowed).\n\nThe sticky comment behavior is preserved using a hidden HTML marker\nto find and update existing comments.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "793ecb90fa2d406092a5f33321dabfd5cdc6b0aa",
      "tree": "76faa41bb3ec4808f4c99ae15174fd78a9d00704",
      "parents": [
        "90474ff757935bc286fc7849d08714d2682c7189"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Jan 10 20:03:41 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 20:03:41 2026 +0100"
      },
      "message": "ci: add dependabot config for GitHub Actions updates (#31)\n\nConfigure Dependabot to automatically check for GitHub Actions updates\non a weekly basis and create PRs with conventional commit messages.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "90474ff757935bc286fc7849d08714d2682c7189",
      "tree": "e6324247b0e0d1544871d408ef50ff86dab07a1b",
      "parents": [
        "047dd022e2b7c4315a09c0916e408c180836df04",
        "9129684487eee91e8114535b1f5d8ae631d5a884"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukasz.lenart@gmail.com",
        "time": "Sat Aug 16 09:21:37 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 16 09:21:37 2025 +0200"
      },
      "message": "Merge pull request #27 from apache/fix/clean-old-prerelease\n\nRemoves old prereleases"
    }
  ],
  "next": "9129684487eee91e8114535b1f5d8ae631d5a884"
}
