lua-cli 3.2.0 → 3.3.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.
Files changed (102) hide show
  1. package/dist/api/logs.api.service.d.ts +1 -1
  2. package/dist/api/logs.api.service.js.map +1 -1
  3. package/dist/api/products.api.service.d.ts +17 -5
  4. package/dist/api/products.api.service.js +21 -9
  5. package/dist/api/products.api.service.js.map +1 -1
  6. package/dist/api-exports.d.ts +17 -5
  7. package/dist/api-exports.js +20 -5
  8. package/dist/api-exports.js.map +1 -1
  9. package/dist/cli/command-definitions.js +320 -88
  10. package/dist/cli/command-definitions.js.map +1 -1
  11. package/dist/commands/apiKey.d.ts +5 -2
  12. package/dist/commands/apiKey.js +8 -2
  13. package/dist/commands/apiKey.js.map +1 -1
  14. package/dist/commands/channels.d.ts +4 -9
  15. package/dist/commands/channels.js +140 -84
  16. package/dist/commands/channels.js.map +1 -1
  17. package/dist/commands/chat.d.ts +4 -2
  18. package/dist/commands/chat.js +126 -32
  19. package/dist/commands/chat.js.map +1 -1
  20. package/dist/commands/chatClear.d.ts +3 -2
  21. package/dist/commands/chatClear.js +16 -15
  22. package/dist/commands/chatClear.js.map +1 -1
  23. package/dist/commands/compile.js +67 -4
  24. package/dist/commands/compile.js.map +1 -1
  25. package/dist/commands/deploy.d.ts +5 -24
  26. package/dist/commands/deploy.js +75 -48
  27. package/dist/commands/deploy.js.map +1 -1
  28. package/dist/commands/destroy.d.ts +5 -2
  29. package/dist/commands/destroy.js +14 -2
  30. package/dist/commands/destroy.js.map +1 -1
  31. package/dist/commands/env.d.ts +3 -1
  32. package/dist/commands/env.js +322 -122
  33. package/dist/commands/env.js.map +1 -1
  34. package/dist/commands/features.d.ts +5 -9
  35. package/dist/commands/features.js +249 -129
  36. package/dist/commands/features.js.map +1 -1
  37. package/dist/commands/init.d.ts +7 -1
  38. package/dist/commands/init.js +242 -59
  39. package/dist/commands/init.js.map +1 -1
  40. package/dist/commands/jobs.d.ts +5 -13
  41. package/dist/commands/jobs.js +449 -364
  42. package/dist/commands/jobs.js.map +1 -1
  43. package/dist/commands/logs.d.ts +5 -10
  44. package/dist/commands/logs.js +259 -103
  45. package/dist/commands/logs.js.map +1 -1
  46. package/dist/commands/marketplace.d.ts +23 -2
  47. package/dist/commands/marketplace.js +530 -7
  48. package/dist/commands/marketplace.js.map +1 -1
  49. package/dist/commands/mcp.d.ts +5 -11
  50. package/dist/commands/mcp.js +303 -288
  51. package/dist/commands/mcp.js.map +1 -1
  52. package/dist/commands/persona.d.ts +5 -9
  53. package/dist/commands/persona.js +349 -232
  54. package/dist/commands/persona.js.map +1 -1
  55. package/dist/commands/postprocessors.d.ts +6 -2
  56. package/dist/commands/postprocessors.js +387 -280
  57. package/dist/commands/postprocessors.js.map +1 -1
  58. package/dist/commands/preprocessors.d.ts +6 -2
  59. package/dist/commands/preprocessors.js +387 -280
  60. package/dist/commands/preprocessors.js.map +1 -1
  61. package/dist/commands/production.d.ts +5 -8
  62. package/dist/commands/production.js +317 -228
  63. package/dist/commands/production.js.map +1 -1
  64. package/dist/commands/push.js +385 -427
  65. package/dist/commands/push.js.map +1 -1
  66. package/dist/commands/resources.d.ts +5 -10
  67. package/dist/commands/resources.js +219 -154
  68. package/dist/commands/resources.js.map +1 -1
  69. package/dist/commands/skills.d.ts +5 -9
  70. package/dist/commands/skills.js +354 -277
  71. package/dist/commands/skills.js.map +1 -1
  72. package/dist/commands/sync.d.ts +10 -8
  73. package/dist/commands/sync.js +110 -19
  74. package/dist/commands/sync.js.map +1 -1
  75. package/dist/commands/test.d.ts +1 -11
  76. package/dist/commands/test.js +395 -438
  77. package/dist/commands/test.js.map +1 -1
  78. package/dist/commands/webhooks.d.ts +5 -11
  79. package/dist/commands/webhooks.js +356 -290
  80. package/dist/commands/webhooks.js.map +1 -1
  81. package/dist/interfaces/mcp.d.ts +28 -1
  82. package/dist/interfaces/product.d.ts +26 -0
  83. package/dist/types/api-contracts.d.ts +8 -4
  84. package/dist/types/index.d.ts +1 -1
  85. package/dist/types/index.js.map +1 -1
  86. package/dist/types/skill.d.ts +92 -17
  87. package/dist/types/skill.js +15 -11
  88. package/dist/types/skill.js.map +1 -1
  89. package/dist/utils/bundling.d.ts +17 -0
  90. package/dist/utils/bundling.js +96 -0
  91. package/dist/utils/bundling.js.map +1 -1
  92. package/dist/utils/compile.d.ts +4 -0
  93. package/dist/utils/compile.js +5 -0
  94. package/dist/utils/compile.js.map +1 -1
  95. package/dist/utils/dev-helpers.d.ts +3 -2
  96. package/dist/utils/dev-helpers.js +3 -5
  97. package/dist/utils/dev-helpers.js.map +1 -1
  98. package/dist/utils/mcp-server-management.d.ts +1 -1
  99. package/dist/utils/mcp-server-management.js +13 -14
  100. package/dist/utils/mcp-server-management.js.map +1 -1
  101. package/package.json +1 -1
  102. package/template/package.json +1 -1
