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.
- package/CHANGELOG.md +125 -0
- package/README.md +304 -3
- package/dist/cli.js +99 -13
- package/dist/cli.js.map +1 -1
- package/dist/commands/alias.d.ts +30 -0
- package/dist/commands/alias.d.ts.map +1 -0
- package/dist/commands/alias.js +213 -0
- package/dist/commands/alias.js.map +1 -0
- package/dist/commands/completion.d.ts +17 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +363 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/edit.d.ts +2 -1
- package/dist/commands/edit.d.ts.map +1 -1
- package/dist/commands/edit.js +44 -1
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/export.d.ts +7 -3
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +23 -10
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/list.d.ts +4 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +14 -71
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/recent.d.ts +24 -0
- package/dist/commands/recent.d.ts.map +1 -0
- package/dist/commands/recent.js +132 -0
- package/dist/commands/recent.js.map +1 -0
- package/dist/commands/run.d.ts +6 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +123 -11
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/save.d.ts +2 -1
- package/dist/commands/save.d.ts.map +1 -1
- package/dist/commands/save.js +44 -1
- package/dist/commands/save.js.map +1 -1
- package/dist/commands/validate.d.ts +10 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +162 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/utils/constants.d.ts +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/formatters.d.ts +30 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +188 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/llm-generator.d.ts.map +1 -1
- package/dist/utils/llm-generator.js +489 -27
- package/dist/utils/llm-generator.js.map +1 -1
- package/dist/utils/onboarding.d.ts.map +1 -1
- package/dist/utils/onboarding.js +57 -3
- package/dist/utils/onboarding.js.map +1 -1
- package/dist/utils/recent.d.ts +55 -0
- package/dist/utils/recent.d.ts.map +1 -0
- package/dist/utils/recent.js +102 -0
- package/dist/utils/recent.js.map +1 -0
- package/dist/utils/validator.d.ts +56 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +413 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +1 -1
- 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":"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"}
|
package/package.json
CHANGED
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
|
}
|