@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.
Files changed (93) hide show
  1. package/LICENSE.md +86 -21
  2. package/README.md +13 -13
  3. package/dist/mcp-server.cjs +893 -187
  4. package/dist/mcp-server.esm.cjs +888 -180
  5. package/lib/McpWrapper.cjs +189 -0
  6. package/lib/McpWrapper.d.ts +101 -0
  7. package/lib/bin/cli.cjs +30 -54
  8. package/lib/bin/cli.d.ts +18 -44
  9. package/lib/constants.cjs +12 -0
  10. package/lib/constants.d.ts +8 -0
  11. package/lib/esm/McpWrapper.d.ts +101 -0
  12. package/lib/esm/McpWrapper.js +182 -0
  13. package/lib/esm/bin/cli.d.ts +18 -44
  14. package/lib/esm/bin/cli.js +28 -55
  15. package/lib/esm/constants.d.ts +8 -0
  16. package/lib/esm/constants.js +9 -0
  17. package/lib/esm/index.d.ts +5 -26
  18. package/lib/esm/index.js +6 -27
  19. package/lib/esm/mcp/index.d.ts +1 -0
  20. package/lib/esm/mcp/index.js +2 -0
  21. package/lib/esm/metadata.d.ts +9 -0
  22. package/lib/esm/metadata.js +22 -0
  23. package/lib/esm/modules/decoration/index.d.ts +0 -0
  24. package/lib/esm/modules/decoration/index.js +2 -0
  25. package/lib/esm/modules/mcp/decoration-assist.d.ts +39 -0
  26. package/lib/esm/modules/mcp/decoration-assist.js +353 -0
  27. package/lib/esm/modules/mcp/decorator-tools.d.ts +118 -0
  28. package/lib/esm/modules/mcp/decorator-tools.js +237 -0
  29. package/lib/esm/modules/mcp/index.d.ts +2 -0
  30. package/lib/esm/modules/mcp/index.js +3 -0
  31. package/lib/esm/modules/mcp/mcp-module.d.ts +230 -0
  32. package/lib/esm/modules/mcp/mcp-module.js +406 -0
  33. package/lib/esm/types.d.ts +15 -0
  34. package/lib/esm/types.js +2 -0
  35. package/lib/esm/utils.d.ts +54 -13
  36. package/lib/esm/utils.js +78 -15
  37. package/lib/index.cjs +6 -28
  38. package/lib/index.d.ts +5 -26
  39. package/lib/mcp/index.cjs +17 -0
  40. package/lib/mcp/index.d.ts +1 -0
  41. package/lib/metadata.cjs +25 -0
  42. package/lib/metadata.d.ts +9 -0
  43. package/lib/modules/decoration/index.cjs +2 -0
  44. package/lib/modules/decoration/index.d.ts +0 -0
  45. package/lib/modules/mcp/decoration-assist.cjs +360 -0
  46. package/lib/modules/mcp/decoration-assist.d.ts +39 -0
  47. package/lib/modules/mcp/decorator-tools.cjs +243 -0
  48. package/lib/modules/mcp/decorator-tools.d.ts +118 -0
  49. package/lib/modules/mcp/index.cjs +24 -0
  50. package/lib/modules/mcp/index.d.ts +2 -0
  51. package/lib/modules/mcp/mcp-module.cjs +452 -0
  52. package/lib/modules/mcp/mcp-module.d.ts +230 -0
  53. package/lib/types.cjs +3 -0
  54. package/lib/types.d.ts +15 -0
  55. package/lib/utils.cjs +116 -16
  56. package/lib/utils.d.ts +54 -13
  57. package/package.json +35 -7
  58. package/lib/esm/namespace/Class.d.ts +0 -74
  59. package/lib/esm/namespace/Class.js +0 -73
  60. package/lib/esm/namespace/Interface.d.ts +0 -17
  61. package/lib/esm/namespace/Interface.js +0 -2
  62. package/lib/esm/namespace/children/ChildClass.d.ts +0 -44
  63. package/lib/esm/namespace/children/ChildClass.js +0 -43
  64. package/lib/esm/namespace/children/ChildInterface.d.ts +0 -22
  65. package/lib/esm/namespace/children/ChildInterface.js +0 -2
  66. package/lib/esm/namespace/children/Enum.d.ts +0 -14
  67. package/lib/esm/namespace/children/Enum.js +0 -16
  68. package/lib/esm/namespace/children/function.d.ts +0 -31
  69. package/lib/esm/namespace/children/function.js +0 -33
  70. package/lib/esm/namespace/children/index.d.ts +0 -25
  71. package/lib/esm/namespace/children/index.js +0 -26
  72. package/lib/esm/namespace/index.d.ts +0 -18
  73. package/lib/esm/namespace/index.js +0 -19
  74. package/lib/esm/namespace/type.d.ts +0 -28
  75. package/lib/esm/namespace/type.js +0 -2
  76. package/lib/namespace/Class.cjs +0 -77
  77. package/lib/namespace/Class.d.ts +0 -74
  78. package/lib/namespace/Interface.cjs +0 -3
  79. package/lib/namespace/Interface.d.ts +0 -17
  80. package/lib/namespace/children/ChildClass.cjs +0 -47
  81. package/lib/namespace/children/ChildClass.d.ts +0 -44
  82. package/lib/namespace/children/ChildInterface.cjs +0 -3
  83. package/lib/namespace/children/ChildInterface.d.ts +0 -22
  84. package/lib/namespace/children/Enum.cjs +0 -19
  85. package/lib/namespace/children/Enum.d.ts +0 -14
  86. package/lib/namespace/children/function.cjs +0 -36
  87. package/lib/namespace/children/function.d.ts +0 -31
  88. package/lib/namespace/children/index.cjs +0 -42
  89. package/lib/namespace/children/index.d.ts +0 -25
  90. package/lib/namespace/index.cjs +0 -35
  91. package/lib/namespace/index.d.ts +0 -18
  92. package/lib/namespace/type.cjs +0 -3
  93. 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
