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

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 (151) hide show
  1. package/README.md +4 -3
  2. package/build/docs/404.html +4 -4
  3. package/build/docs/api/functions/loadRoutes/index.html +9 -9
  4. package/build/docs/api/index.html +8 -8
  5. package/build/docs/api/type-aliases/LIB_NAME/index.html +5 -5
  6. package/build/docs/api/variables/babelConfig/index.html +5 -28
  7. package/build/docs/api/variables/commitlintConfig/index.html +5 -8
  8. package/build/docs/api/variables/eslintFlatBaseConfig/index.html +6 -6
  9. package/build/docs/api/variables/eslintFlatBaseConfigStrict/index.html +6 -6
  10. package/build/docs/api/variables/eslintFlatConfig/index.html +6 -6
  11. package/build/docs/api/variables/eslintFlatConfigStrict/index.html +6 -6
  12. package/build/docs/api/variables/jestConfig/index.html +86 -86
  13. package/build/docs/api/variables/jestNodeConfig/index.html +86 -86
  14. package/build/docs/api/variables/lintStagedConfig/index.html +22 -12
  15. package/build/docs/api/variables/prettierConfig/index.html +5 -18
  16. package/build/docs/api/variables/stylelintConfig/index.html +5 -5
  17. package/build/docs/api/variables/vitestConfig/index.html +5 -5
  18. package/build/docs/assets/css/{styles.74603f39.css → styles.3cba4e67.css} +1 -1
  19. package/build/docs/assets/js/04ee7372.c6c3d513.js +1 -0
  20. package/build/docs/assets/js/0551d4dd.a6b1d9fa.js +1 -0
  21. package/build/docs/assets/js/0a1d0315.43980061.js +1 -0
  22. package/build/docs/assets/js/13097d8d.4ac8ef79.js +1 -0
  23. package/build/docs/assets/js/{16b7bc88.c3779e27.js → 16b7bc88.2ac57556.js} +1 -1
  24. package/build/docs/assets/js/{17896441.84339068.js → 17896441.705d85a0.js} +1 -1
  25. package/build/docs/assets/js/{1b9df811.aaa95da1.js → 1b9df811.ec75cfdc.js} +1 -1
  26. package/build/docs/assets/js/{232a0286.33b2782b.js → 232a0286.6f749ae5.js} +1 -1
  27. package/build/docs/assets/js/{2399.cc5803e0.js → 2399.5d123cba.js} +1 -1
  28. package/build/docs/assets/js/{37d86055.47211796.js → 37d86055.1e73f036.js} +1 -1
  29. package/build/docs/assets/js/3992.b9b54f94.js +2 -0
  30. package/build/docs/assets/js/{4fb6949f.69e375e4.js → 4fb6949f.13bde4a8.js} +1 -1
  31. package/build/docs/assets/js/5befad71.96f04f67.js +1 -0
  32. package/build/docs/assets/js/5d5f1db0.e7607cd2.js +1 -0
  33. package/build/docs/assets/js/5e8c322a.0b86bf5a.js +1 -0
  34. package/build/docs/assets/js/5e95c892.de377e27.js +1 -0
  35. package/build/docs/assets/js/{5fb3c522.da5628e8.js → 5fb3c522.3ec831ee.js} +1 -1
  36. package/build/docs/assets/js/6bd11e52.c61bfcd5.js +1 -0
  37. package/build/docs/assets/js/6e96545e.1b545333.js +1 -0
  38. package/build/docs/assets/js/{71f6d02b.cfd98385.js → 71f6d02b.4b381360.js} +1 -1
  39. package/build/docs/assets/js/{6704.2615a5c6.js → 7843.f4b19776.js} +1 -1
  40. package/build/docs/assets/js/80e87108.8c451f49.js +1 -0
  41. package/build/docs/assets/js/{8585.3cb09ff7.js → 8585.e2298db3.js} +1 -1
  42. package/build/docs/assets/js/{a7bd4aaa.30ffad02.js → a7bd4aaa.aceac89c.js} +1 -1
  43. package/build/docs/assets/js/a94703ab.248144c2.js +1 -0
  44. package/build/docs/assets/js/b7b585d8.7d50f3f6.js +1 -0
  45. package/build/docs/assets/js/{bde5209a.f5bca8b2.js → bde5209a.480cc8d8.js} +1 -1
  46. package/build/docs/assets/js/c377a04b.c6b6b394.js +1 -0
  47. package/build/docs/assets/js/{dfd75424.51c4e2cb.js → dfd75424.459da76b.js} +1 -1
  48. package/build/docs/assets/js/f736c962.ab424879.js +1 -0
  49. package/build/docs/assets/js/main.3ae939d4.js +2 -0
  50. package/build/docs/assets/js/runtime~main.9ecf1839.js +1 -0
  51. package/build/docs/eslint-rules-migration/index.html +39 -39
  52. package/build/docs/index.html +70 -71
  53. package/build/docs/pui-cli-9-migration/index.html +163 -99
  54. package/build/docs/sitemap.xml +1 -1
  55. package/build/docs/ssl-certificate-setup/index.html +23 -23
  56. package/build/docs/stylelint-migration/index.html +19 -21
  57. package/build/docs/usage-guide/index.html +90 -90
  58. package/dist/cjs/babel.config.js +124 -0
  59. package/dist/cjs/index.js +5 -9
  60. package/dist/cjs/lint-config/commitlint/export.mjs +1 -0
  61. package/dist/cjs/lint-config/commitlint.config.mjs +6 -0
  62. package/dist/cjs/lint-config/eslint/common.cjs +8 -1
  63. package/dist/cjs/lint-config/eslint/flat/rules.mjs +1 -0
  64. package/dist/cjs/lint-config/lint-staged.config.js +17 -5
  65. package/dist/cjs/lint-config/prettier/export.mjs +1 -0
  66. package/dist/cjs/lint-config/{prettier.config.cjs → prettier.config.mjs} +4 -1
  67. package/dist/cjs/skills/migrate-storybook-out-of-cjs/SKILL.md +89 -35
  68. package/dist/cjs/skills/migrate-to-pui-cli-9/SKILL.md +126 -38
  69. package/dist/cjs/testing/{jest.config.cjs → jest.config.mjs} +9 -5
  70. package/dist/{esm/testing/jest.node.config.cjs → cjs/testing/jest.node.config.mjs} +3 -2
  71. package/dist/esm/babel.config.js +94 -0
  72. package/dist/esm/index.js +5 -9
  73. package/dist/esm/lint-config/commitlint/export.mjs +1 -0
  74. package/dist/esm/lint-config/commitlint.config.mjs +6 -0
  75. package/dist/esm/lint-config/eslint/common.cjs +8 -1
  76. package/dist/esm/lint-config/eslint/flat/rules.mjs +1 -0
  77. package/dist/esm/lint-config/lint-staged.config.js +17 -5
  78. package/dist/esm/lint-config/prettier/export.mjs +1 -0
  79. package/{lib/lint-config/prettier.config.cjs → dist/esm/lint-config/prettier.config.mjs} +4 -1
  80. package/dist/esm/skills/migrate-storybook-out-of-cjs/SKILL.md +89 -35
  81. package/dist/esm/skills/migrate-to-pui-cli-9/SKILL.md +126 -38
  82. package/dist/esm/testing/{jest.config.cjs → jest.config.mjs} +9 -5
  83. package/dist/{cjs/testing/jest.node.config.cjs → esm/testing/jest.node.config.mjs} +3 -2
  84. package/dist/types/lib/babel.config.d.ts +3 -0
  85. package/dist/types/lib/index.d.ts +5 -9
  86. package/dist/types/lib/lint-config/commitlint/export.d.mts +1 -0
  87. package/dist/types/lib/lint-config/commitlint.config.d.mts +3 -0
  88. package/dist/types/lib/lint-config/eslint/common.d.cts +8 -2
  89. package/dist/types/lib/lint-config/eslint/non-react.d.cts +8 -1
  90. package/dist/types/lib/lint-config/eslint/react.d.cts +8 -1
  91. package/dist/types/lib/lint-config/eslint/typescript/non-react.d.cts +8 -1
  92. package/dist/types/lib/lint-config/eslint/typescript/react.d.cts +8 -1
  93. package/dist/types/lib/lint-config/lint-staged.config.d.ts +2 -2
  94. package/dist/types/lib/lint-config/prettier/export.d.mts +1 -0
  95. package/dist/types/lib/lint-config/prettier.config.d.mts +3 -0
  96. package/dist/types/lib/utils.d.cts +1 -1
  97. package/dist/types/lib/utils.d.ts +1 -1
  98. package/dist/types/tsconfig.tsbuildinfo +1 -1
  99. package/lib/lint-config/commitlint/export.mjs +1 -0
  100. package/lib/lint-config/commitlint.config.mjs +6 -0
  101. package/lib/lint-config/eslint/common.cjs +8 -1
  102. package/lib/lint-config/eslint/flat/rules.mjs +1 -0
  103. package/lib/lint-config/lint-staged.config.js +20 -5
  104. package/lib/lint-config/prettier/export.mjs +1 -0
  105. package/{dist/esm/lint-config/prettier.config.cjs → lib/lint-config/prettier.config.mjs} +4 -1
  106. package/lib/skills/migrate-storybook-out-of-cjs/SKILL.md +89 -35
  107. package/lib/skills/migrate-to-pui-cli-9/SKILL.md +126 -38
  108. package/lib/testing/jest.config.mjs +124 -0
  109. package/lib/testing/jest.node.config.mjs +9 -0
  110. package/package.json +38 -22
  111. package/build/docs/api/variables/eslintBaseConfig/index.html +0 -132
  112. package/build/docs/api/variables/eslintConfig/index.html +0 -180
  113. package/build/docs/assets/js/04ee7372.2852111b.js +0 -1
  114. package/build/docs/assets/js/0551d4dd.ebb18f4f.js +0 -1
  115. package/build/docs/assets/js/0a1d0315.fc8f91a7.js +0 -1
  116. package/build/docs/assets/js/13097d8d.7877421c.js +0 -1
  117. package/build/docs/assets/js/3992.0ac29b2f.js +0 -2
  118. package/build/docs/assets/js/5befad71.5f19afb5.js +0 -1
  119. package/build/docs/assets/js/5d5f1db0.c5aa5afa.js +0 -1
  120. package/build/docs/assets/js/5e8c322a.ef3b894b.js +0 -1
  121. package/build/docs/assets/js/5e95c892.f550b901.js +0 -1
  122. package/build/docs/assets/js/6bd11e52.08b95209.js +0 -1
  123. package/build/docs/assets/js/6e96545e.30c1b801.js +0 -1
  124. package/build/docs/assets/js/80e87108.f9507b95.js +0 -1
  125. package/build/docs/assets/js/a94703ab.f1796514.js +0 -1
  126. package/build/docs/assets/js/b7b585d8.6d53e73f.js +0 -1
  127. package/build/docs/assets/js/b8ac1d98.62684003.js +0 -1
  128. package/build/docs/assets/js/c377a04b.0f8625c6.js +0 -1
  129. package/build/docs/assets/js/e5f79924.c793a74d.js +0 -1
  130. package/build/docs/assets/js/f736c962.dbd0d004.js +0 -1
  131. package/build/docs/assets/js/main.d5acb4ca.js +0 -2
  132. package/build/docs/assets/js/runtime~main.4f7cd700.js +0 -1
  133. package/dist/cjs/babel.config.cjs +0 -97
  134. package/dist/cjs/index.cjs +0 -35
  135. package/dist/cjs/lint-config/commitlint.config.cjs +0 -1
  136. package/dist/cjs/lint-config/stylelint.config.cjs +0 -3
  137. package/dist/esm/babel.config.cjs +0 -97
  138. package/dist/esm/index.cjs +0 -35
  139. package/dist/esm/lint-config/commitlint.config.cjs +0 -1
  140. package/dist/esm/lint-config/stylelint.config.cjs +0 -3
  141. package/dist/types/lib/babel.config.d.cts +0 -59
  142. package/dist/types/lib/index.d.cts +0 -13
  143. package/dist/types/lib/lint-config/commitlint.config.d.cts +0 -4
  144. package/dist/types/lib/lint-config/prettier.config.d.cts +0 -8
  145. package/dist/types/lib/lint-config/stylelint.config.d.cts +0 -2
  146. package/lib/lint-config/commitlint.config.cjs +0 -1
  147. package/lib/lint-config/stylelint.config.cjs +0 -3
  148. /package/build/docs/assets/js/{3992.0ac29b2f.js.LICENSE.txt → 3992.b9b54f94.js.LICENSE.txt} +0 -0
  149. /package/build/docs/assets/js/{main.d5acb4ca.js.LICENSE.txt → main.3ae939d4.js.LICENSE.txt} +0 -0
  150. /package/dist/types/lib/testing/{jest.config.d.cts → jest.config.d.mts} +0 -0
  151. /package/dist/types/lib/testing/{jest.node.config.d.cts → jest.node.config.d.mts} +0 -0
