@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.
- package/README.md +36 -24
- package/dist/cli/commands/columns.d.ts +7 -0
- package/dist/cli/commands/columns.d.ts.map +1 -0
- package/dist/cli/commands/columns.js +29 -0
- package/dist/cli/commands/columns.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +10 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +225 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/related.d.ts +7 -0
- package/dist/cli/commands/related.d.ts.map +1 -0
- package/dist/cli/commands/related.js +32 -0
- package/dist/cli/commands/related.js.map +1 -0
- package/dist/cli/commands/schemas.d.ts +7 -0
- package/dist/cli/commands/schemas.d.ts.map +1 -0
- package/dist/cli/commands/schemas.js +49 -0
- package/dist/cli/commands/schemas.js.map +1 -0
- package/dist/cli/commands/sql.d.ts +8 -0
- package/dist/cli/commands/sql.d.ts.map +1 -0
- package/dist/cli/commands/sql.js +106 -0
- package/dist/cli/commands/sql.js.map +1 -0
- package/dist/cli/commands/system.d.ts +11 -0
- package/dist/cli/commands/system.d.ts.map +1 -0
- package/dist/cli/commands/system.js +263 -0
- package/dist/cli/commands/system.js.map +1 -0
- package/dist/cli/commands/tables.d.ts +7 -0
- package/dist/cli/commands/tables.d.ts.map +1 -0
- package/dist/cli/commands/tables.js +48 -0
- package/dist/cli/commands/tables.js.map +1 -0
- package/dist/cli/commands/tool.d.ts +18 -0
- package/dist/cli/commands/tool.d.ts.map +1 -0
- package/dist/cli/commands/tool.js +194 -0
- package/dist/cli/commands/tool.js.map +1 -0
- package/dist/cli/commands/tools-list.d.ts +20 -0
- package/dist/cli/commands/tools-list.d.ts.map +1 -0
- package/dist/cli/commands/tools-list.js +209 -0
- package/dist/cli/commands/tools-list.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +7 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +77 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/config/credentials.d.ts +21 -0
- package/dist/cli/config/credentials.d.ts.map +1 -0
- package/dist/cli/config/credentials.js +96 -0
- package/dist/cli/config/credentials.js.map +1 -0
- package/dist/cli/config/index.d.ts +10 -0
- package/dist/cli/config/index.d.ts.map +1 -0
- package/dist/cli/config/index.js +9 -0
- package/dist/cli/config/index.js.map +1 -0
- package/dist/cli/config/loader.d.ts +36 -0
- package/dist/cli/config/loader.d.ts.map +1 -0
- package/dist/cli/config/loader.js +206 -0
- package/dist/cli/config/loader.js.map +1 -0
- package/dist/cli/config/resolver.d.ts +26 -0
- package/dist/cli/config/resolver.d.ts.map +1 -0
- package/dist/cli/config/resolver.js +102 -0
- package/dist/cli/config/resolver.js.map +1 -0
- package/dist/cli/config/schema.d.ts +128 -0
- package/dist/cli/config/schema.d.ts.map +1 -0
- package/dist/cli/config/schema.js +37 -0
- package/dist/cli/config/schema.js.map +1 -0
- package/dist/cli/config/types.d.ts +59 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +6 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/formatters/output.d.ts +60 -0
- package/dist/cli/formatters/output.d.ts.map +1 -0
- package/dist/cli/formatters/output.js +190 -0
- package/dist/cli/formatters/output.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +98 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/command-helpers.d.ts +47 -0
- package/dist/cli/utils/command-helpers.d.ts.map +1 -0
- package/dist/cli/utils/command-helpers.js +211 -0
- package/dist/cli/utils/command-helpers.js.map +1 -0
- package/dist/cli/utils/connection.d.ts +20 -0
- package/dist/cli/utils/connection.d.ts.map +1 -0
- package/dist/cli/utils/connection.js +37 -0
- package/dist/cli/utils/connection.js.map +1 -0
- package/dist/cli/utils/exit-codes.d.ts +48 -0
- package/dist/cli/utils/exit-codes.d.ts.map +1 -0
- package/dist/cli/utils/exit-codes.js +111 -0
- package/dist/cli/utils/exit-codes.js.map +1 -0
- package/dist/cli/utils/yaml-loader.d.ts +69 -0
- package/dist/cli/utils/yaml-loader.d.ts.map +1 -0
- package/dist/cli/utils/yaml-loader.js +135 -0
- package/dist/cli/utils/yaml-loader.js.map +1 -0
- package/dist/cli/utils/yaml-to-commander.d.ts +26 -0
- package/dist/cli/utils/yaml-to-commander.d.ts.map +1 -0
- package/dist/cli/utils/yaml-to-commander.js +156 -0
- package/dist/cli/utils/yaml-to-commander.js.map +1 -0
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +9 -10
- package/dist/config/index.js.map +1 -1
- package/dist/config/resolver.d.ts.map +1 -1
- package/dist/config/resolver.js +6 -0
- package/dist/config/resolver.js.map +1 -1
- package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/tools/executeSql.tool.js +6 -2
- package/dist/ibmi-mcp-server/tools/executeSql.tool.js.map +1 -1
- package/dist/ibmi-mcp-server/tools/generateSql.tool.js +1 -1
- package/dist/ibmi-mcp-server/tools/generateSql.tool.js.map +1 -1
- package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.d.ts +93 -0
- package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.js +198 -0
- package/dist/ibmi-mcp-server/tools/getRelatedObjects.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/getTableColumns.tool.d.ts +87 -0
- package/dist/ibmi-mcp-server/tools/getTableColumns.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/getTableColumns.tool.js +163 -0
- package/dist/ibmi-mcp-server/tools/getTableColumns.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/index.d.ts +175 -0
- package/dist/ibmi-mcp-server/tools/index.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/tools/index.js +27 -1
- package/dist/ibmi-mcp-server/tools/index.js.map +1 -1
- package/dist/ibmi-mcp-server/tools/listSchemas.tool.d.ts +107 -0
- package/dist/ibmi-mcp-server/tools/listSchemas.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/listSchemas.tool.js +195 -0
- package/dist/ibmi-mcp-server/tools/listSchemas.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.d.ts +107 -0
- package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.js +198 -0
- package/dist/ibmi-mcp-server/tools/listTablesInSchema.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/validateQuery.tool.d.ts +229 -0
- package/dist/ibmi-mcp-server/tools/validateQuery.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/validateQuery.tool.js +401 -0
- package/dist/ibmi-mcp-server/tools/validateQuery.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.d.ts +2 -0
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.js +21 -7
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +1 -1
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
- package/dist/mcp-server/tools/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/index.js +5 -3
- package/dist/mcp-server/tools/index.js.map +1 -1
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|