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,117 @@
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.parseHistoryLine = parseHistoryLine;
37
+ exports.getLastCommand = getLastCommand;
38
+ exports.getHistoryConfigHint = getHistoryConfigHint;
39
+ const fs = __importStar(require("fs"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ /** Parse one raw history line into a command, handling zsh/fish formats. */
43
+ function parseHistoryLine(line) {
44
+ let cmd = line.trim();
45
+ // zsh extended history: ": <timestamp>:<duration>;<command>"
46
+ const zshMatch = cmd.match(/^:\s*\d+:\d+;(.*)$/);
47
+ if (zshMatch)
48
+ cmd = zshMatch[1].trim();
49
+ // fish yaml-ish history: "- cmd: <command>"
50
+ if (cmd.startsWith('- cmd:'))
51
+ cmd = cmd.slice(6).trim();
52
+ return cmd;
53
+ }
54
+ function isCaptureWorthy(cmd) {
55
+ return (cmd.length > 0 &&
56
+ !cmd.startsWith('aliasmate') &&
57
+ !cmd.startsWith('am ') &&
58
+ cmd !== 'exit' &&
59
+ cmd !== 'quit' &&
60
+ cmd !== 'clear');
61
+ }
62
+ function findHistoryFile() {
63
+ const home = os.homedir();
64
+ if (os.platform() === 'win32') {
65
+ const psHistory = path.join(home, 'AppData', 'Roaming', 'Microsoft', 'Windows', 'PowerShell', 'PSReadLine', 'ConsoleHost_history.txt');
66
+ return fs.existsSync(psHistory) ? psHistory : null;
67
+ }
68
+ const shell = process.env.SHELL ?? '';
69
+ const candidates = [];
70
+ if (shell.includes('zsh'))
71
+ candidates.push(path.join(home, '.zsh_history'));
72
+ if (shell.includes('bash'))
73
+ candidates.push(path.join(home, '.bash_history'));
74
+ if (shell.includes('fish'))
75
+ candidates.push(path.join(home, '.local', 'share', 'fish', 'fish_history'));
76
+ candidates.push(path.join(home, '.zsh_history'), path.join(home, '.bash_history'), path.join(home, '.sh_history'), path.join(home, '.history'));
77
+ return candidates.find((f) => fs.existsSync(f)) ?? null;
78
+ }
79
+ /**
80
+ * The last non-aliasmate command from shell history, or null if unavailable.
81
+ * ALIASMATE_LAST_CMD (set by shell integration) takes precedence over the
82
+ * history file, which most shells only flush on exit.
83
+ */
84
+ function getLastCommand() {
85
+ const injected = process.env.ALIASMATE_LAST_CMD?.trim();
86
+ if (injected && isCaptureWorthy(injected))
87
+ return injected;
88
+ try {
89
+ const file = findHistoryFile();
90
+ if (!file)
91
+ return null;
92
+ const lines = fs.readFileSync(file, 'utf8').trim().split('\n');
93
+ for (let i = lines.length - 1; i >= 0; i--) {
94
+ const cmd = parseHistoryLine(lines[i]);
95
+ if (isCaptureWorthy(cmd))
96
+ return cmd;
97
+ }
98
+ }
99
+ catch {
100
+ // History unavailable is a soft failure; caller prompts manually.
101
+ }
102
+ return null;
103
+ }
104
+ /** Shell-specific instructions for real-time history writing. */
105
+ function getHistoryConfigHint() {
106
+ const shell = process.env.SHELL ?? '';
107
+ if (os.platform() === 'win32')
108
+ return 'PowerShell writes history immediately by default.';
109
+ if (shell.includes('zsh'))
110
+ return 'Add "setopt INC_APPEND_HISTORY" to ~/.zshrc, then run: source ~/.zshrc';
111
+ if (shell.includes('bash'))
112
+ return 'Add PROMPT_COMMAND="history -a" to ~/.bashrc, then run: source ~/.bashrc';
113
+ if (shell.includes('fish'))
114
+ return 'Fish writes history immediately by default.';
115
+ return 'Configure your shell to flush history after every command.';
116
+ }
117
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/core/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ExecutionEntry } from './types';
2
+ export declare function getExecutionHistory(): ExecutionEntry[];
3
+ export declare function recordExecution(commandName: string): void;
4
+ export declare function clearExecutionHistory(): void;
5
+ /** Unique command names, most recently run first. Powers @N references. */
6
+ export declare function getRecentNames(limit?: number): string[];
7
+ export interface CommandStats {
8
+ name: string;
9
+ runCount: number;
10
+ lastRunAt: string;
11
+ }
12
+ /** Per-command usage stats, most-used first. */
13
+ export declare function getUsageStats(): CommandStats[];
14
+ //# sourceMappingURL=recent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent.d.ts","sourceRoot":"","sources":["../../src/core/recent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAKzC,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAEtD;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gDAAgD;AAChD,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAe9C"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getExecutionHistory = getExecutionHistory;
4
+ exports.recordExecution = recordExecution;
5
+ exports.clearExecutionHistory = clearExecutionHistory;
6
+ exports.getRecentNames = getRecentNames;
7
+ exports.getUsageStats = getUsageStats;
8
+ const store_1 = require("./store");
9
+ const HISTORY_KEY = 'execution_history';
10
+ const MAX_ENTRIES = 200;
11
+ function getExecutionHistory() {
12
+ return (0, store_1.getMetadata)(HISTORY_KEY) ?? [];
13
+ }
14
+ function recordExecution(commandName) {
15
+ const history = getExecutionHistory();
16
+ history.unshift({ commandName, executedAt: new Date().toISOString() });
17
+ (0, store_1.setMetadata)(HISTORY_KEY, history.slice(0, MAX_ENTRIES));
18
+ }
19
+ function clearExecutionHistory() {
20
+ (0, store_1.setMetadata)(HISTORY_KEY, []);
21
+ }
22
+ /** Unique command names, most recently run first. Powers @N references. */
23
+ function getRecentNames(limit) {
24
+ const seen = new Set();
25
+ const result = [];
26
+ for (const entry of getExecutionHistory()) {
27
+ if (seen.has(entry.commandName))
28
+ continue;
29
+ seen.add(entry.commandName);
30
+ result.push(entry.commandName);
31
+ if (limit !== undefined && result.length >= limit)
32
+ break;
33
+ }
34
+ return result;
35
+ }
36
+ /** Per-command usage stats, most-used first. */
37
+ function getUsageStats() {
38
+ const stats = new Map();
39
+ for (const entry of getExecutionHistory()) {
40
+ const existing = stats.get(entry.commandName);
41
+ if (existing) {
42
+ existing.runCount += 1;
43
+ }
44
+ else {
45
+ stats.set(entry.commandName, {
46
+ name: entry.commandName,
47
+ runCount: 1,
48
+ lastRunAt: entry.executedAt,
49
+ });
50
+ }
51
+ }
52
+ return [...stats.values()].sort((a, b) => b.runCount - a.runCount);
53
+ }
54
+ //# sourceMappingURL=recent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent.js","sourceRoot":"","sources":["../../src/core/recent.ts"],"names":[],"mappings":";;AAMA,kDAEC;AAED,0CAIC;AAED,sDAEC;AAGD,wCAUC;AASD,sCAeC;AAvDD,mCAAmD;AAGnD,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,SAAgB,mBAAmB;IACjC,OAAO,IAAA,mBAAW,EAAmB,WAAW,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,SAAgB,eAAe,CAAC,WAAmB;IACjD,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvE,IAAA,mBAAW,EAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,qBAAqB;IACnC,IAAA,mBAAW,EAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,2EAA2E;AAC3E,SAAgB,cAAc,CAAC,KAAc;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YAAE,SAAS;QAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,gDAAgD;AAChD,SAAgB,aAAa;IAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;gBAC3B,IAAI,EAAE,KAAK,CAAC,WAAW;gBACvB,QAAQ,EAAE,CAAC;gBACX,SAAS,EAAE,KAAK,CAAC,UAAU;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { SavedCommand } from './types';
2
+ export interface RunPlan {
3
+ name: string;
4
+ saved: SavedCommand;
5
+ cwd: string;
6
+ cwdSource: 'saved' | 'current' | 'override';
7
+ dangers: string[];
8
+ }
9
+ /** Resolve a name (or alias or @N) into a concrete execution plan. */
10
+ export declare function planRun(nameInput: string, pathOverride?: string): RunPlan;
11
+ /** Execute a plan, recording it in the usage history. */
12
+ export declare function executePlan(plan: RunPlan): Promise<import("./types").ExecutionResult>;
13
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CA0BzE;AAED,yDAAyD;AACzD,wBAAsB,WAAW,CAAC,IAAI,EAAE,OAAO,8CAW9C"}
@@ -0,0 +1,83 @@
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.planRun = planRun;
37
+ exports.executePlan = executePlan;
38
+ const path = __importStar(require("path"));
39
+ const commands_1 = require("./commands");
40
+ const recent_1 = require("./recent");
41
+ const executor_1 = require("./executor");
42
+ const validate_1 = require("./validate");
43
+ /** Resolve a name (or alias or @N) into a concrete execution plan. */
44
+ function planRun(nameInput, pathOverride) {
45
+ const name = (0, commands_1.resolveName)(nameInput, (0, recent_1.getRecentNames)());
46
+ if (!name) {
47
+ throw new Error(nameInput.startsWith('@')
48
+ ? `No recent command at ${nameInput}. Run "aliasmate recent" to see history.`
49
+ : `Command "${nameInput}" not found. Run "aliasmate list" to see saved commands.`);
50
+ }
51
+ const saved = (0, commands_1.getCommand)(name);
52
+ if (!saved)
53
+ throw new Error(`Command "${name}" not found`);
54
+ let cwd;
55
+ let cwdSource;
56
+ if (pathOverride) {
57
+ cwd = path.resolve(pathOverride);
58
+ cwdSource = 'override';
59
+ }
60
+ else if ((saved.pathMode ?? 'saved') === 'current') {
61
+ cwd = process.cwd();
62
+ cwdSource = 'current';
63
+ }
64
+ else {
65
+ cwd = saved.directory;
66
+ cwdSource = 'saved';
67
+ }
68
+ return { name, saved, cwd, cwdSource, dangers: (0, validate_1.getDangerWarnings)(saved.command) };
69
+ }
70
+ /** Execute a plan, recording it in the usage history. */
71
+ async function executePlan(plan) {
72
+ const errors = (0, validate_1.validateSavedCommand)({
73
+ ...plan.saved,
74
+ directory: plan.cwd,
75
+ pathMode: 'saved',
76
+ }).filter((issue) => issue.level === 'error');
77
+ if (errors.length > 0) {
78
+ throw new Error(errors.map((e) => e.message).join('; '));
79
+ }
80
+ (0, recent_1.recordExecution)(plan.name);
81
+ return (0, executor_1.executeCommand)(plan.saved.command, plan.cwd, plan.saved.env);
82
+ }
83
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,0BA0BC;AAGD,kCAWC;AAxDD,2CAA6B;AAC7B,yCAAqD;AACrD,qCAA2D;AAC3D,yCAA4C;AAC5C,yCAAqE;AAWrE,sEAAsE;AACtE,SAAgB,OAAO,CAAC,SAAiB,EAAE,YAAqB;IAC9D,MAAM,IAAI,GAAG,IAAA,sBAAW,EAAC,SAAS,EAAE,IAAA,uBAAc,GAAE,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YACvB,CAAC,CAAC,wBAAwB,SAAS,0CAA0C;YAC7E,CAAC,CAAC,YAAY,SAAS,0DAA0D,CACpF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;IAE3D,IAAI,GAAW,CAAC;IAChB,IAAI,SAA+B,CAAC;IACpC,IAAI,YAAY,EAAE,CAAC;QACjB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjC,SAAS,GAAG,UAAU,CAAC;IACzB,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QACrD,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;QACtB,SAAS,GAAG,OAAO,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAA,4BAAiB,EAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,yDAAyD;AAClD,KAAK,UAAU,WAAW,CAAC,IAAa;IAC7C,MAAM,MAAM,GAAG,IAAA,+BAAoB,EAAC;QAClC,GAAG,IAAI,CAAC,KAAK;QACb,SAAS,EAAE,IAAI,CAAC,GAAG;QACnB,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAA,wBAAe,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAA,yBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Config directory resolution. ALIASMATE_HOME overrides the default so tests
3
+ * and power users can point at an isolated directory.
4
+ */
5
+ export declare function getConfigDir(): string;
6
+ export declare function getConfigPath(): string;
7
+ export declare function getMetadataPath(): string;
8
+ export declare function getOnboardingPath(): string;
9
+ /**
10
+ * A JSON-backed document with per-process caching and atomic writes.
11
+ * Each file is read at most once per process; writes go through a temp file
12
+ * and rename so a crash can never corrupt user data.
13
+ */
14
+ export declare class JsonFile<T extends object> {
15
+ private readonly filePath;
16
+ private readonly fallback;
17
+ private cache;
18
+ constructor(filePath: () => string, fallback: () => T);
19
+ read(): T;
20
+ write(data: T): void;
21
+ update(mutate: (data: T) => void): T;
22
+ /** Drop the cache (used by tests when the underlying path changes). */
23
+ invalidate(): void;
24
+ }
25
+ export declare const configFile: JsonFile<Record<string, unknown>>;
26
+ export declare const metadataFile: JsonFile<Record<string, unknown>>;
27
+ export declare function getMetadata<T>(key: string): T | undefined;
28
+ export declare function setMetadata<T>(key: string, value: T): void;
29
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;GAIG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,MAAM;IAIlC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,OAAO,CAAC,KAAK,CAAkB;gBAGZ,QAAQ,EAAE,MAAM,MAAM,EACtB,QAAQ,EAAE,MAAM,CAAC;IAGpC,IAAI,IAAI,CAAC;IAuBT,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAQpB,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,CAAC;IAOpC,uEAAuE;IACvE,UAAU,IAAI,IAAI;CAGnB;AAED,eAAO,MAAM,UAAU,mCAAmE,CAAC;AAC3F,eAAO,MAAM,YAAY,mCAAqE,CAAC;AAE/F,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAEzD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAI1D"}
@@ -0,0 +1,131 @@
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.metadataFile = exports.configFile = exports.JsonFile = void 0;
37
+ exports.getConfigDir = getConfigDir;
38
+ exports.getConfigPath = getConfigPath;
39
+ exports.getMetadataPath = getMetadataPath;
40
+ exports.getOnboardingPath = getOnboardingPath;
41
+ exports.getMetadata = getMetadata;
42
+ exports.setMetadata = setMetadata;
43
+ const fs = __importStar(require("fs"));
44
+ const os = __importStar(require("os"));
45
+ const path = __importStar(require("path"));
46
+ /**
47
+ * Config directory resolution. ALIASMATE_HOME overrides the default so tests
48
+ * and power users can point at an isolated directory.
49
+ */
50
+ function getConfigDir() {
51
+ const dir = process.env.ALIASMATE_HOME || path.join(os.homedir(), '.config', 'aliasmate');
52
+ if (!fs.existsSync(dir)) {
53
+ fs.mkdirSync(dir, { recursive: true });
54
+ }
55
+ return dir;
56
+ }
57
+ function getConfigPath() {
58
+ return path.join(getConfigDir(), 'config.json');
59
+ }
60
+ function getMetadataPath() {
61
+ return path.join(getConfigDir(), 'metadata.json');
62
+ }
63
+ function getOnboardingPath() {
64
+ return path.join(getConfigDir(), 'onboarding.json');
65
+ }
66
+ /**
67
+ * A JSON-backed document with per-process caching and atomic writes.
68
+ * Each file is read at most once per process; writes go through a temp file
69
+ * and rename so a crash can never corrupt user data.
70
+ */
71
+ class JsonFile {
72
+ constructor(filePath, fallback) {
73
+ this.filePath = filePath;
74
+ this.fallback = fallback;
75
+ this.cache = null;
76
+ }
77
+ read() {
78
+ if (this.cache !== null)
79
+ return this.cache;
80
+ const file = this.filePath();
81
+ if (!fs.existsSync(file)) {
82
+ this.cache = this.fallback();
83
+ return this.cache;
84
+ }
85
+ try {
86
+ this.cache = JSON.parse(fs.readFileSync(file, 'utf8'));
87
+ }
88
+ catch {
89
+ // Corrupt file: preserve it for the user instead of silently clobbering.
90
+ const backup = `${file}.corrupt-${Date.now()}`;
91
+ try {
92
+ fs.copyFileSync(file, backup);
93
+ process.stderr.write(`Warning: could not parse ${file}; backup saved to ${backup}\n`);
94
+ }
95
+ catch {
96
+ // Best effort only.
97
+ }
98
+ this.cache = this.fallback();
99
+ }
100
+ return this.cache;
101
+ }
102
+ write(data) {
103
+ const file = this.filePath();
104
+ const tmp = `${file}.tmp`;
105
+ fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf8');
106
+ fs.renameSync(tmp, file);
107
+ this.cache = data;
108
+ }
109
+ update(mutate) {
110
+ const data = this.read();
111
+ mutate(data);
112
+ this.write(data);
113
+ return data;
114
+ }
115
+ /** Drop the cache (used by tests when the underlying path changes). */
116
+ invalidate() {
117
+ this.cache = null;
118
+ }
119
+ }
120
+ exports.JsonFile = JsonFile;
121
+ exports.configFile = new JsonFile(getConfigPath, () => ({}));
122
+ exports.metadataFile = new JsonFile(getMetadataPath, () => ({}));
123
+ function getMetadata(key) {
124
+ return exports.metadataFile.read()[key];
125
+ }
126
+ function setMetadata(key, value) {
127
+ exports.metadataFile.update((data) => {
128
+ data[key] = value;
129
+ });
130
+ }
131
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /** Expand a leading ~ and resolve to an absolute path. */
2
+ export declare function expandPath(file: string): string;
3
+ /** Write all commands to a JSON file. Returns how many were exported. */
4
+ export declare function exportToFile(file: string, options?: {
5
+ full?: boolean;
6
+ }): number;
7
+ export interface ImportResult {
8
+ imported: number;
9
+ skipped: string[];
10
+ invalid: string[];
11
+ backup?: string;
12
+ }
13
+ /**
14
+ * Import commands from a JSON file, backing up the current config first.
15
+ * Existing names are skipped unless `overwrite` names them.
16
+ */
17
+ export declare function importFromFile(file: string, options?: {
18
+ overwrite?: (name: string) => boolean;
19
+ }): ImportResult;
20
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/core/transfer.ts"],"names":[],"mappings":"AAQA,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAUnF;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAO,GACtD,YAAY,CAsCd"}
@@ -0,0 +1,110 @@
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.expandPath = expandPath;
37
+ exports.exportToFile = exportToFile;
38
+ exports.importFromFile = importFromFile;
39
+ const fs = __importStar(require("fs"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const commands_1 = require("./commands");
43
+ const env_1 = require("./env");
44
+ const store_1 = require("./store");
45
+ /** Expand a leading ~ and resolve to an absolute path. */
46
+ function expandPath(file) {
47
+ const expanded = file.startsWith('~') ? path.join(os.homedir(), file.slice(1)) : file;
48
+ return path.resolve(expanded);
49
+ }
50
+ /** Write all commands to a JSON file. Returns how many were exported. */
51
+ function exportToFile(file, options = {}) {
52
+ const commands = (0, commands_1.listCommands)();
53
+ const names = Object.keys(commands);
54
+ if (names.length === 0)
55
+ throw new Error('No commands to export');
56
+ const data = {};
57
+ for (const [name, cmd] of Object.entries(commands)) {
58
+ data[name] = !options.full && cmd.env ? { ...cmd, env: (0, env_1.maskSensitive)(cmd.env) } : cmd;
59
+ }
60
+ fs.writeFileSync(expandPath(file), JSON.stringify(data, null, 2), 'utf8');
61
+ return names.length;
62
+ }
63
+ function isValidEntry(value) {
64
+ return (typeof value === 'object' &&
65
+ value !== null &&
66
+ typeof value.command === 'string' &&
67
+ typeof value.directory === 'string');
68
+ }
69
+ /**
70
+ * Import commands from a JSON file, backing up the current config first.
71
+ * Existing names are skipped unless `overwrite` names them.
72
+ */
73
+ function importFromFile(file, options = {}) {
74
+ const resolved = expandPath(file);
75
+ if (!fs.existsSync(resolved))
76
+ throw new Error(`File not found: ${file}`);
77
+ let incoming;
78
+ try {
79
+ incoming = JSON.parse(fs.readFileSync(resolved, 'utf8'));
80
+ }
81
+ catch {
82
+ throw new Error('Could not parse the import file (JSON expected)');
83
+ }
84
+ const result = { imported: 0, skipped: [], invalid: [] };
85
+ const existing = (0, commands_1.listCommands)();
86
+ if (Object.keys(existing).length > 0) {
87
+ result.backup = path.join((0, store_1.getConfigDir)(), `backup-${Date.now()}.json`);
88
+ fs.writeFileSync(result.backup, JSON.stringify(existing, null, 2), 'utf8');
89
+ }
90
+ for (const [name, entry] of Object.entries(incoming)) {
91
+ if (!isValidEntry(entry)) {
92
+ result.invalid.push(name);
93
+ continue;
94
+ }
95
+ if ((0, commands_1.commandExists)(name) && !(options.overwrite?.(name) ?? false)) {
96
+ result.skipped.push(name);
97
+ continue;
98
+ }
99
+ (0, commands_1.saveCommand)({
100
+ name,
101
+ command: entry.command,
102
+ directory: entry.directory,
103
+ pathMode: entry.pathMode,
104
+ env: entry.env,
105
+ });
106
+ result.imported++;
107
+ }
108
+ return result;
109
+ }
110
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/core/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** Where a saved command executes: its saved directory or the caller's cwd. */
2
+ export type PathMode = 'saved' | 'current';
3
+ /** A saved command and its execution context. Matches the on-disk config.json schema. */
4
+ export interface SavedCommand {
5
+ command: string;
6
+ directory: string;
7
+ pathMode?: PathMode;
8
+ env?: Record<string, string>;
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ }
12
+ export type CommandMap = Record<string, SavedCommand>;
13
+ /** Shortcut alias name -> saved command name. */
14
+ export type AliasMap = Record<string, string>;
15
+ export interface ExecutionEntry {
16
+ commandName: string;
17
+ executedAt: string;
18
+ }
19
+ export interface ValidationIssue {
20
+ level: 'error' | 'warning';
21
+ message: string;
22
+ }
23
+ export interface ExecutionResult {
24
+ success: boolean;
25
+ exitCode: number;
26
+ durationMs: number;
27
+ }
28
+ export type ListFormat = 'table' | 'json' | 'yaml' | 'compact';
29
+ //# sourceMappingURL=types.d.ts.map