@shortwind/cli 0.1.0-beta.14 → 0.1.0-beta.16

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/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { C as readConfig, D as init, E as cliVersion, M as detectProject, S as installedFamilies, T as DEFAULT_REGISTRY, _ as reseal, a as extractClassUsages, b as remove, c as verify, d as dev, f as BuildError, g as preset, h as ls, i as DEFAULT_CONTENT, l as UpgradeError, m as formatLsText, n as formatBenchTable, o as formatFindingsText, p as build, r as ALL_RULES, s as lint, t as bench, u as upgrade, v as NewFamilyError, x as add, y as newFamily } from "./bench-DQtfv5aq.js";
2
+ import { C as readConfig, D as init, E as cliVersion, M as detectProject, S as installedFamilies, T as DEFAULT_REGISTRY, _ as reseal, a as extractClassUsages, b as remove, c as verify, d as dev, f as BuildError, g as preset, h as ls, i as DEFAULT_CONTENT, l as UpgradeError, m as formatLsText, n as formatBenchTable, o as formatFindingsText, p as build, r as ALL_RULES, s as lint, t as bench, u as upgrade, v as NewFamilyError, x as add, y as newFamily } from "./bench-DG0TCu9M.js";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { readFile } from "node:fs/promises";
5
5
  import path from "node:path";
@@ -17,7 +17,11 @@ const DEFAULT_OUTPUT_DIRS = [
17
17
  "build"
18
18
  ];
19
19
  const OUTPUT_GLOB = "**/*.{html,htm,js,mjs,cjs,rsc}";
20
- const OUTPUT_IGNORE = ["**/node_modules/**", "**/cache/**"];
20
+ const OUTPUT_IGNORE = [
21
+ "**/node_modules/**",
22
+ "**/cache/**",
23
+ "**/dev/**"
24
+ ];
21
25
  async function doctor(options) {
22
26
  const cwd = path.resolve(options.cwd);
23
27
  const config = await readConfig(cwd);
@@ -36,6 +40,7 @@ async function doctor(options) {
36
40
  cwd,
37
41
  absolute: true,
38
42
  onlyFiles: true,
43
+ dot: true,
39
44
  ignore: OUTPUT_IGNORE
40
45
  });
41
46
  const findings = [];
@@ -446,6 +451,7 @@ Finish by installing them yourself:
446
451
  p.log.info(`Setup guide for your stack: ${setupGuideUrl(result.bundler)}`);
447
452
  if (result.themeAction === "supplemented") p.log.info(`Your theme (${result.themePath}) didn't define ${result.supplementedThemeTokens.length} design token${result.supplementedThemeTokens.length === 1 ? "" : "s"} the installed recipes use:\n\n ${result.supplementedThemeTokens.join(", ")}\n\nAppended them with neutral placeholder values (marked block at the end of the file) so recipes render on first run — tune them to your palette.\nReference values: https://shortwind.dev/docs/install#theme-tokens`);
448
453
  if (result.missingThemeTokens.length > 0) p.log.warn(`Your existing theme (${result.themePath}) does not define ${result.missingThemeTokens.length} design token${result.missingThemeTokens.length === 1 ? "" : "s"} the installed recipes use:\n\n ${result.missingThemeTokens.join(", ")}\n\nRecipes referencing them will render colorless until you add the tokens to your @theme.\nThe default token block is documented at https://shortwind.dev/docs/install#theme-tokens`);
454
+ if (result.preset === "starter") p.log.info(`Installed the \`starter\` preset (${result.installedFamilies.length} families). Building a dashboard or internal tool?\n Add the components it'll need: shortwind add badge table stat switch segmented menu sheet\n …or scaffold the lot up front: shortwind init --preset app`);
449
455
  p.outro(`Next: run \`${devCmd(result.packageManager)}\` and check a recipe renders. After a production build, \`npx shortwind doctor\` verifies nothing shipped unexpanded.`);
450
456
  }
