playcademy 0.14.33 → 0.14.34

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/index.js CHANGED
@@ -712,6 +712,7 @@ var GAME_WORKER_DOMAINS = {
712
712
  production: "playcademy.gg",
713
713
  staging: "staging.playcademy.gg"
714
714
  };
715
+ var LOG_COLLECTOR_URL = "https://logs.playcademy.gg";
715
716
 
716
717
  // ../constants/src/overworld.ts
717
718
  var ITEM_SLUGS = {
@@ -3959,7 +3960,7 @@ import { join as join12 } from "path";
3959
3960
  // package.json with { type: 'json' }
3960
3961
  var package_default2 = {
3961
3962
  name: "playcademy",
3962
- version: "0.14.32",
3963
+ version: "0.14.33",
3963
3964
  type: "module",
3964
3965
  exports: {
3965
3966
  ".": {
@@ -4022,7 +4023,8 @@ var package_default2 = {
4022
4023
  "json-colorizer": "^3.0.1",
4023
4024
  jszip: "^3.10.1",
4024
4025
  miniflare: "^4.20251008.0",
4025
- open: "^10.2.0"
4026
+ open: "^10.2.0",
4027
+ ws: "^8.18.3"
4026
4028
  },
4027
4029
  devDependencies: {
4028
4030
  "@cloudflare/workers-types": "^4.20251011.0",
@@ -4032,6 +4034,7 @@ var package_default2 = {
4032
4034
  "@playcademy/timeback": "workspace:*",
4033
4035
  "@playcademy/utils": "workspace:*",
4034
4036
  "@types/bun": "latest",
4037
+ "@types/ws": "^8.18.1",
4035
4038
  bumpp: "^10.2.3",
4036
4039
  rollup: "^4.50.2",
4037
4040
  "rollup-plugin-dts": "^6.2.3"
@@ -9421,8 +9424,155 @@ async function uploadFilesLocal(files, prefix, uploadFn) {
9421
9424
  return files.length;
9422
9425
  }
9423
9426
 
9427
+ // src/lib/logs/display.ts
9428
+ import { blue as blue3, bold as bold7, cyan as cyan7, dim as dim9, gray as gray2, green as green7, red as red5, yellow as yellow5 } from "colorette";
9429
+ var LEVEL_COLORS = {
9430
+ log: gray2,
9431
+ info: blue3,
9432
+ warn: yellow5,
9433
+ error: red5,
9434
+ debug: dim9
9435
+ };
9436
+ var OUTCOME_COLORS = {
9437
+ ok: green7,
9438
+ exception: red5,
9439
+ exceededCpu: red5,
9440
+ exceededMemory: red5,
9441
+ canceled: yellow5,
9442
+ scriptNotFound: red5,
9443
+ unknown: gray2
9444
+ };
9445
+ function formatTime2(timestamp5) {
9446
+ const date = new Date(timestamp5);
9447
+ return date.toLocaleTimeString("en-US", {
9448
+ hour: "numeric",
9449
+ minute: "2-digit",
9450
+ second: "2-digit",
9451
+ hour12: true
9452
+ });
9453
+ }
9454
+ var HTTP_STATUS_TEXT = {
9455
+ 200: "OK",
9456
+ 201: "Created",
9457
+ 204: "No Content",
9458
+ 301: "Moved Permanently",
9459
+ 302: "Found",
9460
+ 304: "Not Modified",
9461
+ 400: "Bad Request",
9462
+ 401: "Unauthorized",
9463
+ 403: "Forbidden",
9464
+ 404: "Not Found",
9465
+ 405: "Method Not Allowed",
9466
+ 409: "Conflict",
9467
+ 422: "Unprocessable Entity",
9468
+ 429: "Too Many Requests",
9469
+ 500: "Internal Server Error",
9470
+ 502: "Bad Gateway",
9471
+ 503: "Service Unavailable",
9472
+ 504: "Gateway Timeout"
9473
+ };
9474
+ function formatStatus(status) {
9475
+ const text5 = HTTP_STATUS_TEXT[status] ?? "";
9476
+ const colorFn = status >= 500 ? red5 : status >= 400 ? yellow5 : status >= 300 ? blue3 : status >= 200 ? green7 : gray2;
9477
+ const boldCode = colorFn(bold7(String(status)));
9478
+ return text5 ? `${boldCode} ${colorFn(text5)}` : boldCode;
9479
+ }
9480
+ function stripLogPrefix(message) {
9481
+ const prefixPattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z?\s*)?(LOG|INFO|WARN|ERROR|DEBUG)\s*/i;
9482
+ return message.replace(prefixPattern, "");
9483
+ }
9484
+ function formatValue(value) {
9485
+ if (typeof value === "string") return stripLogPrefix(value);
9486
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
9487
+ if (value === null) return "null";
9488
+ if (value === void 0) return "undefined";
9489
+ try {
9490
+ return JSON.stringify(value, null, 2);
9491
+ } catch {
9492
+ return String(value);
9493
+ }
9494
+ }
9495
+ function displayLogEntry(entry) {
9496
+ const time = dim9(formatTime2(entry.timestamp));
9497
+ const outcomeColor = OUTCOME_COLORS[entry.outcome] ?? gray2;
9498
+ const outcome = outcomeColor(entry.outcome.toUpperCase());
9499
+ if (entry.request) {
9500
+ const method = cyan7(bold7(entry.request.method));
9501
+ const urlObj = new URL(entry.request.url);
9502
+ const url = urlObj.pathname + urlObj.search;
9503
+ const status = entry.response?.status;
9504
+ let statusPart = "";
9505
+ if (status) {
9506
+ statusPart = formatStatus(status);
9507
+ if (entry.outcome !== "ok") {
9508
+ statusPart += ` ${outcome}`;
9509
+ }
9510
+ } else {
9511
+ statusPart = outcome;
9512
+ }
9513
+ logger.raw(`${time} ${method} ${url} ${statusPart}`);
9514
+ }
9515
+ for (const log2 of entry.logs) {
9516
+ const levelColor = LEVEL_COLORS[log2.level] ?? gray2;
9517
+ const level = levelColor(bold7(log2.level.toUpperCase()));
9518
+ const message = log2.message.map(formatValue).join(" ");
9519
+ logger.raw(`${time} ${level} ${message}`);
9520
+ }
9521
+ for (const exception of entry.exceptions) {
9522
+ const level = red5(bold7("ERROR"));
9523
+ logger.raw(`${time} ${level} ${exception.name}: ${exception.message}`);
9524
+ }
9525
+ }
9526
+
9527
+ // src/lib/logs/stream.ts
9528
+ import WebSocket from "ws";
9529
+ function buildLogStreamUrl(options) {
9530
+ const { workerId, token, history } = options;
9531
+ const wsBaseUrl = LOG_COLLECTOR_URL.replace("https://", "wss://");
9532
+ const url = new URL(`${wsBaseUrl}/logs/${workerId}/stream`);
9533
+ url.searchParams.set("token", token);
9534
+ if (history) url.searchParams.set("history", "true");
9535
+ return url.toString();
9536
+ }
9537
+ async function connectToLogStream(config) {
9538
+ const { url, slug, environment } = config;
9539
+ const ws = new WebSocket(url);
9540
+ ws.on("open", () => {
9541
+ logger.success(`Connected to ${environment} logs for "${slug}"`);
9542
+ logger.newLine();
9543
+ logger.dim("Press ctrl+c to stop", 1);
9544
+ logger.newLine();
9545
+ });
9546
+ ws.on("message", (data) => {
9547
+ try {
9548
+ const entry = JSON.parse(data.toString());
9549
+ displayLogEntry(entry);
9550
+ } catch {
9551
+ logger.raw(data.toString());
9552
+ }
9553
+ });
9554
+ ws.on("error", (error) => {
9555
+ logger.newLine();
9556
+ logger.error(`WebSocket error: ${error.message}`);
9557
+ process.exit(1);
9558
+ });
9559
+ ws.on("close", (code, reason) => {
9560
+ logger.newLine();
9561
+ if (code !== 1e3) {
9562
+ logger.warn(`Connection closed: ${code} ${reason.toString()}`);
9563
+ }
9564
+ process.exit(0);
9565
+ });
9566
+ process.on("SIGINT", () => {
9567
+ logger.newLine();
9568
+ ws.close(1e3, "User interrupted");
9569
+ });
9570
+ await new Promise(() => {
9571
+ });
9572
+ }
9573
+
9424
9574
  // src/lib/timeback/display.ts
9425
- import { bold as bold7, greenBright as greenBright2, redBright as redBright2 } from "colorette";
9575
+ import { bold as bold8, greenBright as greenBright2, redBright as redBright2 } from "colorette";
9426
9576
  function displayIntegrationDetails(integration) {
9427
9577
  logger.highlight("Verified Course");
9428
9578
  logger.newLine();
@@ -9459,9 +9609,9 @@ function displayIntegrationList(integrations, statusByCourseId, options) {
9459
9609
  if (showStatusColumn) {
9460
9610
  if (options?.staticLabel) {
9461
9611
  const coloredLabel = options.staticLabelColor ? options.staticLabelColor(options.staticLabel) : greenBright2(options.staticLabel);
9462
- statusText = bold7(coloredLabel);
9612
+ statusText = bold8(coloredLabel);
9463
9613
  } else if (statusByCourseId && integration.courseId in statusByCourseId) {
9464
- statusText = statusByCourseId[integration.courseId] ? bold7(greenBright2(successLabel)) : bold7(redBright2(failureLabel));
9614
+ statusText = statusByCourseId[integration.courseId] ? bold8(greenBright2(successLabel)) : bold8(redBright2(failureLabel));
9465
9615
  }
9466
9616
  }
9467
9617
  const row = {
@@ -9495,7 +9645,7 @@ function displayCleanupWarning(integrations, gameName, logger2) {
9495
9645
  }
9496
9646
 
9497
9647
  // src/lib/timeback/setup.ts
9498
- import { bold as bold8 } from "colorette";
9648
+ import { bold as bold9 } from "colorette";
9499
9649
  function displaySetupDryRun(derivedRequest, env, logger2) {
9500
9650
  logger2.highlight("TimeBack Setup [DRY RUN]");
9501
9651
  logger2.newLine();
@@ -9525,7 +9675,7 @@ function displaySetupDryRun(derivedRequest, env, logger2) {
9525
9675
  logger2.admonition("tip", "Ready for setup", [
9526
9676
  "Your Timeback configuration has been validated!",
9527
9677
  "",
9528
- `Run without \`--dry-run\` to create ${bold8(`${derivedRequest.courses.length} course(s)`)} in ${bold8(env || "staging")}`
9678
+ `Run without \`--dry-run\` to create ${bold9(`${derivedRequest.courses.length} course(s)`)} in ${bold9(env || "staging")}`
9529
9679
  ]);
9530
9680
  logger2.newLine();
9531
9681
  }
@@ -9631,7 +9781,7 @@ function displayVerificationSummary(result, options) {
9631
9781
  }
9632
9782
 
9633
9783
  // src/lib/domains/display.ts
9634
- import { cyanBright, gray as gray2, greenBright as greenBright3, redBright as redBright3, yellowBright as yellowBright2 } from "colorette";
9784
+ import { cyanBright, gray as gray3, greenBright as greenBright3, redBright as redBright3, yellowBright as yellowBright2 } from "colorette";
9635
9785
  function colorizeStatus(status) {
9636
9786
  switch (status) {
9637
9787
  case "active":
@@ -9648,7 +9798,7 @@ function colorizeStatus(status) {
9648
9798
  case "pending_deletion":
9649
9799
  return redBright3(status);
9650
9800
  default:
9651
- return gray2(status);
9801
+ return gray3(status);
9652
9802
  }
9653
9803
  }
9654
9804
  function displayDomainStatus(hostname, domain) {
@@ -9906,7 +10056,7 @@ initCommand.addCommand(configCommand);
9906
10056
  // src/commands/login.ts
9907
10057
  import { userInfo } from "os";
9908
10058
  import { input as input4, password, select as select6 } from "@inquirer/prompts";
9909
- import { bold as bold9, dim as dim9, whiteBright } from "colorette";
10059
+ import { bold as bold10, dim as dim10, whiteBright } from "colorette";
9910
10060
  import { Command as Command3 } from "commander";
9911
10061
  import open from "open";
9912
10062
  var loginCommand = new Command3("login").description("Authenticate with Playcademy").option("-e, --email <email>", "Email address (for email/password auth)").option("-p, --password <password>", "Password (for email/password auth)").option("--sso", "Use Timeback SSO authentication").option("--env <environment>", "Environment to login to (staging or production)").action(async (options) => {
@@ -9920,12 +10070,12 @@ var loginCommand = new Command3("login").description("Authenticate with Playcade
9920
10070
  const otherEnv = environment === "staging" ? "production" : "staging";
9921
10071
  const otherProfile = await getProfile(otherEnv, profileName);
9922
10072
  logger.admonition("note", "Hello again", [
9923
- bold9("You're already logged in"),
10073
+ bold10("You're already logged in"),
9924
10074
  "",
9925
- dim9("Email: ") + bold9(email2),
9926
- dim9("Environment: ") + bold9(environment),
9927
- dim9("Profile: ") + bold9(profileName),
9928
- ...otherProfile ? [dim9("Other Profile: ") + bold9(otherEnv)] : []
10075
+ dim10("Email: ") + bold10(email2),
10076
+ dim10("Environment: ") + bold10(environment),
10077
+ dim10("Profile: ") + bold10(profileName),
10078
+ ...otherProfile ? [dim10("Other Profile: ") + bold10(otherEnv)] : []
9929
10079
  ]);
9930
10080
  logger.newLine();
9931
10081
  return;
@@ -10057,7 +10207,7 @@ async function handleSsoLogin(environment, profileName) {
10057
10207
  logger.admonition("warning", "Your API Key", [
10058
10208
  "Save this key securely - it will not be shown again!",
10059
10209
  "",
10060
- whiteBright(bold9(apiKeyResult.apiKey))
10210
+ whiteBright(bold10(apiKeyResult.apiKey))
10061
10211
  ]);
10062
10212
  logger.newLine();
10063
10213
  await runStep(
@@ -10123,9 +10273,53 @@ var logoutCommand = new Command4("logout").description("Log out from Playcademy"
10123
10273
  }
10124
10274
  });
10125
10275
 
10126
- // src/commands/me/index.ts
10276
+ // src/commands/logs/index.ts
10127
10277
  import { Command as Command5 } from "commander";
10128
- var meCommand = new Command5("me").description("Display current user information").option(
10278
+ import { ApiError as ApiError4 } from "@playcademy/sdk/internal";
10279
+ async function runLogs(slugArg, options) {
10280
+ try {
10281
+ logger.newLine();
10282
+ const environment = ensureEnvironment(options.env);
10283
+ let slug;
10284
+ if (slugArg) {
10285
+ slug = slugArg;
10286
+ } else {
10287
+ try {
10288
+ await findConfigPath();
10289
+ const config = await loadConfig();
10290
+ slug = getSlugFromConfig(config);
10291
+ } catch {
10292
+ logger.error("No slug provided and no config file found");
10293
+ logger.newLine();
10294
+ process.exit(1);
10295
+ }
10296
+ }
10297
+ const client = await requireAuthenticatedClient();
10298
+ let token;
10299
+ let workerId;
10300
+ try {
10301
+ const result = await client.dev.games.logs.getToken(slug, environment);
10302
+ token = result.token;
10303
+ workerId = result.workerId;
10304
+ } catch (error) {
10305
+ if (error instanceof ApiError4 && error.status === 404) {
10306
+ logger.error(`Project not found: "${slug}"`);
10307
+ logger.newLine();
10308
+ process.exit(1);
10309
+ }
10310
+ throw error;
10311
+ }
10312
+ const url = buildLogStreamUrl({ workerId, token, history: options.history });
10313
+ await connectToLogStream({ url, slug, environment });
10314
+ } catch (error) {
10315
+ logAndExit(error, { prefix: "Failed to stream logs" });
10316
+ }
10317
+ }
10318
+ var logsCommand = new Command5("logs").description("Stream real-time logs from a deployed app").argument("[slug]", "Game slug (uses config file if not provided)").option("--env <environment>", "Environment (production or staging)").option("--history", "Include recent log history (default: false)").action(runLogs);
10319
+
10320
+ // src/commands/me/index.ts
10321
+ import { Command as Command6 } from "commander";
10322
+ var meCommand = new Command6("me").description("Display current user information").option(
10129
10323
  "--env <environment>",
10130
10324
  "Environment to check user information from (staging or production)"
10131
10325
  ).action(async (options) => {
@@ -10165,21 +10359,21 @@ var meCommand = new Command5("me").description("Display current user information
10165
10359
 
10166
10360
  // src/commands/update/index.ts
10167
10361
  import { execSync as execSync8 } from "child_process";
10168
- import { bold as bold10 } from "colorette";
10169
- import { Command as Command6 } from "commander";
10362
+ import { bold as bold11 } from "colorette";
10363
+ import { Command as Command7 } from "commander";
10170
10364
  var updateCommands = {
10171
10365
  bun: "bun install -g playcademy@latest",
10172
10366
  npm: "npm install -g playcademy@latest",
10173
10367
  pnpm: "pnpm add -g playcademy@latest",
10174
10368
  yarn: "yarn global add playcademy@latest"
10175
10369
  };
10176
- var updateCommand = new Command6("update").description("Update the Playcademy CLI to the latest version").action(async () => {
10370
+ var updateCommand = new Command7("update").description("Update the Playcademy CLI to the latest version").action(async () => {
10177
10371
  const runnerPath = executorIsPackageRunner();
10178
10372
  if (runnerPath) {
10179
10373
  const runnerName = getPackageRunnerName(runnerPath);
10180
10374
  logger.newLine();
10181
10375
  logger.admonition("info", "Package Runner Detected", [
10182
- `You are running the CLI via package runner (${bold10(runnerName)}).`,
10376
+ `You are running the CLI via package runner (${bold11(runnerName)}).`,
10183
10377
  "",
10184
10378
  "Package runners use the latest version of the CLI by default, but may cache older versions.",
10185
10379
  `To ensure you run the package's latest version: \`${runnerName} playcademy@latest\``
@@ -10205,7 +10399,7 @@ var updateCommand = new Command6("update").description("Update the Playcademy CL
10205
10399
  });
10206
10400
 
10207
10401
  // src/commands/deploy/index.ts
10208
- import { Command as Command7 } from "commander";
10402
+ import { Command as Command8 } from "commander";
10209
10403
  async function executeDeployment(plan, context2, environment) {
10210
10404
  const result = await deployGame(context2, plan.shouldUploadBuild, plan.shouldDeployBackend);
10211
10405
  const game = result.game;
@@ -10267,7 +10461,7 @@ async function runDeployment(options) {
10267
10461
  reportDeploymentSuccess(result, context2);
10268
10462
  }
10269
10463
  }
10270
- var deployCommand = new Command7("deploy").description("Deploy your project to Playcademy").option("-c, --config <path>", "Path to configuration file").option("-n, --name <name>", "Display name").option("-d, --description <desc>", "App description").option("-e, --emoji <emoji>", "App emoji").option("-b, --build <path>", "Path to zip file").option("--env <environment>", "Deployment environment (production or staging)").option("--backend", "Deploy backend (API routes + database + integrations)").option("--no-backend", "Skip backend deployment").option("--force-backend", "Force backend deployment even if no changes detected").option("--dry-run", "Validate configuration without deploying").option("-v, --verbose", "Show verbose output").option("--debug", "Show debug information (change detection, hashes, etc.)").action(async (options) => {
10464
+ var deployCommand = new Command8("deploy").description("Deploy your project to Playcademy").option("-c, --config <path>", "Path to configuration file").option("-n, --name <name>", "Display name").option("-d, --description <desc>", "App description").option("-e, --emoji <emoji>", "App emoji").option("-b, --build <path>", "Path to zip file").option("--env <environment>", "Deployment environment (production or staging)").option("--backend", "Deploy backend (API routes + database + integrations)").option("--no-backend", "Skip backend deployment").option("--force-backend", "Force backend deployment even if no changes detected").option("--dry-run", "Validate configuration without deploying").option("-v, --verbose", "Show verbose output").option("--debug", "Show debug information (change detection, hashes, etc.)").action(async (options) => {
10271
10465
  try {
10272
10466
  await runDeployment(options);
10273
10467
  } catch (error) {
@@ -10281,12 +10475,12 @@ var deployCommand = new Command7("deploy").description("Deploy your project to P
10281
10475
  });
10282
10476
 
10283
10477
  // src/commands/projects/index.ts
10284
- import { Command as Command10 } from "commander";
10478
+ import { Command as Command11 } from "commander";
10285
10479
 
10286
10480
  // src/commands/projects/delete.ts
10287
10481
  import { confirm as confirm7, input as input5, select as select7 } from "@inquirer/prompts";
10288
- import { Command as Command8 } from "commander";
10289
- var deleteCommand = new Command8("delete").alias("rm").alias("remove").description("Delete a project").argument("[slug]", "Project slug to delete").option("-f, --force", "Skip confirmation prompt").option("--env <environment>", "Environment to delete project from (staging or production)").action(async (slug, options) => {
10482
+ import { Command as Command9 } from "commander";
10483
+ var deleteCommand = new Command9("delete").alias("rm").alias("remove").description("Delete a project").argument("[slug]", "Project slug to delete").option("-f, --force", "Skip confirmation prompt").option("--env <environment>", "Environment to delete project from (staging or production)").action(async (slug, options) => {
10290
10484
  const { env } = options;
10291
10485
  try {
10292
10486
  const environment = ensureEnvironment(env);
@@ -10378,8 +10572,8 @@ var deleteCommand = new Command8("delete").alias("rm").alias("remove").descripti
10378
10572
  });
10379
10573
 
10380
10574
  // src/commands/projects/list.ts
10381
- import { Command as Command9 } from "commander";
10382
- var listCommand = new Command9("list").alias("ls").description("List your projects").option("--env <environment>", "Environment to list projects from (staging or production)").action(async (options) => {
10575
+ import { Command as Command10 } from "commander";
10576
+ var listCommand = new Command10("list").alias("ls").description("List your projects").option("--env <environment>", "Environment to list projects from (staging or production)").action(async (options) => {
10383
10577
  const { env } = options;
10384
10578
  try {
10385
10579
  const environment = ensureEnvironment(env);
@@ -10413,16 +10607,16 @@ var listCommand = new Command9("list").alias("ls").description("List your projec
10413
10607
  });
10414
10608
 
10415
10609
  // src/commands/projects/index.ts
10416
- var projectsCommand = new Command10("projects").description("Manage deployed projects");
10610
+ var projectsCommand = new Command11("projects").description("Manage deployed projects");
10417
10611
  projectsCommand.addCommand(listCommand);
10418
10612
  projectsCommand.addCommand(deleteCommand);
10419
10613
 
10420
10614
  // src/commands/dev/index.ts
10421
- import { Command as Command13 } from "commander";
10615
+ import { Command as Command14 } from "commander";
10422
10616
 
10423
10617
  // src/commands/dev/apply.ts
10424
- import { Command as Command11 } from "commander";
10425
- var applyCommand = new Command11("apply").description("Apply for developer status").option(
10618
+ import { Command as Command12 } from "commander";
10619
+ var applyCommand = new Command12("apply").description("Apply for developer status").option(
10426
10620
  "--env <environment>",
10427
10621
  "Environment to apply for developer status in (staging or production)"
10428
10622
  ).action(async (options) => {
@@ -10473,8 +10667,8 @@ var applyCommand = new Command11("apply").description("Apply for developer statu
10473
10667
  });
10474
10668
 
10475
10669
  // src/commands/dev/get-status.ts
10476
- import { Command as Command12 } from "commander";
10477
- var getStatusCommand = new Command12("status").description("Check your developer status").option(
10670
+ import { Command as Command13 } from "commander";
10671
+ var getStatusCommand = new Command13("status").description("Check your developer status").option(
10478
10672
  "--env <environment>",
10479
10673
  "Environment to check developer status from (staging or production)"
10480
10674
  ).action(async (options) => {
@@ -10517,7 +10711,7 @@ var getStatusCommand = new Command12("status").description("Check your developer
10517
10711
  });
10518
10712
 
10519
10713
  // package.json
10520
- var version2 = "0.14.32";
10714
+ var version2 = "0.14.33";
10521
10715
 
10522
10716
  // src/commands/dev/server.ts
10523
10717
  function setupCleanupHandlers(workspace, getServer) {
@@ -10603,12 +10797,12 @@ async function runDevServer(options) {
10603
10797
  }
10604
10798
 
10605
10799
  // src/commands/dev/index.ts
10606
- var devCommand = new Command13("dev").description("Start local backend development server").option("-p, --port <port>", "Backend server port", String(DEFAULT_PORTS.BACKEND)).option("--no-reload", "Disable hot reload").option("--no-logger", "Disable HTTP request logging").option("-q, --quiet", "Quiet mode").action(runDevServer);
10800
+ var devCommand = new Command14("dev").description("Start local backend development server").option("-p, --port <port>", "Backend server port", String(DEFAULT_PORTS.BACKEND)).option("--no-reload", "Disable hot reload").option("--no-logger", "Disable HTTP request logging").option("-q, --quiet", "Quiet mode").action(runDevServer);
10607
10801
  devCommand.addCommand(applyCommand);
10608
10802
  devCommand.addCommand(getStatusCommand);
10609
10803
 
10610
10804
  // src/commands/api/index.ts
10611
- import { Command as Command14 } from "commander";
10805
+ import { Command as Command15 } from "commander";
10612
10806
 
10613
10807
  // src/commands/api/init.ts
10614
10808
  import { input as input6 } from "@inquirer/prompts";
@@ -10697,19 +10891,19 @@ async function runApiInit() {
10697
10891
  }
10698
10892
 
10699
10893
  // src/commands/api/index.ts
10700
- var apiCommand = new Command14("api").description("Custom API routes management");
10894
+ var apiCommand = new Command15("api").description("Custom API routes management");
10701
10895
  apiCommand.command("init").description("Add custom API routes to your project").action(runApiInit);
10702
10896
 
10703
10897
  // src/commands/auth/index.ts
10704
- import { Command as Command17 } from "commander";
10898
+ import { Command as Command18 } from "commander";
10705
10899
 
10706
10900
  // src/commands/auth/add.ts
10707
10901
  init_file_loader();
10708
10902
  import { writeFileSync as writeFileSync14 } from "fs";
10709
10903
  import { join as join35 } from "path";
10710
- import { bold as bold11 } from "colorette";
10711
- import { Command as Command15 } from "commander";
10712
- var addAuthCommand = new Command15("add").description("Add an authentication provider to your project").argument("<provider>", "Provider to add: email | github | google").addHelpText(
10904
+ import { bold as bold12 } from "colorette";
10905
+ import { Command as Command16 } from "commander";
10906
+ var addAuthCommand = new Command16("add").description("Add an authentication provider to your project").argument("<provider>", "Provider to add: email | github | google").addHelpText(
10713
10907
  "after",
10714
10908
  `
10715
10909
  Examples:
@@ -10775,16 +10969,16 @@ Examples:
10775
10969
  PLACEHOLDER_APP_URL
10776
10970
  ).replace("{provider}", provider);
10777
10971
  logger.admonition("tip", "Next Steps", [
10778
- bold11(`1. Add callback URL to your ${providerDisplayName} OAuth app:`),
10972
+ bold12(`1. Add callback URL to your ${providerDisplayName} OAuth app:`),
10779
10973
  "",
10780
10974
  ` <${callbackUrl}>`,
10781
10975
  "",
10782
- bold11("2. Add credentials to <.env> (for local development):"),
10976
+ bold12("2. Add credentials to <.env> (for local development):"),
10783
10977
  "",
10784
10978
  ` \`${provider.toUpperCase()}_CLIENT_ID=[your-id]\``,
10785
10979
  ` \`${provider.toUpperCase()}_CLIENT_SECRET=[your-secret]\``,
10786
10980
  "",
10787
- bold11("3. Set production secrets (for deployment):"),
10981
+ bold12("3. Set production secrets (for deployment):"),
10788
10982
  "",
10789
10983
  ` \`playcademy secret set ${provider.toUpperCase()}_CLIENT_ID=[your-id]\``,
10790
10984
  ` \`playcademy secret set ${provider.toUpperCase()}_CLIENT_SECRET=[your-secret]\``
@@ -10799,9 +10993,9 @@ Examples:
10799
10993
 
10800
10994
  // src/commands/auth/init.ts
10801
10995
  import { confirm as confirm8 } from "@inquirer/prompts";
10802
- import { Command as Command16 } from "commander";
10996
+ import { Command as Command17 } from "commander";
10803
10997
  var sampleCustomRouteTemplate2 = loadTemplateString("api/sample-custom.ts");
10804
- var initAuthCommand = new Command16("init").description("Add authentication to your project").action(async () => {
10998
+ var initAuthCommand = new Command17("init").description("Add authentication to your project").action(async () => {
10805
10999
  try {
10806
11000
  logger.newLine();
10807
11001
  const configPath = await requireConfigFile();
@@ -10903,14 +11097,14 @@ var initAuthCommand = new Command16("init").description("Add authentication to y
10903
11097
  });
10904
11098
 
10905
11099
  // src/commands/auth/index.ts
10906
- var authCommand = new Command17("auth").description("Manage authentication for your project").action(() => {
11100
+ var authCommand = new Command18("auth").description("Manage authentication for your project").action(() => {
10907
11101
  authCommand.help();
10908
11102
  });
10909
11103
  authCommand.addCommand(initAuthCommand);
10910
11104
  authCommand.addCommand(addAuthCommand);
10911
11105
 
10912
11106
  // src/commands/db/index.ts
10913
- import { Command as Command18 } from "commander";
11107
+ import { Command as Command19 } from "commander";
10914
11108
 
10915
11109
  // src/commands/db/diff.ts
10916
11110
  async function runDbDiff() {
@@ -11028,7 +11222,7 @@ async function runDbInit() {
11028
11222
  import { existsSync as existsSync25 } from "fs";
11029
11223
  import { join as join36 } from "path";
11030
11224
  import { confirm as confirm9, input as input8 } from "@inquirer/prompts";
11031
- import { bold as bold12, redBright as redBright4, underline as underline3 } from "colorette";
11225
+ import { bold as bold13, redBright as redBright4, underline as underline3 } from "colorette";
11032
11226
  import { Miniflare as Miniflare2 } from "miniflare";
11033
11227
  async function runDbResetRemote(options) {
11034
11228
  const environment = ensureEnvironment(options.env);
@@ -11046,9 +11240,9 @@ async function runDbResetRemote(options) {
11046
11240
  const game = await client.games.fetch(deployedGame.gameId);
11047
11241
  logger.newLine();
11048
11242
  logger.admonition("warning", "DESTRUCTIVE OPERATION", [
11049
- `Are you sure you want to ${redBright4(underline3(bold12("DELETE ALL DATA")))} in your ${environment} database?`,
11243
+ `Are you sure you want to ${redBright4(underline3(bold13("DELETE ALL DATA")))} in your ${environment} database?`,
11050
11244
  `All tables will be dropped and recreated from schema.`,
11051
- `This action is irreversible and ${underline3(bold12("cannot be undone"))}.`
11245
+ `This action is irreversible and ${underline3(bold13("cannot be undone"))}.`
11052
11246
  ]);
11053
11247
  logger.newLine();
11054
11248
  const confirmed = await confirm9({
@@ -11215,7 +11409,7 @@ async function runDbSchema(options = {}) {
11215
11409
  import { existsSync as existsSync26 } from "fs";
11216
11410
  import { join as join37 } from "path";
11217
11411
  import { confirm as confirm10, input as input9 } from "@inquirer/prompts";
11218
- import { bold as bold13, dim as dim10, redBright as redBright5, underline as underline4 } from "colorette";
11412
+ import { bold as bold14, dim as dim11, redBright as redBright5, underline as underline4 } from "colorette";
11219
11413
  import { Miniflare as Miniflare3 } from "miniflare";
11220
11414
  async function runDbResetRemote2(gameSlug, environment) {
11221
11415
  const client = await requireAuthenticatedClient();
@@ -11259,8 +11453,8 @@ async function runDbSeedRemote(seedFile, options) {
11259
11453
  logger.newLine();
11260
11454
  if (willReset) {
11261
11455
  logger.admonition("warning", "Remote Database Seeding", [
11262
- `Are you sure you want to ${redBright5(underline4(bold13("DELETE ALL DATA")))} in your ${environment} database?`,
11263
- `This action is irreversible and ${underline4(bold13("cannot be undone"))}.`,
11456
+ `Are you sure you want to ${redBright5(underline4(bold14("DELETE ALL DATA")))} in your ${environment} database?`,
11457
+ `This action is irreversible and ${underline4(bold14("cannot be undone"))}.`,
11264
11458
  `Run this command with \`--no-reset\` if you want to seed without resetting.`
11265
11459
  ]);
11266
11460
  } else {
@@ -11345,7 +11539,7 @@ async function runDbSeedRemote(seedFile, options) {
11345
11539
  displaySeedLogs(seedResult.logs, "error");
11346
11540
  }
11347
11541
  logger.newLine();
11348
- logger.error(`Seeding failed ${dim10(`[${Math.round(duration)}ms]`)}`);
11542
+ logger.error(`Seeding failed ${dim11(`[${Math.round(duration)}ms]`)}`);
11349
11543
  logger.newLine();
11350
11544
  process.exit(1);
11351
11545
  }
@@ -11355,7 +11549,7 @@ async function runDbSeedRemote(seedFile, options) {
11355
11549
  }
11356
11550
  logger.newLine();
11357
11551
  logger.success(
11358
- `${capitalize(environment)} database seeded ${dim10(`[${Math.round(duration)}ms]`)}`
11552
+ `${capitalize(environment)} database seeded ${dim11(`[${Math.round(duration)}ms]`)}`
11359
11553
  );
11360
11554
  logger.newLine();
11361
11555
  }
@@ -11440,7 +11634,7 @@ async function runDbSeed(options = {}) {
11440
11634
  }
11441
11635
 
11442
11636
  // src/commands/db/index.ts
11443
- var dbCommand = new Command18("db").description("Database management commands");
11637
+ var dbCommand = new Command19("db").description("Database management commands");
11444
11638
  dbCommand.command("init").description("Add database to your project").action(runDbInit);
11445
11639
  dbCommand.command("reset").description("Reset database").option("--remote", "Reset remote deployed database").option("--env <environment>", "Environment: staging (default) or production").option("-f, --force", "Skip confirmation prompt (local only)").option("--debug", "Enable debug mode").action(
11446
11640
  (options) => runDbReset({
@@ -11463,7 +11657,7 @@ dbCommand.command("diff").description("Show schema changes since last deployment
11463
11657
  dbCommand.command("schema").description("Print full schema SQL that would be pushed after reset").option("--raw", "Output raw SQL only (for piping to files)").option("--full", "Show full schema hash").action((options) => runDbSchema({ raw: options.raw, full: options.full }));
11464
11658
 
11465
11659
  // src/commands/kv/index.ts
11466
- import { Command as Command19 } from "commander";
11660
+ import { Command as Command20 } from "commander";
11467
11661
 
11468
11662
  // src/commands/kv/clear.ts
11469
11663
  import { join as join38 } from "path";
@@ -12400,7 +12594,7 @@ async function runKVStats(options = {}) {
12400
12594
  }
12401
12595
 
12402
12596
  // src/commands/kv/index.ts
12403
- var kvCommand = new Command19("kv").description("Manage KV storage integration").action(() => {
12597
+ var kvCommand = new Command20("kv").description("Manage KV storage integration").action(() => {
12404
12598
  kvCommand.help();
12405
12599
  });
12406
12600
  kvCommand.command("init").description("Add KV storage integration to your project").action(runKVInit);
@@ -12438,7 +12632,7 @@ kvCommand.command("seed <file>").description("Seed KV namespace with key-value p
12438
12632
  ).action(runKVSeed);
12439
12633
 
12440
12634
  // src/commands/bucket/index.ts
12441
- import { Command as Command20 } from "commander";
12635
+ import { Command as Command21 } from "commander";
12442
12636
 
12443
12637
  // src/commands/bucket/bulk.ts
12444
12638
  import { existsSync as existsSync27, statSync as statSync3 } from "fs";
@@ -13250,7 +13444,7 @@ async function runBucketPut(key, filePath, options = {}) {
13250
13444
  }
13251
13445
 
13252
13446
  // src/commands/bucket/index.ts
13253
- var bucketCommand = new Command20("bucket").description("Manage bucket storage integration").action(() => {
13447
+ var bucketCommand = new Command21("bucket").description("Manage bucket storage integration").action(() => {
13254
13448
  bucketCommand.help();
13255
13449
  });
13256
13450
  bucketCommand.command("init").description("Add bucket storage integration to your project").action(runBucketInit);
@@ -13284,7 +13478,7 @@ bucketCommand.command("bulk <directory>").description(
13284
13478
  ).action(runBucketBulk);
13285
13479
 
13286
13480
  // src/commands/domain/index.ts
13287
- import { Command as Command21 } from "commander";
13481
+ import { Command as Command22 } from "commander";
13288
13482
 
13289
13483
  // src/commands/domain/add.ts
13290
13484
  import { underline as underline5 } from "colorette";
@@ -13480,19 +13674,19 @@ async function runDomainVerify(hostname, options) {
13480
13674
  }
13481
13675
 
13482
13676
  // src/commands/domain/index.ts
13483
- var domainCommand = new Command21("domain").description("Custom domain management");
13677
+ var domainCommand = new Command22("domain").description("Custom domain management");
13484
13678
  domainCommand.command("add <hostname>").description("Add a custom domain to your project").option("--env <env>", "Environment (staging or production)", "staging").action(runDomainAdd);
13485
13679
  domainCommand.command("list").description("List custom domains for your project").option("--env <env>", "Environment (staging or production)", "staging").option("--json", "Output as JSON").option("--raw", "Output hostnames only").alias("ls").action(runDomainList);
13486
13680
  domainCommand.command("verify <hostname>").description("Check custom domain validation status").option("--env <env>", "Environment (staging or production)", "staging").option("--json", "Output as JSON").option("--refresh", "Re-trigger domain validation", false).alias("status").action(runDomainVerify);
13487
13681
  domainCommand.command("delete <hostname>").description("Remove a custom domain").option("--env <env>", "Environment (staging or production)", "staging").option("-f, --force", "Skip confirmation prompt").alias("rm").alias("remove").action(runDomainDelete);
13488
13682
 
13489
13683
  // src/commands/secret/index.ts
13490
- import { Command as Command25 } from "commander";
13684
+ import { Command as Command26 } from "commander";
13491
13685
 
13492
13686
  // src/commands/secret/delete.ts
13493
13687
  import { confirm as confirm14 } from "@inquirer/prompts";
13494
- import { Command as Command22 } from "commander";
13495
- var deleteCommand2 = new Command22("delete").description("Delete a project secret").argument("<key>", "Secret key to delete").option("--env <environment>", "Environment (staging or production)").option("-f, --force", "Skip confirmation").option("--no-deploy", "Skip deployment prompt").action(async (key, options) => {
13688
+ import { Command as Command23 } from "commander";
13689
+ var deleteCommand2 = new Command23("delete").description("Delete a project secret").argument("<key>", "Secret key to delete").option("--env <environment>", "Environment (staging or production)").option("-f, --force", "Skip confirmation").option("--no-deploy", "Skip deployment prompt").action(async (key, options) => {
13496
13690
  const { env, deploy: shouldPromptDeploy = true } = options;
13497
13691
  try {
13498
13692
  const environment = ensureEnvironment(env);
@@ -13564,8 +13758,8 @@ var deleteCommand2 = new Command22("delete").description("Delete a project secre
13564
13758
  });
13565
13759
 
13566
13760
  // src/commands/secret/list.ts
13567
- import { Command as Command23 } from "commander";
13568
- var listCommand2 = new Command23("list").description("List project secret keys").option("--env <environment>", "Environment (staging or production)").action(async (options) => {
13761
+ import { Command as Command24 } from "commander";
13762
+ var listCommand2 = new Command24("list").description("List project secret keys").option("--env <environment>", "Environment (staging or production)").action(async (options) => {
13569
13763
  const { env } = options;
13570
13764
  try {
13571
13765
  const environment = ensureEnvironment(env);
@@ -13613,8 +13807,8 @@ var listCommand2 = new Command23("list").description("List project secret keys")
13613
13807
 
13614
13808
  // src/commands/secret/set.ts
13615
13809
  import { confirm as confirm15 } from "@inquirer/prompts";
13616
- import { Command as Command24 } from "commander";
13617
- var setCommand = new Command24("set").description("Set or update a project secret").argument("<key>", "Secret key (e.g., STRIPE_KEY)").argument("<value>", "Secret value").option("--env <environment>", "Environment (staging or production)").option("--no-deploy", "Skip deployment prompt").action(async (key, value, options) => {
13810
+ import { Command as Command25 } from "commander";
13811
+ var setCommand = new Command25("set").description("Set or update a project secret").argument("<key>", "Secret key (e.g., STRIPE_KEY)").argument("<value>", "Secret value").option("--env <environment>", "Environment (staging or production)").option("--no-deploy", "Skip deployment prompt").action(async (key, value, options) => {
13618
13812
  const { env, deploy: shouldPromptDeploy = true } = options;
13619
13813
  try {
13620
13814
  const environment = ensureEnvironment(env);
@@ -13674,11 +13868,11 @@ var setCommand = new Command24("set").description("Set or update a project secre
13674
13868
  });
13675
13869
 
13676
13870
  // src/commands/secret/index.ts
13677
- var secretCommand = new Command25("secrets").description("Manage project secrets").addCommand(setCommand).addCommand(listCommand2).addCommand(deleteCommand2);
13871
+ var secretCommand = new Command26("secrets").description("Manage project secrets").addCommand(setCommand).addCommand(listCommand2).addCommand(deleteCommand2);
13678
13872
 
13679
13873
  // src/commands/types/index.ts
13680
- import { Command as Command26 } from "commander";
13681
- var typesCommand = new Command26("types").description("Generate TypeScript type definitions").action(async () => {
13874
+ import { Command as Command27 } from "commander";
13875
+ var typesCommand = new Command27("types").description("Generate TypeScript type definitions").action(async () => {
13682
13876
  try {
13683
13877
  logger.newLine();
13684
13878
  await runStep(
@@ -13693,10 +13887,10 @@ var typesCommand = new Command26("types").description("Generate TypeScript type
13693
13887
  });
13694
13888
 
13695
13889
  // src/commands/profiles/index.ts
13696
- import { Command as Command30 } from "commander";
13890
+ import { Command as Command31 } from "commander";
13697
13891
 
13698
13892
  // src/commands/profiles/list.ts
13699
- import { Command as Command27 } from "commander";
13893
+ import { Command as Command28 } from "commander";
13700
13894
  async function listProfilesAction() {
13701
13895
  try {
13702
13896
  const profilesMap = await listProfiles();
@@ -13738,12 +13932,12 @@ async function listProfilesAction() {
13738
13932
  process.exit(1);
13739
13933
  }
13740
13934
  }
13741
- var listCommand3 = new Command27("list").alias("ls").description("List all stored authentication profiles").action(listProfilesAction);
13935
+ var listCommand3 = new Command28("list").alias("ls").description("List all stored authentication profiles").action(listProfilesAction);
13742
13936
 
13743
13937
  // src/commands/profiles/remove.ts
13744
- import { bold as bold14 } from "colorette";
13745
- import { Command as Command28 } from "commander";
13746
- var removeCommand = new Command28("remove").alias("rm").description('Remove an authentication profile (defaults to "default")').argument("[name]", "Profile name to remove", "default").option("--env <environment>", "Environment to remove profile from (staging or production)").action(async (name, options) => {
13938
+ import { bold as bold15 } from "colorette";
13939
+ import { Command as Command29 } from "commander";
13940
+ var removeCommand = new Command29("remove").alias("rm").description('Remove an authentication profile (defaults to "default")').argument("[name]", "Profile name to remove", "default").option("--env <environment>", "Environment to remove profile from (staging or production)").action(async (name, options) => {
13747
13941
  const { env } = options;
13748
13942
  const environment = ensureEnvironment(env);
13749
13943
  try {
@@ -13757,7 +13951,7 @@ var removeCommand = new Command28("remove").alias("rm").description('Remove an a
13757
13951
  }
13758
13952
  await removeProfile(environment, name);
13759
13953
  logger.admonition("note", "Removed!", [
13760
- `Profile ${bold14(name)} removed from ${environment}`,
13954
+ `Profile ${bold15(name)} removed from ${environment}`,
13761
13955
  environment === "production" ? `To re-authenticate run \`playcademy login --env ${environment}\`` : "To re-authenticate run `playcademy login`"
13762
13956
  ]);
13763
13957
  logger.newLine();
@@ -13768,8 +13962,8 @@ var removeCommand = new Command28("remove").alias("rm").description('Remove an a
13768
13962
 
13769
13963
  // src/commands/profiles/reset.ts
13770
13964
  import { confirm as confirm16 } from "@inquirer/prompts";
13771
- import { Command as Command29 } from "commander";
13772
- var resetCommand = new Command29("reset").description(
13965
+ import { Command as Command30 } from "commander";
13966
+ var resetCommand = new Command30("reset").description(
13773
13967
  "Remove all authentication profiles across all environments (requires confirmation)"
13774
13968
  ).alias("clear").action(async () => {
13775
13969
  try {
@@ -13845,18 +14039,18 @@ var resetCommand = new Command29("reset").description(
13845
14039
  });
13846
14040
 
13847
14041
  // src/commands/profiles/index.ts
13848
- var profilesCommand = new Command30("profiles").description("Manage authentication profiles").action(listProfilesAction);
14042
+ var profilesCommand = new Command31("profiles").description("Manage authentication profiles").action(listProfilesAction);
13849
14043
  profilesCommand.addCommand(listCommand3);
13850
14044
  profilesCommand.addCommand(removeCommand);
13851
14045
  profilesCommand.addCommand(resetCommand);
13852
14046
 
13853
14047
  // src/commands/timeback/index.ts
13854
- import { Command as Command36 } from "commander";
14048
+ import { Command as Command37 } from "commander";
13855
14049
 
13856
14050
  // src/commands/timeback/cleanup.ts
13857
14051
  import { confirm as confirm17 } from "@inquirer/prompts";
13858
- import { Command as Command31 } from "commander";
13859
- var cleanupCommand = new Command31("cleanup").description("Remove TimeBack integration from your project").option(
14052
+ import { Command as Command32 } from "commander";
14053
+ var cleanupCommand = new Command32("cleanup").description("Remove TimeBack integration from your project").option(
13860
14054
  "--env <environment>",
13861
14055
  "Environment to remove TimeBack integration from (staging or production)"
13862
14056
  ).action(async (options) => {
@@ -13908,8 +14102,8 @@ var cleanupCommand = new Command31("cleanup").description("Remove TimeBack integ
13908
14102
  });
13909
14103
 
13910
14104
  // src/commands/timeback/init.ts
13911
- import { Command as Command32 } from "commander";
13912
- var initCommand2 = new Command32("init").description("Add TimeBack integration to your project").action(async () => {
14105
+ import { Command as Command33 } from "commander";
14106
+ var initCommand2 = new Command33("init").description("Add TimeBack integration to your project").action(async () => {
13913
14107
  try {
13914
14108
  logger.newLine();
13915
14109
  const configPath = await requireConfigFile();
@@ -13958,8 +14152,8 @@ var initCommand2 = new Command32("init").description("Add TimeBack integration t
13958
14152
  });
13959
14153
 
13960
14154
  // src/commands/timeback/setup.ts
13961
- import { Command as Command33 } from "commander";
13962
- var setupCommand = new Command33("setup").description("Set up TimeBack integration for your project").option("--dry-run", "Validate configuration without creating resources").option("--verbose, -v", "Output detailed information").option(
14155
+ import { Command as Command34 } from "commander";
14156
+ var setupCommand = new Command34("setup").description("Set up TimeBack integration for your project").option("--dry-run", "Validate configuration without creating resources").option("--verbose, -v", "Output detailed information").option(
13963
14157
  "--env <environment>",
13964
14158
  "Environment to set up TimeBack integration in (staging or production)"
13965
14159
  ).action(async (options) => {
@@ -14043,8 +14237,8 @@ var setupCommand = new Command33("setup").description("Set up TimeBack integrati
14043
14237
  });
14044
14238
 
14045
14239
  // src/commands/timeback/update.ts
14046
- import { Command as Command34 } from "commander";
14047
- var updateCommand2 = new Command34("update").description("Update TimeBack integration configuration for your project").option("--verbose, -v", "Output detailed information").option(
14240
+ import { Command as Command35 } from "commander";
14241
+ var updateCommand2 = new Command35("update").description("Update TimeBack integration configuration for your project").option("--verbose, -v", "Output detailed information").option(
14048
14242
  "--env <environment>",
14049
14243
  "Environment to update TimeBack integration in (staging or production)"
14050
14244
  ).action(async (options) => {
@@ -14104,8 +14298,8 @@ var updateCommand2 = new Command34("update").description("Update TimeBack integr
14104
14298
  });
14105
14299
 
14106
14300
  // src/commands/timeback/verify.ts
14107
- import { Command as Command35 } from "commander";
14108
- var verifyCommand = new Command35("verify").description("Verify TimeBack integration for your project").option("--verbose, -v", "Output detailed resource information").option(
14301
+ import { Command as Command36 } from "commander";
14302
+ var verifyCommand = new Command36("verify").description("Verify TimeBack integration for your project").option("--verbose, -v", "Output detailed resource information").option(
14109
14303
  "--env <environment>",
14110
14304
  "Environment to verify TimeBack integration in (staging or production)"
14111
14305
  ).action(async (options) => {
@@ -14150,7 +14344,7 @@ var verifyCommand = new Command35("verify").description("Verify TimeBack integra
14150
14344
  });
14151
14345
 
14152
14346
  // src/commands/timeback/index.ts
14153
- var timebackCommand = new Command36("timeback").description(
14347
+ var timebackCommand = new Command37("timeback").description(
14154
14348
  "TimeBack integration management"
14155
14349
  );
14156
14350
  timebackCommand.addCommand(initCommand2);
@@ -14160,13 +14354,13 @@ timebackCommand.addCommand(verifyCommand);
14160
14354
  timebackCommand.addCommand(cleanupCommand);
14161
14355
 
14162
14356
  // src/commands/debug/index.ts
14163
- import { Command as Command38 } from "commander";
14357
+ import { Command as Command39 } from "commander";
14164
14358
 
14165
14359
  // src/commands/debug/bundle.ts
14166
14360
  import { writeFileSync as writeFileSync16 } from "fs";
14167
14361
  import { join as join51 } from "path";
14168
- import { Command as Command37 } from "commander";
14169
- var bundleCommand = new Command37("bundle").description("Bundle and inspect the project backend worker code (for debugging)").option("-o, --output <path>", "Output file path", CLI_DEFAULT_OUTPUTS.WORKER_BUNDLE).option("--minify", "Minify the output").option("--sourcemap", "Include source maps").action(async (options) => {
14362
+ import { Command as Command38 } from "commander";
14363
+ var bundleCommand = new Command38("bundle").description("Bundle and inspect the project backend worker code (for debugging)").option("-o, --output <path>", "Output file path", CLI_DEFAULT_OUTPUTS.WORKER_BUNDLE).option("--minify", "Minify the output").option("--sourcemap", "Include source maps").action(async (options) => {
14170
14364
  try {
14171
14365
  const workspace = getWorkspace();
14172
14366
  logger.newLine();
@@ -14235,15 +14429,15 @@ var bundleCommand = new Command37("bundle").description("Bundle and inspect the
14235
14429
  });
14236
14430
 
14237
14431
  // src/commands/debug/index.ts
14238
- var debugCommand = new Command38("debug").description("Debug and inspect project builds").addCommand(bundleCommand);
14432
+ var debugCommand = new Command39("debug").description("Debug and inspect project builds").addCommand(bundleCommand);
14239
14433
 
14240
14434
  // src/commands/vite/index.ts
14241
- import { Command as Command39 } from "commander";
14435
+ import { Command as Command40 } from "commander";
14242
14436
 
14243
14437
  // src/commands/vite/config.ts
14244
14438
  import path3 from "node:path";
14245
14439
  import { confirm as confirm18 } from "@inquirer/prompts";
14246
- import { dim as dim11 } from "colorette";
14440
+ import { dim as dim12 } from "colorette";
14247
14441
  async function runViteConfig() {
14248
14442
  try {
14249
14443
  logger.newLine();
@@ -14285,7 +14479,7 @@ async function runViteConfig() {
14285
14479
  const devCommand2 = getRunCommand(pm, "dev");
14286
14480
  const buildCommand = getRunCommand(pm, "build");
14287
14481
  logger.admonition("tip", "Next Steps", [
14288
- `1. Configure options in <vite.config.ts> ${dim11("(optional)")}`,
14482
+ `1. Configure options in <vite.config.ts> ${dim12("(optional)")}`,
14289
14483
  `2. Run \`${devCommand2}\` to start development`,
14290
14484
  `3. Run \`${buildCommand}\` to build your project`,
14291
14485
  "",
@@ -14302,7 +14496,7 @@ async function runViteConfig() {
14302
14496
  }
14303
14497
 
14304
14498
  // src/commands/vite/index.ts
14305
- var viteCommand = new Command39("vite").description("Vite plugin management");
14499
+ var viteCommand = new Command40("vite").description("Vite plugin management");
14306
14500
  viteCommand.command("config").description("Add Vite plugin to your project").action(runViteConfig);
14307
14501
 
14308
14502
  // src/index.ts
@@ -14332,6 +14526,7 @@ program.addCommand(typesCommand);
14332
14526
  program.addCommand(viteCommand);
14333
14527
  program.addCommand(projectsCommand);
14334
14528
  program.addCommand(deployCommand);
14529
+ program.addCommand(logsCommand);
14335
14530
  program.addCommand(timebackCommand);
14336
14531
  program.addCommand(debugCommand);
14337
14532
  program.addCommand(updateCommand);
@@ -14350,6 +14545,7 @@ export {
14350
14545
  analyzeChanges,
14351
14546
  applyEngineSelection,
14352
14547
  buildCustomRouteImportStatements,
14548
+ buildLogStreamUrl,
14353
14549
  buildStatusByCourseId,
14354
14550
  bundleBackend,
14355
14551
  bundleSeedWorker,
@@ -14360,6 +14556,7 @@ export {
14360
14556
  collectFiles,
14361
14557
  compareIntegrationKeys,
14362
14558
  confirmDeploymentPlan,
14559
+ connectToLogStream,
14363
14560
  createClient,
14364
14561
  createProjectDirectory,
14365
14562
  createSeedWorkerEntry,
@@ -14377,6 +14574,7 @@ export {
14377
14574
  displayDomainValidationRecords,
14378
14575
  displayIntegrationDetails,
14379
14576
  displayIntegrationList,
14577
+ displayLogEntry,
14380
14578
  displayMissingCourseRequirementsAndExit,
14381
14579
  displayResourcesStatus,
14382
14580
  displaySeedLogs,