aliasmate 1.5.0 → 1.6.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.
Files changed (59) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +304 -3
  3. package/dist/cli.js +105 -16
  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/recent.d.ts +55 -0
  51. package/dist/utils/recent.d.ts.map +1 -0
  52. package/dist/utils/recent.js +102 -0
  53. package/dist/utils/recent.js.map +1 -0
  54. package/dist/utils/validator.d.ts +56 -0
  55. package/dist/utils/validator.d.ts.map +1 -0
  56. package/dist/utils/validator.js +413 -0
  57. package/dist/utils/validator.js.map +1 -0
  58. package/package.json +1 -1
  59. package/whats-new.json +42 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent.d.ts","sourceRoot":"","sources":["../../src/utils/recent.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAGtD;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAgBzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB1D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAGhF"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRecentConfig = getRecentConfig;
4
+ exports.setRecentConfig = setRecentConfig;
5
+ exports.getExecutionHistory = getExecutionHistory;
6
+ exports.recordExecution = recordExecution;
7
+ exports.getRecentCommands = getRecentCommands;
8
+ exports.getRecentCommandByIndex = getRecentCommandByIndex;
9
+ exports.clearExecutionHistory = clearExecutionHistory;
10
+ exports.getRecentCommandsWithTimestamps = getRecentCommandsWithTimestamps;
11
+ const storage_1 = require("../storage");
12
+ const RECENT_HISTORY_KEY = 'execution_history';
13
+ const RECENT_CONFIG_KEY = 'recent_config';
14
+ const DEFAULT_MAX_SIZE = 50;
15
+ /**
16
+ * Get the recent commands configuration
17
+ */
18
+ function getRecentConfig() {
19
+ const config = (0, storage_1.getMetadata)(RECENT_CONFIG_KEY);
20
+ return config || { maxSize: DEFAULT_MAX_SIZE };
21
+ }
22
+ /**
23
+ * Set the recent commands configuration
24
+ */
25
+ function setRecentConfig(config) {
26
+ return (0, storage_1.setMetadata)(RECENT_CONFIG_KEY, config);
27
+ }
28
+ /**
29
+ * Get execution history
30
+ */
31
+ function getExecutionHistory() {
32
+ const history = (0, storage_1.getMetadata)(RECENT_HISTORY_KEY);
33
+ return history || [];
34
+ }
35
+ /**
36
+ * Save execution history
37
+ */
38
+ function saveExecutionHistory(history) {
39
+ return (0, storage_1.setMetadata)(RECENT_HISTORY_KEY, history);
40
+ }
41
+ /**
42
+ * Record a command execution
43
+ * @param commandName - The name of the command that was executed
44
+ */
45
+ function recordExecution(commandName) {
46
+ const history = getExecutionHistory();
47
+ const config = getRecentConfig();
48
+ // Add new entry to the beginning
49
+ history.unshift({
50
+ commandName,
51
+ executedAt: new Date().toISOString(),
52
+ });
53
+ // Trim to max size
54
+ if (history.length > config.maxSize) {
55
+ history.splice(config.maxSize);
56
+ }
57
+ saveExecutionHistory(history);
58
+ }
59
+ /**
60
+ * Get recent command names (most recent first, deduplicated)
61
+ * @param limit - Maximum number of entries to return
62
+ * @returns Array of unique command names in order of most recent execution
63
+ */
64
+ function getRecentCommands(limit) {
65
+ const history = getExecutionHistory();
66
+ const seen = new Set();
67
+ const result = [];
68
+ for (const entry of history) {
69
+ if (!seen.has(entry.commandName)) {
70
+ seen.add(entry.commandName);
71
+ result.push(entry.commandName);
72
+ if (limit && result.length >= limit) {
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ /**
80
+ * Get the Nth most recent command (0-indexed)
81
+ * @param index - Index of the command (0 = most recent)
82
+ * @returns Command name if found, undefined otherwise
83
+ */
84
+ function getRecentCommandByIndex(index) {
85
+ const recentCommands = getRecentCommands();
86
+ return recentCommands[index];
87
+ }
88
+ /**
89
+ * Clear execution history
90
+ */
91
+ function clearExecutionHistory() {
92
+ return saveExecutionHistory([]);
93
+ }
94
+ /**
95
+ * Get full execution history with timestamps
96
+ * @param limit - Maximum number of entries to return
97
+ */
98
+ function getRecentCommandsWithTimestamps(limit) {
99
+ const history = getExecutionHistory();
100
+ return limit ? history.slice(0, limit) : history;
101
+ }
102
+ //# sourceMappingURL=recent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent.js","sourceRoot":"","sources":["../../src/utils/recent.ts"],"names":[],"mappings":";;AA2BA,0CAGC;AAKD,0CAEC;AAKD,kDAGC;AAaD,0CAgBC;AAOD,8CAiBC;AAOD,0DAGC;AAKD,sDAEC;AAMD,0EAGC;AA5HD,wCAAsD;AAoBtD,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAC/C,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;GAEG;AACH,SAAgB,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAA,qBAAW,EAAe,iBAAiB,CAAC,CAAC;IAC5D,OAAO,MAAM,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,MAAoB;IAClD,OAAO,IAAA,qBAAW,EAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAmB,kBAAkB,CAAC,CAAC;IAClE,OAAO,OAAO,IAAI,EAAE,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,OAAyB;IACrD,OAAO,IAAA,qBAAW,EAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,WAAmB;IACjD,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,iCAAiC;IACjC,OAAO,CAAC,OAAO,CAAC;QACd,WAAW;QACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC,CAAC;IAEH,mBAAmB;IACnB,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,KAAc;IAC9C,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/B,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;gBACpC,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,KAAa;IACnD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB;IACnC,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,SAAgB,+BAA+B,CAAC,KAAc;IAC5D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACnD,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Validation result for a single check
3
+ */
4
+ export interface ValidationResult {
5
+ valid: boolean;
6
+ message?: string;
7
+ warning?: boolean;
8
+ }
9
+ /**
10
+ * Validation issue details
11
+ */
12
+ export interface ValidationIssue {
13
+ type: 'error' | 'warning';
14
+ field: string;
15
+ message: string;
16
+ }
17
+ /**
18
+ * Full validation report
19
+ */
20
+ export interface ValidationReport {
21
+ valid: boolean;
22
+ issues: ValidationIssue[];
23
+ }
24
+ /**
25
+ * Check if a command exists in PATH
26
+ * @param command - The command string (e.g., "npm run build")
27
+ * @returns Validation result
28
+ */
29
+ export declare function validateCommandExists(command: string): ValidationResult;
30
+ /**
31
+ * Validate directory exists and is accessible
32
+ * @param directory - The directory path
33
+ * @returns Validation result
34
+ */
35
+ export declare function validateDirectory(directory: string): ValidationResult;
36
+ /**
37
+ * Basic shell syntax validation
38
+ * @param command - The command string
39
+ * @returns Validation result
40
+ */
41
+ export declare function validateShellSyntax(command: string): ValidationResult;
42
+ /**
43
+ * Validate environment variable names
44
+ * @param envVars - Object containing environment variables
45
+ * @returns Validation result
46
+ */
47
+ export declare function validateEnvVars(envVars: Record<string, string>): ValidationResult;
48
+ /**
49
+ * Validate a command alias comprehensively
50
+ * @param command - The command string
51
+ * @param directory - The working directory
52
+ * @param envVars - Optional environment variables
53
+ * @returns Full validation report
54
+ */
55
+ export declare function validateCommandAlias(command: string, directory: string, envVars?: Record<string, string>): ValidationReport;
56
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAgGvE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CA+CrE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAsHrE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAuBjF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,gBAAgB,CAsElB"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aliasmate",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
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
@@ -140,5 +140,47 @@
140
140
  "Configuration directory now manages both aliases and metadata separately"
141
141
  ]
142
142
  }
143
+ },
144
+ "1.5.1": {
145
+ "version": "1.5.1",
146
+ "date": "2026-01-14",
147
+ "sections": {
148
+ "fixed": [
149
+ "Fixed a bug where llm.txt is stuck with initial version",
150
+ "Silently recreates llm command with the latest version"
151
+ ]
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
+ }
143
185
  }
144
186
  }