@elliemae/pui-cli 9.0.0-alpha.11 → 9.0.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +2 -1
  2. package/build/docs/404.html +2 -2
  3. package/build/docs/api/functions/loadRoutes/index.html +2 -2
  4. package/build/docs/api/index.html +2 -2
  5. package/build/docs/api/type-aliases/LIB_NAME/index.html +2 -2
  6. package/build/docs/api/variables/babelConfig/index.html +2 -2
  7. package/build/docs/api/variables/commitlintConfig/index.html +2 -2
  8. package/build/docs/api/variables/eslintBaseConfig/index.html +2 -2
  9. package/build/docs/api/variables/eslintConfig/index.html +2 -2
  10. package/build/docs/api/variables/eslintFlatBaseConfig/index.html +2 -2
  11. package/build/docs/api/variables/eslintFlatBaseConfigStrict/index.html +2 -2
  12. package/build/docs/api/variables/eslintFlatConfig/index.html +2 -2
  13. package/build/docs/api/variables/eslintFlatConfigStrict/index.html +2 -2
  14. package/build/docs/api/variables/jestConfig/index.html +2 -2
  15. package/build/docs/api/variables/jestNodeConfig/index.html +2 -2
  16. package/build/docs/api/variables/lintStagedConfig/index.html +2 -2
  17. package/build/docs/api/variables/prettierConfig/index.html +2 -2
  18. package/build/docs/api/variables/stylelintConfig/index.html +2 -2
  19. package/build/docs/api/variables/vitestConfig/index.html +2 -2
  20. package/build/docs/assets/js/04ee7372.2852111b.js +1 -0
  21. package/build/docs/assets/js/13097d8d.7877421c.js +1 -0
  22. package/build/docs/assets/js/4fb6949f.69e375e4.js +1 -0
  23. package/build/docs/assets/js/{main.7f815b7e.js → main.d5acb4ca.js} +2 -2
  24. package/build/docs/assets/js/runtime~main.4f7cd700.js +1 -0
  25. package/build/docs/eslint-rules-migration/index.html +6 -6
  26. package/build/docs/index.html +2 -2
  27. package/build/docs/pui-cli-9-migration/index.html +63 -6
  28. package/build/docs/ssl-certificate-setup/index.html +2 -2
  29. package/build/docs/stylelint-migration/index.html +2 -2
  30. package/build/docs/usage-guide/index.html +4 -4
  31. package/dist/cjs/commands/storybook.js +33 -4
  32. package/dist/cjs/lint-config/eslint/flat/compat.mjs +5 -5
  33. package/dist/cjs/skills/migrate-storybook-out-of-cjs/SKILL.md +188 -0
  34. package/dist/cjs/skills/migrate-to-pui-cli-9/SKILL.md +93 -18
  35. package/dist/cjs/testing/jest.config.cjs +5 -1
  36. package/dist/cjs/testing/setup-textencoder.cjs +4 -0
  37. package/dist/cjs/webpack/webpack.storybook.js +62 -0
  38. package/dist/esm/commands/storybook.js +22 -4
  39. package/dist/esm/lint-config/eslint/flat/compat.mjs +5 -5
  40. package/dist/esm/skills/migrate-storybook-out-of-cjs/SKILL.md +188 -0
  41. package/dist/esm/skills/migrate-to-pui-cli-9/SKILL.md +93 -18
  42. package/dist/esm/testing/jest.config.cjs +5 -1
  43. package/dist/esm/testing/setup-textencoder.cjs +4 -0
  44. package/dist/esm/webpack/webpack.storybook.js +61 -0
  45. package/dist/types/lib/commands/storybook.d.ts +1 -0
  46. package/dist/types/lib/lint-config/eslint/flat/compat.d.mts +1 -1
  47. package/dist/types/lib/testing/setup-textencoder.d.cts +1 -0
  48. package/dist/types/lib/webpack/webpack.storybook.d.ts +2 -0
  49. package/dist/types/tsconfig.tsbuildinfo +1 -1
  50. package/lib/lint-config/eslint/flat/compat.mjs +5 -5
  51. package/lib/skills/migrate-storybook-out-of-cjs/SKILL.md +188 -0
  52. package/lib/skills/migrate-to-pui-cli-9/SKILL.md +93 -18
  53. package/package.json +15 -21
  54. package/build/docs/assets/js/04ee7372.eaa386ed.js +0 -1
  55. package/build/docs/assets/js/13097d8d.af480dfd.js +0 -1
  56. package/build/docs/assets/js/4fb6949f.369cc1b9.js +0 -1
  57. package/build/docs/assets/js/runtime~main.f7c5bef0.js +0 -1
  58. /package/build/docs/assets/js/{main.7f815b7e.js.LICENSE.txt → main.d5acb4ca.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e,a,d,r,t,b={},f={};function c(e){var a=f[e];if(void 0!==a)return a.exports;var d=f[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,c),d.loaded=!0,d.exports}c.m=b,c.c=f,e=[],c.O=(a,d,r,t)=>{if(!d){var b=1/0;for(i=0;i<e.length;i++){for(var[d,r,t]=e[i],f=!0,o=0;o<d.length;o++)(!1&t||b>=t)&&Object.keys(c.O).every(e=>c.O[e](d[o]))?d.splice(o--,1):(f=!1,t<b&&(b=t));if(f){e.splice(i--,1);var n=r();void 0!==n&&(a=n)}}return a}t=t||0;for(var i=e.length;i>0&&e[i-1][2]>t;i--)e[i]=e[i-1];e[i]=[d,r,t]},c.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return c.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var t=Object.create(null);c.r(t);var b={};a=a||[null,d({}),d([]),d(d)];for(var f=2&r&&e;("object"==typeof f||"function"==typeof f)&&!~a.indexOf(f);f=d(f))Object.getOwnPropertyNames(f).forEach(a=>b[a]=()=>e[a]);return b.default=()=>e,c.d(t,b),t},c.d=(e,a)=>{for(var d in a)c.o(a,d)&&!c.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce((a,d)=>(c.f[d](e,a),a),[])),c.u=e=>"assets/js/"+({594:"5e8c322a",1019:"4fb6949f",1091:"5fb3c522",1380:"5befad71",1572:"0a1d0315",1712:"0551d4dd",1724:"e5f79924",2113:"6bd11e52",2577:"f736c962",2960:"5d5f1db0",3361:"c377a04b",3891:"71f6d02b",4676:"80e87108",5455:"13097d8d",5742:"aba21aa0",5908:"04ee7372",5983:"dfd75424",6130:"16b7bc88",6264:"b7b585d8",6688:"6e96545e",7098:"a7bd4aaa",7581:"37d86055",7589:"232a0286",7613:"b8ac1d98",8155:"bde5209a",8401:"17896441",9048:"a94703ab",9577:"1b9df811",9647:"5e95c892"}[e]||e)+"."+{97:"70eddfb5",213:"e69351b3",242:"73516ab6",247:"e1522e52",594:"ef3b894b",821:"8d4e2a80",936:"c151b43f",1019:"69e375e4",1091:"da5628e8",1126:"fa547e9c",1127:"f28430e6",1298:"fb0939c9",1380:"5f19afb5",1572:"fc8f91a7",1617:"b2623271",1700:"4f7a9007",1712:"ebb18f4f",1724:"c793a74d",2113:"08b95209",2297:"e63290f4",2399:"cc5803e0",2577:"dbd0d004",2673:"da75a556",2805:"f0505f8c",2960:"c5aa5afa",3361:"0f8625c6",3395:"eb3dad5b",3499:"2d5c6821",3552:"9272c0d9",3720:"8e7f36d4",3891:"cfd98385",3992:"0ac29b2f",4069:"301f1115",4134:"553b3645",4257:"9afce6ac",4676:"f9507b95",4772:"6294b364",4884:"9dbe23e5",5196:"98f7e06a",5248:"ee436cea",5428:"71752e9a",5455:"7877421c",5742:"3bbcf0cc",5908:"2852111b",5964:"0728ed91",5968:"5f4ccba7",5983:"51c4e2cb",6130:"c3779e27",6264:"6d53e73f",6486:"68ae0007",6688:"30c1b801",6704:"2615a5c6",7080:"efd5ba6c",7098:"30ffad02",7201:"e90ba636",7344:"95656e38",7516:"b6668d60",7525:"a8d0db87",7540:"7a4353cf",7581:"47211796",7589:"33b2782b",7613:"62684003",7985:"8c6943d6",8049:"8ba75278",8152:"f2bebb2f",8155:"f5bca8b2",8290:"a4f7a2ca",8355:"864847a1",8389:"26a9caca",8401:"84339068",8585:"3cb09ff7",8788:"03856709",9048:"f1796514",9178:"50ac2954",9210:"1ac21da8",9354:"37ad86f9",9574:"b172d607",9577:"aaa95da1",9647:"f550b901",9852:"f77caf52",9953:"f6278635"}[e]+".js",c.miniCssF=e=>{},c.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r={},t="@elliemae/pui-cli:",c.l=(e,a,d,b)=>{if(r[e])r[e].push(a);else{var f,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var l=n[i];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==t+d){f=l;break}}f||(o=!0,(f=document.createElement("script")).charset="utf-8",c.nc&&f.setAttribute("nonce",c.nc),f.setAttribute("data-webpack",t+d),f.src=e),r[e]=[a];var u=(a,d)=>{f.onerror=f.onload=null,clearTimeout(s);var t=r[e];if(delete r[e],f.parentNode&&f.parentNode.removeChild(f),t&&t.forEach(e=>e(d)),a)return a(d)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=u.bind(null,f.onerror),f.onload=u.bind(null,f.onload),o&&document.head.appendChild(f)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.dn=e=>{(Object.getOwnPropertyDescriptor(e,"name")||{}).writable||Object.defineProperty(e,"name",{value:"default",configurable:!0})},c.p="/cli/",c.gca=function(e){return e={17896441:"8401","5e8c322a":"594","4fb6949f":"1019","5fb3c522":"1091","5befad71":"1380","0a1d0315":"1572","0551d4dd":"1712",e5f79924:"1724","6bd11e52":"2113",f736c962:"2577","5d5f1db0":"2960",c377a04b:"3361","71f6d02b":"3891","80e87108":"4676","13097d8d":"5455",aba21aa0:"5742","04ee7372":"5908",dfd75424:"5983","16b7bc88":"6130",b7b585d8:"6264","6e96545e":"6688",a7bd4aaa:"7098","37d86055":"7581","232a0286":"7589",b8ac1d98:"7613",bde5209a:"8155",a94703ab:"9048","1b9df811":"9577","5e95c892":"9647"}[e]||e,c.p+c.u(e)},(()=>{var e={5354:0,1869:0};c.f.j=(a,d)=>{var r=c.o(e,a)?e[a]:void 0;if(0!==r)if(r)d.push(r[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var t=new Promise((d,t)=>r=e[a]=[d,t]);d.push(r[2]=t);var b=c.p+c.u(a),f=new Error;c.l(b,d=>{if(c.o(e,a)&&(0!==(r=e[a])&&(e[a]=void 0),r)){var t=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;f.message="Loading chunk "+a+" failed.\n("+t+": "+b+")",f.name="ChunkLoadError",f.type=t,f.request=b,r[1](f)}},"chunk-"+a,a)}},c.O.j=a=>0===e[a];var a=(a,d)=>{var r,t,[b,f,o]=d,n=0;if(b.some(a=>0!==e[a])){for(r in f)c.o(f,r)&&(c.m[r]=f[r]);if(o)var i=o(c)}for(a&&a(d);n<b.length;n++)t=b[n],c.o(e,t)&&e[t]&&e[t][0](),e[t]=0;return c.O(i)},d=globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[];d.forEach(a.bind(null,0)),d.push=a.bind(null,d.push.bind(d))})()})();
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.10.1">
6
6
  <title data-rh="true">ESLint rules migration guide (legacy → ESLint 10 flat config) | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/eslint-rules-migration"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="ESLint rules migration guide (legacy → ESLint 10 flat config) | Cli"><meta data-rh="true" name="description" content="This document compares the previous @elliemae/pui-cli ESLint setup (ESLint 8 + .eslintrc.cjs + Airbnb) with the current setup (ESLint 10 + eslint.config.mjs + typescript-eslint v8 flat config)."><meta data-rh="true" property="og:description" content="This document compares the previous @elliemae/pui-cli ESLint setup (ESLint 8 + .eslintrc.cjs + Airbnb) with the current setup (ESLint 10 + eslint.config.mjs + typescript-eslint v8 flat config)."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/eslint-rules-migration"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/eslint-rules-migration" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/eslint-rules-migration" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"ESLint rules migration guide (legacy → ESLint 10 flat config)","item":"https://pui.ice.com/cli/eslint-rules-migration"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.74603f39.css">