@@ -8,20 +8,23 @@ import { withErrorHandling, writeProgress, writeSuccess, writeInfo } from '../ut
8
8
  import { BASE_URLS } from '../config/constants.js';
9
9
  import { safePrompt } from '../utils/prompt-handler.js';
10
10
  import { validateConfig, validateAgentConfig, } from '../utils/dev-helpers.js';
11
+ // ─────────────────────────────────────────────────────────────────────────────
12
+ // Main Command Entry
13
+ // ─────────────────────────────────────────────────────────────────────────────
11
14
  /**
12
- * Main skills command - manages agent skills
15
+ * Main skills command - manages agent skills.
13
16
  *
14
- * Features:
15
- * - Environment selection (sandbox/staging or production)
16
- * - Sandbox: view local skills from configuration
17
- * - Production: view deployed skills, versions, and deploy new versions
18
- *
19
- * @param env - Optional environment argument ('sandbox', 'staging', or 'production')
20
- * @returns Promise that resolves when command completes
17
+ * Supports both interactive and non-interactive modes:
18
+ * - Interactive: prompts for environment and action
19
+ * - Non-interactive: use action argument with -i and -v flags
21
20
  */
22
- export async function skillsCommand(env) {
21
+ export async function skillsCommand(actionOrEnv, cmdObj) {
23
22
  return withErrorHandling(async () => {
24
- // Step 1: Load configuration first (to get agentId)
23
+ const options = {
24
+ skillName: cmdObj?.skillName || null,
25
+ skillVersion: cmdObj?.skillVersion || null,
26
+ };
27
+ // Step 1: Load configuration
25
28
  const config = readSkillConfig();
26
29
  validateConfig(config);
27
30
  validateAgentConfig(config);
@@ -34,62 +37,304 @@ export async function skillsCommand(env) {
34
37
  }
35
38
  await checkApiKey(apiKey);
36
39
  writeProgress("✅ Authenticated");
37
- let selectedEnvironment;
38
- // Step 3: Check if environment was provided as argument
39
- if (env) {
40
- // Normalize the environment (staging is an alias for sandbox)
41
- const normalizedEnv = env.toLowerCase();
42
- if (normalizedEnv === 'sandbox' || normalizedEnv === 'staging') {
43
- selectedEnvironment = 'sandbox';
44
- }
45
- else if (normalizedEnv === 'production') {
46
- selectedEnvironment = 'production';
47
- }
48
- else {
49
- console.error(`❌ Invalid environment: "${env}". Must be "sandbox", "staging", or "production".`);
50
- console.log('\nUsage:');
51
- console.log(' lua skills - Interactive selection');
52
- console.log(' lua skills sandbox - View sandbox skills directly');
53
- console.log(' lua skills staging - View staging skills (alias for sandbox)');
54
- console.log(' lua skills production - Manage production skills directly');
55
- process.exit(1);
40
+ // Step 3: Determine mode based on argument
41
+ const validActions = ['view', 'versions', 'deploy'];
42
+ const validEnvs = ['sandbox', 'staging', 'production'];
43
+ if (actionOrEnv) {
44
+ const normalized = actionOrEnv.toLowerCase();
45
+ // Check if it's a non-interactive action
46
+ if (validActions.includes(normalized)) {
47
+ const context = {
48
+ environment: 'production',
49
+ agentId,
50
+ apiKey,
51
+ };
52
+ await executeNonInteractive(context, config, normalized, options);
53
+ return;
56
54
  }
57
- }
58
- else {
59
- // Step 4: Prompt for environment selection
60
- const envAnswer = await safePrompt([
61
- {
62
- type: 'list',
63
- name: 'environment',
64
- message: 'Select environment:',
65
- choices: [
66
- { name: '🔧 Sandbox (local skills)', value: 'sandbox' },
67
- { name: '🚀 Production (deployed skills)', value: 'production' }
68
- ]
55
+ // Check if it's an environment selection
56
+ if (validEnvs.includes(normalized)) {
57
+ const selectedEnvironment = (normalized === 'sandbox' || normalized === 'staging') ? 'sandbox' : 'production';
58
+ const context = {
59
+ environment: selectedEnvironment,
60
+ agentId,
61
+ apiKey,
62
+ };
63
+ if (selectedEnvironment === 'sandbox') {
64
+ await manageSandboxSkillsInteractive(context, config);
65
+ }
66
+ else {
67
+ await manageProductionSkillsInteractive(context, config);
69
68
  }
70
- ]);
71
- if (!envAnswer)
72
69
  return;
73
- selectedEnvironment = envAnswer.environment;
70
+ }
71
+ // Invalid argument
72
+ console.error(`❌ Invalid argument: "${actionOrEnv}"`);
73
+ console.log('\nUsage:');
74
+ console.log(' lua skills Interactive selection');
75
+ console.log(' lua skills sandbox View sandbox skills');
76
+ console.log(' lua skills production Manage production skills');
77
+ console.log(' lua skills view List all production skills');
78
+ console.log(' lua skills deploy -i mySkill -v 1.0.3 Deploy specific version');
79
+ process.exit(1);
74
80
  }
81
+ // Interactive mode - prompt for environment
82
+ const envAnswer = await safePrompt([
83
+ {
84
+ type: 'list',
85
+ name: 'environment',
86
+ message: 'Select environment:',
87
+ choices: [
88
+ { name: '🔧 Sandbox (local skills)', value: 'sandbox' },
89
+ { name: '🚀 Production (deployed skills)', value: 'production' }
90
+ ]
91
+ }
92
+ ]);
93
+ if (!envAnswer)
94
+ return;
75
95
  const context = {
76
- environment: selectedEnvironment,
96
+ environment: envAnswer.environment,
77
97
  agentId,
78
98
  apiKey,
79
99
  };
80
- // Step 5: Start management based on environment
81
- if (selectedEnvironment === 'sandbox') {
82
- await manageSandboxSkills(context, config);
100
+ if (context.environment === 'sandbox') {
101
+ await manageSandboxSkillsInteractive(context, config);
83
102
  }
84
103
  else {
85
- await manageProductionSkills(context, config);
104
+ await manageProductionSkillsInteractive(context, config);
86
105
  }
87
106
  }, "skills");
88
107
  }
108
+ // ─────────────────────────────────────────────────────────────────────────────
109
+ // Shared Core Functions
110
+ // ─────────────────────────────────────────────────────────────────────────────
89
111
  /**
90
- * Manage sandbox skills - view local configuration
112
+ * Displays all skills with their current status.
91
113
  */
92
- async function manageSandboxSkills(context, config) {
114
+ async function displaySkillsCore(context, skills) {
115
+ console.log("\n" + "=".repeat(60));
116
+ console.log("⚙️ Production Skills");
117
+ console.log("=".repeat(60) + "\n");
118
+ for (const skill of skills) {
119
+ try {
120
+ const response = await fetch(`${BASE_URLS.API}/developer/skills/${context.agentId}/${skill.skillId}/versions`, {
121
+ method: 'GET',
122
+ headers: {
123
+ 'Authorization': `Bearer ${context.apiKey}`,
124
+ 'Content-Type': 'application/json'
125
+ }
126
+ });
127
+ if (response.ok) {
128
+ const data = await response.json();
129
+ const versions = data.data?.versions || data.versions || [];
130
+ const activeVersionId = data.data?.activeVersionId || data.activeVersionId;
131
+ const activeVersion = versions.find((v) => v.skillId === activeVersionId);
132
+ console.log(`📦 ${skill.name}`);
133
+ console.log(` Skill ID: ${skill.skillId}`);
134
+ if (activeVersion) {
135
+ console.log(` Deployed Version: ${activeVersion.version} ⭐`);
136
+ console.log(` Deployed: ${new Date(activeVersion.createdAt).toLocaleString()}`);
137
+ }
138
+ else {
139
+ console.log(` Deployed Version: Not deployed`);
140
+ }
141
+ console.log(` Total Versions: ${versions.length}`);
142
+ console.log();
143
+ }
144
+ else {
145
+ displaySkillError(skill, "Unable to fetch version info");
146
+ }
147
+ }
148
+ catch {
149
+ displaySkillError(skill, "Error loading versions");
150
+ }
151
+ }
152
+ console.log("=".repeat(60));
153
+ }
154
+ function displaySkillError(skill, status) {
155
+ console.log(`📦 ${skill.name}`);
156
+ console.log(` Skill ID: ${skill.skillId}`);
157
+ console.log(` Status: ${status}`);
158
+ console.log();
159
+ }
160
+ /**
161
+ * Fetches and returns sorted skill versions.
162
+ */
163
+ async function fetchVersionsCore(context, skill) {
164
+ const response = await fetch(`${BASE_URLS.API}/developer/skills/${context.agentId}/${skill.skillId}/versions`, {
165
+ method: 'GET',
166
+ headers: {
167
+ 'Authorization': `Bearer ${context.apiKey}`,
168
+ 'Content-Type': 'application/json'
169
+ }
170
+ });
171
+ if (!response.ok) {
172
+ console.error(`❌ Failed to fetch versions: HTTP ${response.status}`);
173
+ return null;
174
+ }
175
+ const data = await response.json();
176
+ const versions = (data.data?.versions || data.versions || []).sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
177
+ return { versions, activeVersionId: data.data?.activeVersionId || data.activeVersionId };
178
+ }
179
+ /**
180
+ * Displays versions for a skill.
181
+ */
182
+ function displayVersionsCore(skill, versions, activeVersionId) {
183
+ console.log("\n" + "=".repeat(60));
184
+ console.log(`📜 Versions for ${skill.name}`);
185
+ console.log("=".repeat(60) + "\n");
186
+ versions.forEach((version, index) => {
187
+ const isActive = version.skillId === activeVersionId;
188
+ console.log(`${index + 1}. Version ${version.version}${isActive ? ' ⭐ DEPLOYED' : ''}`);
189
+ console.log(` Created: ${new Date(version.createdAt).toLocaleString()}`);
190
+ console.log(` Version ID: ${version.skillId}`);
191
+ console.log();
192
+ });
193
+ console.log("=".repeat(60));
194
+ }
195
+ /**
196
+ * Deploys a specific version of a skill.
197
+ */
198
+ async function deployVersionCore(context, skill, version) {
199
+ writeProgress(`🔄 Deploying version ${version} of "${skill.name}"...`);
200
+ const deployResponse = await fetch(`${BASE_URLS.API}/developer/skills/${context.agentId}/${skill.skillId}/${version}/publish`, {
201
+ method: 'PUT',
202
+ headers: {
203
+ 'Authorization': `Bearer ${context.apiKey}`,
204
+ 'Content-Type': 'application/json'
205
+ }
206
+ });
207
+ if (!deployResponse.ok) {
208
+ const errorText = await deployResponse.text();
209
+ console.error(`❌ Deploy Error: ${deployResponse.status} - ${errorText}`);
210
+ return false;
211
+ }
212
+ writeSuccess(`✅ Version ${version} of "${skill.name}" deployed successfully`);
213
+ writeInfo("💡 The new version is now active for all users.");
214
+ return true;
215
+ }
216
+ /**
217
+ * Resolves a version string to an actual version, supporting "latest".
218
+ */
219
+ function resolveVersion(versions, versionArg) {
220
+ if (versionArg.toLowerCase() === 'latest') {
221
+ return versions[0].version;
222
+ }
223
+ const exists = versions.some((v) => v.version === versionArg);
224
+ if (!exists) {
225
+ console.error(`❌ Version "${versionArg}" not found`);
226
+ console.log('\nAvailable versions:');
227
+ versions.slice(0, 5).forEach((v) => console.log(` - ${v.version}`));
228
+ return null;
229
+ }
230
+ return versionArg;
231
+ }
232
+ /**
233
+ * Prompts user to select a skill from a list.
234
+ */
235
+ async function promptSkillSelection(skills, message) {
236
+ const answer = await safePrompt([
237
+ {
238
+ type: 'list',
239
+ name: 'selectedSkill',
240
+ message,
241
+ choices: skills.map((skill) => ({
242
+ name: `${skill.name} (${skill.skillId})`,
243
+ value: skill
244
+ }))
245
+ }
246
+ ]);
247
+ return answer?.selectedSkill || null;
248
+ }
249
+ /**
250
+ * Prompts user to select a version from a list.
251
+ */
252
+ async function promptVersionSelection(versions, activeVersionId) {
253
+ const answer = await safePrompt([
254
+ {
255
+ type: 'list',
256
+ name: 'selectedVersion',
257
+ message: 'Select a version to deploy:',
258
+ choices: versions.map((version) => {
259
+ const isActive = version.skillId === activeVersionId;
260
+ return {
261
+ name: `Version ${version.version} (${new Date(version.createdAt).toLocaleDateString()})${isActive ? ' ⭐ CURRENT' : ''}`,
262
+ value: version
263
+ };
264
+ })
265
+ }
266
+ ]);
267
+ return answer?.selectedVersion || null;
268
+ }
269
+ // ─────────────────────────────────────────────────────────────────────────────
270
+ // Non-Interactive Mode
271
+ // ─────────────────────────────────────────────────────────────────────────────
272
+ async function executeNonInteractive(context, config, action, options) {
273
+ const skills = config.skills || [];
274
+ // View action doesn't require skill selection
275
+ if (action === 'view') {
276
+ if (skills.length === 0) {
277
+ console.log("ℹ️ No skills found in configuration.");
278
+ return;
279
+ }
280
+ await displaySkillsCore(context, skills);
281
+ return;
282
+ }
283
+ // All other actions require skill selection
284
+ if (!options.skillName) {
285
+ console.error(`❌ --skill-name is required for action "${action}"`);
286
+ console.log(`\nUsage: lua skills ${action} --skill-name <name>`);
287
+ process.exit(1);
288
+ }
289
+ const selectedSkill = skills.find((s) => s.skillId === options.skillName || s.name === options.skillName);
290
+ if (!selectedSkill) {
291
+ console.error(`❌ Skill "${options.skillName}" not found`);
292
+ console.log('\nAvailable skills:');
293
+ skills.forEach((s) => console.log(` - ${s.name} (${s.skillId})`));
294
+ process.exit(1);
295
+ }
296
+ switch (action) {
297
+ case 'versions': {
298
+ const data = await fetchVersionsCore(context, selectedSkill);
299
+ if (!data)
300
+ process.exit(1);
301
+ if (data.versions.length === 0) {
302
+ console.log(`ℹ️ No versions found for ${selectedSkill.name}.`);
303
+ console.log("💡 Push a version first using 'lua push skill'.");
304
+ return;
305
+ }
306
+ displayVersionsCore(selectedSkill, data.versions, data.activeVersionId);
307
+ break;
308
+ }
309
+ case 'deploy': {
310
+ if (!options.skillVersion) {
311
+ console.error('❌ --skill-version is required for deploy action');
312
+ console.log('\nUsage: lua skills deploy --skill-name mySkill --skill-version 1.0.3');
313
+ console.log(' lua skills deploy -i mySkill -v latest');
314
+ process.exit(1);
315
+ }
316
+ const data = await fetchVersionsCore(context, selectedSkill);
317
+ if (!data)
318
+ process.exit(1);
319
+ if (data.versions.length === 0) {
320
+ console.error(`❌ No versions found for ${selectedSkill.name}.`);
321
+ console.log("💡 Push a version first using 'lua push skill'.");
322
+ process.exit(1);
323
+ }
324
+ const resolvedVersion = resolveVersion(data.versions, options.skillVersion);
325
+ if (!resolvedVersion)
326
+ process.exit(1);
327
+ const success = await deployVersionCore(context, selectedSkill, resolvedVersion);
328
+ if (!success)
329
+ process.exit(1);
330
+ break;
331
+ }
332
+ }
333
+ }
334
+ // ─────────────────────────────────────────────────────────────────────────────
335
+ // Interactive Mode
336
+ // ─────────────────────────────────────────────────────────────────────────────
337
+ async function manageSandboxSkillsInteractive(context, config) {
93
338
  let continueManaging = true;
94
339
  while (continueManaging) {
95
340
  console.log("\n" + "=".repeat(60));
@@ -127,7 +372,6 @@ async function manageSandboxSkills(context, config) {
127
372
  const { action } = actionAnswer;
128
373
  switch (action) {
129
374
  case 'refresh':
130
- // Reload config
131
375
  const newConfig = readSkillConfig();
132
376
  config.skills = newConfig.skills;
133
377
  break;
@@ -146,10 +390,7 @@ async function manageSandboxSkills(context, config) {
146
390
  }
147
391
  }
148
392
  }
149
- /**
150
- * Manage production skills - view and deploy versions
151
- */
152
- async function manageProductionSkills(context, config) {
393
+ async function manageProductionSkillsInteractive(context, config) {
153
394
  let continueManaging = true;
154
395
  while (continueManaging) {
155
396
  console.log("\n" + "=".repeat(60));
@@ -173,13 +414,13 @@ async function manageProductionSkills(context, config) {
173
414
  const { action } = actionAnswer;
174
415
  switch (action) {
175
416
  case 'view':
176
- await viewDeployedSkills(context, config);
417
+ await viewSkillsInteractive(context, config);
177
418
  break;
178
419
  case 'versions':
179
- await viewSkillVersions(context, config);
420
+ await viewVersionsInteractive(context, config);
180
421
  break;
181
422
  case 'deploy':
182
- await deploySkillVersion(context, config);
423
+ await deployVersionInteractive(context, config);
183
424
  break;
184
425
  case 'exit':
185
426
  continueManaging = false;
@@ -188,251 +429,87 @@ async function manageProductionSkills(context, config) {
188
429
  }
189
430
  }
190
431
  }
191
- /**
192
- * View deployed skills in production
193
- */
194
- async function viewDeployedSkills(context, config) {
432
+ async function viewSkillsInteractive(context, config) {
195
433
  writeProgress("🔄 Loading skill information...");
196
- try {
197
- const skills = config.skills || [];
198
- if (skills.length === 0) {
199
- console.log("\nℹ️ No skills found in configuration.\n");
200
- await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
201
- return;
202
- }
203
- console.log("\n" + "=".repeat(60));
204
- console.log("⚙️ Production Skills");
205
- console.log("=".repeat(60) + "\n");
206
- // Fetch version info for each skill
207
- for (const skill of skills) {
208
- try {
209
- const response = await fetch(`${BASE_URLS.API}/developer/skills/${context.agentId}/${skill.skillId}/versions`, {
210
- method: 'GET',
211
- headers: {
212
- 'Authorization': `Bearer ${context.apiKey}`,
213
- 'Content-Type': 'application/json'
214
- }
215
- });
216
- if (response.ok) {
217
- const data = await response.json();
218
- const versions = data.data?.versions || data.versions || [];
219
- const activeVersionId = data.data?.activeVersionId || data.activeVersionId;
220
- // Find active version
221
- const activeVersion = versions.find((v) => v.skillId === activeVersionId);
222
- console.log(`📦 ${skill.name}`);
223
- console.log(` Skill ID: ${skill.skillId}`);
224
- if (activeVersion) {
225
- console.log(` Deployed Version: ${activeVersion.version} ⭐`);
226
- const date = new Date(activeVersion.createdAt);
227
- console.log(` Deployed: ${date.toLocaleString()}`);
228
- }
229
- else {
230
- console.log(` Deployed Version: Not deployed`);
231
- }
232
- console.log(` Total Versions: ${versions.length}`);
233
- console.log();
234
- }
235
- else {
236
- console.log(`📦 ${skill.name}`);
237
- console.log(` Skill ID: ${skill.skillId}`);
238
- console.log(` Status: Unable to fetch version info`);
239
- console.log();
240
- }
241
- }
242
- catch (error) {
243
- console.log(`📦 ${skill.name}`);
244
- console.log(` Skill ID: ${skill.skillId}`);
245
- console.log(` Status: Error loading versions`);
246
- console.log();
247
- }
248
- }
249
- console.log("=".repeat(60) + "\n");
250
- await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
434
+ const skills = config.skills || [];
435
+ if (skills.length === 0) {
436
+ console.log("\nℹ️ No skills found in configuration.\n");
251
437
  }
252
- catch (error) {
253
- console.error('❌ Error loading skill information:', error);
254
- await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
438
+ else {
439
+ await displaySkillsCore(context, skills);
440
+ console.log();
255
441
  }
442
+ await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
256
443
  }
257
- /**
258
- * View versions for a specific skill
259
- */
260
- async function viewSkillVersions(context, config) {
444
+ async function viewVersionsInteractive(context, config) {
261
445
  const skills = config.skills || [];
262
446
  if (skills.length === 0) {
263
447
  console.log("\nℹ️ No skills found in configuration.\n");
264
448
  await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
265
449
  return;
266
450
  }
267
- // Prompt to select a skill
268
- const skillAnswer = await safePrompt([
269
- {
270
- type: 'list',
271
- name: 'selectedSkill',
272
- message: 'Select a skill to view versions:',
273
- choices: skills.map((skill) => ({
274
- name: `${skill.name} (${skill.skillId})`,
275
- value: skill
276
- }))
277
- }
278
- ]);
279
- if (!skillAnswer)
451
+ const selectedSkill = await promptSkillSelection(skills, 'Select a skill to view versions:');
452
+ if (!selectedSkill)
280
453
  return;
281
- const selectedSkill = skillAnswer.selectedSkill;
282
454
  writeProgress(`🔄 Loading versions for ${selectedSkill.name}...`);
283
- try {
284
- const response = await fetch(`${BASE_URLS.API}/developer/skills/${context.agentId}/${selectedSkill.skillId}/versions`, {
285
- method: 'GET',
286
- headers: {
287
- 'Authorization': `Bearer ${context.apiKey}`,
288
- 'Content-Type': 'application/json'
289
- }
290
- });
291
- if (!response.ok) {
292
- throw new Error(`HTTP error! status: ${response.status}`);
293
- }
294
- const data = await response.json();
295
- const versions = data.data?.versions || data.versions || [];
296
- const activeVersionId = data.data?.activeVersionId || data.activeVersionId;
297
- if (versions.length === 0) {
298
- console.log(`\nℹ️ No versions found for ${selectedSkill.name}.\n`);
299
- console.log("💡 Push a version first using 'lua push skill'.\n");
300
- await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
301
- return;
302
- }
303
- console.log("\n" + "=".repeat(60));
304
- console.log(`📜 Versions for ${selectedSkill.name}`);
305
- console.log("=".repeat(60) + "\n");
306
- // Sort versions by date (newest first)
307
- const sortedVersions = versions.sort((a, b) => {
308
- const dateA = new Date(a.createdAt).getTime();
309
- const dateB = new Date(b.createdAt).getTime();
310
- return dateB - dateA;
311
- });
312
- sortedVersions.forEach((version, index) => {
313
- const isActive = version.skillId === activeVersionId;
314
- const date = new Date(version.createdAt);
315
- console.log(`${index + 1}. Version ${version.version}${isActive ? ' ⭐ DEPLOYED' : ''}`);
316
- console.log(` Created: ${date.toLocaleString()}`);
317
- console.log(` Version ID: ${version.skillId}`);
318
- console.log();
319
- });
320
- console.log("=".repeat(60) + "\n");
455
+ const data = await fetchVersionsCore(context, selectedSkill);
456
+ if (!data) {
321
457
  await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
458
+ return;
322
459
  }
323
- catch (error) {
324
- console.error('❌ Error loading versions:', error);
325
- await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
460
+ if (data.versions.length === 0) {
461
+ console.log(`\nℹ️ No versions found for ${selectedSkill.name}.\n`);
462
+ console.log("💡 Push a version first using 'lua push skill'.\n");
463
+ }
464
+ else {
465
+ displayVersionsCore(selectedSkill, data.versions, data.activeVersionId);
466
+ console.log();
326
467
  }
468
+ await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
327
469
  }
328
- /**
329
- * Deploy a skill version to production
330
- */
331
- async function deploySkillVersion(context, config) {
470
+ async function deployVersionInteractive(context, config) {
332
471
  const skills = config.skills || [];
333
472
  if (skills.length === 0) {
334
473
  console.log("\nℹ️ No skills found in configuration.\n");
335
474
  await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
336
475
  return;
337
476
  }
338
- // Prompt to select a skill
339
- const skillAnswer = await safePrompt([
340
- {
341
- type: 'list',
342
- name: 'selectedSkill',
343
- message: 'Select a skill to deploy:',
344
- choices: skills.map((skill) => ({
345
- name: `${skill.name} (${skill.skillId})`,
346
- value: skill
347
- }))
348
- }
349
- ]);
350
- if (!skillAnswer)
477
+ const selectedSkill = await promptSkillSelection(skills, 'Select a skill to deploy:');
478
+ if (!selectedSkill)
351
479
  return;
352
- const selectedSkill = skillAnswer.selectedSkill;
353
480
  writeProgress(`🔄 Loading versions for ${selectedSkill.name}...`);
354
- try {
355
- const response = await fetch(`${BASE_URLS.API}/developer/skills/${context.agentId}/${selectedSkill.skillId}/versions`, {
356
- method: 'GET',
357
- headers: {
358
- 'Authorization': `Bearer ${context.apiKey}`,
359
- 'Content-Type': 'application/json'
360
- }
361
- });
362
- if (!response.ok) {
363
- throw new Error(`HTTP error! status: ${response.status}`);
364
- }
365
- const data = await response.json();
366
- const versions = data.data?.versions || data.versions || [];
367
- const activeVersionId = data.data?.activeVersionId || data.activeVersionId;
368
- if (versions.length === 0) {
369
- console.log(`\nℹ️ No versions found for ${selectedSkill.name}.\n`);
370
- console.log("💡 Push a version first using 'lua push skill'.\n");
371
- await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
372
- return;
373
- }
374
- // Sort versions by date (newest first)
375
- const sortedVersions = versions.sort((a, b) => {
376
- const dateA = new Date(a.createdAt).getTime();
377
- const dateB = new Date(b.createdAt).getTime();
378
- return dateB - dateA;
379
- });
380
- // Prompt to select a version
381
- const versionAnswer = await safePrompt([
382
- {
383
- type: 'list',
384
- name: 'selectedVersion',
385
- message: 'Select a version to deploy:',
386
- choices: sortedVersions.map((version) => {
387
- const isActive = version.skillId === activeVersionId;
388
- const date = new Date(version.createdAt);
389
- return {
390
- name: `Version ${version.version} (${date.toLocaleDateString()})${isActive ? ' ⭐ CURRENT' : ''}`,
391
- value: version
392
- };
393
- })
394
- }
395
- ]);
396
- if (!versionAnswer)
397
- return;
398
- const selectedVersion = versionAnswer.selectedVersion;
399
- // Show warning
400
- console.log("\n⚠️ WARNING: You are about to deploy to PRODUCTION!");
401
- console.log("⚠️ This will affect ALL users immediately.\n");
402
- console.log(`Skill: ${selectedSkill.name}`);
403
- console.log(`Version: ${selectedVersion.version}\n`);
404
- const confirmAnswer = await safePrompt([
405
- {
406
- type: 'confirm',
407
- name: 'confirm',
408
- message: 'Are you absolutely sure you want to deploy this version?',
409
- default: false
410
- }
411
- ]);
412
- if (!confirmAnswer || !confirmAnswer.confirm) {
413
- console.log("\n❌ Deployment cancelled.\n");
414
- return;
415
- }
416
- writeProgress("🔄 Deploying version...");
417
- const deployResponse = await fetch(`${BASE_URLS.API}/developer/skills/${context.agentId}/${selectedSkill.skillId}/${selectedVersion.version}/publish`, {
418
- method: 'PUT',
419
- headers: {
420
- 'Authorization': `Bearer ${context.apiKey}`,
421
- 'Content-Type': 'application/json'
422
- }
423
- });
424
- if (!deployResponse.ok) {
425
- const errorText = await deployResponse.text();
426
- console.error(`\n❌ Deploy Error: ${deployResponse.status} - ${errorText}\n`);
427
- throw new Error(`HTTP error! status: ${deployResponse.status}`);
428
- }
429
- writeSuccess(`\n✅ Version ${selectedVersion.version} of "${selectedSkill.name}" deployed successfully to production\n`);
430
- writeInfo("💡 The new version is now active for all users.");
481
+ const data = await fetchVersionsCore(context, selectedSkill);
482
+ if (!data) {
431
483
  await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
484
+ return;
432
485
  }
433
- catch (error) {
434
- console.error('\n Error deploying version:', error);
486
+ if (data.versions.length === 0) {
487
+ console.log(`\nℹ️ No versions found for ${selectedSkill.name}.\n`);
488
+ console.log("💡 Push a version first using 'lua push skill'.\n");
435
489
  await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
490
+ return;
491
+ }
492
+ const selectedVersion = await promptVersionSelection(data.versions, data.activeVersionId);
493
+ if (!selectedVersion)
494
+ return;
495
+ // Show warning and confirm
496
+ console.log("\n⚠️ WARNING: You are about to deploy to PRODUCTION!");
497
+ console.log("⚠️ This will affect ALL users immediately.\n");
498
+ console.log(`Skill: ${selectedSkill.name}`);
499
+ console.log(`Version: ${selectedVersion.version}\n`);
500
+ const confirmAnswer = await safePrompt([
501
+ {
502
+ type: 'confirm',
503
+ name: 'confirm',
504
+ message: 'Are you absolutely sure you want to deploy this version?',
505
+ default: false
506
+ }
507
+ ]);
508
+ if (!confirmAnswer || !confirmAnswer.confirm) {
509
+ console.log("\n❌ Deployment cancelled.\n");
510
+ return;
436
511
  }
512
+ await deployVersionCore(context, selectedSkill, selectedVersion.version);
513
+ await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
437
514
  }
438
515
  //# sourceMappingURL=skills.js.map