@sendly/cli 3.0.2 → 3.1.0
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/commands/credits/history.js +4 -4
- package/dist/commands/keys/create.js +3 -3
- package/dist/commands/keys/revoke.js +13 -10
- package/dist/commands/send.d.ts +13 -0
- package/dist/commands/send.js +75 -0
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.js +112 -0
- package/dist/commands/webhooks/create.d.ts +1 -0
- package/dist/commands/webhooks/create.js +20 -5
- package/dist/commands/webhooks/deliveries.js +17 -15
- package/dist/commands/webhooks/get.js +23 -15
- package/dist/commands/webhooks/list.js +21 -6
- package/dist/commands/webhooks/rotate-secret.js +6 -6
- package/dist/commands/webhooks/test.js +17 -14
- package/dist/commands/webhooks/update.js +16 -11
- package/dist/commands/whoami.js +14 -10
- package/dist/hooks/command-not-found.d.ts +3 -0
- package/dist/hooks/command-not-found.js +142 -0
- package/oclif.manifest.json +116 -1
- package/package.json +4 -1
package/dist/commands/whoami.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseCommand } from "../lib/base-command.js";
|
|
2
2
|
import { getAuthInfo } from "../lib/auth.js";
|
|
3
3
|
import { success, info, keyValue, colors, json } from "../lib/output.js";
|
|
4
|
-
import { getConfigPath } from "../lib/config.js";
|
|
4
|
+
import { getConfigValue, getConfigPath } from "../lib/config.js";
|
|
5
5
|
export default class Whoami extends BaseCommand {
|
|
6
6
|
static description = "Show current authentication status";
|
|
7
7
|
static examples = ["<%= config.bin %> whoami"];
|
|
@@ -30,22 +30,26 @@ export default class Whoami extends BaseCommand {
|
|
|
30
30
|
}
|
|
31
31
|
success("Authenticated");
|
|
32
32
|
console.log();
|
|
33
|
-
const displayData = {
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const displayData = {};
|
|
34
|
+
// Show API mode (test vs live) - this determines if messages are actually sent
|
|
35
|
+
const mode = authInfo.keyType || authInfo.environment;
|
|
36
|
+
displayData["API Mode"] =
|
|
37
|
+
mode === "test"
|
|
38
|
+
? colors.warning("test") + colors.dim(" (sandbox - no real messages)")
|
|
39
|
+
: colors.success("live") + colors.dim(" (production)");
|
|
36
40
|
if (authInfo.email) {
|
|
37
41
|
displayData["Email"] = authInfo.email;
|
|
38
42
|
}
|
|
39
|
-
if (authInfo.keyType) {
|
|
40
|
-
displayData["Key Type"] = authInfo.keyType === "test"
|
|
41
|
-
? colors.warning("test")
|
|
42
|
-
: colors.success("live");
|
|
43
|
-
}
|
|
44
43
|
if (authInfo.userId) {
|
|
45
44
|
displayData["User ID"] = colors.dim(authInfo.userId);
|
|
46
45
|
}
|
|
46
|
+
// Show which server we're connected to
|
|
47
|
+
const baseUrl = getConfigValue("baseUrl");
|
|
48
|
+
if (baseUrl && baseUrl !== "https://sendly.live") {
|
|
49
|
+
displayData["Server"] = colors.dim(baseUrl);
|
|
50
|
+
}
|
|
47
51
|
displayData["Config"] = colors.dim(getConfigPath());
|
|
48
52
|
keyValue(displayData);
|
|
49
53
|
}
|
|
50
54
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hvYW1pLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3dob2FtaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxXQUFXO0lBQzdDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsb0NBQW9DLENBQUM7SUFFMUQsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFFL0MsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsV0FBVyxDQUFDLFNBQVM7S0FDekIsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDO1FBRXJDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDO2dCQUNILGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYTtnQkFDckMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO2dCQUNyQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQ3ZCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztnQkFDakMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO2dCQUN6QixVQUFVLEVBQUUsYUFBYSxFQUFFO2FBQzVCLENBQUMsQ0FBQztZQUNILE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDcEUsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWQsTUFBTSxXQUFXLEdBQTJCLEVBQUUsQ0FBQztRQUUvQywrRUFBK0U7UUFDL0UsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3RELFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDckIsSUFBSSxLQUFLLE1BQU07Z0JBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQztnQkFDdEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUzRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCx1Q0FBdUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxJQUFJLE9BQU8sS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pELFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRXBELFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvbW1hbmQgfSBmcm9tIFwiLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgZ2V0QXV0aEluZm8gfSBmcm9tIFwiLi4vbGliL2F1dGguanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGluZm8sIGtleVZhbHVlLCBjb2xvcnMsIGpzb24gfSBmcm9tIFwiLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnVmFsdWUsIGdldENvbmZpZ1BhdGggfSBmcm9tIFwiLi4vbGliL2NvbmZpZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaG9hbWkgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiU2hvdyBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHN0YXR1c1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcIjwlPSBjb25maWcuYmluICU+IHdob2FtaVwiXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQmFzZUNvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFdob2FtaSk7XG5cbiAgICBjb25zdCBhdXRoSW5mbyA9IGF3YWl0IGdldEF1dGhJbmZvKCk7XG5cbiAgICBpZiAoZmxhZ3MuanNvbikge1xuICAgICAganNvbih7XG4gICAgICAgIGF1dGhlbnRpY2F0ZWQ6IGF1dGhJbmZvLmF1dGhlbnRpY2F0ZWQsXG4gICAgICAgIGVtYWlsOiBhdXRoSW5mby5lbWFpbCxcbiAgICAgICAgdXNlcklkOiBhdXRoSW5mby51c2VySWQsXG4gICAgICAgIGVudmlyb25tZW50OiBhdXRoSW5mby5lbnZpcm9ubWVudCxcbiAgICAgICAga2V5VHlwZTogYXV0aEluZm8ua2V5VHlwZSxcbiAgICAgICAgY29uZmlnUGF0aDogZ2V0Q29uZmlnUGF0aCgpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhdXRoSW5mby5hdXRoZW50aWNhdGVkKSB7XG4gICAgICBpbmZvKFwiTm90IGxvZ2dlZCBpblwiKTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhgICBSdW4gJHtjb2xvcnMuY29kZShcInNlbmRseSBsb2dpblwiKX0gdG8gYXV0aGVudGljYXRlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIkF1dGhlbnRpY2F0ZWRcIik7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGNvbnN0IGRpc3BsYXlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAvLyBTaG93IEFQSSBtb2RlICh0ZXN0IHZzIGxpdmUpIC0gdGhpcyBkZXRlcm1pbmVzIGlmIG1lc3NhZ2VzIGFyZSBhY3R1YWxseSBzZW50XG4gICAgY29uc3QgbW9kZSA9IGF1dGhJbmZvLmtleVR5cGUgfHwgYXV0aEluZm8uZW52aXJvbm1lbnQ7XG4gICAgZGlzcGxheURhdGFbXCJBUEkgTW9kZVwiXSA9XG4gICAgICBtb2RlID09PSBcInRlc3RcIlxuICAgICAgICA/IGNvbG9ycy53YXJuaW5nKFwidGVzdFwiKSArIGNvbG9ycy5kaW0oXCIgKHNhbmRib3ggLSBubyByZWFsIG1lc3NhZ2VzKVwiKVxuICAgICAgICA6IGNvbG9ycy5zdWNjZXNzKFwibGl2ZVwiKSArIGNvbG9ycy5kaW0oXCIgKHByb2R1Y3Rpb24pXCIpO1xuXG4gICAgaWYgKGF1dGhJbmZvLmVtYWlsKSB7XG4gICAgICBkaXNwbGF5RGF0YVtcIkVtYWlsXCJdID0gYXV0aEluZm8uZW1haWw7XG4gICAgfVxuXG4gICAgaWYgKGF1dGhJbmZvLnVzZXJJZCkge1xuICAgICAgZGlzcGxheURhdGFbXCJVc2VyIElEXCJdID0gY29sb3JzLmRpbShhdXRoSW5mby51c2VySWQpO1xuICAgIH1cblxuICAgIC8vIFNob3cgd2hpY2ggc2VydmVyIHdlJ3JlIGNvbm5lY3RlZCB0b1xuICAgIGNvbnN0IGJhc2VVcmwgPSBnZXRDb25maWdWYWx1ZShcImJhc2VVcmxcIik7XG4gICAgaWYgKGJhc2VVcmwgJiYgYmFzZVVybCAhPT0gXCJodHRwczovL3NlbmRseS5saXZlXCIpIHtcbiAgICAgIGRpc3BsYXlEYXRhW1wiU2VydmVyXCJdID0gY29sb3JzLmRpbShiYXNlVXJsKTtcbiAgICB9XG5cbiAgICBkaXNwbGF5RGF0YVtcIkNvbmZpZ1wiXSA9IGNvbG9ycy5kaW0oZ2V0Q29uZmlnUGF0aCgpKTtcblxuICAgIGtleVZhbHVlKGRpc3BsYXlEYXRhKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { colors } from "../lib/output.js";
|
|
2
|
+
// Known commands for suggestions
|
|
3
|
+
const KNOWN_COMMANDS = [
|
|
4
|
+
"send",
|
|
5
|
+
"status",
|
|
6
|
+
"login",
|
|
7
|
+
"logout",
|
|
8
|
+
"whoami",
|
|
9
|
+
"doctor",
|
|
10
|
+
"onboarding",
|
|
11
|
+
"help",
|
|
12
|
+
"sms send",
|
|
13
|
+
"sms list",
|
|
14
|
+
"sms get",
|
|
15
|
+
"sms batch",
|
|
16
|
+
"sms schedule",
|
|
17
|
+
"sms scheduled",
|
|
18
|
+
"sms cancel",
|
|
19
|
+
"credits balance",
|
|
20
|
+
"credits history",
|
|
21
|
+
"keys list",
|
|
22
|
+
"keys create",
|
|
23
|
+
"keys revoke",
|
|
24
|
+
"webhooks list",
|
|
25
|
+
"webhooks create",
|
|
26
|
+
"webhooks delete",
|
|
27
|
+
"webhooks test",
|
|
28
|
+
"webhooks listen",
|
|
29
|
+
"webhooks deliveries",
|
|
30
|
+
"webhooks rotate-secret",
|
|
31
|
+
"logs tail",
|
|
32
|
+
"config get",
|
|
33
|
+
"config set",
|
|
34
|
+
"config reset",
|
|
35
|
+
];
|
|
36
|
+
// Common typos and their corrections
|
|
37
|
+
const TYPO_MAP = {
|
|
38
|
+
"text": "send",
|
|
39
|
+
"txt": "send",
|
|
40
|
+
"msg": "send",
|
|
41
|
+
"message": "sms send",
|
|
42
|
+
"messages": "sms list",
|
|
43
|
+
"balance": "credits balance",
|
|
44
|
+
"credit": "credits balance",
|
|
45
|
+
"key": "keys list",
|
|
46
|
+
"apikey": "keys list",
|
|
47
|
+
"apikeys": "keys list",
|
|
48
|
+
"webhook": "webhooks list",
|
|
49
|
+
"hook": "webhooks list",
|
|
50
|
+
"hooks": "webhooks list",
|
|
51
|
+
"log": "logs tail",
|
|
52
|
+
"tail": "logs tail",
|
|
53
|
+
"auth": "login",
|
|
54
|
+
"signin": "login",
|
|
55
|
+
"signout": "logout",
|
|
56
|
+
"me": "whoami",
|
|
57
|
+
"info": "status",
|
|
58
|
+
"dashboard": "status",
|
|
59
|
+
"account": "status",
|
|
60
|
+
"check": "doctor",
|
|
61
|
+
"test": "doctor",
|
|
62
|
+
"setup": "onboarding",
|
|
63
|
+
"init": "onboarding",
|
|
64
|
+
"start": "onboarding",
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Calculate Levenshtein distance between two strings
|
|
68
|
+
*/
|
|
69
|
+
function levenshteinDistance(a, b) {
|
|
70
|
+
const matrix = [];
|
|
71
|
+
for (let i = 0; i <= b.length; i++) {
|
|
72
|
+
matrix[i] = [i];
|
|
73
|
+
}
|
|
74
|
+
for (let j = 0; j <= a.length; j++) {
|
|
75
|
+
matrix[0][j] = j;
|
|
76
|
+
}
|
|
77
|
+
for (let i = 1; i <= b.length; i++) {
|
|
78
|
+
for (let j = 1; j <= a.length; j++) {
|
|
79
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
80
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return matrix[b.length][a.length];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Find similar commands based on Levenshtein distance
|
|
91
|
+
*/
|
|
92
|
+
function findSimilarCommands(input, maxDistance = 3) {
|
|
93
|
+
const inputLower = input.toLowerCase();
|
|
94
|
+
const suggestions = [];
|
|
95
|
+
for (const command of KNOWN_COMMANDS) {
|
|
96
|
+
const distance = levenshteinDistance(inputLower, command.toLowerCase());
|
|
97
|
+
if (distance <= maxDistance) {
|
|
98
|
+
suggestions.push({ command, distance });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Sort by distance and return top 3
|
|
102
|
+
return suggestions
|
|
103
|
+
.sort((a, b) => a.distance - b.distance)
|
|
104
|
+
.slice(0, 3)
|
|
105
|
+
.map((s) => s.command);
|
|
106
|
+
}
|
|
107
|
+
const hook = async function (options) {
|
|
108
|
+
const { id } = options;
|
|
109
|
+
const inputCommand = id;
|
|
110
|
+
console.log();
|
|
111
|
+
console.log(colors.error(`Command not found: ${colors.code(inputCommand)}`));
|
|
112
|
+
console.log();
|
|
113
|
+
// Check for known typos first
|
|
114
|
+
const typoFix = TYPO_MAP[inputCommand.toLowerCase()];
|
|
115
|
+
if (typoFix) {
|
|
116
|
+
console.log(colors.dim("Did you mean?"));
|
|
117
|
+
console.log(` ${colors.code(`sendly ${typoFix}`)}`);
|
|
118
|
+
console.log();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Find similar commands
|
|
122
|
+
const similar = findSimilarCommands(inputCommand);
|
|
123
|
+
if (similar.length > 0) {
|
|
124
|
+
console.log(colors.dim("Did you mean?"));
|
|
125
|
+
similar.forEach((cmd) => {
|
|
126
|
+
console.log(` ${colors.code(`sendly ${cmd}`)}`);
|
|
127
|
+
});
|
|
128
|
+
console.log();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// Default help
|
|
132
|
+
console.log(colors.dim("Available topics:"));
|
|
133
|
+
console.log(` ${colors.code("sendly sms")} Send and manage SMS messages`);
|
|
134
|
+
console.log(` ${colors.code("sendly credits")} Check credit balance`);
|
|
135
|
+
console.log(` ${colors.code("sendly keys")} Manage API keys`);
|
|
136
|
+
console.log(` ${colors.code("sendly webhooks")} Manage webhooks`);
|
|
137
|
+
console.log();
|
|
138
|
+
console.log(`Run ${colors.code("sendly --help")} for all commands.`);
|
|
139
|
+
console.log();
|
|
140
|
+
};
|
|
141
|
+
export default hook;
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1ub3QtZm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvY29tbWFuZC1ub3QtZm91bmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFDLGlDQUFpQztBQUNqQyxNQUFNLGNBQWMsR0FBRztJQUNyQixNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixZQUFZO0lBQ1osTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxjQUFjO0lBQ2QsZUFBZTtJQUNmLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLFdBQVc7SUFDWCxhQUFhO0lBQ2IsYUFBYTtJQUNiLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLHdCQUF3QjtJQUN4QixXQUFXO0lBQ1gsWUFBWTtJQUNaLFlBQVk7SUFDWixjQUFjO0NBQ2YsQ0FBQztBQUVGLHFDQUFxQztBQUNyQyxNQUFNLFFBQVEsR0FBMkI7SUFDdkMsTUFBTSxFQUFFLE1BQU07SUFDZCxLQUFLLEVBQUUsTUFBTTtJQUNiLEtBQUssRUFBRSxNQUFNO0lBQ2IsU0FBUyxFQUFFLFVBQVU7SUFDckIsVUFBVSxFQUFFLFVBQVU7SUFDdEIsU0FBUyxFQUFFLGlCQUFpQjtJQUM1QixRQUFRLEVBQUUsaUJBQWlCO0lBQzNCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxlQUFlO0lBQzFCLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLE1BQU0sRUFBRSxXQUFX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cnQgeyBjb2xvcnMgfSBmcm9tIFwiLi4vbGliL291dHB1dC5qc1wiO1xuXG4vLyBLbm93biBjb21tYW5kcyBmb3Igc3VnZ2VzdGlvbnNcbmNvbnN0IEtOT1dOX0NPTU1BTkRTID0gW1xuICBcInNlbmRcIixcbiAgXCJzdGF0dXNcIixcbiAgXCJsb2dpblwiLFxuICBcImxvZ291dFwiLFxuICBcIndob2FtaVwiLFxuICBcImRvY3RvclwiLFxuICBcIm9uYm9hcmRpbmdcIixcbiAgXCJoZWxwXCIsXG4gIFwic21zIHNlbmRcIixcbiAgXCJzbXMgbGlzdFwiLFxuICBcInNtcyBnZXRcIixcbiAgXCJzbXMgYmF0Y2hcIixcbiAgXCJzbXMgc2NoZWR1bGVcIixcbiAgXCJzbXMgc2NoZWR1bGVkXCIsXG4gIFwic21zIGNhbmNlbFwiLFxuICBcImNyZWRpdHMgYmFsYW5jZVwiLFxuICBcImNyZWRpdHMgaGlzdG9yeVwiLFxuICBcImtleXMgbGlzdFwiLFxuICBcImtleXMgY3JlYXRlXCIsXG4gIFwia2V5cyByZXZva2VcIixcbiAgXCJ3ZWJob29rcyBsaXN0XCIsXG4gIFwid2ViaG9va3MgY3JlYXRlXCIsXG4gIFwid2ViaG9va3MgZGVsZXRlXCIsXG4gIFwid2ViaG9va3MgdGVzdFwiLFxuICBcIndlYmhvb2tzIGxpc3RlblwiLFxuICBcIndlYmhvb2tzIGRlbGl2ZXJpZXNcIixcbiAgXCJ3ZWJob29rcyByb3RhdGUtc2VjcmV0XCIsXG4gIFwibG9ncyB0YWlsXCIsXG4gIFwiY29uZmlnIGdldFwiLFxuICBcImNvbmZpZyBzZXRcIixcbiAgXCJjb25maWcgcmVzZXRcIixcbl07XG5cbi8vIENvbW1vbiB0eXBvcyBhbmQgdGhlaXIgY29ycmVjdGlvbnNcbmNvbnN0IFRZUE9fTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBcInRleHRcIjogXCJzZW5kXCIsXG4gIFwidHh0XCI6IFwic2VuZFwiLFxuICBcIm1zZ1wiOiBcInNlbmRcIixcbiAgXCJtZXNzYWdlXCI6IFwic21zIHNlbmRcIixcbiAgXCJtZXNzYWdlc1wiOiBcInNtcyBsaXN0XCIsXG4gIFwiYmFsYW5jZVwiOiBcImNyZWRpdHMgYmFsYW5jZVwiLFxuICBcImNyZWRpdFwiOiBcImNyZWRpdHMgYmFsYW5jZVwiLFxuICBcImtleVwiOiBcImtleXMgbGlzdFwiLFxuICBcImFwaWtleVwiOiBcImtleXMgbGlzdFwiLFxuICBcImFwaWtleXNcIjogXCJrZXlzIGxpc3RcIixcbiAgXCJ3ZWJob29rXCI6IFwid2ViaG9va3MgbGlzdFwiLFxuICBcImhvb2tcIjogXCJ3ZWJob29rcyBsaXN0XCIsXG4gIFwiaG9va3NcIjogXCJ3ZWJob29rcyBsaXN0XCIsXG4gIFwibG9nXCI6IFwibG9ncyB0YWlsXCIsXG4gIFwidGFpbFwiOiBcImxvZ3MgdGFpbFwiLFxuICBcImF1dGhcIjogXCJsb2dpblwiLFxuICBcInNpZ25pblwiOiBcImxvZ2luXCIsXG4gIFwic2lnbm91dFwiOiBcImxvZ291dFwiLFxuICBcIm1lXCI6IFwid2hvYW1pXCIsXG4gIFwiaW5mb1wiOiBcInN0YXR1c1wiLFxuICBcImRhc2hib2FyZFwiOiBcInN0YXR1c1wiLFxuICBcImFjY291bnRcIjogXCJzdGF0dXNcIixcbiAgXCJjaGVja1wiOiBcImRvY3RvclwiLFxuICBcInRlc3RcIjogXCJkb2N0b3JcIixcbiAgXCJzZXR1cFwiOiBcIm9uYm9hcmRpbmdcIixcbiAgXCJpbml0XCI6IFwib25ib2FyZGluZ1wiLFxuICBcInN0YXJ0XCI6IFwib25ib2FyZGluZ1wiLFxufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gc3RyaW5nc1xuICovXG5mdW5jdGlvbiBsZXZlbnNodGVpbkRpc3RhbmNlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgbWF0cml4OiBudW1iZXJbXVtdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gYi5sZW5ndGg7IGkrKykge1xuICAgIG1hdHJpeFtpXSA9IFtpXTtcbiAgfVxuXG4gIGZvciAobGV0IGogPSAwOyBqIDw9IGEubGVuZ3RoOyBqKyspIHtcbiAgICBtYXRyaXhbMF1bal0gPSBqO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYi5sZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGEubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChiLmNoYXJBdChpIC0gMSkgPT09IGEuY2hhckF0KGogLSAxKSkge1xuICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaSAtIDFdW2ogLSAxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdHJpeFtpXVtqXSA9IE1hdGgubWluKFxuICAgICAgICAgIG1hdHJpeFtpIC0gMV1baiAtIDFdICsgMSxcbiAgICAgICAgICBtYXRyaXhbaV1baiAtIDFdICsgMSxcbiAgICAgICAgICBtYXRyaXhbaSAtIDFdW2pdICsgMSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0cml4W2IubGVuZ3RoXVthLmxlbmd0aF07XG59XG5cbi8qKlxuICogRmluZCBzaW1pbGFyIGNvbW1hbmRzIGJhc2VkIG9uIExldmVuc2h0ZWluIGRpc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGZpbmRTaW1pbGFyQ29tbWFuZHMoaW5wdXQ6IHN0cmluZywgbWF4RGlzdGFuY2UgPSAzKTogc3RyaW5nW10ge1xuICBjb25zdCBpbnB1dExvd2VyID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgc3VnZ2VzdGlvbnM6IEFycmF5PHsgY29tbWFuZDogc3RyaW5nOyBkaXN0YW5jZTogbnVtYmVyIH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBjb21tYW5kIG9mIEtOT1dOX0NPTU1BTkRTKSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBsZXZlbnNodGVpbkRpc3RhbmNlKGlucHV0TG93ZXIsIGNvbW1hbmQudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKGRpc3RhbmNlIDw9IG1heERpc3RhbmNlKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKHsgY29tbWFuZCwgZGlzdGFuY2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU29ydCBieSBkaXN0YW5jZSBhbmQgcmV0dXJuIHRvcCAzXG4gIHJldHVybiBzdWdnZXN0aW9uc1xuICAgIC5zb3J0KChhLCBiKSA9PiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZSlcbiAgICAuc2xpY2UoMCwgMylcbiAgICAubWFwKChzKSA9PiBzLmNvbW1hbmQpO1xufVxuXG5jb25zdCBob29rOiBIb29rPFwiY29tbWFuZF9ub3RfZm91bmRcIj4gPSBhc3luYyBmdW5jdGlvbiAob3B0aW9ucykge1xuICBjb25zdCB7IGlkIH0gPSBvcHRpb25zO1xuICBjb25zdCBpbnB1dENvbW1hbmQgPSBpZDtcblxuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuZXJyb3IoYENvbW1hbmQgbm90IGZvdW5kOiAke2NvbG9ycy5jb2RlKGlucHV0Q29tbWFuZCl9YCkpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIENoZWNrIGZvciBrbm93biB0eXBvcyBmaXJzdFxuICBjb25zdCB0eXBvRml4ID0gVFlQT19NQVBbaW5wdXRDb21tYW5kLnRvTG93ZXJDYXNlKCldO1xuICBpZiAodHlwb0ZpeCkge1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJEaWQgeW91IG1lYW4/XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICAke2NvbG9ycy5jb2RlKGBzZW5kbHkgJHt0eXBvRml4fWApfWApO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRmluZCBzaW1pbGFyIGNvbW1hbmRzXG4gIGNvbnN0IHNpbWlsYXIgPSBmaW5kU2ltaWxhckNvbW1hbmRzKGlucHV0Q29tbWFuZCk7XG4gIGlmIChzaW1pbGFyLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiRGlkIHlvdSBtZWFuP1wiKSk7XG4gICAgc2ltaWxhci5mb3JFYWNoKChjbWQpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Y29sb3JzLmNvZGUoYHNlbmRseSAke2NtZH1gKX1gKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmF1bHQgaGVscFxuICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiQXZhaWxhYmxlIHRvcGljczpcIikpO1xuICBjb25zb2xlLmxvZyhgICAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHNtc1wiKX0gICAgICAgIFNlbmQgYW5kIG1hbmFnZSBTTVMgbWVzc2FnZXNgKTtcbiAgY29uc29sZS5sb2coYCAgJHtjb2xvcnMuY29kZShcInNlbmRseSBjcmVkaXRzXCIpfSAgICBDaGVjayBjcmVkaXQgYmFsYW5jZWApO1xuICBjb25zb2xlLmxvZyhgICAke2NvbG9ycy5jb2RlKFwic2VuZGx5IGtleXNcIil9ICAgICAgIE1hbmFnZSBBUEkga2V5c2ApO1xuICBjb25zb2xlLmxvZyhgICAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdlYmhvb2tzXCIpfSAgIE1hbmFnZSB3ZWJob29rc2ApO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhgUnVuICR7Y29sb3JzLmNvZGUoXCJzZW5kbHkgLS1oZWxwXCIpfSBmb3IgYWxsIGNvbW1hbmRzLmApO1xuICBjb25zb2xlLmxvZygpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaG9vaztcbiJdfQ==
|
package/oclif.manifest.json
CHANGED
|
@@ -152,6 +152,107 @@
|
|
|
152
152
|
"onboarding.js"
|
|
153
153
|
]
|
|
154
154
|
},
|
|
155
|
+
"send": {
|
|
156
|
+
"aliases": [],
|
|
157
|
+
"args": {},
|
|
158
|
+
"description": "Send an SMS message (shortcut for 'sms send')",
|
|
159
|
+
"examples": [
|
|
160
|
+
"<%= config.bin %> send --to \"+1234567890\" --text \"Hello!\"",
|
|
161
|
+
"<%= config.bin %> send -t \"+1234567890\" -m \"Meeting at 3pm\"",
|
|
162
|
+
"<%= config.bin %> send --to \"+1234567890\" --text \"Hello!\" --json"
|
|
163
|
+
],
|
|
164
|
+
"flags": {
|
|
165
|
+
"json": {
|
|
166
|
+
"description": "Output in JSON format",
|
|
167
|
+
"name": "json",
|
|
168
|
+
"allowNo": false,
|
|
169
|
+
"type": "boolean"
|
|
170
|
+
},
|
|
171
|
+
"quiet": {
|
|
172
|
+
"char": "q",
|
|
173
|
+
"description": "Minimal output",
|
|
174
|
+
"name": "quiet",
|
|
175
|
+
"allowNo": false,
|
|
176
|
+
"type": "boolean"
|
|
177
|
+
},
|
|
178
|
+
"to": {
|
|
179
|
+
"char": "t",
|
|
180
|
+
"description": "Recipient phone number (E.164 format)",
|
|
181
|
+
"name": "to",
|
|
182
|
+
"required": true,
|
|
183
|
+
"hasDynamicHelp": false,
|
|
184
|
+
"multiple": false,
|
|
185
|
+
"type": "option"
|
|
186
|
+
},
|
|
187
|
+
"text": {
|
|
188
|
+
"char": "m",
|
|
189
|
+
"description": "Message text",
|
|
190
|
+
"name": "text",
|
|
191
|
+
"required": true,
|
|
192
|
+
"hasDynamicHelp": false,
|
|
193
|
+
"multiple": false,
|
|
194
|
+
"type": "option"
|
|
195
|
+
},
|
|
196
|
+
"from": {
|
|
197
|
+
"char": "f",
|
|
198
|
+
"description": "Sender phone number (optional, uses default if not set)",
|
|
199
|
+
"name": "from",
|
|
200
|
+
"hasDynamicHelp": false,
|
|
201
|
+
"multiple": false,
|
|
202
|
+
"type": "option"
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
"hasDynamicHelp": false,
|
|
206
|
+
"hiddenAliases": [],
|
|
207
|
+
"id": "send",
|
|
208
|
+
"pluginAlias": "@sendly/cli",
|
|
209
|
+
"pluginName": "@sendly/cli",
|
|
210
|
+
"pluginType": "core",
|
|
211
|
+
"strict": true,
|
|
212
|
+
"isESM": true,
|
|
213
|
+
"relativePath": [
|
|
214
|
+
"dist",
|
|
215
|
+
"commands",
|
|
216
|
+
"send.js"
|
|
217
|
+
]
|
|
218
|
+
},
|
|
219
|
+
"status": {
|
|
220
|
+
"aliases": [],
|
|
221
|
+
"args": {},
|
|
222
|
+
"description": "Show account status dashboard with credits, usage, and health",
|
|
223
|
+
"examples": [
|
|
224
|
+
"<%= config.bin %> status",
|
|
225
|
+
"<%= config.bin %> status --json"
|
|
226
|
+
],
|
|
227
|
+
"flags": {
|
|
228
|
+
"json": {
|
|
229
|
+
"description": "Output in JSON format",
|
|
230
|
+
"name": "json",
|
|
231
|
+
"allowNo": false,
|
|
232
|
+
"type": "boolean"
|
|
233
|
+
},
|
|
234
|
+
"quiet": {
|
|
235
|
+
"char": "q",
|
|
236
|
+
"description": "Minimal output",
|
|
237
|
+
"name": "quiet",
|
|
238
|
+
"allowNo": false,
|
|
239
|
+
"type": "boolean"
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
"hasDynamicHelp": false,
|
|
243
|
+
"hiddenAliases": [],
|
|
244
|
+
"id": "status",
|
|
245
|
+
"pluginAlias": "@sendly/cli",
|
|
246
|
+
"pluginName": "@sendly/cli",
|
|
247
|
+
"pluginType": "core",
|
|
248
|
+
"strict": true,
|
|
249
|
+
"isESM": true,
|
|
250
|
+
"relativePath": [
|
|
251
|
+
"dist",
|
|
252
|
+
"commands",
|
|
253
|
+
"status.js"
|
|
254
|
+
]
|
|
255
|
+
},
|
|
155
256
|
"whoami": {
|
|
156
257
|
"aliases": [],
|
|
157
258
|
"args": {},
|
|
@@ -1111,6 +1212,20 @@
|
|
|
1111
1212
|
"hasDynamicHelp": false,
|
|
1112
1213
|
"multiple": false,
|
|
1113
1214
|
"type": "option"
|
|
1215
|
+
},
|
|
1216
|
+
"mode": {
|
|
1217
|
+
"char": "m",
|
|
1218
|
+
"description": "Event mode filter: all (default), test (sandbox only), live (production only)",
|
|
1219
|
+
"name": "mode",
|
|
1220
|
+
"default": "all",
|
|
1221
|
+
"hasDynamicHelp": false,
|
|
1222
|
+
"multiple": false,
|
|
1223
|
+
"options": [
|
|
1224
|
+
"all",
|
|
1225
|
+
"test",
|
|
1226
|
+
"live"
|
|
1227
|
+
],
|
|
1228
|
+
"type": "option"
|
|
1114
1229
|
}
|
|
1115
1230
|
},
|
|
1116
1231
|
"hasDynamicHelp": false,
|
|
@@ -1563,5 +1678,5 @@
|
|
|
1563
1678
|
]
|
|
1564
1679
|
}
|
|
1565
1680
|
},
|
|
1566
|
-
"version": "3.0
|
|
1681
|
+
"version": "3.1.0"
|
|
1567
1682
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sendly/cli",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Sendly CLI - Send SMS from your terminal",
|
|
6
6
|
"author": "Sendly <support@sendly.live>",
|
|
@@ -30,6 +30,9 @@
|
|
|
30
30
|
"bin": "sendly",
|
|
31
31
|
"dirname": "sendly",
|
|
32
32
|
"commands": "./dist/commands",
|
|
33
|
+
"hooks": {
|
|
34
|
+
"command_not_found": "./dist/hooks/command-not-found"
|
|
35
|
+
},
|
|
33
36
|
"plugins": [
|
|
34
37
|
"@oclif/plugin-help",
|
|
35
38
|
"@oclif/plugin-plugins"
|