@@ -1 +0,0 @@
1
- "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[5908],{4391(e,n,i){i.r(n),i.d(n,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"usage-guide","title":"Usage Guide","description":"This guide provides detailed documentation for all available commands in @elliemae/pui-cli.","source":"@site/docs/usage-guide.md","sourceDirName":".","slug":"/usage-guide","permalink":"/cli/usage-guide","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/usage-guide.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)","permalink":"/cli/stylelint-migration"}}');var l=i(6070),r=i(6607);const c={},d="Usage Guide",t={},o=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Build Commands",id:"build-commands",level:2},{value:"<code>pui-cli build</code>",id:"pui-cli-build",level:3},{value:"<code>pui-cli buildCDN</code>",id:"pui-cli-buildcdn",level:3},{value:"<code>pui-cli pack</code>",id:"pui-cli-pack",level:3},{value:"Development Commands",id:"development-commands",level:2},{value:"<code>pui-cli start</code>",id:"pui-cli-start",level:3},{value:"<code>pui-cli storybook</code>",id:"pui-cli-storybook",level:3},{value:"Testing Commands",id:"testing-commands",level:2},{value:"<code>pui-cli test</code>",id:"pui-cli-test",level:3},{value:"<code>pui-cli vitest</code>",id:"pui-cli-vitest",level:3},{value:"Linting Commands",id:"linting-commands",level:2},{value:"<code>pui-cli lint</code>",id:"pui-cli-lint",level:3},{value:"<code>pui-cli tscheck</code>",id:"pui-cli-tscheck",level:3},{value:"Documentation Commands",id:"documentation-commands",level:2},{value:"<code>pui-cli gendoc</code>",id:"pui-cli-gendoc",level:3},{value:"Utility Commands",id:"utility-commands",level:2},{value:"<code>pui-cli version</code>",id:"pui-cli-version",level:3},{value:"<code>pui-cli codemod</code>",id:"pui-cli-codemod",level:3},{value:"<code>pui-cli skills</code>",id:"pui-cli-skills",level:3},{value:"Advanced Usage",id:"advanced-usage",level:2},{value:"Using pui-cli in npm scripts",id:"using-pui-cli-in-npm-scripts",level:3},{value:"CI/CD Integration",id:"cicd-integration",level:3},{value:"Using Exported Configurations",id:"using-exported-configurations",level:3},{value:"Configuration Priority",id:"configuration-priority",level:2},{value:"Best Practices",id:"best-practices",level:2},{value:"Development Workflow",id:"development-workflow",level:3},{value:"Library Development Workflow",id:"library-development-workflow",level:3},{value:"Performance Tips",id:"performance-tips",level:3},{value:"Framework Chunk Splitting",id:"framework-chunk-splitting",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Build Issues",id:"build-issues",level:3},{value:"Test Issues",id:"test-issues",level:3},{value:"Linting Issues",id:"linting-issues",level:3},{value:"Additional Resources",id:"additional-resources",level:2},{value:"Need Help?",id:"need-help",level:2}];function a(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"usage-guide",children:"Usage Guide"})}),"\n",(0,l.jsxs)(n.p,{children:["This guide provides detailed documentation for all available commands in ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli"}),"."]}),"\n",(0,l.jsx)(n.h2,{id:"table-of-contents",children:"Table of Contents"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#build-commands",children:"Build Commands"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#development-commands",children:"Development Commands"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#testing-commands",children:"Testing Commands"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#linting-commands",children:"Linting Commands"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#documentation-commands",children:"Documentation Commands"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#utility-commands",children:"Utility Commands"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#framework-chunk-splitting",children:"Framework Chunk Splitting"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"build-commands",children:"Build Commands"}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-build",children:(0,l.jsx)(n.code,{children:"pui-cli build"})}),"\n",(0,l.jsx)(n.p,{children:"Builds your application for production."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli build [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"-p, --prod"})," - Production build with optimizations"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Build web application (development)\npui-cli build\n\n# Build web application (production)\npui-cli build -p\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Output:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Application builds go to ",(0,l.jsx)(n.code,{children:"build/"})," or ",(0,l.jsx)(n.code,{children:"dist/"})," directory"]}),"\n",(0,l.jsx)(n.li,{children:"Creates optimized bundles with code splitting"}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Bundles code using Webpack"}),"\n",(0,l.jsx)(n.li,{children:"Minifies JavaScript and CSS"}),"\n",(0,l.jsx)(n.li,{children:"Generates source maps"}),"\n",(0,l.jsx)(n.li,{children:"Optimizes assets"}),"\n",(0,l.jsx)(n.li,{children:"Creates production-ready build"}),"\n",(0,l.jsx)(n.li,{children:"Applies tree shaking for smaller bundles"}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-buildcdn",children:(0,l.jsx)(n.code,{children:"pui-cli buildCDN"})}),"\n",(0,l.jsx)(n.p,{children:"Builds the application for CDN deployment."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli buildCDN\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Creates CDN-optimized builds"}),"\n",(0,l.jsx)(n.li,{children:"Generates proper asset paths for CDN"}),"\n",(0,l.jsx)(n.li,{children:"Optimizes bundle splitting"}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-pack",children:(0,l.jsx)(n.code,{children:"pui-cli pack"})}),"\n",(0,l.jsx)(n.p,{children:"Packages your library for distribution with multiple output formats."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli pack [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"-p, --prod"})," - Production build with minification"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"-t, --target <target>"})," - Build target (default: browser, options: node, browser)"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Build library (development)\npui-cli pack\n\n# Build library (production)\npui-cli pack -p\n\n# Build for Node.js target\npui-cli pack -p -t node\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Output:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Creates ",(0,l.jsx)(n.code,{children:"dist/"})," directory with:","\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"dist/esm/"})," - ES Module format"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"dist/cjs/"})," - CommonJS format"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"dist/types/"})," - TypeScript declarations"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"dist/umd/"})," - UMD format (browser)"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Builds library in multiple formats (ESM, CJS, UMD)"}),"\n",(0,l.jsx)(n.li,{children:"Generates TypeScript declaration files"}),"\n",(0,l.jsx)(n.li,{children:"Minifies code in production mode"}),"\n",(0,l.jsx)(n.li,{children:"Creates source maps"}),"\n",(0,l.jsx)(n.li,{children:"Validates package.json exports"}),"\n",(0,l.jsx)(n.li,{children:"Optimized for tree-shaking"}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"development-commands",children:"Development Commands"}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-start",children:(0,l.jsx)(n.code,{children:"pui-cli start"})}),"\n",(0,l.jsx)(n.p,{children:"Starts the development server with hot module replacement."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli start [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"-p, --prod"})," - Start in production mode"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--port <number>"})," - Specify port (default: 3000)"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--open"})," - Automatically open browser"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--hot"})," - Enable hot module replacement (default: true)"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Start on default port (development)\npui-cli start\n\n# Start in production mode\npui-cli start -p\n# or\npnpm start:prod\n\n# Start on custom port\npui-cli start --port 8080\n\n# Start and open browser\npui-cli start --open\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Starts Webpack dev server"}),"\n",(0,l.jsx)(n.li,{children:"Enables hot module replacement"}),"\n",(0,l.jsx)(n.li,{children:"Serves static files"}),"\n",(0,l.jsx)(n.li,{children:"Provides mock API endpoints"}),"\n",(0,l.jsx)(n.li,{children:"Auto-reloads on file changes"}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Environment Variables:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-env",children:"PORT=3000\nHOST=localhost\nHTTPS=false\n"})}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-storybook",children:(0,l.jsx)(n.code,{children:"pui-cli storybook"})}),"\n",(0,l.jsx)(n.p,{children:"Runs Storybook for component development and documentation."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli storybook [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"-b, --build"})," - Build static storybook"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--docs"})," - Run in documentation mode"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--port <number>"})," - Specify port (default: 11000)"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Start Storybook dev server\npui-cli storybook\n\n# Start with documentation mode\npui-cli storybook --docs\n\n# Build static Storybook\npui-cli storybook -b\n\n# Build with documentation mode\npui-cli storybook -b --docs\n\n# Run on custom port\npui-cli storybook --port 9000\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Starts Storybook development server"}),"\n",(0,l.jsx)(n.li,{children:"Provides interactive component playground"}),"\n",(0,l.jsx)(n.li,{children:"Generates component documentation"}),"\n",(0,l.jsx)(n.li,{children:"Useful for library development"}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"testing-commands",children:"Testing Commands"}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-test",children:(0,l.jsx)(n.code,{children:"pui-cli test"})}),"\n",(0,l.jsx)(n.p,{children:"Runs Jest tests with coverage reporting."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli test [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"-f, --fix"})," - Update snapshots (",(0,l.jsx)(n.code,{children:"-u"}),")"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"-p, --prod"})," - Run tests in production mode"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--watch"})," - Run tests in watch mode"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--debug"})," - Run tests in debug mode"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--coverage"})," - Generate coverage reports (default: true)"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--passWithNoTests"})," - Don't fail if no tests found"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--bail"})," - Stop on first test failure"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--findRelatedTests"})," - Run tests related to changed files"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Run all tests with coverage\npui-cli test\n\n# Run tests in production mode\npui-cli test -p\n\n# Run in watch mode\npnpm test:watch\n\n# Update snapshots\npui-cli test -f\n# or\npnpm test:fix\n\n# Debug tests\npui-cli test --debug\n# or\npnpm test:debug\n\n# Run only tests related to changed files (useful for pre-commit)\npui-cli test --coverage --passWithNoTests --bail --findRelatedTests\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Executes Jest test runner"}),"\n",(0,l.jsxs)(n.li,{children:["Generates coverage reports in ",(0,l.jsx)(n.code,{children:"reports/"})," directory"]}),"\n",(0,l.jsx)(n.li,{children:"Supports React Testing Library"}),"\n",(0,l.jsx)(n.li,{children:"Provides snapshot testing"}),"\n",(0,l.jsx)(n.li,{children:"Generates HTML coverage reports"}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Coverage Reports:"})}),"\n",(0,l.jsx)(n.p,{children:"After running tests, view coverage at:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"reports/index.html"})," - Overall coverage report"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"reports/lcov-report/index.html"})," - Detailed line coverage"]}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-vitest",children:(0,l.jsx)(n.code,{children:"pui-cli vitest"})}),"\n",(0,l.jsx)(n.p,{children:"Runs Vitest for modern, fast testing."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli vitest [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--watch"})," - Run in watch mode"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--ui"})," - Open Vitest UI"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--coverage"})," - Generate coverage"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Run tests\npui-cli vitest\n\n# Run with UI\npui-cli vitest --ui\n\n# Run in watch mode\npui-cli vitest --watch\n\n# Generate coverage\npui-cli vitest --coverage\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Provides fast test execution with Vite"}),"\n",(0,l.jsx)(n.li,{children:"Supports ESM natively"}),"\n",(0,l.jsx)(n.li,{children:"Offers visual test UI"}),"\n",(0,l.jsx)(n.li,{children:"Compatible with Jest syntax"}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"linting-commands",children:"Linting Commands"}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-lint",children:(0,l.jsx)(n.code,{children:"pui-cli lint"})}),"\n",(0,l.jsx)(n.p,{children:"Lints your codebase for code quality and style issues."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli lint [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--fix"})," - Automatically fix linting issues"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--js"})," - Lint JavaScript/TypeScript files only"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--css"})," - Lint CSS/SCSS files only"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--commit"})," - Lint commit messages"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--debug"})," - Show detailed error messages"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Lint all files\npui-cli lint\n\n# Auto-fix issues\npui-cli lint --fix\n\n# Lint only JavaScript files\npui-cli lint --js\n\n# Lint only CSS files\npui-cli lint --css\n\n# Lint commit messages\npui-cli lint --commit\n\n# Show debug information\npui-cli lint --debug\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Runs ESLint on JavaScript/TypeScript files"}),"\n",(0,l.jsx)(n.li,{children:"Runs Stylelint on CSS/SCSS files"}),"\n",(0,l.jsx)(n.li,{children:"Runs Commitlint on commit messages"}),"\n",(0,l.jsx)(n.li,{children:"Enforces code style consistency"}),"\n",(0,l.jsx)(n.li,{children:"Checks for common errors and anti-patterns"}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Linting Rules:"})}),"\n",(0,l.jsx)(n.p,{children:"The CLI provides pre-configured rules for:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"ESLint"}),": React, TypeScript, Jest best practices"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Stylelint"}),": CSS best practices and conventions"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Commitlint"}),": Conventional Commits format"]}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-tscheck",children:(0,l.jsx)(n.code,{children:"pui-cli tscheck"})}),"\n",(0,l.jsx)(n.p,{children:"Type-checks TypeScript files without emitting output."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli tscheck [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--files"})," - Check specific files only"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--watch"})," - Watch mode for continuous type checking"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--debug"})," - Show detailed TypeScript errors"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Check all types\npui-cli tscheck\n\n# Check with file listing\npui-cli tscheck --files\n\n# Watch for changes\npui-cli tscheck --watch\n\n# Show detailed errors\npui-cli tscheck --debug\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Runs TypeScript compiler in check mode"}),"\n",(0,l.jsx)(n.li,{children:"Reports type errors"}),"\n",(0,l.jsx)(n.li,{children:"Doesn't emit JavaScript files"}),"\n",(0,l.jsx)(n.li,{children:"Useful for CI/CD pipelines"}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"documentation-commands",children:"Documentation Commands"}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-gendoc",children:(0,l.jsx)(n.code,{children:"pui-cli gendoc"})}),"\n",(0,l.jsx)(n.p,{children:"Generates API documentation from your code."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli gendoc\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Generates TypeDoc documentation"}),"\n",(0,l.jsx)(n.li,{children:"Extracts JSDoc comments"}),"\n",(0,l.jsx)(n.li,{children:"Creates HTML documentation"}),"\n",(0,l.jsxs)(n.li,{children:["Outputs to ",(0,l.jsx)(n.code,{children:"docs/api/"})," directory"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Example JSDoc comments:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-typescript",children:"/**\n * Adds two numbers together\n * @param a - First number\n * @param b - Second number\n * @returns The sum of a and b\n * @example\n * ```ts\n * add(2, 3) // returns 5\n * ```\n */\nexport function add(a: number, b: number): number {\n return a + b;\n}\n"})}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"utility-commands",children:"Utility Commands"}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-version",children:(0,l.jsx)(n.code,{children:"pui-cli version"})}),"\n",(0,l.jsx)(n.p,{children:"Manages versioning for monorepo workspaces."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli version [options]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--set <version>"})," - Set specific version for all packages"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--workspace"})," - Update workspace package versions"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Update versions in monorepo\npui-cli version --workspace\n\n# Set specific version\npui-cli version --set 2.0.0\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Updates package.json versions"}),"\n",(0,l.jsx)(n.li,{children:"Maintains version consistency in monorepos"}),"\n",(0,l.jsx)(n.li,{children:"Updates dependency versions"}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-codemod",children:(0,l.jsx)(n.code,{children:"pui-cli codemod"})}),"\n",(0,l.jsx)(n.p,{children:"Runs code transformations using jscodeshift."}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli codemod <transform>\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Arguments:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"<transform>"})," - Name of the transform to apply"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Applies automated code transformations"}),"\n",(0,l.jsx)(n.li,{children:"Useful for migrations"}),"\n",(0,l.jsx)(n.li,{children:"Batch code refactoring"}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"pui-cli-skills",children:(0,l.jsx)(n.code,{children:"pui-cli skills"})}),"\n",(0,l.jsxs)(n.p,{children:["Installs bundled agent skills from ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli"})," into the current repo."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pui-cli skills list\npui-cli skills install [name] [--target <target>] [--force]\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Options:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"--target"})," \u2014 ",(0,l.jsx)(n.code,{children:"cursor"})," (default), ",(0,l.jsx)(n.code,{children:"claude"}),", ",(0,l.jsx)(n.code,{children:"copilot"}),", or ",(0,l.jsx)(n.code,{children:"all"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"cursor"})," \u2192 ",(0,l.jsx)(n.code,{children:".cursor/skills/"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"claude"})," \u2192 ",(0,l.jsx)(n.code,{children:".claude/skills/"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"copilot"})," \u2192 ",(0,l.jsx)(n.code,{children:".github/skills/"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"all"})," \u2192 all three paths (recommended for mixed teams)"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Examples:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# List bundled skills shipped with this pui-cli version\npnpm exec pui-cli skills list\n\n# Install for Cursor, Claude Code, and GitHub Copilot\npnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all\n\n# Storybook CJS \u2192 ESM (Storybook 10 / pui-app-sdk storybook/cjs removal)\npnpm exec pui-cli skills install migrate-storybook-out-of-cjs --target all\n\n# Install for Cursor only (default)\npnpm exec pui-cli skills install migrate-to-pui-cli-9\n\n# Install for Claude Code only\npnpm exec pui-cli skills install migrate-to-pui-cli-9 --target claude\n\n# Overwrite an existing skill directory\npnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all --force\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"What it does:"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Copies ",(0,l.jsx)(n.code,{children:"lib/skills/<name>/"})," from the installed package into the target skill directories"]}),"\n",(0,l.jsxs)(n.li,{children:["Uses the shared Agent Skills ",(0,l.jsx)(n.code,{children:"SKILL.md"})," format (works across Cursor, Claude Code, and Copilot)"]}),"\n",(0,l.jsxs)(n.li,{children:["See ",(0,l.jsx)(n.a,{href:"/cli/pui-cli-9-migration",children:"pui-cli 9 migration guide"})," for the full upgrade path"]}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"advanced-usage",children:"Advanced Usage"}),"\n",(0,l.jsx)(n.h3,{id:"using-pui-cli-in-npm-scripts",children:"Using pui-cli in npm scripts"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"package.json example:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "scripts": {\n "dev": "pui-cli start",\n "build": "pui-cli build",\n "build:lib": "pui-cli build --service",\n "test": "pui-cli test --coverage",\n "test:watch": "pui-cli test --watch",\n "test:debug": "pui-cli test --debug",\n "lint": "pui-cli lint",\n "lint:fix": "pui-cli lint --fix",\n "lint:js": "pui-cli lint --js --fix",\n "lint:css": "pui-cli lint --css --fix",\n "typecheck": "pui-cli tscheck",\n "storybook": "pui-cli storybook",\n "storybook:build": "pui-cli storybook --build",\n "gendoc": "pui-cli gendoc",\n "pack": "pui-cli pack",\n "precommit": "lint-staged"\n }\n}\n'})}),"\n",(0,l.jsx)(n.h3,{id:"cicd-integration",children:"CI/CD Integration"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Jenkins example:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"pipeline {\n agent any\n stages {\n stage('Install') {\n steps {\n sh 'pnpm install'\n }\n }\n stage('Lint') {\n steps {\n sh 'pnpm lint'\n }\n }\n stage('Type Check') {\n steps {\n sh 'pnpm tscheck'\n }\n }\n stage('Test') {\n steps {\n sh 'pnpm test'\n }\n }\n stage('Build') {\n steps {\n sh 'pnpm build'\n }\n }\n }\n}\n"})}),"\n",(0,l.jsx)(n.h3,{id:"using-exported-configurations",children:"Using Exported Configurations"}),"\n",(0,l.jsx)(n.p,{children:"You can import and extend the CLI's configurations in your own config files:"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"ESLint:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"import { eslintConfig } from '@elliemae/pui-cli';\n\nexport default [\n ...eslintConfig,\n {\n rules: {\n // Your custom rules\n 'no-console': 'warn',\n },\n },\n];\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Prettier:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"import { prettierConfig } from '@elliemae/pui-cli';\n\nexport default {\n ...prettierConfig,\n // Your custom overrides\n printWidth: 100,\n};\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Vitest:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-typescript",children:"import { defineConfig } from 'vitest/config';\nimport { vitestConfig } from '@elliemae/pui-cli/vitest';\n\nexport default defineConfig({\n ...vitestConfig,\n test: {\n ...vitestConfig.test,\n // Your custom test config\n },\n});\n"})}),"\n",(0,l.jsx)(n.h2,{id:"configuration-priority",children:"Configuration Priority"}),"\n",(0,l.jsx)(n.p,{children:"The CLI follows this priority order for configuration:"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsx)(n.li,{children:"Project-level configuration files"}),"\n",(0,l.jsx)(n.li,{children:"CLI's default configurations"}),"\n",(0,l.jsx)(n.li,{children:"Command-line arguments"}),"\n",(0,l.jsx)(n.li,{children:"Environment variables"}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,l.jsx)(n.h3,{id:"development-workflow",children:"Development Workflow"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Start development server:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm start\n"})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Run tests in watch mode (separate terminal):"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm test --watch\n"})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Type check (separate terminal):"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm tscheck --watch\n"})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Before committing:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm lint:fix\npnpm test\npnpm typecheck\n"})}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"library-development-workflow",children:"Library Development Workflow"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Start Storybook:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm storybook\n"})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Run tests in watch mode:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm test --watch\n"})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Build library:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm build --service\n"})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Test package:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm pack\n"})}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"performance-tips",children:"Performance Tips"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Use ",(0,l.jsx)(n.code,{children:"--findRelatedTests"})," to run only relevant tests"]}),"\n",(0,l.jsxs)(n.li,{children:["Enable ",(0,l.jsx)(n.code,{children:"--watch"})," mode during development"]}),"\n",(0,l.jsxs)(n.li,{children:["Use ",(0,l.jsx)(n.code,{children:"--silent"})," in CI to reduce output"]}),"\n",(0,l.jsxs)(n.li,{children:["Run ",(0,l.jsx)(n.code,{children:"lint --js"})," and ",(0,l.jsx)(n.code,{children:"lint --css"})," separately for faster feedback"]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"framework-chunk-splitting",children:"Framework Chunk Splitting"}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"pui-cli"})," supports an opt-in ",(0,l.jsx)(n.strong,{children:"framework chunk"})," that separates React core libraries into a dedicated bundle. Because the framework changes far less frequently than other vendor dependencies, this improves long-term browser caching and reduces the amount of JavaScript users re-download on routine releases."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"How it works"})}),"\n",(0,l.jsx)(n.p,{children:"When enabled, the production (and dev) Webpack build creates three vendor-level chunks instead of two:"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Chunk"}),(0,l.jsx)(n.th,{children:"Contents"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"emui.js"})}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"@elliemae/*"})," packages (design system, SDK, diagnostics, etc.)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"framework.js"})}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"react"}),", ",(0,l.jsx)(n.code,{children:"react-dom"}),", ",(0,l.jsx)(n.code,{children:"scheduler"}),", ",(0,l.jsx)(n.code,{children:"react-router"}),", ",(0,l.jsx)(n.code,{children:"react-router-dom"}),", ",(0,l.jsx)(n.code,{children:"history"}),", ",(0,l.jsx)(n.code,{children:"react-is"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"vendors.js"})}),(0,l.jsxs)(n.td,{children:["Everything else from ",(0,l.jsx)(n.code,{children:"node_modules"})]})]})]})]}),"\n",(0,l.jsxs)(n.p,{children:["Without the flag, the default two-chunk layout is preserved (",(0,l.jsx)(n.code,{children:"emui.js"})," + ",(0,l.jsx)(n.code,{children:"vendors.js"}),")."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Enabling the flag"})}),"\n",(0,l.jsxs)(n.p,{children:["Add the following to your application's ",(0,l.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-env",children:"SPLIT_FRAMEWORK_CHUNK=true\n"})}),"\n",(0,l.jsxs)(n.p,{children:["The flag is read at build time. No changes to ",(0,l.jsx)(n.code,{children:"pui-cli"})," itself are needed."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Required application updates"})}),"\n",(0,l.jsxs)(n.p,{children:["After enabling the flag you must update three places in your application to include ",(0,l.jsx)(n.code,{children:"framework.js"})," in the script loading order."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsxs)(n.strong,{children:["1. ",(0,l.jsx)(n.code,{children:"index-app-loader.html"})]})}),"\n",(0,l.jsxs)(n.p,{children:["If your application uses ",(0,l.jsx)(n.code,{children:"pui-app-loader"}),", update the ",(0,l.jsx)(n.code,{children:"bodyScripts"})," array to include ",(0,l.jsx)(n.code,{children:"framework.js"})," ",(0,l.jsx)(n.strong,{children:"before"})," ",(0,l.jsx)(n.code,{children:"vendors.js"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"emuiAppLoader.load({\n appId: 'loanapp',\n headScripts: [],\n bodyScripts: ['runtime~app.js', 'framework.js', 'vendors.js', 'emui.js', 'app.js'],\n styles: ['vendors.css', 'emui.css'],\n isJsModule: true,\n});\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsxs)(n.strong,{children:["2. ",(0,l.jsx)(n.code,{children:"app.config.json"})," \u2014 ",(0,l.jsx)(n.code,{children:"microFrontendApps"})," file lists"]})}),"\n",(0,l.jsxs)(n.p,{children:["Any microapp built with the framework chunk enabled must list ",(0,l.jsx)(n.code,{children:"framework.js"})," in its ",(0,l.jsx)(n.code,{children:"development.files"})," and ",(0,l.jsx)(n.code,{children:"production.files"})," arrays. The host app's ",(0,l.jsx)(n.code,{children:"app.config.json"})," must reflect this so that ",(0,l.jsx)(n.code,{children:"app-bridge"})," loads the scripts in the correct order."]}),"\n",(0,l.jsx)(n.p,{children:"Development example:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "microFrontendApps": {\n "myapp": {\n "name": "My App",\n "hostUrl": "./myapp",\n "development": {\n "files": [\n "https://cdn.mortgagetech.q1.ice.com/pui-diagnostics@3",\n "https://cdn.mortgagetech.q1.ice.com/pui-logrocket@1",\n "js/global.js",\n "framework.js",\n "emui.js",\n "vendors.js",\n "app.js"\n ]\n }\n }\n }\n}\n'})}),"\n",(0,l.jsx)(n.p,{children:"Production example:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "microFrontendApps": {\n "myapp": {\n "name": "My App",\n "hostUrl": "./myapp",\n "production": {\n "files": [\n "https://cdn.mortgagetech.q1.ice.com/pui-diagnostics@3",\n "https://cdn.mortgagetech.q1.ice.com/pui-logrocket@1",\n "js/global.js",\n "runtime~app.js",\n "framework.js",\n "emui.js",\n "vendors.js",\n "app.js",\n "emui.css",\n "vendors.css"\n ]\n }\n }\n }\n}\n'})}),"\n",(0,l.jsxs)(n.blockquote,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Load order matters."})," ",(0,l.jsx)(n.code,{children:"framework.js"})," must appear before ",(0,l.jsx)(n.code,{children:"vendors.js"})," and ",(0,l.jsx)(n.code,{children:"emui.js"})," because both depend on React."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"3. Verify the build output"})}),"\n",(0,l.jsx)(n.p,{children:"After enabling the flag, run a production build and confirm the new chunk appears:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm build\nls build/latest/js/framework.*.js\n"})}),"\n",(0,l.jsxs)(n.p,{children:["You should see a hashed file like ",(0,l.jsx)(n.code,{children:"framework.abc123.js"})," alongside the existing ",(0,l.jsx)(n.code,{children:"emui"}),", ",(0,l.jsx)(n.code,{children:"vendors"}),", and ",(0,l.jsx)(n.code,{children:"app"})," chunks."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Disabling the flag"})}),"\n",(0,l.jsxs)(n.p,{children:["Remove ",(0,l.jsx)(n.code,{children:"SPLIT_FRAMEWORK_CHUNK=true"})," from ",(0,l.jsx)(n.code,{children:".env"})," (or set it to ",(0,l.jsx)(n.code,{children:"false"}),"), then reverse the file-list changes above \u2014 remove ",(0,l.jsx)(n.code,{children:"framework.js"})," from ",(0,l.jsx)(n.code,{children:"index-app-loader.html"})," and ",(0,l.jsx)(n.code,{children:"app.config.json"}),". The build will revert to the default two-chunk layout."]}),"\n",(0,l.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,l.jsx)(n.h3,{id:"build-issues",children:"Build Issues"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Error: Module not found"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Clear cache and rebuild\nrm -rf node_modules dist\npnpm install\npnpm build\n"})}),"\n",(0,l.jsx)(n.h3,{id:"test-issues",children:"Test Issues"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Error: Tests timing out"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Increase timeout in jest.config\npui-cli test --debug\n"})}),"\n",(0,l.jsx)(n.h3,{id:"linting-issues",children:"Linting Issues"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Error: Too many linting errors"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# Fix automatically\npnpm lint --fix\n\n# Fix only JS\npnpm lint --js --fix\n\n# Fix only CSS\npnpm lint --css --fix\n"})}),"\n",(0,l.jsx)(n.h2,{id:"additional-resources",children:"Additional Resources"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/cli/#getting-started",children:"Getting Started Guide"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"./api/",children:"API Documentation"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://git.elliemae.io/platform-ui/pui-cli#migration-guide",children:"Migration Guide"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://git.elliemae.io/platform-ui/pui-cli",children:"GitHub Repository"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"need-help",children:"Need Help?"}),"\n",(0,l.jsx)(n.p,{children:"If you encounter issues or have questions:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Review the documentation"}),"\n",(0,l.jsx)(n.li,{children:"Contact the UI Platform team via ui-platform teams channel"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(a,{...e})}):a(e)}},6607(e,n,i){i.d(n,{R:()=>c,x:()=>d});var s=i(758);const l={},r=s.createContext(l);function c(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
@@ -1 +0,0 @@
1
- "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[1712],{797(i){i.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docsSidebar":[{"type":"category","label":"Cli API","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"functions","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/cli/api/functions/loadRoutes","label":"loadRoutes()","docId":"api/functions/loadRoutes","unlisted":false}]},{"type":"category","label":"type-aliases","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/cli/api/type-aliases/LIB_NAME","label":"LIB\\\\_NAME","docId":"api/type-aliases/LIB_NAME","unlisted":false}]},{"type":"category","label":"variables","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/cli/api/variables/babelConfig","label":"babelConfig","docId":"api/variables/babelConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/commitlintConfig","label":"commitlintConfig","docId":"api/variables/commitlintConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/eslintBaseConfig","label":"~~eslintBaseConfig~~","docId":"api/variables/eslintBaseConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/eslintConfig","label":"~~eslintConfig~~","docId":"api/variables/eslintConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/eslintFlatBaseConfig","label":"eslintFlatBaseConfig","docId":"api/variables/eslintFlatBaseConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/eslintFlatBaseConfigStrict","label":"eslintFlatBaseConfigStrict","docId":"api/variables/eslintFlatBaseConfigStrict","unlisted":false},{"type":"link","href":"/cli/api/variables/eslintFlatConfig","label":"eslintFlatConfig","docId":"api/variables/eslintFlatConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/eslintFlatConfigStrict","label":"eslintFlatConfigStrict","docId":"api/variables/eslintFlatConfigStrict","unlisted":false},{"type":"link","href":"/cli/api/variables/jestConfig","label":"jestConfig","docId":"api/variables/jestConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/jestNodeConfig","label":"jestNodeConfig","docId":"api/variables/jestNodeConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/lintStagedConfig","label":"lintStagedConfig","docId":"api/variables/lintStagedConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/prettierConfig","label":"prettierConfig","docId":"api/variables/prettierConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/stylelintConfig","label":"stylelintConfig","docId":"api/variables/stylelintConfig","unlisted":false},{"type":"link","href":"/cli/api/variables/vitestConfig","label":"vitestConfig","docId":"api/variables/vitestConfig","unlisted":false}]}],"href":"/cli/api/"},{"type":"link","href":"/cli/eslint-rules-migration","label":"ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)","docId":"eslint-rules-migration","unlisted":false},{"type":"link","href":"/cli/","label":"PUI CLI Documentation","docId":"index","unlisted":false},{"type":"link","href":"/cli/pui-cli-9-migration","label":"pui-cli 9 migration guide","docId":"pui-cli-9-migration","unlisted":false},{"type":"link","href":"/cli/ssl-certificate-setup","label":"Trust SSL Certificate Guide","docId":"ssl-certificate-setup","unlisted":false},{"type":"link","href":"/cli/stylelint-migration","label":"Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)","docId":"stylelint-migration","unlisted":false},{"type":"link","href":"/cli/usage-guide","label":"Usage Guide","docId":"usage-guide","unlisted":false}]},"docs":{"api/functions/loadRoutes":{"id":"api/functions/loadRoutes","title":"loadRoutes()","description":"Parameters","sidebar":"docsSidebar"},"api/index":{"id":"api/index","title":"Cli API","description":"Functions","sidebar":"docsSidebar"},"api/type-aliases/LIB_NAME":{"id":"api/type-aliases/LIB_NAME","title":"LIB\\\\_NAME","description":"","sidebar":"docsSidebar"},"api/variables/babelConfig":{"id":"api/variables/babelConfig","title":"babelConfig","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/commitlintConfig":{"id":"api/variables/commitlintConfig","title":"commitlintConfig","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/eslintBaseConfig":{"id":"api/variables/eslintBaseConfig","title":"~~eslintBaseConfig~~","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/eslintConfig":{"id":"api/variables/eslintConfig","title":"~~eslintConfig~~","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/eslintFlatBaseConfig":{"id":"api/variables/eslintFlatBaseConfig","title":"eslintFlatBaseConfig","description":"Flat ESLint config for non-React TypeScript libraries and services.","sidebar":"docsSidebar"},"api/variables/eslintFlatBaseConfigStrict":{"id":"api/variables/eslintFlatBaseConfigStrict","title":"eslintFlatBaseConfigStrict","description":"Strict flat ESLint config for non-React TypeScript (no-unsafe-* as error).","sidebar":"docsSidebar"},"api/variables/eslintFlatConfig":{"id":"api/variables/eslintFlatConfig","title":"eslintFlatConfig","description":"Flat ESLint config for React + TypeScript PUI apps.","sidebar":"docsSidebar"},"api/variables/eslintFlatConfigStrict":{"id":"api/variables/eslintFlatConfigStrict","title":"eslintFlatConfigStrict","description":"Strict flat ESLint config for React + TypeScript (errors on no-unsafe-* and exhaustive-deps).","sidebar":"docsSidebar"},"api/variables/jestConfig":{"id":"api/variables/jestConfig","title":"jestConfig","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/jestNodeConfig":{"id":"api/variables/jestNodeConfig","title":"jestNodeConfig","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/lintStagedConfig":{"id":"api/variables/lintStagedConfig","title":"lintStagedConfig","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/prettierConfig":{"id":"api/variables/prettierConfig","title":"prettierConfig","description":"Type Declaration","sidebar":"docsSidebar"},"api/variables/stylelintConfig":{"id":"api/variables/stylelintConfig","title":"stylelintConfig","description":"","sidebar":"docsSidebar"},"api/variables/vitestConfig":{"id":"api/variables/vitestConfig","title":"vitestConfig","description":"","sidebar":"docsSidebar"},"eslint-rules-migration":{"id":"eslint-rules-migration","title":"ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)","description":"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).","sidebar":"docsSidebar"},"index":{"id":"index","title":"PUI CLI Documentation","description":"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.","sidebar":"docsSidebar"},"pui-cli-9-migration":{"id":"pui-cli-9-migration","title":"pui-cli 9 migration guide","description":"This guide helps PUI consumers upgrade apps and libraries from pui-cli 8 to pui-cli 9.","sidebar":"docsSidebar"},"ssl-certificate-setup":{"id":"ssl-certificate-setup","title":"Trust SSL Certificate Guide","description":"This guide explains how to trust the self-signed CA certificate on different operating systems and browsers so your HTTPS connection works without warnings.","sidebar":"docsSidebar"},"stylelint-migration":{"id":"stylelint-migration","title":"Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)","description":"This document covers Stylelint changes shipped with pui-cli 9 (Stylelint 17.x).","sidebar":"docsSidebar"},"usage-guide":{"id":"usage-guide","title":"Usage Guide","description":"This guide provides detailed documentation for all available commands in @elliemae/pui-cli.","sidebar":"docsSidebar"}}}}')}}]);
@@ -1 +0,0 @@
1
- "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[1572],{7963(e,t,i){i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>f,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"api/variables/eslintFlatBaseConfigStrict","title":"eslintFlatBaseConfigStrict","description":"Strict flat ESLint config for non-React TypeScript (no-unsafe-* as error).","source":"@site/docs/api/variables/eslintFlatBaseConfigStrict.md","sourceDirName":"api/variables","slug":"/api/variables/eslintFlatBaseConfigStrict","permalink":"/cli/api/variables/eslintFlatBaseConfigStrict","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/api/variables/eslintFlatBaseConfigStrict.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"eslintFlatBaseConfig","permalink":"/cli/api/variables/eslintFlatBaseConfig"},"next":{"title":"eslintFlatConfig","permalink":"/cli/api/variables/eslintFlatConfig"}}');var a=i(6070),s=i(6607);const r={},l="eslintFlatBaseConfigStrict",o={},c=[];function p(e){const t={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"eslintflatbaseconfigstrict",children:"eslintFlatBaseConfigStrict"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-ts",children:"const eslintFlatBaseConfigStrict: any = nonReactFlatConfigsStrict;\n"})}),"\n",(0,a.jsxs)(t.p,{children:["Strict flat ESLint config for non-React TypeScript (",(0,a.jsx)(t.code,{children:"no-unsafe-*"})," as error)."]})]})}function f(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},6607(e,t,i){i.d(t,{R:()=>r,x:()=>l});var n=i(758);const a={},s=n.createContext(a);function r(e){const t=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]);
@@ -1 +0,0 @@
1
- "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[5455],{2668(e,n,s){s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>c,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"pui-cli-9-migration","title":"pui-cli 9 migration guide","description":"This guide helps PUI consumers upgrade apps and libraries from pui-cli 8 to pui-cli 9.","source":"@site/docs/pui-cli-9-migration.md","sourceDirName":".","slug":"/pui-cli-9-migration","permalink":"/cli/pui-cli-9-migration","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/pui-cli-9-migration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"PUI CLI Documentation","permalink":"/cli/"},"next":{"title":"Trust SSL Certificate Guide","permalink":"/cli/ssl-certificate-setup"}}');var l=s(6070),r=s(6607);const c={},d="pui-cli 9 migration guide",t={},o=[{value:"At a glance",id:"at-a-glance",level:2},{value:"Recommended rollout",id:"recommended-rollout",level:2},{value:"Step-by-step",id:"step-by-step",level:2},{value:"1. Upgrade toolchain",id:"1-upgrade-toolchain",level:3},{value:"1b. Migrate pnpm hoisting to <code>pnpm-workspace.yaml</code> (pnpm 11)",id:"1b-migrate-pnpm-hoisting-to-pnpm-workspaceyaml-pnpm-11",level:3},{value:"Why",id:"why",level:4},{value:"Settings to move",id:"settings-to-move",level:4},{value:"Single-package app or library",id:"single-package-app-or-library",level:4},{value:"Monorepo (<code>libs/*</code>, <code>apps/*</code>)",id:"monorepo-libs-apps",level:4},{value:"Reinstall and verify",id:"reinstall-and-verify",level:4},{value:"Common failures",id:"common-failures",level:4},{value:"2. Upgrade pui-cli",id:"2-upgrade-pui-cli",level:3},{value:"3. Add flat ESLint config",id:"3-add-flat-eslint-config",level:3},{value:"4. Update Stylelint config",id:"4-update-stylelint-config",level:3},{value:"5. Fix lint",id:"5-fix-lint",level:3},{value:"6. Install the migration skill (optional)",id:"6-install-the-migration-skill-optional",level:3},{value:"Temporary overrides",id:"temporary-overrides",level:2},{value:"Strict config (after cleanup)",id:"strict-config-after-cleanup",level:2},{value:"Husky 9",id:"husky-9",level:2},{value:"Jest (<code>pui-cli test</code>)",id:"jest-pui-cli-test",level:2},{value:"Vitest 4",id:"vitest-4",level:2},{value:"semantic-release 25",id:"semantic-release-25",level:2},{value:"1. Upgrade semantic-release (if pinned locally)",id:"1-upgrade-semantic-release-if-pinned-locally",level:3},{value:"2. Migrate release config to ESM",id:"2-migrate-release-config-to-esm",level:3},{value:"3. Custom plugins or overrides",id:"3-custom-plugins-or-overrides",level:3},{value:"4. Verify locally",id:"4-verify-locally",level:3},{value:"Agent-assisted migration",id:"agent-assisted-migration",level:3},{value:"Lerna 9 and Nx 22 (monorepos only)",id:"lerna-9-and-nx-22-monorepos-only",level:2},{value:"1. Remove legacy Nx package pins",id:"1-remove-legacy-nx-package-pins",level:3},{value:"2. Migrate <code>nx.json</code>",id:"2-migrate-nxjson",level:3},{value:"3. Lerna 9 notes",id:"3-lerna-9-notes",level:3},{value:"4. Verify monorepo workflows",id:"4-verify-monorepo-workflows",level:3},{value:"Storybook 10 (pui-cli 9)",id:"storybook-10-pui-cli-9",level:2},{value:"What changed",id:"what-changed",level:3},{value:"Consumer migration",id:"consumer-migration",level:3},{value:"Verify",id:"verify",level:3},{value:"CI checklist",id:"ci-checklist",level:2},{value:"Getting help",id:"getting-help",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",input:"input",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"pui-cli-9-migration-guide",children:"pui-cli 9 migration guide"})}),"\n",(0,l.jsxs)(n.p,{children:["This guide helps PUI consumers upgrade apps and libraries from ",(0,l.jsx)(n.strong,{children:"pui-cli 8"})," to ",(0,l.jsx)(n.strong,{children:"pui-cli 9"}),".\nFor ESLint rule-level detail, see ",(0,l.jsx)(n.a,{href:"/cli/eslint-rules-migration",children:"ESLint rules migration guide"}),"."]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"at-a-glance",children:"At a glance"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Topic"}),(0,l.jsx)(n.th,{children:"pui-cli 8"}),(0,l.jsx)(n.th,{children:"pui-cli 9"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Node.js"}),(0,l.jsx)(n.td,{children:"20"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.strong,{children:"24"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"pnpm"}),(0,l.jsx)(n.td,{children:"8\u201310"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"11"})," (hoist settings in ",(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"})}),", not ",(0,l.jsx)(n.code,{children:".npmrc"}),")"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"App/library bundler"}),(0,l.jsx)(n.td,{children:"Webpack"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"Webpack"})," (unchanged)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"ESLint"}),(0,l.jsxs)(n.td,{children:["8.x + ",(0,l.jsx)(n.code,{children:".eslintrc.cjs"})]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"10.x"})," + ",(0,l.jsx)(n.code,{children:"eslint.config.mjs"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Stylelint"}),(0,l.jsxs)(n.td,{children:["15.x + ",(0,l.jsx)(n.code,{children:"stylelint-config-styled-components"})]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"17.x"})," + ",(0,l.jsx)(n.code,{children:"postcss-styled-syntax"})," (styled-components rules inlined)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:["Vitest (via ",(0,l.jsx)(n.code,{children:"pui-cli vitest"}),")"]}),(0,l.jsx)(n.td,{children:"1.x"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"4.x"})," (uses Vite internally; not the app bundler)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"TypeScript lint"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"@typescript-eslint"})," v5"]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"typescript-eslint"})," v8"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Exported tsconfig"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:'moduleResolution: "node"'})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:'moduleResolution: "bundler"'})})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Shared config import"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"require('@elliemae/pui-cli').eslintConfig"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"import { eslintFlatConfig } from '@elliemae/pui-cli/eslint'"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Stylelint import"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"require('@elliemae/pui-cli').stylelintConfig"})}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"import { stylelintConfig } from '@elliemae/pui-cli/stylelint'"})," (or keep CJS re-export)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"semantic-release"}),(0,l.jsxs)(n.td,{children:["21.x + ",(0,l.jsx)(n.code,{children:"release.config.cjs"})]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"25.x"})," + ",(0,l.jsx)(n.code,{children:"release.config.mjs"})," (ESM ",(0,l.jsx)(n.code,{children:"extends"})," for shareable config)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Husky"}),(0,l.jsx)(n.td,{children:"8.x"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.strong,{children:"9.x"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Lerna (monorepos)"}),(0,l.jsx)(n.td,{children:"6.x"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"9.x"})," (via pui-cli; ",(0,l.jsx)(n.code,{children:"bootstrap"}),"/",(0,l.jsx)(n.code,{children:"add"}),"/",(0,l.jsx)(n.code,{children:"link"})," removed)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Nx (monorepos)"}),(0,l.jsxs)(n.td,{children:["15.x (",(0,l.jsx)(n.code,{children:"@nrwl/*"}),")"]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.strong,{children:"22.x"})," (",(0,l.jsx)(n.code,{children:"nx"})," + ",(0,l.jsx)(n.code,{children:"@nx/workspace"}),"; modern ",(0,l.jsx)(n.code,{children:"nx.json"}),")"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Cursor skill"}),(0,l.jsx)(n.td,{children:"\u2014"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"pui-cli skills install migrate-to-pui-cli-9 --target all"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Storybook CJS \u2192 ESM skill"}),(0,l.jsx)(n.td,{children:"\u2014"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"pui-cli skills install migrate-storybook-out-of-cjs --target all"})})]})]})]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"recommended-rollout",children:"Recommended rollout"}),"\n",(0,l.jsxs)(n.p,{children:["Ship in ",(0,l.jsx)(n.strong,{children:"small PRs"})," to reduce regression risk:"]}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Toolchain"})," \u2014 Node 24 + pnpm 11 + CI image updates + ",(0,l.jsxs)(n.strong,{children:["hoisting in ",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"})]})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Dependency bump"})," \u2014 ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli@9"})," without ESLint config change"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"ESLint flat config"})," \u2014 add ",(0,l.jsx)(n.code,{children:"eslint.config.mjs"}),", delete legacy ESLint files, fix lint"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Stylelint 17"})," \u2014 simplify ",(0,l.jsx)(n.code,{children:"stylelint.config.cjs"})," (remove ",(0,l.jsx)(n.code,{children:"stylelint-config-styled-components"})," overrides); optional ",(0,l.jsx)(n.code,{children:"stylelint.config.mjs"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Husky 9"})," \u2014 update ",(0,l.jsx)(n.code,{children:"prepare"})," script and hook files (if ",(0,l.jsx)(n.code,{children:".husky/"})," exists)"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Vitest 4"})," \u2014 only if the repo uses ",(0,l.jsx)(n.code,{children:"pui-cli vitest"})," (see below)"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"semantic-release 25"})," \u2014 migrate ",(0,l.jsx)(n.code,{children:"release.config.cjs"})," \u2192 ",(0,l.jsx)(n.code,{children:"release.config.mjs"})," (libraries that publish to npm)"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Lerna 9 + Nx 22"})," \u2014 monorepos only: update ",(0,l.jsx)(n.code,{children:"nx.json"}),", remove ",(0,l.jsx)(n.code,{children:"@nrwl/*"})," pins, verify ",(0,l.jsx)(n.code,{children:"pui-cli version"})," / ",(0,l.jsx)(n.code,{children:"nx run-many"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Debt (optional)"})," \u2014 remove temporary rule overrides, adopt strict config"]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["Each PR should pass: ",(0,l.jsx)(n.code,{children:"lint"}),", ",(0,l.jsx)(n.code,{children:"tscheck"}),", ",(0,l.jsx)(n.code,{children:"test"}),", ",(0,l.jsx)(n.code,{children:"build"}),"."]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"step-by-step",children:"Step-by-step"}),"\n",(0,l.jsx)(n.h3,{id:"1-upgrade-toolchain",children:"1. Upgrade toolchain"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"# .node-version\n24\n"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'// package.json (root)\n"engines": {\n "pnpm": ">=11",\n "node": ">=24"\n}\n'})}),"\n",(0,l.jsxs)(n.p,{children:["Do ",(0,l.jsx)(n.strong,{children:"not"})," pin an exact pnpm version in ",(0,l.jsx)(n.code,{children:"packageManager"})," \u2014 Corepack requires an exact semver there, which forces every customer onto the same patch. Use ",(0,l.jsx)(n.code,{children:"engines.pnpm"})," so teams can run any pnpm 11 minor or patch. Omit ",(0,l.jsx)(n.code,{children:"packageManager"})," unless you intentionally want Corepack to lock one version for your own CI."]}),"\n",(0,l.jsx)(n.p,{children:"Update Jenkins/docker Node images before merging."}),"\n",(0,l.jsxs)(n.h3,{id:"1b-migrate-pnpm-hoisting-to-pnpm-workspaceyaml-pnpm-11",children:["1b. Migrate pnpm hoisting to ",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"})," (pnpm 11)"]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Do this in every repo"})," that upgrades to pnpm 11 \u2014 single-package apps, libraries, and monorepos."]}),"\n",(0,l.jsx)(n.h4,{id:"why",children:"Why"}),"\n",(0,l.jsxs)(n.p,{children:["pnpm 11 only reads ",(0,l.jsx)(n.strong,{children:"auth and registry"})," from ",(0,l.jsx)(n.code,{children:".npmrc"}),". Every other pnpm setting \u2014 including hoisting \u2014 must live in ",(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"})})," (camelCase keys). See ",(0,l.jsx)(n.a,{href:"https://pnpm.io/next/migration",children:"pnpm v11 migration"}),"."]}),"\n",(0,l.jsxs)(n.p,{children:["If hoisting stays only in ",(0,l.jsx)(n.code,{children:".npmrc"}),", pnpm ",(0,l.jsx)(n.strong,{children:"silently ignores it"}),". Symptom: ",(0,l.jsx)(n.code,{children:"node_modules/.modules.yaml"})," shows ",(0,l.jsx)(n.code,{children:'"publicHoistPattern": []'})," even when ",(0,l.jsx)(n.code,{children:".npmrc"})," has ",(0,l.jsx)(n.code,{children:"shamefully-hoist=true"}),". Webpack builds then fail with ",(0,l.jsx)(n.code,{children:"Can't resolve 'esbuild-loader'"}),", ",(0,l.jsx)(n.code,{children:"styled-components"}),", or ",(0,l.jsx)(n.code,{children:"@elliemae/pui-theme"})," because ",(0,l.jsx)(n.strong,{children:"pui-cli webpack aliases"})," resolve packages from the ",(0,l.jsx)(n.strong,{children:"repo root"})," ",(0,l.jsx)(n.code,{children:"node_modules/"}),"."]}),"\n",(0,l.jsxs)(n.p,{children:["PUI org policy keeps ",(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"shamefullyHoist: true"})})," (same as pnpm 8 ",(0,l.jsx)(n.code,{children:"shamefully-hoist=true"}),") for compatibility with ",(0,l.jsx)(n.code,{children:"@elliemae/app-react-dependencies"})," and pui-cli tooling. ",(0,l.jsx)(n.strong,{children:"Do not remove hoisting"})," during the cli 9 migration."]}),"\n",(0,l.jsx)(n.h4,{id:"settings-to-move",children:"Settings to move"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.th,{children:["pnpm 8\u201310 (",(0,l.jsx)(n.code,{children:".npmrc"})," or ",(0,l.jsx)(n.code,{children:"package.json#pnpm"}),")"]}),(0,l.jsxs)(n.th,{children:["pnpm 11 (",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"}),")"]})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"shamefully-hoist=true"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"shamefullyHoist: true"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"public-hoist-pattern[]=\u2026"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:'publicHoistPattern: [ "\u2026" ]'})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"strict-peer-dependencies=false"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"strictPeerDependencies: false"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"auto-install-peers=false"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"autoInstallPeers: false"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"git-checks=false"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"gitChecks: false"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"enable-pre-post-scripts=true"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"enablePrePostScripts: true"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"package.json"})," \u2192 ",(0,l.jsx)(n.code,{children:'"pnpm": { "overrides": \u2026 }'})]}),(0,l.jsxs)(n.td,{children:["top-level ",(0,l.jsx)(n.code,{children:"overrides:"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"onlyBuiltDependencies"})," / ",(0,l.jsx)(n.code,{children:"neverBuiltDependencies"})]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"allowBuilds:"})," (",(0,l.jsx)(n.code,{children:"true"})," / ",(0,l.jsx)(n.code,{children:"false"})," per package)"]})]})]})]}),"\n",(0,l.jsxs)(n.p,{children:["Leave ",(0,l.jsx)(n.strong,{children:"only"})," auth/registry lines in ",(0,l.jsx)(n.code,{children:".npmrc"})," (for example ",(0,l.jsx)(n.code,{children:"legacy-peer-deps=true"})," if your registry workflow needs it)."]}),"\n",(0,l.jsx)(n.h4,{id:"single-package-app-or-library",children:"Single-package app or library"}),"\n",(0,l.jsxs)(n.p,{children:["Create or update ",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"})," at the repo root:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",children:"packages:\n - '.'\n\nshamefullyHoist: true\nstrictPeerDependencies: false\nautoInstallPeers: false\n\nallowBuilds:\n '@swc/core': true\n esbuild: true\n nx: true\n # \u2026approve other packages that run install scripts (see pnpm approve-builds)\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Reference: ",(0,l.jsx)(n.code,{children:"pui-react-boilerplate/pnpm-workspace.yaml"}),", ",(0,l.jsx)(n.code,{children:"pui-lib-boilerplate/pnpm-workspace.yaml"}),"."]}),"\n",(0,l.jsxs)(n.h4,{id:"monorepo-libs-apps",children:["Monorepo (",(0,l.jsx)(n.code,{children:"libs/*"}),", ",(0,l.jsx)(n.code,{children:"apps/*"}),")"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",children:'packages:\n - "libs/*"\n - "apps/*"\n\nshamefullyHoist: true\n# Optional explicit patterns (shamefullyHoist already hoists all deps to root)\npublicHoistPattern:\n - "esbuild-loader"\n - "@elliemae/*"\n - "styled-components"\n - "history"\n - "lodash"\nstrictPeerDependencies: false\nautoInstallPeers: false\ngitChecks: false\nenablePrePostScripts: true\n\noverrides:\n esbuild-loader: "4.4.3" # if webpack hits esbuild-loader@3.x useSourceMap crash\n\nallowBuilds:\n \'@swc/core\': true\n esbuild: true\n nx: true\n # \u2026set true for each package that must run postinstall scripts\n'})}),"\n",(0,l.jsxs)(n.p,{children:["Reference: ",(0,l.jsx)(n.code,{children:"pui-microfe/pnpm-workspace.yaml"}),", ",(0,l.jsx)(n.code,{children:"pui-mono-repo-boilerplate/pnpm-workspace.yaml"}),"."]}),"\n",(0,l.jsxs)(n.p,{children:["Move any ",(0,l.jsx)(n.code,{children:"package.json"})," ",(0,l.jsx)(n.code,{children:'"pnpm": { "overrides": \u2026 }'})," block into this file and delete the ",(0,l.jsx)(n.code,{children:"pnpm"})," key from ",(0,l.jsx)(n.code,{children:"package.json"}),"."]}),"\n",(0,l.jsx)(n.h4,{id:"reinstall-and-verify",children:"Reinstall and verify"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"rm -rf node_modules libs/*/node_modules # monorepos; apps/libs only if present\nSKIP_POST_INSTALL_BUILD=1 pnpm install --no-frozen-lockfile\n"})}),"\n",(0,l.jsx)(n.p,{children:"Check hoisting took effect:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'# Should list patterns (shamefullyHoist => ["*"]) \u2014 not []\ngrep publicHoistPattern node_modules/.modules.yaml\n\n# Webpack / pui-cli alias targets should exist at repo root\nls node_modules/esbuild-loader node_modules/styled-components 2>/dev/null\npnpm run build\n'})}),"\n",(0,l.jsx)(n.h4,{id:"common-failures",children:"Common failures"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Symptom"}),(0,l.jsx)(n.th,{children:"Fix"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"Can't resolve 'esbuild-loader'"})," during ",(0,l.jsx)(n.code,{children:"pui-cli pack"})," / webpack"]}),(0,l.jsxs)(n.td,{children:["Add ",(0,l.jsx)(n.code,{children:"shamefullyHoist: true"})," to ",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"}),"; clean reinstall"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"Can't resolve '@elliemae/pui-theme'"})," or ",(0,l.jsx)(n.code,{children:"styled-components"})]}),(0,l.jsxs)(n.td,{children:["Same \u2014 hoisting must be in workspace yaml, not ",(0,l.jsx)(n.code,{children:".npmrc"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"husky: command not found"})," on ",(0,l.jsx)(n.code,{children:"pnpm prepare"})]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"shamefullyHoist"})," + optional ",(0,l.jsx)(n.code,{children:"publicHoistPattern: [husky]"}),"; or keep ",(0,l.jsx)(n.code,{children:"husky"})," as a direct root ",(0,l.jsx)(n.code,{children:"devDependency"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"ERR_PNPM_IGNORED_BUILDS"})}),(0,l.jsxs)(n.td,{children:["Replace placeholder ",(0,l.jsx)(n.code,{children:"allowBuilds"})," values with ",(0,l.jsx)(n.code,{children:"true"})," or run ",(0,l.jsx)(n.code,{children:"pnpm approve-builds"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"publicHoistPattern: []"})," in ",(0,l.jsx)(n.code,{children:".modules.yaml"})]}),(0,l.jsxs)(n.td,{children:["Hoist settings still in ",(0,l.jsx)(n.code,{children:".npmrc"})," only \u2014 migrate to ",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"})]})]})]})]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Long-term platform fix:"})," pui-cli should resolve webpack loaders from its own install path and make ",(0,l.jsx)(n.code,{children:"getAlias()"})," fall back beyond root ",(0,l.jsx)(n.code,{children:"node_modules"}),". Until then, hoisting in ",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"})," is required for pnpm 11 consumers."]}),"\n",(0,l.jsx)(n.h3,{id:"2-upgrade-pui-cli",children:"2. Upgrade pui-cli"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm add -D @elliemae/pui-cli@9\n"})}),"\n",(0,l.jsx)(n.h3,{id:"3-add-flat-eslint-config",children:"3. Add flat ESLint config"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"React app or library:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-js",children:"// eslint.config.mjs\nimport { eslintFlatConfig } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatConfig;\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Node / TS service:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-js",children:"// eslint.config.mjs\nimport { eslintFlatBaseConfig } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatBaseConfig;\n"})}),"\n",(0,l.jsx)(n.p,{children:"Remove:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:".eslintrc.cjs"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:".eslintignore"})}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"4-update-stylelint-config",children:"4. Update Stylelint config"}),"\n",(0,l.jsxs)(n.p,{children:["pui-cli 9 ships ",(0,l.jsx)(n.strong,{children:"Stylelint 17"})," with ",(0,l.jsx)(n.code,{children:"stylelint-config-recommended@18"})," and ",(0,l.jsx)(n.code,{children:"postcss-styled-syntax"}),". The unmaintained ",(0,l.jsx)(n.code,{children:"stylelint-config-styled-components"})," package is removed; its rules are inlined in the shared config."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Minimal (CJS \u2014 still supported):"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"// stylelint.config.cjs\nconst { stylelintConfig } = require('@elliemae/pui-cli');\nmodule.exports = stylelintConfig;\n"})}),"\n",(0,l.jsxs)(n.p,{children:["If your repo previously filtered out ",(0,l.jsx)(n.code,{children:"stylelint-config-styled-components"})," from ",(0,l.jsx)(n.code,{children:"extends"}),", delete that workaround \u2014 the base config no longer extends it."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Recommended (ESM):"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"// stylelint.config.mjs\nimport { stylelintConfig } from '@elliemae/pui-cli/stylelint';\n\nexport default stylelintConfig;\n"})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"pui-cli lint"})," prefers ",(0,l.jsx)(n.code,{children:"stylelint.config.mjs"})," when present, otherwise falls back to ",(0,l.jsx)(n.code,{children:"stylelint.config.cjs"}),"."]}),"\n",(0,l.jsxs)(n.p,{children:["See ",(0,l.jsx)(n.a,{href:"/cli/stylelint-migration",children:"Stylelint migration guide"})," for version and rule changes."]}),"\n",(0,l.jsx)(n.h3,{id:"5-fix-lint",children:"5. Fix lint"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec pui-cli lint --fix\npnpm exec pui-cli lint\npnpm exec pui-cli tscheck --files\npnpm test\npnpm run build\n"})}),"\n",(0,l.jsx)(n.h3,{id:"6-install-the-migration-skill-optional",children:"6. Install the migration skill (optional)"}),"\n",(0,l.jsx)(n.p,{children:"Gives Cursor, Claude Code, and GitHub Copilot agents a step-by-step playbook in the repo:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec pui-cli skills list\npnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Skills are copied to ",(0,l.jsx)(n.code,{children:".cursor/skills/"}),", ",(0,l.jsx)(n.code,{children:".claude/skills/"}),", and ",(0,l.jsx)(n.code,{children:".github/skills/"})," (commit them if you want the whole team to share the same agent guidance)."]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"temporary-overrides",children:"Temporary overrides"}),"\n",(0,l.jsxs)(n.p,{children:["Large repos may have pre-existing ",(0,l.jsx)(n.code,{children:"any"})," usage. Legacy ESLint reported these as ",(0,l.jsx)(n.strong,{children:"warnings"}),"; flat config defaults them to ",(0,l.jsx)(n.strong,{children:"error"}),"."]}),"\n",(0,l.jsx)(n.p,{children:"Short-term override (remove in a follow-up):"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-js",children:"import { eslintFlatConfig } from '@elliemae/pui-cli/eslint';\n\nexport default [\n ...eslintFlatConfig,\n {\n rules: {\n '@typescript-eslint/no-explicit-any': 'warn',\n },\n },\n];\n"})}),"\n",(0,l.jsx)(n.p,{children:"Libraries with heavy decorator/micro-frontend typings may need additional one-off overrides \u2014 keep them minimal and tracked."}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"strict-config-after-cleanup",children:"Strict config (after cleanup)"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-js",children:"import { eslintFlatConfigStrict } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatConfigStrict;\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Strict mode elevates ",(0,l.jsx)(n.code,{children:"no-unsafe-*"})," and ",(0,l.jsx)(n.code,{children:"exhaustive-deps"})," to error."]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"husky-9",children:"Husky 9"}),"\n",(0,l.jsx)(n.p,{children:"If your repo uses Husky 8 hooks from pui-cli boilerplate:"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Upgrade: ",(0,l.jsx)(n.code,{children:"pnpm add -D husky@9"})]}),"\n",(0,l.jsxs)(n.li,{children:["Update ",(0,l.jsx)(n.code,{children:"package.json"}),":","\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-diff",children:'- "prepare": "[ -n \\"$CI\\" ] || husky install"\n+ "prepare": "[ -n \\"$CI\\" ] || husky"\n'})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["Remove the shebang and ",(0,l.jsx)(n.code,{children:"husky.sh"})," source from each hook in ",(0,l.jsx)(n.code,{children:".husky/"}),":","\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-diff",children:'- #!/bin/sh\n- . "$(dirname "$0")/_/husky.sh"\n\npnpm -s dlx lint-staged\n'})}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["Delete ",(0,l.jsx)(n.code,{children:".husky/.gitignore"})," if present (v9 regenerates ",(0,l.jsx)(n.code,{children:".husky/_"})," on install)."]}),"\n",(0,l.jsxs)(n.li,{children:["Remove ",(0,l.jsx)(n.code,{children:"husky-init"})," from devDependencies (use ",(0,l.jsx)(n.code,{children:"pnpm exec husky init"})," for new projects)."]}),"\n",(0,l.jsxs)(n.li,{children:["Run ",(0,l.jsx)(n.code,{children:"pnpm prepare"})," and verify with a test commit."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Environment variable changes:"})," ",(0,l.jsx)(n.code,{children:"HUSKY_SKIP_HOOKS"})," / ",(0,l.jsx)(n.code,{children:"HUSKY_SKIP_INSTALL"})," \u2192 ",(0,l.jsx)(n.code,{children:"HUSKY=0"}),"; ",(0,l.jsx)(n.code,{children:"HUSKY_GIT_PARAMS"})," \u2192 use ",(0,l.jsx)(n.code,{children:"$1"})," in hook scripts."]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsxs)(n.h2,{id:"jest-pui-cli-test",children:["Jest (",(0,l.jsx)(n.code,{children:"pui-cli test"}),")"]}),"\n",(0,l.jsxs)(n.p,{children:["pui-cli's default ",(0,l.jsx)(n.code,{children:"jestConfig"})," runs ",(0,l.jsx)(n.code,{children:"lib/testing/setup-textencoder.cjs"})," before other ",(0,l.jsx)(n.code,{children:"setupFiles"}),". It polyfills ",(0,l.jsx)(n.code,{children:"TextEncoder"})," / ",(0,l.jsx)(n.code,{children:"TextDecoder"})," on ",(0,l.jsx)(n.code,{children:"globalThis"})," from ",(0,l.jsx)(n.code,{children:"node:util"})," so ",(0,l.jsx)(n.strong,{children:"jsdom"})," tests can import packages (for example ",(0,l.jsx)(n.code,{children:"@elliemae/pui-diagnostics"})," HTTP transport) that expect those APIs at module load time."]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsxs)(n.strong,{children:["Repos do not need a local ",(0,l.jsx)(n.code,{children:"jest-textencoder-setup.cjs"}),"."]})," Delete it if you added one during migration."]}),"\n",(0,l.jsxs)(n.p,{children:["Typical ",(0,l.jsx)(n.code,{children:"jest.config.cjs"})," when testing against the real diagnostics package (not the pui-cli mock):"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"const { jestConfig } = require('@elliemae/pui-cli');\n\ndelete jestConfig.moduleNameMapper['@elliemae/pui-diagnostics'];\n\nmodule.exports = jestConfig;\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Do ",(0,l.jsx)(n.strong,{children:"not"})," replace ",(0,l.jsx)(n.code,{children:"setupFiles"})," unless you must prepend repo-specific setup; spread the defaults instead:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"jestConfig.setupFiles = [\n path.resolve(__dirname, './my-extra-setup.cjs'),\n ...(jestConfig.setupFiles || []),\n];\n"})}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"vitest-4",children:"Vitest 4"}),"\n",(0,l.jsxs)(n.p,{children:["Skip this section if the repo uses Jest (",(0,l.jsx)(n.code,{children:"pui-cli test"}),") only. ",(0,l.jsx)(n.strong,{children:"pui-cli 9 still builds apps and libraries with Webpack"}),"; Vite is used by Vitest (and optional ",(0,l.jsx)(n.code,{children:"pui-cli buildCDN"}),"), not for production bundling."]}),"\n",(0,l.jsxs)(n.p,{children:["After bumping ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli@9"}),", align local test dependencies with the versions pui-cli ships:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm add -D vitest@4 @vitest/coverage-v8@4 vite@8 @vitejs/plugin-react@6 vite-tsconfig-paths@6\npnpm remove @vitest/coverage-c8 @types/uuid # if present; uuid 14+ includes types\n"})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Extend the shared config"})," (recommended):"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-typescript",children:"// vitest.config.ts\nimport { defineConfig, mergeConfig } from 'vitest/config';\nimport { vitestConfig } from '@elliemae/pui-cli/vitest';\n\nexport default mergeConfig(vitestConfig, defineConfig({\n test: {\n // repo-specific overrides\n },\n}));\n"})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsxs)(n.strong,{children:["If you spread ",(0,l.jsx)(n.code,{children:"vitestConfig"})," manually"]}),", update any Vitest 1.x options:"]}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"pui-cli 8 / Vitest 1"}),(0,l.jsx)(n.th,{children:"pui-cli 9 / Vitest 4"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"test.deps.optimizer.web"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"test.deps.optimizer.client"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"@vitest/coverage-c8"})}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"@vitest/coverage-v8"})," (coverage provider ",(0,l.jsx)(n.code,{children:"v8"}),")"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"import { PluginOption } from 'vite'"})}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"import type { PluginOption } from 'vite'"})," (Vite 8)"]})]})]})]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"TypeScript:"})," exported ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli/app.tsconfig.json"})," and ",(0,l.jsx)(n.code,{children:"library.tsconfig.json"})," use ",(0,l.jsx)(n.code,{children:'moduleResolution: "bundler"'}),". If your ",(0,l.jsx)(n.code,{children:"tsconfig.json"})," extends them, reinstall pui-cli and re-run ",(0,l.jsx)(n.code,{children:"tscheck"}),". Custom tsconfigs that import ",(0,l.jsx)(n.code,{children:"vitest/config"})," or ",(0,l.jsx)(n.code,{children:"vite"})," may need the same setting."]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Vitest config import:"})," use ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli/vitest"})," (not the package root). pui-cli 9 publishes ",(0,l.jsx)(n.code,{children:"types"})," on each ",(0,l.jsx)(n.code,{children:"package.json"})," ",(0,l.jsx)(n.code,{children:"exports"})," entry so ",(0,l.jsx)(n.code,{children:"tsc"})," resolves declarations under ",(0,l.jsx)(n.code,{children:'moduleResolution: "bundler"'})," \u2014 no ",(0,l.jsx)(n.code,{children:"tsconfig"})," ",(0,l.jsx)(n.code,{children:"paths"})," workaround."]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec pui-cli vitest --passWithNoTests\npnpm exec pui-cli tscheck --files\n"})}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"semantic-release-25",children:"semantic-release 25"}),"\n",(0,l.jsxs)(n.p,{children:["pui-cli 9 ships ",(0,l.jsx)(n.strong,{children:"semantic-release 25"})," with an ESM shareable config at ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli/releaseConfig"}),". semantic-release 22+ loads ESM ",(0,l.jsx)(n.code,{children:"extends"})," targets via dynamic ",(0,l.jsx)(n.code,{children:"import()"})," \u2014 the old ",(0,l.jsx)(n.code,{children:"release.config.cjs"})," + ",(0,l.jsx)(n.code,{children:"require()"})," path no longer works for the shared config."]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsxs)(n.strong,{children:["Libraries that run ",(0,l.jsx)(n.code,{children:"semantic-release"})," in CI"]})," should migrate in the same PR as the pui-cli 9 bump (or immediately after)."]}),"\n",(0,l.jsx)(n.h3,{id:"1-upgrade-semantic-release-if-pinned-locally",children:"1. Upgrade semantic-release (if pinned locally)"}),"\n",(0,l.jsxs)(n.p,{children:["Most PUI libraries inherit semantic-release from ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli"}),". If your ",(0,l.jsx)(n.code,{children:"package.json"})," pins ",(0,l.jsx)(n.code,{children:"semantic-release"})," or ",(0,l.jsx)(n.code,{children:"@semantic-release/*"})," plugins directly, align with pui-cli 9:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm add -D semantic-release@25 @semantic-release/changelog@6 @semantic-release/exec@7 @semantic-release/git@10\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Remove explicit pins if the repo only uses ",(0,l.jsx)(n.code,{children:"pnpm release"})," and relies on pui-cli's dependency tree."]}),"\n",(0,l.jsx)(n.h3,{id:"2-migrate-release-config-to-esm",children:"2. Migrate release config to ESM"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Before:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"// release.config.cjs\nmodule.exports = {\n extends: '@elliemae/pui-cli/releaseConfig',\n};\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"After:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"// release.config.mjs\n/** @type {import('semantic-release').GlobalConfig} */\nexport default {\n extends: '@elliemae/pui-cli/releaseConfig',\n};\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Delete ",(0,l.jsx)(n.code,{children:"release.config.cjs"})," after adding ",(0,l.jsx)(n.code,{children:"release.config.mjs"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"3-custom-plugins-or-overrides",children:"3. Custom plugins or overrides"}),"\n",(0,l.jsxs)(n.p,{children:["Keep repo-specific plugins as relative paths from the config file. ESM plugins use ",(0,l.jsx)(n.code,{children:"export default"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"// release.config.mjs\nexport default {\n extends: '@elliemae/pui-cli/releaseConfig',\n plugins: [\n '@semantic-release/commit-analyzer',\n // ...other plugins from the shared config if replacing extends entirely\n './my-custom-plugin.mjs',\n ],\n};\n"})}),"\n",(0,l.jsxs)(n.p,{children:["CJS plugins (",(0,l.jsx)(n.code,{children:".cjs"}),") still work when referenced by path."]}),"\n",(0,l.jsx)(n.h3,{id:"4-verify-locally",children:"4. Verify locally"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec semantic-release --dry-run\n"})}),"\n",(0,l.jsx)(n.h3,{id:"agent-assisted-migration",children:"Agent-assisted migration"}),"\n",(0,l.jsx)(n.p,{children:"Install the pui-cli 9 skill so Cursor / Copilot agents follow the full config migration playbook (ESLint, Stylelint, Vitest, Husky, and semantic-release):"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all\n"})}),"\n",(0,l.jsx)(n.p,{children:"Then ask the agent to migrate configuration files for pui-cli 9."}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"lerna-9-and-nx-22-monorepos-only",children:"Lerna 9 and Nx 22 (monorepos only)"}),"\n",(0,l.jsxs)(n.p,{children:["Skip this section for single-package apps and libraries. PUI monorepos (for example ",(0,l.jsx)(n.code,{children:"pui-microfe"}),", ",(0,l.jsx)(n.code,{children:"pui-websocket"}),", ",(0,l.jsx)(n.code,{children:"pui-mono-repo-boilerplate"}),") use ",(0,l.jsx)(n.strong,{children:"Nx"})," for task orchestration and ",(0,l.jsx)(n.strong,{children:"Lerna"})," (via ",(0,l.jsx)(n.code,{children:"pui-cli version"}),") for independent package versioning."]}),"\n",(0,l.jsxs)(n.p,{children:["pui-cli 9 ships ",(0,l.jsx)(n.strong,{children:"lerna 9"})," and ",(0,l.jsx)(n.strong,{children:"nx 22"})," (",(0,l.jsx)(n.code,{children:"nx"})," + ",(0,l.jsx)(n.code,{children:"@nx/workspace"}),"). After bumping ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli@9"}),", reinstall so the workspace picks up the new CLIs:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm install\npnpm exec nx --version # expect 22.x\npnpm exec lerna --version # expect 9.x\n"})}),"\n",(0,l.jsx)(n.h3,{id:"1-remove-legacy-nx-package-pins",children:"1. Remove legacy Nx package pins"}),"\n",(0,l.jsxs)(n.p,{children:["Most monorepos inherit Nx and Lerna from pui-cli and do ",(0,l.jsx)(n.strong,{children:"not"})," pin them locally. If your root ",(0,l.jsx)(n.code,{children:"package.json"})," still lists ",(0,l.jsx)(n.code,{children:"@nrwl/cli"}),", ",(0,l.jsx)(n.code,{children:"@nrwl/tao"}),", or ",(0,l.jsx)(n.code,{children:"@nrwl/workspace"}),", remove those entries and any direct ",(0,l.jsx)(n.code,{children:"lerna"})," / ",(0,l.jsx)(n.code,{children:"nx"})," pins \u2014 pui-cli 9 provides them."]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm remove @nrwl/cli @nrwl/tao @nrwl/workspace lerna nx # only if explicitly pinned\npnpm install\n"})}),"\n",(0,l.jsxs)(n.h3,{id:"2-migrate-nxjson",children:["2. Migrate ",(0,l.jsx)(n.code,{children:"nx.json"})]}),"\n",(0,l.jsxs)(n.p,{children:["Nx 15 configs use deprecated ",(0,l.jsx)(n.code,{children:"@nrwl/workspace"})," presets, ",(0,l.jsx)(n.code,{children:"tasksRunnerOptions"}),", and ",(0,l.jsx)(n.code,{children:"targetDependencies"}),". Nx 22 uses ",(0,l.jsx)(n.code,{children:"nx/presets/npm.json"})," (or ",(0,l.jsx)(n.code,{children:"@nx/workspace/presets/npm.json"}),") and ",(0,l.jsx)(n.code,{children:"targetDefaults.dependsOn"}),"."]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Before (pui-cli 8 / Nx 15):"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "extends": "@nrwl/workspace/presets/npm.json",\n "tasksRunnerOptions": {\n "default": {\n "runner": "@nrwl/workspace/tasks-runners/default",\n "options": {\n "cacheableOperations": ["build", "test", "lint"]\n }\n }\n },\n "targetDependencies": {\n "build": [{ "target": "build", "projects": "dependencies" }],\n "test": [{ "target": "build", "projects": "dependencies" }]\n }\n}\n'})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"After (pui-cli 9 / Nx 22):"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "$schema": "./node_modules/nx/schemas/nx-schema.json",\n "extends": "nx/presets/npm.json",\n "targetDefaults": {\n "build": {\n "dependsOn": ["^build"],\n "cache": true\n },\n "test": {\n "dependsOn": ["^build"],\n "cache": true\n },\n "dts": {\n "dependsOn": ["^dts"],\n "cache": true\n },\n "lint": {\n "dependsOn": ["^dts"],\n "cache": true\n },\n "dev": {\n "dependsOn": ["^dev"],\n "cache": true\n },\n "storybook:start": {\n "dependsOn": ["^build"],\n "cache": true\n },\n "storybook:build": {\n "dependsOn": ["^build"],\n "cache": true\n },\n "prepare": {\n "dependsOn": ["^prepare"],\n "cache": true\n },\n "package": {\n "dependsOn": ["^package"],\n "cache": true\n },\n "postinstall": {\n "cache": true\n },\n "compile:scss": {\n "cache": true\n }\n }\n}\n'})}),"\n",(0,l.jsxs)(n.p,{children:["Map each legacy ",(0,l.jsx)(n.code,{children:"targetDependencies"})," entry to ",(0,l.jsx)(n.code,{children:'"dependsOn": ["^<target>"]'})," on the same target name. Targets that were only listed under ",(0,l.jsx)(n.code,{children:"cacheableOperations"})," get ",(0,l.jsx)(n.code,{children:'"cache": true'})," in ",(0,l.jsx)(n.code,{children:"targetDefaults"}),"."]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Automated migration (optional):"})," from the monorepo root after installing pui-cli 9:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec nx migrate latest\npnpm exec nx migrate --run-migrations\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Review the generated migrations; they may simplify ",(0,l.jsx)(n.code,{children:"nx.json"})," further. Commit the result with your pui-cli 9 bump."]}),"\n",(0,l.jsx)(n.h3,{id:"3-lerna-9-notes",children:"3. Lerna 9 notes"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Removed commands:"})," ",(0,l.jsx)(n.code,{children:"lerna bootstrap"}),", ",(0,l.jsx)(n.code,{children:"lerna add"}),", and ",(0,l.jsx)(n.code,{children:"lerna link"})," are gone. Use pnpm workspaces (",(0,l.jsx)(n.code,{children:"pnpm add <pkg> --filter <lib>"}),") for linking and dependency management."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsxs)(n.strong,{children:[(0,l.jsx)(n.code,{children:"lerna.json"}),":"]})," existing PUI repos can keep ",(0,l.jsx)(n.code,{children:'npmClient: "pnpm"'})," and ",(0,l.jsx)(n.code,{children:"useWorkspaces: true"}),". No change required unless you relied on removed commands."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsxs)(n.strong,{children:[(0,l.jsx)(n.code,{children:"pui-cli version"}),":"]})," unchanged \u2014 still wraps ",(0,l.jsx)(n.code,{children:"lerna version --conventional-commits --exact --create-release github --force-publish --yes"}),"."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Dry-run override:"})," ",(0,l.jsx)(n.code,{children:"semantic-version:dryrun:override"})," scripts that call ",(0,l.jsx)(n.code,{children:"lerna version"})," directly continue to work with lerna 9."]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"4-verify-monorepo-workflows",children:"4. Verify monorepo workflows"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec nx run-many --target=build --all --parallel\npnpm exec nx affected --target=test --uncommitted\npnpm exec pui-cli lint\npnpm exec pui-cli version --help # confirms pui-cli can invoke lerna 9\n"})}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"storybook-10-pui-cli-9",children:"Storybook 10 (pui-cli 9)"}),"\n",(0,l.jsxs)(n.p,{children:["Applies to repos that run ",(0,l.jsx)(n.code,{children:"pui-cli storybook"}),". Upgrade ",(0,l.jsx)(n.strong,{children:"pui-cli 9"})," and ",(0,l.jsx)(n.strong,{children:"pui-app-sdk"})," together \u2014 shared Storybook config lives in pui-app-sdk."]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Agent skill:"})," install the bundled playbook for CJS \u2192 ESM migration:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec pui-cli skills install migrate-storybook-out-of-cjs --target all\n"})}),"\n",(0,l.jsx)(n.h3,{id:"what-changed",children:"What changed"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Topic"}),(0,l.jsx)(n.th,{children:"Before (Storybook 6)"}),(0,l.jsx)(n.th,{children:"After (Storybook 10)"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"CLI"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"start-storybook"})," / ",(0,l.jsx)(n.code,{children:"build-storybook"})]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"storybook dev"})," / ",(0,l.jsx)(n.code,{children:"storybook build"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Config format"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:".storybook/main.js"})," (CJS)"]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:".storybook/main.mjs"})," (ESM, required)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Shared config import"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"@elliemae/pui-app-sdk/storybook/cjs/main"})," (removed)"]}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"@elliemae/pui-app-sdk/storybook/main"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Framework"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"@storybook/react"})," + ",(0,l.jsx)(n.code,{children:"core.builder: webpack5"})]}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"@storybook/react-webpack5"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Default port"}),(0,l.jsx)(n.td,{children:"11000 (pui-cli)"}),(0,l.jsx)(n.td,{children:"11000 (unchanged)"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Story globs"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"../lib"})," only (webpack)"]}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"../lib"})," and ",(0,l.jsx)(n.code,{children:"../app"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"API middleware"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:".storybook/middleware.js"})}),(0,l.jsxs)(n.td,{children:["Built into pui-cli ",(0,l.jsx)(n.code,{children:"webpackFinal"})," dev server"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Removed addons"}),(0,l.jsx)(n.td,{children:"\u2014"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"addon-essentials"}),", ",(0,l.jsx)(n.code,{children:"addon-interactions"}),", ",(0,l.jsx)(n.code,{children:"addon-links"})," (moved into Storybook core in v9+), ",(0,l.jsx)(n.code,{children:"addon-events"}),", ",(0,l.jsx)(n.code,{children:"addon-storysource"}),", ",(0,l.jsx)(n.code,{children:"storybook-addon-turbo-build"}),", ",(0,l.jsx)(n.code,{children:"storybook-react-router"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"JS compiler"}),(0,l.jsx)(n.td,{children:"SWC (default in some setups)"}),(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"@storybook/addon-webpack5-compiler-babel"})," (bundled in pui-cli; resolves via pui-app-sdk)"]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Lib-only packages"}),(0,l.jsx)(n.td,{children:"N/A"}),(0,l.jsxs)(n.td,{children:["Story globs skip ",(0,l.jsx)(n.code,{children:"../app/**"})," when no ",(0,l.jsx)(n.code,{children:"app/"})," directory exists"]})]})]})]}),"\n",(0,l.jsx)(n.h3,{id:"consumer-migration",children:"Consumer migration"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Bump ",(0,l.jsx)(n.code,{children:"@elliemae/pui-cli@9"})," and ",(0,l.jsx)(n.code,{children:"@elliemae/pui-app-sdk@*"})," (same release train)."]}),"\n",(0,l.jsxs)(n.li,{children:["Rename ",(0,l.jsx)(n.code,{children:".storybook/main.js"})," \u2192 ",(0,l.jsx)(n.code,{children:".storybook/main.mjs"}),":"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-javascript",children:"import { getStorybookConfig } from '@elliemae/pui-app-sdk/storybook/main';\n\nexport default getStorybookConfig();\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"3",children:["\n",(0,l.jsxs)(n.li,{children:["Convert other ",(0,l.jsx)(n.code,{children:".storybook/*.js"})," wrappers to ",(0,l.jsx)(n.code,{children:".mjs"})," where they use ",(0,l.jsx)(n.code,{children:"import"}),"/",(0,l.jsx)(n.code,{children:"export"})," (e.g. ",(0,l.jsx)(n.code,{children:"preview.mjs"}),", ",(0,l.jsx)(n.code,{children:"manager.js"})," can stay if ESM)."]}),"\n",(0,l.jsxs)(n.li,{children:["Delete ",(0,l.jsx)(n.code,{children:".storybook/middleware.js"})," \u2014 mock API routes are registered by pui-cli during ",(0,l.jsx)(n.code,{children:"storybook dev"}),". Legacy middleware is still exported as ",(0,l.jsx)(n.code,{children:"@elliemae/pui-app-sdk/storybook/middleware"})," (deprecated) for repos not yet on pui-cli 9 Storybook."]}),"\n",(0,l.jsxs)(n.li,{children:["Update story imports to CSF3 / ",(0,l.jsx)(n.code,{children:"@storybook/react-webpack5"})," as needed (CSF2 may still work for simple stories)."]}),"\n",(0,l.jsx)(n.li,{children:"Remove Storybook 6 webpack alias workarounds (MDX pinning, react-select hacks) unless a specific component still fails after upgrade."}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"verify",children:"Verify"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pnpm exec pui-cli storybook # dev on port 11000\npnpm exec pui-cli storybook -b # static build to demo/\npnpm exec pui-cli storybook -b --docs # docs build\npnpm exec pui-cli lint # stories + .storybook/\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Pilot reference: ",(0,l.jsx)(n.code,{children:"pui-mono-repo-boilerplate/libs/foo"}),", ",(0,l.jsx)(n.code,{children:"pui-react-boilerplate"}),"."]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"ci-checklist",children:"CI checklist"}),"\n",(0,l.jsxs)(n.ul,{className:"contains-task-list",children:["\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Node 24 in pipeline"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ","pnpm 11 in pipeline"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ",(0,l.jsx)(n.code,{children:"shamefullyHoist"})," (and related settings) in ",(0,l.jsx)(n.code,{children:"pnpm-workspace.yaml"}),", not ",(0,l.jsx)(n.code,{children:".npmrc"})]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ",(0,l.jsx)(n.code,{children:"pnpm run build"})," after clean install (webpack resolves hoisted deps)"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ",(0,l.jsx)(n.code,{children:"pui-cli lint"})," (0 errors)"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ",(0,l.jsx)(n.code,{children:"pui-cli tscheck --files"})]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Unit tests"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Production build"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ","lint-staged / husky hooks pass locally"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ",(0,l.jsx)(n.code,{children:"semantic-release --dry-run"})," (libraries that publish to npm)"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ",(0,l.jsx)(n.code,{children:"nx run-many --target=build --all"})," (monorepos)"]}),"\n",(0,l.jsxs)(n.li,{className:"task-list-item",children:[(0,l.jsx)(n.input,{type:"checkbox",disabled:!0})," ",(0,l.jsx)(n.code,{children:"pui-cli version --help"})," or dry-run versioning (monorepos that publish packages)"]}),"\n"]}),"\n",(0,l.jsx)(n.hr,{}),"\n",(0,l.jsx)(n.h2,{id:"getting-help",children:"Getting help"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Rule changes:"})," ",(0,l.jsx)(n.a,{href:"/cli/eslint-rules-migration",children:"eslint-rules-migration.md"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Stylelint changes:"})," ",(0,l.jsx)(n.a,{href:"/cli/stylelint-migration",children:"stylelint-migration.md"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Commands:"})," ",(0,l.jsx)(n.a,{href:"/cli/usage-guide",children:"usage guide"})]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.strong,{children:"Platform team:"})," ",(0,l.jsx)(n.code,{children:"#pui-platform"})," or your team's platform-ui channel"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(a,{...e})}):a(e)}},6607(e,n,s){s.d(n,{R:()=>c,x:()=>d});var i=s(758);const l={},r=i.createContext(l);function c(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:c(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);