7
- <script src="/cli/assets/js/runtime~main.f7c5bef0.js" defer="defer"></script>
8
- <script src="/cli/assets/js/main.7f815b7e.js" defer="defer"></script>
7
+ <script src="/cli/assets/js/runtime~main.4f7cd700.js" defer="defer"></script>
8
+ <script src="/cli/assets/js/main.d5acb4ca.js" defer="defer"></script>
9
9
  </head>
10
10
  <body>
11
11
  <svg style="display: none;"><defs>
@@ -33,7 +33,7 @@
33
33
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="removed-no-longer-extended">Removed (no longer extended)<a href="#removed-no-longer-extended" class="hash-link" aria-label="Direct link to Removed (no longer extended)" title="Direct link to Removed (no longer extended)" translate="no">​</a></h3>
34
34
  <table><thead><tr><th>Legacy extend</th><th>Impact</th></tr></thead><tbody><tr><td><code>airbnb</code> / <code>airbnb/hooks</code></td><td>React style rules from Airbnb (e.g. <code>react/jsx-props-no-spreading</code>, <code>react/no-array-index-key</code>, stricter JSX patterns) are <strong>gone</strong> unless we set them explicitly in PUI config.</td></tr><tr><td><code>airbnb-base</code></td><td>Same for non-React JS.</td></tr><tr><td><code>airbnb-typescript</code> / <code>airbnb-typescript/base</code></td><td>Airbnb + TypeScript combo rules removed.</td></tr><tr><td><code>plugin:prettier/recommended</code></td><td><code>prettier/prettier</code> is no longer an ESLint error.</td></tr><tr><td><code>plugin:import/recommended</code></td><td>Replaced by <code>eslint-plugin-import-x</code> flat recommended.</td></tr><tr><td><code>plugin:mdx/recommended</code></td><td>MDX-specific ESLint block removed from shared React config (Storybook flat config remains).</td></tr></tbody></table>
35
35
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="still-included-equivalent-or-better">Still included (equivalent or better)<a href="#still-included-equivalent-or-better" class="hash-link" aria-label="Direct link to Still included (equivalent or better)" title="Direct link to Still included (equivalent or better)" translate="no">​</a></h3>
36
- <table><thead><tr><th>Area</th><th>Legacy</th><th>Flat config</th></tr></thead><tbody><tr><td>Core JS</td><td>ESLint recommended (via Airbnb + plugins)</td><td><code>@eslint/js</code> <strong>recommended</strong></td></tr><tr><td>TypeScript</td><td><code>@typescript-eslint/recommended</code> + <strong>recommended-requiring-type-checking</strong></td><td><code>typescript-eslint</code> <strong>recommendedTypeChecked</strong></td></tr><tr><td>React</td><td><code>plugin:react/recommended</code> (via Airbnb)</td><td><code>eslint-plugin-react</code> <strong>recommended</strong></td></tr><tr><td>Hooks</td><td><code>react-hooks/rules-of-hooks</code> (explicit); <strong>no</strong> <code>exhaustive-deps</code> in old pui-cli</td><td><code>rules-of-hooks</code> <strong>error</strong> + <strong><code>exhaustive-deps</code> warn</strong> (new)</td></tr><tr><td>a11y</td><td><code>plugin:jsx-a11y/recommended</code></td><td><code>eslint-plugin-jsx-a11y</code> flat <strong>recommended</strong></td></tr><tr><td>Jest</td><td><code>plugin:jest/recommended</code></td><td><code>eslint-plugin-jest</code> <strong>recommended</strong></td></tr><tr><td>Testing Library</td><td><code>plugin:testing-library/dom</code></td><td>Same (<strong>dom</strong> rules only)</td></tr><tr><td>WDIO</td><td><code>plugin:wdio/recommended</code></td><td>Same</td></tr><tr><td>Redux Saga</td><td><code>plugin:redux-saga/recommended</code></td><td>Same</td></tr><tr><td>Storybook</td><td><code>plugin:storybook/recommended</code></td><td><code>eslint-plugin-storybook</code> flat <strong>recommended</strong> (v0.12, Storybook 6–compatible)</td></tr><tr><td>Prettier conflict</td><td><code>eslint-config-prettier</code> via <code>plugin:prettier/recommended</code></td><td><code>eslint-config-prettier</code> only (disables conflicting ESLint style rules)</td></tr></tbody></table>
36
+ <table><thead><tr><th>Area</th><th>Legacy</th><th>Flat config</th></tr></thead><tbody><tr><td>Core JS</td><td>ESLint recommended (via Airbnb + plugins)</td><td><code>@eslint/js</code> <strong>recommended</strong></td></tr><tr><td>TypeScript</td><td><code>@typescript-eslint/recommended</code> + <strong>recommended-requiring-type-checking</strong></td><td><code>typescript-eslint</code> <strong>recommendedTypeChecked</strong></td></tr><tr><td>React</td><td><code>plugin:react/recommended</code> (via Airbnb)</td><td><code>eslint-plugin-react</code> <strong>recommended</strong></td></tr><tr><td>Hooks</td><td><code>react-hooks/rules-of-hooks</code> (explicit); <strong>no</strong> <code>exhaustive-deps</code> in old pui-cli</td><td><code>rules-of-hooks</code> <strong>error</strong> + <strong><code>exhaustive-deps</code> warn</strong> (new)</td></tr><tr><td>a11y</td><td><code>plugin:jsx-a11y/recommended</code></td><td><code>eslint-plugin-jsx-a11y</code> flat <strong>recommended</strong></td></tr><tr><td>Jest</td><td><code>plugin:jest/recommended</code></td><td><code>eslint-plugin-jest</code> <strong>recommended</strong></td></tr><tr><td>Testing Library</td><td><code>plugin:testing-library/dom</code></td><td>Same (<strong>dom</strong> rules only)</td></tr><tr><td>WDIO</td><td><code>plugin:wdio/recommended</code></td><td>Same</td></tr><tr><td>Redux Saga</td><td><code>plugin:redux-saga/recommended</code></td><td>Same</td></tr><tr><td>Storybook</td><td><code>plugin:storybook/recommended</code></td><td><code>eslint-plugin-storybook</code> flat <strong>recommended</strong> (v10, Storybook 10–compatible)</td></tr><tr><td>Prettier conflict</td><td><code>eslint-config-prettier</code> via <code>plugin:prettier/recommended</code></td><td><code>eslint-config-prettier</code> only (disables conflicting ESLint style rules)</td></tr></tbody></table>
37
37
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="optional-not-enabled-by-default">Optional (not enabled by default)<a href="#optional-not-enabled-by-default" class="hash-link" aria-label="Direct link to Optional (not enabled by default)" title="Direct link to Optional (not enabled by default)" translate="no">​</a></h3>
38
38
  <table><thead><tr><th>Preset</th><th>Status</th></tr></thead><tbody><tr><td><code>typescript-eslint/strictTypeChecked</code></td><td><strong>Not</strong> enabled — optional stricter tier for a later rollout</td></tr><tr><td><code>typescript-eslint/stylistic*</code></td><td><strong>Not</strong> enabled — Prettier is the source of truth for formatting</td></tr></tbody></table>
