aliasmate 2.0.0 → 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.
- package/CHANGELOG.md +38 -3
- package/README.md +43 -10
- package/dist/cli/completion.js +4 -4
- package/dist/cli/completion.js.map +1 -1
- package/dist/cli/manage.d.ts +2 -3
- package/dist/cli/manage.d.ts.map +1 -1
- package/dist/cli/manage.js +44 -26
- package/dist/cli/manage.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +14 -12
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/save.d.ts +7 -8
- package/dist/cli/save.d.ts.map +1 -1
- package/dist/cli/save.js +71 -33
- package/dist/cli/save.js.map +1 -1
- package/dist/cli/transfer.d.ts +1 -0
- package/dist/cli/transfer.d.ts.map +1 -1
- package/dist/cli/transfer.js +40 -59
- package/dist/cli/transfer.js.map +1 -1
- package/dist/core/commands.d.ts +2 -0
- package/dist/core/commands.d.ts.map +1 -1
- package/dist/core/commands.js +40 -2
- package/dist/core/commands.js.map +1 -1
- package/dist/core/transfer.d.ts +20 -0
- package/dist/core/transfer.d.ts.map +1 -0
- package/dist/core/transfer.js +110 -0
- package/dist/core/transfer.js.map +1 -0
- package/dist/index.js +14 -11
- package/dist/index.js.map +1 -1
- package/dist/ui/format.d.ts +4 -1
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +61 -18
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/interactive.d.ts +59 -3
- package/dist/ui/interactive.d.ts.map +1 -1
- package/dist/ui/interactive.js +604 -94
- package/dist/ui/interactive.js.map +1 -1
- package/dist/ui/onboarding.d.ts.map +1 -1
- package/dist/ui/onboarding.js +7 -7
- package/dist/ui/onboarding.js.map +1 -1
- package/dist/ui/prompts.d.ts +1 -12
- package/dist/ui/prompts.d.ts.map +1 -1
- package/dist/ui/prompts.js +45 -91
- package/dist/ui/prompts.js.map +1 -1
- package/dist/ui/table.d.ts +18 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +54 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/theme.d.ts +8 -6
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js +33 -18
- package/dist/ui/theme.js.map +1 -1
- package/package.json +7 -7
package/dist/cli/save.js
CHANGED
|
@@ -1,52 +1,90 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.saveHandler = saveHandler;
|
|
4
37
|
exports.prevHandler = prevHandler;
|
|
5
38
|
const commands_1 = require("../core/commands");
|
|
6
39
|
const history_1 = require("../core/history");
|
|
7
|
-
const validate_1 = require("../core/validate");
|
|
8
|
-
const commands_2 = require("../core/commands");
|
|
9
|
-
const prompts_1 = require("../ui/prompts");
|
|
10
40
|
const theme_1 = require("../ui/theme");
|
|
11
|
-
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
41
|
+
function requireTty() {
|
|
42
|
+
if (process.stdin.isTTY && process.stdout.isTTY)
|
|
43
|
+
return true;
|
|
44
|
+
(0, theme_1.fail)('This command needs an interactive terminal.');
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
/** `aliasmate save` — opens the TUI with a blank new-command form. */
|
|
49
|
+
async function saveHandler() {
|
|
50
|
+
if (!requireTty())
|
|
51
|
+
return;
|
|
52
|
+
const { interactiveHome } = await Promise.resolve().then(() => __importStar(require('../ui/interactive')));
|
|
53
|
+
await interactiveHome({});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* `aliasmate prev [name]` — captures your last shell command and opens the
|
|
57
|
+
* TUI form prefilled with it. In scripts (no TTY) it saves directly.
|
|
58
|
+
*/
|
|
59
|
+
async function prevHandler(name) {
|
|
60
|
+
if (name) {
|
|
61
|
+
const nameCheck = (0, commands_1.validateCommandName)(name);
|
|
62
|
+
if (nameCheck !== true) {
|
|
63
|
+
(0, theme_1.fail)(nameCheck);
|
|
64
|
+
process.exitCode = 1;
|
|
19
65
|
return;
|
|
20
66
|
}
|
|
21
67
|
}
|
|
22
|
-
(0, commands_1.saveCommand)(details);
|
|
23
|
-
if (validate) {
|
|
24
|
-
const issues = (0, validate_1.validateSavedCommand)((0, commands_2.getCommand)(details.name));
|
|
25
|
-
for (const issue of issues)
|
|
26
|
-
(0, theme_1.warn)(issue.message);
|
|
27
|
-
}
|
|
28
|
-
(0, theme_1.ok)(`Saved ${theme_1.theme.name(details.name)}`);
|
|
29
|
-
console.log(theme_1.theme.dim(` ${details.command}`));
|
|
30
|
-
console.log(theme_1.theme.dim(` in ${details.directory} (${details.pathMode} mode)`));
|
|
31
|
-
console.log(theme_1.theme.dim(`\n Run it anytime: aliasmate run ${details.name}`));
|
|
32
|
-
}
|
|
33
|
-
/** `aliasmate save` — interactive save. */
|
|
34
|
-
async function saveHandler(options) {
|
|
35
|
-
const details = await (0, prompts_1.promptCommandDetails)({}, process.cwd());
|
|
36
|
-
await persist(details, options.validate !== false);
|
|
37
|
-
}
|
|
38
|
-
/** `aliasmate prev <name>` — save the last command from shell history. */
|
|
39
|
-
async function prevHandler(name, options) {
|
|
40
68
|
const lastCommand = (0, history_1.getLastCommand)();
|
|
41
69
|
if (!lastCommand) {
|
|
42
70
|
(0, theme_1.fail)('Could not read the previous command from shell history.');
|
|
43
71
|
console.log(theme_1.theme.dim(`\n${(0, history_1.getHistoryConfigHint)()}`));
|
|
44
|
-
console.log(theme_1.theme.dim('Or
|
|
72
|
+
console.log(theme_1.theme.dim('Or create one manually with: aliasmate save'));
|
|
45
73
|
process.exitCode = 1;
|
|
46
74
|
return;
|
|
47
75
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
76
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
77
|
+
// Non-interactive: save directly with sensible defaults.
|
|
78
|
+
if (!name) {
|
|
79
|
+
(0, theme_1.fail)('A name is required when running non-interactively: aliasmate prev <name>');
|
|
80
|
+
process.exitCode = 1;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
(0, commands_1.saveCommand)({ name, command: lastCommand, directory: process.cwd() });
|
|
84
|
+
(0, theme_1.ok)(`saved ${theme_1.theme.name(name)} ${theme_1.theme.dim(`· ${lastCommand}`)}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const { interactiveHome } = await Promise.resolve().then(() => __importStar(require('../ui/interactive')));
|
|
88
|
+
await interactiveHome({ name, command: lastCommand, directory: process.cwd() });
|
|
51
89
|
}
|
|
52
90
|
//# sourceMappingURL=save.js.map
|
package/dist/cli/save.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/cli/save.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/cli/save.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,kCAIC;AAMD,kCAiCC;AAvDD,+CAAoE;AACpE,6CAAuE;AACvE,uCAA8C;AAE9C,SAAS,UAAU;IACjB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAA,YAAI,EAAC,6CAA6C,CAAC,CAAC;IACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sEAAsE;AAC/D,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,UAAU,EAAE;QAAE,OAAO;IAC1B,MAAM,EAAE,eAAe,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;IAC9D,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,IAAwB;IACxD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,SAAS,GAAG,IAAA,8BAAmB,EAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAA,YAAI,EAAC,SAAS,CAAC,CAAC;YAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,wBAAc,GAAE,CAAC;IACrC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAA,YAAI,EAAC,yDAAyD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,GAAG,CAAC,KAAK,IAAA,8BAAoB,GAAE,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,yDAAyD;QACzD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAA,YAAI,EAAC,0EAA0E,CAAC,CAAC;YACjF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAA,sBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtE,IAAA,UAAE,EAAC,SAAS,aAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAK,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,EAAE,eAAe,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;IAC9D,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC"}
|
package/dist/cli/transfer.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/cli/transfer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/cli/transfer.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA0B9F;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC/D"}
|
package/dist/cli/transfer.js
CHANGED
|
@@ -36,83 +36,64 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.exportHandler = exportHandler;
|
|
37
37
|
exports.importHandler = importHandler;
|
|
38
38
|
const fs = __importStar(require("fs"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
39
|
const commands_1 = require("../core/commands");
|
|
40
|
+
const transfer_1 = require("../core/transfer");
|
|
41
41
|
const format_1 = require("../ui/format");
|
|
42
|
-
const store_1 = require("../core/store");
|
|
43
42
|
const theme_1 = require("../ui/theme");
|
|
44
43
|
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
44
|
const format = options.format ?? (file.endsWith('.yaml') || file.endsWith('.yml') ? 'yaml' : 'json');
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
+
}
|
|
61
66
|
}
|
|
62
67
|
async function importHandler(file) {
|
|
63
|
-
const resolved =
|
|
68
|
+
const resolved = (0, transfer_1.expandPath)(file);
|
|
64
69
|
if (!fs.existsSync(resolved)) {
|
|
65
70
|
(0, theme_1.fail)(`File not found: ${file}`);
|
|
66
71
|
process.exitCode = 1;
|
|
67
72
|
return;
|
|
68
73
|
}
|
|
69
|
-
|
|
74
|
+
// Decide the conflict policy up front with a single confirmation.
|
|
75
|
+
let overwrite = false;
|
|
70
76
|
try {
|
|
71
|
-
incoming = JSON.parse(fs.readFileSync(resolved, 'utf8'));
|
|
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
|
+
}
|
|
72
85
|
}
|
|
73
86
|
catch {
|
|
74
87
|
(0, theme_1.fail)('Could not parse the import file (JSON expected)');
|
|
75
88
|
process.exitCode = 1;
|
|
76
89
|
return;
|
|
77
90
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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)`) : ''}`);
|
|
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}`);
|
|
117
98
|
}
|
|
118
99
|
//# sourceMappingURL=transfer.js.map
|
package/dist/cli/transfer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/cli/transfer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/cli/transfer.ts"],"names":[],"mappings":"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"}
|
package/dist/core/commands.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { CommandMap, AliasMap, PathMode, SavedCommand } from './types';
|
|
2
2
|
/** Command names that would shadow CLI subcommands. */
|
|
3
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;
|
|
4
6
|
export declare function listCommands(): CommandMap;
|
|
5
7
|
export declare function getCommand(name: string): SavedCommand | undefined;
|
|
6
8
|
export declare function commandExists(name: string): boolean;
|
|
@@ -1 +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,
|
|
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"}
|
package/dist/core/commands.js
CHANGED
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.RESERVED_NAMES = void 0;
|
|
37
|
+
exports.validateCommandName = validateCommandName;
|
|
37
38
|
exports.listCommands = listCommands;
|
|
38
39
|
exports.getCommand = getCommand;
|
|
39
40
|
exports.commandExists = commandExists;
|
|
@@ -58,6 +59,8 @@ exports.RESERVED_NAMES = new Set([
|
|
|
58
59
|
'search',
|
|
59
60
|
'find',
|
|
60
61
|
'edit',
|
|
62
|
+
'rename',
|
|
63
|
+
'mv',
|
|
61
64
|
'delete',
|
|
62
65
|
'rm',
|
|
63
66
|
'export',
|
|
@@ -72,6 +75,21 @@ exports.RESERVED_NAMES = new Set([
|
|
|
72
75
|
'stats',
|
|
73
76
|
'help',
|
|
74
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
|
+
}
|
|
75
93
|
function listCommands() {
|
|
76
94
|
return store_1.configFile.read();
|
|
77
95
|
}
|
|
@@ -131,10 +149,30 @@ function renameCommand(from, to) {
|
|
|
131
149
|
const existing = commands[from];
|
|
132
150
|
if (!existing)
|
|
133
151
|
throw new Error(`Command "${from}" not found`);
|
|
152
|
+
const nameCheck = validateCommandName(to);
|
|
153
|
+
if (nameCheck !== true)
|
|
154
|
+
throw new Error(nameCheck);
|
|
134
155
|
if (commandExists(to))
|
|
135
156
|
throw new Error(`Command "${to}" already exists`);
|
|
136
|
-
|
|
137
|
-
|
|
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
|
+
}
|
|
138
176
|
}
|
|
139
177
|
/** Case-insensitive search across name, command text, and directory. */
|
|
140
178
|
function searchCommands(query) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/core/commands.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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"}
|
package/dist/index.js
CHANGED
|
@@ -67,14 +67,12 @@ program
|
|
|
67
67
|
.action((name, pathOverride, options) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/run')))).runHandler(name, pathOverride, options)));
|
|
68
68
|
program
|
|
69
69
|
.command('save')
|
|
70
|
-
.description('
|
|
71
|
-
.
|
|
72
|
-
.action((options) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/save')))).saveHandler(options)));
|
|
70
|
+
.description('Open the TUI with a blank new-command form')
|
|
71
|
+
.action(() => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/save')))).saveHandler()));
|
|
73
72
|
program
|
|
74
|
-
.command('prev
|
|
75
|
-
.description('
|
|
76
|
-
.
|
|
77
|
-
.action((name, options) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/save')))).prevHandler(name, options)));
|
|
73
|
+
.command('prev [name]')
|
|
74
|
+
.description('Capture your previous shell command and open the TUI form prefilled')
|
|
75
|
+
.action((name) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/save')))).prevHandler(name)));
|
|
78
76
|
program
|
|
79
77
|
.command('list')
|
|
80
78
|
.alias('ls')
|
|
@@ -93,9 +91,13 @@ program
|
|
|
93
91
|
.action((query) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/manage')))).searchHandler(query)));
|
|
94
92
|
program
|
|
95
93
|
.command('edit <name>')
|
|
96
|
-
.description('Edit a saved command')
|
|
97
|
-
.
|
|
98
|
-
|
|
94
|
+
.description('Edit a saved command in the TUI')
|
|
95
|
+
.action((name) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/manage')))).editHandler(name)));
|
|
96
|
+
program
|
|
97
|
+
.command('rename <old> <new>')
|
|
98
|
+
.alias('mv')
|
|
99
|
+
.description('Rename a saved command (aliases and history follow)')
|
|
100
|
+
.action((oldName, newName) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/manage')))).renameHandler(oldName, newName)));
|
|
99
101
|
program
|
|
100
102
|
.command('delete <name>')
|
|
101
103
|
.alias('rm')
|
|
@@ -125,8 +127,9 @@ program
|
|
|
125
127
|
.action((name, options) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/manage')))).validateHandler(options.all ? undefined : name)));
|
|
126
128
|
program
|
|
127
129
|
.command('export <file>')
|
|
128
|
-
.description('Export commands to a JSON or YAML file (secrets masked)')
|
|
130
|
+
.description('Export commands to a JSON or YAML file (secrets masked unless --full)')
|
|
129
131
|
.option('--format <type>', 'json or yaml')
|
|
132
|
+
.option('--full', 'Include real secret env values (restorable backup)')
|
|
130
133
|
.action((file, options) => wrap(async () => (await Promise.resolve().then(() => __importStar(require('./cli/transfer')))).exportHandler(file, options)));
|
|
131
134
|
program
|
|
132
135
|
.command('import <file>')
|