@debugbundle/cli 1.0.0 → 1.0.1
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/main.cjs +170 -3
- 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
|
-
|
|
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) {
|
|
@@ -28206,7 +28324,8 @@ var CLI_USAGE_LINES = [
|
|
|
28206
28324
|
" debugbundle project members invite --project-id <id> --email <email> --role <admin|member> [--auth-file <path>] [--json]",
|
|
28207
28325
|
" debugbundle project members cancel-invite <invite-id> --project-id <id> [--auth-file <path>] [--json]",
|
|
28208
28326
|
" 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]"
|
|
28327
|
+
" debugbundle project members remove <user-id> --project-id <id> [--auth-file <path>] [--json]",
|
|
28328
|
+
" debugbundle project members leave --project-id <id> [--auth-file <path>] [--json]"
|
|
28210
28329
|
];
|
|
28211
28330
|
function formatUsage() {
|
|
28212
28331
|
return CLI_USAGE_LINES.join("\n");
|
|
@@ -31266,6 +31385,17 @@ function createMemberApi(httpClient) {
|
|
|
31266
31385
|
throw toApiError4(response.status, response.body);
|
|
31267
31386
|
}
|
|
31268
31387
|
return response.body;
|
|
31388
|
+
},
|
|
31389
|
+
async leaveProject(input2) {
|
|
31390
|
+
const response = await httpClient.request({
|
|
31391
|
+
method: "DELETE",
|
|
31392
|
+
path: `/v1/projects/${input2.projectId}/membership`,
|
|
31393
|
+
bearerToken: input2.bearerToken
|
|
31394
|
+
});
|
|
31395
|
+
if (response.status !== 200) {
|
|
31396
|
+
throw toApiError4(response.status, response.body);
|
|
31397
|
+
}
|
|
31398
|
+
return response.body;
|
|
31269
31399
|
}
|
|
31270
31400
|
};
|
|
31271
31401
|
}
|
|
@@ -31393,6 +31523,20 @@ async function removeMemberCommand(input2, api) {
|
|
|
31393
31523
|
};
|
|
31394
31524
|
}
|
|
31395
31525
|
}
|
|
31526
|
+
async function leaveProjectCommand(input2, api) {
|
|
31527
|
+
try {
|
|
31528
|
+
const result = await api.leaveProject({ bearerToken: input2.bearerToken, projectId: input2.projectId });
|
|
31529
|
+
return {
|
|
31530
|
+
exitCode: 0,
|
|
31531
|
+
output: input2.json ? JSON.stringify(result) : `Left project: ${input2.projectId}`
|
|
31532
|
+
};
|
|
31533
|
+
} catch (error) {
|
|
31534
|
+
return {
|
|
31535
|
+
exitCode: mapErrorToExitCode15(error),
|
|
31536
|
+
output: error instanceof MemberApiError ? error.code : String(error)
|
|
31537
|
+
};
|
|
31538
|
+
}
|
|
31539
|
+
}
|
|
31396
31540
|
async function createAuthenticatedMemberApi(input2, dependencies) {
|
|
31397
31541
|
const readAuth = dependencies?.readAuthState ?? readCliAuthState;
|
|
31398
31542
|
const authStateInput = {};
|
|
@@ -31487,6 +31631,20 @@ async function removeMemberWithAuthCommand(input2, dependencies) {
|
|
|
31487
31631
|
)
|
|
31488
31632
|
});
|
|
31489
31633
|
}
|
|
31634
|
+
async function leaveProjectWithAuthCommand(input2, dependencies) {
|
|
31635
|
+
return runAuthenticatedCliCommand(input2, {
|
|
31636
|
+
createApi: createAuthenticatedMemberApi,
|
|
31637
|
+
dependencies,
|
|
31638
|
+
runCommand: (authState, api) => leaveProjectCommand(
|
|
31639
|
+
{
|
|
31640
|
+
bearerToken: authState.bearer_token,
|
|
31641
|
+
projectId: input2.projectId,
|
|
31642
|
+
...input2.json === void 0 ? {} : { json: input2.json }
|
|
31643
|
+
},
|
|
31644
|
+
api
|
|
31645
|
+
)
|
|
31646
|
+
});
|
|
31647
|
+
}
|
|
31490
31648
|
|
|
31491
31649
|
// src/probe-commands.ts
|
|
31492
31650
|
var ProbeApiError = class extends Error {
|
|
@@ -32512,6 +32670,15 @@ async function handleProjectCommand(parsedArgv, dependencies) {
|
|
|
32512
32670
|
})
|
|
32513
32671
|
);
|
|
32514
32672
|
}
|
|
32673
|
+
if (membersAction === "leave") {
|
|
32674
|
+
expectNoUnknownOptions(parsedArgv, ["auth-file", "json", "project-id"]);
|
|
32675
|
+
ensureNoExtraPositionals(parsedArgv, 3);
|
|
32676
|
+
return await (dependencies.leaveProjectCommand ?? leaveProjectWithAuthCommand)(
|
|
32677
|
+
appendCommonAuthOptions(parsedArgv, {
|
|
32678
|
+
projectId
|
|
32679
|
+
})
|
|
32680
|
+
);
|
|
32681
|
+
}
|
|
32515
32682
|
throw new CliInputError("Unknown project members command.");
|
|
32516
32683
|
}
|
|
32517
32684
|
if (action === "list") {
|
|
@@ -33569,7 +33736,7 @@ async function handleCaptureRuleCommand2(parsedArgv, dependencies) {
|
|
|
33569
33736
|
// package.json
|
|
33570
33737
|
var package_default = {
|
|
33571
33738
|
name: "@debugbundle/cli",
|
|
33572
|
-
version: "1.0.
|
|
33739
|
+
version: "1.0.1",
|
|
33573
33740
|
private: false,
|
|
33574
33741
|
description: "Command-line interface for DebugBundle",
|
|
33575
33742
|
license: "AGPL-3.0-only",
|