aliasmate 1.6.1 → 2.0.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.
- package/CHANGELOG.md +37 -0
- package/README.md +61 -876
- package/dist/cli/completion.d.ts +5 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +144 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/manage.d.ts +20 -0
- package/dist/cli/manage.d.ts.map +1 -0
- package/dist/cli/manage.js +213 -0
- package/dist/cli/manage.js.map +1 -0
- package/dist/cli/run.d.ts +6 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +46 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/save.d.ts +9 -0
- package/dist/cli/save.d.ts.map +1 -0
- package/dist/cli/save.js +52 -0
- package/dist/cli/save.js.map +1 -0
- package/dist/cli/transfer.d.ts +5 -0
- package/dist/cli/transfer.d.ts.map +1 -0
- package/dist/cli/transfer.js +118 -0
- package/dist/cli/transfer.js.map +1 -0
- package/dist/core/commands.d.ts +27 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +194 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/env.d.ts +9 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +45 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/executor.d.ts +7 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/{utils → core}/executor.js +10 -46
- package/dist/core/executor.js.map +1 -0
- package/dist/core/history.d.ts +11 -0
- package/dist/core/history.d.ts.map +1 -0
- package/dist/core/history.js +117 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/recent.d.ts +14 -0
- package/dist/core/recent.d.ts.map +1 -0
- package/dist/core/recent.js +54 -0
- package/dist/core/recent.js.map +1 -0
- package/dist/core/runner.d.ts +13 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +83 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/store.d.ts +29 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +131 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +29 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validate.d.ts +6 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +139 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/format.d.ts +16 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +112 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/interactive.d.ts +6 -0
- package/dist/ui/interactive.d.ts.map +1 -0
- package/dist/ui/interactive.js +147 -0
- package/dist/ui/interactive.js.map +1 -0
- package/dist/ui/onboarding.d.ts +3 -0
- package/dist/ui/onboarding.d.ts.map +1 -0
- package/dist/ui/onboarding.js +82 -0
- package/dist/ui/onboarding.js.map +1 -0
- package/dist/ui/prompts.d.ts +14 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +96 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/theme.d.ts +28 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +43 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +4 -5
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -252
- package/dist/cli.js.map +0 -1
- package/dist/commands/alias.d.ts +0 -30
- package/dist/commands/alias.d.ts.map +0 -1
- package/dist/commands/alias.js +0 -213
- package/dist/commands/alias.js.map +0 -1
- package/dist/commands/changelog.d.ts +0 -9
- package/dist/commands/changelog.d.ts.map +0 -1
- package/dist/commands/changelog.js +0 -72
- package/dist/commands/changelog.js.map +0 -1
- package/dist/commands/completion.d.ts +0 -17
- package/dist/commands/completion.d.ts.map +0 -1
- package/dist/commands/completion.js +0 -363
- package/dist/commands/completion.js.map +0 -1
- package/dist/commands/delete.d.ts +0 -14
- package/dist/commands/delete.d.ts.map +0 -1
- package/dist/commands/delete.js +0 -54
- package/dist/commands/delete.js.map +0 -1
- package/dist/commands/edit.d.ts +0 -16
- package/dist/commands/edit.d.ts.map +0 -1
- package/dist/commands/edit.js +0 -231
- package/dist/commands/edit.js.map +0 -1
- package/dist/commands/export.d.ts +0 -23
- package/dist/commands/export.d.ts.map +0 -1
- package/dist/commands/export.js +0 -122
- package/dist/commands/export.js.map +0 -1
- package/dist/commands/import.d.ts +0 -23
- package/dist/commands/import.d.ts.map +0 -1
- package/dist/commands/import.js +0 -235
- package/dist/commands/import.js.map +0 -1
- package/dist/commands/list.d.ts +0 -25
- package/dist/commands/list.d.ts.map +0 -1
- package/dist/commands/list.js +0 -58
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/prev.d.ts +0 -15
- package/dist/commands/prev.d.ts.map +0 -1
- package/dist/commands/prev.js +0 -138
- package/dist/commands/prev.js.map +0 -1
- package/dist/commands/recent.d.ts +0 -24
- package/dist/commands/recent.d.ts.map +0 -1
- package/dist/commands/recent.js +0 -132
- package/dist/commands/recent.js.map +0 -1
- package/dist/commands/run.d.ts +0 -22
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -217
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/save.d.ts +0 -17
- package/dist/commands/save.d.ts.map +0 -1
- package/dist/commands/save.js +0 -232
- package/dist/commands/save.js.map +0 -1
- package/dist/commands/search.d.ts +0 -19
- package/dist/commands/search.d.ts.map +0 -1
- package/dist/commands/search.js +0 -113
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/validate.d.ts +0 -10
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/validate.js +0 -162
- package/dist/commands/validate.js.map +0 -1
- package/dist/storage/index.d.ts +0 -117
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -262
- package/dist/storage/index.js.map +0 -1
- package/dist/utils/changelog.d.ts +0 -41
- package/dist/utils/changelog.d.ts.map +0 -1
- package/dist/utils/changelog.js +0 -192
- package/dist/utils/changelog.js.map +0 -1
- package/dist/utils/constants.d.ts +0 -48
- package/dist/utils/constants.d.ts.map +0 -1
- package/dist/utils/constants.js +0 -51
- package/dist/utils/constants.js.map +0 -1
- package/dist/utils/env.d.ts +0 -64
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -199
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -30
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -62
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/executor.d.ts +0 -33
- package/dist/utils/executor.d.ts.map +0 -1
- package/dist/utils/executor.js.map +0 -1
- package/dist/utils/formatters.d.ts +0 -30
- package/dist/utils/formatters.d.ts.map +0 -1
- package/dist/utils/formatters.js +0 -188
- package/dist/utils/formatters.js.map +0 -1
- package/dist/utils/history.d.ts +0 -37
- package/dist/utils/history.d.ts.map +0 -1
- package/dist/utils/history.js +0 -179
- package/dist/utils/history.js.map +0 -1
- package/dist/utils/llm-generator.d.ts +0 -21
- package/dist/utils/llm-generator.d.ts.map +0 -1
- package/dist/utils/llm-generator.js +0 -915
- package/dist/utils/llm-generator.js.map +0 -1
- package/dist/utils/onboarding.d.ts +0 -10
- package/dist/utils/onboarding.d.ts.map +0 -1
- package/dist/utils/onboarding.js +0 -316
- package/dist/utils/onboarding.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -44
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -115
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/prompts.d.ts +0 -66
- package/dist/utils/prompts.d.ts.map +0 -1
- package/dist/utils/prompts.js +0 -51
- package/dist/utils/prompts.js.map +0 -1
- package/dist/utils/recent.d.ts +0 -55
- package/dist/utils/recent.d.ts.map +0 -1
- package/dist/utils/recent.js +0 -102
- package/dist/utils/recent.js.map +0 -1
- package/dist/utils/validator.d.ts +0 -56
- package/dist/utils/validator.d.ts.map +0 -1
- package/dist/utils/validator.js +0 -413
- package/dist/utils/validator.js.map +0 -1
- package/dist/utils/version-checker.d.ts +0 -29
- package/dist/utils/version-checker.d.ts.map +0 -1
- package/dist/utils/version-checker.js +0 -191
- package/dist/utils/version-checker.js.map +0 -1
- package/whats-new.json +0 -202
|
@@ -0,0 +1,118 @@
|
|
|
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 path = __importStar(require("path"));
|
|
40
|
+
const commands_1 = require("../core/commands");
|
|
41
|
+
const format_1 = require("../ui/format");
|
|
42
|
+
const store_1 = require("../core/store");
|
|
43
|
+
const theme_1 = require("../ui/theme");
|
|
44
|
+
function exportHandler(file, options) {
|
|
45
|
+
const commands = (0, commands_1.listCommands)();
|
|
46
|
+
if (Object.keys(commands).length === 0) {
|
|
47
|
+
(0, theme_1.warn)('No commands to export');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const format = options.format ?? (file.endsWith('.yaml') || file.endsWith('.yml') ? 'yaml' : 'json');
|
|
51
|
+
const content = format === 'yaml' ? (0, format_1.toYaml)(commands) : (0, format_1.toJson)(commands);
|
|
52
|
+
fs.writeFileSync(path.resolve(file), content, 'utf8');
|
|
53
|
+
(0, theme_1.ok)(`Exported ${Object.keys(commands).length} commands to ${theme_1.theme.name(file)}`);
|
|
54
|
+
console.log(theme_1.theme.dim(' Sensitive env values were masked for safe sharing.'));
|
|
55
|
+
}
|
|
56
|
+
function isValidEntry(value) {
|
|
57
|
+
return (typeof value === 'object' &&
|
|
58
|
+
value !== null &&
|
|
59
|
+
typeof value.command === 'string' &&
|
|
60
|
+
typeof value.directory === 'string');
|
|
61
|
+
}
|
|
62
|
+
async function importHandler(file) {
|
|
63
|
+
const resolved = path.resolve(file);
|
|
64
|
+
if (!fs.existsSync(resolved)) {
|
|
65
|
+
(0, theme_1.fail)(`File not found: ${file}`);
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let incoming;
|
|
70
|
+
try {
|
|
71
|
+
incoming = JSON.parse(fs.readFileSync(resolved, 'utf8'));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
(0, theme_1.fail)('Could not parse the import file (JSON expected)');
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Back up current config before touching anything.
|
|
79
|
+
const existing = (0, commands_1.listCommands)();
|
|
80
|
+
if (Object.keys(existing).length > 0) {
|
|
81
|
+
const backup = path.join((0, store_1.getConfigDir)(), `backup-${Date.now()}.json`);
|
|
82
|
+
fs.writeFileSync(backup, JSON.stringify(existing, null, 2), 'utf8');
|
|
83
|
+
console.log(theme_1.theme.dim(`Backup written to ${backup}`));
|
|
84
|
+
}
|
|
85
|
+
let imported = 0;
|
|
86
|
+
let skipped = 0;
|
|
87
|
+
for (const [name, entry] of Object.entries(incoming)) {
|
|
88
|
+
if (!isValidEntry(entry)) {
|
|
89
|
+
(0, theme_1.warn)(`Skipping "${name}": invalid entry`);
|
|
90
|
+
skipped++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if ((0, commands_1.commandExists)(name)) {
|
|
94
|
+
// Prompting is only possible on a TTY; in scripts, keep existing entries.
|
|
95
|
+
if (!process.stdin.isTTY) {
|
|
96
|
+
(0, theme_1.warn)(`Skipping "${name}": already exists (non-interactive)`);
|
|
97
|
+
skipped++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const { confirm } = await Promise.resolve().then(() => __importStar(require('../ui/prompts')));
|
|
101
|
+
const overwrite = await confirm(`"${name}" already exists. Overwrite?`);
|
|
102
|
+
if (!overwrite) {
|
|
103
|
+
skipped++;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
(0, commands_1.saveCommand)({
|
|
108
|
+
name,
|
|
109
|
+
command: entry.command,
|
|
110
|
+
directory: entry.directory,
|
|
111
|
+
pathMode: entry.pathMode,
|
|
112
|
+
env: entry.env,
|
|
113
|
+
});
|
|
114
|
+
imported++;
|
|
115
|
+
}
|
|
116
|
+
(0, theme_1.ok)(`Imported ${imported} command${imported === 1 ? '' : 's'}${skipped ? theme_1.theme.dim(` (${skipped} skipped)`) : ''}`);
|
|
117
|
+
}
|
|
118
|
+
//# 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,27 @@
|
|
|
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
|
+
export declare function listCommands(): CommandMap;
|
|
5
|
+
export declare function getCommand(name: string): SavedCommand | undefined;
|
|
6
|
+
export declare function commandExists(name: string): boolean;
|
|
7
|
+
export interface SaveInput {
|
|
8
|
+
name: string;
|
|
9
|
+
command: string;
|
|
10
|
+
directory: string;
|
|
11
|
+
pathMode?: PathMode;
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function saveCommand(input: SaveInput): SavedCommand;
|
|
15
|
+
export declare function deleteCommand(name: string): boolean;
|
|
16
|
+
export declare function renameCommand(from: string, to: string): void;
|
|
17
|
+
/** Case-insensitive search across name, command text, and directory. */
|
|
18
|
+
export declare function searchCommands(query: string): CommandMap;
|
|
19
|
+
export declare function listAliases(): AliasMap;
|
|
20
|
+
export declare function setShortcutAlias(alias: string, commandName: string): void;
|
|
21
|
+
export declare function removeShortcutAlias(alias: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a user-supplied name to a saved command name.
|
|
24
|
+
* Handles direct names, shortcut aliases, and @N recent-history references.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveName(input: string, recent?: string[]): string | undefined;
|
|
27
|
+
//# 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,aAsBzB,CAAC;AAEH,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,CAO5D;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,194 @@
|
|
|
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.listCommands = listCommands;
|
|
38
|
+
exports.getCommand = getCommand;
|
|
39
|
+
exports.commandExists = commandExists;
|
|
40
|
+
exports.saveCommand = saveCommand;
|
|
41
|
+
exports.deleteCommand = deleteCommand;
|
|
42
|
+
exports.renameCommand = renameCommand;
|
|
43
|
+
exports.searchCommands = searchCommands;
|
|
44
|
+
exports.listAliases = listAliases;
|
|
45
|
+
exports.setShortcutAlias = setShortcutAlias;
|
|
46
|
+
exports.removeShortcutAlias = removeShortcutAlias;
|
|
47
|
+
exports.resolveName = resolveName;
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const store_1 = require("./store");
|
|
50
|
+
const ALIASES_KEY = 'command_aliases';
|
|
51
|
+
/** Command names that would shadow CLI subcommands. */
|
|
52
|
+
exports.RESERVED_NAMES = new Set([
|
|
53
|
+
'run',
|
|
54
|
+
'save',
|
|
55
|
+
'prev',
|
|
56
|
+
'list',
|
|
57
|
+
'ls',
|
|
58
|
+
'search',
|
|
59
|
+
'find',
|
|
60
|
+
'edit',
|
|
61
|
+
'delete',
|
|
62
|
+
'rm',
|
|
63
|
+
'export',
|
|
64
|
+
'import',
|
|
65
|
+
'alias',
|
|
66
|
+
'recent',
|
|
67
|
+
'validate',
|
|
68
|
+
'completion',
|
|
69
|
+
'changelog',
|
|
70
|
+
'changes',
|
|
71
|
+
'config',
|
|
72
|
+
'stats',
|
|
73
|
+
'help',
|
|
74
|
+
]);
|
|
75
|
+
function listCommands() {
|
|
76
|
+
return store_1.configFile.read();
|
|
77
|
+
}
|
|
78
|
+
function getCommand(name) {
|
|
79
|
+
return listCommands()[name];
|
|
80
|
+
}
|
|
81
|
+
function commandExists(name) {
|
|
82
|
+
return name in listCommands();
|
|
83
|
+
}
|
|
84
|
+
function saveCommand(input) {
|
|
85
|
+
const name = input.name.trim();
|
|
86
|
+
const command = input.command.trim();
|
|
87
|
+
if (!name)
|
|
88
|
+
throw new Error('Command name cannot be empty');
|
|
89
|
+
if (!/^[\w@.:-]+$/.test(name)) {
|
|
90
|
+
throw new Error('Command name may only contain letters, digits, and - _ . : @');
|
|
91
|
+
}
|
|
92
|
+
if (name.startsWith('@'))
|
|
93
|
+
throw new Error('Names starting with @ are reserved for recent commands');
|
|
94
|
+
if (!command)
|
|
95
|
+
throw new Error('Command cannot be empty');
|
|
96
|
+
if (!input.directory.trim())
|
|
97
|
+
throw new Error('Directory cannot be empty');
|
|
98
|
+
const commands = listCommands();
|
|
99
|
+
const now = new Date().toISOString();
|
|
100
|
+
const entry = {
|
|
101
|
+
command,
|
|
102
|
+
directory: path.resolve(input.directory),
|
|
103
|
+
pathMode: input.pathMode ?? 'saved',
|
|
104
|
+
...(input.env && Object.keys(input.env).length > 0 ? { env: input.env } : {}),
|
|
105
|
+
createdAt: commands[name]?.createdAt ?? now,
|
|
106
|
+
updatedAt: now,
|
|
107
|
+
};
|
|
108
|
+
store_1.configFile.update((data) => {
|
|
109
|
+
data[name] = entry;
|
|
110
|
+
});
|
|
111
|
+
return entry;
|
|
112
|
+
}
|
|
113
|
+
function deleteCommand(name) {
|
|
114
|
+
if (!commandExists(name))
|
|
115
|
+
return false;
|
|
116
|
+
store_1.configFile.update((data) => {
|
|
117
|
+
delete data[name];
|
|
118
|
+
});
|
|
119
|
+
// Drop shortcut aliases that pointed at the deleted command.
|
|
120
|
+
const aliases = listAliases();
|
|
121
|
+
const orphaned = Object.keys(aliases).filter((a) => aliases[a] === name);
|
|
122
|
+
if (orphaned.length > 0) {
|
|
123
|
+
for (const a of orphaned)
|
|
124
|
+
delete aliases[a];
|
|
125
|
+
(0, store_1.setMetadata)(ALIASES_KEY, aliases);
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
function renameCommand(from, to) {
|
|
130
|
+
const commands = listCommands();
|
|
131
|
+
const existing = commands[from];
|
|
132
|
+
if (!existing)
|
|
133
|
+
throw new Error(`Command "${from}" not found`);
|
|
134
|
+
if (commandExists(to))
|
|
135
|
+
throw new Error(`Command "${to}" already exists`);
|
|
136
|
+
saveCommand({ name: to, ...existing });
|
|
137
|
+
deleteCommand(from);
|
|
138
|
+
}
|
|
139
|
+
/** Case-insensitive search across name, command text, and directory. */
|
|
140
|
+
function searchCommands(query) {
|
|
141
|
+
const q = query.toLowerCase();
|
|
142
|
+
const result = {};
|
|
143
|
+
for (const [name, cmd] of Object.entries(listCommands())) {
|
|
144
|
+
if (name.toLowerCase().includes(q) ||
|
|
145
|
+
cmd.command.toLowerCase().includes(q) ||
|
|
146
|
+
cmd.directory.toLowerCase().includes(q)) {
|
|
147
|
+
result[name] = cmd;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
// --- Shortcut aliases -------------------------------------------------------
|
|
153
|
+
function listAliases() {
|
|
154
|
+
return { ...((0, store_1.getMetadata)(ALIASES_KEY) ?? {}) };
|
|
155
|
+
}
|
|
156
|
+
function setShortcutAlias(alias, commandName) {
|
|
157
|
+
const a = alias.trim();
|
|
158
|
+
if (!a)
|
|
159
|
+
throw new Error('Alias cannot be empty');
|
|
160
|
+
if (exports.RESERVED_NAMES.has(a))
|
|
161
|
+
throw new Error(`"${a}" is a reserved name`);
|
|
162
|
+
if (commandExists(a))
|
|
163
|
+
throw new Error(`"${a}" is already a saved command name`);
|
|
164
|
+
if (!commandExists(commandName))
|
|
165
|
+
throw new Error(`Command "${commandName}" not found`);
|
|
166
|
+
const aliases = listAliases();
|
|
167
|
+
aliases[a] = commandName;
|
|
168
|
+
(0, store_1.setMetadata)(ALIASES_KEY, aliases);
|
|
169
|
+
}
|
|
170
|
+
function removeShortcutAlias(alias) {
|
|
171
|
+
const aliases = listAliases();
|
|
172
|
+
if (!(alias in aliases))
|
|
173
|
+
return false;
|
|
174
|
+
delete aliases[alias];
|
|
175
|
+
(0, store_1.setMetadata)(ALIASES_KEY, aliases);
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Resolve a user-supplied name to a saved command name.
|
|
180
|
+
* Handles direct names, shortcut aliases, and @N recent-history references.
|
|
181
|
+
*/
|
|
182
|
+
function resolveName(input, recent = []) {
|
|
183
|
+
if (input.startsWith('@')) {
|
|
184
|
+
const index = Number(input.slice(1));
|
|
185
|
+
if (!Number.isInteger(index) || index < 0)
|
|
186
|
+
return undefined;
|
|
187
|
+
return recent[index];
|
|
188
|
+
}
|
|
189
|
+
if (commandExists(input))
|
|
190
|
+
return input;
|
|
191
|
+
const target = listAliases()[input];
|
|
192
|
+
return target && commandExists(target) ? target : undefined;
|
|
193
|
+
}
|
|
194
|
+
//# 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"}
|
package/dist/core/env.js
ADDED
|
@@ -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
|
-
*
|
|
45
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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"}
|
|
@@ -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
|