@woodsportal/hubspot-kit 1.0.2 → 1.0.4

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.
package/dist/cli.js CHANGED
@@ -581,6 +581,20 @@ function checkAdapter(ctx) {
581
581
  severity: "warn"
582
582
  };
583
583
  }
584
+ function checkViteInstalled(ctx) {
585
+ if (isThemeProject(ctx.config) && !existsSync4(resolve5(ctx.projectRoot, "vite.config.dev.mjs"))) {
586
+ return null;
587
+ }
588
+ const localBin = resolve5(ctx.projectRoot, "node_modules", ".bin", "vite");
589
+ const ok = existsSync4(localBin);
590
+ return {
591
+ name: "vite",
592
+ ok,
593
+ message: ok ? "vite installed" : "vite not installed",
594
+ remediation: ok ? void 0 : "Run yarn install or npm install (wp init scaffolds vite + peer deps in devDependencies)",
595
+ severity: "error"
596
+ };
597
+ }
584
598
  async function runDoctor(ctx) {
585
599
  if (!ctx.global.dryRun) {
586
600
  try {
@@ -596,6 +610,7 @@ async function runDoctor(ctx) {
596
610
  checkNode(),
597
611
  checkKitScripts(),
598
612
  checkDevViteConfig(ctx),
613
+ checkViteInstalled(ctx),
599
614
  ...checkConfig(ctx),
600
615
  ...checkWphsWorkspace(ctx),
601
616
  checkAdapter(ctx),
@@ -779,7 +794,7 @@ async function runDev(ctx, options) {
779
794
  if (viteBin === "vite") {
780
795
  throw new WpHsError("vite is not installed in this project.", {
781
796
  exitCode: ExitCode.PREREQUISITE,
782
- remediation: "Run yarn install in the project root (vite is a devDependency)."
797
+ remediation: "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)."
783
798
  });
784
799
  }
785
800
  const consumerConfig = resolve8(ctx.projectRoot, "vite.config.dev.mjs");
@@ -1104,6 +1119,26 @@ import { cpSync as cpSync2, existsSync as existsSync8, mkdirSync as mkdirSync2,
1104
1119
  import { basename, resolve as resolve12 } from "path";
1105
1120
  import * as p from "@clack/prompts";
1106
1121
 
1122
+ // src/lib/template-dev-deps.ts
1123
+ var VITE_DEV_PEER_DEPS = {
1124
+ vite: "^6.1.0",
1125
+ "@vitejs/plugin-react": "^4.3.4",
1126
+ "babel-plugin-react-compiler": "^1.0.0",
1127
+ "@tailwindcss/vite": "^4.0.6",
1128
+ "@tanstack/router-plugin": "^1.121.2",
1129
+ react: "^19.0.0",
1130
+ "react-dom": "^19.0.0",
1131
+ tailwindcss: "^4.0.6"
1132
+ };
1133
+ var KIT_DEV_DEP = "@woodsportal/hubspot-kit";
1134
+ var KIT_DEV_DEP_VERSION = "^1.0.4";
1135
+ function templateDevDependencies() {
1136
+ return {
1137
+ [KIT_DEV_DEP]: KIT_DEV_DEP_VERSION,
1138
+ ...VITE_DEV_PEER_DEPS
1139
+ };
1140
+ }
1141
+
1107
1142
  // src/lib/project-name.ts
1108
1143
  var PROJECT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
1109
1144
  function normalizeProjectName(input) {
@@ -1258,7 +1293,7 @@ async function runInit(ctx, options) {
1258
1293
  pkg.scripts = { ...pkg.scripts, ...TEMPLATE_SCRIPTS[template] };
1259
1294
  pkg.devDependencies = {
1260
1295
  ...pkg.devDependencies,
1261
- "@woodsportal/hubspot-kit": "^1.0.2"
1296
+ ...templateDevDependencies()
1262
1297
  };
1263
1298
  writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}
1264
1299
  `);
@@ -1289,7 +1324,7 @@ ${toAppend}
1289
1324
  }
1290
1325
  if (!nonInteractive) {
1291
1326
  p.log.success(`Scaffolded ${template} in ${targetDir}`);
1292
- p.note(`cd ${slug} && npm install && wp doctor && wp dev`, "Getting started");
1327
+ p.note(`cd ${slug} && yarn install && wp doctor && wp dev`, "Getting started");
1293
1328
  } else {
1294
1329
  ctx.logger.success(`Scaffolded ${template} in ${targetDir}`);
1295
1330
  }
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/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\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 ...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: 'Run yarn install in the project root (vite is a devDependency).',\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 { 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 '@woodsportal/hubspot-kit': '^1.0.2',\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} && npm 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","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/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"]}
@@ -9,6 +9,14 @@
9
9
  "deploy:prod": "wp deploy --tier prod"
10
10
  },
11
11
  "devDependencies": {
12
- "@woodsportal/hubspot-kit": "^1.0.0"
12
+ "@woodsportal/hubspot-kit": "^1.0.2",
13
+ "@tailwindcss/vite": "^4.0.6",
14
+ "@tanstack/router-plugin": "^1.121.2",
15
+ "@vitejs/plugin-react": "^4.3.4",
16
+ "babel-plugin-react-compiler": "^1.0.0",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "tailwindcss": "^4.0.6",
20
+ "vite": "^6.1.0"
13
21
  }
14
22
  }
@@ -0,0 +1,3 @@
1
+ @import 'tailwindcss';
2
+
3
+ @source '../../.wphs/**/*.{js,jsx,ts,tsx}';
@@ -0,0 +1,7 @@
1
+ /** Local dev fixtures for module-config runtime (greenfield wp init). */
2
+ export const defaultData = {
3
+ dataSourceSet: [],
4
+ hubId: 'dev',
5
+ userData: {},
6
+ objectList: [] as unknown[],
7
+ }
@@ -0,0 +1,17 @@
1
+ /** Runtime contract for window.hubSpotData (greenfield stub). */
2
+ export type HubSpotPortalData = {
3
+ dataSourceSet?: unknown
4
+ hubId?: string | number
5
+ apiBaseUrlOption?: string
6
+ userData?: unknown
7
+ objectList?: unknown[]
8
+ isInEditor?: boolean
9
+ }
10
+
11
+ declare global {
12
+ interface Window {
13
+ hubSpotData?: HubSpotPortalData
14
+ }
15
+ }
16
+
17
+ export {}
@@ -1,2 +1,4 @@
1
- import { mountDevPortal } from '@woodsportal/hubspot-kit/dev/bootstrap'
2
- void mountDevPortal()
1
+ import './assets/css/main.dev.css'
2
+ import { mountGreenfieldDev } from '@woodsportal/hubspot-kit/dev/bootstrap-greenfield'
3
+
4
+ void mountGreenfieldDev()
@@ -1,12 +1,22 @@
1
1
  {
2
- "name": "my-hubspot-monolith-module",
2
+ "name": "my-hubspot-portal-module",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "local": "wp dev",
7
- "build:prod": "wp build --tier prod --hubspot-only"
7
+ "doctor": "wp doctor",
8
+ "build:prod": "wp build --tier prod",
9
+ "deploy:prod": "wp deploy --tier prod"
8
10
  },
9
11
  "devDependencies": {
10
- "@woodsportal/hubspot-kit": "^1.0.0"
12
+ "@woodsportal/hubspot-kit": "^1.0.2",
13
+ "@tailwindcss/vite": "^4.0.6",
14
+ "@tanstack/router-plugin": "^1.121.2",
15
+ "@vitejs/plugin-react": "^4.3.4",
16
+ "babel-plugin-react-compiler": "^1.0.0",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "tailwindcss": "^4.0.6",
20
+ "vite": "^6.1.0"
11
21
  }
12
22
  }
@@ -0,0 +1,7 @@
1
+ /** Local dev fixtures for module-config runtime (greenfield wp init). */
2
+ export const defaultData = {
3
+ dataSourceSet: [],
4
+ hubId: 'dev',
5
+ userData: {},
6
+ objectList: [] as unknown[],
7
+ }
@@ -1,11 +1,22 @@
1
1
  {
2
- "name": "my-hubspot-theme",
2
+ "name": "my-hubspot-portal-module",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "scripts": {
6
- "doctor": "wp doctor"
6
+ "local": "wp dev",
7
+ "doctor": "wp doctor",
8
+ "build:prod": "wp build --tier prod",
9
+ "deploy:prod": "wp deploy --tier prod"
7
10
  },
8
11
  "devDependencies": {
9
- "@woodsportal/hubspot-kit": "^1.0.0"
12
+ "@woodsportal/hubspot-kit": "^1.0.2",
13
+ "@tailwindcss/vite": "^4.0.6",
14
+ "@tanstack/router-plugin": "^1.121.2",
15
+ "@vitejs/plugin-react": "^4.3.4",
16
+ "babel-plugin-react-compiler": "^1.0.0",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "tailwindcss": "^4.0.6",
20
+ "vite": "^6.1.0"
10
21
  }
11
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@woodsportal/hubspot-kit",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "WoodsCLI — HubSpot CMS dev kit by WoodsPortal. wp CLI, Vite presets, module-config overlay, and theme/module build pipelines.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,6 +29,7 @@
29
29
  "import": "./dist/vite/index.js"
30
30
  },
31
31
  "./dev/bootstrap": "./src/dev/bootstrap.tsx",
32
+ "./dev/bootstrap-greenfield": "./src/dev/bootstrap-greenfield.tsx",
32
33
  "./routing/route-format": "./src/routing/route-format.ts",
33
34
  "./routing/build-api-routes": "./src/routing/build-api-routes.ts",
34
35
  "./scripts/tailwind/prefix.env.js": "./scripts/tailwind/prefix.env.js",
@@ -9,6 +9,14 @@
9
9
  "deploy:prod": "wp deploy --tier prod"
10
10
  },
11
11
  "devDependencies": {
12
- "@woodsportal/hubspot-kit": "^1.0.0"
12
+ "@woodsportal/hubspot-kit": "^1.0.4",
13
+ "@tailwindcss/vite": "^4.0.6",
14
+ "@tanstack/router-plugin": "^1.121.2",
15
+ "@vitejs/plugin-react": "^4.3.4",
16
+ "babel-plugin-react-compiler": "^1.0.0",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "tailwindcss": "^4.0.6",
20
+ "vite": "^6.1.0"
13
21
  }
14
22
  }
@@ -0,0 +1,3 @@
1
+ @import 'tailwindcss';
2
+
3
+ @source '../../.wphs/**/*.{js,jsx,ts,tsx}';
@@ -0,0 +1,7 @@
1
+ /** Local dev fixtures for module-config runtime (greenfield wp init). */
2
+ export const defaultData = {
3
+ dataSourceSet: [],
4
+ hubId: 'dev',
5
+ userData: {},
6
+ objectList: [] as unknown[],
7
+ }
@@ -0,0 +1,17 @@
1
+ /** Runtime contract for window.hubSpotData (greenfield stub). */
2
+ export type HubSpotPortalData = {
3
+ dataSourceSet?: unknown
4
+ hubId?: string | number
5
+ apiBaseUrlOption?: string
6
+ userData?: unknown
7
+ objectList?: unknown[]
8
+ isInEditor?: boolean
9
+ }
10
+
11
+ declare global {
12
+ interface Window {
13
+ hubSpotData?: HubSpotPortalData
14
+ }
15
+ }
16
+
17
+ export {}
@@ -1,2 +1,4 @@
1
- import { mountDevPortal } from '@woodsportal/hubspot-kit/dev/bootstrap'
2
- void mountDevPortal()
1
+ import './assets/css/main.dev.css'
2
+ import { mountGreenfieldDev } from '@woodsportal/hubspot-kit/dev/bootstrap-greenfield'
3
+
4
+ void mountGreenfieldDev()
@@ -1,12 +1,22 @@
1
1
  {
2
- "name": "my-hubspot-monolith-module",
2
+ "name": "my-hubspot-portal-module",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "local": "wp dev",
7
- "build:prod": "wp build --tier prod --hubspot-only"
7
+ "doctor": "wp doctor",
8
+ "build:prod": "wp build --tier prod",
9
+ "deploy:prod": "wp deploy --tier prod"
8
10
  },
9
11
  "devDependencies": {
10
- "@woodsportal/hubspot-kit": "^1.0.0"
12
+ "@woodsportal/hubspot-kit": "^1.0.4",
13
+ "@tailwindcss/vite": "^4.0.6",
14
+ "@tanstack/router-plugin": "^1.121.2",
15
+ "@vitejs/plugin-react": "^4.3.4",
16
+ "babel-plugin-react-compiler": "^1.0.0",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "tailwindcss": "^4.0.6",
20
+ "vite": "^6.1.0"
11
21
  }
12
22
  }
@@ -0,0 +1,3 @@
1
+ @import 'tailwindcss';
2
+
3
+ @source '../../.wphs/**/*.{js,jsx,ts,tsx}';
@@ -0,0 +1,7 @@
1
+ /** Local dev fixtures for module-config runtime (greenfield wp init). */
2
+ export const defaultData = {
3
+ dataSourceSet: [],
4
+ hubId: 'dev',
5
+ userData: {},
6
+ objectList: [] as unknown[],
7
+ }
@@ -0,0 +1,17 @@
1
+ /** Runtime contract for window.hubSpotData (greenfield stub). */
2
+ export type HubSpotPortalData = {
3
+ dataSourceSet?: unknown
4
+ hubId?: string | number
5
+ apiBaseUrlOption?: string
6
+ userData?: unknown
7
+ objectList?: unknown[]
8
+ isInEditor?: boolean
9
+ }
10
+
11
+ declare global {
12
+ interface Window {
13
+ hubSpotData?: HubSpotPortalData
14
+ }
15
+ }
16
+
17
+ export {}
@@ -0,0 +1,4 @@
1
+ import './assets/css/main.dev.css'
2
+ import { mountGreenfieldDev } from '@woodsportal/hubspot-kit/dev/bootstrap-greenfield'
3
+
4
+ void mountGreenfieldDev()
@@ -1,11 +1,22 @@
1
1
  {
2
- "name": "my-hubspot-theme",
2
+ "name": "my-hubspot-portal-module",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "scripts": {
6
- "doctor": "wp doctor"
6
+ "local": "wp dev",
7
+ "doctor": "wp doctor",
8
+ "build:prod": "wp build --tier prod",
9
+ "deploy:prod": "wp deploy --tier prod"
7
10
  },
8
11
  "devDependencies": {
9
- "@woodsportal/hubspot-kit": "^1.0.0"
12
+ "@woodsportal/hubspot-kit": "^1.0.4",
13
+ "@tailwindcss/vite": "^4.0.6",
14
+ "@tanstack/router-plugin": "^1.121.2",
15
+ "@vitejs/plugin-react": "^4.3.4",
16
+ "babel-plugin-react-compiler": "^1.0.0",
17
+ "react": "^19.0.0",
18
+ "react-dom": "^19.0.0",
19
+ "tailwindcss": "^4.0.6",
20
+ "vite": "^6.1.0"
10
21
  }
11
22
  }
@@ -1,6 +1,7 @@
1
1
  import { defineConfig } from 'vite'
2
2
  import viteReact from '@vitejs/plugin-react'
3
3
  import { TanStackRouterVite } from '@tanstack/router-plugin/vite'
4
+ import { existsSync } from 'node:fs'
4
5
  import { dirname, resolve } from 'node:path'
5
6
  import { fileURLToPath } from 'node:url'
6
7
  import tailwindcss from '@tailwindcss/vite'
@@ -14,10 +15,14 @@ import { createDevReactPluginOptions } from '../scripts/vite/react-dev-plugin-op
14
15
  import { ensureDevKitShims } from '../scripts/vite/ensure-dev-kit-shims.js'
15
16
  import isPrefix from '../scripts/tailwind/prefix.env.js'
16
17
  import { findProjectRoot, getKitRoot } from '../scripts/project-root.mjs'
18
+ import { readWoodsportalConfig } from '../scripts/read-woodsportal-config.mjs'
17
19
 
18
20
  const kitRoot = getKitRoot()
19
21
  const projectRoot = findProjectRoot()
20
22
  const { moduleConfigRoot, bootstrapShim } = ensureDevKitShims(projectRoot, kitRoot)
23
+ const { config } = readWoodsportalConfig(projectRoot)
24
+ const routesDir = resolve(projectRoot, 'src/routes')
25
+ const hasTanStackRoutes = existsSync(routesDir)
21
26
 
22
27
  export default defineConfig(({ mode, command }) => {
23
28
  return {
@@ -27,7 +32,7 @@ export default defineConfig(({ mode, command }) => {
27
32
  ...(command === 'serve' && mode === 'dev'
28
33
  ? [sdkLogBridge(), moduleConfigStore(projectRoot)]
29
34
  : []),
30
- TanStackRouterVite({ autoCodeSplitting: false }),
35
+ ...(hasTanStackRoutes ? [TanStackRouterVite({ autoCodeSplitting: false })] : []),
31
36
  viteReact(createDevReactPluginOptions()),
32
37
  tailwindcss(),
33
38
  ...(isPrefix(mode) ? [tailwindPrefixPlugin(), TailwindContentPlugin()] : []),
@@ -37,6 +42,7 @@ export default defineConfig(({ mode, command }) => {
37
42
  alias: {
38
43
  '@/dev/module-config': moduleConfigRoot,
39
44
  '@woodsportal/hubspot-kit/dev/bootstrap': bootstrapShim,
45
+ '@wphs/adapter': resolve(projectRoot, config?.dev?.adapter ?? './wphs.adapter.ts'),
40
46
  '@': resolve(projectRoot, './src'),
41
47
  },
42
48
  },