- * @namespace cli
4
- * @description This script demonstrates a basic command-line interface (CLI) that counts down from 60 seconds and then exits.
5
- * @summary A simple CLI countdown timer that serves as a minimal example of how to create a CLI application using TypeScript.
6
- *
7
- * All files in the ./src/bin folder will have `#!/usr/bin/env node` included at the beginning of the file
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 the script
12
- * node cli.js
13
+ * // Run a module command
14
+ * $ npx decaf <module name> <module command> ...<module command options>
13
15
  *
14
- * @mermaid
15
- * sequenceDiagram
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
- * @memberOf module:ts-workspace
30
- * @see {@link https://nodejs.org/api/process.html#process_process_exit_code|Node.js process.exit()}
31
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/setTimeout|MDN setTimeout()}
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
- * @return {void}
51
- * @memberOf module:ts-workspace.cli
25
+ * @memberOf module:MCP
52
26
  */
53
- function iterator() {
54
- setTimeout(() => {
55
- if (!--counter)
56
- process.exit(1);
57
- console.log(counter);
58
- iterator();
59
- }, 1000);
60
- }
61
- iterator();
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFM0U7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxRQUFRO0lBQ2YsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLElBQUksQ0FBQyxFQUFFLE9BQU87WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsUUFBUSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBuYW1lc3BhY2UgY2xpXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBzY3JpcHQgZGVtb25zdHJhdGVzIGEgYmFzaWMgY29tbWFuZC1saW5lIGludGVyZmFjZSAoQ0xJKSB0aGF0IGNvdW50cyBkb3duIGZyb20gNjAgc2Vjb25kcyBhbmQgdGhlbiBleGl0cy5cbiAqIEBzdW1tYXJ5IEEgc2ltcGxlIENMSSBjb3VudGRvd24gdGltZXIgdGhhdCBzZXJ2ZXMgYXMgYSBtaW5pbWFsIGV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhIENMSSBhcHBsaWNhdGlvbiB1c2luZyBUeXBlU2NyaXB0LlxuICpcbiAqIEFsbCBmaWxlcyBpbiB0aGUgLi9zcmMvYmluIGZvbGRlciB3aWxsIGhhdmUgYCMhL3Vzci9iaW4vZW52IG5vZGVgIGluY2x1ZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGVcbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJ1biB0aGUgc2NyaXB0XG4gKiBub2RlIGNsaS5qc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVXNlclxuICogICBwYXJ0aWNpcGFudCBDTElcbiAqICAgcGFydGljaXBhbnQgVGltZXJcbiAqICAgVXNlci0+PkNMSTogUnVuIHNjcmlwdFxuICogICBDTEktPj5Vc2VyOiBEaXNwbGF5IGluaXRpYWwgbWVzc2FnZVxuICogICBDTEktPj5UaW1lcjogU3RhcnQgY291bnRkb3duXG4gKiAgIGxvb3AgRXZlcnkgc2Vjb25kXG4gKiAgICAgVGltZXItPj5DTEk6IERlY3JlbWVudCBjb3VudGVyXG4gKiAgICAgQ0xJLT4+VXNlcjogRGlzcGxheSBjdXJyZW50IGNvdW50XG4gKiAgIGVuZFxuICogICBUaW1lci0+PkNMSTogQ291bnRlciByZWFjaGVzIDBcbiAqICAgQ0xJLT4+VXNlcjogRXhpdCBwcm9jZXNzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19leGl0X2NvZGV8Tm9kZS5qcyBwcm9jZXNzLmV4aXQoKX1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9zZXRUaW1lb3V0fE1ETiBzZXRUaW1lb3V0KCl9XG4gKi9cblxuLyoqXG4gKiBAY29uc3QgY291bnRlclxuICogQG5hbWUgY291bnRlclxuICogQGRlc2NyaXB0aW9uIFRoZSBjb3VudGRvd24gdGltZXIsIGluaXRpYWxpemVkIHRvIDYwIHNlY29uZHMuXG4gKiBAc3VtbWFyeSBVc2VkIHRvIHRyYWNrIHRoZSByZW1haW5pbmcgdGltZSBpbiB0aGUgY291bnRkb3duLlxuICogQHR5cGUge251bWJlcn1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dHMtd29ya3NwYWNlLmNsaVxuICovXG5sZXQgY291bnRlciA9IDYwO1xuY29uc29sZS5sb2coYFRoaXMgaXMgYSBwb29yIGV4YW1wbGUgb2YgYSBjbGkuIHdpbGwgc3RvcCBpbiAkezYwfSBzZWNvbmRzYCk7XG5cbi8qKlxuICogQGZ1bmN0aW9uIGl0ZXJhdG9yXG4gKiBAZGVzY3JpcHRpb24gQSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIHRoZSBjb3VudGRvd24gdGltZXIuXG4gKiBAc3VtbWFyeSBJdCB1c2VzIHNldFRpbWVvdXQgdG8gY3JlYXRlIGEgZGVsYXkgb2YgMSBzZWNvbmQgYmV0d2VlbiBlYWNoIGNvdW50LlxuICogVGhlIGZ1bmN0aW9uIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIsIGxvZ3MgdGhlIGN1cnJlbnQgY291bnQsIGFuZCBjYWxscyBpdHNlbGZcbiAqIHVudGlsIHRoZSBjb3VudGVyIHJlYWNoZXMgMC4gV2hlbiB0aGUgY291bnRlciByZWFjaGVzIDAsIHRoZSBwcm9jZXNzIGV4aXRzLlxuICpcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZS5jbGlcbiAqL1xuZnVuY3Rpb24gaXRlcmF0b3IoKSB7XG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghLS1jb3VudGVyKSBwcm9jZXNzLmV4aXQoMSk7XG4gICAgY29uc29sZS5sb2coY291bnRlcik7XG4gICAgaXRlcmF0b3IoKTtcbiAgfSwgMTAwMCk7XG59XG5cbml0ZXJhdG9yKCk7XG4iXX0=
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
- * @namespace cli
3
- * @description This script demonstrates a basic command-line interface (CLI) that counts down from 60 seconds and then exits.
4
- * @summary A simple CLI countdown timer that serves as a minimal example of how to create a CLI application using TypeScript.
5
- *
6
- * All files in the ./src/bin folder will have `#!/usr/bin/env node` included at the beginning of the file
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 the script
11
- * node cli.js
11
+ * // Run a module command
12
+ * $ npx decaf <module name> <module command> ...<module command options>
12
13
  *
13
- * @mermaid
14
- * sequenceDiagram
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
- * @memberOf module:ts-workspace
29
- * @see {@link https://nodejs.org/api/process.html#process_process_exit_code|Node.js process.exit()}
30
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/setTimeout|MDN setTimeout()}
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
- * @return {void}
49
- * @memberOf module:ts-workspace.cli
23
+ * @memberOf module:MCP
50
24
  */
51
- declare function iterator(): void;
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
+ }