39
39
  <hr>
@@ -100,10 +100,10 @@
100
100
  <hr>
101
101
  <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="post-migration-tune-ups-alpha-flat-config">Post-migration tune-ups (alpha flat config)<a href="#post-migration-tune-ups-alpha-flat-config" class="hash-link" aria-label="Direct link to Post-migration tune-ups (alpha flat config)" title="Direct link to Post-migration tune-ups (alpha flat config)" translate="no">​</a></h2>
102
102
  <p>The shared flat config includes pragmatic defaults to reduce migration noise while keeping high-value checks.</p>
103
- <table><thead><tr><th>Change</th><th>Behavior</th></tr></thead><tbody><tr><td><code>@typescript-eslint/no-misused-promises</code></td><td><code>checksVoidReturn.attributes: false</code> — async <code>onClick</code> / JSX handlers allowed</td></tr><tr><td><code>@typescript-eslint/no-unsafe-*</code></td><td><strong>warn</strong> in app code (not error); <strong>off</strong> in test globs (<code>*.{test,spec}.*</code>, <code>lib/**/tests/**</code>, etc.)</td></tr><tr><td><code>import-x/no-extraneous-dependencies</code></td><td><strong>off</strong> (legacy parity; apps use <code>@elliemae/app-react-dependencies</code>)</td></tr><tr><td>JSDoc</td><td>Full <code>jsdoc/recommended</code> <strong>removed</strong>; only legacy <code>require-jsdoc: off</code> + noisy rules explicitly off</td></tr><tr><td>Testing Library</td><td><code>dom</code> rules on test files; <strong>react</strong> rules on <code>*.{test,spec}.{tsx,jsx}</code></td></tr><tr><td>WDIO</td><td>Globals + rules on <code>*.func.spec.js</code>, <code>*.visual.spec.js</code>, <code>*e2e*</code>, and <code>**/e2e/**</code> (page-objects, etc.)</td></tr><tr><td>Storybook</td><td><code>react/jsx-props-no-spreading</code> off (React config); <code>eslint-plugin-storybook@0.12</code> shimmed in <code>compat.mjs</code> until Storybook 10</td></tr><tr><td><code>eslint.config.*</code></td><td><code>import-x/no-unresolved</code> off</td></tr><tr><td><code>scripts/**</code>, <code>ci_cd/**</code></td><td><code>no-console</code>, <code>max-lines</code>, <code>complexity</code> off</td></tr><tr><td><code>react-hooks/exhaustive-deps</code></td><td><strong>warn</strong> (not error) until repos are clean</td></tr></tbody></table>
103
+ <table><thead><tr><th>Change</th><th>Behavior</th></tr></thead><tbody><tr><td><code>@typescript-eslint/no-misused-promises</code></td><td><code>checksVoidReturn.attributes: false</code> — async <code>onClick</code> / JSX handlers allowed</td></tr><tr><td><code>@typescript-eslint/no-unsafe-*</code></td><td><strong>warn</strong> in app code (not error); <strong>off</strong> in test globs (<code>*.{test,spec}.*</code>, <code>lib/**/tests/**</code>, etc.)</td></tr><tr><td><code>import-x/no-extraneous-dependencies</code></td><td><strong>off</strong> (legacy parity; apps use <code>@elliemae/app-react-dependencies</code>)</td></tr><tr><td>JSDoc</td><td>Full <code>jsdoc/recommended</code> <strong>removed</strong>; only legacy <code>require-jsdoc: off</code> + noisy rules explicitly off</td></tr><tr><td>Testing Library</td><td><code>dom</code> rules on test files; <strong>react</strong> rules on <code>*.{test,spec}.{tsx,jsx}</code></td></tr><tr><td>WDIO</td><td>Globals + rules on <code>*.func.spec.js</code>, <code>*.visual.spec.js</code>, <code>*e2e*</code>, and <code>**/e2e/**</code> (page-objects, etc.)</td></tr><tr><td>Storybook</td><td><code>react/jsx-props-no-spreading</code> off (React config); <code>eslint-plugin-storybook@10</code> flat preset (no compat shim)</td></tr><tr><td><code>eslint.config.*</code></td><td><code>import-x/no-unresolved</code> off</td></tr><tr><td><code>scripts/**</code>, <code>ci_cd/**</code></td><td><code>no-console</code>, <code>max-lines</code>, <code>complexity</code> off</td></tr><tr><td><code>react-hooks/exhaustive-deps</code></td><td><strong>warn</strong> (not error) until repos are clean</td></tr></tbody></table>
104
104
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="eslint-10-plugin-compatibility">ESLint 10 plugin compatibility<a href="#eslint-10-plugin-compatibility" class="hash-link" aria-label="Direct link to ESLint 10 plugin compatibility" title="Direct link to ESLint 10 plugin compatibility" translate="no">​</a></h3>
105
- <p>Only plugins that still call removed <code>context.getFilename()</code> / <code>getScope()</code> APIs are wrapped via <code>@eslint/compat</code> v2 <code>fixupPluginRules</code> / <code>fixupConfigRules</code> in <code>lib/lint-config/eslint/flat/compat.mjs</code>:</p>
106
- <table><thead><tr><th>Plugin</th><th>Wrapped?</th><th>Reason</th></tr></thead><tbody><tr><td><code>eslint-plugin-react</code></td><td>Yes</td><td>Uses legacy context APIs (<code>display-name</code>, etc.)</td></tr><tr><td><code>eslint-plugin-redux-saga</code></td><td>Yes</td><td><code>no-yield-in-race</code> uses <code>getScope()</code></td></tr><tr><td><code>eslint-plugin-storybook</code></td><td>Yes</td><td>Flat preset rules use legacy context APIs</td></tr><tr><td><code>eslint-plugin-wdio</code></td><td>No</td><td>Use nested plugin from <code>flat/recommended</code> (see <code>presets.mjs</code>)</td></tr><tr><td><code>typescript-eslint</code>, <code>import-x</code>, <code>jest</code>, <code>react-hooks</code>, <code>jsx-a11y</code>, <code>testing-library</code></td><td>No</td><td>ESLint 10–compatible; no shim overhead</td></tr></tbody></table>
105
+ <p>Only plugins that still call removed <code>context.getFilename()</code> / <code>getScope()</code> APIs are wrapped via <code>@eslint/compat</code> v2 <code>fixupPluginRules</code> in <code>lib/lint-config/eslint/flat/compat.mjs</code>:</p>
106
+ <table><thead><tr><th>Plugin</th><th>Wrapped?</th><th>Reason</th></tr></thead><tbody><tr><td><code>eslint-plugin-react</code></td><td>Yes</td><td>Uses legacy context APIs (<code>display-name</code>, etc.)</td></tr><tr><td><code>eslint-plugin-redux-saga</code></td><td>Yes</td><td><code>no-yield-in-race</code> uses <code>getScope()</code></td></tr><tr><td><code>eslint-plugin-storybook</code></td><td>No</td><td>v10 flat preset is ESLint 10–compatible</td></tr><tr><td><code>eslint-plugin-wdio</code></td><td>No</td><td>Use nested plugin from <code>flat/recommended</code> (see <code>presets.mjs</code>)</td></tr><tr><td><code>typescript-eslint</code>, <code>import-x</code>, <code>jest</code>, <code>react-hooks</code>, <code>jsx-a11y</code>, <code>testing-library</code></td><td>No</td><td>ESLint 10–compatible; no shim overhead</td></tr></tbody></table>
107
107
  <p>Use <code>@eslint/compat</code> <strong>v2+</strong> with ESLint 10. v1 <code>fixupPluginRules</code> lacks ESLint 10 context patches.</p>
108
108
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="config-performance-notes">Config performance notes<a href="#config-performance-notes" class="hash-link" aria-label="Direct link to Config performance notes" title="Direct link to Config performance notes" translate="no">​</a></h3>
109
109
  <p>The shared flat config is structured for faster lint runs:</p>
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.10.1">
6
6
  <title data-rh="true">PUI CLI Documentation | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="PUI CLI Documentation | Cli"><meta data-rh="true" name="description" content="Welcome to the ICE MT UI Platform CLI documentation. This CLI tool provides a comprehensive set of commands for building, testing, and maintaining UI applications and libraries."><meta data-rh="true" property="og:description" content="Welcome to the ICE MT UI Platform CLI documentation. This CLI tool provides a comprehensive set of commands for building, testing, and maintaining UI applications and libraries."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/" hreflang="x-default"><script data-rh="true">function insertBanner(){var n=document.createElement("div");n.id="__docusaurus-base-url-issue-banner-container";n.innerHTML='\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">/cli/</span> </p>\n <p>We suggest trying baseUrl = <span id="__docusaurus-base-url-issue-banner-suggestion-container" style="font-weight: bold; color: green;"></span></p>\n</div>\n',document.body.prepend(n);var e=document.getElementById("__docusaurus-base-url-issue-banner-suggestion-container"),s=window.location.pathname,o="/"===s.substr(-1)?s:s+"/";e.innerHTML=o}document.addEventListener("DOMContentLoaded",function(){void 0===window.docusaurus&&insertBanner()})</script><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"PUI CLI Documentation","item":"https://pui.ice.com/cli/"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.74603f39.css">
7
- <script src="/cli/assets/js/runtime~main.f7c5bef0.js" defer="defer"></script>
8
- <script src="/cli/assets/js/main.7f815b7e.js" defer="defer"></script>
7
+ <script src="/cli/assets/js/runtime~main.4f7cd700.js" defer="defer"></script>
8
+ <script src="/cli/assets/js/main.d5acb4ca.js" defer="defer"></script>
9
9
  </head>
10
10
  <body>
11
11
  <svg style="display: none;"><defs>
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.10.1">
6
6
  <title data-rh="true">pui-cli 9 migration guide | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/pui-cli-9-migration"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="pui-cli 9 migration guide | Cli"><meta data-rh="true" name="description" content="This guide helps PUI consumers upgrade apps and libraries from pui-cli 8 to pui-cli 9."><meta data-rh="true" property="og:description" content="This guide helps PUI consumers upgrade apps and libraries from pui-cli 8 to pui-cli 9."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/pui-cli-9-migration"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/pui-cli-9-migration" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/pui-cli-9-migration" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"pui-cli 9 migration guide","item":"https://pui.ice.com/cli/pui-cli-9-migration"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.74603f39.css">
7
- <script src="/cli/assets/js/runtime~main.f7c5bef0.js" defer="defer"></script>
8
- <script src="/cli/assets/js/main.7f815b7e.js" defer="defer"></script>
7
+ <script src="/cli/assets/js/runtime~main.4f7cd700.js" defer="defer"></script>
8
+ <script src="/cli/assets/js/main.d5acb4ca.js" defer="defer"></script>
9
9
  </head>
10
10
  <body>
11
11
  <svg style="display: none;"><defs>
@@ -16,12 +16,12 @@
16
16
  For ESLint rule-level detail, see <a class="" href="/cli/eslint-rules-migration">ESLint rules migration guide</a>.</p>
17
17
  <hr>
18
18
  <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="at-a-glance">At a glance<a href="#at-a-glance" class="hash-link" aria-label="Direct link to At a glance" title="Direct link to At a glance" translate="no">​</a></h2>
19
- <table><thead><tr><th>Topic</th><th>pui-cli 8</th><th>pui-cli 9</th></tr></thead><tbody><tr><td>Node.js</td><td>20</td><td><strong>24</strong></td></tr><tr><td>pnpm</td><td>8–10</td><td><strong>11</strong></td></tr><tr><td>App/library bundler</td><td>Webpack</td><td><strong>Webpack</strong> (unchanged)</td></tr><tr><td>ESLint</td><td>8.x + <code>.eslintrc.cjs</code></td><td><strong>10.x</strong> + <code>eslint.config.mjs</code></td></tr><tr><td>Stylelint</td><td>15.x + <code>stylelint-config-styled-components</code></td><td><strong>17.x</strong> + <code>postcss-styled-syntax</code> (styled-components rules inlined)</td></tr><tr><td>Vitest (via <code>pui-cli vitest</code>)</td><td>1.x</td><td><strong>4.x</strong> (uses Vite internally; not the app bundler)</td></tr><tr><td>TypeScript lint</td><td><code>@typescript-eslint</code> v5</td><td><code>typescript-eslint</code> v8</td></tr><tr><td>Exported tsconfig</td><td><code>moduleResolution: &quot;node&quot;</code></td><td><strong><code>moduleResolution: &quot;bundler&quot;</code></strong></td></tr><tr><td>Shared config import</td><td><code>require(&#x27;@elliemae/pui-cli&#x27;).eslintConfig</code></td><td><code>import { eslintFlatConfig } from &#x27;@elliemae/pui-cli/eslint&#x27;</code></td></tr><tr><td>Stylelint import</td><td><code>require(&#x27;@elliemae/pui-cli&#x27;).stylelintConfig</code></td><td><code>import { stylelintConfig } from &#x27;@elliemae/pui-cli/stylelint&#x27;</code> (or keep CJS re-export)</td></tr><tr><td>semantic-release</td><td>21.x + <code>release.config.cjs</code></td><td><strong>25.x</strong> + <code>release.config.mjs</code> (ESM <code>extends</code> for shareable config)</td></tr><tr><td>Husky</td><td>8.x</td><td><strong>9.x</strong></td></tr><tr><td>Lerna (monorepos)</td><td>6.x</td><td><strong>9.x</strong> (via pui-cli; <code>bootstrap</code>/<code>add</code>/<code>link</code> removed)</td></tr><tr><td>Nx (monorepos)</td><td>15.x (<code>@nrwl/*</code>)</td><td><strong>22.x</strong> (<code>nx</code> + <code>@nx/workspace</code>; modern <code>nx.json</code>)</td></tr><tr><td>Cursor skill</td><td>—</td><td><code>pui-cli skills install migrate-to-pui-cli-9 --target all</code></td></tr></tbody></table>
19
+ <table><thead><tr><th>Topic</th><th>pui-cli 8</th><th>pui-cli 9</th></tr></thead><tbody><tr><td>Node.js</td><td>20</td><td><strong>24</strong></td></tr><tr><td>pnpm</td><td>8–10</td><td><strong>11</strong> (hoist settings in <strong><code>pnpm-workspace.yaml</code></strong>, not <code>.npmrc</code>)</td></tr><tr><td>App/library bundler</td><td>Webpack</td><td><strong>Webpack</strong> (unchanged)</td></tr><tr><td>ESLint</td><td>8.x + <code>.eslintrc.cjs</code></td><td><strong>10.x</strong> + <code>eslint.config.mjs</code></td></tr><tr><td>Stylelint</td><td>15.x + <code>stylelint-config-styled-components</code></td><td><strong>17.x</strong> + <code>postcss-styled-syntax</code> (styled-components rules inlined)</td></tr><tr><td>Vitest (via <code>pui-cli vitest</code>)</td><td>1.x</td><td><strong>4.x</strong> (uses Vite internally; not the app bundler)</td></tr><tr><td>TypeScript lint</td><td><code>@typescript-eslint</code> v5</td><td><code>typescript-eslint</code> v8</td></tr><tr><td>Exported tsconfig</td><td><code>moduleResolution: &quot;node&quot;</code></td><td><strong><code>moduleResolution: &quot;bundler&quot;</code></strong></td></tr><tr><td>Shared config import</td><td><code>require(&#x27;@elliemae/pui-cli&#x27;).eslintConfig</code></td><td><code>import { eslintFlatConfig } from &#x27;@elliemae/pui-cli/eslint&#x27;</code></td></tr><tr><td>Stylelint import</td><td><code>require(&#x27;@elliemae/pui-cli&#x27;).stylelintConfig</code></td><td><code>import { stylelintConfig } from &#x27;@elliemae/pui-cli/stylelint&#x27;</code> (or keep CJS re-export)</td></tr><tr><td>semantic-release</td><td>21.x + <code>release.config.cjs</code></td><td><strong>25.x</strong> + <code>release.config.mjs</code> (ESM <code>extends</code> for shareable config)</td></tr><tr><td>Husky</td><td>8.x</td><td><strong>9.x</strong></td></tr><tr><td>Lerna (monorepos)</td><td>6.x</td><td><strong>9.x</strong> (via pui-cli; <code>bootstrap</code>/<code>add</code>/<code>link</code> removed)</td></tr><tr><td>Nx (monorepos)</td><td>15.x (<code>@nrwl/*</code>)</td><td><strong>22.x</strong> (<code>nx</code> + <code>@nx/workspace</code>; modern <code>nx.json</code>)</td></tr><tr><td>Cursor skill</td><td>—</td><td><code>pui-cli skills install migrate-to-pui-cli-9 --target all</code></td></tr><tr><td>Storybook CJS → ESM skill</td><td>—</td><td><code>pui-cli skills install migrate-storybook-out-of-cjs --target all</code></td></tr></tbody></table>
20
20
  <hr>
21
21
  <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="recommended-rollout">Recommended rollout<a href="#recommended-rollout" class="hash-link" aria-label="Direct link to Recommended rollout" title="Direct link to Recommended rollout" translate="no">​</a></h2>
22
22
  <p>Ship in <strong>small PRs</strong> to reduce regression risk:</p>
23
23
  <ol>
24
- <li class=""><strong>Toolchain</strong> — Node 24 + pnpm 11 + CI image updates</li>
24
+ <li class=""><strong>Toolchain</strong> — Node 24 + pnpm 11 + CI image updates + <strong>hoisting in <code>pnpm-workspace.yaml</code></strong></li>
25
25
  <li class=""><strong>Dependency bump</strong> — <code>@elliemae/pui-cli@9</code> without ESLint config change</li>
26
26
  <li class=""><strong>ESLint flat config</strong> — add <code>eslint.config.mjs</code>, delete legacy ESLint files, fix lint</li>
27
27
  <li class=""><strong>Stylelint 17</strong> — simplify <code>stylelint.config.cjs</code> (remove <code>stylelint-config-styled-components</code> overrides); optional <code>stylelint.config.mjs</code></li>
@@ -36,8 +36,33 @@ For ESLint rule-level detail, see <a class="" href="/cli/eslint-rules-migration"
36
36
  <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="step-by-step">Step-by-step<a href="#step-by-step" class="hash-link" aria-label="Direct link to Step-by-step" title="Direct link to Step-by-step" translate="no">​</a></h2>
37
37
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="1-upgrade-toolchain">1. Upgrade toolchain<a href="#1-upgrade-toolchain" class="hash-link" aria-label="Direct link to 1. Upgrade toolchain" title="Direct link to 1. Upgrade toolchain" translate="no">​</a></h3>
38
38
  <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain"># .node-version</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">24</span><br></div></code></pre></div></div>
39
- <div class="language-json codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-json codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// package.json (root monorepos)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token property" style="color:#36acaa">&quot;packageManager&quot;</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;pnpm@11.x.x&quot;</span><br></div></code></pre></div></div>
39
+ <div class="language-json codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-json codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// package.json (root)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token property" style="color:#36acaa">&quot;engines&quot;</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">&quot;pnpm&quot;</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;&gt;=11&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">&quot;node&quot;</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;&gt;=24&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
40
+ <p>Do <strong>not</strong> pin an exact pnpm version in <code>packageManager</code> — Corepack requires an exact semver there, which forces every customer onto the same patch. Use <code>engines.pnpm</code> so teams can run any pnpm 11 minor or patch. Omit <code>packageManager</code> unless you intentionally want Corepack to lock one version for your own CI.</p>
40
41
  <p>Update Jenkins/docker Node images before merging.</p>
42
+ <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="1b-migrate-pnpm-hoisting-to-pnpm-workspaceyaml-pnpm-11">1b. Migrate pnpm hoisting to <code>pnpm-workspace.yaml</code> (pnpm 11)<a href="#1b-migrate-pnpm-hoisting-to-pnpm-workspaceyaml-pnpm-11" class="hash-link" aria-label="Direct link to 1b-migrate-pnpm-hoisting-to-pnpm-workspaceyaml-pnpm-11" title="Direct link to 1b-migrate-pnpm-hoisting-to-pnpm-workspaceyaml-pnpm-11" translate="no">​</a></h3>
43
+ <p><strong>Do this in every repo</strong> that upgrades to pnpm 11 — single-package apps, libraries, and monorepos.</p>
44
+ <h4 class="anchor anchorTargetStickyNavbar_jFbF" id="why">Why<a href="#why" class="hash-link" aria-label="Direct link to Why" title="Direct link to Why" translate="no">​</a></h4>
45
+ <p>pnpm 11 only reads <strong>auth and registry</strong> from <code>.npmrc</code>. Every other pnpm setting — including hoisting — must live in <strong><code>pnpm-workspace.yaml</code></strong> (camelCase keys). See <a href="https://pnpm.io/next/migration" target="_blank" rel="noopener noreferrer" class="">pnpm v11 migration</a>.</p>
46
+ <p>If hoisting stays only in <code>.npmrc</code>, pnpm <strong>silently ignores it</strong>. Symptom: <code>node_modules/.modules.yaml</code> shows <code>&quot;publicHoistPattern&quot;: []</code> even when <code>.npmrc</code> has <code>shamefully-hoist=true</code>. Webpack builds then fail with <code>Can&#x27;t resolve &#x27;esbuild-loader&#x27;</code>, <code>styled-components</code>, or <code>@elliemae/pui-theme</code> because <strong>pui-cli webpack aliases</strong> resolve packages from the <strong>repo root</strong> <code>node_modules/</code>.</p>
47
+ <p>PUI org policy keeps <strong><code>shamefullyHoist: true</code></strong> (same as pnpm 8 <code>shamefully-hoist=true</code>) for compatibility with <code>@elliemae/app-react-dependencies</code> and pui-cli tooling. <strong>Do not remove hoisting</strong> during the cli 9 migration.</p>
48
+ <h4 class="anchor anchorTargetStickyNavbar_jFbF" id="settings-to-move">Settings to move<a href="#settings-to-move" class="hash-link" aria-label="Direct link to Settings to move" title="Direct link to Settings to move" translate="no">​</a></h4>
49
+ <table><thead><tr><th>pnpm 8–10 (<code>.npmrc</code> or <code>package.json#pnpm</code>)</th><th>pnpm 11 (<code>pnpm-workspace.yaml</code>)</th></tr></thead><tbody><tr><td><code>shamefully-hoist=true</code></td><td><code>shamefullyHoist: true</code></td></tr><tr><td><code>public-hoist-pattern[]=…</code></td><td><code>publicHoistPattern: [ &quot;…&quot; ]</code></td></tr><tr><td><code>strict-peer-dependencies=false</code></td><td><code>strictPeerDependencies: false</code></td></tr><tr><td><code>auto-install-peers=false</code></td><td><code>autoInstallPeers: false</code></td></tr><tr><td><code>git-checks=false</code></td><td><code>gitChecks: false</code></td></tr><tr><td><code>enable-pre-post-scripts=true</code></td><td><code>enablePrePostScripts: true</code></td></tr><tr><td><code>package.json</code> → <code>&quot;pnpm&quot;: { &quot;overrides&quot;: … }</code></td><td>top-level <code>overrides:</code></td></tr><tr><td><code>onlyBuiltDependencies</code> / <code>neverBuiltDependencies</code></td><td><code>allowBuilds:</code> (<code>true</code> / <code>false</code> per package)</td></tr></tbody></table>
50
+ <p>Leave <strong>only</strong> auth/registry lines in <code>.npmrc</code> (for example <code>legacy-peer-deps=true</code> if your registry workflow needs it).</p>
51
+ <h4 class="anchor anchorTargetStickyNavbar_jFbF" id="single-package-app-or-library">Single-package app or library<a href="#single-package-app-or-library" class="hash-link" aria-label="Direct link to Single-package app or library" title="Direct link to Single-package app or library" translate="no">​</a></h4>
52
+ <p>Create or update <code>pnpm-workspace.yaml</code> at the repo root:</p>
53
+ <div class="language-yaml codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-yaml codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">packages</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;.&#x27;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">shamefullyHoist</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">strictPeerDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">autoInstallPeers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">allowBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">&#x27;@swc/core&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">esbuild</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">nx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># …approve other packages that run install scripts (see pnpm approve-builds)</span><br></div></code></pre></div></div>
54
+ <p>Reference: <code>pui-react-boilerplate/pnpm-workspace.yaml</code>, <code>pui-lib-boilerplate/pnpm-workspace.yaml</code>.</p>
55
+ <h4 class="anchor anchorTargetStickyNavbar_jFbF" id="monorepo-libs-apps">Monorepo (<code>libs/*</code>, <code>apps/*</code>)<a href="#monorepo-libs-apps" class="hash-link" aria-label="Direct link to monorepo-libs-apps" title="Direct link to monorepo-libs-apps" translate="no">​</a></h4>
56
+ <div class="language-yaml codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-yaml codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">packages</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;libs/*&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;apps/*&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">shamefullyHoist</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Optional explicit patterns (shamefullyHoist already hoists all deps to root)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">publicHoistPattern</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;esbuild-loader&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;@elliemae/*&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;styled-components&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;history&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;lodash&quot;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">strictPeerDependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">autoInstallPeers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">gitChecks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">enablePrePostScripts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">overrides</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">esbuild-loader</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;4.4.3&quot;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># if webpack hits esbuild-loader@3.x useSourceMap crash</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">allowBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">&#x27;@swc/core&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">esbuild</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">nx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># …set true for each package that must run postinstall scripts</span><br></div></code></pre></div></div>
57
+ <p>Reference: <code>pui-microfe/pnpm-workspace.yaml</code>, <code>pui-mono-repo-boilerplate/pnpm-workspace.yaml</code>.</p>
58
+ <p>Move any <code>package.json</code> <code>&quot;pnpm&quot;: { &quot;overrides&quot;: … }</code> block into this file and delete the <code>pnpm</code> key from <code>package.json</code>.</p>
59
+ <h4 class="anchor anchorTargetStickyNavbar_jFbF" id="reinstall-and-verify">Reinstall and verify<a href="#reinstall-and-verify" class="hash-link" aria-label="Direct link to Reinstall and verify" title="Direct link to Reinstall and verify" translate="no">​</a></h4>
60
+ <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain">rm -rf node_modules libs/*/node_modules # monorepos; apps/libs only if present</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SKIP_POST_INSTALL_BUILD=1 pnpm install --no-frozen-lockfile</span><br></div></code></pre></div></div>
61
+ <p>Check hoisting took effect:</p>
62
+ <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain"># Should list patterns (shamefullyHoist =&gt; [&quot;*&quot;]) — not []</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">grep publicHoistPattern node_modules/.modules.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Webpack / pui-cli alias targets should exist at repo root</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ls node_modules/esbuild-loader node_modules/styled-components 2&gt;/dev/null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm run build</span><br></div></code></pre></div></div>
63
+ <h4 class="anchor anchorTargetStickyNavbar_jFbF" id="common-failures">Common failures<a href="#common-failures" class="hash-link" aria-label="Direct link to Common failures" title="Direct link to Common failures" translate="no">​</a></h4>
64
+ <table><thead><tr><th>Symptom</th><th>Fix</th></tr></thead><tbody><tr><td><code>Can&#x27;t resolve &#x27;esbuild-loader&#x27;</code> during <code>pui-cli pack</code> / webpack</td><td>Add <code>shamefullyHoist: true</code> to <code>pnpm-workspace.yaml</code>; clean reinstall</td></tr><tr><td><code>Can&#x27;t resolve &#x27;@elliemae/pui-theme&#x27;</code> or <code>styled-components</code></td><td>Same — hoisting must be in workspace yaml, not <code>.npmrc</code></td></tr><tr><td><code>husky: command not found</code> on <code>pnpm prepare</code></td><td><code>shamefullyHoist</code> + optional <code>publicHoistPattern: [husky]</code>; or keep <code>husky</code> as a direct root <code>devDependency</code></td></tr><tr><td><code>ERR_PNPM_IGNORED_BUILDS</code></td><td>Replace placeholder <code>allowBuilds</code> values with <code>true</code> or run <code>pnpm approve-builds</code></td></tr><tr><td><code>publicHoistPattern: []</code> in <code>.modules.yaml</code></td><td>Hoist settings still in <code>.npmrc</code> only — migrate to <code>pnpm-workspace.yaml</code></td></tr></tbody></table>
65
+ <p><strong>Long-term platform fix:</strong> pui-cli should resolve webpack loaders from its own install path and make <code>getAlias()</code> fall back beyond root <code>node_modules</code>. Until then, hoisting in <code>pnpm-workspace.yaml</code> is required for pnpm 11 consumers.</p>
41
66
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="2-upgrade-pui-cli">2. Upgrade pui-cli<a href="#2-upgrade-pui-cli" class="hash-link" aria-label="Direct link to 2. Upgrade pui-cli" title="Direct link to 2. Upgrade pui-cli" translate="no">​</a></h3>
42
67
  <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain">pnpm add -D @elliemae/pui-cli@9</span><br></div></code></pre></div></div>
43
68
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="3-add-flat-eslint-config">3. Add flat ESLint config<a href="#3-add-flat-eslint-config" class="hash-link" aria-label="Direct link to 3. Add flat ESLint config" title="Direct link to 3. Add flat ESLint config" translate="no">​</a></h3>
@@ -92,6 +117,14 @@ For ESLint rule-level detail, see <a class="" href="/cli/eslint-rules-migration"
92
117
  </ol>
93
118
  <p><strong>Environment variable changes:</strong> <code>HUSKY_SKIP_HOOKS</code> / <code>HUSKY_SKIP_INSTALL</code> → <code>HUSKY=0</code>; <code>HUSKY_GIT_PARAMS</code> → use <code>$1</code> in hook scripts.</p>
94
119
  <hr>
120
+ <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="jest-pui-cli-test">Jest (<code>pui-cli test</code>)<a href="#jest-pui-cli-test" class="hash-link" aria-label="Direct link to jest-pui-cli-test" title="Direct link to jest-pui-cli-test" translate="no">​</a></h2>
121
+ <p>pui-cli&#x27;s default <code>jestConfig</code> runs <code>lib/testing/setup-textencoder.cjs</code> before other <code>setupFiles</code>. It polyfills <code>TextEncoder</code> / <code>TextDecoder</code> on <code>globalThis</code> from <code>node:util</code> so <strong>jsdom</strong> tests can import packages (for example <code>@elliemae/pui-diagnostics</code> HTTP transport) that expect those APIs at module load time.</p>
122
+ <p><strong>Repos do not need a local <code>jest-textencoder-setup.cjs</code>.</strong> Delete it if you added one during migration.</p>
123
+ <p>Typical <code>jest.config.cjs</code> when testing against the real diagnostics package (not the pui-cli mock):</p>
124
+ <div class="language-javascript codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-javascript codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> jestConfig </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">&#x27;@elliemae/pui-cli&#x27;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">delete</span><span class="token plain"> jestConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">moduleNameMapper</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;@elliemae/pui-diagnostics&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> jestConfig</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
125
+ <p>Do <strong>not</strong> replace <code>setupFiles</code> unless you must prepend repo-specific setup; spread the defaults instead:</p>
126
+ <div class="language-javascript codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-javascript codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain">jestConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">setupFiles</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;./my-extra-setup.cjs&#x27;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">jestConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">setupFiles</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
127
+ <hr>
95
128
  <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="vitest-4">Vitest 4<a href="#vitest-4" class="hash-link" aria-label="Direct link to Vitest 4" title="Direct link to Vitest 4" translate="no">​</a></h2>
96
129
  <p>Skip this section if the repo uses Jest (<code>pui-cli test</code>) only. <strong>pui-cli 9 still builds apps and libraries with Webpack</strong>; Vite is used by Vitest (and optional <code>pui-cli buildCDN</code>), not for production bundling.</p>
97
130
  <p>After bumping <code>@elliemae/pui-cli@9</code>, align local test dependencies with the versions pui-cli ships:</p>
@@ -155,10 +188,34 @@ For ESLint rule-level detail, see <a class="" href="/cli/eslint-rules-migration"
155
188
  <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="4-verify-monorepo-workflows">4. Verify monorepo workflows<a href="#4-verify-monorepo-workflows" class="hash-link" aria-label="Direct link to 4. Verify monorepo workflows" title="Direct link to 4. Verify monorepo workflows" translate="no">​</a></h3>
156
189
  <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec nx run-many --target=build --all --parallel</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec nx affected --target=test --uncommitted</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli lint</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli version --help # confirms pui-cli can invoke lerna 9</span><br></div></code></pre></div></div>
157
190
  <hr>
191
+ <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="storybook-10-pui-cli-9">Storybook 10 (pui-cli 9)<a href="#storybook-10-pui-cli-9" class="hash-link" aria-label="Direct link to Storybook 10 (pui-cli 9)" title="Direct link to Storybook 10 (pui-cli 9)" translate="no">​</a></h2>
192
+ <p>Applies to repos that run <code>pui-cli storybook</code>. Upgrade <strong>pui-cli 9</strong> and <strong>pui-app-sdk</strong> together — shared Storybook config lives in pui-app-sdk.</p>
193
+ <p><strong>Agent skill:</strong> install the bundled playbook for CJS → ESM migration:</p>
194
+ <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-storybook-out-of-cjs --target all</span><br></div></code></pre></div></div>
195
+ <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="what-changed">What changed<a href="#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h3>
196
+ <table><thead><tr><th>Topic</th><th>Before (Storybook 6)</th><th>After (Storybook 10)</th></tr></thead><tbody><tr><td>CLI</td><td><code>start-storybook</code> / <code>build-storybook</code></td><td><code>storybook dev</code> / <code>storybook build</code></td></tr><tr><td>Config format</td><td><code>.storybook/main.js</code> (CJS)</td><td><code>.storybook/main.mjs</code> (ESM, required)</td></tr><tr><td>Shared config import</td><td><code>@elliemae/pui-app-sdk/storybook/cjs/main</code> (removed)</td><td><code>@elliemae/pui-app-sdk/storybook/main</code></td></tr><tr><td>Framework</td><td><code>@storybook/react</code> + <code>core.builder: webpack5</code></td><td><code>@storybook/react-webpack5</code></td></tr><tr><td>Default port</td><td>11000 (pui-cli)</td><td>11000 (unchanged)</td></tr><tr><td>Story globs</td><td><code>../lib</code> only (webpack)</td><td><code>../lib</code> and <code>../app</code></td></tr><tr><td>API middleware</td><td><code>.storybook/middleware.js</code></td><td>Built into pui-cli <code>webpackFinal</code> dev server</td></tr><tr><td>Removed addons</td><td>—</td><td><code>addon-essentials</code>, <code>addon-interactions</code>, <code>addon-links</code> (moved into Storybook core in v9+), <code>addon-events</code>, <code>addon-storysource</code>, <code>storybook-addon-turbo-build</code>, <code>storybook-react-router</code></td></tr><tr><td>JS compiler</td><td>SWC (default in some setups)</td><td><code>@storybook/addon-webpack5-compiler-babel</code> (bundled in pui-cli; resolves via pui-app-sdk)</td></tr><tr><td>Lib-only packages</td><td>N/A</td><td>Story globs skip <code>../app/**</code> when no <code>app/</code> directory exists</td></tr></tbody></table>
197
+ <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="consumer-migration">Consumer migration<a href="#consumer-migration" class="hash-link" aria-label="Direct link to Consumer migration" title="Direct link to Consumer migration" translate="no">​</a></h3>
198
+ <ol>
199
+ <li class="">Bump <code>@elliemae/pui-cli@9</code> and <code>@elliemae/pui-app-sdk@*</code> (same release train).</li>
200
+ <li class="">Rename <code>.storybook/main.js</code> → <code>.storybook/main.mjs</code>:</li>
201
+ </ol>
202
+ <div class="language-javascript codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-javascript codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> getStorybookConfig </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;@elliemae/pui-app-sdk/storybook/main&#x27;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getStorybookConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
203
+ <ol start="3">
204
+ <li class="">Convert other <code>.storybook/*.js</code> wrappers to <code>.mjs</code> where they use <code>import</code>/<code>export</code> (e.g. <code>preview.mjs</code>, <code>manager.js</code> can stay if ESM).</li>
205
+ <li class="">Delete <code>.storybook/middleware.js</code> — mock API routes are registered by pui-cli during <code>storybook dev</code>. Legacy middleware is still exported as <code>@elliemae/pui-app-sdk/storybook/middleware</code> (deprecated) for repos not yet on pui-cli 9 Storybook.</li>
206
+ <li class="">Update story imports to CSF3 / <code>@storybook/react-webpack5</code> as needed (CSF2 may still work for simple stories).</li>
207
+ <li class="">Remove Storybook 6 webpack alias workarounds (MDX pinning, react-select hacks) unless a specific component still fails after upgrade.</li>
208
+ </ol>
209
+ <h3 class="anchor anchorTargetStickyNavbar_jFbF" id="verify">Verify<a href="#verify" class="hash-link" aria-label="Direct link to Verify" title="Direct link to Verify" translate="no">​</a></h3>
210
+ <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli storybook # dev on port 11000</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli storybook -b # static build to demo/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli storybook -b --docs # docs build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli lint # stories + .storybook/</span><br></div></code></pre></div></div>
211
+ <p>Pilot reference: <code>pui-mono-repo-boilerplate/libs/foo</code>, <code>pui-react-boilerplate</code>.</p>
212
+ <hr>
158
213
  <h2 class="anchor anchorTargetStickyNavbar_jFbF" id="ci-checklist">CI checklist<a href="#ci-checklist" class="hash-link" aria-label="Direct link to CI checklist" title="Direct link to CI checklist" translate="no">​</a></h2>
159
214
  <ul class="contains-task-list containsTaskList_nAax">
160
215
  <li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Node 24 in pipeline</li>
161
216
  <li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->pnpm 11 in pipeline</li>
217
+ <li class="task-list-item"><input type="checkbox" disabled=""> <code>shamefullyHoist</code> (and related settings) in <code>pnpm-workspace.yaml</code>, not <code>.npmrc</code></li>
218
+ <li class="task-list-item"><input type="checkbox" disabled=""> <code>pnpm run build</code> after clean install (webpack resolves hoisted deps)</li>
162
219
  <li class="task-list-item"><input type="checkbox" disabled=""> <code>pui-cli lint</code> (0 errors)</li>
163
220
  <li class="task-list-item"><input type="checkbox" disabled=""> <code>pui-cli tscheck --files</code></li>
164
221
  <li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Unit tests</li>
@@ -175,6 +232,6 @@ For ESLint rule-level detail, see <a class="" href="/cli/eslint-rules-migration"
175
232
  <li class=""><strong>Stylelint changes:</strong> <a class="" href="/cli/stylelint-migration">stylelint-migration.md</a></li>
176
233
  <li class=""><strong>Commands:</strong> <a class="" href="/cli/usage-guide">usage guide</a></li>
177
234
  <li class=""><strong>Platform team:</strong> <code>#pui-platform</code> or your team&#x27;s platform-ui channel</li>
178
- </ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_sn50"><a href="https://git.elliemae.io/platform-ui/pui-cli.git/docs/pui-cli-9-migration.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_sbI6" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_n07i"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/cli/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">PUI CLI Documentation</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/cli/ssl-certificate-setup"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Trust SSL Certificate Guide</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_gGRX thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#at-a-glance" class="table-of-contents__link toc-highlight">At a glance</a></li><li><a href="#recommended-rollout" class="table-of-contents__link toc-highlight">Recommended rollout</a></li><li><a href="#step-by-step" class="table-of-contents__link toc-highlight">Step-by-step</a><ul><li><a href="#1-upgrade-toolchain" class="table-of-contents__link toc-highlight">1. Upgrade toolchain</a></li><li><a href="#2-upgrade-pui-cli" class="table-of-contents__link toc-highlight">2. Upgrade pui-cli</a></li><li><a href="#3-add-flat-eslint-config" class="table-of-contents__link toc-highlight">3. Add flat ESLint config</a></li><li><a href="#4-update-stylelint-config" class="table-of-contents__link toc-highlight">4. Update Stylelint config</a></li><li><a href="#5-fix-lint" class="table-of-contents__link toc-highlight">5. Fix lint</a></li><li><a href="#6-install-the-migration-skill-optional" class="table-of-contents__link toc-highlight">6. Install the migration skill (optional)</a></li></ul></li><li><a href="#temporary-overrides" class="table-of-contents__link toc-highlight">Temporary overrides</a></li><li><a href="#strict-config-after-cleanup" class="table-of-contents__link toc-highlight">Strict config (after cleanup)</a></li><li><a href="#husky-9" class="table-of-contents__link toc-highlight">Husky 9</a></li><li><a href="#vitest-4" class="table-of-contents__link toc-highlight">Vitest 4</a></li><li><a href="#semantic-release-25" class="table-of-contents__link toc-highlight">semantic-release 25</a><ul><li><a href="#1-upgrade-semantic-release-if-pinned-locally" class="table-of-contents__link toc-highlight">1. Upgrade semantic-release (if pinned locally)</a></li><li><a href="#2-migrate-release-config-to-esm" class="table-of-contents__link toc-highlight">2. Migrate release config to ESM</a></li><li><a href="#3-custom-plugins-or-overrides" class="table-of-contents__link toc-highlight">3. Custom plugins or overrides</a></li><li><a href="#4-verify-locally" class="table-of-contents__link toc-highlight">4. Verify locally</a></li><li><a href="#agent-assisted-migration" class="table-of-contents__link toc-highlight">Agent-assisted migration</a></li></ul></li><li><a href="#lerna-9-and-nx-22-monorepos-only" class="table-of-contents__link toc-highlight">Lerna 9 and Nx 22 (monorepos only)</a><ul><li><a href="#1-remove-legacy-nx-package-pins" class="table-of-contents__link toc-highlight">1. Remove legacy Nx package pins</a></li><li><a href="#2-migrate-nxjson" class="table-of-contents__link toc-highlight">2. Migrate <code>nx.json</code></a></li><li><a href="#3-lerna-9-notes" class="table-of-contents__link toc-highlight">3. Lerna 9 notes</a></li><li><a href="#4-verify-monorepo-workflows" class="table-of-contents__link toc-highlight">4. Verify monorepo workflows</a></li></ul></li><li><a href="#ci-checklist" class="table-of-contents__link toc-highlight">CI checklist</a></li><li><a href="#getting-help" class="table-of-contents__link toc-highlight">Getting help</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/cli/">Getting Started</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://icemortgagetechnology.slack.com/archives/C01M49EGP6Z" target="_blank" rel="noopener noreferrer" class="footer__link-item">Slack<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink__EWc"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://git.elliemae.io/platform-ui/pui-cli.git" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink__EWc"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 ICE.</div></div></div></footer></div>
235
+ </ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_sn50"><a href="https://git.elliemae.io/platform-ui/pui-cli.git/docs/pui-cli-9-migration.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_sbI6" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_n07i"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/cli/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">PUI CLI Documentation</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/cli/ssl-certificate-setup"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Trust SSL Certificate Guide</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_gGRX thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#at-a-glance" class="table-of-contents__link toc-highlight">At a glance</a></li><li><a href="#recommended-rollout" class="table-of-contents__link toc-highlight">Recommended rollout</a></li><li><a href="#step-by-step" class="table-of-contents__link toc-highlight">Step-by-step</a><ul><li><a href="#1-upgrade-toolchain" class="table-of-contents__link toc-highlight">1. Upgrade toolchain</a></li><li><a href="#1b-migrate-pnpm-hoisting-to-pnpm-workspaceyaml-pnpm-11" class="table-of-contents__link toc-highlight">1b. Migrate pnpm hoisting to <code>pnpm-workspace.yaml</code> (pnpm 11)</a></li><li><a href="#2-upgrade-pui-cli" class="table-of-contents__link toc-highlight">2. Upgrade pui-cli</a></li><li><a href="#3-add-flat-eslint-config" class="table-of-contents__link toc-highlight">3. Add flat ESLint config</a></li><li><a href="#4-update-stylelint-config" class="table-of-contents__link toc-highlight">4. Update Stylelint config</a></li><li><a href="#5-fix-lint" class="table-of-contents__link toc-highlight">5. Fix lint</a></li><li><a href="#6-install-the-migration-skill-optional" class="table-of-contents__link toc-highlight">6. Install the migration skill (optional)</a></li></ul></li><li><a href="#temporary-overrides" class="table-of-contents__link toc-highlight">Temporary overrides</a></li><li><a href="#strict-config-after-cleanup" class="table-of-contents__link toc-highlight">Strict config (after cleanup)</a></li><li><a href="#husky-9" class="table-of-contents__link toc-highlight">Husky 9</a></li><li><a href="#jest-pui-cli-test" class="table-of-contents__link toc-highlight">Jest (<code>pui-cli test</code>)</a></li><li><a href="#vitest-4" class="table-of-contents__link toc-highlight">Vitest 4</a></li><li><a href="#semantic-release-25" class="table-of-contents__link toc-highlight">semantic-release 25</a><ul><li><a href="#1-upgrade-semantic-release-if-pinned-locally" class="table-of-contents__link toc-highlight">1. Upgrade semantic-release (if pinned locally)</a></li><li><a href="#2-migrate-release-config-to-esm" class="table-of-contents__link toc-highlight">2. Migrate release config to ESM</a></li><li><a href="#3-custom-plugins-or-overrides" class="table-of-contents__link toc-highlight">3. Custom plugins or overrides</a></li><li><a href="#4-verify-locally" class="table-of-contents__link toc-highlight">4. Verify locally</a></li><li><a href="#agent-assisted-migration" class="table-of-contents__link toc-highlight">Agent-assisted migration</a></li></ul></li><li><a href="#lerna-9-and-nx-22-monorepos-only" class="table-of-contents__link toc-highlight">Lerna 9 and Nx 22 (monorepos only)</a><ul><li><a href="#1-remove-legacy-nx-package-pins" class="table-of-contents__link toc-highlight">1. Remove legacy Nx package pins</a></li><li><a href="#2-migrate-nxjson" class="table-of-contents__link toc-highlight">2. Migrate <code>nx.json</code></a></li><li><a href="#3-lerna-9-notes" class="table-of-contents__link toc-highlight">3. Lerna 9 notes</a></li><li><a href="#4-verify-monorepo-workflows" class="table-of-contents__link toc-highlight">4. Verify monorepo workflows</a></li></ul></li><li><a href="#storybook-10-pui-cli-9" class="table-of-contents__link toc-highlight">Storybook 10 (pui-cli 9)</a><ul><li><a href="#what-changed" class="table-of-contents__link toc-highlight">What changed</a></li><li><a href="#consumer-migration" class="table-of-contents__link toc-highlight">Consumer migration</a></li><li><a href="#verify" class="table-of-contents__link toc-highlight">Verify</a></li></ul></li><li><a href="#ci-checklist" class="table-of-contents__link toc-highlight">CI checklist</a></li><li><a href="#getting-help" class="table-of-contents__link toc-highlight">Getting help</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/cli/">Getting Started</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://icemortgagetechnology.slack.com/archives/C01M49EGP6Z" target="_blank" rel="noopener noreferrer" class="footer__link-item">Slack<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink__EWc"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://git.elliemae.io/platform-ui/pui-cli.git" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink__EWc"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 ICE.</div></div></div></footer></div>
179
236
  </body>
180
237
  </html>
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.10.1">
6
6
  <title data-rh="true">Trust SSL Certificate Guide | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/ssl-certificate-setup"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Trust SSL Certificate Guide | Cli"><meta data-rh="true" name="description" content="This guide explains how to trust the self-signed CA certificate on different operating systems and browsers so your HTTPS connection works without warnings."><meta data-rh="true" property="og:description" content="This guide explains how to trust the self-signed CA certificate on different operating systems and browsers so your HTTPS connection works without warnings."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/ssl-certificate-setup"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/ssl-certificate-setup" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/ssl-certificate-setup" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Trust SSL Certificate Guide","item":"https://pui.ice.com/cli/ssl-certificate-setup"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.74603f39.css">
7
- <script src="/cli/assets/js/runtime~main.f7c5bef0.js" defer="defer"></script>
8
- <script src="/cli/assets/js/main.7f815b7e.js" defer="defer"></script>
7
+ <script src="/cli/assets/js/runtime~main.4f7cd700.js" defer="defer"></script>
8
+ <script src="/cli/assets/js/main.d5acb4ca.js" defer="defer"></script>
9
9
  </head>
10
10
  <body>
11
11
  <svg style="display: none;"><defs>
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.10.1">
6
6
  <title data-rh="true">Stylelint migration guide (pui-cli 8 → 9 / Stylelint 17) | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/stylelint-migration"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Stylelint migration guide (pui-cli 8 → 9 / Stylelint 17) | Cli"><meta data-rh="true" name="description" content="This document covers Stylelint changes shipped with pui-cli 9 (Stylelint 17.x)."><meta data-rh="true" property="og:description" content="This document covers Stylelint changes shipped with pui-cli 9 (Stylelint 17.x)."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/stylelint-migration"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/stylelint-migration" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/stylelint-migration" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Stylelint migration guide (pui-cli 8 → 9 / Stylelint 17)","item":"https://pui.ice.com/cli/stylelint-migration"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.74603f39.css">
7
- <script src="/cli/assets/js/runtime~main.f7c5bef0.js" defer="defer"></script>
8
- <script src="/cli/assets/js/main.7f815b7e.js" defer="defer"></script>
7
+ <script src="/cli/assets/js/runtime~main.4f7cd700.js" defer="defer"></script>
8
+ <script src="/cli/assets/js/main.d5acb4ca.js" defer="defer"></script>
9
9
  </head>
10
10
  <body>
11
11
  <svg style="display: none;"><defs>
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.10.1">
6
6
  <title data-rh="true">Usage Guide | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/usage-guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Usage Guide | Cli"><meta data-rh="true" name="description" content="This guide provides detailed documentation for all available commands in @elliemae/pui-cli."><meta data-rh="true" property="og:description" content="This guide provides detailed documentation for all available commands in @elliemae/pui-cli."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/usage-guide"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/usage-guide" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/usage-guide" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Usage Guide","item":"https://pui.ice.com/cli/usage-guide"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.74603f39.css">
7
- <script src="/cli/assets/js/runtime~main.f7c5bef0.js" defer="defer"></script>
8
- <script src="/cli/assets/js/main.7f815b7e.js" defer="defer"></script>
7
+ <script src="/cli/assets/js/runtime~main.4f7cd700.js" defer="defer"></script>
8
+ <script src="/cli/assets/js/main.d5acb4ca.js" defer="defer"></script>
9
9
  </head>
10
10
  <body>
11
11
  <svg style="display: none;"><defs>
@@ -125,7 +125,7 @@
125
125
  <ul>
126
126
  <li class=""><code>-b, --build</code> - Build static storybook</li>
127
127
  <li class=""><code>--docs</code> - Run in documentation mode</li>
128
- <li class=""><code>--port &lt;number&gt;</code> - Specify port (default: 6006)</li>
128
+ <li class=""><code>--port &lt;number&gt;</code> - Specify port (default: 11000)</li>
129
129
  </ul>
130
130
  <p><strong>Examples:</strong></p>
131
131
  <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain"># Start Storybook dev server</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pui-cli storybook</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Start with documentation mode</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pui-cli storybook --docs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Build static Storybook</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pui-cli storybook -b</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Build with documentation mode</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pui-cli storybook -b --docs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Run on custom port</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pui-cli storybook --port 9000</span><br></div></code></pre></div></div>
@@ -305,7 +305,7 @@
305
305
  </li>
306
306
  </ul>
307
307
  <p><strong>Examples:</strong></p>
308
- <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain"># List bundled skills shipped with this pui-cli version</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills list</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install for Cursor, Claude Code, and GitHub Copilot</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install for Cursor only (default)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install for Claude Code only</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target claude</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Overwrite an existing skill directory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all --force</span><br></div></code></pre></div></div>
308
+ <div class="language-bash codeBlockContainer_uLrG theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_yDoo"><pre tabindex="0" class="prism-code language-bash codeBlock_whMN thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_r5mI"><div class="token-line" style="color:#393A34"><span class="token plain"># List bundled skills shipped with this pui-cli version</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills list</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install for Cursor, Claude Code, and GitHub Copilot</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Storybook CJS → ESM (Storybook 10 / pui-app-sdk storybook/cjs removal)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-storybook-out-of-cjs --target all</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install for Cursor only (default)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install for Claude Code only</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target claude</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Overwrite an existing skill directory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all --force</span><br></div></code></pre></div></div>
309
309
  <p><strong>What it does:</strong></p>
310
310
  <ul>
311
311
  <li class="">Copies <code>lib/skills/&lt;name&gt;/</code> from the installed package into the target skill directories</li>