451
457
  function devCmd(pm) {
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","names":["runPreset"],"sources":["../src/commands/doctor.ts","../src/cli.ts","../src/bin.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { glob } from \"tinyglobby\";\nimport { buildRegistry, parseRecipeFile } from \"@shortwind/core\";\nimport type { Recipe, Registry } from \"@shortwind/core\";\nimport { findResidualRecipeTokens } from \"@shortwind/tailwind\";\nimport { installedFamilies, readConfig } from \"../project.js\";\nimport { DEFAULT_CONTENT, extractClassUsages } from \"./lint.js\";\n\nexport type DoctorVerdict =\n // No raw recipe tokens in any scanned output file.\n | \"clean\"\n // Raw tokens found AND every recipe referenced in source is among them —\n // nothing was expanded, so the adapter almost certainly never ran.\n | \"not-wired\"\n // Raw tokens found but other recipes did expand — the transform ran and\n // these specific tokens escaped it (dynamic className, opaque region, …).\n | \"leak\"\n // No build output directory found to scan.\n | \"no-output\";\n\nexport type DoctorFinding = { file: string; tokens: string[] };\n\nexport type DoctorOptions = {\n cwd: string;\n // Output directories to scan, relative to cwd. Defaults to whichever of\n // .next/, dist/, out/, build/ exist.\n dirs?: string[];\n // Source globs for the \"what does the project actually use\" scan; same\n // semantics and fallback chain as lint's content option.\n content?: string[];\n};\n\nexport type DoctorResult = {\n ok: boolean;\n verdict: DoctorVerdict;\n outputDirs: string[];\n scannedFiles: number;\n findings: DoctorFinding[];\n // Known recipes referenced from source files, as @-tokens, sorted.\n usedInSource: string[];\n};\n\nconst DEFAULT_OUTPUT_DIRS = [\".next\", \"dist\", \"out\", \"build\"];\n\n// Only formats a framework emits markup/scripts into. Sourcemaps embed the\n// original source (raw tokens are expected there) and are excluded by not\n// being listed; CSS never legitimately carries an @recipe token but Tailwind\n// output is full of @media/@container at-rules, so it stays out too.\nconst OUTPUT_GLOB = \"**/*.{html,htm,js,mjs,cjs,rsc}\";\n\n// Bundler caches (.next/cache, .vite cache dirs) store pre-transform source.\nconst OUTPUT_IGNORE = [\"**/node_modules/**\", \"**/cache/**\"];\n\nexport async function doctor(options: DoctorOptions): Promise<DoctorResult> {\n const cwd = path.resolve(options.cwd);\n const config = await readConfig(cwd);\n const recipesDir = path.join(cwd, config.recipesDir);\n const registry = loadRegistryLenient(recipesDir);\n\n const outputDirs = (options.dirs ?? DEFAULT_OUTPUT_DIRS).filter((d) =>\n existsSync(path.join(cwd, d)),\n );\n if (outputDirs.length === 0) {\n return {\n ok: false,\n verdict: \"no-output\",\n outputDirs: [],\n scannedFiles: 0,\n findings: [],\n usedInSource: [],\n };\n }\n\n const files = await glob(\n outputDirs.map((d) => path.posix.join(d.split(path.sep).join(\"/\"), OUTPUT_GLOB)),\n { cwd, absolute: true, onlyFiles: true, ignore: OUTPUT_IGNORE },\n );\n\n const findings: DoctorFinding[] = [];\n for (const file of files.sort()) {\n const code = await readFile(file, \"utf8\");\n const tokens = findResidualRecipeTokens(code, registry);\n if (tokens.length > 0) findings.push({ file, tokens });\n }\n\n const usedInSource = await scanSourceUsage(cwd, recipesDir, registry, options.content ?? config.content);\n\n let verdict: DoctorVerdict = \"clean\";\n if (findings.length > 0) {\n const raw = new Set(findings.flatMap((f) => f.tokens));\n verdict =\n usedInSource.length > 0 && usedInSource.every((t) => raw.has(t))\n ? \"not-wired\"\n : \"leak\";\n }\n\n return {\n ok: verdict === \"clean\",\n verdict,\n outputDirs,\n scannedFiles: files.length,\n findings,\n usedInSource,\n };\n}\n\n// Doctor's job is scanning build output, not validating recipes — a registry\n// that fails to resolve (cycle, unknown ref: lint's territory) must not stop\n// the leak scan. Fall back to a name-only registry so known-token matching\n// still works.\nfunction loadRegistryLenient(recipesDir: string): Registry {\n const allRecipes: Recipe[] = [];\n for (const family of installedFamilies(recipesDir)) {\n const source = readFileSync(path.join(recipesDir, `${family}.css`), \"utf8\");\n const parsed = parseRecipeFile(source, `${family}.css`);\n if (parsed.ok) allRecipes.push(...parsed.value.recipes);\n }\n const built = buildRegistry(allRecipes);\n if (built.ok) return built.value;\n return {\n flattened: Object.fromEntries(allRecipes.map((r) => [r.name, []])),\n families: {},\n };\n}\n\nasync function scanSourceUsage(\n cwd: string,\n recipesDir: string,\n registry: Registry,\n content: string[] | undefined,\n): Promise<string[]> {\n // Same project-relative recipes ignore as lint (see lint.ts for why the\n // absolute form is unsafe with tinyglobby).\n const recipesIgnore = path.posix.join(\n path.relative(cwd, recipesDir).split(path.sep).join(\"/\") || \".\",\n \"**\",\n );\n const files = await glob(content ?? DEFAULT_CONTENT, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.next/**\", recipesIgnore],\n });\n const used = new Set<string>();\n for (const file of files) {\n const source = await readFile(file, \"utf8\");\n for (const usage of extractClassUsages(source)) {\n for (const token of usage.tokens) {\n if (!token.value.startsWith(\"@\")) continue;\n if (Object.hasOwn(registry.flattened, token.value.slice(1))) used.add(token.value);\n }\n }\n }\n return [...used].sort();\n}\n","import path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { cac } from \"cac\";\nimport { add } from \"./commands/add.js\";\nimport { build, BuildError } from \"./commands/build.js\";\nimport { dev } from \"./commands/dev.js\";\nimport { remove } from \"./commands/remove.js\";\nimport { preset as runPreset } from \"./commands/preset.js\";\nimport { ls, formatLsText } from \"./commands/ls.js\";\nimport {\n upgrade,\n UpgradeError,\n type TouchedContext,\n type UpgradeChoice,\n} from \"./commands/upgrade.js\";\nimport { verify, type VerifyIssue } from \"./commands/verify.js\";\nimport { doctor } from \"./commands/doctor.js\";\nimport { detectProject, type Bundler } from \"./detect.js\";\nimport { lint, formatFindingsText, ALL_RULES, type Rule } from \"./commands/lint.js\";\nimport { init, cliVersion, type InitOptions, DEFAULT_REGISTRY } from \"./init.js\";\nimport { bench, formatBenchTable } from \"./commands/bench.js\";\nimport { newFamily, NewFamilyError } from \"./commands/new.js\";\nimport { reseal } from \"./commands/reseal.js\";\n\nconst KNOWN_PRESETS = [\"starter\", \"app\", \"content\", \"all\", \"none\"];\nexport const DEFAULT_PRESET = \"starter\";\n\n// Decide the init preset without forcing a TTY: an explicit --preset wins,\n// --yes/-y takes the default, and only the bare interactive call prompts —\n// agents and CI run `init --yes` unattended (#68).\nexport async function resolveInitPreset(\n opts: { preset?: string; yes?: boolean },\n prompt: () => Promise<string>,\n): Promise<string> {\n if (opts.preset !== undefined) return opts.preset;\n if (opts.yes) return DEFAULT_PRESET;\n return prompt();\n}\n\nexport async function run(argv: string[] = process.argv): Promise<void> {\n const cli = cac(\"shortwind\");\n\n cli\n .command(\"init\", \"Bootstrap Shortwind in this project\")\n .option(\"--preset <name>\", \"Preset to install (starter|app|content|all|none)\")\n .option(\"-y, --yes\", `Skip prompts and use the default preset (${DEFAULT_PRESET})`)\n .option(\"--registry <url>\", \"Registry origin\", { default: DEFAULT_REGISTRY })\n .option(\"--cwd <dir>\", \"Working directory\", { default: process.cwd() })\n .action(async (opts: { preset?: string; yes?: boolean; registry?: string; cwd?: string }) => {\n const preset = await resolveInitPreset(opts, promptForPreset);\n const options: InitOptions = {\n cwd: opts.cwd ?? process.cwd(),\n preset,\n };\n if (opts.registry !== undefined) options.registry = opts.registry;\n const result = await init(options);\n printInitSummary(result);\n });\n\n cli\n .command(\"add <...families>\", \"Install one or more families\")\n .option(\"--as <name>\", \"Rename the family on install (requires a single family)\")\n .option(\"--all\", \"Install every family in the registry\")\n .option(\"--force\", \"Overwrite existing files\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (\n families: string[],\n opts: { as?: string; all?: boolean; force?: boolean; registry?: string; cwd?: string },\n ) => {\n const addOptions: Parameters<typeof add>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n families,\n };\n if (opts.as !== undefined) addOptions.as = opts.as;\n if (opts.all) addOptions.all = true;\n if (opts.force) addOptions.force = true;\n if (opts.registry !== undefined) addOptions.registry = opts.registry;\n const result = await add(addOptions);\n for (const fam of result.added) p.log.success(`added ${fam}`);\n for (const fam of result.overwritten) p.log.success(`overwrote ${fam}`);\n for (const fam of result.skipped) p.log.warn(`${fam} already exists (use --force)`);\n for (const missing of result.missingDependencies) {\n p.log.warn(\n `${missing.family} references unknown recipes: ${missing.references.join(\", \")}`,\n );\n }\n },\n );\n\n cli\n .command(\"new <family>\", \"Scaffold a new custom recipe family file\")\n .option(\"--force\", \"Overwrite an existing family file\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (family: string, opts: { force?: boolean; cwd?: string }) => {\n try {\n const result = await newFamily({\n cwd: opts.cwd ?? process.cwd(),\n family,\n ...(opts.force ? { force: true } : {}),\n });\n p.log.success(`created ${result.familyPath}`);\n p.log.info(`regenerated ${result.skillPath} — edit the recipes, then \\`shortwind build\\` to refresh.`);\n } catch (err) {\n if (err instanceof NewFamilyError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(1);\n }\n throw err;\n }\n });\n\n cli\n .command(\"remove <...families>\", \"Remove installed families\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (families: string[], opts: { cwd?: string }) => {\n const result = await remove({ cwd: opts.cwd ?? process.cwd(), families });\n for (const fam of result.removed) p.log.success(`removed ${fam}`);\n for (const fam of result.notFound) p.log.warn(`${fam} is not installed`);\n for (const broken of result.brokenDependents) {\n p.log.warn(\n `${broken.dependent} references removed recipes: ${broken.references.join(\", \")}`,\n );\n }\n });\n\n cli\n .command(\"preset <name>\", \"Install every family in the named preset (additive)\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (name: string, opts: { registry?: string; cwd?: string }) => {\n const presetOptions: Parameters<typeof runPreset>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n name,\n };\n if (opts.registry !== undefined) presetOptions.registry = opts.registry;\n const result = await runPreset(presetOptions);\n p.log.info(`preset ${name}: ${result.added.length} added, ${result.skipped.length} already present`);\n });\n\n cli\n .command(\"ls\", \"List installed and available families\")\n .option(\"--installed\", \"Only installed\")\n .option(\"--available\", \"Only available\")\n .option(\"--json\", \"Emit JSON\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (opts: {\n installed?: boolean;\n available?: boolean;\n json?: boolean;\n registry?: string;\n cwd?: string;\n }) => {\n const lsOptions: Parameters<typeof ls>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n };\n if (opts.installed) lsOptions.installedOnly = true;\n if (opts.available) lsOptions.availableOnly = true;\n if (opts.registry !== undefined) lsOptions.registry = opts.registry;\n const result = await ls(lsOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n process.stdout.write(formatLsText(result) + \"\\n\");\n }\n },\n );\n\n cli\n .command(\"build\", \"Regenerate SKILL.md from ./recipes/\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (opts: { cwd?: string }) => {\n try {\n const result = await build({ cwd: opts.cwd ?? process.cwd() });\n if (result.changed) p.log.success(`regenerated ${result.families.length} families`);\n else p.log.info(`up to date (${result.families.length} families)`);\n } catch (err) {\n if (err instanceof BuildError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(1);\n }\n throw err;\n }\n });\n\n cli\n .command(\"dev\", \"Watch ./recipes/ and regenerate SKILL.md on change\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .option(\"--once\", \"Run build once and exit\")\n .action(async (opts: { cwd?: string; once?: boolean }) => {\n if (opts.once) {\n try {\n await build({ cwd: opts.cwd ?? process.cwd() });\n } catch (err) {\n if (err instanceof BuildError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(1);\n }\n throw err;\n }\n return;\n }\n const controller = new AbortController();\n const onSigint = (): void => controller.abort();\n process.on(\"SIGINT\", onSigint);\n try {\n const { stop } = await dev({\n cwd: opts.cwd ?? process.cwd(),\n signal: controller.signal,\n onStatus: (status) => {\n if (status.kind === \"rebuilt\") {\n const msg = `✓ regenerated ${status.families.length} families${status.changed ? \"\" : \" (no changes)\"}`;\n process.stdout.write(msg + \"\\n\");\n } else if (status.kind === \"ready\") {\n process.stdout.write(`watching ${status.recipesDir}\\n`);\n } else {\n process.stderr.write(status.message + \"\\n\");\n }\n },\n });\n // Block until SIGINT (or otherwise aborted), then close the watcher\n // and exit cleanly — without this the listener stays attached and\n // controller.abort() never returns control to the CLI.\n await new Promise<void>((resolve) => {\n if (controller.signal.aborted) resolve();\n else controller.signal.addEventListener(\"abort\", () => resolve(), { once: true });\n });\n await stop();\n } finally {\n process.off(\"SIGINT\", onSigint);\n }\n process.exit(0);\n });\n\n cli\n .command(\"upgrade [...families]\", \"Pull registry updates into ./recipes\")\n .option(\"--check\", \"Read-only — print drift summary and exit nonzero on updates\")\n .option(\"--force\", \"Skip touched-detection; overwrite local edits\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (\n families: string[],\n opts: { check?: boolean; force?: boolean; registry?: string; cwd?: string },\n ) => {\n try {\n const upgradeOptions: Parameters<typeof upgrade>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n families,\n };\n if (opts.check) upgradeOptions.check = true;\n if (opts.force) upgradeOptions.force = true;\n if (opts.registry !== undefined) upgradeOptions.registry = opts.registry;\n if (!opts.check && !opts.force) {\n upgradeOptions.resolver = makeInteractiveResolver();\n }\n const result = await upgrade(upgradeOptions);\n printUpgradeSummary(result.outcomes);\n if (opts.check) {\n if (result.hasUpdates || result.hasTouched) process.exit(1);\n }\n } catch (err) {\n if (err instanceof UpgradeError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(2);\n }\n throw err;\n }\n },\n );\n\n cli\n .command(\"reseal [...families]\", \"Re-sign recipes after intentional edits (updates header sha + lockfile)\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (families: string[], opts: { cwd?: string }) => {\n const result = await reseal({ cwd: opts.cwd ?? process.cwd(), families });\n for (const f of result.resealed) p.log.success(`resealed ${f}`);\n for (const f of result.unchanged) p.log.info(`${f} already sealed`);\n for (const f of result.notFound) p.log.warn(`${f} is not installed`);\n for (const f of result.noHeader) p.log.warn(`${f} has no fingerprint header`);\n if (result.resealed.length === 0 && result.unchanged.length > 0 && result.notFound.length === 0) {\n p.log.success(\"all recipes already sealed\");\n }\n });\n\n cli\n .command(\"verify\", \"Check installed recipes against fingerprint headers and lockfile\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (opts: { cwd?: string }) => {\n const result = await verify({ cwd: opts.cwd ?? process.cwd() });\n if (result.ok) {\n p.log.success(`verified ${result.checked.length} families`);\n return;\n }\n for (const issue of result.issues) {\n const desc = describeVerifyIssue(issue);\n process.stderr.write(`${issue.family}: ${desc}\\n`);\n }\n process.exit(1);\n });\n\n cli\n .command(\"doctor\", \"Scan build output for unexpanded @recipe tokens\")\n .option(\"--dir <path>\", \"Output directory to scan (repeatable; default: .next, dist, out, build)\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (opts: { dir?: string | string[]; json?: boolean; cwd?: string }) => {\n const cwd = opts.cwd ?? process.cwd();\n const doctorOptions: Parameters<typeof doctor>[0] = { cwd };\n if (opts.dir !== undefined) {\n doctorOptions.dirs = Array.isArray(opts.dir) ? opts.dir : [opts.dir];\n }\n const result = await doctor(doctorOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n printDoctorReport(result, cwd);\n }\n if (result.verdict === \"no-output\") process.exit(2);\n if (!result.ok) process.exit(1);\n });\n\n cli\n .command(\"lint\", \"Static analysis over source files and recipes\")\n .option(\"--fix\", \"Apply auto-fixes where supported\")\n .option(\"--rule <rule>\", \"Only run the named rule (repeatable)\")\n .option(\"--content <glob>\", \"Source glob to scan for recipe usage (repeatable; overrides config)\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (opts: {\n fix?: boolean;\n rule?: string | string[];\n content?: string | string[];\n json?: boolean;\n cwd?: string;\n }) => {\n const requested = opts.rule === undefined ? [] : Array.isArray(opts.rule) ? opts.rule : [opts.rule];\n for (const r of requested) {\n if (!ALL_RULES.includes(r as Rule)) {\n process.stderr.write(`unknown rule: ${r}\\n`);\n process.stderr.write(`available: ${ALL_RULES.join(\", \")}\\n`);\n process.exit(2);\n }\n }\n const lintOptions: Parameters<typeof lint>[0] = { cwd: opts.cwd ?? process.cwd() };\n if (opts.fix) lintOptions.fix = true;\n if (requested.length > 0) lintOptions.rules = requested as Rule[];\n if (opts.content !== undefined) {\n lintOptions.content = Array.isArray(opts.content) ? opts.content : [opts.content];\n }\n const result = await lint(lintOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n const text = formatFindingsText(result.findings);\n if (text) process.stdout.write(text + \"\\n\");\n for (const f of result.filesFixed) p.log.success(`fixed ${f}`);\n if (result.scannedFiles === 0) {\n p.log.warn(\n `content scan matched no source files — usage rules (recipe/unused) were skipped.\\n` +\n `Point lint at your sources with \"content\" in shortwind.config.json or --content <glob>.`,\n );\n }\n if (result.findings.length === 0) p.log.success(\"no findings\");\n }\n if (!result.ok) process.exit(1);\n },\n );\n\n cli\n .command(\"bench [path]\", \"Benchmark token savings in a corpus or target directory\")\n .option(\"--corpus\", \"Run benchmark on the built-in corpus\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (pathArg: string | undefined, opts: { corpus?: boolean; json?: boolean; cwd?: string }) => {\n const benchOptions: Parameters<typeof bench>[0] = { cwd: opts.cwd ?? process.cwd() };\n if (opts.corpus) benchOptions.corpus = true;\n if (pathArg !== undefined) benchOptions.path = pathArg;\n const result = await bench(benchOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n const text = formatBenchTable(result);\n process.stdout.write(text + \"\\n\");\n }\n });\n\n cli.help();\n cli.version(cliVersion() ?? \"0.0.0\");\n // cac's parse() invokes the matched command's async action but does NOT await\n // it, so a rejection inside any async command (network failure in `add`, a\n // rethrow in `build`/`upgrade`, …) escapes bin.ts's `run().catch` and prints\n // a raw unhandled-rejection dump. Parse without running, then await the\n // command so its promise flows back to the caller's catch.\n cli.parse(argv, { run: false });\n await cli.runMatchedCommand();\n}\n\nfunction makeInteractiveResolver() {\n return async (ctx: TouchedContext): Promise<UpgradeChoice> => {\n process.stdout.write(\n pc.yellow(`\\n${ctx.family}: locally modified — incoming ${ctx.incoming.version}\\n`),\n );\n const choice = await p.select({\n message: `Resolve ${ctx.family}`,\n options: [\n { value: \"accept\", label: \"Accept new (discard local edits)\" },\n { value: \"keep\", label: \"Keep yours\" },\n { value: \"skip\", label: \"Skip for now\" },\n ],\n });\n if (p.isCancel(choice)) return \"skip\";\n return choice as UpgradeChoice;\n };\n}\n\nfunction printUpgradeSummary(outcomes: Awaited<ReturnType<typeof upgrade>>[\"outcomes\"]): void {\n for (const o of outcomes) {\n if (o.action === \"updated\") {\n process.stdout.write(pc.green(`✓ ${o.family} ${o.from} → ${o.to}\\n`));\n } else if (o.action === \"would-update\") {\n process.stdout.write(pc.cyan(`→ ${o.family} ${o.from} → ${o.to} (available)\\n`));\n } else if (o.action === \"would-review\") {\n process.stdout.write(pc.yellow(`! ${o.family} ${o.from} → ${o.to} (touched; needs review)\\n`));\n } else if (o.action === \"kept\" && o.reason === \"user-chose-keep\") {\n process.stdout.write(pc.dim(` ${o.family} kept local\\n`));\n } else if (o.action === \"skipped\") {\n process.stdout.write(pc.dim(` ${o.family} skipped (${o.reason})\\n`));\n }\n }\n}\n\n// The whole point of doctor (#84) is telling \"you forgot to wire the adapter\"\n// apart from \"the adapter ran and something leaked\" — both otherwise present\n// as a green build that ships raw @recipe text.\nfunction printDoctorReport(result: Awaited<ReturnType<typeof doctor>>, cwd: string): void {\n if (result.verdict === \"no-output\") {\n p.log.error(\n `no build output found (looked for .next/, dist/, out/, build/).\\n` +\n `Run your framework's build first, or point doctor at it with --dir <path>.`,\n );\n return;\n }\n if (result.verdict === \"clean\") {\n p.log.success(\n `no unexpanded recipe tokens in ${result.outputDirs.join(\", \")} (${result.scannedFiles} files scanned)`,\n );\n return;\n }\n for (const f of result.findings) {\n process.stderr.write(`${path.relative(cwd, f.file)}: ${f.tokens.join(\", \")}\\n`);\n }\n const tokenCount = new Set(result.findings.flatMap((f) => f.tokens)).size;\n if (result.verdict === \"not-wired\") {\n const bundler = detectProject(cwd).bundler;\n p.log.error(\n `found ${tokenCount} raw @recipe token${tokenCount === 1 ? \"\" : \"s\"} in build output and ` +\n `every recipe your source references is among them — it looks like no Shortwind ` +\n `transform ran during the build.\\n` +\n `Is the adapter wired? ${adapterHint(bundler)}\\n` +\n `Setup guide: ${setupGuideUrl(bundler)}`,\n );\n } else {\n p.log.error(\n `found ${tokenCount} raw @recipe token${tokenCount === 1 ? \"\" : \"s\"} in build output. ` +\n `The Shortwind transform ran (other recipes expanded), so these specific tokens ` +\n `escaped it — typically a className built from a variable/prop/template, or markup ` +\n `in a region the expander treats as opaque.\\n` +\n `See https://shortwind.dev/docs/dynamic-classes`,\n );\n }\n}\n\n// Slugs match site/src/content/docs/setup-<bundler>.md (#85).\nfunction setupGuideUrl(bundler: Bundler): string {\n return bundler === \"unknown\"\n ? \"https://shortwind.dev/docs/install\"\n : `https://shortwind.dev/docs/setup-${bundler}`;\n}\n\nfunction adapterHint(bundler: Bundler): string {\n switch (bundler) {\n case \"next\":\n return \"Next needs `export default withShortwind()(nextConfig)` in next.config — note the call is curried.\";\n case \"vite\":\n return \"Vite needs `shortwind()` in the vite.config plugins array: `plugins: [shortwind(), tailwindcss(), ...]`.\";\n case \"astro\":\n return \"Astro needs `shortwind()` in astro.config `integrations`.\";\n default:\n return \"Add the Shortwind plugin for your bundler (see the setup guide).\";\n }\n}\n\nfunction describeVerifyIssue(issue: VerifyIssue): string {\n switch (issue.kind) {\n case \"missing-header\":\n return \"no fingerprint header — recipe was hand-stripped\";\n case \"header-tampered\":\n return `header sha ${issue.recorded} but body hashes to ${issue.actual}`;\n case \"legacy-fingerprint\":\n return `sealed with an older fingerprint format (${issue.recorded}) — run \\`shortwind reseal\\` to upgrade it (the recipe body is unchanged)`;\n case \"lockfile-mismatch\":\n return `lockfile expects ${issue.locked} but body hashes to ${issue.actual}`;\n case \"missing-lock-entry\":\n return \"installed but not recorded in lockfile\";\n case \"missing-file\":\n return \"in lockfile but file is missing\";\n }\n}\n\nasync function promptForPreset(): Promise<string> {\n const choice = await p.select({\n message: \"Pick a preset\",\n options: KNOWN_PRESETS.map((name) => ({ value: name, label: name })),\n });\n if (p.isCancel(choice)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n return choice;\n}\n\nfunction installCmd(pm: Awaited<ReturnType<typeof init>>[\"packageManager\"]): string {\n switch (pm) {\n case \"bun\":\n return \"bun add -d\";\n case \"npm\":\n return \"npm install -D\";\n default:\n return `${pm} add -D`;\n }\n}\n\nfunction printInitSummary(result: Awaited<ReturnType<typeof init>>): void {\n p.note(\n [\n `preset: ${result.preset}`,\n `registry: ${result.registry}`,\n `package manager: ${result.packageManager}`,\n `families copied: ${result.installedFamilies.length}`,\n `families skipped: ${result.skippedFamilies.length}`,\n `adapters: ${result.installOk ? result.installedPackages.join(\", \") || \"none\" : \"install failed — see below\"}`,\n ``,\n `config: ${result.configPath}`,\n `vscode settings: ${result.vscodePath}`,\n `pre-commit: ${result.huskyPath ?? \"skipped (not a git repository)\"}`,\n `SKILL.md: ${result.skillPath}`,\n `theme: ${describeTheme(result)}`,\n `tones: ${result.tonesAction === \"written\" ? `scaffolded default tones in ${result.tonesPath}` : \"skipped\"}`,\n `bundler config: ${describeBundlerConfig(result)}`,\n `agent guide: ${describeAgentsFile(result)}`,\n ].join(\"\\n\"),\n \"shortwind init\",\n );\n if (!result.installOk) {\n const v = cliVersion();\n const specs = result.installedPackages.map((p) => (v ? `${p}@${v}` : p)).join(\" \");\n p.log.warn(\n `Couldn't auto-install adapters (your recipes and config were still scaffolded).\\n` +\n `Finish by installing them yourself:\\n\\n` +\n ` ${installCmd(result.packageManager)} ${specs}\\n\\n` +\n `(${result.installError ?? \"unknown error\"})`,\n );\n }\n if (result.bundlerConfigAction === \"manual\" && result.bundlerConfigSnippet) {\n p.log.warn(`Add the plugin to your bundler config:\\n\\n${result.bundlerConfigSnippet}`);\n }\n p.log.info(`Setup guide for your stack: ${setupGuideUrl(result.bundler)}`);\n if (result.themeAction === \"supplemented\") {\n p.log.info(\n `Your theme (${result.themePath}) didn't define ${result.supplementedThemeTokens.length} design token${result.supplementedThemeTokens.length === 1 ? \"\" : \"s\"} the installed recipes use:\\n\\n` +\n ` ${result.supplementedThemeTokens.join(\", \")}\\n\\n` +\n `Appended them with neutral placeholder values (marked block at the end of the file) so recipes render on first run — tune them to your palette.\\n` +\n `Reference values: https://shortwind.dev/docs/install#theme-tokens`,\n );\n }\n if (result.missingThemeTokens.length > 0) {\n p.log.warn(\n `Your existing theme (${result.themePath}) does not define ${result.missingThemeTokens.length} design token${result.missingThemeTokens.length === 1 ? \"\" : \"s\"} the installed recipes use:\\n\\n` +\n ` ${result.missingThemeTokens.join(\", \")}\\n\\n` +\n `Recipes referencing them will render colorless until you add the tokens to your @theme.\\n` +\n `The default token block is documented at https://shortwind.dev/docs/install#theme-tokens`,\n );\n }\n p.outro(\n `Next: run \\`${devCmd(result.packageManager)}\\` and check a recipe renders. After a production build, \\`npx shortwind doctor\\` verifies nothing shipped unexpanded.`,\n );\n}\n\n// `npm dev` is not a thing — npm needs the `run` form; pnpm/yarn/bun accept\n// the bare script name.\nfunction devCmd(pm: Awaited<ReturnType<typeof init>>[\"packageManager\"]): string {\n return pm === \"npm\" ? \"npm run dev\" : `${pm} dev`;\n}\n\nfunction describeAgentsFile(result: Awaited<ReturnType<typeof init>>): string {\n switch (result.agentsFileAction) {\n case \"created\":\n return `wrote ${result.agentsFilePath}`;\n case \"appended\":\n return `added recipe pointer to ${result.agentsFilePath}`;\n case \"skipped\":\n return `pointer already in ${result.agentsFilePath}`;\n }\n}\n\nfunction describeBundlerConfig(result: Awaited<ReturnType<typeof init>>): string {\n switch (result.bundlerConfigAction) {\n case \"patched\":\n return `plugin added to ${result.bundlerConfigPath}`;\n case \"manual\":\n return \"needs a manual edit (see below)\";\n case \"skipped\":\n return result.bundlerConfigPath\n ? `already wired in ${result.bundlerConfigPath}`\n : \"skipped (no supported bundler)\";\n }\n}\n\nfunction describeTheme(result: Awaited<ReturnType<typeof init>>): string {\n switch (result.themeAction) {\n case \"injected\":\n return `tokens added to ${result.themePath}`;\n case \"created\":\n return `wrote ${result.themePath}`;\n case \"supplemented\":\n return `kept your theme; appended ${result.supplementedThemeTokens.length} missing tokens to ${result.themePath}`;\n case \"skipped\":\n return result.themePath\n ? `left existing theme in ${result.themePath} untouched`\n : \"skipped (no Tailwind v4 CSS entry — define color tokens yourself)\";\n }\n}\n","#!/usr/bin/env node\nimport { run } from \"./cli.js\";\n\nrun().catch((err) => {\n console.error(err instanceof Error ? err.stack ?? err.message : err);\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","names":["runPreset"],"sources":["../src/commands/doctor.ts","../src/cli.ts","../src/bin.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { glob } from \"tinyglobby\";\nimport { buildRegistry, parseRecipeFile } from \"@shortwind/core\";\nimport type { Recipe, Registry } from \"@shortwind/core\";\nimport { findResidualRecipeTokens } from \"@shortwind/tailwind\";\nimport { installedFamilies, readConfig } from \"../project.js\";\nimport { DEFAULT_CONTENT, extractClassUsages } from \"./lint.js\";\n\nexport type DoctorVerdict =\n // No raw recipe tokens in any scanned output file.\n | \"clean\"\n // Raw tokens found AND every recipe referenced in source is among them —\n // nothing was expanded, so the adapter almost certainly never ran.\n | \"not-wired\"\n // Raw tokens found but other recipes did expand — the transform ran and\n // these specific tokens escaped it (dynamic className, opaque region, …).\n | \"leak\"\n // No build output directory found to scan.\n | \"no-output\";\n\nexport type DoctorFinding = { file: string; tokens: string[] };\n\nexport type DoctorOptions = {\n cwd: string;\n // Output directories to scan, relative to cwd. Defaults to whichever of\n // .next/, dist/, out/, build/ exist.\n dirs?: string[];\n // Source globs for the \"what does the project actually use\" scan; same\n // semantics and fallback chain as lint's content option.\n content?: string[];\n};\n\nexport type DoctorResult = {\n ok: boolean;\n verdict: DoctorVerdict;\n outputDirs: string[];\n scannedFiles: number;\n findings: DoctorFinding[];\n // Known recipes referenced from source files, as @-tokens, sorted.\n usedInSource: string[];\n};\n\nconst DEFAULT_OUTPUT_DIRS = [\".next\", \"dist\", \"out\", \"build\"];\n\n// Only formats a framework emits markup/scripts into. Sourcemaps embed the\n// original source (raw tokens are expected there) and are excluded by not\n// being listed; CSS never legitimately carries an @recipe token but Tailwind\n// output is full of @media/@container at-rules, so it stays out too.\nconst OUTPUT_GLOB = \"**/*.{html,htm,js,mjs,cjs,rsc}\";\n\n// Bundler caches (.next/cache, .vite cache dirs) store pre-transform source.\n// .next/dev is the dev-server's output, not a production artifact — and its\n// chunks inline framework internals (e.g. Next's own `{@link …}` JSDoc, which\n// collides with the @link recipe), so scanning it produces phantom leaks (#91).\nconst OUTPUT_IGNORE = [\"**/node_modules/**\", \"**/cache/**\", \"**/dev/**\"];\n\nexport async function doctor(options: DoctorOptions): Promise<DoctorResult> {\n const cwd = path.resolve(options.cwd);\n const config = await readConfig(cwd);\n const recipesDir = path.join(cwd, config.recipesDir);\n const registry = loadRegistryLenient(recipesDir);\n\n const outputDirs = (options.dirs ?? DEFAULT_OUTPUT_DIRS).filter((d) =>\n existsSync(path.join(cwd, d)),\n );\n if (outputDirs.length === 0) {\n return {\n ok: false,\n verdict: \"no-output\",\n outputDirs: [],\n scannedFiles: 0,\n findings: [],\n usedInSource: [],\n };\n }\n\n const files = await glob(\n outputDirs.map((d) => path.posix.join(d.split(path.sep).join(\"/\"), OUTPUT_GLOB)),\n // dot: true so the ignore globs cross dot-segments — without it `**/dev/**`\n // and `**/cache/**` never match `.next/dev` / `.next/cache` (the leading\n // `**` won't span a dot dir), and those caches get scanned anyway (#91).\n { cwd, absolute: true, onlyFiles: true, dot: true, ignore: OUTPUT_IGNORE },\n );\n\n const findings: DoctorFinding[] = [];\n for (const file of files.sort()) {\n const code = await readFile(file, \"utf8\");\n const tokens = findResidualRecipeTokens(code, registry);\n if (tokens.length > 0) findings.push({ file, tokens });\n }\n\n const usedInSource = await scanSourceUsage(cwd, recipesDir, registry, options.content ?? config.content);\n\n let verdict: DoctorVerdict = \"clean\";\n if (findings.length > 0) {\n const raw = new Set(findings.flatMap((f) => f.tokens));\n verdict =\n usedInSource.length > 0 && usedInSource.every((t) => raw.has(t))\n ? \"not-wired\"\n : \"leak\";\n }\n\n return {\n ok: verdict === \"clean\",\n verdict,\n outputDirs,\n scannedFiles: files.length,\n findings,\n usedInSource,\n };\n}\n\n// Doctor's job is scanning build output, not validating recipes — a registry\n// that fails to resolve (cycle, unknown ref: lint's territory) must not stop\n// the leak scan. Fall back to a name-only registry so known-token matching\n// still works.\nfunction loadRegistryLenient(recipesDir: string): Registry {\n const allRecipes: Recipe[] = [];\n for (const family of installedFamilies(recipesDir)) {\n const source = readFileSync(path.join(recipesDir, `${family}.css`), \"utf8\");\n const parsed = parseRecipeFile(source, `${family}.css`);\n if (parsed.ok) allRecipes.push(...parsed.value.recipes);\n }\n const built = buildRegistry(allRecipes);\n if (built.ok) return built.value;\n return {\n flattened: Object.fromEntries(allRecipes.map((r) => [r.name, []])),\n families: {},\n };\n}\n\nasync function scanSourceUsage(\n cwd: string,\n recipesDir: string,\n registry: Registry,\n content: string[] | undefined,\n): Promise<string[]> {\n // Same project-relative recipes ignore as lint (see lint.ts for why the\n // absolute form is unsafe with tinyglobby).\n const recipesIgnore = path.posix.join(\n path.relative(cwd, recipesDir).split(path.sep).join(\"/\") || \".\",\n \"**\",\n );\n const files = await glob(content ?? DEFAULT_CONTENT, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.next/**\", recipesIgnore],\n });\n const used = new Set<string>();\n for (const file of files) {\n const source = await readFile(file, \"utf8\");\n for (const usage of extractClassUsages(source)) {\n for (const token of usage.tokens) {\n if (!token.value.startsWith(\"@\")) continue;\n if (Object.hasOwn(registry.flattened, token.value.slice(1))) used.add(token.value);\n }\n }\n }\n return [...used].sort();\n}\n","import path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { cac } from \"cac\";\nimport { add } from \"./commands/add.js\";\nimport { build, BuildError } from \"./commands/build.js\";\nimport { dev } from \"./commands/dev.js\";\nimport { remove } from \"./commands/remove.js\";\nimport { preset as runPreset } from \"./commands/preset.js\";\nimport { ls, formatLsText } from \"./commands/ls.js\";\nimport {\n upgrade,\n UpgradeError,\n type TouchedContext,\n type UpgradeChoice,\n} from \"./commands/upgrade.js\";\nimport { verify, type VerifyIssue } from \"./commands/verify.js\";\nimport { doctor } from \"./commands/doctor.js\";\nimport { detectProject, type Bundler } from \"./detect.js\";\nimport { lint, formatFindingsText, ALL_RULES, type Rule } from \"./commands/lint.js\";\nimport { init, cliVersion, type InitOptions, DEFAULT_REGISTRY } from \"./init.js\";\nimport { bench, formatBenchTable } from \"./commands/bench.js\";\nimport { newFamily, NewFamilyError } from \"./commands/new.js\";\nimport { reseal } from \"./commands/reseal.js\";\n\nconst KNOWN_PRESETS = [\"starter\", \"app\", \"content\", \"all\", \"none\"];\nexport const DEFAULT_PRESET = \"starter\";\n\n// Decide the init preset without forcing a TTY: an explicit --preset wins,\n// --yes/-y takes the default, and only the bare interactive call prompts —\n// agents and CI run `init --yes` unattended (#68).\nexport async function resolveInitPreset(\n opts: { preset?: string; yes?: boolean },\n prompt: () => Promise<string>,\n): Promise<string> {\n if (opts.preset !== undefined) return opts.preset;\n if (opts.yes) return DEFAULT_PRESET;\n return prompt();\n}\n\nexport async function run(argv: string[] = process.argv): Promise<void> {\n const cli = cac(\"shortwind\");\n\n cli\n .command(\"init\", \"Bootstrap Shortwind in this project\")\n .option(\"--preset <name>\", \"Preset to install (starter|app|content|all|none)\")\n .option(\"-y, --yes\", `Skip prompts and use the default preset (${DEFAULT_PRESET})`)\n .option(\"--registry <url>\", \"Registry origin\", { default: DEFAULT_REGISTRY })\n .option(\"--cwd <dir>\", \"Working directory\", { default: process.cwd() })\n .action(async (opts: { preset?: string; yes?: boolean; registry?: string; cwd?: string }) => {\n const preset = await resolveInitPreset(opts, promptForPreset);\n const options: InitOptions = {\n cwd: opts.cwd ?? process.cwd(),\n preset,\n };\n if (opts.registry !== undefined) options.registry = opts.registry;\n const result = await init(options);\n printInitSummary(result);\n });\n\n cli\n .command(\"add <...families>\", \"Install one or more families\")\n .option(\"--as <name>\", \"Rename the family on install (requires a single family)\")\n .option(\"--all\", \"Install every family in the registry\")\n .option(\"--force\", \"Overwrite existing files\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (\n families: string[],\n opts: { as?: string; all?: boolean; force?: boolean; registry?: string; cwd?: string },\n ) => {\n const addOptions: Parameters<typeof add>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n families,\n };\n if (opts.as !== undefined) addOptions.as = opts.as;\n if (opts.all) addOptions.all = true;\n if (opts.force) addOptions.force = true;\n if (opts.registry !== undefined) addOptions.registry = opts.registry;\n const result = await add(addOptions);\n for (const fam of result.added) p.log.success(`added ${fam}`);\n for (const fam of result.overwritten) p.log.success(`overwrote ${fam}`);\n for (const fam of result.skipped) p.log.warn(`${fam} already exists (use --force)`);\n for (const missing of result.missingDependencies) {\n p.log.warn(\n `${missing.family} references unknown recipes: ${missing.references.join(\", \")}`,\n );\n }\n },\n );\n\n cli\n .command(\"new <family>\", \"Scaffold a new custom recipe family file\")\n .option(\"--force\", \"Overwrite an existing family file\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (family: string, opts: { force?: boolean; cwd?: string }) => {\n try {\n const result = await newFamily({\n cwd: opts.cwd ?? process.cwd(),\n family,\n ...(opts.force ? { force: true } : {}),\n });\n p.log.success(`created ${result.familyPath}`);\n p.log.info(`regenerated ${result.skillPath} — edit the recipes, then \\`shortwind build\\` to refresh.`);\n } catch (err) {\n if (err instanceof NewFamilyError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(1);\n }\n throw err;\n }\n });\n\n cli\n .command(\"remove <...families>\", \"Remove installed families\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (families: string[], opts: { cwd?: string }) => {\n const result = await remove({ cwd: opts.cwd ?? process.cwd(), families });\n for (const fam of result.removed) p.log.success(`removed ${fam}`);\n for (const fam of result.notFound) p.log.warn(`${fam} is not installed`);\n for (const broken of result.brokenDependents) {\n p.log.warn(\n `${broken.dependent} references removed recipes: ${broken.references.join(\", \")}`,\n );\n }\n });\n\n cli\n .command(\"preset <name>\", \"Install every family in the named preset (additive)\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (name: string, opts: { registry?: string; cwd?: string }) => {\n const presetOptions: Parameters<typeof runPreset>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n name,\n };\n if (opts.registry !== undefined) presetOptions.registry = opts.registry;\n const result = await runPreset(presetOptions);\n p.log.info(`preset ${name}: ${result.added.length} added, ${result.skipped.length} already present`);\n });\n\n cli\n .command(\"ls\", \"List installed and available families\")\n .option(\"--installed\", \"Only installed\")\n .option(\"--available\", \"Only available\")\n .option(\"--json\", \"Emit JSON\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (opts: {\n installed?: boolean;\n available?: boolean;\n json?: boolean;\n registry?: string;\n cwd?: string;\n }) => {\n const lsOptions: Parameters<typeof ls>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n };\n if (opts.installed) lsOptions.installedOnly = true;\n if (opts.available) lsOptions.availableOnly = true;\n if (opts.registry !== undefined) lsOptions.registry = opts.registry;\n const result = await ls(lsOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n process.stdout.write(formatLsText(result) + \"\\n\");\n }\n },\n );\n\n cli\n .command(\"build\", \"Regenerate SKILL.md from ./recipes/\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (opts: { cwd?: string }) => {\n try {\n const result = await build({ cwd: opts.cwd ?? process.cwd() });\n if (result.changed) p.log.success(`regenerated ${result.families.length} families`);\n else p.log.info(`up to date (${result.families.length} families)`);\n } catch (err) {\n if (err instanceof BuildError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(1);\n }\n throw err;\n }\n });\n\n cli\n .command(\"dev\", \"Watch ./recipes/ and regenerate SKILL.md on change\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .option(\"--once\", \"Run build once and exit\")\n .action(async (opts: { cwd?: string; once?: boolean }) => {\n if (opts.once) {\n try {\n await build({ cwd: opts.cwd ?? process.cwd() });\n } catch (err) {\n if (err instanceof BuildError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(1);\n }\n throw err;\n }\n return;\n }\n const controller = new AbortController();\n const onSigint = (): void => controller.abort();\n process.on(\"SIGINT\", onSigint);\n try {\n const { stop } = await dev({\n cwd: opts.cwd ?? process.cwd(),\n signal: controller.signal,\n onStatus: (status) => {\n if (status.kind === \"rebuilt\") {\n const msg = `✓ regenerated ${status.families.length} families${status.changed ? \"\" : \" (no changes)\"}`;\n process.stdout.write(msg + \"\\n\");\n } else if (status.kind === \"ready\") {\n process.stdout.write(`watching ${status.recipesDir}\\n`);\n } else {\n process.stderr.write(status.message + \"\\n\");\n }\n },\n });\n // Block until SIGINT (or otherwise aborted), then close the watcher\n // and exit cleanly — without this the listener stays attached and\n // controller.abort() never returns control to the CLI.\n await new Promise<void>((resolve) => {\n if (controller.signal.aborted) resolve();\n else controller.signal.addEventListener(\"abort\", () => resolve(), { once: true });\n });\n await stop();\n } finally {\n process.off(\"SIGINT\", onSigint);\n }\n process.exit(0);\n });\n\n cli\n .command(\"upgrade [...families]\", \"Pull registry updates into ./recipes\")\n .option(\"--check\", \"Read-only — print drift summary and exit nonzero on updates\")\n .option(\"--force\", \"Skip touched-detection; overwrite local edits\")\n .option(\"--registry <url>\", \"Registry origin\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (\n families: string[],\n opts: { check?: boolean; force?: boolean; registry?: string; cwd?: string },\n ) => {\n try {\n const upgradeOptions: Parameters<typeof upgrade>[0] = {\n cwd: opts.cwd ?? process.cwd(),\n families,\n };\n if (opts.check) upgradeOptions.check = true;\n if (opts.force) upgradeOptions.force = true;\n if (opts.registry !== undefined) upgradeOptions.registry = opts.registry;\n if (!opts.check && !opts.force) {\n upgradeOptions.resolver = makeInteractiveResolver();\n }\n const result = await upgrade(upgradeOptions);\n printUpgradeSummary(result.outcomes);\n if (opts.check) {\n if (result.hasUpdates || result.hasTouched) process.exit(1);\n }\n } catch (err) {\n if (err instanceof UpgradeError) {\n process.stderr.write(err.message + \"\\n\");\n process.exit(2);\n }\n throw err;\n }\n },\n );\n\n cli\n .command(\"reseal [...families]\", \"Re-sign recipes after intentional edits (updates header sha + lockfile)\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (families: string[], opts: { cwd?: string }) => {\n const result = await reseal({ cwd: opts.cwd ?? process.cwd(), families });\n for (const f of result.resealed) p.log.success(`resealed ${f}`);\n for (const f of result.unchanged) p.log.info(`${f} already sealed`);\n for (const f of result.notFound) p.log.warn(`${f} is not installed`);\n for (const f of result.noHeader) p.log.warn(`${f} has no fingerprint header`);\n if (result.resealed.length === 0 && result.unchanged.length > 0 && result.notFound.length === 0) {\n p.log.success(\"all recipes already sealed\");\n }\n });\n\n cli\n .command(\"verify\", \"Check installed recipes against fingerprint headers and lockfile\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (opts: { cwd?: string }) => {\n const result = await verify({ cwd: opts.cwd ?? process.cwd() });\n if (result.ok) {\n p.log.success(`verified ${result.checked.length} families`);\n return;\n }\n for (const issue of result.issues) {\n const desc = describeVerifyIssue(issue);\n process.stderr.write(`${issue.family}: ${desc}\\n`);\n }\n process.exit(1);\n });\n\n cli\n .command(\"doctor\", \"Scan build output for unexpanded @recipe tokens\")\n .option(\"--dir <path>\", \"Output directory to scan (repeatable; default: .next, dist, out, build)\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (opts: { dir?: string | string[]; json?: boolean; cwd?: string }) => {\n const cwd = opts.cwd ?? process.cwd();\n const doctorOptions: Parameters<typeof doctor>[0] = { cwd };\n if (opts.dir !== undefined) {\n doctorOptions.dirs = Array.isArray(opts.dir) ? opts.dir : [opts.dir];\n }\n const result = await doctor(doctorOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n printDoctorReport(result, cwd);\n }\n if (result.verdict === \"no-output\") process.exit(2);\n if (!result.ok) process.exit(1);\n });\n\n cli\n .command(\"lint\", \"Static analysis over source files and recipes\")\n .option(\"--fix\", \"Apply auto-fixes where supported\")\n .option(\"--rule <rule>\", \"Only run the named rule (repeatable)\")\n .option(\"--content <glob>\", \"Source glob to scan for recipe usage (repeatable; overrides config)\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(\n async (opts: {\n fix?: boolean;\n rule?: string | string[];\n content?: string | string[];\n json?: boolean;\n cwd?: string;\n }) => {\n const requested = opts.rule === undefined ? [] : Array.isArray(opts.rule) ? opts.rule : [opts.rule];\n for (const r of requested) {\n if (!ALL_RULES.includes(r as Rule)) {\n process.stderr.write(`unknown rule: ${r}\\n`);\n process.stderr.write(`available: ${ALL_RULES.join(\", \")}\\n`);\n process.exit(2);\n }\n }\n const lintOptions: Parameters<typeof lint>[0] = { cwd: opts.cwd ?? process.cwd() };\n if (opts.fix) lintOptions.fix = true;\n if (requested.length > 0) lintOptions.rules = requested as Rule[];\n if (opts.content !== undefined) {\n lintOptions.content = Array.isArray(opts.content) ? opts.content : [opts.content];\n }\n const result = await lint(lintOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n const text = formatFindingsText(result.findings);\n if (text) process.stdout.write(text + \"\\n\");\n for (const f of result.filesFixed) p.log.success(`fixed ${f}`);\n if (result.scannedFiles === 0) {\n p.log.warn(\n `content scan matched no source files — usage rules (recipe/unused) were skipped.\\n` +\n `Point lint at your sources with \"content\" in shortwind.config.json or --content <glob>.`,\n );\n }\n if (result.findings.length === 0) p.log.success(\"no findings\");\n }\n if (!result.ok) process.exit(1);\n },\n );\n\n cli\n .command(\"bench [path]\", \"Benchmark token savings in a corpus or target directory\")\n .option(\"--corpus\", \"Run benchmark on the built-in corpus\")\n .option(\"--json\", \"Emit machine-readable JSON\")\n .option(\"--cwd <dir>\", \"Working directory\")\n .action(async (pathArg: string | undefined, opts: { corpus?: boolean; json?: boolean; cwd?: string }) => {\n const benchOptions: Parameters<typeof bench>[0] = { cwd: opts.cwd ?? process.cwd() };\n if (opts.corpus) benchOptions.corpus = true;\n if (pathArg !== undefined) benchOptions.path = pathArg;\n const result = await bench(benchOptions);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n const text = formatBenchTable(result);\n process.stdout.write(text + \"\\n\");\n }\n });\n\n cli.help();\n cli.version(cliVersion() ?? \"0.0.0\");\n // cac's parse() invokes the matched command's async action but does NOT await\n // it, so a rejection inside any async command (network failure in `add`, a\n // rethrow in `build`/`upgrade`, …) escapes bin.ts's `run().catch` and prints\n // a raw unhandled-rejection dump. Parse without running, then await the\n // command so its promise flows back to the caller's catch.\n cli.parse(argv, { run: false });\n await cli.runMatchedCommand();\n}\n\nfunction makeInteractiveResolver() {\n return async (ctx: TouchedContext): Promise<UpgradeChoice> => {\n process.stdout.write(\n pc.yellow(`\\n${ctx.family}: locally modified — incoming ${ctx.incoming.version}\\n`),\n );\n const choice = await p.select({\n message: `Resolve ${ctx.family}`,\n options: [\n { value: \"accept\", label: \"Accept new (discard local edits)\" },\n { value: \"keep\", label: \"Keep yours\" },\n { value: \"skip\", label: \"Skip for now\" },\n ],\n });\n if (p.isCancel(choice)) return \"skip\";\n return choice as UpgradeChoice;\n };\n}\n\nfunction printUpgradeSummary(outcomes: Awaited<ReturnType<typeof upgrade>>[\"outcomes\"]): void {\n for (const o of outcomes) {\n if (o.action === \"updated\") {\n process.stdout.write(pc.green(`✓ ${o.family} ${o.from} → ${o.to}\\n`));\n } else if (o.action === \"would-update\") {\n process.stdout.write(pc.cyan(`→ ${o.family} ${o.from} → ${o.to} (available)\\n`));\n } else if (o.action === \"would-review\") {\n process.stdout.write(pc.yellow(`! ${o.family} ${o.from} → ${o.to} (touched; needs review)\\n`));\n } else if (o.action === \"kept\" && o.reason === \"user-chose-keep\") {\n process.stdout.write(pc.dim(` ${o.family} kept local\\n`));\n } else if (o.action === \"skipped\") {\n process.stdout.write(pc.dim(` ${o.family} skipped (${o.reason})\\n`));\n }\n }\n}\n\n// The whole point of doctor (#84) is telling \"you forgot to wire the adapter\"\n// apart from \"the adapter ran and something leaked\" — both otherwise present\n// as a green build that ships raw @recipe text.\nfunction printDoctorReport(result: Awaited<ReturnType<typeof doctor>>, cwd: string): void {\n if (result.verdict === \"no-output\") {\n p.log.error(\n `no build output found (looked for .next/, dist/, out/, build/).\\n` +\n `Run your framework's build first, or point doctor at it with --dir <path>.`,\n );\n return;\n }\n if (result.verdict === \"clean\") {\n p.log.success(\n `no unexpanded recipe tokens in ${result.outputDirs.join(\", \")} (${result.scannedFiles} files scanned)`,\n );\n return;\n }\n for (const f of result.findings) {\n process.stderr.write(`${path.relative(cwd, f.file)}: ${f.tokens.join(\", \")}\\n`);\n }\n const tokenCount = new Set(result.findings.flatMap((f) => f.tokens)).size;\n if (result.verdict === \"not-wired\") {\n const bundler = detectProject(cwd).bundler;\n p.log.error(\n `found ${tokenCount} raw @recipe token${tokenCount === 1 ? \"\" : \"s\"} in build output and ` +\n `every recipe your source references is among them — it looks like no Shortwind ` +\n `transform ran during the build.\\n` +\n `Is the adapter wired? ${adapterHint(bundler)}\\n` +\n `Setup guide: ${setupGuideUrl(bundler)}`,\n );\n } else {\n p.log.error(\n `found ${tokenCount} raw @recipe token${tokenCount === 1 ? \"\" : \"s\"} in build output. ` +\n `The Shortwind transform ran (other recipes expanded), so these specific tokens ` +\n `escaped it — typically a className built from a variable/prop/template, or markup ` +\n `in a region the expander treats as opaque.\\n` +\n `See https://shortwind.dev/docs/dynamic-classes`,\n );\n }\n}\n\n// Slugs match site/src/content/docs/setup-<bundler>.md (#85).\nfunction setupGuideUrl(bundler: Bundler): string {\n return bundler === \"unknown\"\n ? \"https://shortwind.dev/docs/install\"\n : `https://shortwind.dev/docs/setup-${bundler}`;\n}\n\nfunction adapterHint(bundler: Bundler): string {\n switch (bundler) {\n case \"next\":\n return \"Next needs `export default withShortwind()(nextConfig)` in next.config — note the call is curried.\";\n case \"vite\":\n return \"Vite needs `shortwind()` in the vite.config plugins array: `plugins: [shortwind(), tailwindcss(), ...]`.\";\n case \"astro\":\n return \"Astro needs `shortwind()` in astro.config `integrations`.\";\n default:\n return \"Add the Shortwind plugin for your bundler (see the setup guide).\";\n }\n}\n\nfunction describeVerifyIssue(issue: VerifyIssue): string {\n switch (issue.kind) {\n case \"missing-header\":\n return \"no fingerprint header — recipe was hand-stripped\";\n case \"header-tampered\":\n return `header sha ${issue.recorded} but body hashes to ${issue.actual}`;\n case \"legacy-fingerprint\":\n return `sealed with an older fingerprint format (${issue.recorded}) — run \\`shortwind reseal\\` to upgrade it (the recipe body is unchanged)`;\n case \"lockfile-mismatch\":\n return `lockfile expects ${issue.locked} but body hashes to ${issue.actual}`;\n case \"missing-lock-entry\":\n return \"installed but not recorded in lockfile\";\n case \"missing-file\":\n return \"in lockfile but file is missing\";\n }\n}\n\nasync function promptForPreset(): Promise<string> {\n const choice = await p.select({\n message: \"Pick a preset\",\n options: KNOWN_PRESETS.map((name) => ({ value: name, label: name })),\n });\n if (p.isCancel(choice)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n return choice;\n}\n\nfunction installCmd(pm: Awaited<ReturnType<typeof init>>[\"packageManager\"]): string {\n switch (pm) {\n case \"bun\":\n return \"bun add -d\";\n case \"npm\":\n return \"npm install -D\";\n default:\n return `${pm} add -D`;\n }\n}\n\nfunction printInitSummary(result: Awaited<ReturnType<typeof init>>): void {\n p.note(\n [\n `preset: ${result.preset}`,\n `registry: ${result.registry}`,\n `package manager: ${result.packageManager}`,\n `families copied: ${result.installedFamilies.length}`,\n `families skipped: ${result.skippedFamilies.length}`,\n `adapters: ${result.installOk ? result.installedPackages.join(\", \") || \"none\" : \"install failed — see below\"}`,\n ``,\n `config: ${result.configPath}`,\n `vscode settings: ${result.vscodePath}`,\n `pre-commit: ${result.huskyPath ?? \"skipped (not a git repository)\"}`,\n `SKILL.md: ${result.skillPath}`,\n `theme: ${describeTheme(result)}`,\n `tones: ${result.tonesAction === \"written\" ? `scaffolded default tones in ${result.tonesPath}` : \"skipped\"}`,\n `bundler config: ${describeBundlerConfig(result)}`,\n `agent guide: ${describeAgentsFile(result)}`,\n ].join(\"\\n\"),\n \"shortwind init\",\n );\n if (!result.installOk) {\n const v = cliVersion();\n const specs = result.installedPackages.map((p) => (v ? `${p}@${v}` : p)).join(\" \");\n p.log.warn(\n `Couldn't auto-install adapters (your recipes and config were still scaffolded).\\n` +\n `Finish by installing them yourself:\\n\\n` +\n ` ${installCmd(result.packageManager)} ${specs}\\n\\n` +\n `(${result.installError ?? \"unknown error\"})`,\n );\n }\n if (result.bundlerConfigAction === \"manual\" && result.bundlerConfigSnippet) {\n p.log.warn(`Add the plugin to your bundler config:\\n\\n${result.bundlerConfigSnippet}`);\n }\n p.log.info(`Setup guide for your stack: ${setupGuideUrl(result.bundler)}`);\n if (result.themeAction === \"supplemented\") {\n p.log.info(\n `Your theme (${result.themePath}) didn't define ${result.supplementedThemeTokens.length} design token${result.supplementedThemeTokens.length === 1 ? \"\" : \"s\"} the installed recipes use:\\n\\n` +\n ` ${result.supplementedThemeTokens.join(\", \")}\\n\\n` +\n `Appended them with neutral placeholder values (marked block at the end of the file) so recipes render on first run — tune them to your palette.\\n` +\n `Reference values: https://shortwind.dev/docs/install#theme-tokens`,\n );\n }\n if (result.missingThemeTokens.length > 0) {\n p.log.warn(\n `Your existing theme (${result.themePath}) does not define ${result.missingThemeTokens.length} design token${result.missingThemeTokens.length === 1 ? \"\" : \"s\"} the installed recipes use:\\n\\n` +\n ` ${result.missingThemeTokens.join(\", \")}\\n\\n` +\n `Recipes referencing them will render colorless until you add the tokens to your @theme.\\n` +\n `The default token block is documented at https://shortwind.dev/docs/install#theme-tokens`,\n );\n }\n if (result.preset === \"starter\") {\n p.log.info(\n `Installed the \\`starter\\` preset (${result.installedFamilies.length} families). Building a dashboard or internal tool?\\n` +\n ` Add the components it'll need: shortwind add badge table stat switch segmented menu sheet\\n` +\n ` …or scaffold the lot up front: shortwind init --preset app`,\n );\n }\n p.outro(\n `Next: run \\`${devCmd(result.packageManager)}\\` and check a recipe renders. After a production build, \\`npx shortwind doctor\\` verifies nothing shipped unexpanded.`,\n );\n}\n\n// `npm dev` is not a thing — npm needs the `run` form; pnpm/yarn/bun accept\n// the bare script name.\nfunction devCmd(pm: Awaited<ReturnType<typeof init>>[\"packageManager\"]): string {\n return pm === \"npm\" ? \"npm run dev\" : `${pm} dev`;\n}\n\nfunction describeAgentsFile(result: Awaited<ReturnType<typeof init>>): string {\n switch (result.agentsFileAction) {\n case \"created\":\n return `wrote ${result.agentsFilePath}`;\n case \"appended\":\n return `added recipe pointer to ${result.agentsFilePath}`;\n case \"skipped\":\n return `pointer already in ${result.agentsFilePath}`;\n }\n}\n\nfunction describeBundlerConfig(result: Awaited<ReturnType<typeof init>>): string {\n switch (result.bundlerConfigAction) {\n case \"patched\":\n return `plugin added to ${result.bundlerConfigPath}`;\n case \"manual\":\n return \"needs a manual edit (see below)\";\n case \"skipped\":\n return result.bundlerConfigPath\n ? `already wired in ${result.bundlerConfigPath}`\n : \"skipped (no supported bundler)\";\n }\n}\n\nfunction describeTheme(result: Awaited<ReturnType<typeof init>>): string {\n switch (result.themeAction) {\n case \"injected\":\n return `tokens added to ${result.themePath}`;\n case \"created\":\n return `wrote ${result.themePath}`;\n case \"supplemented\":\n return `kept your theme; appended ${result.supplementedThemeTokens.length} missing tokens to ${result.themePath}`;\n case \"skipped\":\n return result.themePath\n ? `left existing theme in ${result.themePath} untouched`\n : \"skipped (no Tailwind v4 CSS entry — define color tokens yourself)\";\n }\n}\n","#!/usr/bin/env node\nimport { run } from \"./cli.js\";\n\nrun().catch((err) => {\n console.error(err instanceof Error ? err.stack ?? err.message : err);\n process.exit(1);\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/detect.ts","../src/theme.ts","../src/bundler-config.ts","../src/agents-file.ts","../src/init.ts","../src/registry-source.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/remove.ts","../src/commands/new.ts","../src/commands/reseal.ts","../src/commands/preset.ts","../src/commands/ls.ts","../src/commands/build.ts","../src/commands/dev.ts","../src/commands/upgrade.ts","../src/commands/verify.ts","../src/commands/bench.ts","../src/commands/lint.ts","../src/fingerprint.ts","../src/project.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/detect.ts","../src/theme.ts","../src/bundler-config.ts","../src/agents-file.ts","../src/init.ts","../src/registry-source.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/remove.ts","../src/commands/new.ts","../src/commands/reseal.ts","../src/commands/preset.ts","../src/commands/ls.ts","../src/commands/build.ts","../src/commands/dev.ts","../src/commands/upgrade.ts","../src/commands/verify.ts","../src/commands/bench.ts","../src/commands/lint.ts","../src/fingerprint.ts","../src/project.ts"],"mappings":";;;KAKY,cAAA;AAAA,KACA,OAAA;AAAA,KAOA,SAAA;AAAA,KAEA,YAAA;EACV,cAAA,EAAgB,cAAA;EAChB,eAAA;EACA,aAAA;EACA,OAAA,EAAS,OAAA;EACT,SAAA,EAAW,SAAA;EACX,cAAA;AAAA;AAAA,iBAyBc,aAAA,CAAc,GAAA,WAAc,YAAA;;;KCuDhC,WAAA;;;KC3FA,iBAAA;;;KCyBA,gBAAA;;;cCKC,gBAAA;AAAA,KAED,WAAA;EACV,GAAA;EACA,MAAA;EACA,QAAA;EACA,eAAA,GAAkB,eAAA;AAAA;AAAA,KAGR,eAAA,IACV,EAAA,EAAI,cAAA,EACJ,QAAA,YACA,GAAA,aACG,OAAA;AAAA,KAEO,UAAA;EACV,cAAA,EAAgB,cAAA;EAGhB,OAAA,EAAS,UAAA,QAAkB,aAAA;EAC3B,MAAA;EACA,QAAA;EACA,QAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;EACA,UAAA;EACA,UAAA;EAEA,SAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA,EAAa,WAAA;EAIb,SAAA;EACA,WAAA;EAGA,gBAAA;EAIA,kBAAA;EAGA,uBAAA;EACA,iBAAA;EACA,mBAAA,EAAqB,iBAAA;EACrB,oBAAA;EACA,cAAA;EACA,gBAAA,EAAkB,gBAAA;EAClB,SAAA;EACA,YAAA;AAAA;AAAA,iBAGoB,IAAA,CAAK,OAAA,EAAS,WAAA,GAAc,OAAA,CAAQ,UAAA;;;KC7F9C,OAAA,GAAU,MAAA;AAAA,KAEV,cAAA;EACV,MAAA;EACA,WAAA,QAAmB,OAAA,CAAQ,OAAA;EAC3B,UAAA,GAAa,MAAA,aAAmB,OAAA;EAChC,eAAA,QAAuB,OAAA;AAAA;AAAA,iBAgBT,oBAAA,CAAqB,MAAA,WAAiB,cAAA;AAAA,iBAqLtC,qBAAA,CACd,MAAA,UACA,OAAA,EAAS,OAAA,EACT,WAAA;;;KC9MU,SAAA;EAAc,OAAA;EAAiB,GAAA;AAAA;AAAA,KAC/B,QAAA;EACV,OAAA;EACA,QAAA;EACA,QAAA,EAAU,MAAA,SAAe,SAAA;AAAA;AAAA,iBAUL,YAAA,CAAa,UAAA,WAAqB,OAAA,CAAQ,QAAA;AAAA,iBAoC1C,aAAA,CAAc,UAAA,UAAoB,IAAA,EAAM,QAAA,GAAW,OAAA;;;KCpC7D,UAAA;EACV,GAAA;EACA,QAAA;EACA,EAAA;EACA,GAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,SAAA;EACV,KAAA;EACA,OAAA;EACA,WAAA;EACA,mBAAA;IAAuB,MAAA;IAAgB,UAAA;EAAA;EACvC,QAAA,EAAU,QAAA;EACV,SAAA;AAAA;AAAA,iBAGoB,GAAA,CAAI,OAAA,EAAS,UAAA,GAAa,OAAA,CAAQ,SAAA;;;KCzB5C,aAAA;EACV,GAAA;EACA,QAAA;AAAA;AAAA,KAGU,YAAA;EACV,OAAA;EACA,QAAA;EACA,gBAAA;IAAoB,SAAA;IAAmB,UAAA;EAAA;EACvC,QAAA,EAAU,QAAA;EACV,SAAA;AAAA;AAAA,iBAGoB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,YAAA;;;KClBlD,UAAA;EACV,GAAA;EACA,MAAA;EACA,KAAA;AAAA;AAAA,KAGU,SAAA;EACV,UAAA;EACA,SAAA;AAAA;AAAA,cAGW,cAAA,SAAuB,KAAA;cACtB,OAAA;AAAA;AAAA,iBAyBQ,SAAA,CAAU,OAAA,EAAS,UAAA,GAAa,OAAA,CAAQ,SAAA;;;KCpClD,aAAA;EACV,GAAA;EACA,QAAA;AAAA;AAAA,KAGU,YAAA;EACV,QAAA;EACA,SAAA;EACA,QAAA;EACA,QAAA;AAAA;AAAA,iBAQoB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,YAAA;;;KCnBlD,aAAA;EACV,GAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,YAAA,GAAe,SAAA;EAAc,MAAA;AAAA;AAAA,iBAEnB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,YAAA;;;KCRlD,SAAA;EACV,GAAA;EACA,QAAA;EACA,aAAA;EACA,aAAA;AAAA;AAAA,KAGU,QAAA;EACV,SAAA;IAAa,MAAA;IAAgB,OAAA;EAAA;EAC7B,SAAA;AAAA;AAAA,iBAGoB,EAAA,CAAG,OAAA,EAAS,SAAA,GAAY,OAAA,CAAQ,QAAA;AAAA,iBA2BtC,YAAA,CAAa,MAAA,EAAQ,QAAA;;;KChCzB,YAAA;EACV,GAAA;AAAA;AAAA,KAGU,WAAA;EACV,OAAA;EACA,QAAA;EACA,SAAA;EAIA,gBAAA;AAAA;AAAA,cAGW,UAAA,SAAmB,KAAA;EAAA,SACrB,WAAA,EAAa,UAAA;cAEV,WAAA,EAAa,UAAA;AAAA;AAAA,iBAWL,KAAA,CAAM,OAAA,EAAS,YAAA,GAAe,OAAA,CAAQ,WAAA;;;KCnChD,UAAA;EACV,GAAA;EACA,MAAA,GAAS,WAAA;EACT,QAAA,IAAY,MAAA,EAAQ,SAAA;EACpB,UAAA;EACA,mBAAA;AAAA;AAAA,KAGU,SAAA;EACN,IAAA;EAAe,UAAA;AAAA;EACf,IAAA;EAAiB,QAAA;EAAoB,OAAA;AAAA;EACrC,IAAA;EAAe,OAAA;AAAA;AAAA,iBAEC,GAAA,CAAI,OAAA,EAAS,UAAA,GAAa,OAAA;EAAU,IAAA,QAAY,OAAA;AAAA;;;KCJ1D,aAAA;AAAA,KAEA,cAAA;EACV,MAAA;EACA,KAAA;EACA,QAAA;IAAY,OAAA;IAAiB,GAAA;EAAA;EAC7B,QAAA;IAAY,OAAA;IAAiB,IAAA;EAAA;AAAA;AAAA,KAGnB,eAAA,IAAmB,GAAA,EAAK,cAAA,KAAmB,OAAA,CAAQ,aAAA;AAAA,KAEnD,cAAA;EACV,GAAA;EACA,QAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,QAAA,GAAW,eAAA;EACX,MAAA,GAAS,cAAA;AAAA;AAAA,KAGC,WAAA;AAAA,KAEA,aAAA;EACN,MAAA;EAAgB,MAAA;EAAmB,IAAA;EAAc,EAAA;EAAY,KAAA,EAAO,WAAA;AAAA;EACpE,MAAA;EAAgB,MAAA;EAAgB,MAAA;EAAyC,KAAA,EAAO,WAAA;AAAA;EAChF,MAAA;EAAgB,MAAA;EAAmB,MAAA;EAAgB,KAAA,EAAO,WAAA;AAAA;EAC1D,MAAA;EAAgB,MAAA;EAAwB,IAAA;EAAc,EAAA;EAAY,KAAA,EAAO,WAAA;AAAA;EACzE,MAAA;EAAgB,MAAA;EAAwB,IAAA;EAAc,EAAA;EAAY,KAAA,EAAO,WAAA;AAAA;AAAA,KAEnE,aAAA;EACV,QAAA,EAAU,aAAA;EACV,UAAA;EACA,UAAA;EACA,QAAA,EAAU,QAAA;EACV,SAAA;AAAA;AAAA,cAGW,YAAA,SAAqB,KAAA;EAAA,SACvB,MAAA;IAAU,MAAA;IAAgB,OAAA;EAAA;cACvB,MAAA;IAAU,MAAA;IAAgB,OAAA;EAAA;AAAA;AAAA,iBAOlB,OAAA,CAAQ,OAAA,EAAS,cAAA,GAAiB,OAAA,CAAQ,aAAA;;;KCvDpD,WAAA;EACN,MAAA;EAAgB,IAAA;EAAwB,IAAA;AAAA;EACxC,MAAA;EAAgB,IAAA;EAAyB,IAAA;EAAc,QAAA;EAAkB,MAAA;AAAA;EACzE,MAAA;EAAgB,IAAA;EAA4B,IAAA;EAAc,QAAA;AAAA;EAC1D,MAAA;EAAgB,IAAA;EAA2B,IAAA;EAAc,MAAA;EAAgB,MAAA;AAAA;EACzE,MAAA;EAAgB,IAAA;EAA4B,IAAA;AAAA;EAC5C,MAAA;EAAgB,IAAA;EAAsB,IAAA;AAAA;AAAA,KAEhC,aAAA;EACV,GAAA;AAAA;AAAA,KAGU,YAAA;EACV,EAAA;EACA,OAAA;EACA,MAAA,EAAQ,WAAA;AAAA;AAAA,iBAGY,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,YAAA;;;KCXlD,YAAA;EACV,GAAA;EACA,MAAA;EACA,IAAA;AAAA;AAAA,KAGU,eAAA;EACV,QAAA;EACA,kBAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;AAAA;AAAA,KAGU,WAAA,GAAc,IAAA,CAAK,eAAA;AAAA,KAEnB,WAAA;EACV,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,WAAA;AAAA;AAAA,iBAOY,KAAA,CAAM,OAAA,EAAS,YAAA,GAAe,OAAA,CAAQ,WAAA;AAAA,iBA0I5C,gBAAA,CAAiB,MAAA,EAAQ,WAAA;;;cC5K5B,SAAA;AAAA,KAaD,IAAA,WAAe,SAAA;AAAA,KAEf,QAAA;AAAA,KAEA,OAAA;EACV,IAAA,EAAM,IAAA;EACN,QAAA,EAAU,QAAA;EACV,IAAA;EACA,IAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,KAGU,WAAA;EACV,GAAA;EACA,KAAA,GAAQ,IAAA;EACR,GAAA;EACA,OAAA;AAAA;AAAA,KAGU,UAAA;EACV,EAAA;EACA,QAAA,EAAU,OAAA;EACV,UAAA;EAKA,YAAA;AAAA;AAAA,iBAYoB,IAAA,CAAK,OAAA,EAAS,WAAA,GAAc,OAAA,CAAQ,UAAA;AAAA,KA6YrD,UAAA;EACH,UAAA;EAKA,UAAA;EACA,GAAA;EACA,MAAA,EAAQ,KAAA;IAAQ,KAAA;IAAe,IAAA;IAAc,MAAA;EAAA;EAI7C,aAAA,EAAe,KAAA;IAAQ,KAAA;IAAe,IAAA;IAAc,MAAA;EAAA;EAIpD,OAAA;AAAA;AAAA,iBAWc,kBAAA,CAAmB,MAAA,WAAiB,UAAA;AAAA,iBAyPpC,kBAAA,CAAmB,QAAA,EAAU,OAAA;;;KCjtBjC,YAAA;EACV,MAAA;EACA,OAAA;EACA,GAAA;AAAA;AAAA,iBAGc,aAAA,CAAc,MAAA,WAAiB,YAAA;AAAA,iBAgB/B,cAAA,CAAe,MAAA;AAAA,iBA2Bf,mBAAA,CAAoB,MAAA,UAAgB,MAAA;AAAA,iBAmBpC,eAAA,CAAgB,MAAA,UAAgB,OAAA,UAAiB,GAAA;AAAA,iBAIjD,gBAAA,CAAiB,MAAA,UAAgB,GAAA;AAAA,iBASjC,cAAA,CAAe,MAAA,UAAgB,MAAA,UAAgB,OAAA;;;;;;;;;;;iBCqE/C,oBAAA,CAAqB,MAAA,UAAgB,IAAA,UAAc,EAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { A as createRegistrySource, D as init, F as extractHeader, I as rewriteHeaderSha, L as sealRecipeFile, M as detectProject, N as buildHeaderLine, O as readLockfile, P as computeBodySha, R as verifyFetchedFamily, T as DEFAULT_REGISTRY, _ as reseal, a as extractClassUsages, b as remove, c as verify, d as dev, f as BuildError, g as preset, h as ls, j as resolvePresetFamilies, k as writeLockfile, l as UpgradeError, m as formatLsText, n as formatBenchTable, o as formatFindingsText, p as build, r as ALL_RULES, s as lint, t as bench, u as upgrade, v as NewFamilyError, w as renameFamilyInSource, x as add, y as newFamily } from "./bench-DQtfv5aq.js";
1
+ import { A as createRegistrySource, D as init, F as extractHeader, I as rewriteHeaderSha, L as sealRecipeFile, M as detectProject, N as buildHeaderLine, O as readLockfile, P as computeBodySha, R as verifyFetchedFamily, T as DEFAULT_REGISTRY, _ as reseal, a as extractClassUsages, b as remove, c as verify, d as dev, f as BuildError, g as preset, h as ls, j as resolvePresetFamilies, k as writeLockfile, l as UpgradeError, m as formatLsText, n as formatBenchTable, o as formatFindingsText, p as build, r as ALL_RULES, s as lint, t as bench, u as upgrade, v as NewFamilyError, w as renameFamilyInSource, x as add, y as newFamily } from "./bench-DG0TCu9M.js";
2
2
  export { ALL_RULES, BuildError, DEFAULT_REGISTRY, NewFamilyError, UpgradeError, add, bench, build, buildHeaderLine, computeBodySha, createRegistrySource, detectProject, dev, extractClassUsages, extractHeader, formatBenchTable, formatFindingsText, formatLsText, init, lint, ls, newFamily, preset, readLockfile, remove, renameFamilyInSource, reseal, resolvePresetFamilies, rewriteHeaderSha, sealRecipeFile, upgrade, verify, verifyFetchedFamily, writeLockfile };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shortwind/cli",
3
- "version": "0.1.0-beta.14",
3
+ "version": "0.1.0-beta.16",
4
4
  "description": "Shortwind CLI — init, add, remove, upgrade, dev, build, lint, ls, preset. Provides the `shortwind` command.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,8 +19,8 @@
19
19
  "jsonc-parser": "^3.3.1",
20
20
  "picocolors": "^1.1.1",
21
21
  "tinyglobby": "^0.2.16",
22
- "@shortwind/core": "0.1.0-beta.14",
23
- "@shortwind/tailwind": "0.1.0-beta.14"
22
+ "@shortwind/core": "0.1.0-beta.16",
23
+ "@shortwind/tailwind": "0.1.0-beta.16"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^25.7.0",