code-engine-mcp-server 1.0.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/LICENSE +21 -0
- package/README.md +387 -0
- package/build/client.d.ts +3 -0
- package/build/client.d.ts.map +1 -0
- package/build/client.js +194 -0
- package/build/client.js.map +1 -0
- package/build/context-discovery.d.ts +86 -0
- package/build/context-discovery.d.ts.map +1 -0
- package/build/context-discovery.js +291 -0
- package/build/context-discovery.js.map +1 -0
- package/build/deploy-tool-enhanced.d.ts +42 -0
- package/build/deploy-tool-enhanced.d.ts.map +1 -0
- package/build/deploy-tool-enhanced.js +323 -0
- package/build/deploy-tool-enhanced.js.map +1 -0
- package/build/deploy-tool.d.ts +27 -0
- package/build/deploy-tool.d.ts.map +1 -0
- package/build/deploy-tool.js +213 -0
- package/build/deploy-tool.js.map +1 -0
- package/build/index.d.ts +11 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +1117 -0
- package/build/index.js.map +1 -0
- package/build/simple-client.d.ts +3 -0
- package/build/simple-client.d.ts.map +1 -0
- package/build/simple-client.js +275 -0
- package/build/simple-client.js.map +1 -0
- package/build/test-all-tools.d.ts +3 -0
- package/build/test-all-tools.d.ts.map +1 -0
- package/build/test-all-tools.js +254 -0
- package/build/test-all-tools.js.map +1 -0
- package/build/test-integration.d.ts +3 -0
- package/build/test-integration.d.ts.map +1 -0
- package/build/test-integration.js +484 -0
- package/build/test-integration.js.map +1 -0
- package/docs/API_CALL_SCENARIOS.md +594 -0
- package/docs/CLIENT_README.md +310 -0
- package/docs/CLINE_CONFIG_EXAMPLE.json +14 -0
- package/docs/CODE_ENGINE_API_REFERENCE.md +764 -0
- package/docs/CODE_OF_CONDUCT.md +46 -0
- package/docs/CONTRIBUTING.md +38 -0
- package/docs/MAINTAINERS.md +15 -0
- package/docs/SETUP_INSTRUCTIONS.md +218 -0
- package/package.json +44 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Context Discovery Module for IBM Code Engine
|
|
4
|
+
*
|
|
5
|
+
* This module discovers and caches deployment context including:
|
|
6
|
+
* - Available Code Engine projects
|
|
7
|
+
* - Container Registry namespaces
|
|
8
|
+
* - Existing applications
|
|
9
|
+
* - Resource groups
|
|
10
|
+
*
|
|
11
|
+
* Uses IBM Cloud REST API directly (no CLI required).
|
|
12
|
+
*
|
|
13
|
+
* Author: Markus van Kempen | markus.van.kempen@gmail.com
|
|
14
|
+
* Research | Floor 7½ š¢š¤
|
|
15
|
+
* "No bug too small, no syntax too weird."
|
|
16
|
+
*/
|
|
17
|
+
export interface Project {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
region: string;
|
|
21
|
+
resource_group_id: string;
|
|
22
|
+
created_at: string;
|
|
23
|
+
status: string;
|
|
24
|
+
}
|
|
25
|
+
export interface Application {
|
|
26
|
+
name: string;
|
|
27
|
+
project_id: string;
|
|
28
|
+
project_name: string;
|
|
29
|
+
status: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
image?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RegistryNamespace {
|
|
34
|
+
name: string;
|
|
35
|
+
resource_group_id: string;
|
|
36
|
+
created_date: string;
|
|
37
|
+
updated_date: string;
|
|
38
|
+
}
|
|
39
|
+
export interface DeploymentContext {
|
|
40
|
+
projects: Project[];
|
|
41
|
+
applications: Application[];
|
|
42
|
+
registryNamespaces: RegistryNamespace[];
|
|
43
|
+
timestamp: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get IAM access token using API key
|
|
47
|
+
*/
|
|
48
|
+
export declare function getIAMToken(apiKey: string): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* List all Code Engine projects
|
|
51
|
+
*/
|
|
52
|
+
export declare function listProjects(token: string, region?: string): Promise<Project[]>;
|
|
53
|
+
/**
|
|
54
|
+
* List applications in a specific project
|
|
55
|
+
*/
|
|
56
|
+
export declare function listApplicationsInProject(token: string, region: string, projectId: string): Promise<any[]>;
|
|
57
|
+
/**
|
|
58
|
+
* List all applications across all projects
|
|
59
|
+
*/
|
|
60
|
+
export declare function listAllApplications(token: string, region?: string): Promise<Application[]>;
|
|
61
|
+
/**
|
|
62
|
+
* List Container Registry namespaces
|
|
63
|
+
* Note: This requires IBM Cloud CLI as there's no direct REST API for registry namespaces
|
|
64
|
+
*/
|
|
65
|
+
export declare function listRegistryNamespaces(token: string): Promise<RegistryNamespace[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Discover complete deployment context
|
|
68
|
+
*/
|
|
69
|
+
export declare function discoverContext(apiKey: string, region?: string): Promise<DeploymentContext>;
|
|
70
|
+
/**
|
|
71
|
+
* Format context for display
|
|
72
|
+
*/
|
|
73
|
+
export declare function formatContext(context: DeploymentContext): string;
|
|
74
|
+
/**
|
|
75
|
+
* Interactive project selection
|
|
76
|
+
*/
|
|
77
|
+
export declare function selectProject(projects: Project[]): void;
|
|
78
|
+
/**
|
|
79
|
+
* Find project by name
|
|
80
|
+
*/
|
|
81
|
+
export declare function findProjectByName(projects: Project[], name: string): Project | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Check if application exists in any project
|
|
84
|
+
*/
|
|
85
|
+
export declare function findApplication(applications: Application[], appName: string): Application | undefined;
|
|
86
|
+
//# sourceMappingURL=context-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-discovery.d.ts","sourceRoot":"","sources":["../src/context-discovery.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCjE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAmB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA4BjG;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,EAAE,CAAC,CA4BhB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAuB5G;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAKxF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6B7G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAwDhE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAOvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAKxF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAErG"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Context Discovery Module for IBM Code Engine
|
|
4
|
+
*
|
|
5
|
+
* This module discovers and caches deployment context including:
|
|
6
|
+
* - Available Code Engine projects
|
|
7
|
+
* - Container Registry namespaces
|
|
8
|
+
* - Existing applications
|
|
9
|
+
* - Resource groups
|
|
10
|
+
*
|
|
11
|
+
* Uses IBM Cloud REST API directly (no CLI required).
|
|
12
|
+
*
|
|
13
|
+
* Author: Markus van Kempen | markus.van.kempen@gmail.com
|
|
14
|
+
* Research | Floor 7½ š¢š¤
|
|
15
|
+
* "No bug too small, no syntax too weird."
|
|
16
|
+
*/
|
|
17
|
+
import * as https from 'https';
|
|
18
|
+
/**
|
|
19
|
+
* Get IAM access token using API key
|
|
20
|
+
*/
|
|
21
|
+
export async function getIAMToken(apiKey) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const postData = `grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${apiKey}`;
|
|
24
|
+
const options = {
|
|
25
|
+
hostname: 'iam.cloud.ibm.com',
|
|
26
|
+
path: '/identity/token',
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: {
|
|
29
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
30
|
+
'Content-Length': Buffer.byteLength(postData)
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const req = https.request(options, (res) => {
|
|
34
|
+
let data = '';
|
|
35
|
+
res.on('data', (chunk) => data += chunk);
|
|
36
|
+
res.on('end', () => {
|
|
37
|
+
try {
|
|
38
|
+
const response = JSON.parse(data);
|
|
39
|
+
if (response.access_token) {
|
|
40
|
+
resolve(response.access_token);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
reject(new Error('No access token in response'));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
reject(error);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
req.on('error', reject);
|
|
52
|
+
req.write(postData);
|
|
53
|
+
req.end();
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* List all Code Engine projects
|
|
58
|
+
*/
|
|
59
|
+
export async function listProjects(token, region = 'us-south') {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
const options = {
|
|
62
|
+
hostname: `api.${region}.codeengine.cloud.ibm.com`,
|
|
63
|
+
path: `/v2/projects`,
|
|
64
|
+
method: 'GET',
|
|
65
|
+
headers: {
|
|
66
|
+
'Authorization': `Bearer ${token}`,
|
|
67
|
+
'Content-Type': 'application/json'
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const req = https.request(options, (res) => {
|
|
71
|
+
let data = '';
|
|
72
|
+
res.on('data', (chunk) => data += chunk);
|
|
73
|
+
res.on('end', () => {
|
|
74
|
+
try {
|
|
75
|
+
const response = JSON.parse(data);
|
|
76
|
+
resolve(response.projects || []);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
reject(error);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
req.on('error', reject);
|
|
84
|
+
req.end();
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* List applications in a specific project
|
|
89
|
+
*/
|
|
90
|
+
export async function listApplicationsInProject(token, region, projectId) {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const options = {
|
|
93
|
+
hostname: `api.${region}.codeengine.cloud.ibm.com`,
|
|
94
|
+
path: `/v2/projects/${projectId}/apps`,
|
|
95
|
+
method: 'GET',
|
|
96
|
+
headers: {
|
|
97
|
+
'Authorization': `Bearer ${token}`,
|
|
98
|
+
'Content-Type': 'application/json'
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const req = https.request(options, (res) => {
|
|
102
|
+
let data = '';
|
|
103
|
+
res.on('data', (chunk) => data += chunk);
|
|
104
|
+
res.on('end', () => {
|
|
105
|
+
try {
|
|
106
|
+
const response = JSON.parse(data);
|
|
107
|
+
resolve(response.apps || []);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
reject(error);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
req.on('error', reject);
|
|
115
|
+
req.end();
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* List all applications across all projects
|
|
120
|
+
*/
|
|
121
|
+
export async function listAllApplications(token, region = 'us-south') {
|
|
122
|
+
const projects = await listProjects(token, region);
|
|
123
|
+
const allApps = [];
|
|
124
|
+
for (const project of projects) {
|
|
125
|
+
try {
|
|
126
|
+
const apps = await listApplicationsInProject(token, region, project.id);
|
|
127
|
+
for (const app of apps) {
|
|
128
|
+
allApps.push({
|
|
129
|
+
name: app.name,
|
|
130
|
+
project_id: project.id,
|
|
131
|
+
project_name: project.name,
|
|
132
|
+
status: app.status?.state || 'unknown',
|
|
133
|
+
url: app.status?.url,
|
|
134
|
+
image: app.spec?.image_reference
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error(`Failed to list apps in project ${project.name}:`, error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return allApps;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* List Container Registry namespaces
|
|
146
|
+
* Note: This requires IBM Cloud CLI as there's no direct REST API for registry namespaces
|
|
147
|
+
*/
|
|
148
|
+
export async function listRegistryNamespaces(token) {
|
|
149
|
+
// For now, return empty array as registry API requires CLI
|
|
150
|
+
// In production, you would use: ibmcloud cr namespace-list
|
|
151
|
+
console.warn('Registry namespace listing requires IBM Cloud CLI');
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Discover complete deployment context
|
|
156
|
+
*/
|
|
157
|
+
export async function discoverContext(apiKey, region = 'us-south') {
|
|
158
|
+
console.log('š Discovering deployment context...\n');
|
|
159
|
+
// Get IAM token
|
|
160
|
+
console.log('š Authenticating with IBM Cloud...');
|
|
161
|
+
const token = await getIAMToken(apiKey);
|
|
162
|
+
console.log('ā
Authentication successful\n');
|
|
163
|
+
// Discover projects
|
|
164
|
+
console.log('š¦ Discovering Code Engine projects...');
|
|
165
|
+
const projects = await listProjects(token, region);
|
|
166
|
+
console.log(`ā
Found ${projects.length} project(s)\n`);
|
|
167
|
+
// Discover applications
|
|
168
|
+
console.log('š Discovering applications...');
|
|
169
|
+
const applications = await listAllApplications(token, region);
|
|
170
|
+
console.log(`ā
Found ${applications.length} application(s)\n`);
|
|
171
|
+
// Discover registry namespaces
|
|
172
|
+
console.log('š¦ Discovering registry namespaces...');
|
|
173
|
+
const registryNamespaces = await listRegistryNamespaces(token);
|
|
174
|
+
console.log(`ā
Found ${registryNamespaces.length} namespace(s)\n`);
|
|
175
|
+
return {
|
|
176
|
+
projects,
|
|
177
|
+
applications,
|
|
178
|
+
registryNamespaces,
|
|
179
|
+
timestamp: new Date().toISOString()
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Format context for display
|
|
184
|
+
*/
|
|
185
|
+
export function formatContext(context) {
|
|
186
|
+
let output = '# IBM Cloud Deployment Context\n\n';
|
|
187
|
+
output += `**Discovered:** ${new Date(context.timestamp).toLocaleString()}\n\n`;
|
|
188
|
+
// Projects
|
|
189
|
+
output += '## Code Engine Projects\n\n';
|
|
190
|
+
if (context.projects.length === 0) {
|
|
191
|
+
output += '*No projects found*\n\n';
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
context.projects.forEach((project, index) => {
|
|
195
|
+
output += `${index + 1}. **${project.name}**\n`;
|
|
196
|
+
output += ` - ID: \`${project.id}\`\n`;
|
|
197
|
+
output += ` - Region: ${project.region}\n`;
|
|
198
|
+
output += ` - Status: ${project.status}\n`;
|
|
199
|
+
output += ` - Created: ${new Date(project.created_at).toLocaleDateString()}\n\n`;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// Applications
|
|
203
|
+
output += '## Deployed Applications\n\n';
|
|
204
|
+
if (context.applications.length === 0) {
|
|
205
|
+
output += '*No applications found*\n\n';
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
const appsByProject = context.applications.reduce((acc, app) => {
|
|
209
|
+
if (!acc[app.project_name]) {
|
|
210
|
+
acc[app.project_name] = [];
|
|
211
|
+
}
|
|
212
|
+
acc[app.project_name].push(app);
|
|
213
|
+
return acc;
|
|
214
|
+
}, {});
|
|
215
|
+
Object.entries(appsByProject).forEach(([projectName, apps]) => {
|
|
216
|
+
output += `### Project: ${projectName}\n\n`;
|
|
217
|
+
apps.forEach((app, index) => {
|
|
218
|
+
output += `${index + 1}. **${app.name}**\n`;
|
|
219
|
+
output += ` - Status: ${app.status}\n`;
|
|
220
|
+
if (app.url)
|
|
221
|
+
output += ` - URL: ${app.url}\n`;
|
|
222
|
+
if (app.image)
|
|
223
|
+
output += ` - Image: \`${app.image}\`\n`;
|
|
224
|
+
output += '\n';
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
// Registry Namespaces
|
|
229
|
+
output += '## Container Registry Namespaces\n\n';
|
|
230
|
+
if (context.registryNamespaces.length === 0) {
|
|
231
|
+
output += '*No namespaces found (requires IBM Cloud CLI)*\n\n';
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
context.registryNamespaces.forEach((ns, index) => {
|
|
235
|
+
output += `${index + 1}. **${ns.name}**\n`;
|
|
236
|
+
output += ` - Created: ${new Date(ns.created_date).toLocaleDateString()}\n`;
|
|
237
|
+
output += ` - Updated: ${new Date(ns.updated_date).toLocaleDateString()}\n\n`;
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
return output;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Interactive project selection
|
|
244
|
+
*/
|
|
245
|
+
export function selectProject(projects) {
|
|
246
|
+
console.log('\nš Available Projects:\n');
|
|
247
|
+
projects.forEach((project, index) => {
|
|
248
|
+
console.log(`${index + 1}. ${project.name}`);
|
|
249
|
+
console.log(` Region: ${project.region} | Status: ${project.status}`);
|
|
250
|
+
console.log(` ID: ${project.id}\n`);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Find project by name
|
|
255
|
+
*/
|
|
256
|
+
export function findProjectByName(projects, name) {
|
|
257
|
+
return projects.find(p => p.name.toLowerCase() === name.toLowerCase() ||
|
|
258
|
+
p.id === name);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Check if application exists in any project
|
|
262
|
+
*/
|
|
263
|
+
export function findApplication(applications, appName) {
|
|
264
|
+
return applications.find(app => app.name === appName);
|
|
265
|
+
}
|
|
266
|
+
// CLI interface
|
|
267
|
+
import { fileURLToPath } from 'url';
|
|
268
|
+
import { writeFileSync } from 'fs';
|
|
269
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
270
|
+
const isMainModule = process.argv[1] === __filename;
|
|
271
|
+
if (isMainModule) {
|
|
272
|
+
const apiKey = process.env.IBM_CLOUD_API_KEY;
|
|
273
|
+
const region = process.env.IBM_CLOUD_REGION || 'us-south';
|
|
274
|
+
if (!apiKey) {
|
|
275
|
+
console.error('ā Error: IBM_CLOUD_API_KEY environment variable not set');
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
discoverContext(apiKey, region)
|
|
279
|
+
.then(context => {
|
|
280
|
+
console.log(formatContext(context));
|
|
281
|
+
// Save to file
|
|
282
|
+
writeFileSync('deployment-context.json', JSON.stringify(context, null, 2));
|
|
283
|
+
console.log('š¾ Context saved to deployment-context.json');
|
|
284
|
+
})
|
|
285
|
+
.catch(error => {
|
|
286
|
+
console.error('ā Discovery failed:', error.message);
|
|
287
|
+
process.exit(1);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
// Made by MVK
|
|
291
|
+
//# sourceMappingURL=context-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-discovery.js","sourceRoot":"","sources":["../src/context-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced Code Engine Deployment Tool with Context Discovery
|
|
4
|
+
*
|
|
5
|
+
* This tool automatically discovers available projects and namespaces,
|
|
6
|
+
* then prompts the user to select deployment targets.
|
|
7
|
+
*
|
|
8
|
+
* Uses IBM Cloud REST API directly (no CLI required).
|
|
9
|
+
*
|
|
10
|
+
* Author: Markus van Kempen | markus.van.kempen@gmail.com
|
|
11
|
+
* Research | Floor 7½ š¢š¤
|
|
12
|
+
* "No bug too small, no syntax too weird."
|
|
13
|
+
*/
|
|
14
|
+
import { DeploymentContext } from './context-discovery.js';
|
|
15
|
+
interface EnhancedDeploymentSpec {
|
|
16
|
+
appName: string;
|
|
17
|
+
appDir: string;
|
|
18
|
+
message?: string;
|
|
19
|
+
port?: number;
|
|
20
|
+
region?: string;
|
|
21
|
+
projectName?: string;
|
|
22
|
+
namespace?: string;
|
|
23
|
+
interactive?: boolean;
|
|
24
|
+
}
|
|
25
|
+
interface DeploymentResult {
|
|
26
|
+
success: boolean;
|
|
27
|
+
appName: string;
|
|
28
|
+
projectName: string;
|
|
29
|
+
projectId: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
imageTag?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
steps: string[];
|
|
34
|
+
logs?: string[];
|
|
35
|
+
context?: DeploymentContext;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Enhanced deployment with context discovery
|
|
39
|
+
*/
|
|
40
|
+
export declare function deployWithContext(spec: EnhancedDeploymentSpec): Promise<DeploymentResult>;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=deploy-tool-enhanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-tool-enhanced.d.ts","sourceRoot":"","sources":["../src/deploy-tool-enhanced.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAWH,OAAO,EAEL,iBAAiB,EAIlB,MAAM,wBAAwB,CAAC;AAIhC,UAAU,sBAAsB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAsLD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmG/F"}
|