@debugbundle/cli 1.0.0 → 1.0.2

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/main.cjs +170 -5
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -17177,11 +17177,129 @@ var ISO_TIMESTAMP_PATTERN = /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z\b/
17177
17177
  var IPV4_PATTERN = /\b(?:\d{1,3}\.){3}\d{1,3}\b/g;
17178
17178
  var HEX_PATTERN = /\b0x[0-9a-f]+\b/gi;
17179
17179
  var BARE_HEX_PATTERN = /\b(?=[0-9a-f]{8,}\b)(?=[0-9a-f]*[a-f])[0-9a-f]+\b/gi;
17180
+ var LONG_ALPHANUMERIC_TOKEN_PATTERN = /\b(?=[A-Za-z0-9_-]{16,}\b)(?=[A-Za-z0-9_-]*[A-Za-z])(?=[A-Za-z0-9_-]*\d)[A-Za-z0-9_-]+\b/g;
17180
17181
  var LARGE_NUMBER_PATTERN = /\b\d{2,}\b/g;
17181
17182
  var DYNAMIC_SEGMENT_PATTERN = /^(?:\d+|[0-9a-f]{8}-[0-9a-f-]{27}|[A-Za-z0-9_-]{24,})$/;
17182
17183
  var FRAME_NOISE_PATTERNS = ["node_modules/", "vendor/", "site-packages/", ".venv/"];
