@lenne.tech/cli 1.5.0 → 1.6.1
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/README.md +30 -0
- package/bin/postinstall.js +156 -0
- package/build/cli.js +11 -1
- package/build/commands/blocks/add.js +28 -306
- package/build/commands/blocks/blocks.js +2 -2
- package/build/commands/claude/claude.js +2 -2
- package/build/commands/cli/cli.js +2 -2
- package/build/commands/cli/create.js +69 -21
- package/build/commands/cli/rename.js +11 -5
- package/build/commands/completion.js +311 -0
- package/build/commands/components/add.js +25 -219
- package/build/commands/components/components.js +2 -2
- package/build/commands/config/help.js +5 -2
- package/build/commands/config/init.js +20 -5
- package/build/commands/config/show.js +4 -1
- package/build/commands/config/validate.js +27 -2
- package/build/commands/deployment/create.js +18 -5
- package/build/commands/deployment/deployment.js +2 -2
- package/build/commands/docs/open.js +4 -1
- package/build/commands/doctor.js +285 -0
- package/build/commands/frontend/angular.js +88 -28
- package/build/commands/frontend/nuxt.js +2 -1
- package/build/commands/fullstack/init.js +58 -19
- package/build/commands/git/clean.js +60 -11
- package/build/commands/git/clear.js +17 -11
- package/build/commands/git/create.js +51 -10
- package/build/commands/git/force-pull.js +42 -15
- package/build/commands/git/get.js +14 -15
- package/build/commands/git/install-scripts.js +6 -6
- package/build/commands/git/rebase.js +40 -12
- package/build/commands/git/rename.js +33 -13
- package/build/commands/git/reset.js +48 -13
- package/build/commands/git/squash.js +67 -26
- package/build/commands/git/undo.js +33 -13
- package/build/commands/git/update.js +59 -6
- package/build/commands/history.js +75 -0
- package/build/commands/mongodb/collection-export.js +2 -2
- package/build/commands/mongodb/mongodb.js +2 -2
- package/build/commands/mongodb/s3-restore.js +2 -2
- package/build/commands/npm/reinit.js +11 -12
- package/build/commands/npm/update.js +6 -2
- package/build/commands/qdrant/delete.js +6 -2
- package/build/commands/qdrant/qdrant.js +2 -2
- package/build/commands/qdrant/stats.js +5 -2
- package/build/commands/redis/redis.js +2 -2
- package/build/commands/server/add-property.js +8 -12
- package/build/commands/server/create-secret.js +6 -3
- package/build/commands/server/create.js +39 -21
- package/build/commands/server/module.js +22 -16
- package/build/commands/server/object.js +7 -11
- package/build/commands/server/set-secrets.js +6 -3
- package/build/commands/server/test.js +3 -3
- package/build/commands/starter/chrome-extension.js +3 -3
- package/build/commands/status.js +198 -0
- package/build/commands/templates/list.js +107 -0
- package/build/commands/templates/llm.js +8 -3
- package/build/commands/templates/templates.js +2 -2
- package/build/commands/tools/jwt-read.js +2 -2
- package/build/commands/tools/regex.js +5 -2
- package/build/commands/typescript/create.js +84 -21
- package/build/commands/typescript/playground.js +5 -2
- package/build/extensions/config.js +37 -1
- package/build/extensions/git.js +57 -2
- package/build/extensions/history.js +118 -0
- package/build/extensions/logger.js +189 -0
- package/build/lib/nuxt-base-components.js +249 -0
- package/build/lib/validation.js +204 -0
- package/build/templates/completion/bash.sh.ejs +92 -0
- package/build/templates/completion/fish.sh.ejs +77 -0
- package/build/templates/completion/zsh.sh.ejs +119 -0
- package/docs/commands.md +464 -14
- package/docs/lt.config.md +138 -8
- package/package.json +16 -14
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
* Claude commands
|
|
14
14
|
*/
|
|
15
15
|
module.exports = {
|
|
16
|
-
alias: ['
|
|
16
|
+
alias: ['ai'],
|
|
17
17
|
description: 'Claude commands',
|
|
18
18
|
hidden: true,
|
|
19
19
|
name: 'claude',
|
|
@@ -22,4 +22,4 @@ module.exports = {
|
|
|
22
22
|
return 'claude';
|
|
23
23
|
}),
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhdWRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NsYXVkZS9jbGF1ZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLEdBQUc7SUFDZixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDYixXQUFXLEVBQUUsaUJBQWlCO0lBQzlCLE1BQU0sRUFBRSxJQUFJO0lBQ1osSUFBSSxFQUFFLFFBQVE7SUFDZCxHQUFHLEVBQUUsQ0FBTyxPQUErQixFQUFFLEVBQUU7UUFDN0MsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUE7Q0FDRixDQUFDIn0=
|
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
* CLI commands
|
|
14
14
|
*/
|
|
15
15
|
module.exports = {
|
|
16
|
-
alias: ['
|
|
16
|
+
alias: ['cl'],
|
|
17
17
|
description: 'Commands to create a CLI',
|
|
18
18
|
hidden: true,
|
|
19
19
|
name: 'cli',
|
|
@@ -22,4 +22,4 @@ module.exports = {
|
|
|
22
22
|
return 'cli';
|
|
23
23
|
}),
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NsaS9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLEdBQUc7SUFDZixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDYixXQUFXLEVBQUUsMEJBQTBCO0lBQ3ZDLE1BQU0sRUFBRSxJQUFJO0lBQ1osSUFBSSxFQUFFLEtBQUs7SUFDWCxHQUFHLEVBQUUsQ0FBTyxPQUErQixFQUFFLEVBQUU7UUFDN0MsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNuRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQTtDQUNGLENBQUMifQ==
|
|
@@ -18,14 +18,21 @@ const NewCommand = {
|
|
|
18
18
|
hidden: false,
|
|
19
19
|
name: 'create',
|
|
20
20
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
-
var _a, _b, _c;
|
|
21
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
22
22
|
// Retrieve the tools we need
|
|
23
23
|
const { config, filesystem, git, helper, meta, parameters, print: { error, info, spin, success }, prompt: { ask }, strings: { kebabCase }, system, } = toolbox;
|
|
24
24
|
// Load configuration
|
|
25
25
|
const ltConfig = config.loadConfig();
|
|
26
26
|
const configAuthor = (_c = (_b = (_a = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _a === void 0 ? void 0 : _a.cli) === null || _b === void 0 ? void 0 : _b.create) === null || _c === void 0 ? void 0 : _c.author;
|
|
27
|
+
const configLink = (_f = (_e = (_d = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _d === void 0 ? void 0 : _d.cli) === null || _e === void 0 ? void 0 : _e.create) === null || _f === void 0 ? void 0 : _f.link;
|
|
27
28
|
// Load global defaults
|
|
28
29
|
const globalAuthor = config.getGlobalDefault(ltConfig, 'author');
|
|
30
|
+
// Determine noConfirm with priority: CLI > command > global > default
|
|
31
|
+
const noConfirm = config.getNoConfirm({
|
|
32
|
+
cliValue: parameters.options.noConfirm || parameters.options.y,
|
|
33
|
+
commandConfig: (_h = (_g = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _g === void 0 ? void 0 : _g.cli) === null || _h === void 0 ? void 0 : _h.create,
|
|
34
|
+
config: ltConfig,
|
|
35
|
+
});
|
|
29
36
|
// Info
|
|
30
37
|
info('Create a new CLI');
|
|
31
38
|
// Check git
|
|
@@ -63,9 +70,22 @@ const NewCommand = {
|
|
|
63
70
|
if (!author) {
|
|
64
71
|
return;
|
|
65
72
|
}
|
|
66
|
-
//
|
|
67
|
-
let link
|
|
68
|
-
if (
|
|
73
|
+
// Determine link with priority: CLI > config > interactive
|
|
74
|
+
let link;
|
|
75
|
+
if (parameters.options.link) {
|
|
76
|
+
link = true;
|
|
77
|
+
}
|
|
78
|
+
else if (parameters.options.nolink) {
|
|
79
|
+
link = false;
|
|
80
|
+
}
|
|
81
|
+
else if (configLink !== undefined) {
|
|
82
|
+
link = configLink;
|
|
83
|
+
info(`Using link from lt.config commands.cli.create: ${link}`);
|
|
84
|
+
}
|
|
85
|
+
else if (noConfirm) {
|
|
86
|
+
link = false; // Default to false when noConfirm is set
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
69
89
|
link = !!(yield ask({
|
|
70
90
|
message: 'Link when finished?',
|
|
71
91
|
name: 'link',
|
|
@@ -80,37 +100,65 @@ const NewCommand = {
|
|
|
80
100
|
if (filesystem.exists(projectDir)) {
|
|
81
101
|
info('');
|
|
82
102
|
error(`There's already a folder named "${projectDir}" here.`);
|
|
83
|
-
return
|
|
103
|
+
return;
|
|
84
104
|
}
|
|
85
105
|
// Clone git repository
|
|
86
106
|
const cloneSpinner = spin('Clone https://github.com/lenneTech/cli-starter.git');
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
filesystem.
|
|
90
|
-
|
|
107
|
+
try {
|
|
108
|
+
yield system.run(`git clone https://github.com/lenneTech/cli-starter.git ${projectDir}`);
|
|
109
|
+
if (filesystem.isDirectory(`./${projectDir}`)) {
|
|
110
|
+
filesystem.remove(`./${projectDir}/.git`);
|
|
111
|
+
cloneSpinner.succeed('Repository cloned from https://github.com/lenneTech/cli-starter.git');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
cloneSpinner.fail(`The directory "${projectDir}" could not be created.`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
91
117
|
}
|
|
92
|
-
|
|
93
|
-
cloneSpinner.fail(`
|
|
94
|
-
return
|
|
118
|
+
catch (err) {
|
|
119
|
+
cloneSpinner.fail(`Failed to clone repository: ${err.message}`);
|
|
120
|
+
return;
|
|
95
121
|
}
|
|
96
122
|
// Install packages
|
|
97
123
|
const installSpinner = spin('Install npm packages');
|
|
98
|
-
|
|
99
|
-
|
|
124
|
+
try {
|
|
125
|
+
yield system.run(`cd ${projectDir} && npm i`);
|
|
126
|
+
installSpinner.succeed('NPM packages installed');
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
installSpinner.fail(`Failed to install npm packages: ${err.message}`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
100
132
|
// Rename files and data
|
|
101
133
|
const renameSpinner = spin(`Rename files & data ${link ? ' and link' : ''}`);
|
|
102
|
-
|
|
103
|
-
|
|
134
|
+
try {
|
|
135
|
+
yield system.run(`cd ${projectDir} && npm run rename -- "${name}" --author "${author}" --${link ? 'link' : 'nolink'}`);
|
|
136
|
+
renameSpinner.succeed(`Files & data renamed${link ? ' and linked' : ''}`);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
renameSpinner.fail(`Failed to rename files: ${err.message}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
104
142
|
// Init git
|
|
105
143
|
const initGitSpinner = spin('Initialize git');
|
|
106
|
-
|
|
107
|
-
|
|
144
|
+
try {
|
|
145
|
+
yield system.run(`cd ${projectDir} && git init && git add . && git commit -am "Init via lenne.Tech CLI ${meta.version()}"`);
|
|
146
|
+
initGitSpinner.succeed('Git initialized');
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
initGitSpinner.fail(`Failed to initialize git: ${err.message}`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
108
152
|
// We're done, so show what to do next
|
|
109
153
|
info('');
|
|
110
|
-
success(`Generated ${name}
|
|
154
|
+
success(`Generated ${name} CLI with lenne.Tech CLI ${meta.version()} in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
155
|
+
// Exit if not running from menu
|
|
156
|
+
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
157
|
+
process.exit();
|
|
158
|
+
}
|
|
111
159
|
// For tests
|
|
112
|
-
return `
|
|
160
|
+
return `created cli ${name}`;
|
|
113
161
|
}),
|
|
114
162
|
};
|
|
115
163
|
exports.default = NewCommand;
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NsaS9jcmVhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQTs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFtQjtJQUNqQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsd0JBQXdCO0lBQ3JDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxHQUFHLEVBQUUsQ0FBTyxPQUErQixFQUFFLEVBQUU7O1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osTUFBTSxFQUNOLFVBQVUsRUFDVixHQUFHLEVBQ0gsTUFBTSxFQUNOLElBQUksRUFDSixVQUFVLEVBQ1YsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQ3JDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUNmLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUN0QixNQUFNLEdBQ1AsR0FBRyxPQUFPLENBQUM7UUFFWixxQkFBcUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sWUFBWSxHQUFHLE1BQUEsTUFBQSxNQUFBLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxRQUFRLDBDQUFFLEdBQUcsMENBQUUsTUFBTSwwQ0FBRSxNQUFNLENBQUM7UUFDN0QsTUFBTSxVQUFVLEdBQUcsTUFBQSxNQUFBLE1BQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLFFBQVEsMENBQUUsR0FBRywwQ0FBRSxNQUFNLDBDQUFFLElBQUksQ0FBQztRQUV6RCx1QkFBdUI7UUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFTLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV6RSxzRUFB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
|
|
@@ -20,23 +20,29 @@ const NewCommand = {
|
|
|
20
20
|
name: 'rename',
|
|
21
21
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
22
|
// Retrieve the tools we need
|
|
23
|
-
const { npm, parameters, print: { error }, system, } = toolbox;
|
|
23
|
+
const { npm, parameters, print: { error, info }, system, } = toolbox;
|
|
24
|
+
// Info
|
|
25
|
+
info('Rename current CLI');
|
|
24
26
|
// Get root path
|
|
25
27
|
const { path: packagePath } = yield npm.getPackageJson();
|
|
26
28
|
if (!packagePath) {
|
|
27
29
|
error('The path to the root directory could not be found.');
|
|
28
|
-
return
|
|
30
|
+
return;
|
|
29
31
|
}
|
|
30
32
|
const rootPath = (0, path_1.dirname)(packagePath);
|
|
31
33
|
if (!rootPath) {
|
|
32
34
|
error('The path to the root directory could not be found.');
|
|
33
|
-
return
|
|
35
|
+
return;
|
|
34
36
|
}
|
|
35
37
|
// Run rename script
|
|
36
38
|
yield system.run(`cd ${rootPath} && npm run rename -- ${parameters.string}`);
|
|
39
|
+
// Exit if not running from menu
|
|
40
|
+
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
41
|
+
process.exit();
|
|
42
|
+
}
|
|
37
43
|
// For tests
|
|
38
|
-
return
|
|
44
|
+
return `renamed cli in ${rootPath}`;
|
|
39
45
|
}),
|
|
40
46
|
};
|
|
41
47
|
exports.default = NewCommand;
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NsaS9yZW5hbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQSwrQkFBK0I7QUFJL0I7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ1osV0FBVyxFQUFFLG9CQUFvQjtJQUNqQyxNQUFNLEVBQUUsS0FBSztJQUNiLElBQUksRUFBRSxRQUFRO0lBQ2QsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osR0FBRyxFQUNILFVBQVUsRUFDVixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQ3RCLE1BQU0sR0FDUCxHQUFHLE9BQU8sQ0FBQztRQUVaLE9BQU87UUFDUCxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUzQixnQkFBZ0I7UUFDaEIsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDNUQsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFBLGNBQU8sRUFBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztZQUM1RCxPQUFPO1FBQ1QsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxRQUFRLHlCQUF5QixVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUU3RSxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBRUQsWUFBWTtRQUNaLE9BQU8sa0JBQWtCLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUMsQ0FBQTtDQUNGLENBQUM7QUFFRixrQkFBZSxVQUFVLENBQUMifQ==
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const ejs = require("ejs");
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const os_1 = require("os");
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
/**
|
|
17
|
+
* Detect user's shell
|
|
18
|
+
*/
|
|
19
|
+
function detectShell() {
|
|
20
|
+
const shell = process.env.SHELL || '';
|
|
21
|
+
if (shell.includes('zsh'))
|
|
22
|
+
return 'zsh';
|
|
23
|
+
if (shell.includes('fish'))
|
|
24
|
+
return 'fish';
|
|
25
|
+
return 'bash';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Discover commands recursively as a tree structure
|
|
29
|
+
* Supports arbitrary nesting depth
|
|
30
|
+
*/
|
|
31
|
+
function discoverCommandTree(dir = __dirname, parentPath = '') {
|
|
32
|
+
const nodes = [];
|
|
33
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
34
|
+
return nodes;
|
|
35
|
+
}
|
|
36
|
+
const entries = (0, fs_1.readdirSync)(dir);
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
const entryPath = (0, path_1.join)(dir, entry);
|
|
39
|
+
const stat = (0, fs_1.statSync)(entryPath);
|
|
40
|
+
if (stat.isDirectory()) {
|
|
41
|
+
// This is a command group (git, server, config, etc.)
|
|
42
|
+
const groupName = entry;
|
|
43
|
+
const nodePath = parentPath ? `${parentPath}_${groupName}` : groupName;
|
|
44
|
+
// Recursively get children
|
|
45
|
+
const children = discoverCommandTree(entryPath, nodePath);
|
|
46
|
+
// Filter out the parent command file from children
|
|
47
|
+
const filteredChildren = children.filter((c) => c.name !== groupName);
|
|
48
|
+
// Only add if it has visible children
|
|
49
|
+
if (filteredChildren.length > 0) {
|
|
50
|
+
nodes.push({
|
|
51
|
+
children: filteredChildren,
|
|
52
|
+
description: `${groupName.charAt(0).toUpperCase()}${groupName.slice(1)} commands`,
|
|
53
|
+
name: groupName,
|
|
54
|
+
path: nodePath,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (stat.isFile() && (entry.endsWith('.js') || entry.endsWith('.ts'))) {
|
|
59
|
+
const name = (0, path_1.basename)(entry, '.js').replace('.ts', '');
|
|
60
|
+
// Skip internal files (lt.ts is the main entry point)
|
|
61
|
+
if (name === 'lt')
|
|
62
|
+
continue;
|
|
63
|
+
const cmdInfo = extractCommandInfo(entryPath);
|
|
64
|
+
if (cmdInfo && !cmdInfo.hidden) {
|
|
65
|
+
const nodePath = parentPath ? `${parentPath}_${name}` : name;
|
|
66
|
+
nodes.push({
|
|
67
|
+
children: [],
|
|
68
|
+
description: cmdInfo.description,
|
|
69
|
+
name: cmdInfo.name,
|
|
70
|
+
path: nodePath,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return nodes.sort((a, b) => a.name.localeCompare(b.name));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract command info from a command file
|
|
79
|
+
* Uses require() for both .js and .ts files (ts-node handles .ts in dev mode)
|
|
80
|
+
*/
|
|
81
|
+
function extractCommandInfo(filePath) {
|
|
82
|
+
try {
|
|
83
|
+
const cmd = require(filePath);
|
|
84
|
+
const command = cmd.default || cmd;
|
|
85
|
+
// Validate that we got a proper command object
|
|
86
|
+
if (!command || typeof command.name !== 'string') {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
description: command.description || '',
|
|
91
|
+
hidden: command.hidden || false,
|
|
92
|
+
name: command.name,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (_a) {
|
|
96
|
+
// Ignore errors for individual files (missing dependencies, syntax errors, etc.)
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Generate completion script from EJS template
|
|
102
|
+
*/
|
|
103
|
+
function generateCompletionFromTemplate(shell, commandTree) {
|
|
104
|
+
const templateDir = getTemplateDir();
|
|
105
|
+
const templatePath = (0, path_1.join)(templateDir, `${shell}.sh.ejs`);
|
|
106
|
+
if (!(0, fs_1.existsSync)(templatePath)) {
|
|
107
|
+
throw new Error(`Template not found: ${templatePath}`);
|
|
108
|
+
}
|
|
109
|
+
const templateContent = (0, fs_1.readFileSync)(templatePath, 'utf-8');
|
|
110
|
+
const maxDepth = getMaxDepth(commandTree);
|
|
111
|
+
return ejs.render(templateContent, {
|
|
112
|
+
props: {
|
|
113
|
+
commandTree,
|
|
114
|
+
maxDepth,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get completion paths for static file installation
|
|
120
|
+
* Uses ~/.local/share/lt/completions/ for Bash/Zsh (standard XDG location)
|
|
121
|
+
* Uses ~/.config/fish/completions/ for Fish (auto-loaded by Fish)
|
|
122
|
+
*/
|
|
123
|
+
function getCompletionPaths(shell) {
|
|
124
|
+
const home = (0, os_1.homedir)();
|
|
125
|
+
const ltDir = (0, path_1.join)(home, '.local', 'share', 'lt', 'completions');
|
|
126
|
+
switch (shell) {
|
|
127
|
+
case 'fish':
|
|
128
|
+
return {
|
|
129
|
+
completionFile: (0, path_1.join)(home, '.config', 'fish', 'completions', 'lt.fish'),
|
|
130
|
+
configFile: null, // Fish auto-loads from completions dir
|
|
131
|
+
sourceLine: null,
|
|
132
|
+
};
|
|
133
|
+
case 'zsh':
|
|
134
|
+
return {
|
|
135
|
+
completionFile: (0, path_1.join)(ltDir, '_lt'),
|
|
136
|
+
configFile: (0, path_1.join)(home, '.zshrc'),
|
|
137
|
+
// Source the file directly - it uses compdef internally
|
|
138
|
+
// This avoids calling compinit which conflicts with Powerlevel10k instant prompt
|
|
139
|
+
sourceLine: `# lt CLI completion\n[ -f ~/.local/share/lt/completions/_lt ] && source ~/.local/share/lt/completions/_lt`,
|
|
140
|
+
};
|
|
141
|
+
case 'bash':
|
|
142
|
+
default: {
|
|
143
|
+
const bashProfile = (0, path_1.join)(home, '.bash_profile');
|
|
144
|
+
return {
|
|
145
|
+
completionFile: (0, path_1.join)(ltDir, 'lt.bash'),
|
|
146
|
+
configFile: (0, fs_1.existsSync)(bashProfile) ? bashProfile : (0, path_1.join)(home, '.bashrc'),
|
|
147
|
+
sourceLine: `# lt CLI completion\n[ -f ~/.local/share/lt/completions/lt.bash ] && source ~/.local/share/lt/completions/lt.bash`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Calculate maximum depth of command tree
|
|
154
|
+
*/
|
|
155
|
+
function getMaxDepth(nodes, currentDepth = 1) {
|
|
156
|
+
let maxDepth = currentDepth;
|
|
157
|
+
for (const node of nodes) {
|
|
158
|
+
if (node.children.length > 0) {
|
|
159
|
+
const childDepth = getMaxDepth(node.children, currentDepth + 1);
|
|
160
|
+
maxDepth = Math.max(maxDepth, childDepth);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return maxDepth;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get template directory path
|
|
167
|
+
*/
|
|
168
|
+
function getTemplateDir() {
|
|
169
|
+
// In development (src), templates are in ../templates/completion
|
|
170
|
+
// In production (dist), templates are in ../templates/completion
|
|
171
|
+
const srcPath = (0, path_1.join)(__dirname, '..', 'templates', 'completion');
|
|
172
|
+
if ((0, fs_1.existsSync)(srcPath)) {
|
|
173
|
+
return srcPath;
|
|
174
|
+
}
|
|
175
|
+
// Fallback for different directory structures
|
|
176
|
+
return (0, path_1.join)(__dirname, '..', '..', 'src', 'templates', 'completion');
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Install completion using static files (no runtime overhead)
|
|
180
|
+
* - Generates completion script to ~/.local/share/lt/completions/
|
|
181
|
+
* - Adds source line to shell config (Bash/Zsh only)
|
|
182
|
+
* - Fish auto-loads from ~/.config/fish/completions/
|
|
183
|
+
*/
|
|
184
|
+
function installCompletion(toolbox_1, shell_1) {
|
|
185
|
+
return __awaiter(this, arguments, void 0, function* (toolbox, shell, options = {}) {
|
|
186
|
+
const { filesystem, print: { error, info, success, warning }, prompt: { confirm }, } = toolbox;
|
|
187
|
+
const { noConfirm = false, silent = false } = options;
|
|
188
|
+
const log = silent ? () => { } : info;
|
|
189
|
+
const logSuccess = silent ? () => { } : success;
|
|
190
|
+
const logWarning = silent ? () => { } : warning;
|
|
191
|
+
const logError = silent ? () => { } : error;
|
|
192
|
+
const paths = getCompletionPaths(shell);
|
|
193
|
+
// Confirm installation (skip if noConfirm or Fish)
|
|
194
|
+
if (!noConfirm && paths.configFile) {
|
|
195
|
+
log('This will:');
|
|
196
|
+
log(` 1. Generate completion script to ${paths.completionFile}`);
|
|
197
|
+
log(` 2. Add source line to ${paths.configFile}`);
|
|
198
|
+
log('');
|
|
199
|
+
const proceed = yield confirm('Install completion?', true);
|
|
200
|
+
if (!proceed) {
|
|
201
|
+
log('Installation cancelled.');
|
|
202
|
+
return { configFile: paths.configFile || paths.completionFile, success: false };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
// Ensure completion directory exists
|
|
207
|
+
const completionDir = (0, path_1.dirname)(paths.completionFile);
|
|
208
|
+
if (!(0, fs_1.existsSync)(completionDir)) {
|
|
209
|
+
filesystem.dir(completionDir);
|
|
210
|
+
}
|
|
211
|
+
// Generate and write completion script
|
|
212
|
+
const commandTree = discoverCommandTree();
|
|
213
|
+
const script = generateCompletionFromTemplate(shell, commandTree);
|
|
214
|
+
filesystem.write(paths.completionFile, script);
|
|
215
|
+
// For Bash/Zsh: add source line to config if not already present
|
|
216
|
+
if (paths.configFile && paths.sourceLine) {
|
|
217
|
+
if (isSourceLineInstalled(paths.configFile)) {
|
|
218
|
+
logSuccess(`Completions updated: ${paths.completionFile}`);
|
|
219
|
+
logWarning(`Source line already in ${paths.configFile}`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
(0, fs_1.appendFileSync)(paths.configFile, `\n${paths.sourceLine}\n`);
|
|
223
|
+
logSuccess(`Completions installed to ${paths.completionFile}`);
|
|
224
|
+
log('');
|
|
225
|
+
log('Run the following to activate (or restart your terminal):');
|
|
226
|
+
log(` source ${paths.configFile}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// Fish: just confirm file was written
|
|
231
|
+
logSuccess(`Fish completions installed to ${paths.completionFile}`);
|
|
232
|
+
}
|
|
233
|
+
return { configFile: paths.configFile || paths.completionFile, success: true };
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
logError(`Failed to install: ${e.message}`);
|
|
237
|
+
return { configFile: paths.configFile || paths.completionFile, success: false };
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Check if source line is already in shell config
|
|
243
|
+
*/
|
|
244
|
+
function isSourceLineInstalled(configFile) {
|
|
245
|
+
if (!configFile || !(0, fs_1.existsSync)(configFile)) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
const content = (0, fs_1.readFileSync)(configFile, 'utf-8');
|
|
249
|
+
return content.includes('lt CLI completion') || content.includes('lt/completions');
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Generate shell completion scripts (using EJS templates)
|
|
253
|
+
*/
|
|
254
|
+
const CompletionCommand = {
|
|
255
|
+
alias: ['comp'],
|
|
256
|
+
description: 'Generate shell completions',
|
|
257
|
+
hidden: false,
|
|
258
|
+
name: 'completion',
|
|
259
|
+
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
260
|
+
var _a, _b;
|
|
261
|
+
const { parameters, print: { error, info }, } = toolbox;
|
|
262
|
+
const action = (_a = parameters.first) === null || _a === void 0 ? void 0 : _a.toLowerCase();
|
|
263
|
+
// Handle install command
|
|
264
|
+
if (action === 'install') {
|
|
265
|
+
const shell = ((_b = parameters.second) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || detectShell();
|
|
266
|
+
if (!['bash', 'fish', 'zsh'].includes(shell)) {
|
|
267
|
+
error(`Unknown shell: ${shell}`);
|
|
268
|
+
return 'completion: install error';
|
|
269
|
+
}
|
|
270
|
+
const noConfirm = parameters.options.noConfirm || parameters.options.y || false;
|
|
271
|
+
const silent = parameters.options.silent || parameters.options.s || false;
|
|
272
|
+
const result = yield installCompletion(toolbox, shell, { noConfirm, silent });
|
|
273
|
+
return result.success ? `completion: installed ${shell}` : 'completion: install cancelled';
|
|
274
|
+
}
|
|
275
|
+
// Show help if no valid shell specified
|
|
276
|
+
if (!action || !['bash', 'fish', 'zsh'].includes(action)) {
|
|
277
|
+
info('Usage: lt completion <shell|install>');
|
|
278
|
+
info('');
|
|
279
|
+
info('Commands:');
|
|
280
|
+
info(' bash Output Bash completion script');
|
|
281
|
+
info(' zsh Output Zsh completion script');
|
|
282
|
+
info(' fish Output Fish completion script');
|
|
283
|
+
info(' install Install completion (recommended)');
|
|
284
|
+
info('');
|
|
285
|
+
info('Installation (recommended):');
|
|
286
|
+
info(' lt completion install');
|
|
287
|
+
info('');
|
|
288
|
+
info('This generates static completion files that are loaded at shell startup.');
|
|
289
|
+
info('Completions are auto-updated on CLI install/update.');
|
|
290
|
+
info('');
|
|
291
|
+
info('Locations:');
|
|
292
|
+
info(' Bash/Zsh: ~/.local/share/lt/completions/');
|
|
293
|
+
info(' Fish: ~/.config/fish/completions/lt.fish');
|
|
294
|
+
return 'completion: help';
|
|
295
|
+
}
|
|
296
|
+
// Discover commands dynamically as tree
|
|
297
|
+
const commandTree = discoverCommandTree();
|
|
298
|
+
// Generate and output the appropriate script using templates
|
|
299
|
+
try {
|
|
300
|
+
const script = generateCompletionFromTemplate(action, commandTree);
|
|
301
|
+
process.stdout.write(script);
|
|
302
|
+
return `completion: ${action}`;
|
|
303
|
+
}
|
|
304
|
+
catch (e) {
|
|
305
|
+
error(`Failed to generate completion: ${e.message}`);
|
|
306
|
+
return 'completion: error';
|
|
307
|
+
}
|
|
308
|
+
}),
|
|
309
|
+
};
|
|
310
|
+
exports.default = CompletionCommand;
|
|
311
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jb21wbGV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsMkJBQTJCO0FBQzNCLDJCQUFxRjtBQUVyRiwyQkFBNkI7QUFDN0IsK0JBQStDO0FBb0IvQzs7R0FFRztBQUNILFNBQVMsV0FBVztJQUNsQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDdEMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxNQUFjLFNBQVMsRUFBRSxhQUFxQixFQUFFO0lBQzNFLE1BQU0sS0FBSyxHQUFrQixFQUFFLENBQUM7SUFFaEMsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSxnQkFBVyxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWpDLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUEsYUFBUSxFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsc0RBQXNEO1lBQ3RELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN4QixNQUFN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
|