aliasmate 1.0.0 → 1.3.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 (77) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/README.md +188 -3
  3. package/dist/cli.js +66 -15
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/delete.d.ts +12 -0
  6. package/dist/commands/delete.d.ts.map +1 -1
  7. package/dist/commands/delete.js +29 -8
  8. package/dist/commands/delete.js.map +1 -1
  9. package/dist/commands/edit.d.ts +13 -0
  10. package/dist/commands/edit.d.ts.map +1 -1
  11. package/dist/commands/edit.js +72 -26
  12. package/dist/commands/edit.js.map +1 -1
  13. package/dist/commands/export.d.ts +17 -0
  14. package/dist/commands/export.d.ts.map +1 -1
  15. package/dist/commands/export.js +42 -7
  16. package/dist/commands/export.js.map +1 -1
  17. package/dist/commands/import.d.ts +21 -0
  18. package/dist/commands/import.d.ts.map +1 -1
  19. package/dist/commands/import.js +93 -48
  20. package/dist/commands/import.js.map +1 -1
  21. package/dist/commands/list.d.ts +20 -0
  22. package/dist/commands/list.d.ts.map +1 -1
  23. package/dist/commands/list.js +83 -6
  24. package/dist/commands/list.js.map +1 -1
  25. package/dist/commands/prev.d.ts +14 -1
  26. package/dist/commands/prev.d.ts.map +1 -1
  27. package/dist/commands/prev.js +43 -14
  28. package/dist/commands/prev.js.map +1 -1
  29. package/dist/commands/run.d.ts +16 -1
  30. package/dist/commands/run.d.ts.map +1 -1
  31. package/dist/commands/run.js +52 -11
  32. package/dist/commands/run.js.map +1 -1
  33. package/dist/commands/save.d.ts +15 -1
  34. package/dist/commands/save.d.ts.map +1 -1
  35. package/dist/commands/save.js +82 -35
  36. package/dist/commands/save.js.map +1 -1
  37. package/dist/commands/search.d.ts +19 -0
  38. package/dist/commands/search.d.ts.map +1 -0
  39. package/dist/commands/search.js +113 -0
  40. package/dist/commands/search.js.map +1 -0
  41. package/dist/storage/index.d.ts +44 -8
  42. package/dist/storage/index.d.ts.map +1 -1
  43. package/dist/storage/index.js +58 -12
  44. package/dist/storage/index.js.map +1 -1
  45. package/dist/utils/constants.d.ts +48 -0
  46. package/dist/utils/constants.d.ts.map +1 -0
  47. package/dist/utils/constants.js +51 -0
  48. package/dist/utils/constants.js.map +1 -0
  49. package/dist/utils/errors.d.ts +30 -0
  50. package/dist/utils/errors.d.ts.map +1 -0
  51. package/dist/utils/errors.js +62 -0
  52. package/dist/utils/errors.js.map +1 -0
  53. package/dist/utils/executor.d.ts +22 -1
  54. package/dist/utils/executor.d.ts.map +1 -1
  55. package/dist/utils/executor.js +36 -11
  56. package/dist/utils/executor.js.map +1 -1
  57. package/dist/utils/history.d.ts +21 -3
  58. package/dist/utils/history.d.ts.map +1 -1
  59. package/dist/utils/history.js +28 -14
  60. package/dist/utils/history.js.map +1 -1
  61. package/dist/utils/llm-generator.d.ts +21 -0
  62. package/dist/utils/llm-generator.d.ts.map +1 -0
  63. package/dist/utils/llm-generator.js +337 -0
  64. package/dist/utils/llm-generator.js.map +1 -0
  65. package/dist/utils/onboarding.d.ts +10 -0
  66. package/dist/utils/onboarding.d.ts.map +1 -0
  67. package/dist/utils/onboarding.js +201 -0
  68. package/dist/utils/onboarding.js.map +1 -0
  69. package/dist/utils/paths.d.ts +39 -1
  70. package/dist/utils/paths.d.ts.map +1 -1
  71. package/dist/utils/paths.js +56 -1
  72. package/dist/utils/paths.js.map +1 -1
  73. package/dist/utils/prompts.d.ts +56 -0
  74. package/dist/utils/prompts.d.ts.map +1 -0
  75. package/dist/utils/prompts.js +51 -0
  76. package/dist/utils/prompts.js.map +1 -0
  77. package/package.json +22 -6