17184
+ var KNOWN_DATABASE_MESSAGE_FAMILIES = [
17185
+ {
17186
+ summary: "PostgreSQL access rejected by pg_hba.conf",
17187
+ when: (message) => looksLikePostgresMessage(message) && message.includes("pg_hba.conf")
17188
+ },
17189
+ {
17190
+ summary: "PostgreSQL authentication failed",
17191
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("password authentication failed") || message.includes("authentication failed for user"))
17192
+ },
17193
+ {
17194
+ summary: "PostgreSQL host resolution failed",
17195
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("could not translate host name") || message.includes("getaddrinfo enotfound"))
17196
+ },
17197
+ {
17198
+ summary: "PostgreSQL connection timed out",
17199
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("connection timed out") || message.includes("timeout expired") || message.includes("etimedout"))
17200
+ },
17201
+ {
17202
+ summary: "PostgreSQL connection limit reached",
17203
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("too many connections") || message.includes("remaining connection slots are reserved"))
17204
+ },
17205
+ {
17206
+ summary: "PostgreSQL database does not exist",
17207
+ when: (message) => looksLikePostgresMessage(message) && message.includes("does not exist")
17208
+ },
17209
+ {
17210
+ summary: "PostgreSQL connection refused",
17211
+ when: (message) => looksLikePostgresMessage(message) && message.includes("connection refused")
17212
+ },
17213
+ {
17214
+ summary: "MySQL authentication failed",
17215
+ when: (message) => looksLikeMySqlMessage(message) && (message.includes("access denied for user") || message.includes("authentication failed"))
17216
+ },
17217
+ {
17218
+ summary: "MySQL connection refused",
17219
+ when: (message) => looksLikeMySqlMessage(message) && (message.includes("connection refused") || message.includes("can't connect to mysql server"))
17220
+ },
17221
+ {
17222
+ summary: "MySQL connection dropped",
17223
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("server has gone away")
17224
+ },
17225
+ {
17226
+ summary: "MySQL connection limit reached",
17227
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("too many connections")
17228
+ },
17229
+ {
17230
+ summary: "MySQL database does not exist",
17231
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("unknown database")
17232
+ },
17233
+ {
17234
+ summary: "MongoDB authentication failed",
17235
+ when: (message) => looksLikeMongoMessage(message) && message.includes("authentication failed")
17236
+ },
17237
+ {
17238
+ summary: "MongoDB host resolution failed",
17239
+ when: (message) => looksLikeMongoMessage(message) && (message.includes("getaddrinfo enotfound") || message.includes("ename not found"))
17240
+ },
17241
+ {
17242
+ summary: "MongoDB connection timed out",
17243
+ when: (message) => looksLikeMongoMessage(message) && (message.includes("connection timed out") || message.includes("etimedout") || message.includes("server selection timed out"))
17244
+ },
17245
+ {
17246
+ summary: "MongoDB connection refused",
17247
+ when: (message) => looksLikeMongoMessage(message) && message.includes("connection refused")
17248
+ },
17249
+ {
17250
+ summary: "Redis authentication failed",
17251
+ when: (message) => looksLikeRedisMessage(message) && message.includes("wrongpass")
17252
+ },
17253
+ {
17254
+ summary: "Redis replica is read-only",
17255
+ when: (message) => looksLikeRedisMessage(message) && message.includes("readonly")
17256
+ },
17257
+ {
17258
+ summary: "Redis host resolution failed",
17259
+ when: (message) => looksLikeRedisMessage(message) && (message.includes("getaddrinfo enotfound") || message.includes("ename not found"))
17260
+ },
17261
+ {
17262
+ summary: "Redis connection timed out",
17263
+ when: (message) => looksLikeRedisMessage(message) && (message.includes("connection timed out") || message.includes("etimedout") || message.includes("timeout"))
17264
+ },
17265
+ {
17266
+ summary: "Redis connection refused",
17267
+ when: (message) => looksLikeRedisMessage(message) && message.includes("connection refused")
17268
+ }
17269
+ ];
17270
+ function looksLikePostgresMessage(message) {
17271
+ return message.includes("postgres") || message.includes("pgsql") || message.includes("pg_hba.conf") || message.includes("connection to server at");
17272
+ }
17273
+ function looksLikeMySqlMessage(message) {
17274
+ return message.includes("mysql") || message.includes("mariadb");
17275
+ }
17276
+ function looksLikeMongoMessage(message) {
17277
+ return message.includes("mongodb") || message.includes("mongoserver") || message.includes("mongo");
17278
+ }
17279
+ function looksLikeRedisMessage(message) {
17280
+ return message.includes("redis");
17281
+ }
17282
+ function normalizeScalarTokens(message) {
17283
+ return message.replace(UUID_PATTERN, "{dynamic}").replace(EMAIL_PATTERN, "{dynamic}").replace(ISO_TIMESTAMP_PATTERN, "{dynamic}").replace(IPV4_PATTERN, "{dynamic}").replace(HEX_PATTERN, "{dynamic}").replace(BARE_HEX_PATTERN, "{dynamic}").replace(LONG_ALPHANUMERIC_TOKEN_PATTERN, "{dynamic}").replace(LARGE_NUMBER_PATTERN, "{dynamic}");
17284
+ }
17285
+ function collapseWhitespace(message) {
17286
+ return message.replace(/\s+/g, " ").trim();
17287
+ }
17288
+ function normalizeKnownDatabaseMessage(message) {
17289
+ const lowerMessage = message.toLowerCase();
17290
+ for (const family of KNOWN_DATABASE_MESSAGE_FAMILIES) {
17291
+ if (family.when(lowerMessage)) {
17292
+ return family.summary;
17293
+ }
17294
+ }
17295
+ return null;
17296
+ }
17183
17297
  function normalizeMessage(message) {
17184
- return message.replace(UUID_PATTERN, "{dynamic}").replace(EMAIL_PATTERN, "{dynamic}").replace(ISO_TIMESTAMP_PATTERN, "{dynamic}").replace(IPV4_PATTERN, "{dynamic}").replace(HEX_PATTERN, "{dynamic}").replace(BARE_HEX_PATTERN, "{dynamic}").replace(LARGE_NUMBER_PATTERN, "{dynamic}");
17298
+ const knownDatabaseMessage = normalizeKnownDatabaseMessage(message);
17299
+ if (knownDatabaseMessage !== null) {
17300
+ return knownDatabaseMessage;
17301
+ }
17302
+ return collapseWhitespace(normalizeScalarTokens(message));
17185
17303
  }
