@ibm/ibmi-mcp-server 0.3.2 → 0.4.0
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/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/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/security/sqlSecurityValidator.js +1 -1
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Discovery commands for YAML-defined tools.
|
|
3
|
+
*
|
|
4
|
+
* - `ibmi tools` — List all available tools
|
|
5
|
+
* - `ibmi tools show <name>` — Show detailed info for a single tool
|
|
6
|
+
* - `ibmi toolsets` — List all toolsets
|
|
7
|
+
*
|
|
8
|
+
* These are read-only commands that parse YAML files without connecting to a system.
|
|
9
|
+
* @module cli/commands/tools-list
|
|
10
|
+
*/
|
|
11
|
+
import { loadYamlTools, buildToolsetMap, } from "../utils/yaml-loader.js";
|
|
12
|
+
import { getFormat } from "../utils/command-helpers.js";
|
|
13
|
+
import { renderOutput, renderError, renderMessage, } from "../formatters/output.js";
|
|
14
|
+
import { ExitCode } from "../utils/exit-codes.js";
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the --tools paths from command options.
|
|
17
|
+
* Falls back to the default tools/ directory relative to the package root.
|
|
18
|
+
*/
|
|
19
|
+
function resolveToolsPaths(cmd) {
|
|
20
|
+
const opts = cmd.optsWithGlobals();
|
|
21
|
+
const toolsOpt = opts["tools"];
|
|
22
|
+
if (toolsOpt) {
|
|
23
|
+
return toolsOpt.split(",").map((p) => p.trim());
|
|
24
|
+
}
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load YAML tools config from CLI options, with error handling.
|
|
29
|
+
*/
|
|
30
|
+
function loadToolsConfig(cmd) {
|
|
31
|
+
const paths = resolveToolsPaths(cmd);
|
|
32
|
+
if (paths.length === 0) {
|
|
33
|
+
process.stderr.write("No tools path specified. Use --tools <path> to specify YAML tool file(s) or directory.\n");
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return loadYamlTools(paths);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register `ibmi tools` — list available YAML tools.
|
|
40
|
+
*/
|
|
41
|
+
export function registerToolsCommand(program) {
|
|
42
|
+
const toolsCmd = program
|
|
43
|
+
.command("tools")
|
|
44
|
+
.description("List available YAML-defined tools")
|
|
45
|
+
.option("--toolset <name>", "Filter by toolset name");
|
|
46
|
+
// ibmi tools (default: list all)
|
|
47
|
+
toolsCmd.action((opts, cmd) => {
|
|
48
|
+
const format = getFormat(cmd);
|
|
49
|
+
try {
|
|
50
|
+
const config = loadToolsConfig(cmd);
|
|
51
|
+
if (!config) {
|
|
52
|
+
process.exitCode = ExitCode.USAGE;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const toolsetMap = buildToolsetMap(config.toolsets);
|
|
56
|
+
const toolsetFilter = opts["toolset"];
|
|
57
|
+
const rows = [];
|
|
58
|
+
for (const [name, tool] of Object.entries(config.tools)) {
|
|
59
|
+
if (tool.enabled === false)
|
|
60
|
+
continue;
|
|
61
|
+
const toolsets = toolsetMap.get(name) ?? [];
|
|
62
|
+
// Filter by toolset if specified
|
|
63
|
+
if (toolsetFilter && !toolsets.includes(toolsetFilter))
|
|
64
|
+
continue;
|
|
65
|
+
rows.push({
|
|
66
|
+
TOOL: name,
|
|
67
|
+
TOOLSET: toolsets.join(", ") || "-",
|
|
68
|
+
DESCRIPTION: tool.description,
|
|
69
|
+
PARAMS: tool.parameters.length,
|
|
70
|
+
READ_ONLY: tool.security?.readOnly ?? tool.annotations?.["readOnlyHint"] ?? true,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (rows.length === 0) {
|
|
74
|
+
renderMessage(toolsetFilter
|
|
75
|
+
? `No tools found in toolset '${toolsetFilter}'.`
|
|
76
|
+
: "No tools found.", format);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
renderOutput(rows, format, { rowCount: rows.length });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
renderError(err instanceof Error ? err : new Error(String(err)), format);
|
|
83
|
+
process.exitCode = ExitCode.GENERAL;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// ibmi tools show <name>
|
|
87
|
+
toolsCmd
|
|
88
|
+
.command("show <name>")
|
|
89
|
+
.description("Show detailed information for a tool")
|
|
90
|
+
.action((name, _opts, cmd) => {
|
|
91
|
+
const format = getFormat(cmd);
|
|
92
|
+
try {
|
|
93
|
+
const config = loadToolsConfig(cmd);
|
|
94
|
+
if (!config) {
|
|
95
|
+
process.exitCode = ExitCode.USAGE;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const tool = config.tools[name];
|
|
99
|
+
if (!tool) {
|
|
100
|
+
renderError(new Error(`Tool '${name}' not found. Use 'ibmi tools --tools <path>' to list available tools.`), format);
|
|
101
|
+
process.exitCode = ExitCode.USAGE;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const toolsetMap = buildToolsetMap(config.toolsets);
|
|
105
|
+
const toolsets = toolsetMap.get(name) ?? [];
|
|
106
|
+
if (format === "json") {
|
|
107
|
+
// JSON: output structured data
|
|
108
|
+
renderOutput([
|
|
109
|
+
{
|
|
110
|
+
name,
|
|
111
|
+
description: tool.description,
|
|
112
|
+
source: tool.source,
|
|
113
|
+
toolsets,
|
|
114
|
+
readOnly: tool.security?.readOnly ?? true,
|
|
115
|
+
parameters: tool.parameters,
|
|
116
|
+
sql: tool.statement ?? null,
|
|
117
|
+
},
|
|
118
|
+
], format, { rowCount: 1 });
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Human-readable detail view
|
|
122
|
+
const lines = [];
|
|
123
|
+
lines.push(`Tool: ${name}`);
|
|
124
|
+
lines.push(`Description: ${tool.description}`);
|
|
125
|
+
lines.push(`Source: ${tool.source}`);
|
|
126
|
+
if (toolsets.length > 0) {
|
|
127
|
+
lines.push(`Toolsets: ${toolsets.join(", ")}`);
|
|
128
|
+
}
|
|
129
|
+
lines.push(`Read-only: ${tool.security?.readOnly ?? tool.annotations?.["readOnlyHint"] ?? true}`);
|
|
130
|
+
lines.push("");
|
|
131
|
+
// Parameters
|
|
132
|
+
if (tool.parameters.length > 0) {
|
|
133
|
+
lines.push("Parameters:");
|
|
134
|
+
for (const p of tool.parameters) {
|
|
135
|
+
lines.push(formatParameter(p));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
lines.push("Parameters: (none)");
|
|
140
|
+
}
|
|
141
|
+
lines.push("");
|
|
142
|
+
// SQL
|
|
143
|
+
if (tool.statement) {
|
|
144
|
+
lines.push("SQL:");
|
|
145
|
+
lines.push(tool.statement.trim());
|
|
146
|
+
}
|
|
147
|
+
process.stdout.write(lines.join("\n") + "\n");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
renderError(err instanceof Error ? err : new Error(String(err)), format);
|
|
152
|
+
process.exitCode = ExitCode.GENERAL;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Format a parameter for human-readable display.
|
|
158
|
+
*/
|
|
159
|
+
function formatParameter(p) {
|
|
160
|
+
const parts = [];
|
|
161
|
+
parts.push(` --${p.name.replace(/_/g, "-")}`);
|
|
162
|
+
parts.push(`(${p.type})`);
|
|
163
|
+
if (p.required)
|
|
164
|
+
parts.push("[required]");
|
|
165
|
+
if (p.default !== undefined)
|
|
166
|
+
parts.push(`default: ${JSON.stringify(p.default)}`);
|
|
167
|
+
if (p.enum && p.enum.length > 0) {
|
|
168
|
+
parts.push(`choices: ${p.enum.join(", ")}`);
|
|
169
|
+
}
|
|
170
|
+
if (p.description)
|
|
171
|
+
parts.push(`— ${p.description}`);
|
|
172
|
+
return parts.join(" ");
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Register `ibmi toolsets` — list available toolsets.
|
|
176
|
+
*/
|
|
177
|
+
export function registerToolsetsCommand(program) {
|
|
178
|
+
program
|
|
179
|
+
.command("toolsets")
|
|
180
|
+
.description("List available toolsets")
|
|
181
|
+
.action((_opts, cmd) => {
|
|
182
|
+
const format = getFormat(cmd);
|
|
183
|
+
try {
|
|
184
|
+
const config = loadToolsConfig(cmd);
|
|
185
|
+
if (!config) {
|
|
186
|
+
process.exitCode = ExitCode.USAGE;
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const rows = [];
|
|
190
|
+
for (const [name, ts] of Object.entries(config.toolsets)) {
|
|
191
|
+
rows.push({
|
|
192
|
+
TOOLSET: name,
|
|
193
|
+
TOOLS: ts.tools.length,
|
|
194
|
+
DESCRIPTION: ts.description ?? ts.title ?? "-",
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
if (rows.length === 0) {
|
|
198
|
+
renderMessage("No toolsets found.", format);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
renderOutput(rows, format, { rowCount: rows.length });
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
renderError(err instanceof Error ? err : new Error(String(err)), format);
|
|
205
|
+
process.exitCode = ExitCode.GENERAL;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=tools-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-list.js","sourceRoot":"","sources":["../../../src/cli/commands/tools-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `ibmi validate "<sql>"` command — validate SQL syntax and object references.
|
|
3
|
+
* @module cli/commands/validate
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
export declare function registerValidateCommand(program: Command): void;
|
|
7
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF9D"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `ibmi validate "<sql>"` command — validate SQL syntax and object references.
|
|
3
|
+
* @module cli/commands/validate
|
|
4
|
+
*/
|
|
5
|
+
import { withConnection } from "../utils/command-helpers.js";
|
|
6
|
+
export function registerValidateCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("validate <sql>")
|
|
9
|
+
.description("Validate SQL syntax and verify referenced objects exist")
|
|
10
|
+
.action(async (sql, _opts, cmd) => {
|
|
11
|
+
await withConnection(cmd, "validate_query", async (_resolved, ctx) => {
|
|
12
|
+
const { validateQueryLogic } = await import("../../ibmi-mcp-server/tools/validateQuery.tool.js");
|
|
13
|
+
const result = await validateQueryLogic({ sql_statement: sql }, ctx, {});
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
throw new Error(result.error?.message ?? "Failed to validate query");
|
|
16
|
+
}
|
|
17
|
+
// Build a summary view for CLI output
|
|
18
|
+
const summary = [];
|
|
19
|
+
// Parse results summary
|
|
20
|
+
if (result.data && result.data.length > 0) {
|
|
21
|
+
const stmtTypes = [
|
|
22
|
+
...new Set(result.data
|
|
23
|
+
.map((r) => r.SQL_STATEMENT_TYPE)
|
|
24
|
+
.filter(Boolean)),
|
|
25
|
+
];
|
|
26
|
+
summary.push({
|
|
27
|
+
CHECK: "Syntax",
|
|
28
|
+
STATUS: "PASS",
|
|
29
|
+
DETAILS: stmtTypes.length > 0
|
|
30
|
+
? `Statement type: ${stmtTypes.join(", ")}`
|
|
31
|
+
: "Parsed successfully",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
summary.push({
|
|
36
|
+
CHECK: "Syntax",
|
|
37
|
+
STATUS: "FAIL",
|
|
38
|
+
DETAILS: "Statement could not be parsed (syntax error)",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// Object validation summary
|
|
42
|
+
const ov = result.objectValidation;
|
|
43
|
+
if (ov) {
|
|
44
|
+
summary.push({
|
|
45
|
+
CHECK: "Tables",
|
|
46
|
+
STATUS: ov.tables.invalid.length === 0 ? "PASS" : "FAIL",
|
|
47
|
+
DETAILS: ov.tables.invalid.length === 0
|
|
48
|
+
? `${ov.tables.valid.length} table(s) verified`
|
|
49
|
+
: `Not found: ${ov.tables.invalid.join(", ")}`,
|
|
50
|
+
});
|
|
51
|
+
if (ov.columns.valid.length > 0 || ov.columns.invalid.length > 0) {
|
|
52
|
+
summary.push({
|
|
53
|
+
CHECK: "Columns",
|
|
54
|
+
STATUS: ov.columns.invalid.length === 0 ? "PASS" : "WARN",
|
|
55
|
+
DETAILS: ov.columns.invalid.length === 0
|
|
56
|
+
? `${ov.columns.valid.length} column(s) verified`
|
|
57
|
+
: `Not verified: ${ov.columns.invalid.join(", ")}`,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (ov.routines.valid.length > 0 || ov.routines.invalid.length > 0) {
|
|
61
|
+
summary.push({
|
|
62
|
+
CHECK: "Routines",
|
|
63
|
+
STATUS: ov.routines.invalid.length === 0 ? "PASS" : "WARN",
|
|
64
|
+
DETAILS: ov.routines.invalid.length === 0
|
|
65
|
+
? `${ov.routines.valid.length} routine(s) verified`
|
|
66
|
+
: `Not verified: ${ov.routines.invalid.join(", ")}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
data: summary,
|
|
72
|
+
meta: { rowCount: summary.length },
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Credential management for the IBM i CLI.
|
|
3
|
+
* Handles environment variable expansion in config values and interactive password prompting.
|
|
4
|
+
* @module cli/config/credentials
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Expand ${ENV_VAR} references in a string value.
|
|
8
|
+
* Returns the original string if no env var pattern is found or the var is not set.
|
|
9
|
+
*/
|
|
10
|
+
export declare function expandEnvVars(value: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Prompt the user for a password interactively (hidden input).
|
|
13
|
+
* Returns the entered password string.
|
|
14
|
+
*/
|
|
15
|
+
export declare function promptPassword(prompt: string): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the password for a system config.
|
|
18
|
+
* Priority: config password (with env expansion) → interactive prompt.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolvePassword(systemName: string, configPassword: string | undefined, user: string, host: string): Promise<string>;
|
|
21
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/cli/config/credentials.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDpE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Credential management for the IBM i CLI.
|
|
3
|
+
* Handles environment variable expansion in config values and interactive password prompting.
|
|
4
|
+
* @module cli/config/credentials
|
|
5
|
+
*/
|
|
6
|
+
import * as readline from "readline";
|
|
7
|
+
/**
|
|
8
|
+
* Expand ${ENV_VAR} references in a string value.
|
|
9
|
+
* Returns the original string if no env var pattern is found or the var is not set.
|
|
10
|
+
*/
|
|
11
|
+
export function expandEnvVars(value) {
|
|
12
|
+
return value.replace(/\$\{([^}]+)\}/g, (_match, varName) => {
|
|
13
|
+
const envValue = process.env[varName];
|
|
14
|
+
if (envValue === undefined) {
|
|
15
|
+
return _match; // Leave unexpanded if not set
|
|
16
|
+
}
|
|
17
|
+
return envValue;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Prompt the user for a password interactively (hidden input).
|
|
22
|
+
* Returns the entered password string.
|
|
23
|
+
*/
|
|
24
|
+
export async function promptPassword(prompt) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const rl = readline.createInterface({
|
|
27
|
+
input: process.stdin,
|
|
28
|
+
output: process.stderr, // Use stderr so it doesn't interfere with piped output
|
|
29
|
+
terminal: true,
|
|
30
|
+
});
|
|
31
|
+
// Disable echoing for password entry
|
|
32
|
+
if (process.stdin.isTTY) {
|
|
33
|
+
process.stderr.write(prompt);
|
|
34
|
+
const stdin = process.stdin;
|
|
35
|
+
const wasRaw = stdin.isRaw;
|
|
36
|
+
stdin.setRawMode(true);
|
|
37
|
+
let password = "";
|
|
38
|
+
const onData = (char) => {
|
|
39
|
+
const c = char.toString("utf8");
|
|
40
|
+
if (c === "\n" || c === "\r") {
|
|
41
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
42
|
+
stdin.removeListener("data", onData);
|
|
43
|
+
process.stderr.write("\n");
|
|
44
|
+
rl.close();
|
|
45
|
+
resolve(password);
|
|
46
|
+
}
|
|
47
|
+
else if (c === "\u0003") {
|
|
48
|
+
// Ctrl+C — throw to let withConnection's finally block run cleanup
|
|
49
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
50
|
+
stdin.removeListener("data", onData);
|
|
51
|
+
process.stderr.write("\n");
|
|
52
|
+
rl.close();
|
|
53
|
+
reject(new Error("Cancelled"));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
else if (c === "\u007f" || c === "\b") {
|
|
57
|
+
// Backspace
|
|
58
|
+
if (password.length > 0) {
|
|
59
|
+
password = password.slice(0, -1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
password += c;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
stdin.on("data", onData);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Non-interactive: read a line
|
|
70
|
+
rl.question(prompt, (answer) => {
|
|
71
|
+
rl.close();
|
|
72
|
+
resolve(answer);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolve the password for a system config.
|
|
79
|
+
* Priority: config password (with env expansion) → interactive prompt.
|
|
80
|
+
*/
|
|
81
|
+
export async function resolvePassword(systemName, configPassword, user, host) {
|
|
82
|
+
if (configPassword) {
|
|
83
|
+
const expanded = expandEnvVars(configPassword);
|
|
84
|
+
// If expansion resolved to a non-empty value, use it
|
|
85
|
+
if (expanded && !expanded.includes("${")) {
|
|
86
|
+
return expanded;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Fall back to interactive prompt
|
|
90
|
+
if (!process.stdin.isTTY) {
|
|
91
|
+
throw new Error(`No password configured for system "${systemName}" and stdin is not a terminal. ` +
|
|
92
|
+
`Set the password in config or via environment variable.`);
|
|
93
|
+
}
|
|
94
|
+
return promptPassword(`Password for ${user}@${host} [${systemName}]: `);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/cli/config/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Barrel export for CLI configuration modules.
|
|
3
|
+
* @module cli/config
|
|
4
|
+
*/
|
|
5
|
+
export { CliConfigSchema, SystemConfigSchema, validateConfig } from "./schema.js";
|
|
6
|
+
export { loadConfig, saveUserConfig, upsertSystem, removeSystem, setDefaultSystem, getProjectConfigPath, getUserConfigPath, } from "./loader.js";
|
|
7
|
+
export { resolveSystem } from "./resolver.js";
|
|
8
|
+
export { expandEnvVars, promptPassword, resolvePassword, } from "./credentials.js";
|
|
9
|
+
export type { CliConfig, SystemConfig, ResolvedSystem, OutputFormat, GlobalOptions, } from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Barrel export for CLI configuration modules.
|
|
3
|
+
* @module cli/config
|
|
4
|
+
*/
|
|
5
|
+
export { CliConfigSchema, SystemConfigSchema, validateConfig } from "./schema.js";
|
|
6
|
+
export { loadConfig, saveUserConfig, upsertSystem, removeSystem, setDefaultSystem, getProjectConfigPath, getUserConfigPath, } from "./loader.js";
|
|
7
|
+
export { resolveSystem } from "./resolver.js";
|
|
8
|
+
export { expandEnvVars, promptPassword, resolvePassword, } from "./credentials.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Configuration file loader for the IBM i CLI.
|
|
3
|
+
* Finds and parses .ibmi/config.yaml from project and user directories,
|
|
4
|
+
* merging them with project-level taking precedence.
|
|
5
|
+
* @module cli/config/loader
|
|
6
|
+
*/
|
|
7
|
+
import type { CliConfig, SystemConfig } from "./types.js";
|
|
8
|
+
/** Get the project-level config file path (nearest .ibmi/config.yaml walking up from cwd). */
|
|
9
|
+
export declare function getProjectConfigPath(): string;
|
|
10
|
+
/** Get the user-level config file path. */
|
|
11
|
+
export declare function getUserConfigPath(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Load the full CLI configuration by merging user-level and project-level configs.
|
|
14
|
+
* Project-level config takes precedence over user-level.
|
|
15
|
+
*
|
|
16
|
+
* @returns The merged, validated, and env-expanded configuration.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadConfig(): CliConfig;
|
|
19
|
+
/**
|
|
20
|
+
* Save a config to the user-level config file.
|
|
21
|
+
*/
|
|
22
|
+
export declare function saveUserConfig(config: CliConfig): void;
|
|
23
|
+
/**
|
|
24
|
+
* Add or update a system in the user config.
|
|
25
|
+
*/
|
|
26
|
+
export declare function upsertSystem(name: string, system: SystemConfig): void;
|
|
27
|
+
/**
|
|
28
|
+
* Remove a system from the user config.
|
|
29
|
+
* @returns true if the system existed and was removed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function removeSystem(name: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Set the default system in the user config.
|
|
34
|
+
*/
|
|
35
|
+
export declare function setDefaultSystem(name: string): void;
|
|
36
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/cli/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgC1D,8FAA8F;AAC9F,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAkED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAsBtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAatD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,GACnB,IAAI,CAgBN;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAsBlD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkBnD"}
|