@@ -0,0 +1,201 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.checkAndShowOnboarding = checkAndShowOnboarding;
40
+ exports.hasCompletedOnboarding = hasCompletedOnboarding;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const storage_1 = require("../storage");
45
+ const constants_1 = require("./constants");
46
+ const ONBOARDING_FILE = 'onboarding.json';
47
+ /**
48
+ * Get the path to the onboarding state file
49
+ */
50
+ function getOnboardingPath() {
51
+ return path.join((0, storage_1.getConfigDir)(), ONBOARDING_FILE);
52
+ }
53
+ /**
54
+ * Load onboarding state from disk
55
+ */
56
+ function loadOnboardingState() {
57
+ const onboardingPath = getOnboardingPath();
58
+ if (!fs.existsSync(onboardingPath)) {
59
+ return null;
60
+ }
61
+ try {
62
+ const data = fs.readFileSync(onboardingPath, 'utf8');
63
+ return JSON.parse(data);
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * Save onboarding state to disk
71
+ */
72
+ function saveOnboardingState(state) {
73
+ const onboardingPath = getOnboardingPath();
74
+ try {
75
+ fs.writeFileSync(onboardingPath, JSON.stringify(state, null, 2), 'utf8');
76
+ }
77
+ catch (error) {
78
+ // Silently fail - onboarding is not critical
79
+ }
80
+ }
81
+ /**
82
+ * Display the welcome message for first-time users
83
+ */
84
+ function showWelcomeMessage() {
85
+ console.log();
86
+ console.log(chalk_1.default.bold.cyan('🎉 Welcome to AliasMate! 🎉'));
87
+ console.log();
88
+ console.log(chalk_1.default.white('Thanks for installing AliasMate - your terminal productivity companion!'));
89
+ console.log();
90
+ console.log(chalk_1.default.bold.green('Why AliasMate?'));
91
+ console.log(chalk_1.default.gray(' • Save complex commands with one simple command'));
92
+ console.log(chalk_1.default.gray(' • Never lose track of useful commands again'));
93
+ console.log(chalk_1.default.gray(' • Execute commands in their correct directories automatically'));
94
+ console.log(chalk_1.default.gray(' • Share your workflows with your team'));
95
+ console.log();
96
+ }
97
+ /**
98
+ * Display a quick tour of the main features
99
+ */
100
+ function showQuickTour() {
101
+ console.log(chalk_1.default.bold.yellow('⚡ Quick Tour - How It Works:'));
102
+ console.log();
103
+ console.log(chalk_1.default.bold('1️⃣ Save Commands'));
104
+ console.log(chalk_1.default.gray(' After running any command, save it:'));
105
+ console.log(chalk_1.default.cyan(' $ npm run build'));
106
+ console.log(chalk_1.default.cyan(' $ aliasmate prev build'));
107
+ console.log(chalk_1.default.gray(' ✓ Saves the command with its working directory'));
108
+ console.log();
109
+ console.log(chalk_1.default.bold('2️⃣ Run Anywhere'));
110
+ console.log(chalk_1.default.gray(' Execute saved commands from any location:'));
111
+ console.log(chalk_1.default.cyan(' $ aliasmate run build'));
112
+ console.log(chalk_1.default.gray(' ✓ Runs in the correct directory automatically'));
113
+ console.log();
114
+ console.log(chalk_1.default.bold('3️⃣ Manage Easily'));
115
+ console.log(chalk_1.default.cyan(' $ aliasmate list ') + chalk_1.default.gray('# View all saved commands'));
116
+ console.log(chalk_1.default.cyan(' $ aliasmate search test ') + chalk_1.default.gray('# Find specific commands'));
117
+ console.log(chalk_1.default.cyan(' $ aliasmate edit build ') + chalk_1.default.gray('# Modify saved commands'));
118
+ console.log();
119
+ console.log(chalk_1.default.bold('4️⃣ Share & Backup'));
120
+ console.log(chalk_1.default.cyan(' $ aliasmate export my-commands.json'));
121
+ console.log(chalk_1.default.cyan(' $ aliasmate import my-commands.json'));
122
+ console.log(chalk_1.default.gray(' ✓ Share workflows with your team'));
123
+ console.log();
124
+ console.log(chalk_1.default.bold('5️⃣ LLM Integration'));
125
+ console.log(chalk_1.default.gray(' A default "llm" command has been created for you:'));
126
+ console.log(chalk_1.default.cyan(' $ aliasmate run llm'));
127
+ console.log(chalk_1.default.gray(' ✓ Generates llm.txt with all AliasMate features'));
128
+ console.log(chalk_1.default.gray(' ✓ Share this file with AI assistants for better help'));
129
+ console.log();
130
+ }
131
+ /**
132
+ * Display upgrade message when version changes
133
+ */
134
+ function showUpgradeMessage(oldVersion, newVersion) {
135
+ console.log();
136
+ console.log(chalk_1.default.bold.green(`🎊 AliasMate upgraded from v${oldVersion} to v${newVersion}!`));
137
+ console.log();
138
+ console.log(chalk_1.default.white("What's new:"));
139
+ console.log(chalk_1.default.gray(' • Path mode option: Choose between saved directory or current directory'));
140
+ console.log(chalk_1.default.gray(' • Default "llm" command for LLM integration'));
141
+ console.log(chalk_1.default.gray(' • Enhanced onboarding experience'));
142
+ console.log();
143
+ console.log(chalk_1.default.yellow('Run') + chalk_1.default.cyan(' aliasmate list ') + chalk_1.default.yellow('to see your commands'));
144
+ console.log();
145
+ }
146
+ /**
147
+ * Display helpful tips after onboarding
148
+ */
149
+ function showHelpfulTips() {
150
+ console.log(chalk_1.default.bold.magenta('💡 Pro Tips:'));
151
+ console.log(chalk_1.default.gray(' • Use') + chalk_1.default.cyan(' aliasmate save ') + chalk_1.default.gray('for interactive command creation'));
152
+ console.log(chalk_1.default.gray(' • Combine with') + chalk_1.default.cyan(' aliasmate run <name> . ') + chalk_1.default.gray('to run in current directory'));
153
+ console.log(chalk_1.default.gray(' • Export commands to backup or share with teammates'));
154
+ console.log();
155
+ console.log(chalk_1.default.gray('Need help? Run') + chalk_1.default.cyan(' aliasmate --help'));
156
+ console.log();
157
+ console.log(chalk_1.default.bold.green('Happy commanding! 🚀'));
158
+ console.log();
159
+ }
160
+ /**
161
+ * Check if this is a first install or upgrade, and show appropriate onboarding
162
+ * @returns true if onboarding was shown, false otherwise
163
+ */
164
+ function checkAndShowOnboarding() {
165
+ const state = loadOnboardingState();
166
+ const currentVersion = constants_1.APP_VERSION;
167
+ // First install
168
+ if (!state) {
169
+ showWelcomeMessage();
170
+ showQuickTour();
171
+ showHelpfulTips();
172
+ const newState = {
173
+ version: currentVersion,
174
+ lastShownVersion: currentVersion,
175
+ hasSeenWelcome: true,
176
+ installDate: new Date().toISOString(),
177
+ };
178
+ saveOnboardingState(newState);
179
+ return true;
180
+ }
181
+ // Version upgrade
182
+ if (state.version !== currentVersion) {
183
+ showUpgradeMessage(state.version, currentVersion);
184
+ const updatedState = {
185
+ ...state,
186
+ version: currentVersion,
187
+ lastShownVersion: currentVersion,
188
+ };
189
+ saveOnboardingState(updatedState);
190
+ return true;
191
+ }
192
+ return false;
193
+ }
194
+ /**
195
+ * Check if user has completed onboarding
196
+ */
197
+ function hasCompletedOnboarding() {
198
+ const state = loadOnboardingState();
199
+ return state !== null && state.hasSeenWelcome;
200
+ }
201
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/utils/onboarding.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,44 @@
1
1
  /**
2
2
  * Resolve a path, handling relative paths, absolute paths, and special cases
3
- * Cross-platform path resolution
3
+ * Works cross-platform (Windows, macOS, Linux)
4
+ *
5
+ * @param inputPath - The path to resolve
6
+ * @param basePath - The base path to resolve relative paths against (defaults to cwd)
7
+ * @returns The resolved absolute path
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * resolvePath('.', '/home/user') // => '/home/user'
12
+ * resolvePath('..', '/home/user') // => '/home'
13
+ * resolvePath('/absolute/path') // => '/absolute/path'
14
+ * resolvePath('relative/path', '/base') // => '/base/relative/path'
15
+ * ```
4
16
  */
5
17
  export declare function resolvePath(inputPath: string, basePath?: string): string;
18
+ /**
19
+ * Validate that a directory exists and is accessible
20
+ *
21
+ * @param dirPath - The directory path to validate
22
+ * @returns true if directory exists and is accessible, false otherwise
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * if (isValidDirectory('/home/user/project')) {
27
+ * console.log('Directory is valid');
28
+ * }
29
+ * ```
30
+ */
31
+ export declare function isValidDirectory(dirPath: string): boolean;
32
+ /**
33
+ * Sanitize a command name by removing invalid characters
34
+ *
35
+ * @param name - The command name to sanitize
36
+ * @returns Sanitized command name
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * sanitizeCommandName('my command!') // => 'my-command'
41
+ * ```
42
+ */
43
+ export declare function sanitizeCommandName(name: string): string;
6
44
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAqBvF"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAqBvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD"}
@@ -34,10 +34,25 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.resolvePath = resolvePath;
37
+ exports.isValidDirectory = isValidDirectory;
38
+ exports.sanitizeCommandName = sanitizeCommandName;
37
39
  const path = __importStar(require("path"));
40
+ const fs = __importStar(require("fs"));
38
41
  /**
39
42
  * Resolve a path, handling relative paths, absolute paths, and special cases
40
- * Cross-platform path resolution
43
+ * Works cross-platform (Windows, macOS, Linux)
44
+ *
45
+ * @param inputPath - The path to resolve
46
+ * @param basePath - The base path to resolve relative paths against (defaults to cwd)
47
+ * @returns The resolved absolute path
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * resolvePath('.', '/home/user') // => '/home/user'
52
+ * resolvePath('..', '/home/user') // => '/home'
53
+ * resolvePath('/absolute/path') // => '/absolute/path'
54
+ * resolvePath('relative/path', '/base') // => '/base/relative/path'
55
+ * ```
41
56
  */
42
57
  function resolvePath(inputPath, basePath = process.cwd()) {
43
58
  if (!inputPath) {
@@ -57,4 +72,44 @@ function resolvePath(inputPath, basePath = process.cwd()) {
57
72
  // Resolve relative to base path
58
73
  return path.resolve(basePath, inputPath);
59
74
  }
75
+ /**
76
+ * Validate that a directory exists and is accessible
77
+ *
78
+ * @param dirPath - The directory path to validate
79
+ * @returns true if directory exists and is accessible, false otherwise
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * if (isValidDirectory('/home/user/project')) {
84
+ * console.log('Directory is valid');
85
+ * }
86
+ * ```
87
+ */
88
+ function isValidDirectory(dirPath) {
89
+ try {
90
+ const stats = fs.statSync(dirPath);
91
+ return stats.isDirectory();
92
+ }
93
+ catch (error) {
94
+ return false;
95
+ }
96
+ }
97
+ /**
98
+ * Sanitize a command name by removing invalid characters
99
+ *
100
+ * @param name - The command name to sanitize
101
+ * @returns Sanitized command name
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * sanitizeCommandName('my command!') // => 'my-command'
106
+ * ```
107
+ */
108
+ function sanitizeCommandName(name) {
109
+ return name
110
+ .trim()
111
+ .replace(/[\s]+/g, '-') // Replace spaces with hyphens
112
+ .replace(/[^a-zA-Z0-9_-]/g, '') // Remove invalid characters
113
+ .toLowerCase();
114
+ }
60
115
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,kCAqBC;AA3BD,2CAA6B;AAE7B;;;GAGG;AACH,SAAgB,WAAW,CAAC,SAAiB,EAAE,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC7E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iDAAiD;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,uBAAuB;IACvB,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,gCAAgC;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,kCAqBC;AAeD,4CAOC;AAaD,kDAMC;AAjFD,2CAA6B;AAC7B,uCAAyB;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,WAAW,CAAC,SAAiB,EAAE,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC7E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iDAAiD;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,uBAAuB;IACvB,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,gCAAgC;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI;SACR,IAAI,EAAE;SACN,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACrD,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,4BAA4B;SAC3D,WAAW,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Type-safe prompt utilities to eliminate 'any' types
3
+ */
4
+ export interface TextInputPrompt {
5
+ type: 'input';
6
+ name: string;
7
+ message: string;
8
+ default?: string;
9
+ validate?: (input: string) => boolean | string;
10
+ }
11
+ export interface ConfirmPrompt {
12
+ type: 'confirm';
13
+ name: string;
14
+ message: string;
15
+ default?: boolean;
16
+ }
17
+ export interface ListPrompt {
18
+ type: 'list';
19
+ name: string;
20
+ message: string;
21
+ choices: Array<{
22
+ name: string;
23
+ value: string;
24
+ }>;
25
+ }
26
+ type PromptType = TextInputPrompt | ConfirmPrompt | ListPrompt;
27
+ /**
28
+ * Type-safe wrapper for inquirer text input prompt
29
+ *
30
+ * @param prompt - The prompt configuration
31
+ * @returns Promise resolving to the user's input string
32
+ */
33
+ export declare function promptText(prompt: TextInputPrompt): Promise<string>;
34
+ /**
35
+ * Type-safe wrapper for inquirer confirm prompt
36
+ *
37
+ * @param prompt - The prompt configuration
38
+ * @returns Promise resolving to the user's boolean choice
39
+ */
40
+ export declare function promptConfirm(prompt: ConfirmPrompt): Promise<boolean>;
41
+ /**
42
+ * Type-safe wrapper for inquirer list prompt
43
+ *
44
+ * @param prompt - The prompt configuration
45
+ * @returns Promise resolving to the selected value
46
+ */
47
+ export declare function promptList(prompt: ListPrompt): Promise<string>;
48
+ /**
49
+ * Type-safe wrapper for multiple prompts
50
+ *
51
+ * @param prompts - Array of prompt configurations
52
+ * @returns Promise resolving to an object with all answers
53
+ */
54
+ export declare function promptMultiple<T extends Record<string, unknown>>(prompts: PromptType[]): Promise<T>;
55
+ export {};
56
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,KAAK,UAAU,GAAG,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC;AAE/D;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAGzE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAG3E;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpE;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,OAAO,EAAE,UAAU,EAAE,GACpB,OAAO,CAAC,CAAC,CAAC,CAGZ"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.promptText = promptText;
7
+ exports.promptConfirm = promptConfirm;
8
+ exports.promptList = promptList;
9
+ exports.promptMultiple = promptMultiple;
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ /**
12
+ * Type-safe wrapper for inquirer text input prompt
13
+ *
14
+ * @param prompt - The prompt configuration
15
+ * @returns Promise resolving to the user's input string
16
+ */
17
+ async function promptText(prompt) {
18
+ const result = await inquirer_1.default.prompt([prompt]);
19
+ return result[prompt.name];
20
+ }
21
+ /**
22
+ * Type-safe wrapper for inquirer confirm prompt
23
+ *
24
+ * @param prompt - The prompt configuration
25
+ * @returns Promise resolving to the user's boolean choice
26
+ */
27
+ async function promptConfirm(prompt) {
28
+ const result = await inquirer_1.default.prompt([prompt]);
29
+ return result[prompt.name];
30
+ }
31
+ /**
32
+ * Type-safe wrapper for inquirer list prompt
33
+ *
34
+ * @param prompt - The prompt configuration
35
+ * @returns Promise resolving to the selected value
36
+ */
37
+ async function promptList(prompt) {
38
+ const result = await inquirer_1.default.prompt([prompt]);
39
+ return result[prompt.name];
40
+ }
41
+ /**
42
+ * Type-safe wrapper for multiple prompts
43
+ *
44
+ * @param prompts - Array of prompt configurations
45
+ * @returns Promise resolving to an object with all answers
46
+ */
47
+ async function promptMultiple(prompts) {
48
+ const result = await inquirer_1.default.prompt(prompts);
49
+ return result;
50
+ }
51
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":";;;;;AAoCA,gCAGC;AAQD,sCAGC;AAQD,gCAGC;AAQD,wCAKC;AA1ED,wDAAgC;AA8BhC;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAAC,MAAuB;IACtD,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CAAC,MAAqB;IACvD,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAAC,MAAkB;IACjD,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAClC,OAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAI,OAAyC,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aliasmate",
3
- "version": "1.0.0",
3
+ "version": "1.3.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": {
@@ -10,7 +10,15 @@
10
10
  "build": "tsc",
11
11
  "dev": "tsc --watch",
12
12
  "prepublishOnly": "npm run build",
13
- "test": "echo \"Error: no test specified\" && exit 1"
13
+ "lint": "eslint src/**/*.ts",
14
+ "lint:fix": "eslint src/**/*.ts --fix",
15
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
16
+ "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "jest",
19
+ "test:watch": "jest --watch",
20
+ "test:coverage": "jest --coverage",
21
+ "test:ci": "jest --ci --coverage --maxWorkers=2"
14
22
  },
15
23
  "keywords": [
16
24
  "cli",
@@ -24,7 +32,7 @@
24
32
  "automation",
25
33
  "workflow"
26
34
  ],
27
- "author": "",
35
+ "author": "akhshyganesh",
28
36
  "license": "MIT",
29
37
  "engines": {
30
38
  "node": ">=14.0.0"
@@ -38,14 +46,22 @@
38
46
  },
39
47
  "homepage": "https://github.com/aliasmate/aliasmate#readme",
40
48
  "dependencies": {
49
+ "chalk": "^4.1.2",
41
50
  "commander": "^11.1.0",
42
- "inquirer": "^8.2.6",
43
51
  "execa": "^5.1.1",
44
- "chalk": "^4.1.2"
52
+ "inquirer": "^8.2.6"
45
53
  },
46
54
  "devDependencies": {
47
- "@types/node": "^20.10.0",
55
+ "@jest/globals": "^30.2.0",
48
56
  "@types/inquirer": "^8.2.10",
57
+ "@types/jest": "^30.0.0",
58
+ "@types/node": "^20.10.0",
59
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
60
+ "@typescript-eslint/parser": "^6.13.0",
61
+ "eslint": "^8.55.0",
62
+ "jest": "^30.2.0",
63
+ "prettier": "^3.1.0",
64
+ "ts-jest": "^29.4.6",
49
65
  "typescript": "^5.3.3"
50
66
  },
51
67
  "files": [