aliasmate 1.6.2 → 2.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 (211) hide show
  1. package/CHANGELOG.md +61 -3
  2. package/README.md +84 -884
  3. package/dist/cli/completion.d.ts +5 -0
  4. package/dist/cli/completion.d.ts.map +1 -0
  5. package/dist/cli/completion.js +144 -0
  6. package/dist/cli/completion.js.map +1 -0
  7. package/dist/cli/manage.d.ts +19 -0
  8. package/dist/cli/manage.d.ts.map +1 -0
  9. package/dist/cli/manage.js +231 -0
  10. package/dist/cli/manage.js.map +1 -0
  11. package/dist/cli/run.d.ts +6 -0
  12. package/dist/cli/run.d.ts.map +1 -0
  13. package/dist/cli/run.js +48 -0
  14. package/dist/cli/run.js.map +1 -0
  15. package/dist/cli/save.d.ts +8 -0
  16. package/dist/cli/save.d.ts.map +1 -0
  17. package/dist/cli/save.js +90 -0
  18. package/dist/cli/save.js.map +1 -0
  19. package/dist/cli/transfer.d.ts +6 -0
  20. package/dist/cli/transfer.d.ts.map +1 -0
  21. package/dist/cli/transfer.js +99 -0
  22. package/dist/cli/transfer.js.map +1 -0
  23. package/dist/core/commands.d.ts +29 -0
  24. package/dist/core/commands.d.ts.map +1 -0
  25. package/dist/core/commands.js +232 -0
  26. package/dist/core/commands.js.map +1 -0
  27. package/dist/core/env.d.ts +9 -0
  28. package/dist/core/env.d.ts.map +1 -0
  29. package/dist/core/env.js +45 -0
  30. package/dist/core/env.js.map +1 -0
  31. package/dist/core/executor.d.ts +7 -0
  32. package/dist/core/executor.d.ts.map +1 -0
  33. package/dist/{utils → core}/executor.js +10 -46
  34. package/dist/core/executor.js.map +1 -0
  35. package/dist/core/history.d.ts +11 -0
  36. package/dist/core/history.d.ts.map +1 -0
  37. package/dist/core/history.js +117 -0
  38. package/dist/core/history.js.map +1 -0
  39. package/dist/core/recent.d.ts +14 -0
  40. package/dist/core/recent.d.ts.map +1 -0
  41. package/dist/core/recent.js +54 -0
  42. package/dist/core/recent.js.map +1 -0
  43. package/dist/core/runner.d.ts +13 -0
  44. package/dist/core/runner.d.ts.map +1 -0
  45. package/dist/core/runner.js +83 -0
  46. package/dist/core/runner.js.map +1 -0
  47. package/dist/core/store.d.ts +29 -0
  48. package/dist/core/store.d.ts.map +1 -0
  49. package/dist/core/store.js +131 -0
  50. package/dist/core/store.js.map +1 -0
  51. package/dist/core/transfer.d.ts +20 -0
  52. package/dist/core/transfer.d.ts.map +1 -0
  53. package/dist/core/transfer.js +110 -0
  54. package/dist/core/transfer.js.map +1 -0
  55. package/dist/core/types.d.ts +29 -0
  56. package/dist/core/types.d.ts.map +1 -0
  57. package/dist/core/types.js +3 -0
  58. package/dist/core/types.js.map +1 -0
  59. package/dist/core/validate.d.ts +6 -0
  60. package/dist/core/validate.d.ts.map +1 -0
  61. package/dist/core/validate.js +139 -0
  62. package/dist/core/validate.js.map +1 -0
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +172 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/ui/format.d.ts +19 -0
  68. package/dist/ui/format.d.ts.map +1 -0
  69. package/dist/ui/format.js +155 -0
  70. package/dist/ui/format.js.map +1 -0
  71. package/dist/ui/interactive.d.ts +62 -0
  72. package/dist/ui/interactive.d.ts.map +1 -0
  73. package/dist/ui/interactive.js +657 -0
  74. package/dist/ui/interactive.js.map +1 -0
  75. package/dist/ui/onboarding.d.ts +3 -0
  76. package/dist/ui/onboarding.d.ts.map +1 -0
  77. package/dist/ui/onboarding.js +82 -0
  78. package/dist/ui/onboarding.js.map +1 -0
  79. package/dist/ui/prompts.d.ts +3 -0
  80. package/dist/ui/prompts.d.ts.map +1 -0
  81. package/dist/ui/prompts.js +50 -0
  82. package/dist/ui/prompts.js.map +1 -0
  83. package/dist/ui/table.d.ts +18 -0
  84. package/dist/ui/table.d.ts.map +1 -0
  85. package/dist/ui/table.js +54 -0
  86. package/dist/ui/table.js.map +1 -0
  87. package/dist/ui/theme.d.ts +30 -0
  88. package/dist/ui/theme.d.ts.map +1 -0
  89. package/dist/ui/theme.js +58 -0
  90. package/dist/ui/theme.js.map +1 -0
  91. package/package.json +10 -11
  92. package/dist/cli.d.ts +0 -3
  93. package/dist/cli.d.ts.map +0 -1
  94. package/dist/cli.js +0 -253
  95. package/dist/cli.js.map +0 -1
  96. package/dist/commands/alias.d.ts +0 -30
  97. package/dist/commands/alias.d.ts.map +0 -1
  98. package/dist/commands/alias.js +0 -213
  99. package/dist/commands/alias.js.map +0 -1
  100. package/dist/commands/changelog.d.ts +0 -9
  101. package/dist/commands/changelog.d.ts.map +0 -1
  102. package/dist/commands/changelog.js +0 -72
  103. package/dist/commands/changelog.js.map +0 -1
  104. package/dist/commands/completion.d.ts +0 -31
  105. package/dist/commands/completion.d.ts.map +0 -1
  106. package/dist/commands/completion.js +0 -522
  107. package/dist/commands/completion.js.map +0 -1
  108. package/dist/commands/delete.d.ts +0 -14
  109. package/dist/commands/delete.d.ts.map +0 -1
  110. package/dist/commands/delete.js +0 -54
  111. package/dist/commands/delete.js.map +0 -1
  112. package/dist/commands/edit.d.ts +0 -16
  113. package/dist/commands/edit.d.ts.map +0 -1
  114. package/dist/commands/edit.js +0 -231
  115. package/dist/commands/edit.js.map +0 -1
  116. package/dist/commands/export.d.ts +0 -23
  117. package/dist/commands/export.d.ts.map +0 -1
  118. package/dist/commands/export.js +0 -122
  119. package/dist/commands/export.js.map +0 -1
  120. package/dist/commands/import.d.ts +0 -23
  121. package/dist/commands/import.d.ts.map +0 -1
  122. package/dist/commands/import.js +0 -235
  123. package/dist/commands/import.js.map +0 -1
  124. package/dist/commands/list.d.ts +0 -25
  125. package/dist/commands/list.d.ts.map +0 -1
  126. package/dist/commands/list.js +0 -58
  127. package/dist/commands/list.js.map +0 -1
  128. package/dist/commands/prev.d.ts +0 -15
  129. package/dist/commands/prev.d.ts.map +0 -1
  130. package/dist/commands/prev.js +0 -138
  131. package/dist/commands/prev.js.map +0 -1
  132. package/dist/commands/recent.d.ts +0 -24
  133. package/dist/commands/recent.d.ts.map +0 -1
  134. package/dist/commands/recent.js +0 -132
  135. package/dist/commands/recent.js.map +0 -1
  136. package/dist/commands/run.d.ts +0 -22
  137. package/dist/commands/run.d.ts.map +0 -1
  138. package/dist/commands/run.js +0 -217
  139. package/dist/commands/run.js.map +0 -1
  140. package/dist/commands/save.d.ts +0 -17
  141. package/dist/commands/save.d.ts.map +0 -1
  142. package/dist/commands/save.js +0 -232
  143. package/dist/commands/save.js.map +0 -1
  144. package/dist/commands/search.d.ts +0 -19
  145. package/dist/commands/search.d.ts.map +0 -1
  146. package/dist/commands/search.js +0 -113
  147. package/dist/commands/search.js.map +0 -1
  148. package/dist/commands/validate.d.ts +0 -10
  149. package/dist/commands/validate.d.ts.map +0 -1
  150. package/dist/commands/validate.js +0 -162
  151. package/dist/commands/validate.js.map +0 -1
  152. package/dist/storage/index.d.ts +0 -117
  153. package/dist/storage/index.d.ts.map +0 -1
  154. package/dist/storage/index.js +0 -262
  155. package/dist/storage/index.js.map +0 -1
  156. package/dist/utils/changelog.d.ts +0 -41
  157. package/dist/utils/changelog.d.ts.map +0 -1
  158. package/dist/utils/changelog.js +0 -192
  159. package/dist/utils/changelog.js.map +0 -1
  160. package/dist/utils/constants.d.ts +0 -48
  161. package/dist/utils/constants.d.ts.map +0 -1
  162. package/dist/utils/constants.js +0 -51
  163. package/dist/utils/constants.js.map +0 -1
  164. package/dist/utils/env.d.ts +0 -64
  165. package/dist/utils/env.d.ts.map +0 -1
  166. package/dist/utils/env.js +0 -199
  167. package/dist/utils/env.js.map +0 -1
  168. package/dist/utils/errors.d.ts +0 -30
  169. package/dist/utils/errors.d.ts.map +0 -1
  170. package/dist/utils/errors.js +0 -62
  171. package/dist/utils/errors.js.map +0 -1
  172. package/dist/utils/executor.d.ts +0 -33
  173. package/dist/utils/executor.d.ts.map +0 -1
  174. package/dist/utils/executor.js.map +0 -1
  175. package/dist/utils/formatters.d.ts +0 -30
  176. package/dist/utils/formatters.d.ts.map +0 -1
  177. package/dist/utils/formatters.js +0 -188
  178. package/dist/utils/formatters.js.map +0 -1
  179. package/dist/utils/history.d.ts +0 -37
  180. package/dist/utils/history.d.ts.map +0 -1
  181. package/dist/utils/history.js +0 -179
  182. package/dist/utils/history.js.map +0 -1
  183. package/dist/utils/llm-generator.d.ts +0 -21
  184. package/dist/utils/llm-generator.d.ts.map +0 -1
  185. package/dist/utils/llm-generator.js +0 -915
  186. package/dist/utils/llm-generator.js.map +0 -1
  187. package/dist/utils/onboarding.d.ts +0 -10
  188. package/dist/utils/onboarding.d.ts.map +0 -1
  189. package/dist/utils/onboarding.js +0 -316
  190. package/dist/utils/onboarding.js.map +0 -1
  191. package/dist/utils/paths.d.ts +0 -44
  192. package/dist/utils/paths.d.ts.map +0 -1
  193. package/dist/utils/paths.js +0 -115
  194. package/dist/utils/paths.js.map +0 -1
  195. package/dist/utils/prompts.d.ts +0 -66
  196. package/dist/utils/prompts.d.ts.map +0 -1
  197. package/dist/utils/prompts.js +0 -51
  198. package/dist/utils/prompts.js.map +0 -1
  199. package/dist/utils/recent.d.ts +0 -55
  200. package/dist/utils/recent.d.ts.map +0 -1
  201. package/dist/utils/recent.js +0 -102
  202. package/dist/utils/recent.js.map +0 -1
  203. package/dist/utils/validator.d.ts +0 -56
  204. package/dist/utils/validator.d.ts.map +0 -1
  205. package/dist/utils/validator.js +0 -413
  206. package/dist/utils/validator.js.map +0 -1
  207. package/dist/utils/version-checker.d.ts +0 -29
  208. package/dist/utils/version-checker.d.ts.map +0 -1
  209. package/dist/utils/version-checker.js +0 -191
  210. package/dist/utils/version-checker.js.map +0 -1
  211. package/whats-new.json +0 -217
