claudekit-cli 3.35.0-dev.24 → 3.35.0-dev.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +200 -59
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -52839,6 +52839,27 @@ var init_skill_routes = __esm(() => {
52839
52839
  });
52840
52840
 
52841
52841
  // src/domains/github/npm-registry.ts
52842
+ function redactRegistryUrlForLog(url) {
52843
+ if (!url)
52844
+ return url;
52845
+ try {
52846
+ const parsed = new URL(url);
52847
+ if (parsed.username) {
52848
+ parsed.username = REDACTED_VALUE;
52849
+ }
52850
+ if (parsed.password) {
52851
+ parsed.password = REDACTED_VALUE;
52852
+ }
52853
+ for (const key of parsed.searchParams.keys()) {
52854
+ if (/(token|auth|password|secret|key)/i.test(key)) {
52855
+ parsed.searchParams.set(key, REDACTED_VALUE);
52856
+ }
52857
+ }
52858
+ return parsed.toString();
52859
+ } catch {
52860
+ return url.replace(/\/\/([^/@\s]+)@/, `//${REDACTED_VALUE}@`);
52861
+ }
52862
+ }
52842
52863
  async function fetchWithTimeout(url, options2 = {}, timeout2 = REQUEST_TIMEOUT) {
52843
52864
  const controller = new AbortController;
52844
52865
  const timeoutId = setTimeout(() => controller.abort(), timeout2);
@@ -52860,7 +52881,7 @@ class NpmRegistryClient {
52860
52881
  }
52861
52882
  const registry = registryUrl || DEFAULT_REGISTRY_URL;
52862
52883
  const url = `${registry}/${encodeURIComponent(packageName)}`;
52863
- logger.debug(`Fetching package info from: ${url}`);
52884
+ logger.debug(`Fetching package info from: ${redactRegistryUrlForLog(url)}`);
52864
52885
  try {
52865
52886
  const response = await fetchWithTimeout(url, {
52866
52887
  headers: {
@@ -52923,18 +52944,12 @@ class NpmRegistryClient {
52923
52944
  }
52924
52945
  }
52925
52946
  static async versionExists(packageName, version, registryUrl) {
52926
- try {
52927
- const info = await NpmRegistryClient.getPackageInfo(packageName, registryUrl);
52928
- if (!info)
52929
- return false;
52930
- const exists = version in (info.versions || {});
52931
- logger.debug(`Version ${version} exists for ${packageName}: ${exists}`);
52932
- return exists;
52933
- } catch (error) {
52934
- const message = error instanceof Error ? error.message : "Unknown error";
52935
- logger.debug(`Failed to check version ${version} for ${packageName}: ${message}`);
52947
+ const info = await NpmRegistryClient.getPackageInfo(packageName, registryUrl);
52948
+ if (!info)
52936
52949
  return false;
52937
- }
52950
+ const exists = version in (info.versions || {});
52951
+ logger.debug(`Version ${version} exists for ${packageName}: ${exists}`);
52952
+ return exists;
52938
52953
  }
52939
52954
  static async getVersionInfo(packageName, version, registryUrl) {
52940
52955
  try {
@@ -52972,7 +52987,7 @@ class NpmRegistryClient {
52972
52987
  }
52973
52988
  }
52974
52989
  }
52975
- var DEFAULT_REGISTRY_URL = "https://registry.npmjs.org", REQUEST_TIMEOUT = 5000;
52990
+ var DEFAULT_REGISTRY_URL = "https://registry.npmjs.org", REQUEST_TIMEOUT = 5000, REDACTED_VALUE = "***";
52976
52991
  var init_npm_registry = __esm(() => {
52977
52992
  init_logger();
52978
52993
  });
@@ -53009,9 +53024,9 @@ function getNpmQuery() {
53009
53024
  checkFn: (stdout) => {
53010
53025
  try {
53011
53026
  const data = JSON.parse(stdout);
53012
- return !!(data.dependencies?.[CLAUDEKIT_CLI_NPM_PACKAGE_NAME] || stdout.includes(CLAUDEKIT_CLI_NPM_PACKAGE_NAME));
53027
+ return !!data.dependencies?.["claudekit-cli"];
53013
53028
  } catch {
53014
- return stdout.includes(CLAUDEKIT_CLI_NPM_PACKAGE_NAME);
53029
+ return /"claudekit-cli"\s*:/.test(stdout) || /(?:^|[^a-z0-9-])claudekit-cli@/m.test(stdout);
53015
53030
  }
53016
53031
  }
53017
53032
  };
@@ -53029,7 +53044,36 @@ async function getNpmVersion() {
53029
53044
  return null;
53030
53045
  }
53031
53046
  }
53032
- function getNpmUpdateCommand(packageName, version) {
53047
+ function normalizeNpmRegistryUrl(rawValue) {
53048
+ const value = rawValue.trim();
53049
+ if (!value) {
53050
+ return null;
53051
+ }
53052
+ if (!/^https?:\/\//i.test(value)) {
53053
+ return null;
53054
+ }
53055
+ try {
53056
+ const parsed = new URL(value);
53057
+ const protocol = parsed.protocol.toLowerCase();
53058
+ if (protocol !== "http:" && protocol !== "https:") {
53059
+ return null;
53060
+ }
53061
+ const normalizedPath = parsed.pathname.replace(/\/+$/, "");
53062
+ return `${parsed.protocol}//${parsed.host}${normalizedPath}${parsed.search}${parsed.hash}`;
53063
+ } catch {
53064
+ return null;
53065
+ }
53066
+ }
53067
+ async function getNpmRegistryUrl() {
53068
+ try {
53069
+ const cmd = isWindows() ? "npm.cmd config get registry" : "npm config get registry";
53070
+ const { stdout } = await execAsync(cmd, { timeout: 3000 });
53071
+ return normalizeNpmRegistryUrl(stdout);
53072
+ } catch {
53073
+ return null;
53074
+ }
53075
+ }
53076
+ function getNpmUpdateCommand(packageName, version, registryUrl) {
53033
53077
  if (!isValidPackageName(packageName)) {
53034
53078
  throw new Error(`Invalid package name: ${packageName}`);
53035
53079
  }
@@ -53037,7 +53081,8 @@ function getNpmUpdateCommand(packageName, version) {
53037
53081
  throw new Error(`Invalid version: ${version}`);
53038
53082
  }
53039
53083
  const versionSuffix = version ? `@${version}` : "@latest";
53040
- return isWindows() ? `npm.cmd install -g ${packageName}${versionSuffix}` : `npm install -g ${packageName}${versionSuffix}`;
53084
+ const registryFlag = registryUrl ? ` --registry ${registryUrl}` : "";
53085
+ return isWindows() ? `npm.cmd install -g ${packageName}${versionSuffix}${registryFlag}` : `npm install -g ${packageName}${versionSuffix}${registryFlag}`;
53041
53086
  }
53042
53087
  var init_npm_detector = __esm(() => {
53043
53088
  init_claudekit_constants();
@@ -53051,7 +53096,7 @@ function getBunQuery() {
53051
53096
  return {
53052
53097
  pm: "bun",
53053
53098
  cmd: "bun pm ls -g",
53054
- checkFn: (stdout) => stdout.includes(CLAUDEKIT_CLI_NPM_PACKAGE_NAME)
53099
+ checkFn: (stdout) => /(?:^|[^a-z0-9-])claudekit-cli@/m.test(stdout)
53055
53100
  };
53056
53101
  }
53057
53102
  function getBunVersionCommand() {
@@ -53067,7 +53112,7 @@ async function getBunVersion() {
53067
53112
  return null;
53068
53113
  }
53069
53114
  }
53070
- function getBunUpdateCommand(packageName, version) {
53115
+ function getBunUpdateCommand(packageName, version, registryUrl) {
53071
53116
  if (!isValidPackageName(packageName)) {
53072
53117
  throw new Error(`Invalid package name: ${packageName}`);
53073
53118
  }
@@ -53075,10 +53120,10 @@ function getBunUpdateCommand(packageName, version) {
53075
53120
  throw new Error(`Invalid version: ${version}`);
53076
53121
  }
53077
53122
  const versionSuffix = version ? `@${version}` : "@latest";
53078
- return `bun add -g ${packageName}${versionSuffix}`;
53123
+ const registryFlag = registryUrl ? ` --registry ${registryUrl}` : "";
53124
+ return `bun add -g ${packageName}${versionSuffix}${registryFlag}`;
53079
53125
  }
53080
53126
  var init_bun_detector = __esm(() => {
53081
- init_claudekit_constants();
53082
53127
  init_constants();
53083
53128
  init_detector_base();
53084
53129
  });
@@ -53087,8 +53132,8 @@ var init_bun_detector = __esm(() => {
53087
53132
  function getYarnQuery() {
53088
53133
  return {
53089
53134
  pm: "yarn",
53090
- cmd: isWindows() ? `yarn.cmd global list --pattern ${CLAUDEKIT_CLI_NPM_PACKAGE_NAME}` : `yarn global list --pattern ${CLAUDEKIT_CLI_NPM_PACKAGE_NAME}`,
53091
- checkFn: (stdout) => stdout.includes(CLAUDEKIT_CLI_NPM_PACKAGE_NAME)
53135
+ cmd: isWindows() ? "yarn.cmd global list --pattern claudekit-cli" : "yarn global list --pattern claudekit-cli",
53136
+ checkFn: (stdout) => /(?:^|[^a-z0-9-])claudekit-cli@/m.test(stdout)
53092
53137
  };
53093
53138
  }
53094
53139
  function getYarnVersionCommand() {
@@ -53104,7 +53149,7 @@ async function getYarnVersion() {
53104
53149
  return null;
53105
53150
  }
53106
53151
  }
53107
- function getYarnUpdateCommand(packageName, version) {
53152
+ function getYarnUpdateCommand(packageName, version, registryUrl) {
53108
53153
  if (!isValidPackageName(packageName)) {
53109
53154
  throw new Error(`Invalid package name: ${packageName}`);
53110
53155
  }
@@ -53112,10 +53157,10 @@ function getYarnUpdateCommand(packageName, version) {
53112
53157
  throw new Error(`Invalid version: ${version}`);
53113
53158
  }
53114
53159
  const versionSuffix = version ? `@${version}` : "@latest";
53115
- return isWindows() ? `yarn.cmd global add ${packageName}${versionSuffix}` : `yarn global add ${packageName}${versionSuffix}`;
53160
+ const registryFlag = registryUrl ? ` --registry ${registryUrl}` : "";
53161
+ return isWindows() ? `yarn.cmd global add ${packageName}${versionSuffix}${registryFlag}` : `yarn global add ${packageName}${versionSuffix}${registryFlag}`;
53116
53162
  }
53117
53163
  var init_yarn_detector = __esm(() => {
53118
- init_claudekit_constants();
53119
53164
  init_environment();
53120
53165
  init_constants();
53121
53166
  init_detector_base();
@@ -53125,8 +53170,8 @@ var init_yarn_detector = __esm(() => {
53125
53170
  function getPnpmQuery() {
53126
53171
  return {
53127
53172
  pm: "pnpm",
53128
- cmd: isWindows() ? `pnpm.cmd ls -g ${CLAUDEKIT_CLI_NPM_PACKAGE_NAME}` : `pnpm ls -g ${CLAUDEKIT_CLI_NPM_PACKAGE_NAME}`,
53129
- checkFn: (stdout) => stdout.includes(CLAUDEKIT_CLI_NPM_PACKAGE_NAME)
53173
+ cmd: isWindows() ? "pnpm.cmd ls -g claudekit-cli" : "pnpm ls -g claudekit-cli",
53174
+ checkFn: (stdout) => /(?:^|[^a-z0-9-])claudekit-cli(?:@|\s+\d)/m.test(stdout)
53130
53175
  };
53131
53176
  }
53132
53177
  function getPnpmVersionCommand() {
@@ -53142,7 +53187,7 @@ async function getPnpmVersion() {
53142
53187
  return null;
53143
53188
  }
53144
53189
  }
53145
- function getPnpmUpdateCommand(packageName, version) {
53190
+ function getPnpmUpdateCommand(packageName, version, registryUrl) {
53146
53191
  if (!isValidPackageName(packageName)) {
53147
53192
  throw new Error(`Invalid package name: ${packageName}`);
53148
53193
  }
@@ -53150,10 +53195,10 @@ function getPnpmUpdateCommand(packageName, version) {
53150
53195
  throw new Error(`Invalid version: ${version}`);
53151
53196
  }
53152
53197
  const versionSuffix = version ? `@${version}` : "@latest";
53153
- return isWindows() ? `pnpm.cmd add -g ${packageName}${versionSuffix}` : `pnpm add -g ${packageName}${versionSuffix}`;
53198
+ const registryFlag = registryUrl ? ` --registry ${registryUrl}` : "";
53199
+ return isWindows() ? `pnpm.cmd add -g ${packageName}${versionSuffix}${registryFlag}` : `pnpm add -g ${packageName}${versionSuffix}${registryFlag}`;
53154
53200
  }
53155
53201
  var init_pnpm_detector = __esm(() => {
53156
- init_claudekit_constants();
53157
53202
  init_environment();
53158
53203
  init_constants();
53159
53204
  init_detector_base();
@@ -53426,24 +53471,25 @@ var init_package_manager_detector = __esm(() => {
53426
53471
  return "echo unknown";
53427
53472
  }
53428
53473
  }
53429
- static getUpdateCommand(pm, packageName, version) {
53474
+ static getNpmRegistryUrl = getNpmRegistryUrl;
53475
+ static getUpdateCommand(pm, packageName, version, registryUrl) {
53430
53476
  if (!isValidPackageName(packageName))
53431
53477
  throw new Error(`Invalid package name: ${packageName}`);
53432
53478
  if (version && !isValidVersion(version))
53433
53479
  throw new Error(`Invalid version: ${version}`);
53434
53480
  switch (pm) {
53435
53481
  case "bun":
53436
- return getBunUpdateCommand(packageName, version);
53482
+ return getBunUpdateCommand(packageName, version, registryUrl);
53437
53483
  case "yarn":
53438
- return getYarnUpdateCommand(packageName, version);
53484
+ return getYarnUpdateCommand(packageName, version, registryUrl);
53439
53485
  case "pnpm":
53440
- return getPnpmUpdateCommand(packageName, version);
53486
+ return getPnpmUpdateCommand(packageName, version, registryUrl);
53441
53487
  default:
53442
- return getNpmUpdateCommand(packageName, version);
53488
+ return getNpmUpdateCommand(packageName, version, registryUrl);
53443
53489
  }
53444
53490
  }
53445
- static getInstallCommand(pm, packageName, version) {
53446
- return PackageManagerDetector.getUpdateCommand(pm, packageName, version);
53491
+ static getInstallCommand(pm, packageName, version, registryUrl) {
53492
+ return PackageManagerDetector.getUpdateCommand(pm, packageName, version, registryUrl);
53447
53493
  }
53448
53494
  static getDisplayName(pm) {
53449
53495
  switch (pm) {
@@ -53872,7 +53918,7 @@ var package_default;
53872
53918
  var init_package = __esm(() => {
53873
53919
  package_default = {
53874
53920
  name: "claudekit-cli",
53875
- version: "3.35.0-dev.24",
53921
+ version: "3.35.0-dev.26",
53876
53922
  description: "CLI tool for bootstrapping and updating ClaudeKit projects",
53877
53923
  type: "module",
53878
53924
  repository: {
@@ -53897,8 +53943,8 @@ var init_package = __esm(() => {
53897
53943
  "ui:build": "cd src/ui && bun install --silent && bun run build",
53898
53944
  "ui:dev": "cd src/ui && bun run dev",
53899
53945
  build: "bun build src/index.ts --outdir dist --target node --external @octokit/rest",
53900
- compile: "bun build src/index.ts --compile --outfile ck",
53901
- "compile:binary": "bun build src/index.ts --compile --outfile bin/ck",
53946
+ compile: "bun run ui:build && bun run scripts/compile-binary.ts",
53947
+ "compile:binary": "bun run ui:build && bun run scripts/compile-binary.ts --outfile bin/ck && cp bin/ck /usr/local/bin/ck && echo '✅ Installed globally: /usr/local/bin/ck'",
53902
53948
  "compile:binaries": "node scripts/build-all-binaries.js",
53903
53949
  "check-version-sync": "node scripts/check-binary-version-sync.js",
53904
53950
  "build:platform-binaries": "bun run scripts/build-platform-binaries.js",
@@ -53983,6 +54029,12 @@ var init_package = __esm(() => {
53983
54029
  import { exec as exec2 } from "node:child_process";
53984
54030
  import { join as join37 } from "node:path";
53985
54031
  import { promisify as promisify8 } from "node:util";
54032
+ function redactCommandForLog(command) {
54033
+ if (!command)
54034
+ return command;
54035
+ const redactedRegistryFlags = command.replace(/(--registry(?:=|\s+))(['"]?)(\S+?)(\2)(?=\s|$)/g, (_match, prefix, quote, url) => `${prefix}${quote}${redactRegistryUrlForLog(url)}${quote}`);
54036
+ return redactedRegistryFlags.replace(/https?:\/\/[^\s"']+/g, (url) => redactRegistryUrlForLog(url));
54037
+ }
53986
54038
  function buildInitCommand(isGlobal, kit, beta) {
53987
54039
  const parts = ["ck init"];
53988
54040
  if (isGlobal)
@@ -54112,31 +54164,50 @@ async function updateCliCommand(options2) {
54112
54164
  const pmVersion = await PackageManagerDetector.getVersion(pm);
54113
54165
  s.stop(`Using ${PackageManagerDetector.getDisplayName(pm)}${pmVersion ? ` v${pmVersion}` : ""}`);
54114
54166
  logger.verbose(`Detected package manager: ${pm}`);
54167
+ let registryUrl = opts.registry;
54168
+ if (!registryUrl && pm === "npm") {
54169
+ const userRegistry = await PackageManagerDetector.getNpmRegistryUrl();
54170
+ if (userRegistry) {
54171
+ registryUrl = userRegistry;
54172
+ logger.verbose(`Using npm configured registry: ${redactRegistryUrlForLog(registryUrl)}`);
54173
+ }
54174
+ }
54115
54175
  s.start("Checking for updates...");
54116
54176
  let targetVersion = null;
54117
54177
  if (opts.release && opts.release !== "latest") {
54118
- const exists = await NpmRegistryClient.versionExists(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, opts.release, opts.registry);
54119
- if (!exists) {
54120
- s.stop("Version not found");
54121
- throw new CliUpdateError(`Version ${opts.release} does not exist on npm registry. Run 'ck versions' to see available versions.`);
54178
+ try {
54179
+ const exists = await NpmRegistryClient.versionExists(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, opts.release, registryUrl);
54180
+ if (!exists) {
54181
+ s.stop("Version not found");
54182
+ throw new CliUpdateError(`Version ${opts.release} does not exist on npm registry. Run 'ck versions' to see available versions.`);
54183
+ }
54184
+ } catch (error) {
54185
+ if (error instanceof CliUpdateError) {
54186
+ throw error;
54187
+ }
54188
+ s.stop("Version check failed");
54189
+ const message = error instanceof Error ? error.message : "Unknown error";
54190
+ logger.verbose(`Release check failed for ${opts.release}: ${message}`);
54191
+ const registryHint = registryUrl ? ` (${redactRegistryUrlForLog(registryUrl)})` : " (default registry)";
54192
+ throw new CliUpdateError(`Failed to verify version ${opts.release} on npm registry${registryHint}. Check registry settings/network connectivity and try again.`);
54122
54193
  }
54123
54194
  targetVersion = opts.release;
54124
54195
  s.stop(`Target version: ${targetVersion}`);
54125
54196
  } else if (opts.dev || opts.beta) {
54126
- targetVersion = await NpmRegistryClient.getDevVersion(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, opts.registry);
54197
+ targetVersion = await NpmRegistryClient.getDevVersion(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, registryUrl);
54127
54198
  if (!targetVersion) {
54128
54199
  s.stop("No dev version available");
54129
54200
  logger.warning("No dev version found. Using latest stable version instead.");
54130
- targetVersion = await NpmRegistryClient.getLatestVersion(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, opts.registry);
54201
+ targetVersion = await NpmRegistryClient.getLatestVersion(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, registryUrl);
54131
54202
  } else {
54132
54203
  s.stop(`Latest dev version: ${targetVersion}`);
54133
54204
  }
54134
54205
  } else {
54135
- targetVersion = await NpmRegistryClient.getLatestVersion(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, opts.registry);
54206
+ targetVersion = await NpmRegistryClient.getLatestVersion(CLAUDEKIT_CLI_NPM_PACKAGE_NAME, registryUrl);
54136
54207
  s.stop(`Latest version: ${targetVersion || "unknown"}`);
54137
54208
  }
54138
54209
  if (!targetVersion) {
54139
- throw new CliUpdateError(`Failed to fetch version information from npm registry. Check your internet connection and try again. Manual update: ${PackageManagerDetector.getUpdateCommand(pm, CLAUDEKIT_CLI_NPM_PACKAGE_NAME)}`);
54210
+ throw new CliUpdateError(`Failed to fetch version information from npm registry. Check your internet connection and try again. Manual update: ${PackageManagerDetector.getUpdateCommand(pm, CLAUDEKIT_CLI_NPM_PACKAGE_NAME, undefined, registryUrl)}`);
54140
54211
  }
54141
54212
  const comparison = import_compare_versions.compareVersions(currentVersion, targetVersion);
54142
54213
  if (comparison === 0) {
@@ -54169,8 +54240,8 @@ Run 'ck update' to install`, "Update Check");
54169
54240
  return;
54170
54241
  }
54171
54242
  }
54172
- const updateCmd = PackageManagerDetector.getUpdateCommand(pm, CLAUDEKIT_CLI_NPM_PACKAGE_NAME, targetVersion);
54173
- logger.info(`Running: ${updateCmd}`);
54243
+ const updateCmd = PackageManagerDetector.getUpdateCommand(pm, CLAUDEKIT_CLI_NPM_PACKAGE_NAME, targetVersion, registryUrl);
54244
+ logger.info(`Running: ${redactCommandForLog(updateCmd)}`);
54174
54245
  s.start("Updating CLI...");
54175
54246
  try {
54176
54247
  await execAsync2(updateCmd, {
@@ -54197,7 +54268,7 @@ Or fix npm permissions: https://docs.npmjs.com/resolving-eacces-permissions-erro
54197
54268
  throw new CliUpdateError(`Permission denied. Try: ${elevationHint}${permHint}`);
54198
54269
  }
54199
54270
  logger.error(`Update failed: ${errorMessage}`);
54200
- logger.info(`Try running: ${updateCmd}`);
54271
+ logger.info(`Try running: ${redactCommandForLog(updateCmd)}`);
54201
54272
  throw new CliUpdateError(`Update failed: ${errorMessage}
54202
54273
 
54203
54274
  Manual update: ${updateCmd}`);
@@ -54217,7 +54288,6 @@ Manual update: ${updateCmd}`);
54217
54288
  }
54218
54289
  } catch (error) {
54219
54290
  if (error instanceof CliUpdateError) {
54220
- logger.error(error.message);
54221
54291
  throw error;
54222
54292
  }
54223
54293
  const errorMessage = error instanceof Error ? error.message : "Unknown error";
@@ -56121,8 +56191,65 @@ var init_routes = __esm(() => {
56121
56191
 
56122
56192
  // src/domains/web-server/static-server.ts
56123
56193
  import { existsSync as existsSync33 } from "node:fs";
56124
- import { dirname as dirname12, join as join41 } from "node:path";
56194
+ import { dirname as dirname12, extname as extname3, join as join41 } from "node:path";
56125
56195
  import { fileURLToPath as fileURLToPath2 } from "node:url";
56196
+ function tryServeFromEmbedded(app) {
56197
+ if (typeof globalThis.Bun === "undefined" || !globalThis.Bun.embeddedFiles?.length) {
56198
+ return false;
56199
+ }
56200
+ let prefix = "";
56201
+ for (const blob of globalThis.Bun.embeddedFiles) {
56202
+ const name = blob.name;
56203
+ if (name === "index.html" || name.endsWith("/index.html")) {
56204
+ prefix = name.replace("index.html", "");
56205
+ break;
56206
+ }
56207
+ }
56208
+ const fileMap = new Map;
56209
+ let indexBlob = null;
56210
+ for (const blob of globalThis.Bun.embeddedFiles) {
56211
+ const rawName = blob.name;
56212
+ const name = prefix && rawName.startsWith(prefix) ? rawName.slice(prefix.length) : rawName;
56213
+ fileMap.set(name, blob);
56214
+ if (name === "index.html") {
56215
+ indexBlob = blob;
56216
+ }
56217
+ }
56218
+ if (!indexBlob) {
56219
+ logger.debug("Embedded files found but no index.html — skipping embedded serving");
56220
+ return false;
56221
+ }
56222
+ logger.debug(`Serving UI from ${fileMap.size} embedded files`);
56223
+ app.use(async (req, res, next) => {
56224
+ if (req.path.startsWith("/api/") || req.path === "/ws" || req.path.startsWith("/ws/")) {
56225
+ return next();
56226
+ }
56227
+ const reqPath = req.path.replace(/^\//, "");
56228
+ if (reqPath.includes("..") || reqPath.includes("\x00")) {
56229
+ return next();
56230
+ }
56231
+ const blob = fileMap.get(reqPath);
56232
+ if (blob) {
56233
+ const ext = extname3(reqPath);
56234
+ const contentType = blob.type || MIME_FALLBACK[ext] || "application/octet-stream";
56235
+ res.setHeader("Content-Type", contentType);
56236
+ const cacheControl = ext === ".html" ? "no-cache" : "public, max-age=31536000, immutable";
56237
+ res.setHeader("Cache-Control", cacheControl);
56238
+ res.send(Buffer.from(await blob.arrayBuffer()));
56239
+ return;
56240
+ }
56241
+ const hasExt = req.path.match(/\.(js|css|ico|png|jpg|svg|woff2?)$/);
56242
+ if (!hasExt && indexBlob) {
56243
+ const contentType = indexBlob.type || "text/html";
56244
+ res.setHeader("Content-Type", contentType);
56245
+ res.setHeader("Cache-Control", "no-cache");
56246
+ res.send(Buffer.from(await indexBlob.arrayBuffer()));
56247
+ return;
56248
+ }
56249
+ return next();
56250
+ });
56251
+ return true;
56252
+ }
56126
56253
  function resolveUiDistPath() {
56127
56254
  const candidates = [
56128
56255
  join41(__dirname3, "ui"),
@@ -56137,6 +56264,9 @@ function resolveUiDistPath() {
56137
56264
  return candidates[0];
56138
56265
  }
56139
56266
  function serveStatic(app) {
56267
+ if (tryServeFromEmbedded(app)) {
56268
+ return;
56269
+ }
56140
56270
  const uiDistPath = resolveUiDistPath();
56141
56271
  if (!existsSync33(uiDistPath)) {
56142
56272
  logger.warning(`UI dist not found at ${uiDistPath}. Run 'bun run ui:build' first.`);
@@ -56174,11 +56304,22 @@ function serveStatic(app) {
56174
56304
  });
56175
56305
  logger.debug(`Serving static files from ${uiDistPath}`);
56176
56306
  }
56177
- var import_express, __dirname3;
56307
+ var import_express, __dirname3, MIME_FALLBACK;
56178
56308
  var init_static_server = __esm(() => {
56179
56309
  init_logger();
56180
56310
  import_express = __toESM(require_express2(), 1);
56181
56311
  __dirname3 = dirname12(fileURLToPath2(import.meta.url));
56312
+ MIME_FALLBACK = {
56313
+ ".html": "text/html",
56314
+ ".js": "application/javascript",
56315
+ ".css": "text/css",
56316
+ ".json": "application/json",
56317
+ ".svg": "image/svg+xml",
56318
+ ".png": "image/png",
56319
+ ".ico": "image/x-icon",
56320
+ ".woff2": "font/woff2",
56321
+ ".woff": "font/woff"
56322
+ };
56182
56323
  });
56183
56324
 
56184
56325
  // node_modules/ws/lib/constants.js
@@ -87949,7 +88090,7 @@ import { join as join99 } from "node:path";
87949
88090
  init_logger();
87950
88091
  import { readFile as readFile46, readdir as readdir30, writeFile as writeFile27 } from "node:fs/promises";
87951
88092
  import { platform as platform12 } from "node:os";
87952
- import { extname as extname4, join as join98 } from "node:path";
88093
+ import { extname as extname5, join as join98 } from "node:path";
87953
88094
  var IS_WINDOWS2 = platform12() === "win32";
87954
88095
  function getOpenCodeGlobalPath() {
87955
88096
  return "$HOME/.config/opencode/";
@@ -88000,7 +88141,7 @@ function transformOpenCodeContent(content) {
88000
88141
  return { transformed, changes };
88001
88142
  }
88002
88143
  function shouldTransformFile2(filename) {
88003
- const ext2 = extname4(filename).toLowerCase();
88144
+ const ext2 = extname5(filename).toLowerCase();
88004
88145
  return TRANSFORMABLE_EXTENSIONS2.has(ext2);
88005
88146
  }
88006
88147
  async function transformPathsForGlobalOpenCode(directory, options2 = {}) {
@@ -89561,7 +89702,7 @@ async function transformFolderPaths(extractDir, folders, options2 = {}) {
89561
89702
  init_logger();
89562
89703
  import { readFile as readFile50, readdir as readdir33, writeFile as writeFile31 } from "node:fs/promises";
89563
89704
  import { platform as platform13 } from "node:os";
89564
- import { extname as extname5, join as join106 } from "node:path";
89705
+ import { extname as extname6, join as join106 } from "node:path";
89565
89706
  var IS_WINDOWS3 = platform13() === "win32";
89566
89707
  var HOME_PREFIX = IS_WINDOWS3 ? "%USERPROFILE%" : "$HOME";
89567
89708
  function getHomeDirPrefix() {
@@ -89659,7 +89800,7 @@ function transformContent(content) {
89659
89800
  return { transformed, changes };
89660
89801
  }
89661
89802
  function shouldTransformFile3(filename) {
89662
- const ext2 = extname5(filename).toLowerCase();
89803
+ const ext2 = extname6(filename).toLowerCase();
89663
89804
  const basename11 = filename.split("/").pop() || filename;
89664
89805
  return TRANSFORMABLE_EXTENSIONS3.has(ext2) || ALWAYS_TRANSFORM_FILES.has(basename11);
89665
89806
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudekit-cli",
3
- "version": "3.35.0-dev.24",
3
+ "version": "3.35.0-dev.26",
4
4
  "description": "CLI tool for bootstrapping and updating ClaudeKit projects",
5
5
  "type": "module",
6
6
  "repository": {
@@ -25,8 +25,8 @@
25
25
  "ui:build": "cd src/ui && bun install --silent && bun run build",
26
26
  "ui:dev": "cd src/ui && bun run dev",
27
27
  "build": "bun build src/index.ts --outdir dist --target node --external @octokit/rest",
28
- "compile": "bun build src/index.ts --compile --outfile ck",
29
- "compile:binary": "bun build src/index.ts --compile --outfile bin/ck",
28
+ "compile": "bun run ui:build && bun run scripts/compile-binary.ts",
29
+ "compile:binary": "bun run ui:build && bun run scripts/compile-binary.ts --outfile bin/ck && cp bin/ck /usr/local/bin/ck && echo '✅ Installed globally: /usr/local/bin/ck'",
30
30
  "compile:binaries": "node scripts/build-all-binaries.js",
31
31
  "check-version-sync": "node scripts/check-binary-version-sync.js",
32
32
  "build:platform-binaries": "bun run scripts/build-platform-binaries.js",