@sendly/cli 3.0.2 → 3.0.3

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.
@@ -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==
@@ -152,12 +152,14 @@
152
152
  "onboarding.js"
153
153
  ]
154
154
  },
155
- "whoami": {
155
+ "send": {
156
156
  "aliases": [],
157
157
  "args": {},
158
- "description": "Show current authentication status",
158
+ "description": "Send an SMS message (shortcut for 'sms send')",
159
159
  "examples": [
160
- "<%= config.bin %> whoami"
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"
161
163
  ],
162
164
  "flags": {
163
165
  "json": {
@@ -172,42 +174,55 @@
172
174
  "name": "quiet",
173
175
  "allowNo": false,
174
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"
175
203
  }
176
204
  },
177
205
  "hasDynamicHelp": false,
178
206
  "hiddenAliases": [],
179
- "id": "whoami",
207
+ "id": "send",
180
208
  "pluginAlias": "@sendly/cli",
181
209
  "pluginName": "@sendly/cli",
182
210
  "pluginType": "core",
183
211
  "strict": true,
184
- "enableJsonFlag": false,
185
212
  "isESM": true,
186
213
  "relativePath": [
187
214
  "dist",
188
215
  "commands",
189
- "whoami.js"
216
+ "send.js"
190
217
  ]
191
218
  },
192
- "config:get": {
219
+ "status": {
193
220
  "aliases": [],
194
- "args": {
195
- "key": {
196
- "description": "Configuration key",
197
- "name": "key",
198
- "options": [
199
- "environment",
200
- "baseUrl",
201
- "defaultFormat",
202
- "colorEnabled"
203
- ],
204
- "required": true
205
- }
206
- },
207
- "description": "Get a configuration value",
221
+ "args": {},
222
+ "description": "Show account status dashboard with credits, usage, and health",
208
223
  "examples": [
209
- "<%= config.bin %> config get environment",
210
- "<%= config.bin %> config get baseUrl"
224
+ "<%= config.bin %> status",
225
+ "<%= config.bin %> status --json"
211
226
  ],
212
227
  "flags": {
213
228
  "json": {
@@ -226,27 +241,24 @@
226
241
  },
227
242
  "hasDynamicHelp": false,
228
243
  "hiddenAliases": [],
229
- "id": "config:get",
244
+ "id": "status",
230
245
  "pluginAlias": "@sendly/cli",
231
246
  "pluginName": "@sendly/cli",
232
247
  "pluginType": "core",
233
248
  "strict": true,
234
- "enableJsonFlag": false,
235
249
  "isESM": true,
236
250
  "relativePath": [
237
251
  "dist",
238
252
  "commands",
239
- "config",
240
- "get.js"
253
+ "status.js"
241
254
  ]
242
255
  },
243
- "config:list": {
256
+ "whoami": {
244
257
  "aliases": [],
245
258
  "args": {},
246
- "description": "List all configuration values",
259
+ "description": "Show current authentication status",
247
260
  "examples": [
248
- "<%= config.bin %> config list",
249
- "<%= config.bin %> config list --json"
261
+ "<%= config.bin %> whoami"
250
262
  ],
251
263
  "flags": {
252
264
  "json": {
@@ -265,7 +277,7 @@
265
277
  },
266
278
  "hasDynamicHelp": false,
267
279
  "hiddenAliases": [],
268
- "id": "config:list",
280
+ "id": "whoami",
269
281
  "pluginAlias": "@sendly/cli",
270
282
  "pluginName": "@sendly/cli",
271
283
  "pluginType": "core",
@@ -275,11 +287,10 @@
275
287
  "relativePath": [
276
288
  "dist",
277
289
  "commands",
278
- "config",
279
- "list.js"
290
+ "whoami.js"
280
291
  ]
281
292
  },
282
- "config:set": {
293
+ "config:get": {
283
294
  "aliases": [],
284
295
  "args": {
285
296
  "key": {
@@ -292,18 +303,12 @@
292
303
  "colorEnabled"
293
304
  ],
294
305
  "required": true
295
- },
296
- "value": {
297
- "description": "Configuration value",
298
- "name": "value",
299
- "required": true
300
306
  }
301
307
  },
302
- "description": "Set a configuration value",
308
+ "description": "Get a configuration value",
303
309
  "examples": [
304
- "<%= config.bin %> config set environment live",
305
- "<%= config.bin %> config set defaultFormat json",
306
- "<%= config.bin %> config set baseUrl https://api.sendly.live"
310
+ "<%= config.bin %> config get environment",
311
+ "<%= config.bin %> config get baseUrl"
307
312
  ],
308
313
  "flags": {
309
314
  "json": {
@@ -322,7 +327,7 @@
322
327
  },
323
328
  "hasDynamicHelp": false,
324
329
  "hiddenAliases": [],
325
- "id": "config:set",
330
+ "id": "config:get",
326
331
  "pluginAlias": "@sendly/cli",
327
332
  "pluginName": "@sendly/cli",
328
333
  "pluginType": "core",
@@ -333,16 +338,16 @@
333
338
  "dist",
334
339
  "commands",
335
340
  "config",
336
- "set.js"
341
+ "get.js"
337
342
  ]
338
343
  },
339
- "credits:balance": {
344
+ "config:list": {
340
345
  "aliases": [],
341
346
  "args": {},
342
- "description": "Check your credit balance",
347
+ "description": "List all configuration values",
343
348
  "examples": [
344
- "<%= config.bin %> credits balance",
345
- "<%= config.bin %> credits balance --json"
349
+ "<%= config.bin %> config list",
350
+ "<%= config.bin %> config list --json"
346
351
  ],
347
352
  "flags": {
348
353
  "json": {
@@ -361,27 +366,45 @@
361
366
  },
362
367
  "hasDynamicHelp": false,
363
368
  "hiddenAliases": [],
364
- "id": "credits:balance",
369
+ "id": "config:list",
365
370
  "pluginAlias": "@sendly/cli",
366
371
  "pluginName": "@sendly/cli",
367
372
  "pluginType": "core",
368
373
  "strict": true,
374
+ "enableJsonFlag": false,
369
375
  "isESM": true,
370
376
  "relativePath": [
371
377
  "dist",
372
378
  "commands",
373
- "credits",
374
- "balance.js"
379
+ "config",
380
+ "list.js"
375
381
  ]
376
382
  },
377
- "credits:history": {
383
+ "config:set": {
378
384
  "aliases": [],
379
- "args": {},
380
- "description": "View credit transaction history",
385
+ "args": {
386
+ "key": {
387
+ "description": "Configuration key",
388
+ "name": "key",
389
+ "options": [
390
+ "environment",
391
+ "baseUrl",
392
+ "defaultFormat",
393
+ "colorEnabled"
394
+ ],
395
+ "required": true
396
+ },
397
+ "value": {
398
+ "description": "Configuration value",
399
+ "name": "value",
400
+ "required": true
401
+ }
402
+ },
403
+ "description": "Set a configuration value",
381
404
  "examples": [
382
- "<%= config.bin %> credits history",
383
- "<%= config.bin %> credits history --limit 10",
384
- "<%= config.bin %> credits history --json"
405
+ "<%= config.bin %> config set environment live",
406
+ "<%= config.bin %> config set defaultFormat json",
407
+ "<%= config.bin %> config set baseUrl https://api.sendly.live"
385
408
  ],
386
409
  "flags": {
387
410
  "json": {
@@ -396,30 +419,22 @@
396
419
  "name": "quiet",
397
420
  "allowNo": false,
398
421
  "type": "boolean"
399
- },
400
- "limit": {
401
- "char": "l",
402
- "description": "Number of transactions to show",
403
- "name": "limit",
404
- "default": 20,
405
- "hasDynamicHelp": false,
406
- "multiple": false,
407
- "type": "option"
408
422
  }
409
423
  },
410
424
  "hasDynamicHelp": false,
411
425
  "hiddenAliases": [],
412
- "id": "credits:history",
426
+ "id": "config:set",
413
427
  "pluginAlias": "@sendly/cli",
414
428
  "pluginName": "@sendly/cli",
415
429
  "pluginType": "core",
416
430
  "strict": true,
431
+ "enableJsonFlag": false,
417
432
  "isESM": true,
418
433
  "relativePath": [
419
434
  "dist",
420
435
  "commands",
421
- "credits",
422
- "history.js"
436
+ "config",
437
+ "set.js"
423
438
  ]
424
439
  },
425
440
  "keys:create": {
@@ -581,6 +596,92 @@
581
596
  "revoke.js"
582
597
  ]
583
598
  },
599
+ "credits:balance": {
600
+ "aliases": [],
601
+ "args": {},
602
+ "description": "Check your credit balance",
603
+ "examples": [
604
+ "<%= config.bin %> credits balance",
605
+ "<%= config.bin %> credits balance --json"
606
+ ],
607
+ "flags": {
608
+ "json": {
609
+ "description": "Output in JSON format",
610
+ "name": "json",
611
+ "allowNo": false,
612
+ "type": "boolean"
613
+ },
614
+ "quiet": {
615
+ "char": "q",
616
+ "description": "Minimal output",
617
+ "name": "quiet",
618
+ "allowNo": false,
619
+ "type": "boolean"
620
+ }
621
+ },
622
+ "hasDynamicHelp": false,
623
+ "hiddenAliases": [],
624
+ "id": "credits:balance",
625
+ "pluginAlias": "@sendly/cli",
626
+ "pluginName": "@sendly/cli",
627
+ "pluginType": "core",
628
+ "strict": true,
629
+ "isESM": true,
630
+ "relativePath": [
631
+ "dist",
632
+ "commands",
633
+ "credits",
634
+ "balance.js"
635
+ ]
636
+ },
637
+ "credits:history": {
638
+ "aliases": [],
639
+ "args": {},
640
+ "description": "View credit transaction history",
641
+ "examples": [
642
+ "<%= config.bin %> credits history",
643
+ "<%= config.bin %> credits history --limit 10",
644
+ "<%= config.bin %> credits history --json"
645
+ ],
646
+ "flags": {
647
+ "json": {
648
+ "description": "Output in JSON format",
649
+ "name": "json",
650
+ "allowNo": false,
651
+ "type": "boolean"
652
+ },
653
+ "quiet": {
654
+ "char": "q",
655
+ "description": "Minimal output",
656
+ "name": "quiet",
657
+ "allowNo": false,
658
+ "type": "boolean"
659
+ },
660
+ "limit": {
661
+ "char": "l",
662
+ "description": "Number of transactions to show",
663
+ "name": "limit",
664
+ "default": 20,
665
+ "hasDynamicHelp": false,
666
+ "multiple": false,
667
+ "type": "option"
668
+ }
669
+ },
670
+ "hasDynamicHelp": false,
671
+ "hiddenAliases": [],
672
+ "id": "credits:history",
673
+ "pluginAlias": "@sendly/cli",
674
+ "pluginName": "@sendly/cli",
675
+ "pluginType": "core",
676
+ "strict": true,
677
+ "isESM": true,
678
+ "relativePath": [
679
+ "dist",
680
+ "commands",
681
+ "credits",
682
+ "history.js"
683
+ ]
684
+ },
584
685
  "logs:tail": {
585
686
  "aliases": [],
586
687
  "args": {},
@@ -1563,5 +1664,5 @@
1563
1664
  ]
1564
1665
  }
1565
1666
  },
1566
- "version": "3.0.2"
1667
+ "version": "3.0.3"
1567
1668
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendly/cli",
3
- "version": "3.0.2",
3
+ "version": "3.0.3",
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"