@@ -0,0 +1,99 @@
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.exportHandler = exportHandler;
37
+ exports.importHandler = importHandler;
38
+ const fs = __importStar(require("fs"));
39
+ const commands_1 = require("../core/commands");
40
+ const transfer_1 = require("../core/transfer");
41
+ const format_1 = require("../ui/format");
42
+ const theme_1 = require("../ui/theme");
43
+ function exportHandler(file, options) {
44
+ const format = options.format ?? (file.endsWith('.yaml') || file.endsWith('.yml') ? 'yaml' : 'json');
45
+ let count;
46
+ if (format === 'yaml') {
47
+ const commands = (0, commands_1.listCommands)();
48
+ count = Object.keys(commands).length;
49
+ if (count === 0) {
50
+ (0, theme_1.warn)('No commands to export');
51
+ return;
52
+ }
53
+ fs.writeFileSync((0, transfer_1.expandPath)(file), (0, format_1.toYaml)(commands, !options.full), 'utf8');
54
+ }
55
+ else {
56
+ count = (0, transfer_1.exportToFile)(file, { full: options.full });
57
+ }
58
+ (0, theme_1.ok)(`Exported ${count} command${count === 1 ? '' : 's'} to ${theme_1.theme.name(file)}`);
59
+ if (options.full) {
60
+ console.log(theme_1.theme.warning(' Full export: secret env values are in PLAIN TEXT — keep this file safe.'));
61
+ }
62
+ else {
63
+ console.log(theme_1.theme.dim(' Sensitive env values were masked for safe sharing.'));
64
+ console.log(theme_1.theme.dim(' For a restorable backup with real secret values, use --full.'));
65
+ }
66
+ }
67
+ async function importHandler(file) {
68
+ const resolved = (0, transfer_1.expandPath)(file);
69
+ if (!fs.existsSync(resolved)) {
70
+ (0, theme_1.fail)(`File not found: ${file}`);
71
+ process.exitCode = 1;
72
+ return;
73
+ }
74
+ // Decide the conflict policy up front with a single confirmation.
75
+ let overwrite = false;
76
+ try {
77
+ const incoming = JSON.parse(fs.readFileSync(resolved, 'utf8'));
78
+ const conflicts = Object.keys(incoming).filter((name) => (0, commands_1.commandExists)(name));
79
+ if (conflicts.length > 0 && process.stdin.isTTY && process.stdout.isTTY) {
80
+ const { confirm } = await Promise.resolve().then(() => __importStar(require('../ui/prompts')));
81
+ overwrite = await confirm(`${conflicts.length} command${conflicts.length === 1 ? '' : 's'} already exist (${conflicts
82
+ .slice(0, 5)
83
+ .join(', ')}${conflicts.length > 5 ? ', …' : ''}). Overwrite?`);
84
+ }
85
+ }
86
+ catch {
87
+ (0, theme_1.fail)('Could not parse the import file (JSON expected)');
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ const result = (0, transfer_1.importFromFile)(file, { overwrite: () => overwrite });
92
+ if (result.backup)
93
+ console.log(theme_1.theme.dim(`Backup written to ${result.backup}`));
94
+ for (const name of result.invalid)
95
+ (0, theme_1.warn)(`Skipping "${name}": invalid entry`);
96
+ const skippedNote = result.skipped.length > 0 ? theme_1.theme.dim(` (${result.skipped.length} skipped)`) : '';
97
+ (0, theme_1.ok)(`Imported ${result.imported} command${result.imported === 1 ? '' : 's'}${skippedNote}`);
98
+ }
99
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/cli/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { CommandMap, AliasMap, PathMode, SavedCommand } from './types';
2
+ /** Command names that would shadow CLI subcommands. */
3
+ export declare const RESERVED_NAMES: Set<string>;
4
+ /** Naming rules shared by every save surface (CLI args, prompts, TUI form). */
5
+ export declare function validateCommandName(value: string): true | string;
6
+ export declare function listCommands(): CommandMap;
7
+ export declare function getCommand(name: string): SavedCommand | undefined;
8
+ export declare function commandExists(name: string): boolean;
9
+ export interface SaveInput {
10
+ name: string;
11
+ command: string;
12
+ directory: string;
13
+ pathMode?: PathMode;
14
+ env?: Record<string, string>;
15
+ }
16
+ export declare function saveCommand(input: SaveInput): SavedCommand;
17
+ export declare function deleteCommand(name: string): boolean;
18
+ export declare function renameCommand(from: string, to: string): void;
19
+ /** Case-insensitive search across name, command text, and directory. */
20
+ export declare function searchCommands(query: string): CommandMap;
21
+ export declare function listAliases(): AliasMap;
22
+ export declare function setShortcutAlias(alias: string, commandName: string): void;
23
+ export declare function removeShortcutAlias(alias: string): boolean;
24
+ /**
25
+ * Resolve a user-supplied name to a saved command name.
26
+ * Handles direct names, shortcut aliases, and @N recent-history references.
27
+ */
28
+ export declare function resolveName(input: string, recent?: string[]): string | undefined;
29
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvE,uDAAuD;AACvD,eAAO,MAAM,cAAc,aAwBzB,CAAC;AAEH,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAQhE;AAED,wBAAgB,YAAY,IAAI,UAAU,CAEzC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEjE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CA0B1D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAanD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAgC5D;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAaxD;AAID,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CASzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM1D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,MAAM,GAAG,SAAS,CASpF"}
@@ -0,0 +1,232 @@
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.RESERVED_NAMES = void 0;
37
+ exports.validateCommandName = validateCommandName;
38
+ exports.listCommands = listCommands;
39
+ exports.getCommand = getCommand;
40
+ exports.commandExists = commandExists;
41
+ exports.saveCommand = saveCommand;
42
+ exports.deleteCommand = deleteCommand;
43
+ exports.renameCommand = renameCommand;
44
+ exports.searchCommands = searchCommands;
45
+ exports.listAliases = listAliases;
46
+ exports.setShortcutAlias = setShortcutAlias;
47
+ exports.removeShortcutAlias = removeShortcutAlias;
48
+ exports.resolveName = resolveName;
49
+ const path = __importStar(require("path"));
50
+ const store_1 = require("./store");
51
+ const ALIASES_KEY = 'command_aliases';
52
+ /** Command names that would shadow CLI subcommands. */
53
+ exports.RESERVED_NAMES = new Set([
54
+ 'run',
55
+ 'save',
56
+ 'prev',
57
+ 'list',
58
+ 'ls',
59
+ 'search',
60
+ 'find',
61
+ 'edit',
62
+ 'rename',
63
+ 'mv',
64
+ 'delete',
65
+ 'rm',
66
+ 'export',
67
+ 'import',
68
+ 'alias',
69
+ 'recent',
70
+ 'validate',
71
+ 'completion',
72
+ 'changelog',
73
+ 'changes',
74
+ 'config',
75
+ 'stats',
76
+ 'help',
77
+ ]);
78
+ /** Naming rules shared by every save surface (CLI args, prompts, TUI form). */
79
+ function validateCommandName(value) {
80
+ const name = value.trim();
81
+ if (!name)
82
+ return 'Name cannot be empty';
83
+ if (/\s/.test(name))
84
+ return 'Name cannot contain spaces — try dashes: build-prod';
85
+ if (!/^[\w.:-]+$/.test(name))
86
+ return 'Only letters, digits, and - _ . : are allowed';
87
+ if (name.startsWith('@'))
88
+ return 'Names starting with @ are reserved for recent commands';
89
+ if (exports.RESERVED_NAMES.has(name))
90
+ return `"${name}" is a reserved word — pick another name`;
91
+ return true;
92
+ }
93
+ function listCommands() {
94
+ return store_1.configFile.read();
95
+ }
96
+ function getCommand(name) {
97
+ return listCommands()[name];
98
+ }
99
+ function commandExists(name) {
100
+ return name in listCommands();
101
+ }
102
+ function saveCommand(input) {
103
+ const name = input.name.trim();
104
+ const command = input.command.trim();
105
+ if (!name)
106
+ throw new Error('Command name cannot be empty');
107
+ if (!/^[\w@.:-]+$/.test(name)) {
108
+ throw new Error('Command name may only contain letters, digits, and - _ . : @');
109
+ }
110
+ if (name.startsWith('@'))
111
+ throw new Error('Names starting with @ are reserved for recent commands');
112
+ if (!command)
113
+ throw new Error('Command cannot be empty');
114
+ if (!input.directory.trim())
115
+ throw new Error('Directory cannot be empty');
116
+ const commands = listCommands();
117
+ const now = new Date().toISOString();
118
+ const entry = {
119
+ command,
120
+ directory: path.resolve(input.directory),
121
+ pathMode: input.pathMode ?? 'saved',
122
+ ...(input.env && Object.keys(input.env).length > 0 ? { env: input.env } : {}),
123
+ createdAt: commands[name]?.createdAt ?? now,
124
+ updatedAt: now,
125
+ };
126
+ store_1.configFile.update((data) => {
127
+ data[name] = entry;
128
+ });
129
+ return entry;
130
+ }
131
+ function deleteCommand(name) {
132
+ if (!commandExists(name))
133
+ return false;
134
+ store_1.configFile.update((data) => {
135
+ delete data[name];
136
+ });
137
+ // Drop shortcut aliases that pointed at the deleted command.
138
+ const aliases = listAliases();
139
+ const orphaned = Object.keys(aliases).filter((a) => aliases[a] === name);
140
+ if (orphaned.length > 0) {
141
+ for (const a of orphaned)
142
+ delete aliases[a];
143
+ (0, store_1.setMetadata)(ALIASES_KEY, aliases);
144
+ }
145
+ return true;
146
+ }
147
+ function renameCommand(from, to) {
148
+ const commands = listCommands();
149
+ const existing = commands[from];
150
+ if (!existing)
151
+ throw new Error(`Command "${from}" not found`);
152
+ const nameCheck = validateCommandName(to);
153
+ if (nameCheck !== true)
154
+ throw new Error(nameCheck);
155
+ if (commandExists(to))
156
+ throw new Error(`Command "${to}" already exists`);
157
+ store_1.configFile.update((data) => {
158
+ data[to] = { ...existing, updatedAt: new Date().toISOString() };
159
+ delete data[from];
160
+ });
161
+ // Shortcut aliases and run history follow the command to its new name.
162
+ const aliases = listAliases();
163
+ let aliasesChanged = false;
164
+ for (const a of Object.keys(aliases)) {
165
+ if (aliases[a] === from) {
166
+ aliases[a] = to;
167
+ aliasesChanged = true;
168
+ }
169
+ }
170
+ if (aliasesChanged)
171
+ (0, store_1.setMetadata)(ALIASES_KEY, aliases);
172
+ const history = (0, store_1.getMetadata)('execution_history');
173
+ if (history?.some((e) => e.commandName === from)) {
174
+ (0, store_1.setMetadata)('execution_history', history.map((e) => (e.commandName === from ? { ...e, commandName: to } : e)));
175
+ }
176
+ }
177
+ /** Case-insensitive search across name, command text, and directory. */
178
+ function searchCommands(query) {
179
+ const q = query.toLowerCase();
180
+ const result = {};
181
+ for (const [name, cmd] of Object.entries(listCommands())) {
182
+ if (name.toLowerCase().includes(q) ||
183
+ cmd.command.toLowerCase().includes(q) ||
184
+ cmd.directory.toLowerCase().includes(q)) {
185
+ result[name] = cmd;
186
+ }
187
+ }
188
+ return result;
189
+ }
190
+ // --- Shortcut aliases -------------------------------------------------------
191
+ function listAliases() {
192
+ return { ...((0, store_1.getMetadata)(ALIASES_KEY) ?? {}) };
193
+ }
194
+ function setShortcutAlias(alias, commandName) {
195
+ const a = alias.trim();
196
+ if (!a)
197
+ throw new Error('Alias cannot be empty');
198
+ if (exports.RESERVED_NAMES.has(a))
199
+ throw new Error(`"${a}" is a reserved name`);
200
+ if (commandExists(a))
201
+ throw new Error(`"${a}" is already a saved command name`);
202
+ if (!commandExists(commandName))
203
+ throw new Error(`Command "${commandName}" not found`);
204
+ const aliases = listAliases();
205
+ aliases[a] = commandName;
206
+ (0, store_1.setMetadata)(ALIASES_KEY, aliases);
207
+ }
208
+ function removeShortcutAlias(alias) {
209
+ const aliases = listAliases();
210
+ if (!(alias in aliases))
211
+ return false;
212
+ delete aliases[alias];
213
+ (0, store_1.setMetadata)(ALIASES_KEY, aliases);
214
+ return true;
215
+ }
216
+ /**
217
+ * Resolve a user-supplied name to a saved command name.
218
+ * Handles direct names, shortcut aliases, and @N recent-history references.
219
+ */
220
+ function resolveName(input, recent = []) {
221
+ if (input.startsWith('@')) {
222
+ const index = Number(input.slice(1));
223
+ if (!Number.isInteger(index) || index < 0)
224
+ return undefined;
225
+ return recent[index];
226
+ }
227
+ if (commandExists(input))
228
+ return input;
229
+ const target = listAliases()[input];
230
+ return target && commandExists(target) ? target : undefined;
231
+ }
232
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Environment variable capture, filtering, and secret masking. */
2
+ /** User-defined variables from the current process, system noise filtered out. */
3
+ export declare function captureUserEnv(env?: NodeJS.ProcessEnv): Record<string, string>;
4
+ export declare function isSensitive(key: string): boolean;
5
+ /** Mask a secret value for display/export: keep short hints, hide the middle. */
6
+ export declare function maskValue(value: string): string;
7
+ /** Copy of env with sensitive values masked (safe for display and export). */
8
+ export declare function maskSensitive(env: Record<string, string>): Record<string, string>;
9
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAYnE,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ3F;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMjF"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /** Environment variable capture, filtering, and secret masking. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.captureUserEnv = captureUserEnv;
5
+ exports.isSensitive = isSensitive;
6
+ exports.maskValue = maskValue;
7
+ exports.maskSensitive = maskSensitive;
8
+ const SYSTEM_VAR_PATTERNS = [
9
+ /^(PATH|HOME|USER|LOGNAME|SHELL|SHLVL|PWD|OLDPWD|TERM|TERM_PROGRAM.*|TMPDIR|TEMP|TMP)$/,
10
+ /^(LANG|LANGUAGE|LC_.*|TZ|COLORTERM|DISPLAY|EDITOR|VISUAL|PAGER|LESS.*|MANPATH)$/,
11
+ /^(SSH_.*|XPC_.*|XDG_.*|DBUS_.*|WINDOWID|HOSTNAME|COMPUTERNAME|OS|PROCESSOR_.*)$/,
12
+ /^(HOMEBREW_.*|npm_.*|NODE|NVM_.*|_|__.*|ALIASMATE_.*|Apple_.*|COMMAND_MODE)$/,
13
+ /^(SYSTEMROOT|WINDIR|APPDATA|LOCALAPPDATA|PROGRAMFILES.*|USERPROFILE|COMSPEC|PATHEXT)$/,
14
+ ];
15
+ const SENSITIVE_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|PASSWD|CREDENTIAL|AUTH|PRIVATE)/i;
16
+ /** User-defined variables from the current process, system noise filtered out. */
17
+ function captureUserEnv(env = process.env) {
18
+ const result = {};
19
+ for (const [key, value] of Object.entries(env)) {
20
+ if (value === undefined)
21
+ continue;
22
+ if (SYSTEM_VAR_PATTERNS.some((p) => p.test(key)))
23
+ continue;
24
+ result[key] = value;
25
+ }
26
+ return result;
27
+ }
28
+ function isSensitive(key) {
29
+ return SENSITIVE_PATTERN.test(key);
30
+ }
31
+ /** Mask a secret value for display/export: keep short hints, hide the middle. */
32
+ function maskValue(value) {
33
+ if (value.length <= 4)
34
+ return '***';
35
+ return `${value.slice(0, 3)}***${value.slice(-2)}`;
36
+ }
37
+ /** Copy of env with sensitive values masked (safe for display and export). */
38
+ function maskSensitive(env) {
39
+ const result = {};
40
+ for (const [key, value] of Object.entries(env)) {
41
+ result[key] = isSensitive(key) ? maskValue(value) : value;
42
+ }
43
+ return result;
44
+ }
45
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":";AAAA,mEAAmE;;AAanE,wCAQC;AAED,kCAEC;AAGD,8BAGC;AAGD,sCAMC;AAtCD,MAAM,mBAAmB,GAAG;IAC1B,uFAAuF;IACvF,iFAAiF;IACjF,iFAAiF;IACjF,8EAA8E;IAC9E,uFAAuF;CACxF,CAAC;AAEF,MAAM,iBAAiB,GAAG,6DAA6D,CAAC;AAExF,kFAAkF;AAClF,SAAgB,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,iFAAiF;AACjF,SAAgB,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,SAAgB,aAAa,CAAC,GAA2B;IACvD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ExecutionResult } from './types';
2
+ /**
3
+ * Run a shell command with inherited stdio so interactive programs work.
4
+ * Saved env vars are layered over the current process env.
5
+ */
6
+ export declare function executeCommand(command: string, cwd: string, env?: Record<string, string>): Promise<ExecutionResult>;
7
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,eAAe,CAAC,CAmB1B"}
@@ -38,66 +38,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.executeCommand = executeCommand;
40
40
  const execa_1 = __importDefault(require("execa"));