17186
17304
  function normalizeRoute(path) {
17187
17305
  if (path === null || path.length === 0) {
@@ -21577,8 +21695,6 @@ function mapApiErrorToMessage(error) {
21577
21695
  return "GitHub device authorization was rejected.";
21578
21696
  case "github_email_unavailable":
21579
21697
  return "GitHub did not provide a verified primary email address.";
21580
- case "account_signup_disabled":
21581
- return "This DebugBundle workspace does not allow new account signups for this GitHub identity.";
21582
21698
  case "account_suspended":
21583
21699
  return "This DebugBundle account is suspended.";
21584
21700
  case "rate_limited":
@@ -28206,7 +28322,8 @@ var CLI_USAGE_LINES = [
28206
28322
  " debugbundle project members invite --project-id <id> --email <email> --role <admin|member> [--auth-file <path>] [--json]",
28207
28323
  " debugbundle project members cancel-invite <invite-id> --project-id <id> [--auth-file <path>] [--json]",
28208
28324
  " debugbundle project members update-role <user-id> --project-id <id> --role <admin|member> [--auth-file <path>] [--json]",
28209
- " debugbundle project members remove <user-id> --project-id <id> [--auth-file <path>] [--json]"
28325
+ " debugbundle project members remove <user-id> --project-id <id> [--auth-file <path>] [--json]",
28326
+ " debugbundle project members leave --project-id <id> [--auth-file <path>] [--json]"
28210
28327
  ];
28211
28328
  function formatUsage() {
28212
28329
  return CLI_USAGE_LINES.join("\n");
@@ -31266,6 +31383,17 @@ function createMemberApi(httpClient) {
31266
31383
  throw toApiError4(response.status, response.body);
31267
31384
  }
31268
31385
  return response.body;
31386
+ },
31387
+ async leaveProject(input2) {
31388
+ const response = await httpClient.request({
31389
+ method: "DELETE",
31390
+ path: `/v1/projects/${input2.projectId}/membership`,
31391
+ bearerToken: input2.bearerToken
31392
+ });
31393
+ if (response.status !== 200) {
31394
+ throw toApiError4(response.status, response.body);
31395
+ }
31396
+ return response.body;
31269
31397
  }
31270
31398
  };
31271
31399
  }
@@ -31393,6 +31521,20 @@ async function removeMemberCommand(input2, api) {
31393
31521
  };
31394
31522
  }
31395
31523
  }
31524
+ async function leaveProjectCommand(input2, api) {
31525
+ try {
31526
+ const result = await api.leaveProject({ bearerToken: input2.bearerToken, projectId: input2.projectId });
31527
+ return {
31528
+ exitCode: 0,
31529
+ output: input2.json ? JSON.stringify(result) : `Left project: ${input2.projectId}`
31530
+ };
31531
+ } catch (error) {
31532
+ return {
31533
+ exitCode: mapErrorToExitCode15(error),
31534
+ output: error instanceof MemberApiError ? error.code : String(error)
31535
+ };
31536
+ }
31537
+ }
31396
31538
  async function createAuthenticatedMemberApi(input2, dependencies) {
31397
31539
  const readAuth = dependencies?.readAuthState ?? readCliAuthState;
31398
31540
  const authStateInput = {};
@@ -31487,6 +31629,20 @@ async function removeMemberWithAuthCommand(input2, dependencies) {
31487
31629
  )
31488
31630
  });
31489
31631
  }
31632
+ async function leaveProjectWithAuthCommand(input2, dependencies) {
31633
+ return runAuthenticatedCliCommand(input2, {
31634
+ createApi: createAuthenticatedMemberApi,
31635
+ dependencies,
31636
+ runCommand: (authState, api) => leaveProjectCommand(
31637
+ {
31638
+ bearerToken: authState.bearer_token,
31639
+ projectId: input2.projectId,
31640
+ ...input2.json === void 0 ? {} : { json: input2.json }
31641
+ },
31642
+ api
31643
+ )
31644
+ });
31645
+ }
31490
31646
 
31491
31647
  // src/probe-commands.ts
31492
31648
  var ProbeApiError = class extends Error {
@@ -32512,6 +32668,15 @@ async function handleProjectCommand(parsedArgv, dependencies) {
32512
32668
  })
32513
32669
  );
32514
32670
  }
32671
+ if (membersAction === "leave") {
32672
+ expectNoUnknownOptions(parsedArgv, ["auth-file", "json", "project-id"]);
32673
+ ensureNoExtraPositionals(parsedArgv, 3);
32674
+ return await (dependencies.leaveProjectCommand ?? leaveProjectWithAuthCommand)(
32675
+ appendCommonAuthOptions(parsedArgv, {
32676
+ projectId
32677
+ })
32678
+ );
32679
+ }
32515
32680
  throw new CliInputError("Unknown project members command.");
32516
32681
  }
32517
32682
  if (action === "list") {
@@ -33569,7 +33734,7 @@ async function handleCaptureRuleCommand2(parsedArgv, dependencies) {
33569
33734
  // package.json
33570
33735
  var package_default = {
33571
33736
  name: "@debugbundle/cli",
33572
- version: "1.0.0",
33737
+ version: "1.0.2",
33573
33738
  private: false,
33574
33739
  description: "Command-line interface for DebugBundle",
33575
33740
  license: "AGPL-3.0-only",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@debugbundle/cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "private": false,
5
5
  "description": "Command-line interface for DebugBundle",
6
6
  "license": "AGPL-3.0-only",