@decaf-ts/mcp-server 0.0.2 → 0.0.4
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/LICENSE.md +86 -21
- package/README.md +13 -13
- package/dist/mcp-server.cjs +893 -187
- package/dist/mcp-server.esm.cjs +888 -180
- package/lib/McpWrapper.cjs +189 -0
- package/lib/McpWrapper.d.ts +101 -0
- package/lib/bin/cli.cjs +30 -54
- package/lib/bin/cli.d.ts +18 -44
- package/lib/constants.cjs +12 -0
- package/lib/constants.d.ts +8 -0
- package/lib/esm/McpWrapper.d.ts +101 -0
- package/lib/esm/McpWrapper.js +182 -0
- package/lib/esm/bin/cli.d.ts +18 -44
- package/lib/esm/bin/cli.js +28 -55
- package/lib/esm/constants.d.ts +8 -0
- package/lib/esm/constants.js +9 -0
- package/lib/esm/index.d.ts +5 -26
- package/lib/esm/index.js +6 -27
- package/lib/esm/mcp/index.d.ts +1 -0
- package/lib/esm/mcp/index.js +2 -0
- package/lib/esm/metadata.d.ts +9 -0
- package/lib/esm/metadata.js +22 -0
- package/lib/esm/modules/decoration/index.d.ts +0 -0
- package/lib/esm/modules/decoration/index.js +2 -0
- package/lib/esm/modules/mcp/decoration-assist.d.ts +39 -0
- package/lib/esm/modules/mcp/decoration-assist.js +353 -0
- package/lib/esm/modules/mcp/decorator-tools.d.ts +118 -0
- package/lib/esm/modules/mcp/decorator-tools.js +237 -0
- package/lib/esm/modules/mcp/index.d.ts +2 -0
- package/lib/esm/modules/mcp/index.js +3 -0
- package/lib/esm/modules/mcp/mcp-module.d.ts +230 -0
- package/lib/esm/modules/mcp/mcp-module.js +406 -0
- package/lib/esm/types.d.ts +15 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/utils.d.ts +54 -13
- package/lib/esm/utils.js +78 -15
- package/lib/index.cjs +6 -28
- package/lib/index.d.ts +5 -26
- package/lib/mcp/index.cjs +17 -0
- package/lib/mcp/index.d.ts +1 -0
- package/lib/metadata.cjs +25 -0
- package/lib/metadata.d.ts +9 -0
- package/lib/modules/decoration/index.cjs +2 -0
- package/lib/modules/decoration/index.d.ts +0 -0
- package/lib/modules/mcp/decoration-assist.cjs +360 -0
- package/lib/modules/mcp/decoration-assist.d.ts +39 -0
- package/lib/modules/mcp/decorator-tools.cjs +243 -0
- package/lib/modules/mcp/decorator-tools.d.ts +118 -0
- package/lib/modules/mcp/index.cjs +24 -0
- package/lib/modules/mcp/index.d.ts +2 -0
- package/lib/modules/mcp/mcp-module.cjs +452 -0
- package/lib/modules/mcp/mcp-module.d.ts +230 -0
- package/lib/types.cjs +3 -0
- package/lib/types.d.ts +15 -0
- package/lib/utils.cjs +116 -16
- package/lib/utils.d.ts +54 -13
- package/package.json +35 -7
- package/lib/esm/namespace/Class.d.ts +0 -74
- package/lib/esm/namespace/Class.js +0 -73
- package/lib/esm/namespace/Interface.d.ts +0 -17
- package/lib/esm/namespace/Interface.js +0 -2
- package/lib/esm/namespace/children/ChildClass.d.ts +0 -44
- package/lib/esm/namespace/children/ChildClass.js +0 -43
- package/lib/esm/namespace/children/ChildInterface.d.ts +0 -22
- package/lib/esm/namespace/children/ChildInterface.js +0 -2
- package/lib/esm/namespace/children/Enum.d.ts +0 -14
- package/lib/esm/namespace/children/Enum.js +0 -16
- package/lib/esm/namespace/children/function.d.ts +0 -31
- package/lib/esm/namespace/children/function.js +0 -33
- package/lib/esm/namespace/children/index.d.ts +0 -25
- package/lib/esm/namespace/children/index.js +0 -26
- package/lib/esm/namespace/index.d.ts +0 -18
- package/lib/esm/namespace/index.js +0 -19
- package/lib/esm/namespace/type.d.ts +0 -28
- package/lib/esm/namespace/type.js +0 -2
- package/lib/namespace/Class.cjs +0 -77
- package/lib/namespace/Class.d.ts +0 -74
- package/lib/namespace/Interface.cjs +0 -3
- package/lib/namespace/Interface.d.ts +0 -17
- package/lib/namespace/children/ChildClass.cjs +0 -47
- package/lib/namespace/children/ChildClass.d.ts +0 -44
- package/lib/namespace/children/ChildInterface.cjs +0 -3
- package/lib/namespace/children/ChildInterface.d.ts +0 -22
- package/lib/namespace/children/Enum.cjs +0 -19
- package/lib/namespace/children/Enum.d.ts +0 -14
- package/lib/namespace/children/function.cjs +0 -36
- package/lib/namespace/children/function.d.ts +0 -31
- package/lib/namespace/children/index.cjs +0 -42
- package/lib/namespace/children/index.d.ts +0 -25
- package/lib/namespace/index.cjs +0 -35
- package/lib/namespace/index.d.ts +0 -18
- package/lib/namespace/type.cjs +0 -3
- package/lib/namespace/type.d.ts +0 -28
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.McpWrapper = void 0;
|
|
7
|
+
/* istanbul ignore file */
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const constants_1 = require("./constants.cjs");
|
|
11
|
+
const utils_1 = require("./utils.cjs");
|
|
12
|
+
const fastmcp_1 = require("fastmcp");
|
|
13
|
+
const logging_1 = require("@decaf-ts/logging");
|
|
14
|
+
const metadata_1 = require("./metadata.cjs");
|
|
15
|
+
/**
|
|
16
|
+
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
17
|
+
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
18
|
+
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
19
|
+
*
|
|
20
|
+
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
21
|
+
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // Create a new CLI wrapper and run it with custom options
|
|
25
|
+
* const cli = new CliWrapper('./src', 2);
|
|
26
|
+
* cli.run(process.argv).then(() => {
|
|
27
|
+
* console.log('CLI commands executed successfully');
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* @class McpWrapper
|
|
31
|
+
*/
|
|
32
|
+
class McpWrapper extends logging_1.LoggedClass {
|
|
33
|
+
constructor(basePath = "./", crawlLevels = 4) {
|
|
34
|
+
super();
|
|
35
|
+
this.basePath = basePath;
|
|
36
|
+
this.crawlLevels = crawlLevels;
|
|
37
|
+
this.modules = {};
|
|
38
|
+
this.rootPath = path_1.default.resolve(__dirname, "..");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @description Retrieves and initializes the Commander Command object
|
|
42
|
+
* @summary Lazy-loads the Command object, initializing it with the package name, description, and version
|
|
43
|
+
* @return {Command} The initialized Command object
|
|
44
|
+
* @private
|
|
45
|
+
*/
|
|
46
|
+
get mcp() {
|
|
47
|
+
if (!this._mcp) {
|
|
48
|
+
this._mcp = new fastmcp_1.FastMCP({
|
|
49
|
+
name: "decaf-ts MCP server",
|
|
50
|
+
instructions: "",
|
|
51
|
+
version: metadata_1.VERSION,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return this._mcp;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @description Loads and registers an mcp extension module from a file
|
|
58
|
+
* @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
61
|
+
async load(server, filePath) {
|
|
62
|
+
const log = this.log.for(this.load);
|
|
63
|
+
let pkg, version, enrich;
|
|
64
|
+
try {
|
|
65
|
+
const res = await utils_1.McpUtils.loadFromFile(filePath);
|
|
66
|
+
pkg = res.PACKAGE_NAME;
|
|
67
|
+
version = res.VERSION;
|
|
68
|
+
enrich = res.enrich;
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
throw new Error(e.message || e);
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
log.info(`Enriching mcp server with module ${pkg} v${version}`);
|
|
75
|
+
const result = enrich(server);
|
|
76
|
+
server = result instanceof Promise ? await result : result;
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
throw new Error(`failed to enrich mcp with module ${pkg || "unnamed"} under ${filePath}: ${e instanceof Error ? e.message : e}`);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
mcp: server,
|
|
83
|
+
package: pkg,
|
|
84
|
+
version: version,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* @description Finds and loads all CLI modules in the basePath
|
|
89
|
+
* @summary Uses the crawl method to find all CLI modules in the specified base path,
|
|
90
|
+
* then loads and registers each module as a subcommand
|
|
91
|
+
*
|
|
92
|
+
* @return {Promise<void>} A promise that resolves when all modules are loaded
|
|
93
|
+
*
|
|
94
|
+
* @private
|
|
95
|
+
* @mermaid
|
|
96
|
+
* sequenceDiagram
|
|
97
|
+
* participant CliWrapper
|
|
98
|
+
* participant Filesystem
|
|
99
|
+
* participant Module
|
|
100
|
+
*
|
|
101
|
+
* CliWrapper->>Filesystem: Join basePath with cwd
|
|
102
|
+
* CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
|
|
103
|
+
* CliWrapper-->>CliWrapper: modules[]
|
|
104
|
+
* loop For each module
|
|
105
|
+
* alt Not @decaf-ts/cli
|
|
106
|
+
* CliWrapper->>CliWrapper: load(module, cwd)
|
|
107
|
+
* CliWrapper-->>CliWrapper: name
|
|
108
|
+
* CliWrapper->>CliWrapper: Check if command exists
|
|
109
|
+
* alt Command doesn't exist
|
|
110
|
+
* CliWrapper->>Command: command(name).addCommand(modules[name])
|
|
111
|
+
* end
|
|
112
|
+
* end
|
|
113
|
+
* end
|
|
114
|
+
* CliWrapper->>Console: Log loaded modules
|
|
115
|
+
*/
|
|
116
|
+
async boot() {
|
|
117
|
+
const log = this.log.for(this.boot);
|
|
118
|
+
const basePath = path_1.default.resolve(this.rootPath, this.basePath);
|
|
119
|
+
const modules = this.crawl(basePath, this.crawlLevels);
|
|
120
|
+
let server = this.mcp;
|
|
121
|
+
for (const module of modules) {
|
|
122
|
+
if (module.includes("@decaf-ts/mcp")) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const res = await this.load(server, module);
|
|
127
|
+
server = res.mcp;
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
log.error(`Failed to load MCP configs for ${module}: ${e}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
console.log(`loaded modules:\n${Object.keys(this.modules)
|
|
134
|
+
.map((k) => `- ${k}`)
|
|
135
|
+
.join("\n")}`);
|
|
136
|
+
return server;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* @description Recursively searches for CLI module files in the directory structure
|
|
140
|
+
* @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
|
|
141
|
+
*
|
|
142
|
+
* @param {string} basePath The absolute base path to start searching in
|
|
143
|
+
* @param {number} [levels=2] The maximum number of directory levels to crawl
|
|
144
|
+
* @return {string[]} An array of file paths to CLI modules
|
|
145
|
+
*
|
|
146
|
+
* @private
|
|
147
|
+
*/
|
|
148
|
+
crawl(basePath, levels = 2) {
|
|
149
|
+
if (levels <= 0)
|
|
150
|
+
return [];
|
|
151
|
+
return fs_1.default.readdirSync(basePath).reduce((accum, file) => {
|
|
152
|
+
file = path_1.default.join(basePath, file);
|
|
153
|
+
if (fs_1.default.statSync(file).isDirectory()) {
|
|
154
|
+
accum.push(...this.crawl(file, levels - 1));
|
|
155
|
+
}
|
|
156
|
+
else if (file.match(new RegExp(`${constants_1.MCP_FILE_NAME}.[cm]?js$`, "gm"))) {
|
|
157
|
+
accum.push(file);
|
|
158
|
+
}
|
|
159
|
+
return accum;
|
|
160
|
+
}, []);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* @description Executes the CLI with the provided arguments
|
|
164
|
+
* @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
|
|
165
|
+
*
|
|
166
|
+
* @param {string[]} [args=process.argv] Command line arguments to parse and execute
|
|
167
|
+
* @return {Promise<void>} A promise that resolves when the command execution is complete
|
|
168
|
+
*
|
|
169
|
+
* @mermaid
|
|
170
|
+
* sequenceDiagram
|
|
171
|
+
* participant Client
|
|
172
|
+
* participant CliWrapper
|
|
173
|
+
* participant Command
|
|
174
|
+
*
|
|
175
|
+
* Client->>CliWrapper: run(args)
|
|
176
|
+
* CliWrapper->>CliWrapper: boot()
|
|
177
|
+
* Note over CliWrapper: Loads all modules
|
|
178
|
+
* CliWrapper->>Command: parseAsync(args)
|
|
179
|
+
* Command-->>CliWrapper: result
|
|
180
|
+
* CliWrapper-->>Client: result
|
|
181
|
+
*/
|
|
182
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
183
|
+
async run(args = process.argv) {
|
|
184
|
+
const server = await this.boot();
|
|
185
|
+
await server.start({ transportType: "stdio" });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.McpWrapper = McpWrapper;
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWNwV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NY3BXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBCQUEwQjtBQUMxQiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLCtDQUE0QztBQUM1Qyx1Q0FBbUM7QUFDbkMscUNBQWtDO0FBQ2xDLCtDQUFnRDtBQUNoRCw2Q0FBcUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFhLFVBQVcsU0FBUSxxQkFBVztJQUt6QyxZQUNVLFdBQW1CLElBQUksRUFDdkIsY0FBYyxDQUFDO1FBRXZCLEtBQUssRUFBRSxDQUFDO1FBSEEsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBSTtRQUxqQixZQUFPLEdBQTJCLEVBQUUsQ0FBQztRQVEzQyxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVksR0FBRztRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksaUJBQU8sQ0FBQztnQkFDdEIsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsWUFBWSxFQUFFLEVBQUU7Z0JBQ2hCLE9BQU8sRUFBRSxrQkFBYzthQUN4QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLElBQUksQ0FDaEIsTUFBZSxFQUNmLFFBQWdCO1FBRWhCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFJLEdBQVcsRUFBRSxPQUFlLEVBQUUs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LFlBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBZSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQy9ELElBQUksR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLFlBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcseUJBQWEsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCw2REFBNkQ7SUFDN0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFpQixPQUFPLENBQUMsSUFBSTtRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUF4S0QsZ0NBd0tDIiwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBNQ1BfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNY3BVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBGYXN0TUNQIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgQ0xJIGZ1bmN0aW9uYWxpdHkgZnJvbSBhbGwgRGVjYWYgbW9kdWxlc1xuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIENvbW1hbmRlci5qcyB0byBoYW5kbGUgQ0xJIGNvbW1hbmRzIGZyb20gZGlmZmVyZW50IERlY2FmIG1vZHVsZXMuXG4gKiBJdCBjcmF3bHMgdGhlIGZpbGVzeXN0ZW0gdG8gZmluZCBDTEkgbW9kdWxlcywgbG9hZHMgdGhlbSwgYW5kIHJlZ2lzdGVycyB0aGVpciBjb21tYW5kcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VQYXRoXSBUaGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIERlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY3Jhd2xMZXZlbHNdIE51bWJlciBvZiBmb2xkZXIgbGV2ZWxzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gRGVmYXVsdHMgdG8gNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgQ0xJIHdyYXBwZXIgYW5kIHJ1biBpdCB3aXRoIGN1c3RvbSBvcHRpb25zXG4gKiBjb25zdCBjbGkgPSBuZXcgQ2xpV3JhcHBlcignLi9zcmMnLCAyKTtcbiAqIGNsaS5ydW4ocHJvY2Vzcy5hcmd2KS50aGVuKCgpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ0NMSSBjb21tYW5kcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAqIH0pO1xuICpcbiAqIEBjbGFzcyBNY3BXcmFwcGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBNY3BXcmFwcGVyIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIF9tY3A/OiBGYXN0TUNQO1xuICBwcml2YXRlIG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSByb290UGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmFzZVBhdGg6IHN0cmluZyA9IFwiLi9cIixcbiAgICBwcml2YXRlIGNyYXdsTGV2ZWxzID0gNFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IG1jcCgpIHtcbiAgICBpZiAoIXRoaXMuX21jcCkge1xuICAgICAgdGhpcy5fbWNwID0gbmV3IEZhc3RNQ1Aoe1xuICAgICAgICBuYW1lOiBcImRlY2FmLXRzIE1DUCBzZXJ2ZXJcIixcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIlwiLFxuICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OIGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWNwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGFuIG1jcCBleHRlbnNpb24gbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYW4gbWNwIGV4dGVuc2lvbiBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1vZHVsZXMgY29sbGVjdGlvblxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKFxuICAgIHNlcnZlcjogRmFzdE1DUCxcbiAgICBmaWxlUGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8eyBtY3A6IEZhc3RNQ1A7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5sb2FkKTtcblxuICAgIGxldCBwa2c6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBlbnJpY2g6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgTWNwVXRpbHMubG9hZEZyb21GaWxlKGZpbGVQYXRoKTtcbiAgICAgIHBrZyA9IHJlcy5QQUNLQUdFX05BTUU7XG4gICAgICB2ZXJzaW9uID0gcmVzLlZFUlNJT047XG4gICAgICBlbnJpY2ggPSByZXMuZW5yaWNoO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigoZSBhcyBhbnkpLm1lc3NhZ2UgfHwgKGUgYXMgYW55KSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgRW5yaWNoaW5nIG1jcCBzZXJ2ZXIgd2l0aCBtb2R1bGUgJHtwa2d9IHYke3ZlcnNpb259YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBlbnJpY2goc2VydmVyKTtcbiAgICAgIHNlcnZlciA9IHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCByZXN1bHQgOiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGVucmljaCBtY3Agd2l0aCBtb2R1bGUgJHtwa2cgfHwgXCJ1bm5hbWVkXCJ9IHVuZGVyICR7ZmlsZVBhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1jcDogc2VydmVyLFxuICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsXG4gICAqIHRoZW4gbG9hZHMgYW5kIHJlZ2lzdGVycyBlYWNoIG1vZHVsZSBhcyBhIHN1YmNvbW1hbmRcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbW9kdWxlcyBhcmUgbG9hZGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290KTtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMucm9vdFBhdGgsIHRoaXMuYmFzZVBhdGgpO1xuICAgIGNvbnN0IG1vZHVsZXMgPSB0aGlzLmNyYXdsKGJhc2VQYXRoLCB0aGlzLmNyYXdsTGV2ZWxzKTtcbiAgICBsZXQgc2VydmVyID0gdGhpcy5tY3A7XG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgaWYgKG1vZHVsZS5pbmNsdWRlcyhcIkBkZWNhZi10cy9tY3BcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxvYWQoc2VydmVyLCBtb2R1bGUpO1xuICAgICAgICBzZXJ2ZXIgPSByZXMubWNwO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBsb2FkIE1DUCBjb25maWdzIGZvciAke21vZHVsZX06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgbG9hZGVkIG1vZHVsZXM6XFxuJHtPYmplY3Qua2V5cyh0aGlzLm1vZHVsZXMpXG4gICAgICAgIC5tYXAoKGspID0+IGAtICR7a31gKVxuICAgICAgICAuam9pbihcIlxcblwiKX1gXG4gICAgKTtcbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgQ0xJIG1vZHVsZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKiBAc3VtbWFyeSBDcmF3bHMgdGhlIGJhc2VQYXRoIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZvbGRlciBsZXZlbHMgdG8gZmluZCBmaWxlcyBuYW1lZCBhY2NvcmRpbmcgdG8gQ0xJX0ZJTEVfTkFNRVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggVGhlIGFic29sdXRlIGJhc2UgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgaW5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsZXZlbHM9Ml0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpcmVjdG9yeSBsZXZlbHMgdG8gY3Jhd2xcbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGZpbGUgcGF0aHMgdG8gQ0xJIG1vZHVsZXNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3Jhd2woYmFzZVBhdGg6IHN0cmluZywgbGV2ZWxzOiBudW1iZXIgPSAyKSB7XG4gICAgaWYgKGxldmVscyA8PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKGJhc2VQYXRoKS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZmlsZSkgPT4ge1xuICAgICAgZmlsZSA9IHBhdGguam9pbihiYXNlUGF0aCwgZmlsZSk7XG4gICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBhY2N1bS5wdXNoKC4uLnRoaXMuY3Jhd2woZmlsZSwgbGV2ZWxzIC0gMSkpO1xuICAgICAgfSBlbHNlIGlmIChmaWxlLm1hdGNoKG5ldyBSZWdFeHAoYCR7TUNQX0ZJTEVfTkFNRX0uW2NtXT9qcyRgLCBcImdtXCIpKSkge1xuICAgICAgICBhY2N1bS5wdXNoKGZpbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgdGhlIENMSSB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHNcbiAgICogQHN1bW1hcnkgQm9vdHMgdGhlIENMSSBieSBsb2FkaW5nIGFsbCBtb2R1bGVzLCB0aGVuIHBhcnNlcyBhbmQgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGluIHRoZSBhcmd1bWVudHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3M9cHJvY2Vzcy5hcmd2XSBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHBhcnNlIGFuZCBleGVjdXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbW1hbmQgZXhlY3V0aW9uIGlzIGNvbXBsZXRlXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqXG4gICAqICAgQ2xpZW50LT4+Q2xpV3JhcHBlcjogcnVuKGFyZ3MpXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IGJvb3QoKVxuICAgKiAgIE5vdGUgb3ZlciBDbGlXcmFwcGVyOiBMb2FkcyBhbGwgbW9kdWxlc1xuICAgKiAgIENsaVdyYXBwZXItPj5Db21tYW5kOiBwYXJzZUFzeW5jKGFyZ3MpXG4gICAqICAgQ29tbWFuZC0tPj5DbGlXcmFwcGVyOiByZXN1bHRcbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaWVudDogcmVzdWx0XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIHJ1bihhcmdzOiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndikge1xuICAgIGNvbnN0IHNlcnZlciA9IGF3YWl0IHRoaXMuYm9vdCgpO1xuICAgIGF3YWl0IHNlcnZlci5zdGFydCh7IHRyYW5zcG9ydFR5cGU6IFwic3RkaW9cIiB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { LoggedClass } from "@decaf-ts/logging";
|
|
2
|
+
/**
|
|
3
|
+
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
4
|
+
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
5
|
+
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
8
|
+
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Create a new CLI wrapper and run it with custom options
|
|
12
|
+
* const cli = new CliWrapper('./src', 2);
|
|
13
|
+
* cli.run(process.argv).then(() => {
|
|
14
|
+
* console.log('CLI commands executed successfully');
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* @class McpWrapper
|
|
18
|
+
*/
|
|
19
|
+
export declare class McpWrapper extends LoggedClass {
|
|
20
|
+
private basePath;
|
|
21
|
+
private crawlLevels;
|
|
22
|
+
private _mcp?;
|
|
23
|
+
private modules;
|
|
24
|
+
private readonly rootPath;
|
|
25
|
+
constructor(basePath?: string, crawlLevels?: number);
|
|
26
|
+
/**
|
|
27
|
+
* @description Retrieves and initializes the Commander Command object
|
|
28
|
+
* @summary Lazy-loads the Command object, initializing it with the package name, description, and version
|
|
29
|
+
* @return {Command} The initialized Command object
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
private get mcp();
|
|
33
|
+
/**
|
|
34
|
+
* @description Loads and registers an mcp extension module from a file
|
|
35
|
+
* @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
|
|
36
|
+
*
|
|
37
|
+
*/
|
|
38
|
+
private load;
|
|
39
|
+
/**
|
|
40
|
+
* @description Finds and loads all CLI modules in the basePath
|
|
41
|
+
* @summary Uses the crawl method to find all CLI modules in the specified base path,
|
|
42
|
+
* then loads and registers each module as a subcommand
|
|
43
|
+
*
|
|
44
|
+
* @return {Promise<void>} A promise that resolves when all modules are loaded
|
|
45
|
+
*
|
|
46
|
+
* @private
|
|
47
|
+
* @mermaid
|
|
48
|
+
* sequenceDiagram
|
|
49
|
+
* participant CliWrapper
|
|
50
|
+
* participant Filesystem
|
|
51
|
+
* participant Module
|
|
52
|
+
*
|
|
53
|
+
* CliWrapper->>Filesystem: Join basePath with cwd
|
|
54
|
+
* CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
|
|
55
|
+
* CliWrapper-->>CliWrapper: modules[]
|
|
56
|
+
* loop For each module
|
|
57
|
+
* alt Not @decaf-ts/cli
|
|
58
|
+
* CliWrapper->>CliWrapper: load(module, cwd)
|
|
59
|
+
* CliWrapper-->>CliWrapper: name
|
|
60
|
+
* CliWrapper->>CliWrapper: Check if command exists
|
|
61
|
+
* alt Command doesn't exist
|
|
62
|
+
* CliWrapper->>Command: command(name).addCommand(modules[name])
|
|
63
|
+
* end
|
|
64
|
+
* end
|
|
65
|
+
* end
|
|
66
|
+
* CliWrapper->>Console: Log loaded modules
|
|
67
|
+
*/
|
|
68
|
+
private boot;
|
|
69
|
+
/**
|
|
70
|
+
* @description Recursively searches for CLI module files in the directory structure
|
|
71
|
+
* @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
|
|
72
|
+
*
|
|
73
|
+
* @param {string} basePath The absolute base path to start searching in
|
|
74
|
+
* @param {number} [levels=2] The maximum number of directory levels to crawl
|
|
75
|
+
* @return {string[]} An array of file paths to CLI modules
|
|
76
|
+
*
|
|
77
|
+
* @private
|
|
78
|
+
*/
|
|
79
|
+
private crawl;
|
|
80
|
+
/**
|
|
81
|
+
* @description Executes the CLI with the provided arguments
|
|
82
|
+
* @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
|
|
83
|
+
*
|
|
84
|
+
* @param {string[]} [args=process.argv] Command line arguments to parse and execute
|
|
85
|
+
* @return {Promise<void>} A promise that resolves when the command execution is complete
|
|
86
|
+
*
|
|
87
|
+
* @mermaid
|
|
88
|
+
* sequenceDiagram
|
|
89
|
+
* participant Client
|
|
90
|
+
* participant CliWrapper
|
|
91
|
+
* participant Command
|
|
92
|
+
*
|
|
93
|
+
* Client->>CliWrapper: run(args)
|
|
94
|
+
* CliWrapper->>CliWrapper: boot()
|
|
95
|
+
* Note over CliWrapper: Loads all modules
|
|
96
|
+
* CliWrapper->>Command: parseAsync(args)
|
|
97
|
+
* Command-->>CliWrapper: result
|
|
98
|
+
* CliWrapper-->>Client: result
|
|
99
|
+
*/
|
|
100
|
+
run(args?: string[]): Promise<void>;
|
|
101
|
+
}
|
package/lib/bin/cli.cjs
CHANGED
|
@@ -1,62 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
"use strict";
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* BIN_CALL_PLACEHOLDER - DO NOT REMOVE
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @description Decaf-ts' CLI entry point
|
|
8
|
+
* @summary This file serves as the main executable entry point for the Decaf CLI. It creates a CliWrapper instance
|
|
9
|
+
* and runs it with the process arguments. The CLI will crawl the current working directory for files called
|
|
10
|
+
* MCP_FILE_NAME within the @decaf-ts namespace and load them as subcommands.
|
|
9
11
|
*
|
|
10
12
|
* @example
|
|
11
|
-
* // Run
|
|
12
|
-
*
|
|
13
|
+
* // Run a module command
|
|
14
|
+
* $ npx decaf <module name> <module command> ...<module command options>
|
|
13
15
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* participant User
|
|
17
|
-
* participant CLI
|
|
18
|
-
* participant Timer
|
|
19
|
-
* User->>CLI: Run script
|
|
20
|
-
* CLI->>User: Display initial message
|
|
21
|
-
* CLI->>Timer: Start countdown
|
|
22
|
-
* loop Every second
|
|
23
|
-
* Timer->>CLI: Decrement counter
|
|
24
|
-
* CLI->>User: Display current count
|
|
25
|
-
* end
|
|
26
|
-
* Timer->>CLI: Counter reaches 0
|
|
27
|
-
* CLI->>User: Exit process
|
|
16
|
+
* // Get help for a specific module
|
|
17
|
+
* $ npx decaf help <module name>
|
|
28
18
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
* @const counter
|
|
35
|
-
* @name counter
|
|
36
|
-
* @description The countdown timer, initialized to 60 seconds.
|
|
37
|
-
* @summary Used to track the remaining time in the countdown.
|
|
38
|
-
* @type {number}
|
|
39
|
-
* @memberOf module:ts-workspace.cli
|
|
40
|
-
*/
|
|
41
|
-
let counter = 60;
|
|
42
|
-
console.log(`This is a poor example of a cli. will stop in ${60} seconds`);
|
|
43
|
-
/**
|
|
44
|
-
* @function iterator
|
|
45
|
-
* @description A recursive function that manages the countdown timer.
|
|
46
|
-
* @summary It uses setTimeout to create a delay of 1 second between each count.
|
|
47
|
-
* The function decrements the counter, logs the current count, and calls itself
|
|
48
|
-
* until the counter reaches 0. When the counter reaches 0, the process exits.
|
|
19
|
+
* // List all imported modules
|
|
20
|
+
* $ npx decaf list
|
|
21
|
+
*
|
|
22
|
+
* // Get general CLI help
|
|
23
|
+
* $ npx decaf help
|
|
49
24
|
*
|
|
50
|
-
* @
|
|
51
|
-
* @memberOf module:ts-workspace.cli
|
|
25
|
+
* @memberOf module:MCP
|
|
52
26
|
*/
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
const McpWrapper_1 = require("./../McpWrapper.cjs");
|
|
29
|
+
new McpWrapper_1.McpWrapper()
|
|
30
|
+
.run(process.argv)
|
|
31
|
+
.then(() => {
|
|
32
|
+
console.log("Thank you for using decaf-ts' mcp server");
|
|
33
|
+
})
|
|
34
|
+
.catch((e) => {
|
|
35
|
+
console.error(`${e instanceof Error ? e.message : e}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOztBQUVILG9EQUEyQztBQUMzQyxJQUFJLHVCQUFVLEVBQUU7S0FDYixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztLQUNqQixJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0FBQzFELENBQUMsQ0FBQztLQUNELEtBQUssQ0FBQyxDQUFDLENBQVUsRUFBRSxFQUFFO0lBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJJTl9DQUxMX1BMQUNFSE9MREVSIC0gRE8gTk9UIFJFTU9WRVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNhZi10cycgQ0xJIGVudHJ5IHBvaW50XG4gKiBAc3VtbWFyeSBUaGlzIGZpbGUgc2VydmVzIGFzIHRoZSBtYWluIGV4ZWN1dGFibGUgZW50cnkgcG9pbnQgZm9yIHRoZSBEZWNhZiBDTEkuIEl0IGNyZWF0ZXMgYSBDbGlXcmFwcGVyIGluc3RhbmNlXG4gKiBhbmQgcnVucyBpdCB3aXRoIHRoZSBwcm9jZXNzIGFyZ3VtZW50cy4gVGhlIENMSSB3aWxsIGNyYXdsIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciBmaWxlcyBjYWxsZWRcbiAqIE1DUF9GSUxFX05BTUUgd2l0aGluIHRoZSBAZGVjYWYtdHMgbmFtZXNwYWNlIGFuZCBsb2FkIHRoZW0gYXMgc3ViY29tbWFuZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJ1biBhIG1vZHVsZSBjb21tYW5kXG4gKiAkIG5weCBkZWNhZiA8bW9kdWxlIG5hbWU+IDxtb2R1bGUgY29tbWFuZD4gLi4uPG1vZHVsZSBjb21tYW5kIG9wdGlvbnM+XG4gKlxuICogLy8gR2V0IGhlbHAgZm9yIGEgc3BlY2lmaWMgbW9kdWxlXG4gKiAkIG5weCBkZWNhZiBoZWxwIDxtb2R1bGUgbmFtZT5cbiAqXG4gKiAvLyBMaXN0IGFsbCBpbXBvcnRlZCBtb2R1bGVzXG4gKiAkIG5weCBkZWNhZiBsaXN0XG4gKlxuICogLy8gR2V0IGdlbmVyYWwgQ0xJIGhlbHBcbiAqICQgbnB4IGRlY2FmIGhlbHBcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOk1DUFxuICovXG5cbmltcG9ydCB7IE1jcFdyYXBwZXIgfSBmcm9tIFwiLi4vTWNwV3JhcHBlclwiO1xubmV3IE1jcFdyYXBwZXIoKVxuICAucnVuKHByb2Nlc3MuYXJndilcbiAgLnRoZW4oKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiVGhhbmsgeW91IGZvciB1c2luZyBkZWNhZi10cycgbWNwIHNlcnZlclwiKTtcbiAgfSlcbiAgLmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG4iXX0=
|
package/lib/bin/cli.d.ts
CHANGED
|
@@ -1,51 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
2
|
+
* BIN_CALL_PLACEHOLDER - DO NOT REMOVE
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* @description Decaf-ts' CLI entry point
|
|
6
|
+
* @summary This file serves as the main executable entry point for the Decaf CLI. It creates a CliWrapper instance
|
|
7
|
+
* and runs it with the process arguments. The CLI will crawl the current working directory for files called
|
|
8
|
+
* MCP_FILE_NAME within the @decaf-ts namespace and load them as subcommands.
|
|
8
9
|
*
|
|
9
10
|
* @example
|
|
10
|
-
* // Run
|
|
11
|
-
*
|
|
11
|
+
* // Run a module command
|
|
12
|
+
* $ npx decaf <module name> <module command> ...<module command options>
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* participant User
|
|
16
|
-
* participant CLI
|
|
17
|
-
* participant Timer
|
|
18
|
-
* User->>CLI: Run script
|
|
19
|
-
* CLI->>User: Display initial message
|
|
20
|
-
* CLI->>Timer: Start countdown
|
|
21
|
-
* loop Every second
|
|
22
|
-
* Timer->>CLI: Decrement counter
|
|
23
|
-
* CLI->>User: Display current count
|
|
24
|
-
* end
|
|
25
|
-
* Timer->>CLI: Counter reaches 0
|
|
26
|
-
* CLI->>User: Exit process
|
|
14
|
+
* // Get help for a specific module
|
|
15
|
+
* $ npx decaf help <module name>
|
|
27
16
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
* @const counter
|
|
34
|
-
* @name counter
|
|
35
|
-
* @description The countdown timer, initialized to 60 seconds.
|
|
36
|
-
* @summary Used to track the remaining time in the countdown.
|
|
37
|
-
* @type {number}
|
|
38
|
-
* @memberOf module:ts-workspace.cli
|
|
39
|
-
*/
|
|
40
|
-
declare let counter: number;
|
|
41
|
-
/**
|
|
42
|
-
* @function iterator
|
|
43
|
-
* @description A recursive function that manages the countdown timer.
|
|
44
|
-
* @summary It uses setTimeout to create a delay of 1 second between each count.
|
|
45
|
-
* The function decrements the counter, logs the current count, and calls itself
|
|
46
|
-
* until the counter reaches 0. When the counter reaches 0, the process exits.
|
|
17
|
+
* // List all imported modules
|
|
18
|
+
* $ npx decaf list
|
|
19
|
+
*
|
|
20
|
+
* // Get general CLI help
|
|
21
|
+
* $ npx decaf help
|
|
47
22
|
*
|
|
48
|
-
* @
|
|
49
|
-
* @memberOf module:ts-workspace.cli
|
|
23
|
+
* @memberOf module:MCP
|
|
50
24
|
*/
|
|
51
|
-
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MCP_FILE_NAME = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @description The filename that identifies Decaf CLI modules
|
|
6
|
+
* @summary The standard filename for CLI module files where each library must export a single CliModule function
|
|
7
|
+
*
|
|
8
|
+
* @const MCP_FILE_NAME
|
|
9
|
+
* @memberOf module:MCP
|
|
10
|
+
*/
|
|
11
|
+
exports.MCP_FILE_NAME = "mcp-module";
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7O0dBTUc7QUFDVSxRQUFBLGFBQWEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBUaGUgZmlsZW5hbWUgdGhhdCBpZGVudGlmaWVzIERlY2FmIENMSSBtb2R1bGVzXG4gKiBAc3VtbWFyeSBUaGUgc3RhbmRhcmQgZmlsZW5hbWUgZm9yIENMSSBtb2R1bGUgZmlsZXMgd2hlcmUgZWFjaCBsaWJyYXJ5IG11c3QgZXhwb3J0IGEgc2luZ2xlIENsaU1vZHVsZSBmdW5jdGlvblxuICpcbiAqIEBjb25zdCBNQ1BfRklMRV9OQU1FXG4gKiBAbWVtYmVyT2YgbW9kdWxlOk1DUFxuICovXG5leHBvcnQgY29uc3QgTUNQX0ZJTEVfTkFNRSA9IFwibWNwLW1vZHVsZVwiO1xuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description The filename that identifies Decaf CLI modules
|
|
3
|
+
* @summary The standard filename for CLI module files where each library must export a single CliModule function
|
|
4
|
+
*
|
|
5
|
+
* @const MCP_FILE_NAME
|
|
6
|
+
* @memberOf module:MCP
|
|
7
|
+
*/
|
|
8
|
+
export declare const MCP_FILE_NAME = "mcp-module";
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { LoggedClass } from "@decaf-ts/logging";
|
|
2
|
+
/**
|
|
3
|
+
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
4
|
+
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
5
|
+
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
8
|
+
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Create a new CLI wrapper and run it with custom options
|
|
12
|
+
* const cli = new CliWrapper('./src', 2);
|
|
13
|
+
* cli.run(process.argv).then(() => {
|
|
14
|
+
* console.log('CLI commands executed successfully');
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* @class McpWrapper
|
|
18
|
+
*/
|
|
19
|
+
export declare class McpWrapper extends LoggedClass {
|
|
20
|
+
private basePath;
|
|
21
|
+
private crawlLevels;
|
|
22
|
+
private _mcp?;
|
|
23
|
+
private modules;
|
|
24
|
+
private readonly rootPath;
|
|
25
|
+
constructor(basePath?: string, crawlLevels?: number);
|
|
26
|
+
/**
|
|
27
|
+
* @description Retrieves and initializes the Commander Command object
|
|
28
|
+
* @summary Lazy-loads the Command object, initializing it with the package name, description, and version
|
|
29
|
+
* @return {Command} The initialized Command object
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
private get mcp();
|
|
33
|
+
/**
|
|
34
|
+
* @description Loads and registers an mcp extension module from a file
|
|
35
|
+
* @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
|
|
36
|
+
*
|
|
37
|
+
*/
|
|
38
|
+
private load;
|
|
39
|
+
/**
|
|
40
|
+
* @description Finds and loads all CLI modules in the basePath
|
|
41
|
+
* @summary Uses the crawl method to find all CLI modules in the specified base path,
|
|
42
|
+
* then loads and registers each module as a subcommand
|
|
43
|
+
*
|
|
44
|
+
* @return {Promise<void>} A promise that resolves when all modules are loaded
|
|
45
|
+
*
|
|
46
|
+
* @private
|
|
47
|
+
* @mermaid
|
|
48
|
+
* sequenceDiagram
|
|
49
|
+
* participant CliWrapper
|
|
50
|
+
* participant Filesystem
|
|
51
|
+
* participant Module
|
|
52
|
+
*
|
|
53
|
+
* CliWrapper->>Filesystem: Join basePath with cwd
|
|
54
|
+
* CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
|
|
55
|
+
* CliWrapper-->>CliWrapper: modules[]
|
|
56
|
+
* loop For each module
|
|
57
|
+
* alt Not @decaf-ts/cli
|
|
58
|
+
* CliWrapper->>CliWrapper: load(module, cwd)
|
|
59
|
+
* CliWrapper-->>CliWrapper: name
|
|
60
|
+
* CliWrapper->>CliWrapper: Check if command exists
|
|
61
|
+
* alt Command doesn't exist
|
|
62
|
+
* CliWrapper->>Command: command(name).addCommand(modules[name])
|
|
63
|
+
* end
|
|
64
|
+
* end
|
|
65
|
+
* end
|
|
66
|
+
* CliWrapper->>Console: Log loaded modules
|
|
67
|
+
*/
|
|
68
|
+
private boot;
|
|
69
|
+
/**
|
|
70
|
+
* @description Recursively searches for CLI module files in the directory structure
|
|
71
|
+
* @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
|
|
72
|
+
*
|
|
73
|
+
* @param {string} basePath The absolute base path to start searching in
|
|
74
|
+
* @param {number} [levels=2] The maximum number of directory levels to crawl
|
|
75
|
+
* @return {string[]} An array of file paths to CLI modules
|
|
76
|
+
*
|
|
77
|
+
* @private
|
|
78
|
+
*/
|
|
79
|
+
private crawl;
|
|
80
|
+
/**
|
|
81
|
+
* @description Executes the CLI with the provided arguments
|
|
82
|
+
* @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
|
|
83
|
+
*
|
|
84
|
+
* @param {string[]} [args=process.argv] Command line arguments to parse and execute
|
|
85
|
+
* @return {Promise<void>} A promise that resolves when the command execution is complete
|
|
86
|
+
*
|
|
87
|
+
* @mermaid
|
|
88
|
+
* sequenceDiagram
|
|
89
|
+
* participant Client
|
|
90
|
+
* participant CliWrapper
|
|
91
|
+
* participant Command
|
|
92
|
+
*
|
|
93
|
+
* Client->>CliWrapper: run(args)
|
|
94
|
+
* CliWrapper->>CliWrapper: boot()
|
|
95
|
+
* Note over CliWrapper: Loads all modules
|
|
96
|
+
* CliWrapper->>Command: parseAsync(args)
|
|
97
|
+
* Command-->>CliWrapper: result
|
|
98
|
+
* CliWrapper-->>Client: result
|
|
99
|
+
*/
|
|
100
|
+
run(args?: string[]): Promise<void>;
|
|
101
|
+
}
|