41
- const path = __importStar(require("path"));
42
41
  const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
43
  /**
44
- * Execute a command in a specific directory
45
- * Uses execa with shell mode for cross-platform compatibility
46
- *
47
- * @param command - The shell command to execute
48
- * @param cwd - The working directory to execute the command in
49
- * @param env - Optional environment variables to use (defaults to process.env)
50
- * @returns A promise that resolves with the execution result
51
- * @throws {Error} If the directory doesn't exist
52
- *
53
- * @example
54
- * ```ts
55
- * const result = await executeCommand('npm install', '/path/to/project');
56
- * if (result.success) {
57
- * console.log('Installation successful');
58
- * }
59
- * ```
44
+ * Run a shell command with inherited stdio so interactive programs work.
45
+ * Saved env vars are layered over the current process env.
60
46
  */
61
- async function executeCommand(command, cwd, env = process.env) {
62
- // Validate inputs
63
- if (!command || !command.trim()) {
64
- throw new Error('Command cannot be empty');
65
- }
66
- // Resolve the directory path
47
+ async function executeCommand(command, cwd, env) {
67
48
  const resolvedCwd = path.resolve(cwd);
68
- // Check if directory exists
69
- if (!fs.existsSync(resolvedCwd)) {
49
+ if (!fs.existsSync(resolvedCwd) || !fs.statSync(resolvedCwd).isDirectory()) {
70
50
  throw new Error(`Directory does not exist: ${resolvedCwd}`);
71
51
  }
72
- // Check if it's actually a directory
73
- const stats = fs.statSync(resolvedCwd);
74
- if (!stats.isDirectory()) {
75
- throw new Error(`Path is not a directory: ${resolvedCwd}`);
76
- }
52
+ const started = Date.now();
77
53
  try {
78
- // Execute the command using the user's shell
79
- // stdio: 'inherit' allows real-time output to terminal
80
54
  await (0, execa_1.default)(command, {
81
55
  shell: true,
82
56
  cwd: resolvedCwd,
83
57
  stdio: 'inherit',
84
- env,
58
+ env: env ? { ...process.env, ...env } : process.env,
85
59
  });
86
- return {
87
- success: true,
88
- stdout: '',
89
- stderr: '',
90
- exitCode: 0,
91
- };
60
+ return { success: true, exitCode: 0, durationMs: Date.now() - started };
92
61
  }
93
62
  catch (error) {
94
- const execaError = error;
95
- return {
96
- success: false,
97
- stdout: execaError.stdout || '',
98
- stderr: execaError.stderr || execaError.message,
99
- exitCode: execaError.exitCode,
100
- };
63
+ const exitCode = error.exitCode ?? 1;
64
+ return { success: false, exitCode, durationMs: Date.now() - started };
101
65
  }
102
66
  }
103
67
  //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,wCAuBC;AAhCD,kDAA0B;AAC1B,uCAAyB;AACzB,2CAA6B;AAG7B;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,GAAW,EACX,GAA4B;IAE5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,IAAA,eAAK,EAAC,OAAO,EAAE;YACnB,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;SACpD,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAI,KAA0B,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IACxE,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Parse one raw history line into a command, handling zsh/fish formats. */
2
+ export declare function parseHistoryLine(line: string): string;
3
+ /**
4
+ * The last non-aliasmate command from shell history, or null if unavailable.
5
+ * ALIASMATE_LAST_CMD (set by shell integration) takes precedence over the
6
+ * history file, which most shells only flush on exit.
7
+ */
8
+ export declare function getLastCommand(): string | null;
9
+ /** Shell-specific instructions for real-time history writing. */
10
+ export declare function getHistoryConfigHint(): string;
11
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/core/history.ts"],"names":[],"mappings":"AAIA,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQrD;AA2CD;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAgB9C;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,MAAM,CAS7C"}