@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.
- package/dist/main.cjs +170 -5
- 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) {
|
|
@@ -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.
|
|
33737
|
+
version: "1.0.2",
|
|
33573
33738
|
private: false,
|
|
33574
33739
|
description: "Command-line interface for DebugBundle",
|
|
33575
33740
|
license: "AGPL-3.0-only",
|