@woodsportal/hubspot-kit 1.0.4 → 1.0.26

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 (217) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +4 -2
  3. package/dist/{chunk-JDGIAYHX.js → chunk-GTTIJVAR.js} +43 -3
  4. package/dist/chunk-GTTIJVAR.js.map +1 -0
  5. package/dist/cli.js +1400 -338
  6. package/dist/cli.js.map +1 -1
  7. package/dist/exec-U2OJATR3.js +12 -0
  8. package/dist/index.d.ts +20 -0
  9. package/dist/index.js +8 -1
  10. package/dist/index.js.map +1 -1
  11. package/examples/greenfield/module-hybrid-cdn/README.md +40 -3
  12. package/examples/greenfield/module-hybrid-cdn/public/fields.json +44 -1
  13. package/examples/greenfield/module-hybrid-cdn/src/app.tsx +8 -0
  14. package/examples/greenfield/module-hybrid-cdn/src/assets/css/main.dev.css +6 -1
  15. package/examples/greenfield/module-hybrid-cdn/src/cdn/app-entry.ts +32 -0
  16. package/examples/greenfield/module-hybrid-cdn/src/cdn/vendor-entry.ts +28 -0
  17. package/examples/greenfield/module-hybrid-cdn/src/components/layout/section-card.tsx +20 -0
  18. package/examples/greenfield/module-hybrid-cdn/src/components/layout/starter-nav.tsx +28 -0
  19. package/examples/greenfield/module-hybrid-cdn/src/components/layout/starter-shell.tsx +18 -0
  20. package/examples/greenfield/module-hybrid-cdn/src/config/router.ts +4 -0
  21. package/examples/greenfield/module-hybrid-cdn/src/config/routes.ts +5 -0
  22. package/examples/greenfield/module-hybrid-cdn/src/defaultData.ts +2 -7
  23. package/examples/greenfield/module-hybrid-cdn/src/features/starter/components/starter-guide-page.tsx +93 -0
  24. package/examples/greenfield/module-hybrid-cdn/src/features/starter/components/starter-home-page.tsx +21 -0
  25. package/examples/greenfield/module-hybrid-cdn/src/features/starter/components/starter-home.tsx +52 -0
  26. package/examples/greenfield/module-hybrid-cdn/src/features/starter/components/starter-single-page.tsx +17 -0
  27. package/examples/greenfield/module-hybrid-cdn/src/features/starter/content/woodscli-guide-content.ts +86 -0
  28. package/examples/greenfield/module-hybrid-cdn/src/features/starter/hooks/use-starter-preview.ts +47 -0
  29. package/examples/greenfield/module-hybrid-cdn/src/features/starter/index.ts +6 -0
  30. package/examples/greenfield/module-hybrid-cdn/src/hubspot/bootstrap.ts +10 -0
  31. package/examples/greenfield/module-hybrid-cdn/src/hubspot/default-data.ts +7 -0
  32. package/examples/greenfield/module-hybrid-cdn/src/integrations/tanstack-router/router.tsx +25 -0
  33. package/examples/greenfield/module-hybrid-cdn/src/main.tsx +4 -3
  34. package/examples/greenfield/module-hybrid-cdn/src/portal/mount-dev-preview.tsx +8 -0
  35. package/examples/greenfield/module-hybrid-cdn/src/portal/mount-portal.tsx +12 -0
  36. package/examples/greenfield/module-hybrid-cdn/src/routeTree.gen.ts +77 -0
  37. package/examples/greenfield/module-hybrid-cdn/src/routes/__root.tsx +15 -0
  38. package/examples/greenfield/module-hybrid-cdn/src/routes/guide.tsx +7 -0
  39. package/examples/greenfield/module-hybrid-cdn/src/routes/index.tsx +7 -0
  40. package/examples/greenfield/module-hybrid-cdn/tsconfig.json +20 -0
  41. package/examples/greenfield/module-monolith/public/fields.json +44 -1
  42. package/examples/greenfield/module-monolith/src/app.tsx +8 -0
  43. package/examples/greenfield/module-monolith/src/assets/css/main.dev.css +8 -0
  44. package/examples/greenfield/module-monolith/src/components/layout/section-card.tsx +20 -0
  45. package/examples/greenfield/module-monolith/src/components/layout/starter-nav.tsx +28 -0
  46. package/examples/greenfield/module-monolith/src/components/layout/starter-shell.tsx +18 -0
  47. package/examples/greenfield/module-monolith/src/config/router.ts +4 -0
  48. package/examples/greenfield/module-monolith/src/config/routes.ts +5 -0
  49. package/examples/greenfield/module-monolith/src/defaultData.ts +2 -7
  50. package/examples/greenfield/module-monolith/src/features/starter/components/starter-guide-page.tsx +93 -0
  51. package/examples/greenfield/module-monolith/src/features/starter/components/starter-home-page.tsx +21 -0
  52. package/examples/greenfield/module-monolith/src/features/starter/components/starter-home.tsx +52 -0
  53. package/examples/greenfield/module-monolith/src/features/starter/components/starter-single-page.tsx +17 -0
  54. package/examples/greenfield/module-monolith/src/features/starter/content/woodscli-guide-content.ts +86 -0
  55. package/examples/greenfield/module-monolith/src/features/starter/hooks/use-starter-preview.ts +47 -0
  56. package/examples/greenfield/module-monolith/src/features/starter/index.ts +6 -0
  57. package/examples/greenfield/module-monolith/src/hubspot/default-data.ts +7 -0
  58. package/examples/greenfield/module-monolith/src/hubspot/types.ts +17 -0
  59. package/examples/greenfield/module-monolith/src/integrations/tanstack-router/router.tsx +25 -0
  60. package/examples/greenfield/module-monolith/src/main.tsx +5 -0
  61. package/examples/greenfield/module-monolith/src/portal/mount-dev-preview.tsx +8 -0
  62. package/examples/greenfield/module-monolith/src/portal/mount-portal.tsx +12 -0
  63. package/examples/greenfield/module-monolith/src/routeTree.gen.ts +77 -0
  64. package/examples/greenfield/module-monolith/src/routes/__root.tsx +15 -0
  65. package/examples/greenfield/module-monolith/src/routes/guide.tsx +7 -0
  66. package/examples/greenfield/module-monolith/src/routes/index.tsx +7 -0
  67. package/examples/greenfield/module-monolith/tsconfig.json +20 -0
  68. package/package.json +4 -1
  69. package/scripts/check-hubspot-bundle-size.mjs +5 -2
  70. package/scripts/ensure-wphs-workspace.mjs +2 -1
  71. package/scripts/hubspot-module-postbuild.mjs +1 -1
  72. package/scripts/read-woodsportal-config.mjs +4 -1
  73. package/scripts/run-hubspot-module-postbuild.mjs +9 -4
  74. package/scripts/vite/bootstrap-shim-resolver.js +47 -0
  75. package/scripts/vite/ensure-dev-kit-shims.js +7 -1
  76. package/scripts/vite/react-dev-plugin-options.js +2 -1
  77. package/scripts/watch-hubspot.mjs +107 -17
  78. package/scripts/wphs-paths.mjs +1 -0
  79. package/scripts/write-audit-artifacts.mjs +2 -1
  80. package/src/dev/bootstrap-greenfield.tsx +59 -0
  81. package/src/dev/bootstrap.tsx +46 -0
  82. package/src/dev-module-config/__tests__/fixtures/fields.json +3014 -0
  83. package/src/dev-module-config/__tests__/fixtures/golden-module.fixture.ts +102 -0
  84. package/src/dev-module-config/__tests__/module-config-storage.test.ts +40 -0
  85. package/src/dev-module-config/__tests__/module-config-transform.test.ts +55 -0
  86. package/src/dev-module-config/__tests__/normalize-repeater-items.test.ts +46 -0
  87. package/src/dev-module-config/dev-module-display-name.ts +5 -0
  88. package/src/dev-module-config/runtime/module-config-bridge.ts +27 -0
  89. package/src/dev-module-config/runtime/module-config-runtime.ts +185 -0
  90. package/src/dev-module-config/schema/build-default-item.ts +7 -0
  91. package/src/dev-module-config/schema/deep-merge.ts +27 -0
  92. package/src/dev-module-config/schema/extract-defaults.ts +62 -0
  93. package/src/dev-module-config/schema/normalize-choices.ts +18 -0
  94. package/src/dev-module-config/schema/normalize-repeater-items.ts +31 -0
  95. package/src/dev-module-config/schema/parse-fields-json.ts +2 -0
  96. package/src/dev-module-config/schema/types.ts +75 -0
  97. package/src/dev-module-config/schema/validate-module-config.ts +81 -0
  98. package/src/dev-module-config/schema/visibility.ts +130 -0
  99. package/src/dev-module-config/storage/config-json.ts +46 -0
  100. package/src/dev-module-config/storage/workspace-store.ts +139 -0
  101. package/src/dev-module-config/transform/build-hubspot-data.ts +409 -0
  102. package/src/dev-module-config/ui/FieldRenderer.tsx +353 -0
  103. package/src/dev-module-config/ui/ModuleConfigAnimatedPresence.tsx +72 -0
  104. package/src/dev-module-config/ui/ModuleConfigCollapsible.tsx +43 -0
  105. package/src/dev-module-config/ui/ModuleConfigDockSideIcon.tsx +27 -0
  106. package/src/dev-module-config/ui/ModuleConfigOverlay.tsx +134 -0
  107. package/src/dev-module-config/ui/ModuleConfigPersistenceStatus.tsx +89 -0
  108. package/src/dev-module-config/ui/ModuleConfigShell.tsx +355 -0
  109. package/src/dev-module-config/ui/ModuleConfigThemeToggle.tsx +32 -0
  110. package/src/dev-module-config/ui/ModuleConfigUiContext.tsx +65 -0
  111. package/src/dev-module-config/ui/editors/DeveloperOptionsEditor.tsx +61 -0
  112. package/src/dev-module-config/ui/editors/MenuOptionsEditor.tsx +103 -0
  113. package/src/dev-module-config/ui/hubspot/HsColorField.tsx +106 -0
  114. package/src/dev-module-config/ui/hubspot/HsColorPickerPopover.tsx +210 -0
  115. package/src/dev-module-config/ui/hubspot/HsFieldLabel.tsx +24 -0
  116. package/src/dev-module-config/ui/hubspot/HsFieldWidgets.tsx +248 -0
  117. package/src/dev-module-config/ui/hubspot/HsImageField.tsx +112 -0
  118. package/src/dev-module-config/ui/hubspot/HsOccurrenceGroupEditor.tsx +243 -0
  119. package/src/dev-module-config/ui/hubspot/HsRepeaterList.tsx +178 -0
  120. package/src/dev-module-config/ui/hubspot/HsSectionHeader.tsx +20 -0
  121. package/src/dev-module-config/ui/hubspot/HsToggle.tsx +39 -0
  122. package/src/dev-module-config/ui/hubspot/HsToggleRow.tsx +30 -0
  123. package/src/dev-module-config/ui/hubspot/hs-color-palette.ts +11 -0
  124. package/src/dev-module-config/ui/hubspot/module-config-typography.ts +26 -0
  125. package/src/dev-module-config/ui/module-config-motion.css +134 -0
  126. package/src/dev-module-config/ui/module-config-motion.ts +28 -0
  127. package/src/dev-module-config/ui/module-config-overlay-side.ts +29 -0
  128. package/src/dev-module-config/ui/module-config-surfaces.ts +27 -0
  129. package/src/dev-module-config/ui/module-config-theme.css +489 -0
  130. package/src/dev-module-config/ui/module-config-toolbar-theme.ts +35 -0
  131. package/src/dev-module-config/ui/navigation/ModuleConfigNavContext.tsx +194 -0
  132. package/src/dev-module-config/ui/use-dev-module-config-live-revision.ts +22 -0
  133. package/src/dev-module-config/ui/use-hubspot-live-exports.ts +27 -0
  134. package/src/dev-module-config/ui/use-module-config.ts +124 -0
  135. package/src/routing/build-api-routes.ts +37 -0
  136. package/src/routing/route-format.ts +19 -0
  137. package/templates/module-hybrid-cdn/README.md +53 -3
  138. package/templates/module-hybrid-cdn/index.html +12 -1
  139. package/templates/module-hybrid-cdn/package.json +6 -2
  140. package/templates/module-hybrid-cdn/public/fields.json +44 -1
  141. package/templates/module-hybrid-cdn/src/app.tsx +8 -0
  142. package/templates/module-hybrid-cdn/src/assets/css/main.dev.css +6 -1
  143. package/templates/module-hybrid-cdn/src/cdn/app-entry.ts +32 -0
  144. package/templates/module-hybrid-cdn/src/cdn/vendor-entry.ts +28 -0
  145. package/templates/module-hybrid-cdn/src/components/layout/section-card.tsx +20 -0
  146. package/templates/module-hybrid-cdn/src/components/layout/starter-nav.tsx +28 -0
  147. package/templates/module-hybrid-cdn/src/components/layout/starter-shell.tsx +18 -0
  148. package/templates/module-hybrid-cdn/src/config/router.ts +4 -0
  149. package/templates/module-hybrid-cdn/src/config/routes.ts +5 -0
  150. package/templates/module-hybrid-cdn/src/defaultData.ts +2 -7
  151. package/templates/module-hybrid-cdn/src/features/starter/components/starter-guide-page.tsx +93 -0
  152. package/templates/module-hybrid-cdn/src/features/starter/components/starter-home-page.tsx +21 -0
  153. package/templates/module-hybrid-cdn/src/features/starter/components/starter-home.tsx +52 -0
  154. package/templates/module-hybrid-cdn/src/features/starter/components/starter-single-page.tsx +17 -0
  155. package/templates/module-hybrid-cdn/src/features/starter/content/woodscli-guide-content.ts +86 -0
  156. package/templates/module-hybrid-cdn/src/features/starter/hooks/starter-preview-values.ts +42 -0
  157. package/templates/module-hybrid-cdn/src/features/starter/hooks/use-starter-preview.dev.ts +17 -0
  158. package/templates/module-hybrid-cdn/src/features/starter/hooks/use-starter-preview.ts +30 -0
  159. package/templates/module-hybrid-cdn/src/features/starter/index.ts +6 -0
  160. package/templates/module-hybrid-cdn/src/hubspot/bootstrap.ts +10 -0
  161. package/templates/module-hybrid-cdn/src/hubspot/default-data.ts +7 -0
  162. package/templates/module-hybrid-cdn/src/hubspot/module-entry.tsx +9 -0
  163. package/templates/module-hybrid-cdn/src/integrations/tanstack-router/router.tsx +25 -0
  164. package/templates/module-hybrid-cdn/src/main.tsx +4 -3
  165. package/templates/module-hybrid-cdn/src/portal/mount-dev-preview.tsx +8 -0
  166. package/templates/module-hybrid-cdn/src/portal/mount-portal.tsx +12 -0
  167. package/templates/module-hybrid-cdn/src/routeTree.gen.ts +77 -0
  168. package/templates/module-hybrid-cdn/src/routes/__root.tsx +15 -0
  169. package/templates/module-hybrid-cdn/src/routes/guide.tsx +7 -0
  170. package/templates/module-hybrid-cdn/src/routes/index.tsx +7 -0
  171. package/templates/module-hybrid-cdn/tsconfig.json +20 -0
  172. package/templates/module-hybrid-cdn/vite.config.monolith.mjs +8 -0
  173. package/templates/module-monolith/README.md +59 -0
  174. package/templates/module-monolith/index.html +12 -0
  175. package/templates/module-monolith/package.json +10 -3
  176. package/templates/module-monolith/public/fields.json +44 -1
  177. package/templates/module-monolith/public/module.html +1 -0
  178. package/templates/module-monolith/src/app.tsx +8 -0
  179. package/templates/module-monolith/src/assets/css/main.dev.css +6 -1
  180. package/templates/module-monolith/src/components/layout/section-card.tsx +20 -0
  181. package/templates/module-monolith/src/components/layout/starter-nav.tsx +28 -0
  182. package/templates/module-monolith/src/components/layout/starter-shell.tsx +18 -0
  183. package/templates/module-monolith/src/config/router.ts +4 -0
  184. package/templates/module-monolith/src/config/routes.ts +5 -0
  185. package/templates/module-monolith/src/defaultData.ts +2 -7
  186. package/templates/module-monolith/src/features/starter/components/starter-guide-page.tsx +93 -0
  187. package/templates/module-monolith/src/features/starter/components/starter-home-page.tsx +21 -0
  188. package/templates/module-monolith/src/features/starter/components/starter-home.tsx +52 -0
  189. package/templates/module-monolith/src/features/starter/components/starter-single-page.tsx +17 -0
  190. package/templates/module-monolith/src/features/starter/content/woodscli-guide-content.ts +86 -0
  191. package/templates/module-monolith/src/features/starter/hooks/starter-preview-values.ts +42 -0
  192. package/templates/module-monolith/src/features/starter/hooks/use-starter-preview.dev.ts +17 -0
  193. package/templates/module-monolith/src/features/starter/hooks/use-starter-preview.ts +30 -0
  194. package/templates/module-monolith/src/features/starter/index.ts +6 -0
  195. package/templates/module-monolith/src/hubspot/default-data.ts +7 -0
  196. package/templates/module-monolith/src/hubspot/module-entry.tsx +9 -0
  197. package/templates/module-monolith/src/integrations/tanstack-router/router.tsx +25 -0
  198. package/templates/module-monolith/src/main.tsx +4 -3
  199. package/templates/module-monolith/src/portal/mount-dev-preview.tsx +8 -0
  200. package/templates/module-monolith/src/portal/mount-portal.tsx +12 -0
  201. package/templates/module-monolith/src/routeTree.gen.ts +77 -0
  202. package/templates/module-monolith/src/routes/__root.tsx +15 -0
  203. package/templates/module-monolith/src/routes/guide.tsx +7 -0
  204. package/templates/module-monolith/src/routes/index.tsx +7 -0
  205. package/templates/module-monolith/tsconfig.json +20 -0
  206. package/templates/module-monolith/vite.config.monolith.mjs +8 -0
  207. package/templates/module-monolith/woodscli.json +1 -0
  208. package/templates/shared/.env.dev.example +5 -0
  209. package/templates/shared/.env.prod.example +5 -0
  210. package/templates/shared/.env.stg.example +3 -0
  211. package/templates/shared/portal.cdn.json.example +8 -0
  212. package/templates/theme-starter/package.json +5 -2
  213. package/vite/vite.config.dev.mjs +9 -1
  214. package/vite/vite.config.monolith.mjs +22 -17
  215. package/dist/chunk-JDGIAYHX.js.map +0 -1
  216. package/dist/exec-K5C6LZP4.js +0 -10
  217. /package/dist/{exec-K5C6LZP4.js.map → exec-U2OJATR3.js.map} +0 -0
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/program.ts","../src/lib/config.ts","../src/lib/config-files.ts","../src/schema/woodsportal-hs.ts","../src/lib/paths.ts","../src/lib/logger.ts","../src/lib/wphs-baseline.ts","../src/cli/commands/doctor.ts","../src/lib/hubspot-cli-setup.ts","../src/cli/commands/config-validate.ts","../src/cli/commands/build.ts","../src/cli/commands/dev.ts","../src/vite/resolve-dev-config.ts","../src/cli/commands/deploy.ts","../src/cli/commands/publish.ts","../src/cli/commands/upload.ts","../src/cli/commands/audit.ts","../src/cli/commands/init.ts","../src/lib/template-dev-deps.ts","../src/lib/project-name.ts","../src/cli/commands/adopt.ts","../src/cli/commands/migrate.ts","../src/cli/commands/examples.ts","../src/cli/commands/fields.ts","../src/cli/commands/regression.ts","../src/cli/commands/watch.ts","../src/cli/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Command } from 'commander'\n\nimport { loadConfig } from '../lib/config.js'\nimport { createLogger } from '../lib/logger.js'\nimport { findProjectRoot, getKitRoot } from '../lib/paths.js'\nimport { defaultBaselineDir } from '../lib/wphs-baseline.js'\nimport { isWpHsError, ExitCode } from '../lib/errors.js'\nimport type { GlobalCliOptions, CommandContext } from './context.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { runConfigValidate } from './commands/config-validate.js'\nimport { runBuild } from './commands/build.js'\nimport { runDev } from './commands/dev.js'\nimport { runDeploy } from './commands/deploy.js'\nimport { runPublish } from './commands/publish.js'\nimport {\n runAuditBaselineCapture,\n runAuditParity,\n runAuditSecrets,\n runAuditShipBundle,\n} from './commands/audit.js'\nimport { runInit } from './commands/init.js'\nimport { runAdopt } from './commands/adopt.js'\nimport { runMigrate } from './commands/migrate.js'\nimport { runExamplesList, runExamplesSmoke } from './commands/examples.js'\nimport { runFieldsSync } from './commands/fields.js'\nimport { runRegressionSmoke } from './commands/regression.js'\nimport { runUpload } from './commands/upload.js'\nimport { runWatch } from './commands/watch.js'\nimport { DEFAULT_WOODSPORTAL_HS } from '../schema/woodsportal-hs.js'\n\ntype InitTemplate = 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\ntype BuildTier = 'dev' | 'stg' | 'prod'\n\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(resolve(getKitRoot(), 'package.json'), 'utf8')) as {\n version?: string\n }\n return pkg.version ?? '0.0.0'\n } catch {\n return '0.0.0'\n }\n}\n\nfunction parseTier(value: string): BuildTier {\n if (value === 'dev' || value === 'stg' || value === 'prod') return value\n return 'prod'\n}\n\nfunction buildContext(global: GlobalCliOptions): CommandContext {\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n\n const projectRoot = global.project ?? findProjectRoot()\n const { config } = loadConfig(projectRoot)\n\n return { projectRoot, config, logger, global }\n}\n\nfunction attachGlobals(command: Command): void {\n command\n .option('--project <path>', 'Project root (woodscli.json)')\n .option('--ci', 'Non-interactive CI mode', false)\n .option('--json', 'Machine-readable JSON output', false)\n .option('--verbose', 'Verbose logging', false)\n .option('--quiet', 'Errors only', false)\n .option('--dry-run', 'Print planned actions without executing', false)\n .option('-y, --yes', 'Assume yes (non-interactive)', false)\n}\n\nasync function handle(fn: () => Promise<number>): Promise<void> {\n try {\n const code = await fn()\n process.exit(code)\n } catch (error) {\n if (isWpHsError(error)) {\n process.stderr.write(`Error: ${error.message}\\n`)\n if (error.remediation) {\n process.stderr.write(`→ ${error.remediation}\\n`)\n }\n process.exit(error.exitCode)\n }\n process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(ExitCode.INTERNAL)\n }\n}\n\nexport function createProgram(): Command {\n const program = new Command()\n .name('wp')\n .description('WoodsCLI — HubSpot CMS dev kit by WoodsPortal (modules + themes)')\n .version(readVersion())\n .addHelpText('after', '\\nWoodsCLI · WoodsPortal HubSpot CLI · npm @woodsportal/hubspot-kit')\n\n attachGlobals(program)\n\n program\n .command('doctor')\n .description('Check prerequisites (Node, HubSpot CLI, .wphs workspace, config)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDoctor(buildContext(global)))\n })\n\n const configCmd = program.command('config').description('Project configuration')\n\n configCmd\n .command('validate')\n .description('Validate woodscli.json')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runConfigValidate(buildContext(global)))\n })\n\n program\n .command('init')\n .description('Scaffold a new module or theme project')\n .option('-t, --template <type>', 'module-hybrid-cdn | module-monolith | theme-starter')\n .option('-n, --name <slug>', 'Project name (creates ./<name>/ under cwd)')\n .option('-d, --directory <path>', 'Full target directory (skips name → folder prompt)')\n .action(async (opts: { template?: string; name?: string; directory?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n const ctx: CommandContext = {\n projectRoot: process.cwd(),\n config: DEFAULT_WOODSPORTAL_HS,\n logger,\n global,\n }\n await handle(() =>\n runInit(ctx, {\n template: opts.template as InitTemplate | undefined,\n name: opts.name,\n directory: opts.directory,\n }),\n )\n })\n\n program\n .command('adopt')\n .description('Detect existing module/theme repo and add WoodsCLI config + .wphs/')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAdopt(buildContext(global)))\n })\n\n program\n .command('migrate')\n .description('Migrate legacy .dev/ or .wp-hs-baseline/ to .wphs/')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runMigrate(buildContext(global)))\n })\n\n program\n .command('dev')\n .alias('local')\n .description('Start local development server (Vite HMR + CMS dev tool)')\n .option('-p, --port <port>', 'Port', '3000')\n .action(async (opts: { port: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDev(buildContext(global), { port: Number(opts.port) }))\n })\n\n program\n .command('build')\n .description('Build CDN + HubSpot module (or theme no-op)')\n .option('--tier <tier>', 'dev | stg | prod', 'prod')\n .option('--cdn-only', 'CDN chunks only')\n .option('--hubspot-only', 'HubSpot module only')\n .option('--cdn-esm', 'Build CDN via ESM preset')\n .action(\n async (opts: {\n tier: string\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runBuild(buildContext(global), {\n tier: parseTier(opts.tier),\n cdnOnly: opts.cdnOnly,\n hubspotOnly: opts.hubspotOnly,\n cdnEsm: opts.cdnEsm,\n }),\n )\n },\n )\n\n program\n .command('deploy')\n .description('Build, publish CDN, upload HubSpot module')\n .option('--tier <tier>', 'dev | stg | prod', 'prod')\n .option('--skip-publish', 'Skip CDN publish')\n .action(async (opts: { tier: string; skipPublish?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runDeploy(buildContext(global), {\n tier: parseTier(opts.tier),\n skipPublish: opts.skipPublish,\n }),\n )\n })\n\n program\n .command('publish')\n .description('Publish CDN artifacts to jsDelivr mirror')\n .option('--tier <tier>', 'dev | stg | prod', 'prod')\n .option('--dry-run', 'Print publish plan without pushing')\n .action(async (opts: { tier: string; dryRun?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runPublish(buildContext(global), {\n tier: parseTier(opts.tier),\n dryRun: opts.dryRun,\n }),\n )\n })\n\n const audit = program.command('audit').description('Build audits')\n\n audit\n .command('ship-bundle')\n .description('Fail if dev tooling appears in dist artifacts')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditShipBundle(buildContext(global)))\n })\n\n audit\n .command('parity')\n .description('Compare dist output to baseline snapshot')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditParity(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('baseline')\n .description('Capture dist output as parity baseline')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditBaselineCapture(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('secrets')\n .description('Scan source for hardcoded secrets / PAT patterns')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditSecrets(buildContext(global)))\n })\n\n const fields = program.command('fields').description('Module fields.json utilities')\n\n fields\n .command('sync')\n .description('Pull/push fields.json vs local cache')\n .option('--direction <dir>', 'pull | push', 'pull')\n .action(async (opts: { direction: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const direction = opts.direction === 'push' ? 'push' : 'pull'\n await handle(() => runFieldsSync(buildContext(global), { direction }))\n })\n\n const examples = program.command('examples').description('Examples smoke matrix')\n\n examples\n .command('list')\n .description('List scenarios from examples/manifest.json')\n .option('--track <track>', 'module | theme')\n .option('--setup <setup>', 'greenfield | existing | adopted')\n .action(async (opts: { track?: string; setup?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runExamplesList(buildContext(global), {\n track: opts.track as 'module' | 'theme' | undefined,\n setup: opts.setup as 'greenfield' | 'existing' | 'adopted' | undefined,\n }),\n )\n })\n\n examples\n .command('smoke')\n .description('Run static/live smoke checks for example scenarios')\n .option('--scenario <id>', 'Single scenario id')\n .option('--tier <tier>', 'static | live', 'static')\n .action(async (opts: { scenario?: string; tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = opts.tier === 'live' ? 'live' : 'static'\n await handle(() =>\n runExamplesSmoke(buildContext(global), { scenario: opts.scenario, tier }),\n )\n })\n\n const regression = program.command('regression').description('Compatibility regression checks')\n\n regression\n .command('smoke')\n .description('Doctor + config validate + consumer boundary checks')\n .option('--skip-doctor', 'Skip prerequisite doctor check')\n .action(async (opts: { skipDoctor?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runRegressionSmoke(buildContext(global), { skipDoctor: opts.skipDoctor }),\n )\n })\n\n program\n .command('watch')\n .description('Watch HubSpot module or theme folder and re-upload on change')\n .option('--tier <tier>', 'dev | stg | prod', 'dev')\n .option('--rebuild', 'Rebuild module before watch')\n .action(async (opts: { tier: string; rebuild?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = parseTier(opts.tier)\n await handle(() =>\n runWatch(buildContext(global), {\n tier: tier === 'prod' ? 'prod' : tier === 'stg' ? 'stg' : 'dev',\n rebuild: opts.rebuild,\n }),\n )\n })\n\n program\n .command('upload')\n .description('Upload built HubSpot module or theme (hs cms upload)')\n .option('--tier <tier>', 'dev | stg | prod', 'prod')\n .action(async (opts: { tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runUpload(buildContext(global), { tier: parseTier(opts.tier) }),\n )\n })\n\n program\n .command('auth')\n .description('Authenticate HubSpot CLI (hs auth)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const { runCommand } = await import('../lib/exec.js')\n runCommand('hs', ['auth'], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n process.exit(ExitCode.SUCCESS)\n })\n\n return program\n}\n","import { readFileSync } from 'node:fs'\n\nimport {\n resolveProjectConfig,\n WOODSCLI_CONFIG_FILE,\n} from './config-files.js'\nimport { WoodsPortalHsSchema, type WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WpHsError, ExitCode } from './errors.js'\nimport { findProjectRoot } from './paths.js'\n\nexport type LoadedProjectConfig = {\n root: string\n config: WoodsPortalHsConfig\n configPath: string\n configFileName: string\n}\n\nexport function loadConfig(projectRoot?: string): LoadedProjectConfig {\n const root = projectRoot ?? findProjectRoot()\n const resolved = resolveProjectConfig(root)\n\n if (!resolved) {\n throw new WpHsError(`Missing ${WOODSCLI_CONFIG_FILE}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init or wp adopt. Legacy woodsportal.hs.json → run wp migrate --yes.',\n })\n }\n\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(resolved.path, 'utf8'))\n } catch (cause) {\n throw new WpHsError(`Invalid JSON in ${resolved.fileName}`, {\n exitCode: ExitCode.USER_ERROR,\n cause,\n })\n }\n\n const parsed = WoodsPortalHsSchema.safeParse(raw)\n if (!parsed.success) {\n throw new WpHsError(`${resolved.fileName} validation failed: ${parsed.error.message}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp config validate for details.',\n })\n }\n\n return {\n root,\n config: parsed.data,\n configPath: resolved.path,\n configFileName: resolved.fileName,\n }\n}\n\nexport function validateConfigFile(projectRoot?: string): {\n valid: boolean\n errors: string[]\n config?: WoodsPortalHsConfig\n} {\n try {\n const { config } = loadConfig(projectRoot)\n return { valid: true, errors: [], config }\n } catch (error) {\n if (error instanceof WpHsError) {\n return { valid: false, errors: [error.message] }\n }\n return { valid: false, errors: [String(error)] }\n }\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** Canonical WoodsCLI project config — the only supported filename. */\nexport const WOODSCLI_CONFIG_FILE = 'woodscli.json'\n\n/** Removed in v1.0.2+ — detected only for migrate/doctor messaging. */\nexport const LEGACY_WOODSPORTAL_HS_FILE = 'woodsportal.hs.json'\n\nexport type ResolvedProjectConfig = {\n path: string\n fileName: typeof WOODSCLI_CONFIG_FILE\n}\n\nfunction envConfigPath(projectRoot: string): string | null {\n const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null\n if (!fromEnv) return null\n return resolve(projectRoot, fromEnv)\n}\n\nexport function legacyConfigPath(projectRoot: string): string {\n return resolve(projectRoot, LEGACY_WOODSPORTAL_HS_FILE)\n}\n\nexport function woodscliConfigPath(projectRoot: string): string {\n return resolve(projectRoot, WOODSCLI_CONFIG_FILE)\n}\n\n/** @returns null | 'legacy-only' | 'duplicate' */\nexport function legacyConfigConflict(projectRoot: string): 'legacy-only' | 'duplicate' | null {\n const hasWoodscli = existsSync(woodscliConfigPath(projectRoot))\n const hasLegacy = existsSync(legacyConfigPath(projectRoot))\n if (hasLegacy && hasWoodscli) return 'duplicate'\n if (hasLegacy && !hasWoodscli) return 'legacy-only'\n return null\n}\n\n/**\n * Resolve the active project config file (`woodscli.json` only).\n */\nexport function resolveProjectConfig(projectRoot: string): ResolvedProjectConfig | null {\n const envPath = envConfigPath(projectRoot)\n if (envPath) {\n if (!existsSync(envPath)) return null\n return { path: envPath, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n const path = woodscliConfigPath(projectRoot)\n if (existsSync(path)) {\n return { path, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n return null\n}\n\nexport function findProjectRoot(from = process.cwd()): string | null {\n if (process.env.WP_HS_PROJECT_ROOT?.trim()) {\n return resolve(process.env.WP_HS_PROJECT_ROOT.trim())\n }\n\n let dir = resolve(from)\n while (true) {\n if (resolveProjectConfig(dir)) {\n return dir\n }\n const parent = resolve(dir, '..')\n if (parent === dir) {\n return null\n }\n dir = parent\n }\n}\n","import { z } from 'zod'\n\nexport const CONFIG_VERSION = 1\n\nexport const WPHS_WORKSPACE_DIR = '.wphs' as const\n\nexport const WoodsPortalHsSchema = z.object({\n configVersion: z.number().int().default(CONFIG_VERSION),\n projectType: z.enum(['module-hybrid-cdn', 'module-monolith', 'theme-starter']),\n module: z.object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n outDir: z.string().default('dist/WoodsPortal.Module'),\n }),\n theme: z\n .object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n srcDir: z.string().default('src/theme'),\n themeJson: z.string().default('src/theme/theme.json'),\n })\n .optional(),\n cdn: z\n .object({\n mode: z.enum(['jsdelivr', 'custom', 'local', 'none']).default('jsdelivr'),\n buildIdFile: z.string().default('.portal-build-id'),\n mirror: z.string().default('portal.cdn.json'),\n })\n .default({}),\n entries: z\n .object({\n app: z.string().default('src/cdn/app-entry.ts'),\n vendor: z.string().default('src/cdn/vendor-entry.ts'),\n hubspotBootstrap: z.string().default('src/hubspot/bootstrap.ts'),\n localDev: z.string().default('src/main.tsx'),\n })\n .default({}),\n env: z\n .object({\n tiers: z.array(z.enum(['dev', 'stg', 'prod'])).default(['dev', 'stg', 'prod']),\n })\n .default({}),\n dev: z\n .object({\n moduleConfigDir: z.literal(WPHS_WORKSPACE_DIR).default(WPHS_WORKSPACE_DIR),\n adapter: z.string().default('./wphs.adapter.ts'),\n fieldsJson: z.string().default('public/fields.json'),\n themeFieldsJson: z.string().optional(),\n })\n .default({}),\n})\n\nexport type WoodsPortalHsConfig = z.infer<typeof WoodsPortalHsSchema>\n\nexport const DEFAULT_WOODSPORTAL_HS: WoodsPortalHsConfig = {\n configVersion: CONFIG_VERSION,\n projectType: 'module-hybrid-cdn',\n module: {\n name: 'woodsportal-module',\n uploadPath: 'dw-modules/woodsportal-module.module',\n outDir: 'dist/WoodsPortal.Module',\n },\n cdn: {\n mode: 'jsdelivr',\n buildIdFile: '.portal-build-id',\n mirror: 'portal.cdn.json',\n },\n entries: {\n app: 'src/cdn/app-entry.ts',\n vendor: 'src/cdn/vendor-entry.ts',\n hubspotBootstrap: 'src/hubspot/bootstrap.ts',\n localDev: 'src/main.tsx',\n },\n env: {\n tiers: ['dev', 'stg', 'prod'],\n },\n dev: {\n moduleConfigDir: WPHS_WORKSPACE_DIR,\n adapter: './wphs.adapter.ts',\n fieldsJson: 'public/fields.json',\n },\n}\n\nexport function isModuleProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' || config.projectType === 'module-monolith'\n}\n\nexport function isThemeProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'theme-starter'\n}\n\nexport function usesCdnPipeline(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' && config.cdn.mode !== 'none'\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { findProjectRoot as findConfigProjectRoot } from './config-files.js'\nimport { WpHsError, ExitCode } from './errors.js'\n\nconst KIT_PACKAGE_NAME = '@woodsportal/hubspot-kit'\n\nfunction resolveKitRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n while (true) {\n const pkgPath = resolve(dir, 'package.json')\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { name?: string }\n if (pkg.name === KIT_PACKAGE_NAME) {\n return dir\n }\n } catch {\n // keep walking\n }\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n\n throw new WpHsError('Could not resolve @woodsportal/hubspot-kit package root.', {\n exitCode: ExitCode.INTERNAL,\n })\n}\n\nconst kitRoot = resolveKitRoot()\n\nexport function getKitRoot(): string {\n return kitRoot\n}\n\nexport function findProjectRoot(from = process.cwd()): string {\n const root = findConfigProjectRoot(from)\n if (!root) {\n throw new WpHsError('Could not find woodscli.json in this directory or any parent.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init, wp adopt, or pass --project <path>. Legacy config: wp migrate --yes.',\n })\n }\n return root\n}\n\nexport function kitPath(...segments: string[]): string {\n return resolve(kitRoot, ...segments)\n}\n\nexport { resolveProjectConfig, WOODSCLI_CONFIG_FILE, LEGACY_WOODSPORTAL_HS_FILE } from './config-files.js'\n","import pc from 'picocolors'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport type LoggerOptions = {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n ci?: boolean\n}\n\nexport type Logger = {\n debug: (message: string, meta?: Record<string, unknown>) => void\n info: (message: string, meta?: Record<string, unknown>) => void\n warn: (message: string, meta?: Record<string, unknown>) => void\n error: (message: string, meta?: Record<string, unknown>) => void\n success: (message: string, meta?: Record<string, unknown>) => void\n json: (payload: Record<string, unknown>) => void\n}\n\nfunction shouldUseColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false\n if (process.env.CI === 'true') return false\n return process.stdout.isTTY === true\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const useColor = shouldUseColor()\n const { verbose = false, quiet = false, json = false } = options\n\n const emit = (level: LogLevel, message: string, meta?: Record<string, unknown>) => {\n if (json) return\n if (quiet && level !== 'error' && level !== 'warn') return\n if (level === 'debug' && !verbose) return\n\n const prefix =\n level === 'error'\n ? useColor\n ? pc.red('error')\n : 'error'\n : level === 'warn'\n ? useColor\n ? pc.yellow('warn')\n : 'warn'\n : level === 'debug'\n ? useColor\n ? pc.dim('debug')\n : 'debug'\n : useColor\n ? pc.cyan('info')\n : 'info'\n\n const line = meta ? `${message} ${JSON.stringify(meta)}` : message\n const stream = level === 'error' || level === 'warn' ? process.stderr : process.stdout\n stream.write(`[${prefix}] ${line}\\n`)\n }\n\n return {\n debug: (message, meta) => emit('debug', message, meta),\n info: (message, meta) => emit('info', message, meta),\n warn: (message, meta) => emit('warn', message, meta),\n error: (message, meta) => emit('error', message, meta),\n success: (message, meta) => {\n if (json) return\n if (quiet) return\n const prefix = useColor ? pc.green('ok') : 'ok'\n process.stdout.write(`[${prefix}] ${message}\\n`)\n if (meta) process.stdout.write(`${JSON.stringify(meta)}\\n`)\n },\n json: (payload) => {\n if (!json) return\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n },\n }\n}\n","import { resolve } from 'node:path'\n\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WPHS_WORKSPACE_DIR } from '../schema/woodsportal-hs.js'\n\n/** Default parity baseline directory under `.wphs/audit/baseline`. */\nexport function defaultBaselineDir(projectRoot: string, config: WoodsPortalHsConfig): string {\n const workspace = config.dev.moduleConfigDir ?? WPHS_WORKSPACE_DIR\n return resolve(projectRoot, workspace, 'audit', 'baseline')\n}\n","import { existsSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { loadConfig } from '../../lib/config.js'\nimport {\n legacyConfigConflict,\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { doctorHubSpotChecks } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { isThemeProject, usesCdnPipeline, WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DoctorCheck = {\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'error' | 'warn'\n}\n\nfunction checkNode(): DoctorCheck {\n const major = Number(process.versions.node.split('.')[0])\n const ok = major >= 20\n return {\n name: 'node',\n ok,\n message: ok ? `Node ${process.versions.node}` : `Node ${process.versions.node} (need >= 20)`,\n remediation: ok ? undefined : 'Install Node 20 LTS or newer.',\n severity: 'error',\n }\n}\n\nfunction checkLegacyConfig(projectRoot: string): DoctorCheck | null {\n const conflict = legacyConfigConflict(projectRoot)\n if (conflict === 'legacy-only') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Legacy ${LEGACY_WOODSPORTAL_HS_FILE} — ${WOODSCLI_CONFIG_FILE} is required`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n }\n }\n if (conflict === 'duplicate') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Both ${WOODSCLI_CONFIG_FILE} and ${LEGACY_WOODSPORTAL_HS_FILE} present`,\n remediation: 'Run wp migrate --yes to remove the legacy file',\n severity: 'error',\n }\n }\n return null\n}\n\nfunction checkConfig(ctx: CommandContext): DoctorCheck[] {\n const legacy = checkLegacyConfig(ctx.projectRoot)\n if (legacy) {\n return [legacy]\n }\n\n try {\n const loaded = loadConfig(ctx.projectRoot)\n return [\n {\n name: 'config',\n ok: true,\n message: `${loaded.configFileName} valid`,\n severity: 'error',\n },\n ]\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n name: 'config',\n ok: false,\n message,\n remediation: 'Run wp config validate',\n severity: 'error',\n },\n ]\n }\n}\n\nfunction checkEnvFiles(ctx: CommandContext): DoctorCheck[] {\n return ctx.config.env.tiers.map((tier) => {\n const file = tier === 'dev' ? '.env.dev' : tier === 'stg' ? '.env.stg' : '.env.prod'\n const path = resolve(ctx.projectRoot, file)\n const example = resolve(ctx.projectRoot, `${file}.example`)\n const ok = existsSync(path)\n return {\n name: `env-${tier}`,\n ok,\n message: ok ? `${file} present` : `${file} missing`,\n remediation: ok ? undefined : existsSync(example) ? `cp ${file}.example ${file}` : `Create ${file}`,\n severity: 'warn',\n }\n })\n}\n\nfunction checkBuildId(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n const file = resolve(ctx.projectRoot, ctx.config.cdn.buildIdFile)\n const ok = existsSync(file)\n return {\n name: 'build-id',\n ok,\n message: ok ? `${ctx.config.cdn.buildIdFile} present` : `${ctx.config.cdn.buildIdFile} missing`,\n remediation: ok ? undefined : `Create ${ctx.config.cdn.buildIdFile} with your release tag (e.g. v0.0.1-dev.1)`,\n severity: 'warn',\n }\n}\n\nfunction checkDevViteConfig(ctx: CommandContext): DoctorCheck {\n const path = resolve(ctx.projectRoot, 'vite.config.dev.mjs')\n const ok = existsSync(path)\n return {\n name: 'vite-dev-config',\n ok,\n message: ok ? 'vite.config.dev.mjs present' : 'vite.config.dev.mjs missing',\n remediation: ok\n ? undefined\n : 'Add vite.config.dev.mjs that re-exports @woodsportal/hubspot-kit/vite/vite.config.dev.mjs',\n severity: 'error',\n }\n}\n\nfunction checkKitScripts(): DoctorCheck {\n const script = kitPath('scripts', 'build-cdn.mjs')\n const ok = existsSync(script)\n return {\n name: 'kit-scripts',\n ok,\n message: ok ? '@woodsportal/hubspot-kit scripts installed' : 'Kit build scripts missing',\n remediation: ok ? undefined : 'Reinstall @woodsportal/hubspot-kit',\n severity: 'error',\n }\n}\n\nfunction checkWphsWorkspace(ctx: CommandContext): DoctorCheck[] {\n const workspace = ctx.config.dev.moduleConfigDir\n const checks: DoctorCheck[] = []\n\n for (const legacy of ['.dev', '.woodsportal']) {\n const legacyPath = resolve(ctx.projectRoot, legacy)\n if (existsSync(legacyPath)) {\n checks.push({\n name: `legacy-${legacy}`,\n ok: false,\n message: `Legacy workspace ${legacy}/ still present`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n }\n\n if (existsSync(resolve(ctx.projectRoot, '.wp-hs-baseline'))) {\n checks.push({\n name: 'legacy-baseline',\n ok: false,\n message: 'Legacy .wp-hs-baseline/ at repo root',\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n\n if (workspace !== WPHS_WORKSPACE_DIR) {\n checks.push({\n name: 'wphs-dir',\n ok: false,\n message: `dev.moduleConfigDir must be \"${WPHS_WORKSPACE_DIR}\" (got \"${workspace}\")`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n return checks\n }\n\n const wphsRoot = resolve(ctx.projectRoot, workspace)\n const required = ['config', 'assets/branding', 'fixtures', 'cache', 'audit/baseline', 'state']\n for (const sub of required) {\n const ok = existsSync(join(wphsRoot, sub))\n checks.push({\n name: `wphs-${sub.replace(/\\//g, '-')}`,\n ok,\n message: ok ? `.wphs/${sub}/ present` : `.wphs/${sub}/ missing`,\n remediation: ok ? undefined : 'Run wp doctor (auto-scaffolds) or wp init',\n severity: 'error',\n })\n }\n\n return checks\n}\n\nfunction checkAdapter(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n const adapterPath = resolve(ctx.projectRoot, ctx.config.dev.adapter)\n const ok = existsSync(adapterPath)\n return {\n name: 'wphs-adapter',\n ok,\n message: ok ? `${ctx.config.dev.adapter} present` : `${ctx.config.dev.adapter} missing`,\n remediation: ok ? undefined : 'Run wp adopt or create wphs.adapter.ts',\n severity: 'warn',\n }\n}\n\nfunction checkViteInstalled(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) && !existsSync(resolve(ctx.projectRoot, 'vite.config.dev.mjs'))) {\n return null\n }\n const localBin = resolve(ctx.projectRoot, 'node_modules', '.bin', 'vite')\n const ok = existsSync(localBin)\n return {\n name: 'vite',\n ok,\n message: ok ? 'vite installed' : 'vite not installed',\n remediation: ok\n ? undefined\n : 'Run yarn install or npm install (wp init scaffolds vite + peer deps in devDependencies)',\n severity: 'error',\n }\n}\n\nexport async function runDoctor(ctx: CommandContext): Promise<number> {\n if (!ctx.global.dryRun) {\n try {\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n } catch {\n // non-fatal before config validation\n }\n }\n\n const checks: DoctorCheck[] = [\n checkNode(),\n checkKitScripts(),\n checkDevViteConfig(ctx),\n checkViteInstalled(ctx),\n ...checkConfig(ctx),\n ...checkWphsWorkspace(ctx),\n checkAdapter(ctx),\n ...doctorHubSpotChecks(ctx.projectRoot),\n checkBuildId(ctx),\n ...checkEnvFiles(ctx),\n ].filter((c): c is DoctorCheck => c !== null)\n\n const failed = checks.filter((c) => !c.ok && (c.severity ?? 'error') === 'error')\n const warnings = checks.filter((c) => !c.ok && c.severity === 'warn')\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'doctor',\n ok: failed.length === 0,\n warnings: warnings.length,\n checks,\n })\n } else {\n for (const check of checks) {\n if (check.ok) {\n ctx.logger.success(check.message)\n } else if (check.severity === 'warn') {\n ctx.logger.warn(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n } else {\n ctx.logger.error(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n }\n }\n }\n\n if (failed.length > 0) {\n throw new WpHsError(`${failed.length} doctor check(s) failed`, {\n exitCode: ExitCode.PREREQUISITE,\n })\n }\n\n if (warnings.length > 0 && !ctx.global.quiet && !ctx.global.json) {\n ctx.logger.warn(\n `${warnings.length} optional check(s) — local dev may work; fix before wp upload / wp watch`,\n )\n }\n\n return ExitCode.SUCCESS\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { spawnSync } from 'node:child_process'\n\nimport type { CommandContext } from '../cli/context.js'\nimport { ExitCode, WpHsError } from './errors.js'\n\nexport const HUBSPOT_CONFIG_FILE = 'hubspot.config.yml'\nexport const HUBSPOT_CONFIG_EXAMPLE = 'hubspot.config.yml.example'\n\nconst PLACEHOLDER_PATTERNS = [\n /YOUR_PAT_HERE/i,\n /your-portal-id/i,\n /personalAccessKey:\\s*$/m,\n /portalId:\\s*12345678\\b/,\n]\n\nexport type HubSpotSetupAssessment = {\n configPath: string\n examplePath: string\n configPresent: boolean\n examplePresent: boolean\n looksLikePlaceholder: boolean\n hsCliInstalled: boolean\n hsCliVersion: string | null\n authenticated: boolean\n accountsHint: string | null\n}\n\nexport function assessHubSpotCliSetup(projectRoot: string): HubSpotSetupAssessment {\n const configPath = resolve(projectRoot, HUBSPOT_CONFIG_FILE)\n const examplePath = resolve(projectRoot, HUBSPOT_CONFIG_EXAMPLE)\n const configPresent = existsSync(configPath)\n const examplePresent = existsSync(examplePath)\n\n let looksLikePlaceholder = false\n if (configPresent) {\n const raw = readFileSync(configPath, 'utf8')\n looksLikePlaceholder = PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(raw))\n } else {\n looksLikePlaceholder = true\n }\n\n const hsVersion = spawnSync('hs', ['--version'], { encoding: 'utf8' })\n const hsCliInstalled = hsVersion.status === 0\n const hsCliVersion = hsCliInstalled ? (hsVersion.stdout || hsVersion.stderr || '').trim() : null\n\n let authenticated = false\n let accountsHint: string | null = null\n\n if (hsCliInstalled) {\n const accounts = spawnSync('hs', ['accounts', 'list'], {\n cwd: projectRoot,\n encoding: 'utf8',\n timeout: 15_000,\n })\n const output = `${accounts.stdout || ''}\\n${accounts.stderr || ''}`.trim()\n accountsHint = output || null\n authenticated =\n accounts.status === 0 &&\n /Account:|portalId|portal/i.test(output) &&\n !/No accounts/i.test(output)\n }\n\n return {\n configPath,\n examplePath,\n configPresent,\n examplePresent,\n looksLikePlaceholder,\n hsCliInstalled,\n hsCliVersion,\n authenticated,\n accountsHint,\n }\n}\n\nexport function hubSpotSetupRemediation(projectRoot: string): string[] {\n const assessment = assessHubSpotCliSetup(projectRoot)\n const steps: string[] = []\n\n if (!assessment.hsCliInstalled) {\n steps.push('Install HubSpot CLI: npm i -g @hubspot/cli')\n }\n\n if (!assessment.configPresent) {\n if (assessment.examplePresent) {\n steps.push(`Copy ${HUBSPOT_CONFIG_EXAMPLE} → ${HUBSPOT_CONFIG_FILE} and add your portal + PAT`)\n } else {\n steps.push(`Create ${HUBSPOT_CONFIG_FILE} (see docs/HUBSPOT-CLI-SETUP.md)`)\n }\n steps.push('Generate a PAT: https://app.hubspot.com/l/personal-access-key')\n } else if (assessment.looksLikePlaceholder) {\n steps.push(`Edit ${HUBSPOT_CONFIG_FILE} — replace placeholder portalId and personalAccessKey`)\n }\n\n if (assessment.configPresent && !assessment.looksLikePlaceholder && !assessment.authenticated) {\n steps.push('Run wp auth (or hs auth) and confirm with: hs accounts list')\n }\n\n return steps\n}\n\nexport type HubSpotSetupMode = 'local' | 'cms'\n\n/**\n * Warn (local dev) or require (upload/watch/deploy) HubSpot CLI project setup.\n */\nexport function ensureHubSpotCliSetup(ctx: CommandContext, mode: HubSpotSetupMode): void {\n if (ctx.global.dryRun || ctx.global.json) return\n\n const assessment = assessHubSpotCliSetup(ctx.projectRoot)\n const needsSetup =\n !assessment.hsCliInstalled ||\n !assessment.configPresent ||\n assessment.looksLikePlaceholder ||\n !assessment.authenticated\n\n if (!needsSetup) return\n\n const steps = hubSpotSetupRemediation(ctx.projectRoot)\n const headline =\n mode === 'local'\n ? 'HubSpot upload/watch is not configured for this project (local preview still works).'\n : 'HubSpot CLI is not ready for cms upload/watch in this project.'\n\n if (mode === 'local') {\n ctx.logger.warn(headline)\n for (const step of steps) {\n ctx.logger.info(` → ${step}`)\n }\n ctx.logger.info(' → Docs: @woodsportal/hubspot-kit/docs/HUBSPOT-CLI-SETUP.md')\n return\n }\n\n throw new WpHsError(headline, {\n exitCode: ExitCode.PREREQUISITE,\n remediation: steps.join('; '),\n })\n}\n\nexport function doctorHubSpotChecks(projectRoot: string): Array<{\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'warn' | 'error'\n}> {\n const assessment = assessHubSpotCliSetup(projectRoot)\n const steps = hubSpotSetupRemediation(projectRoot)\n const remediation = steps.length > 0 ? steps.join(' · ') : undefined\n\n return [\n {\n name: 'hubspot-cli',\n ok: assessment.hsCliInstalled,\n message: assessment.hsCliInstalled\n ? `HubSpot CLI ${assessment.hsCliVersion ?? ''}`.trim()\n : 'HubSpot CLI not installed',\n remediation: assessment.hsCliInstalled ? undefined : 'npm i -g @hubspot/cli',\n severity: 'error',\n },\n {\n name: 'hubspot-config',\n ok: assessment.configPresent && !assessment.looksLikePlaceholder,\n message: !assessment.configPresent\n ? `${HUBSPOT_CONFIG_FILE} missing (required for wp upload / wp watch)`\n : assessment.looksLikePlaceholder\n ? `${HUBSPOT_CONFIG_FILE} still has placeholder values`\n : `${HUBSPOT_CONFIG_FILE} present`,\n remediation,\n severity: 'warn',\n },\n {\n name: 'hubspot-auth',\n ok: assessment.authenticated,\n message: assessment.authenticated\n ? 'HubSpot CLI authenticated for this project'\n : 'HubSpot CLI not authenticated (or no portal in hubspot.config.yml)',\n remediation: assessment.authenticated ? undefined : 'wp auth · hs accounts list',\n severity: 'warn',\n },\n ]\n}\n","import { validateConfigFile } from '../../lib/config.js'\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport async function runConfigValidate(ctx: CommandContext): Promise<number> {\n const result = validateConfigFile(ctx.projectRoot)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'config validate',\n valid: result.valid,\n errors: result.errors,\n config: result.config,\n })\n } else if (result.valid) {\n ctx.logger.success(`${WOODSCLI_CONFIG_FILE} is valid`)\n } else {\n for (const err of result.errors) {\n ctx.logger.error(err)\n }\n }\n\n return result.valid ? ExitCode.SUCCESS : ExitCode.USER_ERROR\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { isThemeProject, usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type BuildTier = 'dev' | 'stg' | 'prod'\n\nexport type BuildOptions = {\n tier?: BuildTier\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n}\n\nfunction tierToStgFlag(tier: BuildTier): string[] {\n return tier === 'dev' || tier === 'stg' ? ['--stg'] : []\n}\n\nexport async function runBuild(ctx: CommandContext, options: BuildOptions): Promise<number> {\n const tier = options.tier ?? 'prod'\n const env = { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot }\n const isTheme = isThemeProject(ctx.config)\n const useCdn = usesCdnPipeline(ctx.config) && !isTheme\n\n const execOpts = {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n }\n\n const run = (script: string, args: string[] = []) => {\n runNodeScript(kitPath('scripts', script), args, execOpts)\n }\n\n try {\n if (isTheme && !options.cdnOnly) {\n ctx.logger.info('Theme project — skipping CDN/module.js build (use wp upload for theme assets)')\n if (ctx.global.json) {\n ctx.logger.json({ command: 'build', tier, ok: true, projectType: ctx.config.projectType })\n } else {\n ctx.logger.success('Theme build complete (no-op)')\n }\n return ExitCode.SUCCESS\n }\n\n if (ctx.config.projectType === 'module-monolith' && !options.cdnOnly) {\n ctx.logger.info(`Building monolith module (${tier})…`)\n run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.monolith.mjs'),\n ...tierToStgFlag(tier),\n ])\n run('run-hubspot-module-postbuild.mjs')\n } else {\n if (!options.hubspotOnly && useCdn) {\n ctx.logger.info(`Building CDN (${tier})…`)\n if (options.cdnEsm) {\n run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.cdn-esm.mjs'),\n ...tierToStgFlag(tier),\n ])\n } else {\n run('build-cdn.mjs', tierToStgFlag(tier))\n }\n run('generate-cdn-manifest.mjs')\n }\n\n if (!options.cdnOnly) {\n ctx.logger.info(`Building HubSpot module (${tier})…`)\n run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.hubspot.mjs'),\n ...tierToStgFlag(tier),\n ])\n run('run-hubspot-module-postbuild.mjs')\n }\n }\n\n if (!options.cdnOnly && !options.hubspotOnly) {\n run('check-hubspot-bundle-size.mjs')\n run('write-audit-artifacts.mjs')\n }\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'build',\n tier,\n ok: true,\n outDir: resolve(ctx.projectRoot, ctx.config.module.outDir),\n })\n } else {\n ctx.logger.success('Build complete')\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.BUILD_FAILED,\n })\n }\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { spawn } from 'node:child_process'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { resolveDevViteConfigPath, resolveProjectViteBin } from '../../vite/resolve-dev-config.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DevOptions = {\n port?: number\n}\n\nexport async function runDev(ctx: CommandContext, options: DevOptions): Promise<number> {\n ensureHubSpotCliSetup(ctx, 'local')\n\n const port = options.port ?? 3000\n const env = {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n }\n\n const configPath = resolveDevViteConfigPath(ctx.projectRoot)\n const viteBin = resolveProjectViteBin(ctx.projectRoot)\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] ${viteBin} --config ${configPath} --port ${port}`)\n return ExitCode.SUCCESS\n }\n\n if (viteBin === 'vite') {\n throw new WpHsError('vite is not installed in this project.', {\n exitCode: ExitCode.PREREQUISITE,\n remediation:\n 'Run yarn install or npm install. If this is an older wp init project, add vite and peers to devDependencies (run wp init again or see @woodsportal/hubspot-kit templates).',\n })\n }\n\n const consumerConfig = resolve(ctx.projectRoot, 'vite.config.dev.mjs')\n if (!existsSync(consumerConfig)) {\n throw new WpHsError('vite.config.dev.mjs is missing in the project root.', {\n exitCode: ExitCode.USER_ERROR,\n remediation:\n 'Add vite.config.dev.mjs (see @woodsportal/hubspot-kit templates/module-hybrid-cdn).',\n })\n }\n\n return new Promise((resolvePromise) => {\n const child = spawn(\n viteBin,\n ['--config', configPath, '--port', String(port), '--mode', 'dev'],\n {\n cwd: ctx.projectRoot,\n env,\n stdio: 'inherit',\n },\n )\n\n child.on('exit', (code) => {\n resolvePromise(code ?? ExitCode.USER_ERROR)\n })\n })\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { kitPath } from '../lib/paths.js'\n\nconst CONSUMER_DEV_CONFIG = 'vite.config.dev.mjs'\n\n/**\n * Vite resolves config dependencies from the config file's package context.\n * The preset must be re-exported from the consumer repo (vite.config.dev.mjs)\n * so `vite` and plugins resolve from the project's node_modules.\n */\nexport function resolveDevViteConfigPath(projectRoot: string): string {\n const consumerConfig = resolve(projectRoot, CONSUMER_DEV_CONFIG)\n if (existsSync(consumerConfig)) {\n return consumerConfig\n }\n return kitPath('vite', 'vite.config.dev.mjs')\n}\n\nexport function resolveProjectViteBin(projectRoot: string): string {\n const localBin = resolve(projectRoot, 'node_modules', '.bin', 'vite')\n if (existsSync(localBin)) {\n return localBin\n }\n return 'vite'\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { runBuild } from './build.js'\nimport { runPublish } from './publish.js'\nimport { runUpload } from './upload.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DeployOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n skipPublish?: boolean\n}\n\nexport async function runDeploy(ctx: CommandContext, options: DeployOptions): Promise<number> {\n ensureHubSpotCliSetup(ctx, 'cms')\n\n const tier = options.tier ?? 'prod'\n const env = { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot }\n const execOpts = {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n }\n\n await runBuild(ctx, { tier, cdnOnly: true })\n\n if (!options.skipPublish) {\n await runPublish(ctx, { tier })\n }\n\n await runBuild(ctx, { tier, hubspotOnly: true })\n runNodeScript(kitPath('scripts', 'check-hubspot-bundle-size.mjs'), [], execOpts)\n runNodeScript(kitPath('scripts', 'write-audit-artifacts.mjs'), [], execOpts)\n\n await runUpload(ctx, { tier })\n\n if (!ctx.global.json) {\n ctx.logger.success(`Deploy complete (${resolve(ctx.projectRoot, ctx.config.module.outDir)} → ${ctx.config.module.uploadPath})`)\n }\n return ExitCode.SUCCESS\n}\n","import { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type PublishOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n dryRun?: boolean\n}\n\nexport async function runPublish(ctx: CommandContext, options: PublishOptions): Promise<number> {\n const tier = options.tier ?? 'prod'\n const env = { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot }\n const execOpts = {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun || options.dryRun,\n }\n\n const verifyFlag = tier === 'prod' ? ['--prod'] : ['--stg']\n const publishArgs = options.dryRun ? ['--dry-run'] : []\n\n try {\n if (!options.dryRun) {\n ctx.logger.info(`Verifying CDN API endpoint (${tier})…`)\n runNodeScript(kitPath('scripts', 'verify-cdn-api-endpoint.mjs'), verifyFlag, execOpts)\n }\n\n ctx.logger.info(options.dryRun ? 'CDN publish dry-run…' : `Publishing CDN (${tier})…`)\n runNodeScript(kitPath('scripts', 'publish-cdn-github.mjs'), publishArgs, execOpts)\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'publish', tier, dryRun: Boolean(options.dryRun), ok: true })\n } else {\n ctx.logger.success(options.dryRun ? 'CDN publish dry-run complete' : 'CDN publish complete')\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.PUBLISH_FAILED,\n remediation: 'Check CDN PAT, portal.cdn.json, and verify-cdn-api-endpoint.',\n })\n }\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { runCommand } from '../../lib/exec.js'\nimport { isThemeProject } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type UploadOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n}\n\nexport async function runUpload(ctx: CommandContext, options: UploadOptions = {}): Promise<number> {\n ensureHubSpotCliSetup(ctx, 'cms')\n\n const tier = options.tier ?? 'prod'\n\n if (tier === 'prod' && !ctx.global.yes && !ctx.global.ci) {\n const confirmed = process.env.WP_HS_CONFIRM_PROD === '1'\n if (!confirmed) {\n throw new WpHsError('Production upload blocked — pass --yes or set WP_HS_CONFIRM_PROD=1', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp upload --tier prod --yes',\n })\n }\n }\n\n if (isThemeProject(ctx.config)) {\n const theme = ctx.config.theme\n if (!theme) {\n throw new WpHsError('theme block missing in woodscli.json', { exitCode: ExitCode.USER_ERROR })\n }\n const srcDir = resolve(ctx.projectRoot, theme.srcDir)\n try {\n runCommand('hs', ['cms', 'upload', srcDir, theme.uploadPath], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n if (!ctx.global.json && !ctx.global.quiet) {\n ctx.logger.success(`Uploaded theme ${srcDir} → ${theme.uploadPath}`)\n }\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError('HubSpot theme upload failed', {\n exitCode: ExitCode.PUBLISH_FAILED,\n cause: error,\n })\n }\n }\n\n const outDir = resolve(ctx.projectRoot, ctx.config.module.outDir)\n const uploadPath = ctx.config.module.uploadPath\n\n try {\n runCommand('hs', ['cms', 'upload', outDir, uploadPath], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n if (!ctx.global.json && !ctx.global.quiet) {\n ctx.logger.success(`Uploaded ${outDir} → ${uploadPath}`)\n }\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError('HubSpot upload failed', {\n exitCode: ExitCode.PUBLISH_FAILED,\n cause: error,\n remediation: 'Run wp auth, then build the module before upload.',\n })\n }\n}\n","import { createHash } from 'node:crypto'\nimport { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { defaultBaselineDir } from '../../lib/wphs-baseline.js'\nimport type { CommandContext } from '../context.js'\n\nconst FORBIDDEN_SHIP_TOKENS = [\n 'ModuleConfigOverlay',\n 'module-config-store',\n '__dev/module-config',\n 'src/dev/module-config',\n 'dev.module-config',\n]\n\nfunction hashFile(path: string): string {\n return createHash('sha256').update(readFileSync(path)).digest('hex')\n}\n\nfunction walkFiles(dir: string): string[] {\n if (!existsSync(dir)) return []\n const entries = readdirSync(dir)\n const files: string[] = []\n for (const entry of entries) {\n const full = join(dir, entry)\n if (statSync(full).isDirectory()) {\n files.push(...walkFiles(full))\n } else {\n files.push(full)\n }\n }\n return files\n}\n\nexport async function runAuditShipBundle(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const targets = [\n resolve(root, 'dist/cdn'),\n resolve(root, ctx.config.module.outDir),\n ]\n\n const violations: string[] = []\n\n for (const dir of targets) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(js|css|html)$/i.test(file)) continue\n const content = readFileSync(file, 'utf8')\n for (const token of FORBIDDEN_SHIP_TOKENS) {\n if (content.includes(token)) {\n violations.push(`${file}: contains forbidden token \"${token}\"`)\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:ship-bundle', ok: violations.length === 0, violations })\n } else if (violations.length === 0) {\n ctx.logger.success('Ship bundle audit passed')\n } else {\n for (const v of violations) ctx.logger.error(v)\n }\n\n if (violations.length > 0) {\n throw new WpHsError('Ship bundle audit failed — dev tooling leaked into production artifacts', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Ensure dev-only code is not imported in production build graph.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n\nexport type ParityOptions = {\n baselineDir?: string\n}\n\nexport type BaselineOptions = {\n baselineDir?: string\n}\n\nexport async function runAuditBaselineCapture(\n ctx: CommandContext,\n options: BaselineOptions,\n): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const sources = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would capture baseline to ${baseline}`)\n return ExitCode.SUCCESS\n }\n\n for (const { label, path } of sources) {\n if (!existsSync(path)) {\n throw new WpHsError(`Cannot capture baseline — missing ${path}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp build before wp audit baseline --capture.',\n })\n }\n const target = resolve(baseline, label)\n rmSync(target, { recursive: true, force: true })\n mkdirSync(baseline, { recursive: true })\n cpSync(path, target, { recursive: true })\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:baseline', ok: true, baseline })\n } else {\n ctx.logger.success(`Baseline captured at ${baseline}`)\n }\n\n return ExitCode.SUCCESS\n}\n\nexport async function runAuditParity(ctx: CommandContext, options: ParityOptions): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const currentDirs = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n const mismatches: string[] = []\n\n for (const { label, path } of currentDirs) {\n const baselinePath = resolve(baseline, label)\n if (!existsSync(baselinePath)) {\n ctx.logger.warn(`No baseline at ${baselinePath} — skipping ${label} parity`)\n continue\n }\n\n const baselineFiles = walkFiles(baselinePath).filter((f) => !f.endsWith('.map'))\n const currentFiles = walkFiles(path).filter((f) => !f.endsWith('.map'))\n\n const baselineNames = new Set(baselineFiles.map((f) => f.replace(baselinePath, '')))\n const currentNames = new Set(currentFiles.map((f) => f.replace(path, '')))\n\n for (const name of baselineNames) {\n if (!currentNames.has(name)) {\n mismatches.push(`missing file: ${label}${name}`)\n }\n }\n\n for (const file of baselineFiles) {\n const rel = file.replace(baselinePath, '')\n const current = resolve(path, rel.slice(1))\n if (!existsSync(current)) continue\n const bh = hashFile(file)\n const ch = hashFile(current)\n if (bh !== ch) {\n mismatches.push(`hash mismatch: ${label}${rel}`)\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:parity', ok: mismatches.length === 0, mismatches })\n } else if (mismatches.length === 0) {\n ctx.logger.success('Parity audit passed (or no baseline configured)')\n } else {\n for (const m of mismatches) ctx.logger.error(m)\n }\n\n if (mismatches.length > 0) {\n throw new WpHsError('Parity audit failed', { exitCode: ExitCode.AUDIT_FAILED })\n }\n\n return ExitCode.SUCCESS\n}\n\nconst SECRET_PATTERNS = [\n /(?:api[_-]?key|secret|password|token|private[_-]?key)\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/gi,\n /sk_live_[a-zA-Z0-9]{16,}/g,\n /pat-[a-z]{2}-[a-f0-9-]{20,}/gi,\n]\n\nexport async function runAuditSecrets(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const scanRoots = ['src', 'public', '.wphs/config'].map((d) => resolve(root, d))\n const findings: string[] = []\n\n for (const dir of scanRoots) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(ts|tsx|js|jsx|json|env|yml|yaml|html)$/i.test(file)) continue\n if (file.includes('node_modules')) continue\n const content = readFileSync(file, 'utf8')\n for (const pattern of SECRET_PATTERNS) {\n pattern.lastIndex = 0\n if (pattern.test(content)) {\n findings.push(`${file}: possible secret pattern matched`)\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:secrets', ok: findings.length === 0, findings })\n } else if (findings.length === 0) {\n ctx.logger.success('Secrets audit passed')\n } else {\n for (const f of findings) ctx.logger.error(f)\n }\n\n if (findings.length > 0) {\n throw new WpHsError('Secrets audit found potential credentials in source files', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Move secrets to env vars; never commit PATs or API keys.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { templateDevDependencies } from '../../lib/template-dev-deps.js'\nimport { DEFAULT_WOODSPORTAL_HS, type WoodsPortalHsConfig } from '../../schema/woodsportal-hs.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport type { CommandContext } from '../context.js'\n\nexport type InitOptions = {\n template?: 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\n /** Full target directory (skips name prompt when set). */\n directory?: string\n /** Project slug — creates `<parent>/<name>/` (default parent: cwd). */\n name?: string\n}\n\nconst TEMPLATE_SCRIPTS: Record<string, Record<string, string>> = {\n 'module-hybrid-cdn': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:prod': 'wp build --tier prod',\n 'build:dev': 'wp build --tier dev',\n 'deploy:prod': 'wp deploy --tier prod --yes',\n 'deploy:dev': 'wp deploy --tier dev --yes',\n doctor: 'wp doctor',\n },\n 'module-monolith': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:prod': 'wp build --tier prod --hubspot-only',\n doctor: 'wp doctor',\n },\n 'theme-starter': {\n dev: 'wp dev',\n local: 'wp dev',\n doctor: 'wp doctor',\n },\n}\n\nimport {\n moduleOutDirFromSlug,\n normalizeProjectName,\n validateProjectName,\n} from '../../lib/project-name.js'\n\nfunction buildConfigForProject(\n template: InitOptions['template'],\n projectName: string,\n): WoodsPortalHsConfig {\n const base = { ...DEFAULT_WOODSPORTAL_HS, projectType: template! }\n\n if (template === 'theme-starter') {\n return {\n ...base,\n theme: {\n name: projectName,\n uploadPath: `themes/${projectName}`,\n srcDir: 'src/theme',\n themeJson: 'src/theme/theme.json',\n },\n }\n }\n\n return {\n ...base,\n module: {\n name: projectName,\n uploadPath: `dw-modules/${projectName}.module`,\n outDir: moduleOutDirFromSlug(projectName),\n },\n cdn: {\n ...base.cdn,\n mode: template === 'module-monolith' ? 'none' : base.cdn.mode,\n },\n }\n}\n\nfunction assertTargetDirIsScaffoldable(targetDir: string): void {\n if (!existsSync(targetDir)) return\n\n const entries = readdirSync(targetDir).filter((entry) => entry !== '.DS_Store')\n if (entries.length > 0) {\n throw new WpHsError(`Target directory is not empty: ${targetDir}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Choose a different project name or remove existing files.',\n })\n }\n}\n\nfunction resolveInitTargetDir(options: InitOptions, interactiveName?: string): string {\n if (options.directory) {\n return resolve(options.directory)\n }\n\n const parentDir = process.cwd()\n const slug = options.name ?? interactiveName\n if (!slug) {\n throw new WpHsError('Project name is required', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run interactively, or pass --name my-project (or --directory ./my-project).',\n })\n }\n\n const error = validateProjectName(slug)\n if (error) {\n throw new WpHsError(error, { exitCode: ExitCode.USER_ERROR })\n }\n\n return resolve(parentDir, slug)\n}\n\nexport async function runInit(ctx: CommandContext, options: InitOptions): Promise<number> {\n const nonInteractive = ctx.global.ci || ctx.global.yes || ctx.global.json\n\n let template = options.template\n let projectName = options.name ? normalizeProjectName(options.name) : undefined\n\n if (!nonInteractive) {\n if (!template) {\n const type = await p.select({\n message: 'Project type',\n options: [\n {\n value: 'module-hybrid-cdn',\n label: 'Module (hybrid CDN)',\n hint: 'jsDelivr + thin module.js',\n },\n { value: 'module-monolith', label: 'Module (monolith)', hint: 'Single module.js IIFE' },\n { value: 'theme-starter', label: 'Theme starter', hint: 'CMS theme templates' },\n ],\n })\n if (p.isCancel(type)) throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n template = type as InitOptions['template']\n }\n\n if (!options.directory && !projectName) {\n const nameAnswer = await p.text({\n message: 'Project name (folder name)',\n placeholder: 'my-portal-module',\n validate: (value) => validateProjectName(normalizeProjectName(value ?? '')),\n })\n if (p.isCancel(nameAnswer)) {\n throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n projectName = normalizeProjectName(nameAnswer)\n }\n }\n\n if (!template) {\n template = 'module-hybrid-cdn'\n }\n\n const targetDir = resolveInitTargetDir(options, projectName)\n const slug = projectName ?? basename(targetDir)\n assertTargetDirIsScaffoldable(targetDir)\n\n const templateDir = kitPath('templates', template)\n if (!existsSync(templateDir)) {\n throw new WpHsError(`Template not found: ${template}`, { exitCode: ExitCode.USER_ERROR })\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would scaffold ${template} in ${targetDir}`)\n return ExitCode.SUCCESS\n }\n\n mkdirSync(targetDir, { recursive: true })\n cpSync(templateDir, targetDir, { recursive: true })\n\n const config = buildConfigForProject(template, slug)\n writeFileSync(resolve(targetDir, WOODSCLI_CONFIG_FILE), `${JSON.stringify(config, null, 2)}\\n`)\n\n const pkgPath = resolve(targetDir, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n name?: string\n scripts?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n pkg.name = slug\n pkg.scripts = { ...pkg.scripts, ...TEMPLATE_SCRIPTS[template] }\n pkg.devDependencies = {\n ...pkg.devDependencies,\n ...templateDevDependencies(),\n }\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: targetDir,\n logger: ctx.logger,\n dryRun: false,\n })\n\n const gitignorePath = resolve(targetDir, '.gitignore')\n const gitignoreExtras = [\n 'hubspot.config.yml',\n '.wphs/config/module-config.local.json',\n '.wphs/assets/',\n '.wphs/cache/',\n '.wphs/audit/',\n '.wphs/state/',\n '.wphs/fixtures/hubspot-data.json',\n '.wphs/.kit-module-config',\n '.wphs/.kit-bootstrap.tsx',\n ]\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf8') : ''\n const toAppend = gitignoreExtras.filter((line) => !existing.includes(line)).join('\\n')\n if (toAppend) {\n writeFileSync(gitignorePath, `${existing.trimEnd()}\\n${toAppend}\\n`)\n }\n\n if (!nonInteractive) {\n p.log.success(`Scaffolded ${template} in ${targetDir}`)\n p.note(`cd ${slug} && yarn install && wp doctor && wp dev`, 'Getting started')\n } else {\n ctx.logger.success(`Scaffolded ${template} in ${targetDir}`)\n }\n\n return ExitCode.SUCCESS\n}\n","/** Dev deps required for `wp dev` (Vite preset peer dependencies). */\nexport const VITE_DEV_PEER_DEPS: Record<string, string> = {\n vite: '^6.1.0',\n '@vitejs/plugin-react': '^4.3.4',\n 'babel-plugin-react-compiler': '^1.0.0',\n '@tailwindcss/vite': '^4.0.6',\n '@tanstack/router-plugin': '^1.121.2',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n tailwindcss: '^4.0.6',\n}\n\nexport const KIT_DEV_DEP = '@woodsportal/hubspot-kit'\n\n/** Latest kit version pinned in `wp init` scaffolds. Keep aligned with package.json. */\nexport const KIT_DEV_DEP_VERSION = '^1.0.4'\n\nexport function templateDevDependencies(): Record<string, string> {\n return {\n [KIT_DEV_DEP]: KIT_DEV_DEP_VERSION,\n ...VITE_DEV_PEER_DEPS,\n }\n}\n","const PROJECT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/\n\nexport function normalizeProjectName(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nexport function validateProjectName(name: string): string | undefined {\n if (!name) return 'Project name is required'\n if (!PROJECT_NAME_PATTERN.test(name)) {\n return 'Use lowercase letters, numbers, and hyphens (e.g. my-portal-module)'\n }\n if (name.length > 64) return 'Project name is too long (max 64 characters)'\n return undefined\n}\n\nexport function moduleOutDirFromSlug(slug: string): string {\n const pascal = slug\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n return `dist/${pascal || 'HubSpot'}.Module`\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport * as p from '@clack/prompts'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { DEFAULT_WOODSPORTAL_HS, isModuleProject, type WoodsPortalHsConfig } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type AdoptOptions = {\n yes?: boolean\n}\n\nasync function loadDetectLayout() {\n const mod = await import(pathToFileURL(kitPath('scripts', 'detect-layout.mjs')).href)\n return mod.detectProjectLayout as (root: string) => {\n track: string\n setup: string\n projectType: string | null\n }\n}\n\nexport async function runAdopt(ctx: CommandContext, _options: AdoptOptions = {}): Promise<number> {\n const detectProjectLayout = await loadDetectLayout()\n const layout = detectProjectLayout(ctx.projectRoot)\n const configPath = resolve(ctx.projectRoot, WOODSCLI_CONFIG_FILE)\n\n if (layout.track === 'unknown') {\n throw new WpHsError('Could not detect module or theme layout.', {\n exitCode: ExitCode.USER_ERROR,\n remediation:\n 'Ensure fields.json + module.html (module) or theme.json + templates/ (theme) exist.',\n })\n }\n\n let projectType: WoodsPortalHsConfig['projectType']\n if (layout.projectType) {\n projectType = layout.projectType as WoodsPortalHsConfig['projectType']\n } else if (layout.track === 'theme') {\n projectType = 'theme-starter'\n } else if (existsSync(resolve(ctx.projectRoot, 'vite.config.monolith.mjs'))) {\n projectType = 'module-monolith'\n } else {\n projectType = 'module-hybrid-cdn'\n }\n\n const config = {\n ...DEFAULT_WOODSPORTAL_HS,\n projectType,\n ...(layout.track === 'theme'\n ? {\n theme: {\n name: 'my-theme',\n uploadPath: 'themes/my-theme',\n srcDir: 'src/theme',\n themeJson: 'src/theme/theme.json',\n },\n }\n : {}),\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would adopt as ${projectType} (${layout.track})`)\n return ExitCode.SUCCESS\n }\n\n if (!existsSync(configPath)) {\n writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`)\n ctx.logger.success(`Created ${WOODSCLI_CONFIG_FILE}`)\n } else if (!layout.projectType) {\n const existing = JSON.parse(readFileSync(configPath, 'utf8'))\n writeFileSync(configPath, `${JSON.stringify({ ...existing, projectType }, null, 2)}\\n`)\n ctx.logger.info(`Set projectType → ${projectType}`)\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n\n const adapterPath = resolve(ctx.projectRoot, 'wphs.adapter.ts')\n if (!existsSync(adapterPath) && isModuleProject(config)) {\n writeFileSync(\n adapterPath,\n `import type { HubSpotKitAdapter } from '@woodsportal/hubspot-kit'\n\nconst adapter: HubSpotKitAdapter = {\n syncLiveData(built) {\n ;(window as Window & { __WPHS_DATA__?: Record<string, unknown> }).__WPHS_DATA__ = built\n },\n}\n\nexport default adapter\n`,\n )\n ctx.logger.info('Created wphs.adapter.ts stub')\n }\n\n if (!ctx.global.ci && !ctx.global.quiet) {\n p.note(\n [\n `Review ${WOODSCLI_CONFIG_FILE} upload paths`,\n 'Implement wphs.adapter.ts for your app (if module)',\n 'Add vite.config.dev.mjs re-export if missing',\n 'Patch main.dev.css @source to .wphs/.kit-module-config/**',\n ].join('\\n'),\n 'Manual follow-ups',\n )\n }\n\n ctx.logger.success(`Adopted ${layout.track} project (${projectType})`)\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport {\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nconst LEGACY_DIRS = ['.dev', '.woodsportal']\nconst LEGACY_BASELINE = '.wp-hs-baseline'\n\nexport type MigrateOptions = {\n yes?: boolean\n}\n\nexport async function runMigrate(ctx: CommandContext, _options: MigrateOptions = {}): Promise<number> {\n const root = ctx.projectRoot\n const wphsRoot = resolve(root, WPHS_WORKSPACE_DIR)\n const actions: string[] = []\n\n for (const legacy of LEGACY_DIRS) {\n const legacyPath = resolve(root, legacy)\n if (!existsSync(legacyPath)) continue\n\n actions.push(`Move ${legacy}/ → .wphs/`)\n if (ctx.global.dryRun) continue\n\n mkdirSync(join(wphsRoot, 'config'), { recursive: true })\n mkdirSync(join(wphsRoot, 'assets', 'branding'), { recursive: true })\n\n const localConfig = join(legacyPath, 'module-config.local.json')\n const exampleConfig = join(legacyPath, 'module-config.example.json')\n if (existsSync(localConfig)) {\n cpSync(localConfig, join(wphsRoot, 'config', 'module-config.local.json'))\n }\n if (existsSync(exampleConfig)) {\n cpSync(exampleConfig, join(wphsRoot, 'config', 'module-config.example.json'))\n }\n\n const branding = join(legacyPath, 'branding-assets')\n if (existsSync(branding)) {\n for (const file of readdirSync(branding)) {\n cpSync(join(branding, file), join(wphsRoot, 'assets', 'branding', file))\n }\n }\n\n rmSync(legacyPath, { recursive: true, force: true })\n }\n\n const legacyBaseline = resolve(root, LEGACY_BASELINE)\n const targetBaseline = join(wphsRoot, 'audit', 'baseline')\n if (existsSync(legacyBaseline)) {\n actions.push(`Move ${LEGACY_BASELINE}/ → .wphs/audit/baseline/`)\n if (!ctx.global.dryRun) {\n mkdirSync(targetBaseline, { recursive: true })\n cpSync(legacyBaseline, targetBaseline, { recursive: true })\n rmSync(legacyBaseline, { recursive: true, force: true })\n }\n }\n\n const legacyConfigPath = resolve(root, LEGACY_WOODSPORTAL_HS_FILE)\n const woodscliPath = resolve(root, WOODSCLI_CONFIG_FILE)\n\n if (existsSync(legacyConfigPath) && !existsSync(woodscliPath)) {\n actions.push(`Rename ${LEGACY_WOODSPORTAL_HS_FILE} → ${WOODSCLI_CONFIG_FILE}`)\n if (!ctx.global.dryRun) {\n renameSync(legacyConfigPath, woodscliPath)\n }\n } else if (existsSync(legacyConfigPath) && existsSync(woodscliPath)) {\n actions.push(`Remove duplicate ${LEGACY_WOODSPORTAL_HS_FILE}`)\n if (!ctx.global.dryRun) {\n rmSync(legacyConfigPath, { force: true })\n }\n }\n\n if (existsSync(woodscliPath)) {\n const raw = JSON.parse(readFileSync(woodscliPath, 'utf8'))\n if (raw?.dev?.moduleConfigDir && raw.dev.moduleConfigDir !== WPHS_WORKSPACE_DIR) {\n actions.push(`Update dev.moduleConfigDir → .wphs in project config`)\n if (!ctx.global.dryRun) {\n raw.dev.moduleConfigDir = WPHS_WORKSPACE_DIR\n writeFileSync(woodscliPath, `${JSON.stringify(raw, null, 2)}\\n`)\n }\n }\n }\n\n if (actions.length === 0) {\n ctx.logger.success('Nothing to migrate — already on .wphs / woodscli.json')\n return ExitCode.SUCCESS\n }\n\n if (ctx.global.dryRun) {\n for (const action of actions) ctx.logger.info(`[dry-run] ${action}`)\n return ExitCode.SUCCESS\n }\n\n if (!ctx.global.yes && !ctx.global.ci) {\n throw new WpHsError('Migration requires --yes.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run: wp migrate --yes',\n })\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: root,\n logger: ctx.logger,\n dryRun: false,\n })\n\n for (const action of actions) ctx.logger.success(action)\n return ExitCode.SUCCESS\n}\n","import { readFileSync } from 'node:fs'\n\nimport { ExitCode } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type ExamplesListOptions = {\n track?: 'module' | 'theme'\n setup?: 'greenfield' | 'existing' | 'adopted'\n}\n\nexport type ExamplesSmokeOptions = {\n scenario?: string\n tier?: 'static' | 'live'\n}\n\ntype Scenario = {\n id: string\n setup: string\n track: string\n projectType?: string\n smokeTier: string\n fixture?: string\n checks?: string[]\n}\n\nfunction loadManifest() {\n const manifestPath = kitPath('examples', 'manifest.json')\n const raw = JSON.parse(readFileSync(manifestPath, 'utf8')) as { scenarios: Scenario[] }\n return raw.scenarios\n}\n\nexport async function runExamplesList(\n ctx: CommandContext,\n options: ExamplesListOptions = {},\n): Promise<number> {\n let scenarios = loadManifest()\n if (options.track) scenarios = scenarios.filter((s) => s.track === options.track)\n if (options.setup) scenarios = scenarios.filter((s) => s.setup === options.setup)\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:list', scenarios })\n } else {\n for (const s of scenarios) {\n ctx.logger.info(`${s.id} (${s.setup}/${s.track}) tier=${s.smokeTier}`)\n }\n }\n return ExitCode.SUCCESS\n}\n\nexport async function runExamplesSmoke(\n ctx: CommandContext,\n options: ExamplesSmokeOptions = {},\n): Promise<number> {\n const tier = options.tier ?? 'static'\n const args = ['--tier', tier]\n if (options.scenario) args.push('--scenario', options.scenario)\n\n const { runNodeScript } = await import('../../lib/exec.js')\n runNodeScript(kitPath('examples', 'smoke', 'run-matrix.mjs'), args, {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:smoke', tier, scenario: options.scenario ?? 'all', ok: true })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport type FieldsSyncOptions = {\n direction?: 'pull' | 'push'\n dryRun?: boolean\n}\n\nexport async function runFieldsSync(\n ctx: CommandContext,\n options: FieldsSyncOptions = {},\n): Promise<number> {\n const direction = options.direction ?? 'pull'\n const fieldsPath = resolve(ctx.projectRoot, ctx.config.dev.fieldsJson)\n const cacheDir = resolve(ctx.projectRoot, ctx.config.dev.moduleConfigDir, 'cache', 'fields-sync')\n const cachePath = resolve(cacheDir, 'fields.json')\n\n if (direction === 'pull') {\n if (!existsSync(fieldsPath)) {\n throw new WpHsError(`Missing ${ctx.config.dev.fieldsJson}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Add fields.json or run wp init.',\n })\n }\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would cache ${fieldsPath} → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n const { mkdirSync } = await import('node:fs')\n mkdirSync(cacheDir, { recursive: true })\n cpSync(fieldsPath, cachePath)\n ctx.logger.success(`Cached fields → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n\n if (!existsSync(cachePath)) {\n throw new WpHsError('No cached fields — run wp fields sync pull first.', {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would write ${cachePath} → ${fieldsPath}`)\n return ExitCode.SUCCESS\n }\n\n writeFileSync(fieldsPath, readFileSync(cachePath, 'utf8'))\n ctx.logger.success(`Restored fields from cache → ${fieldsPath}`)\n return ExitCode.SUCCESS\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\nimport { runConfigValidate } from './config-validate.js'\nimport { runDoctor } from './doctor.js'\n\nexport type RegressionSmokeOptions = {\n /** Skip doctor (e.g. when HubSpot CLI is not installed in CI) */\n skipDoctor?: boolean\n /** Fail if legacy consumer script shims are missing */\n checkLegacyShims?: boolean\n}\n\nconst LEGACY_SHIM_SCRIPTS = [\n 'build-cdn.mjs',\n 'run-vite-build.mjs',\n 'run-hubspot-module-postbuild.mjs',\n 'watch-hubspot.mjs',\n]\n\nconst FORBIDDEN_CONSUMER_PATHS = ['src/dev/module-config', 'src/dev/bootstrap.tsx']\n\nexport async function runRegressionSmoke(\n ctx: CommandContext,\n options: RegressionSmokeOptions = {},\n): Promise<number> {\n const failures: string[] = []\n const checks: { name: string; ok: boolean; detail?: string }[] = []\n\n if (!options.skipDoctor) {\n const doctorCode = await runDoctor(ctx)\n const doctorOk = doctorCode === ExitCode.SUCCESS\n checks.push({ name: 'doctor', ok: doctorOk })\n if (!doctorOk) failures.push('wp doctor failed')\n }\n\n const validateCode = await runConfigValidate(ctx)\n const validateOk = validateCode === ExitCode.SUCCESS\n checks.push({ name: 'config-validate', ok: validateOk })\n if (!validateOk) failures.push('wp config validate failed')\n\n if (options.checkLegacyShims !== false) {\n for (const script of LEGACY_SHIM_SCRIPTS) {\n const shim = resolve(ctx.projectRoot, 'scripts', script)\n const kitScript = kitPath('scripts', script)\n const shimOk = existsSync(shim) && existsSync(kitScript)\n checks.push({ name: `shim:${script}`, ok: shimOk })\n if (!shimOk) failures.push(`Missing legacy shim or kit script: ${script}`)\n }\n }\n\n for (const rel of FORBIDDEN_CONSUMER_PATHS) {\n const forbidden = resolve(ctx.projectRoot, rel)\n const absent = !existsSync(forbidden)\n checks.push({ name: `no-${rel}`, ok: absent })\n if (!absent) failures.push(`Forbidden dev path still present: ${rel}`)\n }\n\n const woodscliConfig = resolve(ctx.projectRoot, WOODSCLI_CONFIG_FILE)\n const configOk = existsSync(woodscliConfig)\n checks.push({ name: WOODSCLI_CONFIG_FILE, ok: configOk })\n if (!configOk) failures.push(`${WOODSCLI_CONFIG_FILE} missing`)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'regression:smoke',\n ok: failures.length === 0,\n checks,\n failures,\n })\n } else if (failures.length === 0) {\n ctx.logger.success('Regression smoke passed')\n } else {\n for (const f of failures) ctx.logger.error(f)\n }\n\n if (failures.length > 0) {\n throw new WpHsError('Regression smoke failed', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Run wp doctor and fix listed checks. See docs/REGRESSION-SMOKE.md.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type WatchOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n rebuild?: boolean\n}\n\nexport async function runWatch(ctx: CommandContext, options: WatchOptions): Promise<number> {\n ensureHubSpotCliSetup(ctx, 'cms')\n\n const tier = options.tier ?? 'dev'\n const args: string[] = []\n if (tier === 'prod') args.push('--prod')\n if (options.rebuild) args.push('--rebuild')\n\n try {\n runNodeScript(kitPath('scripts', 'watch-hubspot.mjs'), args, {\n cwd: ctx.projectRoot,\n env: { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot },\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError('Watch failed', {\n exitCode: ExitCode.BUILD_FAILED,\n cause: error,\n remediation: 'Ensure HubSpot module is built once before watch, or pass --rebuild.',\n })\n }\n}\n","import { createProgram } from './program.js'\n\nconst program = createProgram()\nprogram.parse(process.argv)\n"],"mappings":"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","names":["readFileSync","resolve","readFileSync","existsSync","resolve","resolve","existsSync","findProjectRoot","findProjectRoot","readFileSync","resolve","resolve","existsSync","resolve","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","existsSync","resolve","resolve","existsSync","resolve","existsSync","resolve","resolve","existsSync","resolve","existsSync","resolve","resolve","resolve","resolve","existsSync","readFileSync","resolve","join","readFileSync","existsSync","join","resolve","cpSync","existsSync","mkdirSync","readdirSync","readFileSync","resolve","existsSync","readdirSync","resolve","mkdirSync","cpSync","readFileSync","existsSync","readFileSync","writeFileSync","resolve","p","resolve","existsSync","writeFileSync","readFileSync","cpSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","writeFileSync","join","resolve","resolve","existsSync","mkdirSync","join","cpSync","readdirSync","rmSync","legacyConfigPath","readFileSync","writeFileSync","readFileSync","readFileSync","runNodeScript","cpSync","existsSync","readFileSync","writeFileSync","resolve","resolve","existsSync","mkdirSync","cpSync","writeFileSync","readFileSync","existsSync","resolve","resolve","existsSync","readFileSync","resolve","findProjectRoot","program","runCommand"]}
1
+ {"version":3,"sources":["../src/cli/program.ts","../src/lib/config.ts","../src/lib/config-files.ts","../src/schema/woodsportal-hs.ts","../src/lib/paths.ts","../src/lib/logger.ts","../src/lib/wphs-baseline.ts","../src/cli/commands/doctor.ts","../src/lib/cli-spinner.ts","../src/lib/hubspot-cli-setup.ts","../src/lib/template-dev-deps.ts","../src/cli/commands/config-validate.ts","../src/cli/commands/build.ts","../src/lib/build-tier.ts","../src/cli/commands/dev.ts","../src/lib/cli-banner.ts","../src/lib/kit-version.ts","../src/vite/resolve-dev-config.ts","../src/cli/commands/deploy.ts","../src/cli/commands/publish.ts","../src/cli/commands/upload.ts","../src/cli/commands/audit.ts","../src/cli/commands/init.ts","../src/lib/init-router-scaffold.ts","../src/lib/project-setup.ts","../src/lib/project-name.ts","../src/cli/commands/adopt.ts","../src/cli/commands/migrate.ts","../src/cli/commands/examples.ts","../src/cli/commands/fields.ts","../src/cli/commands/regression.ts","../src/cli/commands/setup.ts","../src/cli/commands/portal.ts","../src/lib/hubspot-portals.ts","../src/cli/commands/watch.ts","../src/cli/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Command } from 'commander'\n\nimport { loadConfig } from '../lib/config.js'\nimport { createLogger } from '../lib/logger.js'\nimport { findProjectRoot, getKitRoot } from '../lib/paths.js'\nimport { defaultBaselineDir } from '../lib/wphs-baseline.js'\nimport { isWpHsError, ExitCode } from '../lib/errors.js'\nimport type { GlobalCliOptions, CommandContext } from './context.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { runConfigValidate } from './commands/config-validate.js'\nimport { runBuild } from './commands/build.js'\nimport { runDev } from './commands/dev.js'\nimport { runDeploy } from './commands/deploy.js'\nimport { runPublish } from './commands/publish.js'\nimport {\n runAuditBaselineCapture,\n runAuditParity,\n runAuditSecrets,\n runAuditShipBundle,\n} from './commands/audit.js'\nimport { runInit } from './commands/init.js'\nimport { runAdopt } from './commands/adopt.js'\nimport { runMigrate } from './commands/migrate.js'\nimport { runExamplesList, runExamplesSmoke } from './commands/examples.js'\nimport { runFieldsSync } from './commands/fields.js'\nimport { runRegressionSmoke } from './commands/regression.js'\nimport { runSetup } from './commands/setup.js'\nimport { runPortalList, runPortalUse } from './commands/portal.js'\nimport { runUpload } from './commands/upload.js'\nimport { runWatch } from './commands/watch.js'\nimport { DEFAULT_BUILD_TIER, parseBuildTier } from '../lib/build-tier.js'\nimport { DEFAULT_WOODSPORTAL_HS } from '../schema/woodsportal-hs.js'\n\ntype InitTemplate = 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\n\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(resolve(getKitRoot(), 'package.json'), 'utf8')) as {\n version?: string\n }\n return pkg.version ?? '0.0.0'\n } catch {\n return '0.0.0'\n }\n}\n\nfunction buildContext(global: GlobalCliOptions): CommandContext {\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n\n const projectRoot = global.project ?? findProjectRoot()\n const { config } = loadConfig(projectRoot)\n\n return { projectRoot, config, logger, global }\n}\n\nfunction attachGlobals(command: Command): void {\n command\n .option('--project <path>', 'Project root (woodscli.json)')\n .option('--ci', 'Non-interactive CI mode', false)\n .option('--json', 'Machine-readable JSON output', false)\n .option('--verbose', 'Verbose logging', false)\n .option('--quiet', 'Errors only', false)\n .option('--dry-run', 'Print planned actions without executing', false)\n .option('-y, --yes', 'Assume yes (non-interactive)', false)\n}\n\nasync function handle(fn: () => Promise<number>): Promise<void> {\n try {\n const code = await fn()\n process.exit(code)\n } catch (error) {\n if (isWpHsError(error)) {\n process.stderr.write(`Error: ${error.message}\\n`)\n if (error.remediation) {\n process.stderr.write(`→ ${error.remediation}\\n`)\n }\n process.exit(error.exitCode)\n }\n process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(ExitCode.INTERNAL)\n }\n}\n\nexport function createProgram(): Command {\n const program = new Command()\n .name('wp')\n .description('WoodsCLI — HubSpot CMS dev kit by WoodsPortal (modules + themes)')\n .version(readVersion())\n .addHelpText('after', '\\nWoodsCLI · WoodsPortal HubSpot CLI · npm @woodsportal/hubspot-kit')\n\n attachGlobals(program)\n\n program\n .command('doctor')\n .description('Check prerequisites (Node, HubSpot CLI, .wphs workspace, config)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDoctor(buildContext(global)))\n })\n\n program\n .command('setup')\n .description('Copy missing hubspot.config.yml, .env.*, CDN config, and vite shims from kit templates')\n .option('--tier <tier>', 'dev | stg | prod — copy only this .env file (default: all env.tiers)')\n .action(async (opts: { tier?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runSetup(buildContext(global), {\n tier: opts.tier ? parseBuildTier(opts.tier) : undefined,\n }),\n )\n })\n\n const configCmd = program.command('config').description('Project configuration')\n\n configCmd\n .command('validate')\n .description('Validate woodscli.json')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runConfigValidate(buildContext(global)))\n })\n\n program\n .command('init')\n .description('Scaffold a new module or theme project')\n .option('-t, --template <type>', 'module-hybrid-cdn | module-monolith | theme-starter')\n .option('-n, --name <slug>', 'Project name (creates ./<name>/ under cwd)')\n .option('-d, --directory <path>', 'Full target directory (skips name → folder prompt)')\n .option('--router <mode>', 'hash (client-frontend default) | browser | none — modules only')\n .action(\n async (opts: {\n template?: string\n name?: string\n directory?: string\n router?: string\n }) => {\n const global = program.opts<GlobalCliOptions>()\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n const ctx: CommandContext = {\n projectRoot: process.cwd(),\n config: DEFAULT_WOODSPORTAL_HS,\n logger,\n global,\n }\n const routerMode =\n opts.router === 'browser' || opts.router === 'none' || opts.router === 'hash'\n ? opts.router\n : undefined\n\n await handle(() =>\n runInit(ctx, {\n template: opts.template as InitTemplate | undefined,\n name: opts.name,\n directory: opts.directory,\n router: routerMode,\n }),\n )\n })\n\n program\n .command('adopt')\n .description('Detect existing module/theme repo and add WoodsCLI config + .wphs/')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAdopt(buildContext(global)))\n })\n\n program\n .command('migrate')\n .description('Migrate legacy .dev/ or .wp-hs-baseline/ to .wphs/')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runMigrate(buildContext(global)))\n })\n\n program\n .command('dev')\n .alias('local')\n .description('Start local development server (Vite HMR + CMS dev tool)')\n .option('-p, --port <port>', 'Port', '3000')\n .action(async (opts: { port: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDev(buildContext(global), { port: Number(opts.port) }))\n })\n\n program\n .command('build')\n .description('Build CDN + HubSpot module (or theme no-op)')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--cdn-only', 'CDN chunks only')\n .option('--hubspot-only', 'HubSpot module only')\n .option('--cdn-esm', 'Build CDN via ESM preset')\n .action(\n async (opts: {\n tier: string\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runBuild(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n cdnOnly: opts.cdnOnly,\n hubspotOnly: opts.hubspotOnly,\n cdnEsm: opts.cdnEsm,\n }),\n )\n },\n )\n\n program\n .command('deploy')\n .description('Build, publish CDN, upload HubSpot module')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--skip-publish', 'Skip CDN publish')\n .action(async (opts: { tier: string; skipPublish?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runDeploy(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n skipPublish: opts.skipPublish,\n }),\n )\n })\n\n program\n .command('publish')\n .description('Publish CDN artifacts to jsDelivr mirror')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--dry-run', 'Print publish plan without pushing')\n .action(async (opts: { tier: string; dryRun?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runPublish(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n dryRun: opts.dryRun,\n }),\n )\n })\n\n const audit = program.command('audit').description('Build audits')\n\n audit\n .command('ship-bundle')\n .description('Fail if dev tooling appears in dist artifacts')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditShipBundle(buildContext(global)))\n })\n\n audit\n .command('parity')\n .description('Compare dist output to baseline snapshot')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditParity(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('baseline')\n .description('Capture dist output as parity baseline')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditBaselineCapture(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('secrets')\n .description('Scan source for hardcoded secrets / PAT patterns')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditSecrets(buildContext(global)))\n })\n\n const fields = program.command('fields').description('Module fields.json utilities')\n\n fields\n .command('sync')\n .description('Pull/push fields.json vs local cache')\n .option('--direction <dir>', 'pull | push', 'pull')\n .action(async (opts: { direction: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const direction = opts.direction === 'push' ? 'push' : 'pull'\n await handle(() => runFieldsSync(buildContext(global), { direction }))\n })\n\n const examples = program.command('examples').description('Examples smoke matrix')\n\n examples\n .command('list')\n .description('List scenarios from examples/manifest.json')\n .option('--track <track>', 'module | theme')\n .option('--setup <setup>', 'greenfield | existing | adopted')\n .action(async (opts: { track?: string; setup?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runExamplesList(buildContext(global), {\n track: opts.track as 'module' | 'theme' | undefined,\n setup: opts.setup as 'greenfield' | 'existing' | 'adopted' | undefined,\n }),\n )\n })\n\n examples\n .command('smoke')\n .description('Run static/live smoke checks for example scenarios')\n .option('--scenario <id>', 'Single scenario id')\n .option('--tier <tier>', 'static | live', 'static')\n .action(async (opts: { scenario?: string; tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = opts.tier === 'live' ? 'live' : 'static'\n await handle(() =>\n runExamplesSmoke(buildContext(global), { scenario: opts.scenario, tier }),\n )\n })\n\n const regression = program.command('regression').description('Compatibility regression checks')\n\n regression\n .command('smoke')\n .description('Doctor + config validate + consumer boundary checks')\n .option('--skip-doctor', 'Skip prerequisite doctor check')\n .action(async (opts: { skipDoctor?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runRegressionSmoke(buildContext(global), { skipDoctor: opts.skipDoctor }),\n )\n })\n\n program\n .command('watch')\n .description('Watch HubSpot module or theme folder and re-upload on change')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--rebuild', 'Rebuild module before watch')\n .action(async (opts: { tier: string; rebuild?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = parseBuildTier(opts.tier)\n await handle(() =>\n runWatch(buildContext(global), {\n tier: tier === 'prod' ? 'prod' : tier === 'stg' ? 'stg' : 'dev',\n rebuild: opts.rebuild,\n }),\n )\n })\n\n program\n .command('upload')\n .description('Upload built HubSpot module or theme (hs cms upload)')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .action(async (opts: { tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runUpload(buildContext(global), { tier: parseBuildTier(opts.tier) }),\n )\n })\n\n program\n .command('auth')\n .description('Authenticate HubSpot CLI (hs auth)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const { runCommand } = await import('../lib/exec.js')\n runCommand('hs', ['auth'], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n process.exit(ExitCode.SUCCESS)\n })\n\n const portal = program.command('portal').description('HubSpot default portal selection')\n\n portal\n .command('list')\n .alias('ls')\n .description('List portals from hubspot.config.yml')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runPortalList(buildContext(global)))\n })\n\n portal\n .command('use [name]')\n .description('Set defaultPortal (hs accounts use)')\n .action(async (name?: string) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runPortalUse(buildContext(global), { name }))\n })\n\n return program\n}\n","import { readFileSync } from 'node:fs'\n\nimport {\n resolveProjectConfig,\n WOODSCLI_CONFIG_FILE,\n} from './config-files.js'\nimport { WoodsPortalHsSchema, type WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WpHsError, ExitCode } from './errors.js'\nimport { findProjectRoot } from './paths.js'\n\nexport type LoadedProjectConfig = {\n root: string\n config: WoodsPortalHsConfig\n configPath: string\n configFileName: string\n}\n\nexport function loadConfig(projectRoot?: string): LoadedProjectConfig {\n const root = projectRoot ?? findProjectRoot()\n const resolved = resolveProjectConfig(root)\n\n if (!resolved) {\n throw new WpHsError(`Missing ${WOODSCLI_CONFIG_FILE}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init or wp adopt. Legacy woodsportal.hs.json → run wp migrate --yes.',\n })\n }\n\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(resolved.path, 'utf8'))\n } catch (cause) {\n throw new WpHsError(`Invalid JSON in ${resolved.fileName}`, {\n exitCode: ExitCode.USER_ERROR,\n cause,\n })\n }\n\n const parsed = WoodsPortalHsSchema.safeParse(raw)\n if (!parsed.success) {\n throw new WpHsError(`${resolved.fileName} validation failed: ${parsed.error.message}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp config validate for details.',\n })\n }\n\n return {\n root,\n config: parsed.data,\n configPath: resolved.path,\n configFileName: resolved.fileName,\n }\n}\n\nexport function validateConfigFile(projectRoot?: string): {\n valid: boolean\n errors: string[]\n config?: WoodsPortalHsConfig\n} {\n try {\n const { config } = loadConfig(projectRoot)\n return { valid: true, errors: [], config }\n } catch (error) {\n if (error instanceof WpHsError) {\n return { valid: false, errors: [error.message] }\n }\n return { valid: false, errors: [String(error)] }\n }\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** Canonical WoodsCLI project config — the only supported filename. */\nexport const WOODSCLI_CONFIG_FILE = 'woodscli.json'\n\n/** Removed in v1.0.2+ — detected only for migrate/doctor messaging. */\nexport const LEGACY_WOODSPORTAL_HS_FILE = 'woodsportal.hs.json'\n\nexport type ResolvedProjectConfig = {\n path: string\n fileName: typeof WOODSCLI_CONFIG_FILE\n}\n\nfunction envConfigPath(projectRoot: string): string | null {\n const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null\n if (!fromEnv) return null\n return resolve(projectRoot, fromEnv)\n}\n\nexport function legacyConfigPath(projectRoot: string): string {\n return resolve(projectRoot, LEGACY_WOODSPORTAL_HS_FILE)\n}\n\nexport function woodscliConfigPath(projectRoot: string): string {\n return resolve(projectRoot, WOODSCLI_CONFIG_FILE)\n}\n\n/** @returns null | 'legacy-only' | 'duplicate' */\nexport function legacyConfigConflict(projectRoot: string): 'legacy-only' | 'duplicate' | null {\n const hasWoodscli = existsSync(woodscliConfigPath(projectRoot))\n const hasLegacy = existsSync(legacyConfigPath(projectRoot))\n if (hasLegacy && hasWoodscli) return 'duplicate'\n if (hasLegacy && !hasWoodscli) return 'legacy-only'\n return null\n}\n\n/**\n * Resolve the active project config file (`woodscli.json` only).\n */\nexport function resolveProjectConfig(projectRoot: string): ResolvedProjectConfig | null {\n const envPath = envConfigPath(projectRoot)\n if (envPath) {\n if (!existsSync(envPath)) return null\n return { path: envPath, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n const path = woodscliConfigPath(projectRoot)\n if (existsSync(path)) {\n return { path, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n return null\n}\n\nexport function findProjectRoot(from = process.cwd()): string | null {\n if (process.env.WP_HS_PROJECT_ROOT?.trim()) {\n return resolve(process.env.WP_HS_PROJECT_ROOT.trim())\n }\n\n let dir = resolve(from)\n while (true) {\n if (resolveProjectConfig(dir)) {\n return dir\n }\n const parent = resolve(dir, '..')\n if (parent === dir) {\n return null\n }\n dir = parent\n }\n}\n","import { z } from 'zod'\n\nexport const CONFIG_VERSION = 1\n\nexport const WPHS_WORKSPACE_DIR = '.wphs' as const\n\nexport const WoodsPortalHsSchema = z.object({\n configVersion: z.number().int().default(CONFIG_VERSION),\n projectType: z.enum(['module-hybrid-cdn', 'module-monolith', 'theme-starter']),\n module: z.object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n outDir: z.string().default('dist/WoodsPortal.Module'),\n }),\n theme: z\n .object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n srcDir: z.string().default('src/theme'),\n themeJson: z.string().default('src/theme/theme.json'),\n })\n .optional(),\n cdn: z\n .object({\n mode: z.enum(['jsdelivr', 'custom', 'local', 'none']).default('jsdelivr'),\n buildIdFile: z.string().default('.portal-build-id'),\n mirror: z.string().default('portal.cdn.json'),\n })\n .default({}),\n entries: z\n .object({\n app: z.string().default('src/cdn/app-entry.ts'),\n vendor: z.string().default('src/cdn/vendor-entry.ts'),\n hubspotBootstrap: z.string().default('src/hubspot/bootstrap.ts'),\n /** Monolith production IIFE entry (wp build --hubspot-only) */\n module: z.string().default('src/hubspot/module-entry.tsx'),\n localDev: z.string().default('src/main.tsx'),\n })\n .default({}),\n env: z\n .object({\n tiers: z.array(z.enum(['dev', 'stg', 'prod'])).default(['dev', 'stg', 'prod']),\n })\n .default({}),\n dev: z\n .object({\n moduleConfigDir: z.literal(WPHS_WORKSPACE_DIR).default(WPHS_WORKSPACE_DIR),\n adapter: z.string().default('./wphs.adapter.ts'),\n fieldsJson: z.string().default('public/fields.json'),\n themeFieldsJson: z.string().optional(),\n })\n .default({}),\n scaffold: z\n .object({\n /** hash = woodsportal-client-frontend (HubSpot CMS); browser = local clean URLs; none = single page */\n router: z.enum(['hash', 'browser', 'none']).default('hash'),\n })\n .optional(),\n})\n\nexport type WoodsPortalHsConfig = z.infer<typeof WoodsPortalHsSchema>\n\nexport const DEFAULT_WOODSPORTAL_HS: WoodsPortalHsConfig = {\n configVersion: CONFIG_VERSION,\n projectType: 'module-hybrid-cdn',\n module: {\n name: 'woodsportal-module',\n uploadPath: 'dw-modules/woodsportal-module.module',\n outDir: 'dist/WoodsPortal.Module',\n },\n cdn: {\n mode: 'jsdelivr',\n buildIdFile: '.portal-build-id',\n mirror: 'portal.cdn.json',\n },\n entries: {\n app: 'src/cdn/app-entry.ts',\n vendor: 'src/cdn/vendor-entry.ts',\n hubspotBootstrap: 'src/hubspot/bootstrap.ts',\n module: 'src/hubspot/module-entry.tsx',\n localDev: 'src/main.tsx',\n },\n env: {\n tiers: ['dev', 'stg', 'prod'],\n },\n dev: {\n moduleConfigDir: WPHS_WORKSPACE_DIR,\n adapter: './wphs.adapter.ts',\n fieldsJson: 'public/fields.json',\n },\n}\n\nexport function isModuleProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' || config.projectType === 'module-monolith'\n}\n\nexport function isThemeProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'theme-starter'\n}\n\nexport function usesCdnPipeline(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' && config.cdn.mode !== 'none'\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { findProjectRoot as findConfigProjectRoot } from './config-files.js'\nimport { WpHsError, ExitCode } from './errors.js'\n\nconst KIT_PACKAGE_NAME = '@woodsportal/hubspot-kit'\n\nfunction resolveKitRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n while (true) {\n const pkgPath = resolve(dir, 'package.json')\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { name?: string }\n if (pkg.name === KIT_PACKAGE_NAME) {\n return dir\n }\n } catch {\n // keep walking\n }\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n\n throw new WpHsError('Could not resolve @woodsportal/hubspot-kit package root.', {\n exitCode: ExitCode.INTERNAL,\n })\n}\n\nconst kitRoot = resolveKitRoot()\n\nexport function getKitRoot(): string {\n return kitRoot\n}\n\nexport function findProjectRoot(from = process.cwd()): string {\n const root = findConfigProjectRoot(from)\n if (!root) {\n throw new WpHsError('Could not find woodscli.json in this directory or any parent.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init, wp adopt, or pass --project <path>. Legacy config: wp migrate --yes.',\n })\n }\n return root\n}\n\nexport function kitPath(...segments: string[]): string {\n return resolve(kitRoot, ...segments)\n}\n\nexport { resolveProjectConfig, WOODSCLI_CONFIG_FILE, LEGACY_WOODSPORTAL_HS_FILE } from './config-files.js'\n","import pc from 'picocolors'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport type LoggerOptions = {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n ci?: boolean\n}\n\nexport type Logger = {\n debug: (message: string, meta?: Record<string, unknown>) => void\n info: (message: string, meta?: Record<string, unknown>) => void\n warn: (message: string, meta?: Record<string, unknown>) => void\n error: (message: string, meta?: Record<string, unknown>) => void\n success: (message: string, meta?: Record<string, unknown>) => void\n json: (payload: Record<string, unknown>) => void\n}\n\nfunction shouldUseColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false\n if (process.env.CI === 'true') return false\n return process.stdout.isTTY === true\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const useColor = shouldUseColor()\n const { verbose = false, quiet = false, json = false } = options\n\n const emit = (level: LogLevel, message: string, meta?: Record<string, unknown>) => {\n if (json) return\n if (quiet && level !== 'error' && level !== 'warn') return\n if (level === 'debug' && !verbose) return\n\n const prefix =\n level === 'error'\n ? useColor\n ? pc.red('error')\n : 'error'\n : level === 'warn'\n ? useColor\n ? pc.yellow('warn')\n : 'warn'\n : level === 'debug'\n ? useColor\n ? pc.dim('debug')\n : 'debug'\n : useColor\n ? pc.cyan('info')\n : 'info'\n\n const line = meta ? `${message} ${JSON.stringify(meta)}` : message\n const stream = level === 'error' || level === 'warn' ? process.stderr : process.stdout\n stream.write(`[${prefix}] ${line}\\n`)\n }\n\n return {\n debug: (message, meta) => emit('debug', message, meta),\n info: (message, meta) => emit('info', message, meta),\n warn: (message, meta) => emit('warn', message, meta),\n error: (message, meta) => emit('error', message, meta),\n success: (message, meta) => {\n if (json) return\n if (quiet) return\n const prefix = useColor ? pc.green('ok') : 'ok'\n process.stdout.write(`[${prefix}] ${message}\\n`)\n if (meta) process.stdout.write(`${JSON.stringify(meta)}\\n`)\n },\n json: (payload) => {\n if (!json) return\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n },\n }\n}\n","import { resolve } from 'node:path'\n\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WPHS_WORKSPACE_DIR } from '../schema/woodsportal-hs.js'\n\n/** Default parity baseline directory under `.wphs/audit/baseline`. */\nexport function defaultBaselineDir(projectRoot: string, config: WoodsPortalHsConfig): string {\n const workspace = config.dev.moduleConfigDir ?? WPHS_WORKSPACE_DIR\n return resolve(projectRoot, workspace, 'audit', 'baseline')\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { loadConfig } from '../../lib/config.js'\nimport {\n legacyConfigConflict,\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { isInteractiveCli, printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { doctorHubSpotChecks } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { MODULE_CONFIG_UI_DEPS } from '../../lib/template-dev-deps.js'\nimport { isThemeProject, usesCdnPipeline, WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DoctorCheck = {\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'error' | 'warn'\n}\n\nfunction checkNode(): DoctorCheck {\n const major = Number(process.versions.node.split('.')[0])\n const ok = major >= 20\n return {\n name: 'node',\n ok,\n message: ok ? `Node ${process.versions.node}` : `Node ${process.versions.node} (need >= 20)`,\n remediation: ok ? undefined : 'Install Node 20 LTS or newer.',\n severity: 'error',\n }\n}\n\nfunction checkLegacyConfig(projectRoot: string): DoctorCheck | null {\n const conflict = legacyConfigConflict(projectRoot)\n if (conflict === 'legacy-only') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Legacy ${LEGACY_WOODSPORTAL_HS_FILE} — ${WOODSCLI_CONFIG_FILE} is required`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n }\n }\n if (conflict === 'duplicate') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Both ${WOODSCLI_CONFIG_FILE} and ${LEGACY_WOODSPORTAL_HS_FILE} present`,\n remediation: 'Run wp migrate --yes to remove the legacy file',\n severity: 'error',\n }\n }\n return null\n}\n\nfunction checkConfig(ctx: CommandContext): DoctorCheck[] {\n const legacy = checkLegacyConfig(ctx.projectRoot)\n if (legacy) {\n return [legacy]\n }\n\n try {\n const loaded = loadConfig(ctx.projectRoot)\n return [\n {\n name: 'config',\n ok: true,\n message: `${loaded.configFileName} valid`,\n severity: 'error',\n },\n ]\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n name: 'config',\n ok: false,\n message,\n remediation: 'Run wp config validate',\n severity: 'error',\n },\n ]\n }\n}\n\nfunction checkEnvFiles(ctx: CommandContext): DoctorCheck[] {\n return ctx.config.env.tiers.map((tier) => {\n const file = tier === 'dev' ? '.env.dev' : tier === 'stg' ? '.env.stg' : '.env.prod'\n const path = resolve(ctx.projectRoot, file)\n const ok = existsSync(path)\n return {\n name: `env-${tier}`,\n ok,\n message: ok ? `${file} present` : `${file} missing`,\n remediation: ok ? undefined : 'wp setup (copies from .example templates)',\n severity: 'warn',\n }\n })\n}\n\nfunction checkBuildId(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n const file = resolve(ctx.projectRoot, ctx.config.cdn.buildIdFile)\n const ok = existsSync(file)\n return {\n name: 'build-id',\n ok,\n message: ok ? `${ctx.config.cdn.buildIdFile} present` : `${ctx.config.cdn.buildIdFile} missing`,\n remediation: ok ? undefined : 'wp setup (creates default) or set your release tag (e.g. v0.0.1-dev.1)',\n severity: 'warn',\n }\n}\n\nfunction checkDevViteConfig(ctx: CommandContext): DoctorCheck {\n const path = resolve(ctx.projectRoot, 'vite.config.dev.mjs')\n const ok = existsSync(path)\n return {\n name: 'vite-dev-config',\n ok,\n message: ok ? 'vite.config.dev.mjs present' : 'vite.config.dev.mjs missing',\n remediation: ok\n ? undefined\n : 'Add vite.config.dev.mjs that re-exports @woodsportal/hubspot-kit/vite/vite.config.dev.mjs',\n severity: 'error',\n }\n}\n\nfunction checkDevEntry(ctx: CommandContext): DoctorCheck[] {\n const checks: DoctorCheck[] = []\n const indexHtml = resolve(ctx.projectRoot, 'index.html')\n const hasIndex = existsSync(indexHtml)\n checks.push({\n name: 'index-html',\n ok: hasIndex,\n message: hasIndex ? 'index.html present' : 'index.html missing',\n remediation: hasIndex ? undefined : 'Re-run wp init or copy index.html from kit templates',\n severity: 'error',\n })\n\n const localDev = resolve(ctx.projectRoot, ctx.config.entries.localDev)\n const hasEntry = existsSync(localDev)\n checks.push({\n name: 'local-dev-entry',\n ok: hasEntry,\n message: hasEntry ? `${ctx.config.entries.localDev} present` : `${ctx.config.entries.localDev} missing`,\n remediation: hasEntry\n ? undefined\n : 'Re-run wp init or restore src/main.tsx from kit templates',\n severity: 'error',\n })\n\n if (hasEntry) {\n try {\n const source = readFileSync(localDev, 'utf8')\n const usesKitNodeBootstrap =\n source.includes('@woodsportal/hubspot-kit/dev/bootstrap-greenfield') ||\n source.includes('@woodsportal/hubspot-kit/dev/bootstrap')\n const usesWphsShim =\n source.includes('.wphs/.kit-bootstrap-greenfield') ||\n source.includes('.wphs/.kit-bootstrap') ||\n source.includes('@wphs/bootstrap-greenfield') ||\n source.includes('@wphs/bootstrap')\n checks.push({\n name: 'local-dev-bootstrap-import',\n ok: !usesKitNodeBootstrap || usesWphsShim,\n message: usesKitNodeBootstrap\n ? `${ctx.config.entries.localDev} imports kit bootstrap via node_modules (breaks React JSX in dev)`\n : 'local dev bootstrap import uses .wphs shim',\n remediation: usesKitNodeBootstrap\n ? `Use import from '../.wphs/.kit-bootstrap-greenfield.tsx' (greenfield) or '@wphs/bootstrap' (full portal)`\n : undefined,\n severity: 'error',\n })\n } catch {\n // ignore read errors\n }\n }\n\n return checks\n}\n\nfunction checkKitScripts(): DoctorCheck {\n const script = kitPath('scripts', 'build-cdn.mjs')\n const ok = existsSync(script)\n return {\n name: 'kit-scripts',\n ok,\n message: ok ? '@woodsportal/hubspot-kit scripts installed' : 'Kit build scripts missing',\n remediation: ok ? undefined : 'Reinstall @woodsportal/hubspot-kit',\n severity: 'error',\n }\n}\n\nfunction checkWphsWorkspace(ctx: CommandContext): DoctorCheck[] {\n const workspace = ctx.config.dev.moduleConfigDir\n const checks: DoctorCheck[] = []\n\n for (const legacy of ['.dev', '.woodsportal']) {\n const legacyPath = resolve(ctx.projectRoot, legacy)\n if (existsSync(legacyPath)) {\n checks.push({\n name: `legacy-${legacy}`,\n ok: false,\n message: `Legacy workspace ${legacy}/ still present`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n }\n\n if (existsSync(resolve(ctx.projectRoot, '.wp-hs-baseline'))) {\n checks.push({\n name: 'legacy-baseline',\n ok: false,\n message: 'Legacy .wp-hs-baseline/ at repo root',\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n\n if (workspace !== WPHS_WORKSPACE_DIR) {\n checks.push({\n name: 'wphs-dir',\n ok: false,\n message: `dev.moduleConfigDir must be \"${WPHS_WORKSPACE_DIR}\" (got \"${workspace}\")`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n return checks\n }\n\n const wphsRoot = resolve(ctx.projectRoot, workspace)\n const required = ['config', 'assets/branding', 'fixtures', 'cache', 'audit/baseline', 'state']\n for (const sub of required) {\n const ok = existsSync(join(wphsRoot, sub))\n checks.push({\n name: `wphs-${sub.replace(/\\//g, '-')}`,\n ok,\n message: ok ? `.wphs/${sub}/ present` : `.wphs/${sub}/ missing`,\n remediation: ok ? undefined : 'Run wp doctor (auto-scaffolds) or wp init',\n severity: 'error',\n })\n }\n\n return checks\n}\n\nfunction checkAdapter(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n const adapterPath = resolve(ctx.projectRoot, ctx.config.dev.adapter)\n const ok = existsSync(adapterPath)\n return {\n name: 'wphs-adapter',\n ok,\n message: ok ? `${ctx.config.dev.adapter} present` : `${ctx.config.dev.adapter} missing`,\n remediation: ok ? undefined : 'Run wp adopt or create wphs.adapter.ts',\n severity: 'warn',\n }\n}\n\nfunction checkModuleConfigUiDeps(ctx: CommandContext): DoctorCheck[] {\n if (isThemeProject(ctx.config)) return []\n\n const pkgPath = resolve(ctx.projectRoot, 'package.json')\n if (!existsSync(pkgPath)) return []\n\n let deps: Record<string, string> = {}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n devDependencies?: Record<string, string>\n dependencies?: Record<string, string>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n return []\n }\n\n return MODULE_CONFIG_UI_DEPS.map((name) => {\n const ok = Boolean(deps[name])\n return {\n name: `module-config-${name.replace(/[@/]/g, '-')}`,\n ok,\n message: ok ? `${name} installed` : `${name} missing (module-config overlay)`,\n remediation: ok\n ? undefined\n : 'Run yarn install after wp init, or add @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities to devDependencies',\n severity: 'error' as const,\n }\n })\n}\n\nfunction checkViteInstalled(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) && !existsSync(resolve(ctx.projectRoot, 'vite.config.dev.mjs'))) {\n return null\n }\n const localBin = resolve(ctx.projectRoot, 'node_modules', '.bin', 'vite')\n const ok = existsSync(localBin)\n return {\n name: 'vite',\n ok,\n message: ok ? 'vite installed' : 'vite not installed',\n remediation: ok\n ? undefined\n : 'Run yarn install or npm install (wp init scaffolds vite + peer deps in devDependencies)',\n severity: 'error',\n }\n}\n\nasync function gatherDoctorChecks(ctx: CommandContext): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = []\n\n await runCliTasks(ctx, [\n {\n title: 'Preparing .wphs workspace',\n task: async () => {\n if (ctx.global.dryRun) return\n try {\n runNodeScript(kitPath('scripts', 'ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n } catch {\n // non-fatal before config validation\n }\n },\n },\n {\n title: 'Checking Node, Vite, and kit scripts',\n task: async () => {\n checks.push(checkNode(), checkKitScripts(), checkDevViteConfig(ctx), ...checkDevEntry(ctx))\n const viteCheck = checkViteInstalled(ctx)\n if (viteCheck) checks.push(viteCheck)\n checks.push(...checkModuleConfigUiDeps(ctx))\n },\n },\n {\n title: 'Checking woodscli.json and project layout',\n task: async () => {\n checks.push(...checkConfig(ctx), ...checkWphsWorkspace(ctx))\n const adapterCheck = checkAdapter(ctx)\n if (adapterCheck) checks.push(adapterCheck)\n },\n },\n {\n title: 'Checking HubSpot CLI (this can take a few seconds)',\n task: async () => {\n checks.push(...doctorHubSpotChecks(ctx.projectRoot))\n },\n },\n {\n title: 'Checking environment and CDN files',\n task: async () => {\n const buildIdCheck = checkBuildId(ctx)\n if (buildIdCheck) checks.push(buildIdCheck)\n checks.push(...checkEnvFiles(ctx))\n },\n },\n ])\n\n return checks.filter((c): c is DoctorCheck => c !== null)\n}\n\nfunction printDoctorResults(ctx: CommandContext, checks: DoctorCheck[]): void {\n if (ctx.global.json) return\n\n const interactive = isInteractiveCli(ctx)\n const verbose = ctx.global.verbose\n const showPassing = !interactive || verbose\n\n if (interactive) {\n process.stdout.write('\\n')\n }\n\n for (const check of checks) {\n if (check.ok && !showPassing) continue\n\n if (check.ok) {\n ctx.logger.success(check.message)\n } else if (check.severity === 'warn') {\n ctx.logger.warn(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n } else {\n ctx.logger.error(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n }\n }\n}\n\nexport async function runDoctor(ctx: CommandContext): Promise<number> {\n const checks = await gatherDoctorChecks(ctx)\n\n const failed = checks.filter((c) => !c.ok && (c.severity ?? 'error') === 'error')\n const warnings = checks.filter((c) => !c.ok && c.severity === 'warn')\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'doctor',\n ok: failed.length === 0,\n warnings: warnings.length,\n checks,\n })\n } else {\n printDoctorResults(ctx, checks)\n\n if (!ctx.global.quiet && failed.length === 0) {\n const summary =\n warnings.length > 0\n ? `${checks.length} checks passed · ${warnings.length} warning(s)`\n : `${checks.length} checks passed`\n printCommandDone(ctx, summary)\n }\n }\n\n if (failed.length > 0) {\n throw new WpHsError(`${failed.length} doctor check(s) failed`, {\n exitCode: ExitCode.PREREQUISITE,\n })\n }\n\n if (warnings.length > 0 && !ctx.global.quiet && !ctx.global.json) {\n ctx.logger.warn(\n `${warnings.length} optional check(s) — local dev may work; fix before wp upload / wp watch`,\n )\n }\n\n return ExitCode.SUCCESS\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { CommandContext } from '../cli/context.js'\n\nexport type CliTask = {\n title: string\n task: () => void | Promise<void>\n}\n\nexport type ProgressOptions = {\n /** When false, never show spinners (e.g. nested call from deploy). Default: interactive TTY */\n progress?: boolean\n}\n\n/** TTY + human mode — skip for --json, --quiet, --ci */\nexport function isInteractiveCli(ctx: CommandContext): boolean {\n const { json, quiet, ci } = ctx.global\n return !json && !quiet && !ci && process.stdout.isTTY === true\n}\n\nexport function shouldShowProgress(\n ctx: CommandContext,\n override?: boolean,\n): boolean {\n if (override === false) return false\n return isInteractiveCli(ctx)\n}\n\n/**\n * Run phased CLI work with @clack/prompts task spinners (or sequential fallback).\n */\nexport async function runCliTasks(\n ctx: CommandContext,\n tasks: CliTask[],\n options: ProgressOptions = {},\n): Promise<void> {\n if (!shouldShowProgress(ctx, options.progress)) {\n for (const step of tasks) {\n await step.task()\n }\n return\n }\n\n await p.tasks(tasks)\n}\n\n/** Green ◆ summary line (interactive) or logger.success fallback */\nexport function printCommandDone(ctx: CommandContext, message: string): void {\n if (isInteractiveCli(ctx)) {\n process.stdout.write(`${pc.green('◆')} ${message}\\n`)\n return\n }\n ctx.logger.success(message)\n}\n\nexport type CliSpinnerHandle = {\n message: (text: string) => void\n stop: (finalMessage?: string) => void\n}\n\n/** Single spinner for one blocking step */\nexport function createCliSpinner(ctx: CommandContext, label: string): CliSpinnerHandle | null {\n if (!isInteractiveCli(ctx)) return null\n\n const spinner = p.spinner()\n spinner.start(label)\n\n return {\n message: (text: string) => {\n spinner.message(text)\n },\n stop: (finalMessage?: string) => {\n spinner.stop(finalMessage)\n },\n }\n}\n\nexport async function withCliSpinner<T>(\n ctx: CommandContext,\n label: string,\n fn: () => T | Promise<T>,\n options: ProgressOptions = {},\n): Promise<T> {\n if (!shouldShowProgress(ctx, options.progress)) {\n return await fn()\n }\n\n const spinner = createCliSpinner(ctx, label)\n try {\n return await fn()\n } finally {\n spinner?.stop()\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { spawnSync, type SpawnSyncReturns } from 'node:child_process'\n\nimport type { CommandContext } from '../cli/context.js'\nimport { ExitCode, WpHsError } from './errors.js'\n\nexport const HUBSPOT_CONFIG_FILE = 'hubspot.config.yml'\nexport const HUBSPOT_CONFIG_EXAMPLE = 'hubspot.config.yml.example'\n\nconst HS_VERSION_TIMEOUT_MS = 5_000\nconst HS_ACCOUNTS_TIMEOUT_MS = 10_000\n\nconst PLACEHOLDER_PATTERNS = [\n /YOUR_PAT_HERE/i,\n /your-portal-id/i,\n /personalAccessKey:\\s*$/m,\n /portalId:\\s*12345678\\b/,\n]\n\nexport type HubSpotConfigFileAssessment = {\n configPath: string\n examplePath: string\n configPresent: boolean\n examplePresent: boolean\n looksLikePlaceholder: boolean\n}\n\nfunction spawnHs(\n args: string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): SpawnSyncReturns<string> {\n return spawnSync('hs', args, {\n cwd: options.cwd,\n encoding: 'utf8',\n timeout: options.timeoutMs ?? HS_ACCOUNTS_TIMEOUT_MS,\n // Keep HubSpot CLI off the interactive TTY (avoids hangs under @clack spinners)\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n}\n\nfunction hsTimedOut(result: SpawnSyncReturns<string>): boolean {\n const err = result.error as NodeJS.ErrnoException | undefined\n return err?.code === 'ETIMEDOUT'\n}\n\n/** Fast sync checks — no HubSpot CLI subprocess (used by wp dev). */\nexport function assessHubSpotConfigFiles(projectRoot: string): HubSpotConfigFileAssessment {\n const configPath = resolve(projectRoot, HUBSPOT_CONFIG_FILE)\n const examplePath = resolve(projectRoot, HUBSPOT_CONFIG_EXAMPLE)\n const configPresent = existsSync(configPath)\n const examplePresent = existsSync(examplePath)\n\n let looksLikePlaceholder = false\n if (configPresent) {\n const raw = readFileSync(configPath, 'utf8')\n looksLikePlaceholder = PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(raw))\n } else {\n looksLikePlaceholder = true\n }\n\n return {\n configPath,\n examplePath,\n configPresent,\n examplePresent,\n looksLikePlaceholder,\n }\n}\n\nfunction runHubSpotCliChecks(\n projectRoot: string,\n options: { checkAccounts?: boolean } = {},\n): Pick<HubSpotSetupAssessment, 'hsCliInstalled' | 'hsCliVersion' | 'authenticated' | 'accountsHint'> {\n const checkAccounts = options.checkAccounts !== false\n\n const hsVersion = spawnHs(['--version'], { timeoutMs: HS_VERSION_TIMEOUT_MS })\n const hsCliInstalled = hsVersion.status === 0 && !hsTimedOut(hsVersion)\n const hsCliVersion = hsCliInstalled ? (hsVersion.stdout || hsVersion.stderr || '').trim() : null\n\n let authenticated = false\n let accountsHint: string | null = null\n\n if (hsCliInstalled && checkAccounts) {\n const accounts = spawnHs(['accounts', 'list'], {\n cwd: projectRoot,\n timeoutMs: HS_ACCOUNTS_TIMEOUT_MS,\n })\n const output = `${accounts.stdout || ''}\\n${accounts.stderr || ''}`.trim()\n accountsHint = hsTimedOut(accounts) ? 'timed out' : output || null\n authenticated =\n !hsTimedOut(accounts) &&\n accounts.status === 0 &&\n /Account:|portalId|portal/i.test(output) &&\n !/No accounts/i.test(output)\n }\n\n return { hsCliInstalled, hsCliVersion, authenticated, accountsHint }\n}\n\nexport type HubSpotSetupAssessment = HubSpotConfigFileAssessment & {\n hsCliInstalled: boolean\n hsCliVersion: string | null\n authenticated: boolean\n accountsHint: string | null\n}\n\nexport function assessHubSpotCliSetup(\n projectRoot: string,\n options: { checkAccounts?: boolean } = {},\n): HubSpotSetupAssessment {\n return {\n ...assessHubSpotConfigFiles(projectRoot),\n ...runHubSpotCliChecks(projectRoot, options),\n }\n}\n\nexport function hubSpotSetupRemediation(\n projectRoot: string,\n assessment: HubSpotSetupAssessment = assessHubSpotCliSetup(projectRoot),\n): string[] {\n const steps: string[] = []\n\n if (!assessment.hsCliInstalled) {\n steps.push('Install HubSpot CLI: npm i -g @hubspot/cli')\n }\n\n if (!assessment.configPresent) {\n if (assessment.examplePresent) {\n steps.push(`Run wp setup (copies ${HUBSPOT_CONFIG_EXAMPLE} → ${HUBSPOT_CONFIG_FILE}) and add portal + PAT`)\n } else {\n steps.push(`Create ${HUBSPOT_CONFIG_FILE} (see docs/HUBSPOT-CLI-SETUP.md)`)\n }\n steps.push('Generate a PAT: https://app.hubspot.com/l/personal-access-key')\n } else if (assessment.looksLikePlaceholder) {\n steps.push(`Edit ${HUBSPOT_CONFIG_FILE} — replace placeholder portalId and personalAccessKey`)\n }\n\n if (assessment.configPresent && !assessment.looksLikePlaceholder && !assessment.authenticated) {\n steps.push('Run wp auth (or hs auth) and confirm with: hs accounts list')\n }\n\n return steps\n}\n\nexport type HubSpotSetupMode = 'local' | 'cms'\n\nfunction hubSpotLocalDevRemediation(files: HubSpotConfigFileAssessment): string[] {\n const steps: string[] = []\n\n if (!files.configPresent) {\n if (files.examplePresent) {\n steps.push(`Run wp setup (copies ${HUBSPOT_CONFIG_EXAMPLE} → ${HUBSPOT_CONFIG_FILE}) and add portal + PAT`)\n } else {\n steps.push(`Create ${HUBSPOT_CONFIG_FILE} (see docs/HUBSPOT-CLI-SETUP.md)`)\n }\n steps.push('Generate a PAT: https://app.hubspot.com/l/personal-access-key')\n } else if (files.looksLikePlaceholder) {\n steps.push(`Edit ${HUBSPOT_CONFIG_FILE} — replace placeholder portalId and personalAccessKey`)\n }\n\n return steps\n}\n\nfunction cmsEnsureAssessment(projectRoot: string): HubSpotSetupAssessment {\n return assessHubSpotCliSetup(projectRoot, { checkAccounts: false })\n}\n\nfunction throwCmsConfigError(_ctx: CommandContext, files: HubSpotConfigFileAssessment): never {\n const steps = hubSpotLocalDevRemediation(files)\n throw new WpHsError('HubSpot config is not ready for cms watch/upload in this project.', {\n exitCode: ExitCode.PREREQUISITE,\n remediation: steps.join('; '),\n })\n}\n\n/**\n * Filesystem-only CMS prereq — no `hs` subprocess (safe for wp watch; Ctrl+C stays responsive).\n */\nexport function ensureHubSpotConfigForCms(ctx: CommandContext): void {\n if (ctx.global.dryRun || ctx.global.json) return\n\n const files = assessHubSpotConfigFiles(ctx.projectRoot)\n if (files.configPresent && !files.looksLikePlaceholder) return\n\n throwCmsConfigError(ctx, files)\n}\n\n/**\n * Warn (local dev) or require (upload/deploy) HubSpot CLI project setup.\n * CMS mode: hubspot.config.yml + `hs --version` (5s timeout) — no `hs accounts list`.\n * Use {@link ensureHubSpotConfigForCms} for wp watch (long-running TTY).\n */\nexport function ensureHubSpotCliSetup(ctx: CommandContext, mode: HubSpotSetupMode): void {\n if (ctx.global.dryRun || ctx.global.json) return\n\n if (mode === 'local') {\n const files = assessHubSpotConfigFiles(ctx.projectRoot)\n if (files.configPresent && !files.looksLikePlaceholder) {\n return\n }\n\n const steps = hubSpotLocalDevRemediation(files)\n ctx.logger.warn(\n 'HubSpot upload/watch is not configured for this project (local preview still works).',\n )\n for (const step of steps) {\n ctx.logger.info(` → ${step}`)\n }\n ctx.logger.info(' → Full HubSpot CLI checks: wp doctor')\n ctx.logger.info(' → Docs: @woodsportal/hubspot-kit/docs/HUBSPOT-CLI-SETUP.md')\n return\n }\n\n const assessment = cmsEnsureAssessment(ctx.projectRoot)\n const needsSetup =\n !assessment.hsCliInstalled ||\n !assessment.configPresent ||\n assessment.looksLikePlaceholder\n\n if (!needsSetup) return\n\n const steps = hubSpotSetupRemediation(ctx.projectRoot, assessment)\n const headline = 'HubSpot CLI is not ready for cms upload/watch in this project.'\n\n throw new WpHsError(headline, {\n exitCode: ExitCode.PREREQUISITE,\n remediation: steps.join('; '),\n })\n}\n\nexport function doctorHubSpotChecks(projectRoot: string): Array<{\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'warn' | 'error'\n}> {\n const assessment = assessHubSpotCliSetup(projectRoot, { checkAccounts: true })\n const steps = hubSpotSetupRemediation(projectRoot, assessment)\n const remediation = steps.length > 0 ? steps.join(' · ') : undefined\n\n return [\n {\n name: 'hubspot-cli',\n ok: assessment.hsCliInstalled,\n message: assessment.hsCliInstalled\n ? `HubSpot CLI ${assessment.hsCliVersion ?? ''}`.trim()\n : 'HubSpot CLI not installed',\n remediation: assessment.hsCliInstalled ? undefined : 'npm i -g @hubspot/cli',\n severity: 'error',\n },\n {\n name: 'hubspot-config',\n ok: assessment.configPresent && !assessment.looksLikePlaceholder,\n message: !assessment.configPresent\n ? `${HUBSPOT_CONFIG_FILE} missing (required for wp upload / wp watch)`\n : assessment.looksLikePlaceholder\n ? `${HUBSPOT_CONFIG_FILE} still has placeholder values`\n : `${HUBSPOT_CONFIG_FILE} present`,\n remediation,\n severity: 'warn',\n },\n {\n name: 'hubspot-auth',\n ok: assessment.authenticated,\n message: assessment.authenticated\n ? 'HubSpot CLI authenticated for this project'\n : assessment.accountsHint === 'timed out'\n ? 'HubSpot CLI auth check timed out — run hs accounts list manually'\n : 'HubSpot CLI not authenticated (or no portal in hubspot.config.yml)',\n remediation: assessment.authenticated ? undefined : 'wp auth · hs accounts list',\n severity: 'warn',\n },\n ]\n}\n","/** Dev deps required for `wp dev` (Vite preset peer dependencies). */\nexport const VITE_DEV_PEER_DEPS: Record<string, string> = {\n vite: '^6.1.0',\n '@vitejs/plugin-react': '^4.3.4',\n 'babel-plugin-react-compiler': '^1.0.0',\n '@tailwindcss/vite': '^4.0.6',\n '@tanstack/router-plugin': '^1.121.2',\n '@tanstack/react-router': '^1.121.2',\n '@dnd-kit/core': '^6.3.1',\n '@dnd-kit/sortable': '^10.0.0',\n '@dnd-kit/utilities': '^3.2.2',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n tailwindcss: '^4.0.6',\n}\n\nexport const KIT_DEV_DEP = '@woodsportal/hubspot-kit'\n\n/** Latest kit version pinned in `wp init` scaffolds. Keep aligned with package.json. */\nexport const KIT_DEV_DEP_VERSION = '^1.0.26'\n\n/** Required for module-config overlay UI (HsRepeaterList drag-and-drop). */\nexport const MODULE_CONFIG_UI_DEPS = [\n '@dnd-kit/core',\n '@dnd-kit/sortable',\n '@dnd-kit/utilities',\n] as const\n\nexport function templateDevDependencies(): Record<string, string> {\n return {\n [KIT_DEV_DEP]: KIT_DEV_DEP_VERSION,\n ...VITE_DEV_PEER_DEPS,\n }\n}\n","import { validateConfigFile } from '../../lib/config.js'\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport async function runConfigValidate(ctx: CommandContext): Promise<number> {\n const result = validateConfigFile(ctx.projectRoot)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'config validate',\n valid: result.valid,\n errors: result.errors,\n config: result.config,\n })\n } else if (result.valid) {\n ctx.logger.success(`${WOODSCLI_CONFIG_FILE} is valid`)\n } else {\n for (const err of result.errors) {\n ctx.logger.error(err)\n }\n }\n\n return result.valid ? ExitCode.SUCCESS : ExitCode.USER_ERROR\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { printCommandDone, runCliTasks, type CliTask } from '../../lib/cli-spinner.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER, type BuildTier } from '../../lib/build-tier.js'\nimport { isThemeProject, usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type { BuildTier }\n\nexport type BuildOptions = {\n tier?: BuildTier\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n progress?: boolean\n}\n\nfunction tierToStgFlag(tier: BuildTier): string[] {\n return tier === 'dev' || tier === 'stg' ? ['--stg'] : []\n}\n\nfunction buildTasks(\n ctx: CommandContext,\n options: BuildOptions,\n run: (script: string, args?: string[]) => void,\n): CliTask[] {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const isTheme = isThemeProject(ctx.config)\n const useCdn = usesCdnPipeline(ctx.config) && !isTheme\n const tasks: CliTask[] = []\n\n if (isTheme && !options.cdnOnly) {\n return tasks\n }\n\n if (ctx.config.projectType === 'module-monolith' && !options.cdnOnly) {\n tasks.push({\n title: `Building monolith module (${tier})`,\n task: async () => {\n run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.monolith.mjs'),\n ...tierToStgFlag(tier),\n ])\n run('run-hubspot-module-postbuild.mjs')\n },\n })\n return tasks\n }\n\n if (!options.hubspotOnly && useCdn) {\n tasks.push({\n title: `Building CDN (${tier})`,\n task: async () => {\n if (options.cdnEsm) {\n run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.cdn-esm.mjs'),\n ...tierToStgFlag(tier),\n ])\n } else {\n run('build-cdn.mjs', tierToStgFlag(tier))\n }\n run('generate-cdn-manifest.mjs')\n },\n })\n }\n\n if (!options.cdnOnly) {\n tasks.push({\n title: `Building HubSpot module (${tier})`,\n task: async () => {\n run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.hubspot.mjs'),\n ...tierToStgFlag(tier),\n ])\n run('run-hubspot-module-postbuild.mjs')\n },\n })\n }\n\n if (!options.cdnOnly && !options.hubspotOnly) {\n tasks.push({\n title: 'Running bundle checks',\n task: async () => {\n run('check-hubspot-bundle-size.mjs')\n run('write-audit-artifacts.mjs')\n },\n })\n }\n\n return tasks\n}\n\nexport async function runBuild(ctx: CommandContext, options: BuildOptions): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const env = { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot }\n const isTheme = isThemeProject(ctx.config)\n\n const execOpts = {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n }\n\n const run = (script: string, args: string[] = []) => {\n runNodeScript(kitPath('scripts', script), args, execOpts)\n }\n\n try {\n if (isTheme && !options.cdnOnly) {\n if (ctx.global.json) {\n ctx.logger.json({ command: 'build', tier, ok: true, projectType: ctx.config.projectType })\n } else if (!options.progress) {\n ctx.logger.info('Theme project — skipping CDN/module.js build (use wp upload for theme assets)')\n printCommandDone(ctx, 'Theme build complete (no-op)')\n } else {\n await runCliTasks(\n ctx,\n [{ title: 'Theme project (no module build)', task: async () => {} }],\n options,\n )\n printCommandDone(ctx, 'Theme build complete (no-op)')\n }\n return ExitCode.SUCCESS\n }\n\n const tasks = buildTasks(ctx, options, run)\n await runCliTasks(ctx, tasks, options)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'build',\n tier,\n ok: true,\n outDir: resolve(ctx.projectRoot, ctx.config.module.outDir),\n })\n } else {\n printCommandDone(ctx, 'Build complete')\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.BUILD_FAILED,\n })\n }\n}\n","export type BuildTier = 'dev' | 'stg' | 'prod'\n\n/** Default tier for wp build / deploy / publish / upload / watch */\nexport const DEFAULT_BUILD_TIER: BuildTier = 'dev'\n\nexport function parseBuildTier(value: string | undefined): BuildTier {\n if (value === 'dev' || value === 'stg' || value === 'prod') return value\n return DEFAULT_BUILD_TIER\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { spawn } from 'node:child_process'\n\nimport { printWoodsCliDevBanner } from '../../lib/cli-banner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { resolveDevViteConfigPath, resolveProjectViteBin } from '../../vite/resolve-dev-config.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DevOptions = {\n port?: number\n}\n\nexport async function runDev(ctx: CommandContext, options: DevOptions): Promise<number> {\n const port = options.port ?? 3000\n const env = {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n }\n\n const configPath = resolveDevViteConfigPath(ctx.projectRoot)\n const viteBin = resolveProjectViteBin(ctx.projectRoot)\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] ${viteBin} --config ${configPath} --port ${port}`)\n return ExitCode.SUCCESS\n }\n\n if (viteBin === 'vite') {\n throw new WpHsError('vite is not installed in this project.', {\n exitCode: ExitCode.PREREQUISITE,\n remediation:\n 'Run yarn install or npm install. If this is an older wp init project, add vite and peers to devDependencies (run wp init again or see @woodsportal/hubspot-kit templates).',\n })\n }\n\n const consumerConfig = resolve(ctx.projectRoot, 'vite.config.dev.mjs')\n if (!existsSync(consumerConfig)) {\n throw new WpHsError('vite.config.dev.mjs is missing in the project root.', {\n exitCode: ExitCode.USER_ERROR,\n remediation:\n 'Add vite.config.dev.mjs (see @woodsportal/hubspot-kit templates/module-hybrid-cdn).',\n })\n }\n\n printWoodsCliDevBanner({\n config: ctx.config,\n port,\n global: ctx.global,\n })\n\n return new Promise((resolvePromise) => {\n const child = spawn(\n viteBin,\n ['--config', configPath, '--port', String(port), '--mode', 'dev'],\n {\n cwd: ctx.projectRoot,\n env,\n stdio: 'inherit',\n },\n )\n\n // Non-blocking — avoid `hs` subprocess (~3–5s) before Vite binds the port.\n setImmediate(() => ensureHubSpotCliSetup(ctx, 'local'))\n\n child.on('exit', (code) => {\n resolvePromise(code ?? ExitCode.USER_ERROR)\n })\n })\n}\n","import pc from 'picocolors'\n\nimport type { GlobalCliOptions } from '../cli/context.js'\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { isThemeProject } from '../schema/woodsportal-hs.js'\n\nimport { readKitVersion } from './kit-version.js'\n\n/** Figlet \"big\" font — spells WoodsCLI (not WoodsPortal). */\nexport const WOODSCLI_ASCII_BANNER = `\n __ __ _ _____ _ _____ \n \\\\ \\\\ / / | | / ____| | |_ _|\n \\\\ \\\\ /\\\\ / /__ ___ __| |___| | | | | | \n \\\\ \\\\/ \\\\/ / _ \\\\ / _ \\\\ / _\\` / __| | | | | | \n \\\\ /\\\\ / (_) | (_) | (_| \\\\__ \\\\ |____| |____ _| |_ \n \\\\/ \\\\/ \\\\___/ \\\\___/ \\\\__,_|___/\\\\_____|______|_____|\n`.trimEnd()\n\nconst RULE = '──────────────────────────────────────────────────────────────────────────────'\n\nexport function shouldPrintCliBanner(global: GlobalCliOptions): boolean {\n if (global.json || global.quiet || global.ci || global.dryRun) {\n return false\n }\n return process.stdout.isTTY === true\n}\n\nfunction useCliColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false\n if (process.env.CI === 'true') return false\n return process.stdout.isTTY === true\n}\n\nexport function formatProjectLabel(config: WoodsPortalHsConfig): string {\n if (isThemeProject(config)) {\n return `${config.theme?.name ?? 'theme'} · theme-starter`\n }\n\n const router = config.scaffold?.router\n const routerNote =\n router && router !== 'hash' ? ` · router ${router}` : ' · hash router'\n\n return `${config.module.name} · ${config.projectType}${routerNote}`\n}\n\nexport type DevBannerOptions = {\n config: WoodsPortalHsConfig\n port: number\n global: GlobalCliOptions\n version?: string\n}\n\nfunction section(color: boolean, title: string, body: string): string {\n const bold = (text: string) => (color ? pc.bold(text) : text)\n return ` ${bold(title)}\\n${body}`\n}\n\n/** Branded startup banner for `wp dev` — matches client-sdk dev-watch layout. */\nexport function printWoodsCliDevBanner(options: DevBannerOptions): void {\n if (!shouldPrintCliBanner(options.global)) {\n return\n }\n\n const color = useCliColor()\n const cyan = (text: string) => (color ? pc.cyan(text) : text)\n const dim = (text: string) => (color ? pc.dim(text) : text)\n const bold = (text: string) => (color ? pc.bold(text) : text)\n const yellow = (text: string) => (color ? pc.yellow(text) : text)\n\n const version = options.version ?? readKitVersion()\n const project = formatProjectLabel(options.config)\n const isTheme = isThemeProject(options.config)\n const localUrl = `http://localhost:${options.port}/`\n const docsRoot = 'node_modules/@woodsportal/hubspot-kit/docs'\n\n const header = [\n color\n ? WOODSCLI_ASCII_BANNER.split('\\n')\n .map((line) => cyan(bold(line)))\n .join('\\n')\n : WOODSCLI_ASCII_BANNER,\n ` ${bold('HubSpot kit')}${dim(` v${version}`)} ${yellow('· dev')}`,\n ].join('\\n')\n\n const outputLine = isTheme\n ? ' Vite HMR + theme field overlay (Ctrl+Shift+Z)'\n : ' Vite HMR + module-config overlay (Ctrl+Shift+Z)'\n\n const quickChecks = isTheme\n ? ` wp doctor prerequisites + HubSpot CLI\n wp dev alias: wp local\n wp upload cms theme upload`\n : ` wp doctor prerequisites + HubSpot CLI\n wp setup copy missing config / .env templates\n wp build module.js / CDN (tier defaults dev)\n wp upload cms module upload`\n\n const tips = [\n dim(RULE),\n section(color, 'Output', ` ${outputLine}`),\n '',\n section(color, 'Project', ` ${project}`),\n '',\n section(color, 'Preview', ` ${color ? cyan(localUrl) : localUrl}`),\n '',\n section(\n color,\n 'Overlay',\n ` Ctrl+Shift+Z ${isTheme ? 'theme' : 'module'} fields ${dim('(Mac ⌃⇧Z)')}`,\n ),\n '',\n section(\n color,\n 'Workspace',\n ` ${dim('.wphs/')} · ${options.config.dev.fieldsJson}`,\n ),\n '',\n section(color, 'Quick checks', `\\n${quickChecks}`),\n '',\n section(\n color,\n 'Docs',\n ` ${docsRoot}/CLI-REFERENCE.md · ${docsRoot}/MODULES.md`,\n ),\n dim(RULE),\n ].join('\\n')\n\n process.stdout.write(`\\n${header}\\n\\n${tips}\\n\\n`)\n process.stdout.write(`${dim('Starting Vite dev…')}\\n\\n`)\n}\n","import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { getKitRoot } from './paths.js'\n\nlet cachedVersion: string | null = null\n\nexport function readKitVersion(): string {\n if (cachedVersion) {\n return cachedVersion\n }\n\n try {\n const pkg = JSON.parse(readFileSync(resolve(getKitRoot(), 'package.json'), 'utf8')) as {\n version?: string\n }\n cachedVersion = pkg.version ?? '0.0.0'\n } catch {\n cachedVersion = '0.0.0'\n }\n\n return cachedVersion\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { kitPath } from '../lib/paths.js'\n\nconst CONSUMER_DEV_CONFIG = 'vite.config.dev.mjs'\n\n/**\n * Vite resolves config dependencies from the config file's package context.\n * The preset must be re-exported from the consumer repo (vite.config.dev.mjs)\n * so `vite` and plugins resolve from the project's node_modules.\n */\nexport function resolveDevViteConfigPath(projectRoot: string): string {\n const consumerConfig = resolve(projectRoot, CONSUMER_DEV_CONFIG)\n if (existsSync(consumerConfig)) {\n return consumerConfig\n }\n return kitPath('vite', 'vite.config.dev.mjs')\n}\n\nexport function resolveProjectViteBin(projectRoot: string): string {\n const localBin = resolve(projectRoot, 'node_modules', '.bin', 'vite')\n if (existsSync(localBin)) {\n return localBin\n }\n return 'vite'\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { printCommandDone, runCliTasks, type CliTask } from '../../lib/cli-spinner.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport { isThemeProject, usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport { runBuild } from './build.js'\nimport { runPublish } from './publish.js'\nimport { runUpload } from './upload.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DeployOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n skipPublish?: boolean\n progress?: boolean\n}\n\nexport async function runDeploy(ctx: CommandContext, options: DeployOptions): Promise<number> {\n ensureHubSpotCliSetup(ctx, 'cms')\n\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const env = { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot }\n const execOpts = {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n }\n\n const useCdn = usesCdnPipeline(ctx.config) && !isThemeProject(ctx.config)\n const nested = { progress: false as const }\n\n const tasks: CliTask[] = []\n\n if (useCdn) {\n tasks.push({\n title: `Building CDN (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, cdnOnly: true, ...nested })\n },\n })\n\n if (!options.skipPublish) {\n tasks.push({\n title: `Publishing CDN (${tier})`,\n task: async () => {\n await runPublish(ctx, { tier, ...nested })\n },\n })\n }\n\n tasks.push({\n title: `Building HubSpot module (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, hubspotOnly: true, ...nested })\n },\n })\n } else {\n tasks.push({\n title: `Building module (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, ...nested })\n },\n })\n }\n\n tasks.push(\n {\n title: 'Running bundle checks',\n task: async () => {\n runNodeScript(kitPath('scripts', 'check-hubspot-bundle-size.mjs'), [], execOpts)\n runNodeScript(kitPath('scripts', 'write-audit-artifacts.mjs'), [], execOpts)\n },\n },\n {\n title: 'Uploading to HubSpot',\n task: async () => {\n await runUpload(ctx, { tier, ...nested, quiet: true, skipPrereqCheck: true })\n },\n },\n )\n\n await runCliTasks(ctx, tasks, options)\n\n if (!ctx.global.json) {\n printCommandDone(\n ctx,\n `Deploy complete (${resolve(ctx.projectRoot, ctx.config.module.outDir)} → ${ctx.config.module.uploadPath})`,\n )\n }\n return ExitCode.SUCCESS\n}\n","import { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport { usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type PublishOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n dryRun?: boolean\n progress?: boolean\n}\n\nexport async function runPublish(ctx: CommandContext, options: PublishOptions): Promise<number> {\n if (!usesCdnPipeline(ctx.config)) {\n throw new WpHsError('This project does not use the CDN pipeline.', {\n exitCode: ExitCode.USER_ERROR,\n remediation:\n 'module-monolith / cdn.mode none: use wp build && wp upload (or wp deploy without CDN publish).',\n })\n }\n\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const env = { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot }\n const execOpts = {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun || options.dryRun,\n }\n\n const verifyFlag = tier === 'prod' ? ['--prod'] : ['--stg']\n const publishArgs = options.dryRun ? ['--dry-run'] : []\n\n try {\n await runCliTasks(\n ctx,\n [\n {\n title: `Verifying CDN API endpoint (${tier})`,\n task: async () => {\n if (options.dryRun) return\n runNodeScript(kitPath('scripts', 'verify-cdn-api-endpoint.mjs'), verifyFlag, execOpts)\n },\n },\n {\n title: options.dryRun ? `CDN publish dry-run (${tier})` : `Publishing CDN (${tier})`,\n task: async () => {\n runNodeScript(kitPath('scripts', 'publish-cdn-github.mjs'), publishArgs, execOpts)\n },\n },\n ],\n options,\n )\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'publish', tier, dryRun: Boolean(options.dryRun), ok: true })\n } else {\n printCommandDone(\n ctx,\n options.dryRun ? 'CDN publish dry-run complete' : 'CDN publish complete',\n )\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.PUBLISH_FAILED,\n remediation: 'Check CDN PAT, portal.cdn.json, and verify-cdn-api-endpoint.',\n })\n }\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { runCommand } from '../../lib/exec.js'\nimport { isThemeProject } from '../../schema/woodsportal-hs.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport type { CommandContext } from '../context.js'\n\nexport type UploadOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n progress?: boolean\n /** Suppress success line (e.g. when called from deploy) */\n quiet?: boolean\n /** Skip HubSpot CLI check when a parent command already verified */\n skipPrereqCheck?: boolean\n}\n\nasync function uploadModuleOrTheme(ctx: CommandContext): Promise<string> {\n if (isThemeProject(ctx.config)) {\n const theme = ctx.config.theme\n if (!theme) {\n throw new WpHsError('theme block missing in woodscli.json', { exitCode: ExitCode.USER_ERROR })\n }\n const srcDir = resolve(ctx.projectRoot, theme.srcDir)\n runCommand('hs', ['cms', 'upload', srcDir, theme.uploadPath], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n return `Uploaded theme ${srcDir} → ${theme.uploadPath}`\n }\n\n const outDir = resolve(ctx.projectRoot, ctx.config.module.outDir)\n const uploadPath = ctx.config.module.uploadPath\n runCommand('hs', ['cms', 'upload', outDir, uploadPath], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n return `Uploaded ${outDir} → ${uploadPath}`\n}\n\nexport async function runUpload(ctx: CommandContext, options: UploadOptions = {}): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n\n if (tier === 'prod' && !ctx.global.yes && !ctx.global.ci) {\n const confirmed = process.env.WP_HS_CONFIRM_PROD === '1'\n if (!confirmed) {\n throw new WpHsError('Production upload blocked — pass --yes or set WP_HS_CONFIRM_PROD=1', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp upload --tier prod --yes',\n })\n }\n }\n\n if (!options.skipPrereqCheck) {\n ensureHubSpotCliSetup(ctx, 'cms')\n }\n\n try {\n let successMessage = ''\n\n await runCliTasks(\n ctx,\n [\n {\n title: isThemeProject(ctx.config) ? 'Uploading theme to HubSpot' : 'Uploading module to HubSpot',\n task: async () => {\n successMessage = await uploadModuleOrTheme(ctx)\n },\n },\n ],\n options,\n )\n\n if (!ctx.global.json && !options.quiet) {\n printCommandDone(ctx, successMessage)\n }\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError('HubSpot upload failed', {\n exitCode: ExitCode.PUBLISH_FAILED,\n cause: error,\n remediation: 'Run wp auth, then build the module before upload.',\n })\n }\n}\n","import { createHash } from 'node:crypto'\nimport { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { defaultBaselineDir } from '../../lib/wphs-baseline.js'\nimport type { CommandContext } from '../context.js'\n\nconst FORBIDDEN_SHIP_TOKENS = [\n 'ModuleConfigOverlay',\n 'module-config-store',\n '__dev/module-config',\n 'src/dev/module-config',\n 'dev.module-config',\n]\n\nfunction hashFile(path: string): string {\n return createHash('sha256').update(readFileSync(path)).digest('hex')\n}\n\nfunction walkFiles(dir: string): string[] {\n if (!existsSync(dir)) return []\n const entries = readdirSync(dir)\n const files: string[] = []\n for (const entry of entries) {\n const full = join(dir, entry)\n if (statSync(full).isDirectory()) {\n files.push(...walkFiles(full))\n } else {\n files.push(full)\n }\n }\n return files\n}\n\nexport async function runAuditShipBundle(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const targets = [\n resolve(root, 'dist/cdn'),\n resolve(root, ctx.config.module.outDir),\n ]\n\n const violations: string[] = []\n\n for (const dir of targets) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(js|css|html)$/i.test(file)) continue\n const content = readFileSync(file, 'utf8')\n for (const token of FORBIDDEN_SHIP_TOKENS) {\n if (content.includes(token)) {\n violations.push(`${file}: contains forbidden token \"${token}\"`)\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:ship-bundle', ok: violations.length === 0, violations })\n } else if (violations.length === 0) {\n ctx.logger.success('Ship bundle audit passed')\n } else {\n for (const v of violations) ctx.logger.error(v)\n }\n\n if (violations.length > 0) {\n throw new WpHsError('Ship bundle audit failed — dev tooling leaked into production artifacts', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Ensure dev-only code is not imported in production build graph.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n\nexport type ParityOptions = {\n baselineDir?: string\n}\n\nexport type BaselineOptions = {\n baselineDir?: string\n}\n\nexport async function runAuditBaselineCapture(\n ctx: CommandContext,\n options: BaselineOptions,\n): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const sources = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would capture baseline to ${baseline}`)\n return ExitCode.SUCCESS\n }\n\n for (const { label, path } of sources) {\n if (!existsSync(path)) {\n throw new WpHsError(`Cannot capture baseline — missing ${path}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp build before wp audit baseline --capture.',\n })\n }\n const target = resolve(baseline, label)\n rmSync(target, { recursive: true, force: true })\n mkdirSync(baseline, { recursive: true })\n cpSync(path, target, { recursive: true })\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:baseline', ok: true, baseline })\n } else {\n ctx.logger.success(`Baseline captured at ${baseline}`)\n }\n\n return ExitCode.SUCCESS\n}\n\nexport async function runAuditParity(ctx: CommandContext, options: ParityOptions): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const currentDirs = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n const mismatches: string[] = []\n\n for (const { label, path } of currentDirs) {\n const baselinePath = resolve(baseline, label)\n if (!existsSync(baselinePath)) {\n ctx.logger.warn(`No baseline at ${baselinePath} — skipping ${label} parity`)\n continue\n }\n\n const baselineFiles = walkFiles(baselinePath).filter((f) => !f.endsWith('.map'))\n const currentFiles = walkFiles(path).filter((f) => !f.endsWith('.map'))\n\n const baselineNames = new Set(baselineFiles.map((f) => f.replace(baselinePath, '')))\n const currentNames = new Set(currentFiles.map((f) => f.replace(path, '')))\n\n for (const name of baselineNames) {\n if (!currentNames.has(name)) {\n mismatches.push(`missing file: ${label}${name}`)\n }\n }\n\n for (const file of baselineFiles) {\n const rel = file.replace(baselinePath, '')\n const current = resolve(path, rel.slice(1))\n if (!existsSync(current)) continue\n const bh = hashFile(file)\n const ch = hashFile(current)\n if (bh !== ch) {\n mismatches.push(`hash mismatch: ${label}${rel}`)\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:parity', ok: mismatches.length === 0, mismatches })\n } else if (mismatches.length === 0) {\n ctx.logger.success('Parity audit passed (or no baseline configured)')\n } else {\n for (const m of mismatches) ctx.logger.error(m)\n }\n\n if (mismatches.length > 0) {\n throw new WpHsError('Parity audit failed', { exitCode: ExitCode.AUDIT_FAILED })\n }\n\n return ExitCode.SUCCESS\n}\n\nconst SECRET_PATTERNS = [\n /(?:api[_-]?key|secret|password|token|private[_-]?key)\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/gi,\n /sk_live_[a-zA-Z0-9]{16,}/g,\n /pat-[a-z]{2}-[a-f0-9-]{20,}/gi,\n]\n\nexport async function runAuditSecrets(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const scanRoots = ['src', 'public', '.wphs/config'].map((d) => resolve(root, d))\n const findings: string[] = []\n\n for (const dir of scanRoots) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(ts|tsx|js|jsx|json|env|yml|yaml|html)$/i.test(file)) continue\n if (file.includes('node_modules')) continue\n const content = readFileSync(file, 'utf8')\n for (const pattern of SECRET_PATTERNS) {\n pattern.lastIndex = 0\n if (pattern.test(content)) {\n findings.push(`${file}: possible secret pattern matched`)\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:secrets', ok: findings.length === 0, findings })\n } else if (findings.length === 0) {\n ctx.logger.success('Secrets audit passed')\n } else {\n for (const f of findings) ctx.logger.error(f)\n }\n\n if (findings.length > 0) {\n throw new WpHsError('Secrets audit found potential credentials in source files', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Move secrets to env vars; never commit PATs or API keys.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { templateDevDependencies } from '../../lib/template-dev-deps.js'\nimport { DEFAULT_WOODSPORTAL_HS, type WoodsPortalHsConfig } from '../../schema/woodsportal-hs.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport {\n applyRouterScaffold,\n isModuleTemplate,\n type RouterScaffoldMode,\n} from '../../lib/init-router-scaffold.js'\nimport { copySharedSetupExamples } from '../../lib/project-setup.js'\nimport type { CommandContext } from '../context.js'\n\nexport type InitOptions = {\n template?: 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\n /** Full target directory (skips name prompt when set). */\n directory?: string\n /** Project slug — creates `<parent>/<name>/` (default parent: cwd). */\n name?: string\n /** Client routing: hash (client-frontend default), browser, or none */\n router?: RouterScaffoldMode\n}\n\nconst TEMPLATE_SCRIPTS: Record<string, Record<string, string>> = {\n 'module-hybrid-cdn': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:prod': 'wp build --tier prod',\n 'build:dev': 'wp build --tier dev',\n 'deploy:prod': 'wp deploy --tier prod --yes',\n 'deploy:dev': 'wp deploy --tier dev --yes',\n doctor: 'wp doctor',\n },\n 'module-monolith': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:dev': 'wp build --tier dev',\n 'build:prod': 'wp build --tier prod',\n 'deploy:dev': 'wp deploy --tier dev --yes',\n 'deploy:prod': 'wp deploy --tier prod --yes',\n watch: 'wp watch --rebuild',\n doctor: 'wp doctor',\n },\n 'theme-starter': {\n dev: 'wp dev',\n local: 'wp dev',\n doctor: 'wp doctor',\n },\n}\n\nimport {\n moduleOutDirFromSlug,\n normalizeProjectName,\n validateProjectName,\n} from '../../lib/project-name.js'\n\nfunction buildConfigForProject(\n template: InitOptions['template'],\n projectName: string,\n router?: RouterScaffoldMode,\n): WoodsPortalHsConfig {\n const base = { ...DEFAULT_WOODSPORTAL_HS, projectType: template! }\n\n if (template === 'theme-starter') {\n return {\n ...base,\n theme: {\n name: projectName,\n uploadPath: `themes/${projectName}`,\n srcDir: 'src/theme',\n themeJson: 'src/theme/theme.json',\n },\n }\n }\n\n const config: WoodsPortalHsConfig = {\n ...base,\n module: {\n name: projectName,\n uploadPath: `dw-modules/${projectName}.module`,\n outDir: moduleOutDirFromSlug(projectName),\n },\n cdn: {\n ...base.cdn,\n mode: template === 'module-monolith' ? 'none' : base.cdn.mode,\n },\n }\n\n if (isModuleTemplate(template!) && router) {\n config.scaffold = { router }\n }\n\n return config\n}\n\nfunction assertTargetDirIsScaffoldable(targetDir: string): void {\n if (!existsSync(targetDir)) return\n\n const entries = readdirSync(targetDir).filter((entry) => entry !== '.DS_Store')\n if (entries.length > 0) {\n throw new WpHsError(`Target directory is not empty: ${targetDir}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Choose a different project name or remove existing files.',\n })\n }\n}\n\nfunction resolveInitTargetDir(options: InitOptions, interactiveName?: string): string {\n if (options.directory) {\n return resolve(options.directory)\n }\n\n const parentDir = process.cwd()\n const slug = options.name ?? interactiveName\n if (!slug) {\n throw new WpHsError('Project name is required', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run interactively, or pass --name my-project (or --directory ./my-project).',\n })\n }\n\n const error = validateProjectName(slug)\n if (error) {\n throw new WpHsError(error, { exitCode: ExitCode.USER_ERROR })\n }\n\n return resolve(parentDir, slug)\n}\n\nexport async function runInit(ctx: CommandContext, options: InitOptions): Promise<number> {\n const nonInteractive = ctx.global.ci || ctx.global.yes || ctx.global.json\n\n let template = options.template\n let projectName = options.name ? normalizeProjectName(options.name) : undefined\n let router = options.router\n\n if (!nonInteractive) {\n if (!template) {\n const type = await p.select({\n message: 'Project type',\n options: [\n {\n value: 'module-hybrid-cdn',\n label: 'Module (hybrid CDN)',\n hint: 'jsDelivr + thin module.js',\n },\n { value: 'module-monolith', label: 'Module (monolith)', hint: 'Single module.js IIFE' },\n { value: 'theme-starter', label: 'Theme starter', hint: 'CMS theme templates' },\n ],\n })\n if (p.isCancel(type)) throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n template = type as InitOptions['template']\n }\n\n if (!options.directory && !projectName) {\n const nameAnswer = await p.text({\n message: 'Project name (folder name)',\n placeholder: 'my-portal-module',\n validate: (value) => validateProjectName(normalizeProjectName(value ?? '')),\n })\n if (p.isCancel(nameAnswer)) {\n throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n projectName = normalizeProjectName(nameAnswer)\n }\n\n if (!router && template && isModuleTemplate(template)) {\n const routerAnswer = await p.select({\n message: 'Client-side routing',\n initialValue: 'hash',\n options: [\n {\n value: 'hash',\n label: 'Hash history (recommended)',\n hint: 'Same as woodsportal-client-frontend — works in HubSpot CMS embeds',\n },\n {\n value: 'browser',\n label: 'Browser history',\n hint: 'Clean /guide URLs for local dev (not for HubSpot iframe embeds)',\n },\n {\n value: 'none',\n label: 'No router',\n hint: 'Single-page starter — add TanStack Router later',\n },\n ],\n })\n if (p.isCancel(routerAnswer)) {\n throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n router = routerAnswer as RouterScaffoldMode\n }\n }\n\n if (!template) {\n template = 'module-hybrid-cdn'\n }\n\n if (!router && isModuleTemplate(template)) {\n router = 'hash'\n }\n\n const targetDir = resolveInitTargetDir(options, projectName)\n const slug = projectName ?? basename(targetDir)\n assertTargetDirIsScaffoldable(targetDir)\n\n const templateDir = kitPath('templates', template)\n if (!existsSync(templateDir)) {\n throw new WpHsError(`Template not found: ${template}`, { exitCode: ExitCode.USER_ERROR })\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would scaffold ${template} in ${targetDir}`)\n return ExitCode.SUCCESS\n }\n\n mkdirSync(targetDir, { recursive: true })\n cpSync(templateDir, targetDir, { recursive: true })\n copySharedSetupExamples(targetDir)\n\n const config = buildConfigForProject(template, slug, router)\n writeFileSync(resolve(targetDir, WOODSCLI_CONFIG_FILE), `${JSON.stringify(config, null, 2)}\\n`)\n\n const pkgPath = resolve(targetDir, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n name?: string\n scripts?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n pkg.name = slug\n pkg.scripts = { ...pkg.scripts, ...TEMPLATE_SCRIPTS[template] }\n pkg.devDependencies = {\n ...pkg.devDependencies,\n ...templateDevDependencies(),\n }\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n }\n\n if (router && isModuleTemplate(template)) {\n applyRouterScaffold(targetDir, router, template)\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: targetDir,\n logger: ctx.logger,\n dryRun: false,\n })\n\n const gitignorePath = resolve(targetDir, '.gitignore')\n const gitignoreExtras = [\n 'hubspot.config.yml',\n '.wphs/config/module-config.local.json',\n '.wphs/assets/',\n '.wphs/cache/',\n '.wphs/audit/',\n '.wphs/state/',\n '.wphs/fixtures/hubspot-data.json',\n '.wphs/.kit-module-config',\n '.wphs/.kit-bootstrap.tsx',\n '.wphs/.kit-bootstrap-greenfield.tsx',\n ]\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf8') : ''\n const toAppend = gitignoreExtras.filter((line) => !existing.includes(line)).join('\\n')\n if (toAppend) {\n writeFileSync(gitignorePath, `${existing.trimEnd()}\\n${toAppend}\\n`)\n }\n\n if (!nonInteractive) {\n p.log.success(`Scaffolded ${template} in ${targetDir}`)\n p.note(`cd ${slug} && yarn install && wp setup && wp doctor && wp dev`, 'Getting started')\n } else {\n ctx.logger.success(`Scaffolded ${template} in ${targetDir}`)\n }\n\n return ExitCode.SUCCESS\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport type RouterScaffoldMode = 'hash' | 'browser' | 'none'\n\nconst ROUTER_FILES = [\n 'src/routes',\n 'src/routeTree.gen.ts',\n 'src/integrations/tanstack-router',\n 'src/config/routes.ts',\n 'src/config/router.ts',\n 'src/app.tsx',\n] as const\n\nconst TANSTACK_DEPS = ['@tanstack/react-router', '@tanstack/router-plugin'] as const\n\nexport function isModuleTemplate(template: string): boolean {\n return template === 'module-hybrid-cdn' || template === 'module-monolith'\n}\n\nexport function writeRouterConfig(targetDir: string, mode: Exclude<RouterScaffoldMode, 'none'>): void {\n const configDir = resolve(targetDir, 'src/config')\n mkdirSync(configDir, { recursive: true })\n writeFileSync(\n resolve(configDir, 'router.ts'),\n `/** Router history — set by \\`wp init\\`. Hash matches woodsportal-client-frontend (HubSpot CMS embeds). */\nexport type RouterHistoryMode = 'hash' | 'browser'\n\nexport const ROUTER_HISTORY: RouterHistoryMode = '${mode}'\n`,\n )\n}\n\nexport function writeMountDevPreviewRouter(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-dev-preview.tsx'),\n `import { mountGreenfieldDev } from '../../.wphs/.kit-bootstrap-greenfield.tsx'\n\nimport { App } from '@/app'\n\n/** Local dev: module-config overlay + routed starter preview. */\nexport async function mountDevPreview() {\n await mountGreenfieldDev({ preview: <App /> })\n}\n`,\n )\n}\n\nexport function writeMountDevPreviewSinglePage(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-dev-preview.tsx'),\n `import { mountGreenfieldDev } from '../../.wphs/.kit-bootstrap-greenfield.tsx'\n\nimport { StarterSinglePage } from '@/features/starter'\n\n/** Local dev: module-config overlay + single-page starter (no TanStack Router). */\nexport async function mountDevPreview() {\n await mountGreenfieldDev({ preview: <StarterSinglePage /> })\n}\n`,\n )\n}\n\nexport function writeMountPortalRouter(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-portal.tsx'),\n `import ReactDOM from 'react-dom/client'\n\nimport { App } from '@/app'\n\n/** Production mount — same App shell as woodsportal-client-frontend CDN app chunk. */\nexport async function mountPortal() {\n const root = document.getElementById('app')\n if (!root) {\n return\n }\n ReactDOM.createRoot(root).render(<App />)\n}\n`,\n )\n}\n\nexport function writeMountPortalSinglePage(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-portal.tsx'),\n `import ReactDOM from 'react-dom/client'\n\nimport { StarterSinglePage } from '@/features/starter'\n\n/** Production mount — single-page starter when router scaffold is \\`none\\`. */\nexport async function mountPortal() {\n const root = document.getElementById('app')\n if (!root) {\n return\n }\n ReactDOM.createRoot(root).render(<StarterSinglePage />)\n}\n`,\n )\n}\n\nexport function writeStarterSinglePage(targetDir: string): void {\n const file = resolve(targetDir, 'src/features/starter/components/starter-single-page.tsx')\n if (existsSync(file)) {\n return\n }\n writeFileSync(\n file,\n `import { StarterShell } from '@/components/layout/starter-shell'\n\nimport { StarterGuidePage } from './starter-guide-page'\nimport { StarterHome } from './starter-home'\n\n/** Single-page starter when \\`wp init --router none\\` (no TanStack Router). */\nexport function StarterSinglePage() {\n return (\n <StarterShell showNav={false}>\n <StarterHome />\n <div className=\"mx-auto max-w-4xl px-6 sm:px-10\">\n <hr className=\"my-10 border-[#cbd6e2]\" />\n </div>\n <StarterGuidePage />\n </StarterShell>\n )\n}\n`,\n )\n}\n\nfunction removePath(targetDir: string, relativePath: string): void {\n const full = resolve(targetDir, relativePath)\n if (!existsSync(full)) {\n return\n }\n rmSync(full, { recursive: true, force: true })\n}\n\nexport function stripTanStackFromPackage(targetDir: string): void {\n const pkgPath = resolve(targetDir, 'package.json')\n if (!existsSync(pkgPath)) {\n return\n }\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n devDependencies?: Record<string, string>\n }\n if (!pkg.devDependencies) {\n return\n }\n for (const dep of TANSTACK_DEPS) {\n delete pkg.devDependencies[dep]\n }\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n}\n\nexport function applyRouterScaffold(\n targetDir: string,\n mode: RouterScaffoldMode,\n template: string,\n): void {\n if (!isModuleTemplate(template)) {\n return\n }\n\n if (mode === 'none') {\n for (const relativePath of ROUTER_FILES) {\n removePath(targetDir, relativePath)\n }\n writeStarterSinglePage(targetDir)\n writeMountDevPreviewSinglePage(targetDir)\n writeMountPortalSinglePage(targetDir)\n stripTanStackFromPackage(targetDir)\n return\n }\n\n writeRouterConfig(targetDir, mode)\n writeMountDevPreviewRouter(targetDir)\n writeMountPortalRouter(targetDir)\n\n const featuresIndex = resolve(targetDir, 'src/features/starter/index.ts')\n if (existsSync(featuresIndex)) {\n let content = readFileSync(featuresIndex, 'utf8')\n if (!content.includes('StarterSinglePage')) {\n content = content.replace(\n \"export type { StarterPreviewValues } from './hooks/use-starter-preview'\\n\",\n \"export type { StarterPreviewValues } from './hooks/use-starter-preview'\\nexport { StarterSinglePage } from './components/starter-single-page'\\n\",\n )\n writeFileSync(featuresIndex, content)\n }\n }\n}\n\n","import { copyFileSync, existsSync, writeFileSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\n\nimport type { CommandContext } from '../cli/context.js'\nimport {\n HUBSPOT_CONFIG_EXAMPLE,\n HUBSPOT_CONFIG_FILE,\n} from './hubspot-cli-setup.js'\nimport { kitPath } from './paths.js'\nimport {\n isModuleProject,\n isThemeProject,\n usesCdnPipeline,\n type WoodsPortalHsConfig,\n} from '../schema/woodsportal-hs.js'\nimport type { BuildTier } from './build-tier.js'\n\nexport type SetupResult = {\n action: 'copied' | 'skipped' | 'manual'\n path: string\n detail: string\n}\n\ntype SetupOptions = {\n tier?: BuildTier\n dryRun?: boolean\n}\n\nfunction envFileForTier(tier: BuildTier): string {\n return tier === 'dev' ? '.env.dev' : tier === 'stg' ? '.env.stg' : '.env.prod'\n}\n\nfunction tiersToSetup(config: WoodsPortalHsConfig, tier?: BuildTier): BuildTier[] {\n if (tier) return [tier]\n return config.env.tiers\n}\n\nfunction firstExisting(paths: string[]): string | null {\n for (const path of paths) {\n if (existsSync(path)) return path\n }\n return null\n}\n\nfunction copyMissingFile(\n projectRoot: string,\n targetName: string,\n sourceCandidates: string[],\n dryRun: boolean,\n): SetupResult {\n const target = resolve(projectRoot, targetName)\n if (existsSync(target)) {\n return { action: 'skipped', path: targetName, detail: 'already present' }\n }\n\n const source = firstExisting(sourceCandidates)\n if (!source) {\n return {\n action: 'manual',\n path: targetName,\n detail: `no template found — create ${targetName} manually`,\n }\n }\n\n if (!dryRun) {\n copyFileSync(source, target)\n }\n\n const from = basename(source)\n return {\n action: 'copied',\n path: targetName,\n detail: dryRun ? `[dry-run] would copy ${from} → ${targetName}` : `copied ${from} → ${targetName}`,\n }\n}\n\nfunction writeMissingFile(\n projectRoot: string,\n targetName: string,\n content: string,\n dryRun: boolean,\n): SetupResult {\n const target = resolve(projectRoot, targetName)\n if (existsSync(target)) {\n return { action: 'skipped', path: targetName, detail: 'already present' }\n }\n\n if (!dryRun) {\n writeFileSync(target, content)\n }\n\n return {\n action: 'copied',\n path: targetName,\n detail: dryRun ? `[dry-run] would create ${targetName}` : `created ${targetName}`,\n }\n}\n\nfunction templateViteFiles(config: WoodsPortalHsConfig): string[] {\n if (isThemeProject(config)) return ['vite.config.dev.mjs']\n if (config.projectType === 'module-monolith') {\n return ['vite.config.dev.mjs', 'vite.config.monolith.mjs']\n }\n return ['vite.config.dev.mjs', 'vite.config.hubspot.mjs', 'vite.config.monolith.mjs']\n}\n\nfunction kitTemplateDir(config: WoodsPortalHsConfig): string {\n return kitPath('templates', config.projectType)\n}\n\nexport function applyProjectSetup(ctx: CommandContext, options: SetupOptions = {}): SetupResult[] {\n const { projectRoot, config } = ctx\n const dryRun = options.dryRun ?? false\n const results: SetupResult[] = []\n const sharedDir = kitPath('templates', 'shared')\n const templateDir = kitTemplateDir(config)\n\n // HubSpot CLI config\n results.push(\n copyMissingFile(projectRoot, HUBSPOT_CONFIG_FILE, [\n resolve(projectRoot, HUBSPOT_CONFIG_EXAMPLE),\n resolve(templateDir, HUBSPOT_CONFIG_EXAMPLE),\n kitPath('templates', HUBSPOT_CONFIG_EXAMPLE),\n ], dryRun),\n )\n\n // Env files (all tiers or single --tier)\n for (const tier of tiersToSetup(config, options.tier)) {\n const envFile = envFileForTier(tier)\n const envExample = `${envFile}.example`\n results.push(\n copyMissingFile(projectRoot, envFile, [\n resolve(projectRoot, envExample),\n resolve(sharedDir, envExample),\n ], dryRun),\n )\n }\n\n // CDN pipeline extras\n if (usesCdnPipeline(config) && !isThemeProject(config)) {\n const mirror = config.cdn.mirror\n results.push(\n copyMissingFile(projectRoot, mirror, [\n resolve(projectRoot, `${mirror}.example`),\n resolve(sharedDir, 'portal.cdn.json.example'),\n ], dryRun),\n )\n\n const buildIdFile = config.cdn.buildIdFile\n results.push(\n writeMissingFile(projectRoot, buildIdFile, 'v0.0.1-dev.1\\n', dryRun),\n )\n }\n\n // Vite shims from project template\n for (const file of templateViteFiles(config)) {\n results.push(\n copyMissingFile(projectRoot, file, [resolve(templateDir, file)], dryRun),\n )\n }\n\n // Module adapter stub\n if (isModuleProject(config) && !isThemeProject(config)) {\n const adapter = config.dev.adapter\n const adapterPath = resolve(projectRoot, adapter)\n if (!existsSync(adapterPath)) {\n const templateAdapter = resolve(templateDir, 'wphs.adapter.ts')\n if (existsSync(templateAdapter)) {\n results.push(copyMissingFile(projectRoot, adapter, [templateAdapter], dryRun))\n } else {\n results.push({\n action: 'manual',\n path: adapter,\n detail: 'create wphs.adapter.ts (see docs/ADAPTER.md)',\n })\n }\n } else {\n results.push({ action: 'skipped', path: adapter, detail: 'already present' })\n }\n }\n\n return results\n}\n\n/** Copy shared env/hubspot examples into a freshly scaffolded project (init). */\nexport function copySharedSetupExamples(targetDir: string): void {\n const sharedDir = kitPath('templates', 'shared')\n if (!existsSync(sharedDir)) return\n\n for (const name of [\n '.env.dev.example',\n '.env.stg.example',\n '.env.prod.example',\n 'portal.cdn.json.example',\n ]) {\n const src = resolve(sharedDir, name)\n const dest = resolve(targetDir, name)\n if (existsSync(src) && !existsSync(dest)) {\n copyFileSync(src, dest)\n }\n }\n\n const hubspotExample = firstExisting([\n resolve(sharedDir, HUBSPOT_CONFIG_EXAMPLE),\n kitPath('templates', HUBSPOT_CONFIG_EXAMPLE),\n ])\n if (!hubspotExample) return\n const destHubspot = resolve(targetDir, HUBSPOT_CONFIG_EXAMPLE)\n if (!existsSync(destHubspot) && !existsSync(resolve(targetDir, HUBSPOT_CONFIG_FILE))) {\n copyFileSync(hubspotExample, destHubspot)\n }\n}\n\nexport function formatSetupHint(results: SetupResult[]): string | undefined {\n const hubspot = results.find((r) => r.path === HUBSPOT_CONFIG_FILE && r.action === 'copied')\n if (hubspot) {\n return `Edit ${HUBSPOT_CONFIG_FILE} — set portalId and personalAccessKey (https://app.hubspot.com/l/personal-access-key)`\n }\n\n const envCopied = results.some((r) => r.path.startsWith('.env.') && r.action === 'copied')\n if (envCopied) {\n return 'Edit .env.* files — set VITE_PUBLIC_REST_API_ENDPOINT and portal IDs for your environment'\n }\n\n return undefined\n}\n","const PROJECT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/\n\nexport function normalizeProjectName(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nexport function validateProjectName(name: string): string | undefined {\n if (!name) return 'Project name is required'\n if (!PROJECT_NAME_PATTERN.test(name)) {\n return 'Use lowercase letters, numbers, and hyphens (e.g. my-portal-module)'\n }\n if (name.length > 64) return 'Project name is too long (max 64 characters)'\n return undefined\n}\n\nexport function moduleOutDirFromSlug(slug: string): string {\n const pascal = slug\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n return `dist/${pascal || 'HubSpot'}.Module`\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport * as p from '@clack/prompts'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { DEFAULT_WOODSPORTAL_HS, isModuleProject, type WoodsPortalHsConfig } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type AdoptOptions = {\n yes?: boolean\n}\n\nasync function loadDetectLayout() {\n const mod = await import(pathToFileURL(kitPath('scripts', 'detect-layout.mjs')).href)\n return mod.detectProjectLayout as (root: string) => {\n track: string\n setup: string\n projectType: string | null\n }\n}\n\nexport async function runAdopt(ctx: CommandContext, _options: AdoptOptions = {}): Promise<number> {\n const detectProjectLayout = await loadDetectLayout()\n const layout = detectProjectLayout(ctx.projectRoot)\n const configPath = resolve(ctx.projectRoot, WOODSCLI_CONFIG_FILE)\n\n if (layout.track === 'unknown') {\n throw new WpHsError('Could not detect module or theme layout.', {\n exitCode: ExitCode.USER_ERROR,\n remediation:\n 'Ensure fields.json + module.html (module) or theme.json + templates/ (theme) exist.',\n })\n }\n\n let projectType: WoodsPortalHsConfig['projectType']\n if (layout.projectType) {\n projectType = layout.projectType as WoodsPortalHsConfig['projectType']\n } else if (layout.track === 'theme') {\n projectType = 'theme-starter'\n } else if (existsSync(resolve(ctx.projectRoot, 'vite.config.monolith.mjs'))) {\n projectType = 'module-monolith'\n } else {\n projectType = 'module-hybrid-cdn'\n }\n\n const config = {\n ...DEFAULT_WOODSPORTAL_HS,\n projectType,\n ...(layout.track === 'theme'\n ? {\n theme: {\n name: 'my-theme',\n uploadPath: 'themes/my-theme',\n srcDir: 'src/theme',\n themeJson: 'src/theme/theme.json',\n },\n }\n : {}),\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would adopt as ${projectType} (${layout.track})`)\n return ExitCode.SUCCESS\n }\n\n if (!existsSync(configPath)) {\n writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`)\n ctx.logger.success(`Created ${WOODSCLI_CONFIG_FILE}`)\n } else if (!layout.projectType) {\n const existing = JSON.parse(readFileSync(configPath, 'utf8'))\n writeFileSync(configPath, `${JSON.stringify({ ...existing, projectType }, null, 2)}\\n`)\n ctx.logger.info(`Set projectType → ${projectType}`)\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n\n const adapterPath = resolve(ctx.projectRoot, 'wphs.adapter.ts')\n if (!existsSync(adapterPath) && isModuleProject(config)) {\n writeFileSync(\n adapterPath,\n `import type { HubSpotKitAdapter } from '@woodsportal/hubspot-kit'\n\nconst adapter: HubSpotKitAdapter = {\n syncLiveData(built) {\n ;(window as Window & { __WPHS_DATA__?: Record<string, unknown> }).__WPHS_DATA__ = built\n },\n}\n\nexport default adapter\n`,\n )\n ctx.logger.info('Created wphs.adapter.ts stub')\n }\n\n if (!ctx.global.ci && !ctx.global.quiet) {\n p.note(\n [\n `Review ${WOODSCLI_CONFIG_FILE} upload paths`,\n 'Implement wphs.adapter.ts for your app (if module)',\n 'Run wp setup (copies hubspot.config.yml, .env.*, vite shims)',\n 'Patch main.dev.css @source to .wphs/.kit-module-config/**',\n ].join('\\n'),\n 'Manual follow-ups',\n )\n }\n\n ctx.logger.success(`Adopted ${layout.track} project (${projectType})`)\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport {\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nconst LEGACY_DIRS = ['.dev', '.woodsportal']\nconst LEGACY_BASELINE = '.wp-hs-baseline'\n\nexport type MigrateOptions = {\n yes?: boolean\n}\n\nexport async function runMigrate(ctx: CommandContext, _options: MigrateOptions = {}): Promise<number> {\n const root = ctx.projectRoot\n const wphsRoot = resolve(root, WPHS_WORKSPACE_DIR)\n const actions: string[] = []\n\n for (const legacy of LEGACY_DIRS) {\n const legacyPath = resolve(root, legacy)\n if (!existsSync(legacyPath)) continue\n\n actions.push(`Move ${legacy}/ → .wphs/`)\n if (ctx.global.dryRun) continue\n\n mkdirSync(join(wphsRoot, 'config'), { recursive: true })\n mkdirSync(join(wphsRoot, 'assets', 'branding'), { recursive: true })\n\n const localConfig = join(legacyPath, 'module-config.local.json')\n const exampleConfig = join(legacyPath, 'module-config.example.json')\n if (existsSync(localConfig)) {\n cpSync(localConfig, join(wphsRoot, 'config', 'module-config.local.json'))\n }\n if (existsSync(exampleConfig)) {\n cpSync(exampleConfig, join(wphsRoot, 'config', 'module-config.example.json'))\n }\n\n const branding = join(legacyPath, 'branding-assets')\n if (existsSync(branding)) {\n for (const file of readdirSync(branding)) {\n cpSync(join(branding, file), join(wphsRoot, 'assets', 'branding', file))\n }\n }\n\n rmSync(legacyPath, { recursive: true, force: true })\n }\n\n const legacyBaseline = resolve(root, LEGACY_BASELINE)\n const targetBaseline = join(wphsRoot, 'audit', 'baseline')\n if (existsSync(legacyBaseline)) {\n actions.push(`Move ${LEGACY_BASELINE}/ → .wphs/audit/baseline/`)\n if (!ctx.global.dryRun) {\n mkdirSync(targetBaseline, { recursive: true })\n cpSync(legacyBaseline, targetBaseline, { recursive: true })\n rmSync(legacyBaseline, { recursive: true, force: true })\n }\n }\n\n const legacyConfigPath = resolve(root, LEGACY_WOODSPORTAL_HS_FILE)\n const woodscliPath = resolve(root, WOODSCLI_CONFIG_FILE)\n\n if (existsSync(legacyConfigPath) && !existsSync(woodscliPath)) {\n actions.push(`Rename ${LEGACY_WOODSPORTAL_HS_FILE} → ${WOODSCLI_CONFIG_FILE}`)\n if (!ctx.global.dryRun) {\n renameSync(legacyConfigPath, woodscliPath)\n }\n } else if (existsSync(legacyConfigPath) && existsSync(woodscliPath)) {\n actions.push(`Remove duplicate ${LEGACY_WOODSPORTAL_HS_FILE}`)\n if (!ctx.global.dryRun) {\n rmSync(legacyConfigPath, { force: true })\n }\n }\n\n if (existsSync(woodscliPath)) {\n const raw = JSON.parse(readFileSync(woodscliPath, 'utf8'))\n if (raw?.dev?.moduleConfigDir && raw.dev.moduleConfigDir !== WPHS_WORKSPACE_DIR) {\n actions.push(`Update dev.moduleConfigDir → .wphs in project config`)\n if (!ctx.global.dryRun) {\n raw.dev.moduleConfigDir = WPHS_WORKSPACE_DIR\n writeFileSync(woodscliPath, `${JSON.stringify(raw, null, 2)}\\n`)\n }\n }\n }\n\n if (actions.length === 0) {\n ctx.logger.success('Nothing to migrate — already on .wphs / woodscli.json')\n return ExitCode.SUCCESS\n }\n\n if (ctx.global.dryRun) {\n for (const action of actions) ctx.logger.info(`[dry-run] ${action}`)\n return ExitCode.SUCCESS\n }\n\n if (!ctx.global.yes && !ctx.global.ci) {\n throw new WpHsError('Migration requires --yes.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run: wp migrate --yes',\n })\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: root,\n logger: ctx.logger,\n dryRun: false,\n })\n\n for (const action of actions) ctx.logger.success(action)\n return ExitCode.SUCCESS\n}\n","import { readFileSync } from 'node:fs'\n\nimport { ExitCode } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type ExamplesListOptions = {\n track?: 'module' | 'theme'\n setup?: 'greenfield' | 'existing' | 'adopted'\n}\n\nexport type ExamplesSmokeOptions = {\n scenario?: string\n tier?: 'static' | 'live'\n}\n\ntype Scenario = {\n id: string\n setup: string\n track: string\n projectType?: string\n smokeTier: string\n fixture?: string\n checks?: string[]\n}\n\nfunction loadManifest() {\n const manifestPath = kitPath('examples', 'manifest.json')\n const raw = JSON.parse(readFileSync(manifestPath, 'utf8')) as { scenarios: Scenario[] }\n return raw.scenarios\n}\n\nexport async function runExamplesList(\n ctx: CommandContext,\n options: ExamplesListOptions = {},\n): Promise<number> {\n let scenarios = loadManifest()\n if (options.track) scenarios = scenarios.filter((s) => s.track === options.track)\n if (options.setup) scenarios = scenarios.filter((s) => s.setup === options.setup)\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:list', scenarios })\n } else {\n for (const s of scenarios) {\n ctx.logger.info(`${s.id} (${s.setup}/${s.track}) tier=${s.smokeTier}`)\n }\n }\n return ExitCode.SUCCESS\n}\n\nexport async function runExamplesSmoke(\n ctx: CommandContext,\n options: ExamplesSmokeOptions = {},\n): Promise<number> {\n const tier = options.tier ?? 'static'\n const args = ['--tier', tier]\n if (options.scenario) args.push('--scenario', options.scenario)\n\n const { runNodeScript } = await import('../../lib/exec.js')\n runNodeScript(kitPath('examples', 'smoke', 'run-matrix.mjs'), args, {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:smoke', tier, scenario: options.scenario ?? 'all', ok: true })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport type FieldsSyncOptions = {\n direction?: 'pull' | 'push'\n dryRun?: boolean\n}\n\nexport async function runFieldsSync(\n ctx: CommandContext,\n options: FieldsSyncOptions = {},\n): Promise<number> {\n const direction = options.direction ?? 'pull'\n const fieldsPath = resolve(ctx.projectRoot, ctx.config.dev.fieldsJson)\n const cacheDir = resolve(ctx.projectRoot, ctx.config.dev.moduleConfigDir, 'cache', 'fields-sync')\n const cachePath = resolve(cacheDir, 'fields.json')\n\n if (direction === 'pull') {\n if (!existsSync(fieldsPath)) {\n throw new WpHsError(`Missing ${ctx.config.dev.fieldsJson}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Add fields.json or run wp init.',\n })\n }\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would cache ${fieldsPath} → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n const { mkdirSync } = await import('node:fs')\n mkdirSync(cacheDir, { recursive: true })\n cpSync(fieldsPath, cachePath)\n ctx.logger.success(`Cached fields → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n\n if (!existsSync(cachePath)) {\n throw new WpHsError('No cached fields — run wp fields sync pull first.', {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would write ${cachePath} → ${fieldsPath}`)\n return ExitCode.SUCCESS\n }\n\n writeFileSync(fieldsPath, readFileSync(cachePath, 'utf8'))\n ctx.logger.success(`Restored fields from cache → ${fieldsPath}`)\n return ExitCode.SUCCESS\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\nimport { runConfigValidate } from './config-validate.js'\nimport { runDoctor } from './doctor.js'\n\nexport type RegressionSmokeOptions = {\n /** Skip doctor (e.g. when HubSpot CLI is not installed in CI) */\n skipDoctor?: boolean\n /** Fail if legacy consumer script shims are missing */\n checkLegacyShims?: boolean\n}\n\nconst LEGACY_SHIM_SCRIPTS = [\n 'build-cdn.mjs',\n 'run-vite-build.mjs',\n 'run-hubspot-module-postbuild.mjs',\n 'watch-hubspot.mjs',\n]\n\nconst FORBIDDEN_CONSUMER_PATHS = ['src/dev/module-config', 'src/dev/bootstrap.tsx']\n\nexport async function runRegressionSmoke(\n ctx: CommandContext,\n options: RegressionSmokeOptions = {},\n): Promise<number> {\n const failures: string[] = []\n const checks: { name: string; ok: boolean; detail?: string }[] = []\n\n if (!options.skipDoctor) {\n const doctorCode = await runDoctor(ctx)\n const doctorOk = doctorCode === ExitCode.SUCCESS\n checks.push({ name: 'doctor', ok: doctorOk })\n if (!doctorOk) failures.push('wp doctor failed')\n }\n\n const validateCode = await runConfigValidate(ctx)\n const validateOk = validateCode === ExitCode.SUCCESS\n checks.push({ name: 'config-validate', ok: validateOk })\n if (!validateOk) failures.push('wp config validate failed')\n\n if (options.checkLegacyShims !== false) {\n for (const script of LEGACY_SHIM_SCRIPTS) {\n const shim = resolve(ctx.projectRoot, 'scripts', script)\n const kitScript = kitPath('scripts', script)\n const shimOk = existsSync(shim) && existsSync(kitScript)\n checks.push({ name: `shim:${script}`, ok: shimOk })\n if (!shimOk) failures.push(`Missing legacy shim or kit script: ${script}`)\n }\n }\n\n for (const rel of FORBIDDEN_CONSUMER_PATHS) {\n const forbidden = resolve(ctx.projectRoot, rel)\n const absent = !existsSync(forbidden)\n checks.push({ name: `no-${rel}`, ok: absent })\n if (!absent) failures.push(`Forbidden dev path still present: ${rel}`)\n }\n\n const woodscliConfig = resolve(ctx.projectRoot, WOODSCLI_CONFIG_FILE)\n const configOk = existsSync(woodscliConfig)\n checks.push({ name: WOODSCLI_CONFIG_FILE, ok: configOk })\n if (!configOk) failures.push(`${WOODSCLI_CONFIG_FILE} missing`)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'regression:smoke',\n ok: failures.length === 0,\n checks,\n failures,\n })\n } else if (failures.length === 0) {\n ctx.logger.success('Regression smoke passed')\n } else {\n for (const f of failures) ctx.logger.error(f)\n }\n\n if (failures.length > 0) {\n throw new WpHsError('Regression smoke failed', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Run wp doctor and fix listed checks. See docs/REGRESSION-SMOKE.md.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { ExitCode } from '../../lib/errors.js'\nimport { printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { applyProjectSetup, formatSetupHint } from '../../lib/project-setup.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { BuildTier } from '../../lib/build-tier.js'\nimport type { CommandContext } from '../context.js'\n\nexport type SetupOptions = {\n tier?: BuildTier\n progress?: boolean\n}\n\nexport async function runSetup(ctx: CommandContext, options: SetupOptions = {}): Promise<number> {\n let results: ReturnType<typeof applyProjectSetup> = []\n\n await runCliTasks(\n ctx,\n [\n {\n title: 'Preparing .wphs workspace',\n task: async () => {\n if (ctx.global.dryRun) return\n try {\n runNodeScript(kitPath('scripts', 'ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n } catch {\n // non-fatal\n }\n },\n },\n {\n title: 'Copying missing config files',\n task: async () => {\n results = applyProjectSetup(ctx, {\n tier: options.tier,\n dryRun: ctx.global.dryRun,\n })\n },\n },\n ],\n options,\n )\n\n const copied = results.filter((r) => r.action === 'copied')\n const manual = results.filter((r) => r.action === 'manual')\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'setup',\n ok: manual.length === 0,\n copied: copied.length,\n skipped: results.filter((r) => r.action === 'skipped').length,\n manual,\n results,\n })\n } else {\n for (const result of results) {\n if (result.action === 'skipped') continue\n if (result.action === 'copied') {\n ctx.logger.success(result.detail)\n } else {\n ctx.logger.warn(`${result.path}: ${result.detail}`)\n }\n }\n\n if (copied.length === 0 && manual.length === 0) {\n printCommandDone(ctx, 'Nothing to copy — required files already present')\n } else if (copied.length > 0) {\n printCommandDone(ctx, `Setup complete — ${copied.length} file(s) copied`)\n }\n\n const hint = formatSetupHint(results)\n if (hint) {\n ctx.logger.info(`→ ${hint}`)\n }\n\n if (manual.length > 0) {\n ctx.logger.info('→ Run wp doctor for the full checklist')\n }\n }\n\n return ExitCode.SUCCESS\n}\n","import * as p from '@clack/prompts'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { isInteractiveCli, printCommandDone } from '../../lib/cli-spinner.js'\nimport { runCommand } from '../../lib/exec.js'\nimport {\n readHubSpotPortals,\n resolvePortalName,\n type HubSpotPortalEntry,\n} from '../../lib/hubspot-portals.js'\nimport type { CommandContext } from '../context.js'\n\nexport type PortalListOptions = Record<string, never>\n\nexport type PortalUseOptions = {\n name?: string\n}\n\nfunction formatPortalLine(portal: HubSpotPortalEntry, defaultPortal: string | null): string {\n const id = portal.portalId ? `portalId ${portal.portalId}` : 'portalId ?'\n const mark = portal.name === defaultPortal ? ' · default' : ''\n return `${portal.name} (${id})${mark}`\n}\n\nexport async function runPortalList(ctx: CommandContext, _options: PortalListOptions = {}): Promise<number> {\n const data = readHubSpotPortals(ctx.projectRoot)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'portal:list',\n configPath: data.configPath,\n defaultPortal: data.defaultPortal,\n portals: data.portals,\n })\n return ExitCode.SUCCESS\n }\n\n if (data.portals.length === 0) {\n ctx.logger.warn(`No portals[] entries found in ${data.configPath}`)\n ctx.logger.info('→ Add portals under hubspot.config.yml or run hs auth')\n return ExitCode.SUCCESS\n }\n\n if (data.defaultPortal) {\n ctx.logger.info(`Default: ${data.defaultPortal}`)\n }\n\n for (const portal of data.portals) {\n ctx.logger.info(formatPortalLine(portal, data.defaultPortal))\n }\n\n return ExitCode.SUCCESS\n}\n\nexport async function runPortalUse(ctx: CommandContext, options: PortalUseOptions = {}): Promise<number> {\n const data = readHubSpotPortals(ctx.projectRoot)\n\n if (data.portals.length === 0) {\n throw new WpHsError('No portals configured in hubspot.config.yml', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp auth or add portals[] to hubspot.config.yml',\n })\n }\n\n let targetName = options.name?.trim()\n\n if (!targetName) {\n if (ctx.global.ci || ctx.global.json) {\n throw new WpHsError('Portal name or id required in non-interactive mode', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal use <name>',\n })\n }\n\n if (!isInteractiveCli(ctx)) {\n throw new WpHsError('Portal name or id required', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal use <name> · wp portal list',\n })\n }\n\n const answer = await p.select({\n message: 'Set default HubSpot portal',\n options: data.portals.map((portal) => ({\n value: portal.name,\n label: portal.name,\n hint:\n portal.name === data.defaultPortal\n ? `current default · ${portal.portalId ?? 'no id'}`\n : portal.portalId ?? undefined,\n })),\n })\n\n if (p.isCancel(answer)) {\n throw new WpHsError('Portal selection cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n\n targetName = answer\n }\n\n const portal = resolvePortalName(data.portals, targetName)\n if (!portal) {\n throw new WpHsError(`Unknown portal: ${targetName}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal list',\n })\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] hs accounts use ${portal.name}`)\n return ExitCode.SUCCESS\n }\n\n runCommand('hs', ['accounts', 'use', portal.name], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n\n if (!ctx.global.json && !ctx.global.quiet) {\n printCommandDone(ctx, `Default portal → ${portal.name}`)\n } else if (ctx.global.json) {\n ctx.logger.json({\n command: 'portal:use',\n ok: true,\n defaultPortal: portal.name,\n portalId: portal.portalId ?? null,\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from './errors.js'\nimport { HUBSPOT_CONFIG_FILE } from './hubspot-cli-setup.js'\n\nexport type HubSpotPortalEntry = {\n name: string\n portalId?: string\n}\n\nexport type HubSpotPortalsFile = {\n configPath: string\n defaultPortal: string | null\n portals: HubSpotPortalEntry[]\n}\n\nfunction stripYamlScalar(value: string): string {\n const trimmed = value.trim()\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1)\n }\n return trimmed\n}\n\n/** Minimal parser for hubspot.config.yml portal names (no YAML dependency). */\nexport function parseHubSpotConfigPortals(raw: string): Pick<HubSpotPortalsFile, 'defaultPortal' | 'portals'> {\n const defaultMatch = raw.match(/^defaultPortal:\\s*(.+)\\s*$/m)\n const defaultPortal = defaultMatch ? stripYamlScalar(defaultMatch[1]) : null\n\n const portals: HubSpotPortalEntry[] = []\n let current: HubSpotPortalEntry | null = null\n let inPortals = false\n\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed === 'portals:') {\n inPortals = true\n continue\n }\n if (!inPortals) continue\n\n const listItemName = line.match(/^\\s+-\\s+name:\\s+(.+)\\s*$/)\n const nestedName = line.match(/^\\s+name:\\s+(.+)\\s*$/)\n const portalId = line.match(/^\\s+portalId:\\s+(\\d+)\\s*$/)\n\n if (listItemName || (nestedName && !line.match(/^\\s+-\\s/))) {\n if (current) portals.push(current)\n const nameValue = listItemName?.[1] ?? nestedName?.[1]\n current = nameValue ? { name: stripYamlScalar(nameValue) } : null\n continue\n }\n\n if (portalId && current) {\n current.portalId = portalId[1]\n }\n }\n\n if (current) portals.push(current)\n\n return { defaultPortal, portals }\n}\n\nexport function readHubSpotPortals(projectRoot: string): HubSpotPortalsFile {\n const configPath = resolve(projectRoot, HUBSPOT_CONFIG_FILE)\n if (!existsSync(configPath)) {\n throw new WpHsError(`${HUBSPOT_CONFIG_FILE} not found in project root.`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp setup, then add your portal + PAT.',\n })\n }\n\n const raw = readFileSync(configPath, 'utf8')\n const { defaultPortal, portals } = parseHubSpotConfigPortals(raw)\n\n return { configPath, defaultPortal, portals }\n}\n\nexport function resolvePortalName(\n portals: HubSpotPortalEntry[],\n nameOrId: string,\n): HubSpotPortalEntry | null {\n const needle = nameOrId.trim()\n return (\n portals.find((p) => p.name === needle) ??\n portals.find((p) => p.portalId === needle) ??\n null\n )\n}\n","import { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotConfigForCms } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScriptLongRunning } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type WatchOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n rebuild?: boolean\n progress?: boolean\n}\n\nexport async function runWatch(ctx: CommandContext, options: WatchOptions): Promise<number> {\n // No hs subprocess here — spawnSync under Clack/spinners blocks Ctrl+C\n ensureHubSpotConfigForCms(ctx)\n\n const tier = options.tier ?? 'dev'\n const args: string[] = ['--tier', tier]\n if (options.rebuild) args.push('--rebuild')\n\n const code = await runNodeScriptLongRunning(kitPath('scripts', 'watch-hubspot.mjs'), args, {\n cwd: ctx.projectRoot,\n env: { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot },\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n\n if (code === 130 || code === 143) {\n return code\n }\n\n if (code !== ExitCode.SUCCESS) {\n throw new WpHsError(`Watch exited with code ${code}`, {\n exitCode: ExitCode.BUILD_FAILED,\n remediation:\n 'Run wp build once, then wp watch. For src/ changes use wp watch --rebuild. Check hubspot.config.yml and hs cms watch output.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { createProgram } from './program.js'\n\nconst program = createProgram()\nprogram.parse(process.argv)\n"],"mappings":"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","names":["readFileSync","resolve","readFileSync","existsSync","resolve","resolve","existsSync","findProjectRoot","findProjectRoot","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","pc","tasks","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","steps","resolve","existsSync","readFileSync","resolve","tasks","resolve","existsSync","resolve","pc","readFileSync","resolve","readFileSync","resolve","text","pc","existsSync","resolve","resolve","existsSync","resolve","existsSync","resolve","resolve","resolve","tasks","resolve","existsSync","readFileSync","resolve","join","readFileSync","existsSync","join","resolve","cpSync","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","basename","resolve","p","existsSync","mkdirSync","readFileSync","rmSync","resolve","existsSync","writeFileSync","resolve","existsSync","resolve","writeFileSync","existsSync","readdirSync","resolve","basename","mkdirSync","cpSync","writeFileSync","readFileSync","existsSync","readFileSync","writeFileSync","resolve","p","resolve","existsSync","writeFileSync","readFileSync","cpSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","writeFileSync","join","resolve","resolve","existsSync","mkdirSync","join","cpSync","readdirSync","rmSync","legacyConfigPath","readFileSync","writeFileSync","readFileSync","readFileSync","runNodeScript","cpSync","existsSync","readFileSync","writeFileSync","resolve","resolve","existsSync","mkdirSync","cpSync","writeFileSync","readFileSync","existsSync","resolve","resolve","existsSync","p","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","p","portal","readFileSync","resolve","findProjectRoot","program","runCommand"]}