aliasmate 1.5.1 → 1.6.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.
Files changed (62) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +304 -3
  3. package/dist/cli.js +99 -13
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/alias.d.ts +30 -0
  6. package/dist/commands/alias.d.ts.map +1 -0
  7. package/dist/commands/alias.js +213 -0
  8. package/dist/commands/alias.js.map +1 -0
  9. package/dist/commands/completion.d.ts +17 -0
  10. package/dist/commands/completion.d.ts.map +1 -0
  11. package/dist/commands/completion.js +363 -0
  12. package/dist/commands/completion.js.map +1 -0
  13. package/dist/commands/edit.d.ts +2 -1
  14. package/dist/commands/edit.d.ts.map +1 -1
  15. package/dist/commands/edit.js +44 -1
  16. package/dist/commands/edit.js.map +1 -1
  17. package/dist/commands/export.d.ts +7 -3
  18. package/dist/commands/export.d.ts.map +1 -1
  19. package/dist/commands/export.js +23 -10
  20. package/dist/commands/export.js.map +1 -1
  21. package/dist/commands/list.d.ts +4 -1
  22. package/dist/commands/list.d.ts.map +1 -1
  23. package/dist/commands/list.js +14 -71
  24. package/dist/commands/list.js.map +1 -1
  25. package/dist/commands/recent.d.ts +24 -0
  26. package/dist/commands/recent.d.ts.map +1 -0
  27. package/dist/commands/recent.js +132 -0
  28. package/dist/commands/recent.js.map +1 -0
  29. package/dist/commands/run.d.ts +6 -1
  30. package/dist/commands/run.d.ts.map +1 -1
  31. package/dist/commands/run.js +123 -11
  32. package/dist/commands/run.js.map +1 -1
  33. package/dist/commands/save.d.ts +2 -1
  34. package/dist/commands/save.d.ts.map +1 -1
  35. package/dist/commands/save.js +44 -1
  36. package/dist/commands/save.js.map +1 -1
  37. package/dist/commands/validate.d.ts +10 -0
  38. package/dist/commands/validate.d.ts.map +1 -0
  39. package/dist/commands/validate.js +162 -0
  40. package/dist/commands/validate.js.map +1 -0
  41. package/dist/utils/constants.d.ts +1 -1
  42. package/dist/utils/constants.js +1 -1
  43. package/dist/utils/formatters.d.ts +30 -0
  44. package/dist/utils/formatters.d.ts.map +1 -0
  45. package/dist/utils/formatters.js +188 -0
  46. package/dist/utils/formatters.js.map +1 -0
  47. package/dist/utils/llm-generator.d.ts.map +1 -1
  48. package/dist/utils/llm-generator.js +489 -27
  49. package/dist/utils/llm-generator.js.map +1 -1
  50. package/dist/utils/onboarding.d.ts.map +1 -1
  51. package/dist/utils/onboarding.js +57 -3
  52. package/dist/utils/onboarding.js.map +1 -1
  53. package/dist/utils/recent.d.ts +55 -0
  54. package/dist/utils/recent.d.ts.map +1 -0
  55. package/dist/utils/recent.js +102 -0
  56. package/dist/utils/recent.js.map +1 -0
  57. package/dist/utils/validator.d.ts +56 -0
  58. package/dist/utils/validator.d.ts.map +1 -0
  59. package/dist/utils/validator.js +413 -0
  60. package/dist/utils/validator.js.map +1 -0
  61. package/package.json +1 -1
  62. package/whats-new.json +48 -0
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.validateCommandExists = validateCommandExists;
37
+ exports.validateDirectory = validateDirectory;
38
+ exports.validateShellSyntax = validateShellSyntax;
39
+ exports.validateEnvVars = validateEnvVars;
40
+ exports.validateCommandAlias = validateCommandAlias;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const child_process_1 = require("child_process");
44
+ /**
45
+ * Check if a command exists in PATH
46
+ * @param command - The command string (e.g., "npm run build")
47
+ * @returns Validation result
48
+ */
49
+ function validateCommandExists(command) {
50
+ if (!command || !command.trim()) {
51
+ return {
52
+ valid: false,
53
+ message: 'Command cannot be empty',
54
+ };
55
+ }
56
+ // Extract the first word (the actual command)
57
+ const trimmed = command.trim();
58
+ const firstWord = trimmed.split(/\s+/)[0];
59
+ // Skip validation for shell built-ins and special characters
60
+ const shellBuiltins = [
61
+ 'cd',
62
+ 'echo',
63
+ 'export',
64
+ 'source',
65
+ '.',
66
+ 'eval',
67
+ 'exec',
68
+ 'set',
69
+ 'unset',
70
+ 'alias',
71
+ 'bg',
72
+ 'fg',
73
+ 'jobs',
74
+ 'kill',
75
+ 'pwd',
76
+ 'test',
77
+ '[',
78
+ 'exit',
79
+ 'return',
80
+ ];
81
+ // Check if it starts with special characters (shell operators, pipes, etc.)
82
+ if (/^[|&;<>()]/.test(firstWord)) {
83
+ return {
84
+ valid: true,
85
+ warning: true,
86
+ message: 'Command starts with shell operator - validation skipped',
87
+ };
88
+ }
89
+ // Check if it's a shell builtin
90
+ if (shellBuiltins.includes(firstWord)) {
91
+ return { valid: true };
92
+ }
93
+ // Check if it's a path (contains /)
94
+ if (firstWord.includes('/')) {
95
+ // It's a path - check if the file exists and is executable
96
+ try {
97
+ const stats = fs.statSync(firstWord);
98
+ if (!stats.isFile()) {
99
+ return {
100
+ valid: false,
101
+ message: `Path "${firstWord}" exists but is not a file`,
102
+ };
103
+ }
104
+ // Check if executable (on Unix-like systems)
105
+ if (process.platform !== 'win32') {
106
+ try {
107
+ fs.accessSync(firstWord, fs.constants.X_OK);
108
+ }
109
+ catch {
110
+ return {
111
+ valid: true,
112
+ warning: true,
113
+ message: `File "${firstWord}" exists but may not be executable`,
114
+ };
115
+ }
116
+ }
117
+ return { valid: true };
118
+ }
119
+ catch {
120
+ return {
121
+ valid: false,
122
+ message: `Command file "${firstWord}" not found`,
123
+ };
124
+ }
125
+ }
126
+ // Check if the command exists in PATH
127
+ try {
128
+ if (process.platform === 'win32') {
129
+ (0, child_process_1.execSync)(`where ${firstWord}`, { stdio: 'ignore' });
130
+ }
131
+ else {
132
+ (0, child_process_1.execSync)(`which ${firstWord}`, { stdio: 'ignore' });
133
+ }
134
+ return { valid: true };
135
+ }
136
+ catch {
137
+ return {
138
+ valid: true,
139
+ warning: true,
140
+ message: `Command "${firstWord}" not found in PATH - it may not be installed`,
141
+ };
142
+ }
143
+ }
144
+ /**
145
+ * Validate directory exists and is accessible
146
+ * @param directory - The directory path
147
+ * @returns Validation result
148
+ */
149
+ function validateDirectory(directory) {
150
+ if (!directory || !directory.trim()) {
151
+ return {
152
+ valid: false,
153
+ message: 'Directory cannot be empty',
154
+ };
155
+ }
156
+ const resolvedPath = path.resolve(directory);
157
+ // Check if directory exists
158
+ try {
159
+ const stats = fs.statSync(resolvedPath);
160
+ if (!stats.isDirectory()) {
161
+ return {
162
+ valid: false,
163
+ message: `Path "${directory}" exists but is not a directory`,
164
+ };
165
+ }
166
+ }
167
+ catch {
168
+ return {
169
+ valid: false,
170
+ message: `Directory "${directory}" does not exist`,
171
+ };
172
+ }
173
+ // Check read/write permissions
174
+ try {
175
+ fs.accessSync(resolvedPath, fs.constants.R_OK);
176
+ }
177
+ catch {
178
+ return {
179
+ valid: false,
180
+ message: `Directory "${directory}" is not readable`,
181
+ };
182
+ }
183
+ try {
184
+ fs.accessSync(resolvedPath, fs.constants.W_OK);
185
+ }
186
+ catch {
187
+ return {
188
+ valid: true,
189
+ warning: true,
190
+ message: `Directory "${directory}" is not writable`,
191
+ };
192
+ }
193
+ return { valid: true };
194
+ }
195
+ /**
196
+ * Basic shell syntax validation
197
+ * @param command - The command string
198
+ * @returns Validation result
199
+ */
200
+ function validateShellSyntax(command) {
201
+ if (!command || !command.trim()) {
202
+ return {
203
+ valid: false,
204
+ message: 'Command cannot be empty',
205
+ };
206
+ }
207
+ const trimmed = command.trim();
208
+ // Skip complex validation for commands with heredocs (they have their own syntax rules)
209
+ const hasHeredoc = /<<\s*['"]?[A-Z_]+['"]?/.test(trimmed);
210
+ if (hasHeredoc) {
211
+ // For heredocs, just do basic validation
212
+ return { valid: true };
213
+ }
214
+ // Check for unclosed quotes
215
+ const singleQuotes = (trimmed.match(/'/g) || []).length;
216
+ const doubleQuotes = (trimmed.match(/"/g) || []).length;
217
+ const backticks = (trimmed.match(/`/g) || []).length;
218
+ if (singleQuotes % 2 !== 0) {
219
+ return {
220
+ valid: false,
221
+ message: 'Unclosed single quote in command',
222
+ };
223
+ }
224
+ if (doubleQuotes % 2 !== 0) {
225
+ return {
226
+ valid: false,
227
+ message: 'Unclosed double quote in command',
228
+ };
229
+ }
230
+ if (backticks % 2 !== 0) {
231
+ return {
232
+ valid: false,
233
+ message: 'Unclosed backtick in command',
234
+ };
235
+ }
236
+ // Check for unmatched parentheses
237
+ let parenDepth = 0;
238
+ for (const char of trimmed) {
239
+ if (char === '(')
240
+ parenDepth++;
241
+ if (char === ')')
242
+ parenDepth--;
243
+ if (parenDepth < 0) {
244
+ return {
245
+ valid: false,
246
+ message: 'Unmatched closing parenthesis in command',
247
+ };
248
+ }
249
+ }
250
+ if (parenDepth !== 0) {
251
+ return {
252
+ valid: false,
253
+ message: 'Unmatched opening parenthesis in command',
254
+ };
255
+ }
256
+ // Check for unmatched braces
257
+ let braceDepth = 0;
258
+ for (const char of trimmed) {
259
+ if (char === '{')
260
+ braceDepth++;
261
+ if (char === '}')
262
+ braceDepth--;
263
+ if (braceDepth < 0) {
264
+ return {
265
+ valid: false,
266
+ message: 'Unmatched closing brace in command',
267
+ };
268
+ }
269
+ }
270
+ if (braceDepth !== 0) {
271
+ return {
272
+ valid: false,
273
+ message: 'Unmatched opening brace in command',
274
+ };
275
+ }
276
+ // Check for unmatched brackets
277
+ let bracketDepth = 0;
278
+ for (const char of trimmed) {
279
+ if (char === '[')
280
+ bracketDepth++;
281
+ if (char === ']')
282
+ bracketDepth--;
283
+ if (bracketDepth < 0) {
284
+ return {
285
+ valid: false,
286
+ message: 'Unmatched closing bracket in command',
287
+ };
288
+ }
289
+ }
290
+ if (bracketDepth !== 0) {
291
+ return {
292
+ valid: false,
293
+ message: 'Unmatched opening bracket in command',
294
+ };
295
+ }
296
+ // Check for invalid pipe sequences
297
+ if (/\|\s*\|/.test(trimmed) && !/\|\|/.test(trimmed)) {
298
+ return {
299
+ valid: true,
300
+ warning: true,
301
+ message: 'Suspicious pipe sequence detected',
302
+ };
303
+ }
304
+ // Check for trailing operators that need continuation
305
+ if (/[|&]$/.test(trimmed)) {
306
+ return {
307
+ valid: false,
308
+ message: 'Command ends with pipe or ampersand operator',
309
+ };
310
+ }
311
+ return { valid: true };
312
+ }
313
+ /**
314
+ * Validate environment variable names
315
+ * @param envVars - Object containing environment variables
316
+ * @returns Validation result
317
+ */
318
+ function validateEnvVars(envVars) {
319
+ if (!envVars || Object.keys(envVars).length === 0) {
320
+ return { valid: true };
321
+ }
322
+ const invalidVars = [];
323
+ for (const key of Object.keys(envVars)) {
324
+ // Check if variable name is valid
325
+ // Valid env var names: start with letter or underscore, contain only alphanumeric and underscore
326
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {
327
+ invalidVars.push(key);
328
+ }
329
+ }
330
+ if (invalidVars.length > 0) {
331
+ return {
332
+ valid: false,
333
+ message: `Invalid environment variable names: ${invalidVars.join(', ')}`,
334
+ };
335
+ }
336
+ return { valid: true };
337
+ }
338
+ /**
339
+ * Validate a command alias comprehensively
340
+ * @param command - The command string
341
+ * @param directory - The working directory
342
+ * @param envVars - Optional environment variables
343
+ * @returns Full validation report
344
+ */
345
+ function validateCommandAlias(command, directory, envVars) {
346
+ const issues = [];
347
+ // Validate command syntax
348
+ const syntaxResult = validateShellSyntax(command);
349
+ if (!syntaxResult.valid) {
350
+ issues.push({
351
+ type: 'error',
352
+ field: 'command',
353
+ message: syntaxResult.message || 'Invalid shell syntax',
354
+ });
355
+ }
356
+ else if (syntaxResult.warning && syntaxResult.message) {
357
+ issues.push({
358
+ type: 'warning',
359
+ field: 'command',
360
+ message: syntaxResult.message,
361
+ });
362
+ }
363
+ // Validate command exists
364
+ const commandExistsResult = validateCommandExists(command);
365
+ if (!commandExistsResult.valid) {
366
+ issues.push({
367
+ type: 'error',
368
+ field: 'command',
369
+ message: commandExistsResult.message || 'Command validation failed',
370
+ });
371
+ }
372
+ else if (commandExistsResult.warning && commandExistsResult.message) {
373
+ issues.push({
374
+ type: 'warning',
375
+ field: 'command',
376
+ message: commandExistsResult.message,
377
+ });
378
+ }
379
+ // Validate directory
380
+ const directoryResult = validateDirectory(directory);
381
+ if (!directoryResult.valid) {
382
+ issues.push({
383
+ type: 'error',
384
+ field: 'directory',
385
+ message: directoryResult.message || 'Directory validation failed',
386
+ });
387
+ }
388
+ else if (directoryResult.warning && directoryResult.message) {
389
+ issues.push({
390
+ type: 'warning',
391
+ field: 'directory',
392
+ message: directoryResult.message,
393
+ });
394
+ }
395
+ // Validate environment variables
396
+ if (envVars) {
397
+ const envResult = validateEnvVars(envVars);
398
+ if (!envResult.valid) {
399
+ issues.push({
400
+ type: 'error',
401
+ field: 'environment',
402
+ message: envResult.message || 'Environment variable validation failed',
403
+ });
404
+ }
405
+ }
406
+ // Determine if overall validation passed
407
+ const valid = !issues.some((issue) => issue.type === 'error');
408
+ return {
409
+ valid,
410
+ issues,
411
+ };
412
+ }
413
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,sDAgGC;AAOD,8CA+CC;AAOD,kDAsHC;AAOD,0CAuBC;AASD,oDA0EC;AAvaD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAyC;AA4BzC;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,yBAAyB;SACnC,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,6DAA6D;IAC7D,MAAM,aAAa,GAAG;QACpB,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,GAAG;QACH,MAAM;QACN,MAAM;QACN,KAAK;QACL,OAAO;QACP,OAAO;QACP,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,MAAM;QACN,KAAK;QACL,MAAM;QACN,GAAG;QACH,MAAM;QACN,QAAQ;KACT,CAAC;IAEF,4EAA4E;IAC5E,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,yDAAyD;SACnE,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,oCAAoC;IACpC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,2DAA2D;QAC3D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpB,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,SAAS,SAAS,4BAA4B;iBACxD,CAAC;YACJ,CAAC;YACD,6CAA6C;YAC7C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC9C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;wBACL,KAAK,EAAE,IAAI;wBACX,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,SAAS,SAAS,oCAAoC;qBAChE,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,iBAAiB,SAAS,aAAa;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,IAAA,wBAAQ,EAAC,SAAS,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,IAAA,wBAAQ,EAAC,SAAS,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,YAAY,SAAS,+CAA+C;SAC9E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACpC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,2BAA2B;SACrC,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,SAAS,SAAS,iCAAiC;aAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,cAAc,SAAS,kBAAkB;SACnD,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,cAAc,SAAS,mBAAmB;SACpD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,cAAc,SAAS,mBAAmB;SACpD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,yBAAyB;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,wFAAwF;IACxF,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,UAAU,EAAE,CAAC;QACf,yCAAyC;QACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,4BAA4B;IAC5B,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAErD,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,kCAAkC;SAC5C,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,kCAAkC;SAC5C,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,8BAA8B;SACxC,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,GAAG;YAAE,UAAU,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,GAAG;YAAE,UAAU,EAAE,CAAC;QAC/B,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,0CAA0C;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,0CAA0C;SACpD,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,GAAG;YAAE,UAAU,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,GAAG;YAAE,UAAU,EAAE,CAAC;QAC/B,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,oCAAoC;aAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,oCAAoC;SAC9C,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,GAAG;YAAE,YAAY,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,GAAG;YAAE,YAAY,EAAE,CAAC;QACjC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,sCAAsC;aAChD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,sCAAsC;SAChD,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,OAAO;YACL,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,mCAAmC;SAC7C,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,8CAA8C;SACxD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,OAA+B;IAC7D,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,kCAAkC;QAClC,iGAAiG;QACjG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,uCAAuC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACzE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAClC,OAAe,EACf,SAAiB,EACjB,OAAgC;IAEhC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,0BAA0B;IAC1B,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,sBAAsB;SACxD,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,YAAY,CAAC,OAAO;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,mBAAmB,CAAC,OAAO,IAAI,2BAA2B;SACpE,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,mBAAmB,CAAC,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,mBAAmB,CAAC,OAAO;SACrC,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,MAAM,eAAe,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,eAAe,CAAC,OAAO,IAAI,6BAA6B;SAClE,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,eAAe,CAAC,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,eAAe,CAAC,OAAO;SACjC,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,wCAAwC;aACvE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAE9D,OAAO;QACL,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aliasmate",
3
- "version": "1.5.1",
3
+ "version": "1.6.1",
4
4
  "description": "A CLI utility to save, manage, and re-run shell commands with their working directories",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
package/whats-new.json CHANGED
@@ -150,5 +150,53 @@
150
150
  "Silently recreates llm command with the latest version"
151
151
  ]
152
152
  }
153
+ },
154
+ "1.6.0": {
155
+ "version": "1.6.0",
156
+ "date": "2026-01-22",
157
+ "sections": {
158
+ "added": [
159
+ "Command Aliases: Create short aliases for frequently used commands (aliasmate alias <short> <command>)",
160
+ "Recent Commands: Track and display recently executed commands with timestamps (aliasmate recent)",
161
+ "@N syntax: Quick re-execution of recent commands (aliasmate run @0 for most recent)",
162
+ "Auto-completion Support: Shell completion for bash, zsh, and fish (aliasmate completion <shell>)",
163
+ "Dry Run Mode: Preview commands before execution with --dry-run flag",
164
+ "Command Validation: Verify commands and directories when saving (aliasmate validate <name>)",
165
+ "Output Formatting: Multiple formats for list/export (JSON, YAML, table, compact)",
166
+ "Alias management: List (--list) and remove (--remove) commands for aliases",
167
+ "Execution tracking: Automatic recording of command executions with timestamps",
168
+ "Configurable recent history: Adjustable history size (default: 50 entries)",
169
+ "Dangerous command detection: Warnings for potentially destructive commands in dry-run",
170
+ "Validation bypass: --no-validate flag for save and edit commands",
171
+ "Time-ago formatting: Human-readable timestamps (e.g., '2 minutes ago')",
172
+ "Shell syntax validation: Basic validation for quotes, brackets, and operators",
173
+ "Directory permission checks: Validates read/write/execute permissions",
174
+ "Environment variable validation: Checks for valid variable name patterns"
175
+ ],
176
+ "changed": [
177
+ "Run command now supports alias resolution automatically",
178
+ "Run command enhanced with @N syntax for recent commands",
179
+ "List command supports multiple output formats (--format flag)",
180
+ "Export command supports JSON and YAML formats",
181
+ "Save/Edit commands include optional validation bypass",
182
+ "Metadata storage now includes aliases and execution history"
183
+ ]
184
+ }
185
+ },
186
+ "1.6.1": {
187
+ "version": "1.6.1",
188
+ "date": "2026-01-24",
189
+ "sections": {
190
+ "fixed": [
191
+ "Fixed bug where downgrade scenarios incorrectly showed 'upgraded' message",
192
+ "Version detection now properly distinguishes upgrades from downgrades",
193
+ "Outdated version message now encourages users to upgrade to latest"
194
+ ],
195
+ "changed": [
196
+ "Outdated version message displays available features from newer versions",
197
+ "Added clear upgrade instructions with npm command",
198
+ "Improved user experience with motivational messaging for upgrades"
199
+ ]
200
+ }
153
201
  }
154
202
  }