@ibm/ibmi-mcp-server 0.3.2 → 0.4.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.
Files changed (139) hide show
  1. package/README.md +36 -24
  2. package/dist/cli/commands/columns.d.ts +7 -0
  3. package/dist/cli/commands/columns.d.ts.map +1 -0
  4. package/dist/cli/commands/columns.js +29 -0
  5. package/dist/cli/commands/columns.js.map +1 -0
  6. package/dist/cli/commands/completion.d.ts +10 -0
  7. package/dist/cli/commands/completion.d.ts.map +1 -0
  8. package/dist/cli/commands/completion.js +225 -0
  9. package/dist/cli/commands/completion.js.map +1 -0
  10. package/dist/cli/commands/related.d.ts +7 -0
  11. package/dist/cli/commands/related.d.ts.map +1 -0
  12. package/dist/cli/commands/related.js +32 -0
  13. package/dist/cli/commands/related.js.map +1 -0
  14. package/dist/cli/commands/schemas.d.ts +7 -0
  15. package/dist/cli/commands/schemas.d.ts.map +1 -0
  16. package/dist/cli/commands/schemas.js +49 -0
  17. package/dist/cli/commands/schemas.js.map +1 -0
  18. package/dist/cli/commands/sql.d.ts +8 -0
  19. package/dist/cli/commands/sql.d.ts.map +1 -0
  20. package/dist/cli/commands/sql.js +106 -0
  21. package/dist/cli/commands/sql.js.map +1 -0
  22. package/dist/cli/commands/system.d.ts +11 -0
  23. package/dist/cli/commands/system.d.ts.map +1 -0
  24. package/dist/cli/commands/system.js +263 -0
  25. package/dist/cli/commands/system.js.map +1 -0
  26. package/dist/cli/commands/tables.d.ts +7 -0
  27. package/dist/cli/commands/tables.d.ts.map +1 -0
  28. package/dist/cli/commands/tables.js +48 -0
  29. package/dist/cli/commands/tables.js.map +1 -0
  30. package/dist/cli/commands/tool.d.ts +18 -0
  31. package/dist/cli/commands/tool.d.ts.map +1 -0
  32. package/dist/cli/commands/tool.js +194 -0
  33. package/dist/cli/commands/tool.js.map +1 -0
  34. package/dist/cli/commands/tools-list.d.ts +20 -0
  35. package/dist/cli/commands/tools-list.d.ts.map +1 -0
  36. package/dist/cli/commands/tools-list.js +209 -0
  37. package/dist/cli/commands/tools-list.js.map +1 -0
  38. package/dist/cli/commands/validate.d.ts +7 -0
  39. package/dist/cli/commands/validate.d.ts.map +1 -0
  40. package/dist/cli/commands/validate.js +77 -0
  41. package/dist/cli/commands/validate.js.map +1 -0
  42. package/dist/cli/config/credentials.d.ts +21 -0
  43. package/dist/cli/config/credentials.d.ts.map +1 -0
  44. package/dist/cli/config/credentials.js +96 -0
  45. package/dist/cli/config/credentials.js.map +1 -0
  46. package/dist/cli/config/index.d.ts +10 -0
  47. package/dist/cli/config/index.d.ts.map +1 -0
  48. package/dist/cli/config/index.js +9 -0
  49. package/dist/cli/config/index.js.map +1 -0
  50. package/dist/cli/config/loader.d.ts +36 -0
  51. package/dist/cli/config/loader.d.ts.map +1 -0
  52. package/dist/cli/config/loader.js +206 -0
  53. package/dist/cli/config/loader.js.map +1 -0
  54. package/dist/cli/config/resolver.d.ts +26 -0
  55. package/dist/cli/config/resolver.d.ts.map +1 -0
  56. package/dist/cli/config/resolver.js +102 -0
  57. package/dist/cli/config/resolver.js.map +1 -0
  58. package/dist/cli/config/schema.d.ts +128 -0
  59. package/dist/cli/config/schema.d.ts.map +1 -0
  60. package/dist/cli/config/schema.js +37 -0
  61. package/dist/cli/config/schema.js.map +1 -0
  62. package/dist/cli/config/types.d.ts +59 -0
  63. package/dist/cli/config/types.d.ts.map +1 -0
  64. package/dist/cli/config/types.js +6 -0
  65. package/dist/cli/config/types.js.map +1 -0
  66. package/dist/cli/formatters/output.d.ts +60 -0
  67. package/dist/cli/formatters/output.d.ts.map +1 -0
  68. package/dist/cli/formatters/output.js +190 -0
  69. package/dist/cli/formatters/output.js.map +1 -0
  70. package/dist/cli/index.d.ts +13 -0
  71. package/dist/cli/index.d.ts.map +1 -0
  72. package/dist/cli/index.js +98 -0
  73. package/dist/cli/index.js.map +1 -0
  74. package/dist/cli/utils/command-helpers.d.ts +47 -0
  75. package/dist/cli/utils/command-helpers.d.ts.map +1 -0
  76. package/dist/cli/utils/command-helpers.js +211 -0
  77. package/dist/cli/utils/command-helpers.js.map +1 -0
  78. package/dist/cli/utils/connection.d.ts +20 -0
  79. package/dist/cli/utils/connection.d.ts.map +1 -0
  80. package/dist/cli/utils/connection.js +37 -0
  81. package/dist/cli/utils/connection.js.map +1 -0
  82. package/dist/cli/utils/exit-codes.d.ts +48 -0
  83. package/dist/cli/utils/exit-codes.d.ts.map +1 -0
  84. package/dist/cli/utils/exit-codes.js +111 -0
  85. package/dist/cli/utils/exit-codes.js.map +1 -0
  86. package/dist/cli/utils/yaml-loader.d.ts +69 -0
  87. package/dist/cli/utils/yaml-loader.d.ts.map +1 -0
  88. package/dist/cli/utils/yaml-loader.js +135 -0
  89. package/dist/cli/utils/yaml-loader.js.map +1 -0
  90. package/dist/cli/utils/yaml-to-commander.d.ts +26 -0
  91. package/dist/cli/utils/yaml-to-commander.d.ts.map +1 -0
  92. package/dist/cli/utils/yaml-to-commander.js +156 -0
  93. package/dist/cli/utils/yaml-to-commander.js.map +1 -0
  94. package/dist/config/index.d.ts +1 -0
  95. package/dist/config/index.d.ts.map +1 -1
  96. package/dist/config/index.js +9 -10
  97. package/dist/config/index.js.map +1 -1
  98. package/dist/config/resolver.d.ts.map +1 -1
  99. package/dist/config/resolver.js +6 -0
  100. package/dist/config/resolver.js.map +1 -1
  101. package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts.map +1 -1
  102. package/dist/ibmi-mcp-server/tools/executeSql.tool.js +6 -2
  103. package/dist/ibmi-mcp-server/tools/executeSql.tool.js.map +1 -1
  104. package/dist/ibmi-mcp-server/tools/generateSql.tool.js +1 -1
  105. package/dist/ibmi-mcp-server/tools/generateSql.tool.js.map +1 -1
  106. package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.d.ts +93 -0
  107. package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.d.ts.map +1 -0
  108. package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.js +198 -0
  109. package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.js.map +1 -0
  110. package/dist/ibmi-mcp-server/tools/getTableColumns.tool.d.ts +87 -0
  111. package/dist/ibmi-mcp-server/tools/getTableColumns.tool.d.ts.map +1 -0
  112. package/dist/ibmi-mcp-server/tools/getTableColumns.tool.js +163 -0
  113. package/dist/ibmi-mcp-server/tools/getTableColumns.tool.js.map +1 -0
  114. package/dist/ibmi-mcp-server/tools/index.d.ts +175 -0
  115. package/dist/ibmi-mcp-server/tools/index.d.ts.map +1 -1
  116. package/dist/ibmi-mcp-server/tools/index.js +27 -1
  117. package/dist/ibmi-mcp-server/tools/index.js.map +1 -1
  118. package/dist/ibmi-mcp-server/tools/listSchemas.tool.d.ts +107 -0
  119. package/dist/ibmi-mcp-server/tools/listSchemas.tool.d.ts.map +1 -0
  120. package/dist/ibmi-mcp-server/tools/listSchemas.tool.js +195 -0
  121. package/dist/ibmi-mcp-server/tools/listSchemas.tool.js.map +1 -0
  122. package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.d.ts +107 -0
  123. package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.d.ts.map +1 -0
  124. package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.js +198 -0
  125. package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.js.map +1 -0
  126. package/dist/ibmi-mcp-server/tools/validateQuery.tool.d.ts +229 -0
  127. package/dist/ibmi-mcp-server/tools/validateQuery.tool.d.ts.map +1 -0
  128. package/dist/ibmi-mcp-server/tools/validateQuery.tool.js +401 -0
  129. package/dist/ibmi-mcp-server/tools/validateQuery.tool.js.map +1 -0
  130. package/dist/ibmi-mcp-server/utils/cli/argumentParser.d.ts +2 -0
  131. package/dist/ibmi-mcp-server/utils/cli/argumentParser.d.ts.map +1 -1
  132. package/dist/ibmi-mcp-server/utils/cli/argumentParser.js +21 -7
  133. package/dist/ibmi-mcp-server/utils/cli/argumentParser.js.map +1 -1
  134. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +1 -1
  135. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
  136. package/dist/mcp-server/tools/index.d.ts.map +1 -1
  137. package/dist/mcp-server/tools/index.js +5 -3
  138. package/dist/mcp-server/tools/index.js.map +1 -1
  139. package/package.json +6 -4
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @fileoverview `ibmi sql "<sql>"` command — execute SQL queries.
3
+ * Supports inline SQL, --file, and stdin piping.
4
+ * @module cli/commands/sql
5
+ */
6
+ import { readFileSync } from "fs";
7
+ import { withConnection, getFormat } from "../utils/command-helpers.js";
8
+ import { renderMessage } from "../formatters/output.js";
9
+ import { ExitCode } from "../utils/exit-codes.js";
10
+ /**
11
+ * Read SQL from stdin (piped input).
12
+ * Returns null if stdin is a TTY (interactive).
13
+ */
14
+ function readStdin() {
15
+ if (process.stdin.isTTY)
16
+ return null;
17
+ try {
18
+ return readFileSync(0, "utf-8").trim();
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ export function registerSqlCommand(program) {
25
+ program
26
+ .command("sql [statement]")
27
+ .description("Execute a SQL query against the target system")
28
+ .option("--file <path>", "Read SQL from a file")
29
+ .option("--limit <n>", "Maximum rows to return")
30
+ .option("--read-only", "Enforce read-only mode (default: true)", true)
31
+ .option("--no-read-only", "Allow mutation queries")
32
+ .option("--dry-run", "Print SQL without executing", false)
33
+ .action(async (statement, opts, cmd) => {
34
+ // Resolve SQL source: argument > --file > stdin
35
+ let sql = statement;
36
+ if (!sql && opts["file"]) {
37
+ try {
38
+ sql = readFileSync(opts["file"], "utf-8").trim();
39
+ }
40
+ catch (err) {
41
+ process.stderr.write(`Error reading file: ${err instanceof Error ? err.message : String(err)}\n`);
42
+ process.exitCode = ExitCode.USAGE;
43
+ return;
44
+ }
45
+ }
46
+ if (!sql) {
47
+ sql = readStdin() ?? undefined;
48
+ }
49
+ if (!sql) {
50
+ process.stderr.write("Error: No SQL provided. Pass as argument, use --file, or pipe via stdin.\n");
51
+ process.exitCode = ExitCode.USAGE;
52
+ return;
53
+ }
54
+ // Dry run: print SQL and exit
55
+ if (opts["dryRun"]) {
56
+ const format = getFormat(cmd);
57
+ renderMessage(sql, format);
58
+ return;
59
+ }
60
+ await withConnection(cmd, "execute_sql", async (resolved, ctx) => {
61
+ // Configure read-only mode based on CLI flag and system config
62
+ const readOnly = opts["readOnly"] || resolved.config.readOnly;
63
+ // Confirm execution if system requires it
64
+ if (resolved.config.confirm && process.stdin.isTTY) {
65
+ const { promptPassword } = await import("../config/credentials.js");
66
+ const answer = await promptPassword(`Execute on [${resolved.name}]? (y/N) `);
67
+ if (answer.toLowerCase() !== "y") {
68
+ throw new Error("Execution cancelled by user");
69
+ }
70
+ }
71
+ // Apply maxRows limit if not already in the query
72
+ let execSql = sql;
73
+ let maxRows = resolved.config.maxRows;
74
+ if (opts["limit"]) {
75
+ maxRows = parseInt(opts["limit"], 10);
76
+ if (isNaN(maxRows) || maxRows < 0) {
77
+ throw new Error(`Invalid --limit value: "${opts["limit"]}". Must be a positive integer.`);
78
+ }
79
+ }
80
+ if (maxRows &&
81
+ !execSql.toUpperCase().includes("FETCH FIRST") &&
82
+ !execSql.toUpperCase().includes("FETCH NEXT")) {
83
+ execSql = `${execSql.replace(/;\s*$/, "")} FETCH FIRST ${maxRows} ROWS ONLY`;
84
+ }
85
+ // Configure execute_sql tool security before importing
86
+ const { configureExecuteSqlTool } = await import("../../ibmi-mcp-server/tools/executeSql.tool.js");
87
+ configureExecuteSqlTool({
88
+ enabled: true,
89
+ security: { readOnly },
90
+ });
91
+ const { executeSqlTool } = await import("../../ibmi-mcp-server/tools/executeSql.tool.js");
92
+ const logicFn = executeSqlTool.logic;
93
+ const result = await logicFn({ sql: execSql }, ctx, {});
94
+ if (!result.success) {
95
+ throw new Error(result.error?.message ?? "SQL execution failed");
96
+ }
97
+ return {
98
+ data: (result.data ?? []),
99
+ meta: {
100
+ rowCount: result.rowCount ?? 0,
101
+ },
102
+ };
103
+ });
104
+ });
105
+ }
106
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../src/cli/commands/sql.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD;;;GAGG;AACH,SAAS,SAAS;IAChB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,wCAAwC,EAAE,IAAI,CAAC;SACrE,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;SAClD,MAAM,CAAC,WAAW,EAAE,6BAA6B,EAAE,KAAK,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,IAAI,EAAE,GAAY,EAAE,EAAE;QAClE,gDAAgD;QAChD,IAAI,GAAG,GAAG,SAAS,CAAC;QAEpB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC5E,CAAC;gBACF,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAClC,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,SAAS,EAAE,IAAI,SAAS,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4EAA4E,CAC7E,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClC,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9B,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE;YAC/D,+DAA+D;YAC/D,MAAM,QAAQ,GACX,IAAI,CAAC,UAAU,CAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YAE5D,0CAA0C;YAC1C,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CACrC,0BAA0B,CAC3B,CAAC;gBACF,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,eAAe,QAAQ,CAAC,IAAI,WAAW,CACxC,CAAC;gBACF,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAED,kDAAkD;YAClD,IAAI,OAAO,GAAG,GAAI,CAAC;YACnB,IAAI,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;YACtC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClB,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAW,EAAE,EAAE,CAAC,CAAC;gBAChD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;YAED,IACE,OAAO;gBACP,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC9C,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC7C,CAAC;gBACD,OAAO,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,OAAO,YAAY,CAAC;YAC/E,CAAC;YAED,uDAAuD;YACvD,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAC9C,gDAAgD,CACjD,CAAC;YACF,uBAAuB,CAAC;gBACtB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,EAAE,QAAQ,EAAE;aACvB,CAAC,CAAC;YAEH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CACrC,gDAAgD,CACjD,CAAC;YACF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC;YAErC,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,EAAE,GAAG,EAAE,OAAO,EAAE,EAChB,GAAG,EACH,EAAgB,CACjB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;YACnE,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAA8B;gBACtD,IAAI,EAAE;oBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;iBAC/B;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview `ibmi system` commands for managing IBM i system configurations.
3
+ * Provides list, show, add, remove, default, and test subcommands.
4
+ * @module cli/commands/system
5
+ */
6
+ import { Command } from "commander";
7
+ /**
8
+ * Register all `ibmi system` subcommands.
9
+ */
10
+ export declare function registerSystemCommand(program: Command): void;
11
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/system.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0DpC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoQ5D"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * @fileoverview `ibmi system` commands for managing IBM i system configurations.
3
+ * Provides list, show, add, remove, default, and test subcommands.
4
+ * @module cli/commands/system
5
+ */
6
+ import * as readline from "readline";
7
+ import { loadConfig, upsertSystem, removeSystem, setDefaultSystem, getUserConfigPath, getProjectConfigPath, } from "../config/index.js";
8
+ import { renderOutput, renderError, renderMessage, } from "../formatters/output.js";
9
+ import { ExitCode, classifyError } from "../utils/exit-codes.js";
10
+ import { connectSystem } from "../utils/connection.js";
11
+ import { getFormat } from "../utils/command-helpers.js";
12
+ /**
13
+ * Test connectivity to an IBM i system by establishing and closing a connection.
14
+ */
15
+ async function testSystemConnection(name, sys) {
16
+ const base = { NAME: name, HOST: sys.host, PORT: sys.port, USER: sys.user };
17
+ let cleanup;
18
+ try {
19
+ const resolved = {
20
+ name,
21
+ config: sys,
22
+ source: "flag",
23
+ };
24
+ cleanup = await connectSystem(resolved);
25
+ return { ...base, STATUS: "connected" };
26
+ }
27
+ catch (err) {
28
+ const msg = err instanceof Error ? err.message : String(err);
29
+ return { ...base, STATUS: "error", ERROR: msg };
30
+ }
31
+ finally {
32
+ if (cleanup)
33
+ await cleanup();
34
+ }
35
+ }
36
+ /**
37
+ * Register all `ibmi system` subcommands.
38
+ */
39
+ export function registerSystemCommand(program) {
40
+ const system = program
41
+ .command("system")
42
+ .description("Manage IBM i system connections");
43
+ // ── ibmi system list ──
44
+ system
45
+ .command("list")
46
+ .description("List all configured systems")
47
+ .action((_opts, cmd) => {
48
+ const format = getFormat(cmd);
49
+ try {
50
+ const config = loadConfig();
51
+ const systems = Object.entries(config.systems);
52
+ if (systems.length === 0) {
53
+ renderMessage("No systems configured. Run: ibmi system add <name>", format);
54
+ return;
55
+ }
56
+ const data = systems.map(([name, sys]) => ({
57
+ NAME: name,
58
+ HOST: sys.host,
59
+ USER: sys.user,
60
+ PORT: sys.port,
61
+ READ_ONLY: sys.readOnly ? "yes" : "no",
62
+ DEFAULT: name === config.default ? "✓" : "",
63
+ }));
64
+ renderOutput(data, format, { rowCount: data.length });
65
+ }
66
+ catch (err) {
67
+ renderError(err instanceof Error ? err : new Error(String(err)), format);
68
+ process.exitCode = ExitCode.GENERAL;
69
+ }
70
+ });
71
+ // ── ibmi system show <name> ──
72
+ system
73
+ .command("show <name>")
74
+ .description("Show configuration for a system")
75
+ .action((name, _opts, cmd) => {
76
+ const format = getFormat(cmd);
77
+ try {
78
+ const config = loadConfig();
79
+ const sys = config.systems[name];
80
+ if (!sys) {
81
+ throw new Error(`System "${name}" not found. Run: ibmi system list`);
82
+ }
83
+ const data = [
84
+ { PROPERTY: "host", VALUE: sys.host },
85
+ { PROPERTY: "port", VALUE: String(sys.port) },
86
+ { PROPERTY: "user", VALUE: sys.user },
87
+ { PROPERTY: "password", VALUE: sys.password ? "****" : "(not set)" },
88
+ { PROPERTY: "defaultSchema", VALUE: sys.defaultSchema ?? "(none)" },
89
+ { PROPERTY: "readOnly", VALUE: String(sys.readOnly) },
90
+ { PROPERTY: "confirm", VALUE: String(sys.confirm) },
91
+ { PROPERTY: "timeout", VALUE: `${sys.timeout}s` },
92
+ { PROPERTY: "maxRows", VALUE: String(sys.maxRows) },
93
+ { PROPERTY: "description", VALUE: sys.description ?? "(none)" },
94
+ {
95
+ PROPERTY: "default",
96
+ VALUE: name === config.default ? "yes" : "no",
97
+ },
98
+ ];
99
+ renderOutput(data, format, { rowCount: data.length });
100
+ }
101
+ catch (err) {
102
+ renderError(err instanceof Error ? err : new Error(String(err)), format);
103
+ process.exitCode = ExitCode.GENERAL;
104
+ }
105
+ });
106
+ // ── ibmi system add <name> ──
107
+ system
108
+ .command("add <name>")
109
+ .description("Add a new system configuration")
110
+ .option("--host <host>", "IBM i hostname")
111
+ .option("--port <port>", "Mapepire port", "8076")
112
+ .option("--user <user>", "User profile")
113
+ .option("--password <password>", "Password (or use env var reference: ${MY_PASS})")
114
+ .option("--description <desc>", "Description")
115
+ .option("--read-only", "Block mutation queries", false)
116
+ .option("--default-schema <schema>", "Default schema/library")
117
+ .action(async (name, opts, cmd) => {
118
+ const format = getFormat(cmd);
119
+ try {
120
+ let host = opts["host"];
121
+ let user = opts["user"];
122
+ // Interactive prompts for required fields
123
+ if (!host || !user) {
124
+ if (!process.stdin.isTTY) {
125
+ throw new Error("Missing required options --host and --user. In non-interactive mode, all options must be provided.");
126
+ }
127
+ const rl = readline.createInterface({
128
+ input: process.stdin,
129
+ output: process.stderr,
130
+ });
131
+ const ask = (question) => new Promise((resolve) => rl.question(question, resolve));
132
+ if (!host)
133
+ host = await ask("Host: ");
134
+ if (!user)
135
+ user = await ask("User: ");
136
+ rl.close();
137
+ }
138
+ const port = parseInt(opts["port"], 10);
139
+ if (isNaN(port) || port <= 0 || port > 65535) {
140
+ throw new Error(`Invalid --port value: "${opts["port"]}". Must be a number between 1 and 65535.`);
141
+ }
142
+ const system = {
143
+ host,
144
+ port,
145
+ user,
146
+ password: opts["password"],
147
+ description: opts["description"],
148
+ defaultSchema: opts["defaultSchema"],
149
+ readOnly: opts["readOnly"],
150
+ confirm: false,
151
+ timeout: 60,
152
+ maxRows: 5000,
153
+ ignoreUnauthorized: true,
154
+ };
155
+ upsertSystem(name, system);
156
+ renderMessage(`System "${name}" added. Config saved to ${getUserConfigPath()}`, format);
157
+ }
158
+ catch (err) {
159
+ renderError(err instanceof Error ? err : new Error(String(err)), format);
160
+ process.exitCode = ExitCode.GENERAL;
161
+ }
162
+ });
163
+ // ── ibmi system remove <name> ──
164
+ system
165
+ .command("remove <name>")
166
+ .description("Remove a system configuration")
167
+ .action((name, _opts, cmd) => {
168
+ const format = getFormat(cmd);
169
+ try {
170
+ const removed = removeSystem(name);
171
+ if (removed) {
172
+ renderMessage(`System "${name}" removed.`, format);
173
+ }
174
+ else {
175
+ throw new Error(`System "${name}" not found.`);
176
+ }
177
+ }
178
+ catch (err) {
179
+ renderError(err instanceof Error ? err : new Error(String(err)), format);
180
+ process.exitCode = ExitCode.GENERAL;
181
+ }
182
+ });
183
+ // ── ibmi system default <name> ──
184
+ system
185
+ .command("default <name>")
186
+ .description("Set the default system")
187
+ .action((name, _opts, cmd) => {
188
+ const format = getFormat(cmd);
189
+ try {
190
+ setDefaultSystem(name);
191
+ renderMessage(`Default system set to "${name}".`, format);
192
+ }
193
+ catch (err) {
194
+ renderError(err instanceof Error ? err : new Error(String(err)), format);
195
+ process.exitCode = ExitCode.GENERAL;
196
+ }
197
+ });
198
+ // ── ibmi system test [name] ──
199
+ system
200
+ .command("test [name]")
201
+ .description("Test connectivity to a system")
202
+ .option("--all", "Test all configured systems")
203
+ .action(async (name, opts, cmd) => {
204
+ const format = getFormat(cmd);
205
+ try {
206
+ const config = loadConfig();
207
+ if (opts["all"]) {
208
+ const results = [];
209
+ let hasFailure = false;
210
+ for (const [sysName, sys] of Object.entries(config.systems)) {
211
+ const result = await testSystemConnection(sysName, sys);
212
+ results.push(result);
213
+ if (result.STATUS === "error")
214
+ hasFailure = true;
215
+ }
216
+ renderOutput(results, format, { rowCount: results.length });
217
+ if (hasFailure)
218
+ process.exitCode = ExitCode.GENERAL;
219
+ return;
220
+ }
221
+ // Resolve which system to test
222
+ const targetName = name ??
223
+ cmd.optsWithGlobals()["system"] ??
224
+ config.default;
225
+ if (!targetName) {
226
+ throw new Error("No system specified. Pass a name or set a default.");
227
+ }
228
+ const sys = config.systems[targetName];
229
+ if (!sys) {
230
+ throw new Error(`System "${targetName}" not found.`);
231
+ }
232
+ const result = await testSystemConnection(targetName, sys);
233
+ renderOutput([
234
+ { PROPERTY: "system", VALUE: result.NAME },
235
+ { PROPERTY: "host", VALUE: `${result.HOST}:${result.PORT}` },
236
+ { PROPERTY: "user", VALUE: result.USER },
237
+ { PROPERTY: "status", VALUE: result.STATUS },
238
+ ...(result.ERROR ? [{ PROPERTY: "error", VALUE: result.ERROR }] : []),
239
+ ], format, { rowCount: 1 });
240
+ if (result.STATUS === "error") {
241
+ process.exitCode = ExitCode.GENERAL;
242
+ }
243
+ }
244
+ catch (err) {
245
+ const error = err instanceof Error ? err : new Error(String(err));
246
+ const classified = classifyError(error);
247
+ renderError(error, format, undefined, classified.errorCode);
248
+ process.exitCode = classified.exitCode;
249
+ }
250
+ });
251
+ // ── ibmi system config-path ──
252
+ system
253
+ .command("config-path")
254
+ .description("Show config file paths")
255
+ .action((_opts, cmd) => {
256
+ const format = getFormat(cmd);
257
+ renderOutput([
258
+ { SCOPE: "user", PATH: getUserConfigPath() },
259
+ { SCOPE: "project", PATH: getProjectConfigPath() },
260
+ ], format, { rowCount: 2 });
261
+ });
262
+ }
263
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/cli/commands/system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview `ibmi tables <schema>` command — list tables in a schema.
3
+ * @module cli/commands/tables
4
+ */
5
+ import { Command } from "commander";
6
+ export declare function registerTablesCommand(program: Command): void;
7
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tables.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkD5D"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @fileoverview `ibmi tables <schema>` command — list tables in a schema.
3
+ * @module cli/commands/tables
4
+ */
5
+ import { withConnection } from "../utils/command-helpers.js";
6
+ import { ExitCode } from "../utils/exit-codes.js";
7
+ export function registerTablesCommand(program) {
8
+ program
9
+ .command("tables <schema>")
10
+ .description("List tables, views, and physical files in a schema")
11
+ .option("--filter <pattern>", "Filter by table name (SQL LIKE pattern, e.g. 'CUST%')")
12
+ .option("--limit <n>", "Maximum rows to return", "50")
13
+ .option("--offset <n>", "Rows to skip for pagination", "0")
14
+ .action(async (schema, opts, cmd) => {
15
+ const limit = parseInt(opts["limit"], 10);
16
+ const offset = parseInt(opts["offset"], 10);
17
+ if (isNaN(limit) || limit < 0) {
18
+ process.stderr.write(`Error: Invalid --limit value: "${opts["limit"]}". Must be a positive integer.\n`);
19
+ process.exitCode = ExitCode.USAGE;
20
+ return;
21
+ }
22
+ if (isNaN(offset) || offset < 0) {
23
+ process.stderr.write(`Error: Invalid --offset value: "${opts["offset"]}". Must be a non-negative integer.\n`);
24
+ process.exitCode = ExitCode.USAGE;
25
+ return;
26
+ }
27
+ await withConnection(cmd, "list_tables_in_schema", async (_resolved, ctx) => {
28
+ const { listTablesLogic } = await import("../../ibmi-mcp-server/tools/listTablesInSchema.tool.js");
29
+ const result = await listTablesLogic({
30
+ schema_name: schema,
31
+ table_filter: opts["filter"] ?? "*ALL",
32
+ limit,
33
+ offset,
34
+ }, ctx, {});
35
+ if (!result.success) {
36
+ throw new Error(result.error?.message ?? "Failed to list tables");
37
+ }
38
+ return {
39
+ data: (result.data ?? []),
40
+ meta: {
41
+ rowCount: result.rowCount ?? 0,
42
+ hasMore: result.hasMore,
43
+ },
44
+ };
45
+ });
46
+ });
47
+ }
48
+ //# sourceMappingURL=tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/cli/commands/tables.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,oBAAoB,EAAE,uDAAuD,CAAC;SACrF,MAAM,CAAC,aAAa,EAAE,wBAAwB,EAAE,IAAI,CAAC;SACrD,MAAM,CAAC,cAAc,EAAE,6BAA6B,EAAE,GAAG,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,GAAY,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAW,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAW,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACxG,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAI,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC;YAC9G,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,cAAc,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE;YAC1E,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CACtC,wDAAwD,CACzD,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC;gBACE,WAAW,EAAE,MAAM;gBACnB,YAAY,EAAG,IAAI,CAAC,QAAQ,CAAwB,IAAI,MAAM;gBAC9D,KAAK;gBACL,MAAM;aACP,EACD,GAAG,EACH,EAAgB,CACjB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,uBAAuB,CAAC,CAAC;YACpE,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAA8B;gBACtD,IAAI,EAAE;oBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;oBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;iBACxB;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @fileoverview Dynamic YAML tool execution command.
3
+ *
4
+ * `ibmi tool <name> [options]` — run any YAML-defined tool from the CLI.
5
+ *
6
+ * The command uses allowUnknownOption() to accept arbitrary tool-specific
7
+ * options, then resolves them against the YAML parameter definitions.
8
+ *
9
+ * Supports --dry-run to show the resolved SQL and parameters without executing.
10
+ *
11
+ * @module cli/commands/tool
12
+ */
13
+ import { Command } from "commander";
14
+ /**
15
+ * Register `ibmi tool <name>` — dynamic YAML tool execution.
16
+ */
17
+ export declare function registerToolCommand(program: Command): void;
18
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+E1D"}