@ai-setting/roy-agent-cli 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/README.md +126 -0
- package/dist/bin/roy.js +127297 -0
- package/dist/roy-agent-darwin-arm64/bin/roy.js +127297 -0
- package/dist/roy-agent-darwin-x64/bin/roy.js +127297 -0
- package/dist/roy-agent-linux-arm64/bin/roy.js +127297 -0
- package/dist/roy-agent-linux-x64/bin/roy.js +127297 -0
- package/dist/roy-agent-windows-x64/bin/roy.js +127297 -0
- package/package.json +91 -0
- package/src/bin/roy.ts +12 -0
- package/src/cli.ts +101 -0
- package/src/commands/act.ts +480 -0
- package/src/commands/commands-add.ts +110 -0
- package/src/commands/commands-dirs.ts +70 -0
- package/src/commands/commands-info.ts +90 -0
- package/src/commands/commands-list.ts +161 -0
- package/src/commands/commands-remove.ts +147 -0
- package/src/commands/commands.ts +55 -0
- package/src/commands/config/config-service.test.ts +449 -0
- package/src/commands/config/config-service.ts +312 -0
- package/src/commands/config/deep-merge.test.ts +168 -0
- package/src/commands/config/deep-merge.ts +63 -0
- package/src/commands/config/export.ts +97 -0
- package/src/commands/config/filter-history-e2e.test.ts +141 -0
- package/src/commands/config/import-preserve-refs.test.ts +212 -0
- package/src/commands/config/import.ts +119 -0
- package/src/commands/config/index.ts +35 -0
- package/src/commands/config/list.ts +281 -0
- package/src/commands/config/roy-config-e2e.test.ts +297 -0
- package/src/commands/config/types.ts +54 -0
- package/src/commands/debug/index.ts +38 -0
- package/src/commands/debug/log.test.ts +233 -0
- package/src/commands/debug/log.ts +123 -0
- package/src/commands/debug/span.test.ts +297 -0
- package/src/commands/debug/span.ts +211 -0
- package/src/commands/debug/trace.test.ts +254 -0
- package/src/commands/debug/trace.ts +140 -0
- package/src/commands/eventsource/add.ts +133 -0
- package/src/commands/eventsource/index.ts +48 -0
- package/src/commands/eventsource/list.ts +194 -0
- package/src/commands/eventsource/remove.ts +95 -0
- package/src/commands/eventsource/start.ts +103 -0
- package/src/commands/eventsource/status.ts +185 -0
- package/src/commands/eventsource/stop.ts +89 -0
- package/src/commands/index.ts +22 -0
- package/src/commands/input-handler.test.ts +76 -0
- package/src/commands/input-handler.ts +43 -0
- package/src/commands/interactive-esc.test.ts +254 -0
- package/src/commands/interactive.shutdown.test.ts +122 -0
- package/src/commands/interactive.test.ts +221 -0
- package/src/commands/interactive.ts +1015 -0
- package/src/commands/lsp/check.ts +92 -0
- package/src/commands/lsp/index.ts +32 -0
- package/src/commands/lsp/install.ts +126 -0
- package/src/commands/lsp/list.ts +64 -0
- package/src/commands/mcp/index.ts +27 -0
- package/src/commands/mcp/list.ts +116 -0
- package/src/commands/mcp/reload.ts +70 -0
- package/src/commands/mcp/tools.ts +121 -0
- package/src/commands/memory/extract-e2e.test.ts +388 -0
- package/src/commands/memory/index.ts +11 -0
- package/src/commands/memory/memory-simplified.test.ts +58 -0
- package/src/commands/memory/memory.ts +25 -0
- package/src/commands/memory/organize.ts +300 -0
- package/src/commands/memory/recall.test.ts +120 -0
- package/src/commands/memory/recall.ts +88 -0
- package/src/commands/memory/record-extract-handle-query.test.ts +385 -0
- package/src/commands/memory/record-prompt-component.test.ts +343 -0
- package/src/commands/memory/record.test.ts +92 -0
- package/src/commands/memory/record.ts +332 -0
- package/src/commands/plugin.test.ts +292 -0
- package/src/commands/plugin.ts +267 -0
- package/src/commands/sessions/active.ts +96 -0
- package/src/commands/sessions/add-message.ts +96 -0
- package/src/commands/sessions/checkpoints.ts +154 -0
- package/src/commands/sessions/compact.test.ts +215 -0
- package/src/commands/sessions/compact.ts +269 -0
- package/src/commands/sessions/delete.ts +236 -0
- package/src/commands/sessions/get.ts +165 -0
- package/src/commands/sessions/grep.ts +233 -0
- package/src/commands/sessions/index.ts +95 -0
- package/src/commands/sessions/list.ts +210 -0
- package/src/commands/sessions/messages.test.ts +333 -0
- package/src/commands/sessions/messages.ts +248 -0
- package/src/commands/sessions/mock.ts +194 -0
- package/src/commands/sessions/new.ts +82 -0
- package/src/commands/sessions/rename.ts +98 -0
- package/src/commands/shared/event-handler.ts +213 -0
- package/src/commands/shared/event-message-formatter.ts +295 -0
- package/src/commands/shared/index.ts +11 -0
- package/src/commands/shared/query-executor.test.ts +434 -0
- package/src/commands/shared/query-executor.ts +324 -0
- package/src/commands/shared/repl-engine.test.ts +354 -0
- package/src/commands/shared/session-manager.test.ts +212 -0
- package/src/commands/shared/session-manager.ts +114 -0
- package/src/commands/skills/get.ts +90 -0
- package/src/commands/skills/index.ts +39 -0
- package/src/commands/skills/list.ts +129 -0
- package/src/commands/skills/reload.ts +59 -0
- package/src/commands/skills/search.ts +132 -0
- package/src/commands/skills/show-config.ts +93 -0
- package/src/commands/tasks/complete.ts +92 -0
- package/src/commands/tasks/create.ts +118 -0
- package/src/commands/tasks/delete.ts +86 -0
- package/src/commands/tasks/get.ts +116 -0
- package/src/commands/tasks/index.ts +53 -0
- package/src/commands/tasks/list.ts +140 -0
- package/src/commands/tasks/operations.ts +120 -0
- package/src/commands/tasks/update.ts +122 -0
- package/src/commands/tools/exec-tool.ts +128 -0
- package/src/commands/tools/get.ts +114 -0
- package/src/commands/tools/index.ts +35 -0
- package/src/commands/tools/list.ts +107 -0
- package/src/commands/tools/shared/index.ts +7 -0
- package/src/commands/tools/shared/schema-helper.ts +111 -0
- package/src/commands/workflow/commands/add.ts +315 -0
- package/src/commands/workflow/commands/get.ts +193 -0
- package/src/commands/workflow/commands/list.ts +137 -0
- package/src/commands/workflow/commands/nodes.ts +528 -0
- package/src/commands/workflow/commands/remove.ts +94 -0
- package/src/commands/workflow/commands/run.ts +398 -0
- package/src/commands/workflow/commands/status.ts +147 -0
- package/src/commands/workflow/commands/stop.ts +91 -0
- package/src/commands/workflow/commands/update.ts +130 -0
- package/src/commands/workflow/commands/validate.ts +139 -0
- package/src/commands/workflow/commands/workflow-cli.test.ts +196 -0
- package/src/commands/workflow/index.ts +65 -0
- package/src/commands/workflow/renderers.ts +358 -0
- package/src/commands/workflow/validators/index.ts +8 -0
- package/src/commands/workflow/validators/node-validator-factory.ts +40 -0
- package/src/commands/workflow/validators/node-validator.ts +125 -0
- package/src/commands/workflow/validators/nodes/agent-node-validator.ts +58 -0
- package/src/commands/workflow/validators/nodes/condition-node-validator.ts +34 -0
- package/src/commands/workflow/validators/nodes/decorator-node-validator.ts +45 -0
- package/src/commands/workflow/validators/nodes/merge-node-validator.ts +46 -0
- package/src/commands/workflow/validators/nodes/skill-node-validator.ts +33 -0
- package/src/commands/workflow/validators/nodes/tool-node-validator.ts +54 -0
- package/src/commands/workflow/validators/nodes/workflow-node-validator.ts +33 -0
- package/src/commands/workflow/validators/types.ts +78 -0
- package/src/commands/workflow/validators/workflow-validator.test.ts +273 -0
- package/src/commands/workflow/validators/workflow-validator.ts +320 -0
- package/src/index.ts +19 -0
- package/src/plugin/apply.ts +103 -0
- package/src/plugin/discover.ts +219 -0
- package/src/plugin/index.ts +45 -0
- package/src/plugin/registry.ts +272 -0
- package/src/plugin/types.ts +165 -0
- package/src/services/context-handler.service.test.ts +501 -0
- package/src/services/context-handler.service.ts +372 -0
- package/src/services/environment.service.commands-prompt.test.ts +167 -0
- package/src/services/environment.service.ts +656 -0
- package/src/services/output.service.test.ts +92 -0
- package/src/services/output.service.ts +122 -0
- package/src/services/quiet-mode.service.test.ts +114 -0
- package/src/services/quiet-mode.service.ts +81 -0
- package/src/services/stream-output.service.test.ts +214 -0
- package/src/services/stream-output.service.ts +323 -0
- package/src/util/which.test.ts +101 -0
- package/src/util/which.ts +55 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Workflow Get Command
|
|
3
|
+
*
|
|
4
|
+
* Get workflow or run details
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { CommandModule } from 'yargs';
|
|
8
|
+
import { EnvironmentService } from '../../../services/environment.service';
|
|
9
|
+
import { OutputService } from '../../../services/output.service';
|
|
10
|
+
import { renderWorkflowDetail, renderRunDetail, renderNodesList } from '../renderers';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import type { WorkflowService, SessionInfo } from '@ai-setting/roy-agent-core/env/workflow/service';
|
|
13
|
+
import type { WorkflowRun } from '@ai-setting/roy-agent-core/env/workflow/types';
|
|
14
|
+
|
|
15
|
+
export interface WorkflowGetOptions {
|
|
16
|
+
identifier: string;
|
|
17
|
+
runId?: boolean;
|
|
18
|
+
includeNodes?: boolean;
|
|
19
|
+
includeRuns?: boolean;
|
|
20
|
+
json?: boolean;
|
|
21
|
+
yaml?: boolean;
|
|
22
|
+
config?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* WorkflowGetCommand - Get workflow or run details
|
|
27
|
+
*/
|
|
28
|
+
export const WorkflowGetCommand: CommandModule<object, WorkflowGetOptions> = {
|
|
29
|
+
command: 'get <identifier>',
|
|
30
|
+
describe: '获取 Workflow 或 Run 详情',
|
|
31
|
+
|
|
32
|
+
builder: (yargs) =>
|
|
33
|
+
yargs
|
|
34
|
+
.positional('identifier', {
|
|
35
|
+
describe: 'Workflow 名称或 Run ID',
|
|
36
|
+
type: 'string',
|
|
37
|
+
demandOption: true,
|
|
38
|
+
})
|
|
39
|
+
.option('run-id', {
|
|
40
|
+
describe: '将 identifier 作为 Run ID 处理',
|
|
41
|
+
type: 'boolean',
|
|
42
|
+
default: false,
|
|
43
|
+
})
|
|
44
|
+
.option('include-nodes', {
|
|
45
|
+
describe: '显示节点详情',
|
|
46
|
+
type: 'boolean',
|
|
47
|
+
default: false,
|
|
48
|
+
})
|
|
49
|
+
.option('include-runs', {
|
|
50
|
+
describe: '包含运行历史',
|
|
51
|
+
type: 'boolean',
|
|
52
|
+
default: false,
|
|
53
|
+
})
|
|
54
|
+
.option('json', {
|
|
55
|
+
alias: 'j',
|
|
56
|
+
describe: 'JSON 格式输出',
|
|
57
|
+
type: 'boolean',
|
|
58
|
+
default: false,
|
|
59
|
+
})
|
|
60
|
+
.option('yaml', {
|
|
61
|
+
alias: 'y',
|
|
62
|
+
describe: 'YAML 格式输出',
|
|
63
|
+
type: 'boolean',
|
|
64
|
+
default: false,
|
|
65
|
+
})
|
|
66
|
+
.option('config', {
|
|
67
|
+
describe: '配置文件路径',
|
|
68
|
+
type: 'string',
|
|
69
|
+
}),
|
|
70
|
+
|
|
71
|
+
async handler(args) {
|
|
72
|
+
const output = new OutputService();
|
|
73
|
+
const envService = new EnvironmentService(output);
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
await envService.create({ configPath: args.config });
|
|
77
|
+
const env = envService.getEnvironment();
|
|
78
|
+
if (!env) {
|
|
79
|
+
output.error("Failed to create environment");
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
const workflowComponent = env.getComponent('workflow') as any;
|
|
83
|
+
|
|
84
|
+
if (!workflowComponent) {
|
|
85
|
+
output.error('WorkflowComponent not available');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const service = workflowComponent.getService() as WorkflowService;
|
|
90
|
+
|
|
91
|
+
// Determine if this is a run ID
|
|
92
|
+
const isRunId = args.runId || args.identifier.startsWith('run_');
|
|
93
|
+
|
|
94
|
+
if (isRunId) {
|
|
95
|
+
// Get run details (using getSession since runs are now sessions)
|
|
96
|
+
const session: SessionInfo | null = await service.getSession(args.identifier);
|
|
97
|
+
if (!session) {
|
|
98
|
+
output.error(`Run not found: ${args.identifier}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const metadata = session.metadata;
|
|
103
|
+
if (args.json) {
|
|
104
|
+
output.json({
|
|
105
|
+
run: {
|
|
106
|
+
id: session.id,
|
|
107
|
+
workflowId: metadata.workflowId,
|
|
108
|
+
status: metadata.status,
|
|
109
|
+
input: metadata.input,
|
|
110
|
+
startedAt: session.createdAt?.toISOString(),
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
} else {
|
|
114
|
+
const run: WorkflowRun = {
|
|
115
|
+
id: session.id,
|
|
116
|
+
workflowId: (metadata as any).workflowId || '',
|
|
117
|
+
workflowName: metadata.workflowName,
|
|
118
|
+
status: metadata.status,
|
|
119
|
+
input: (metadata as any).input,
|
|
120
|
+
startedAt: session.createdAt,
|
|
121
|
+
debugMode: false,
|
|
122
|
+
};
|
|
123
|
+
output.log(renderRunDetail(run));
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
// Get workflow details
|
|
127
|
+
const workflow = service.getWorkflow(args.identifier);
|
|
128
|
+
if (!workflow) {
|
|
129
|
+
output.error(`Workflow not found: ${args.identifier}`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Get runs if requested (using listSessions since runs are now sessions)
|
|
134
|
+
let sessionRuns: SessionInfo[] = [];
|
|
135
|
+
if (args.includeRuns) {
|
|
136
|
+
sessionRuns = await service.listSessions({ limit: 5 });
|
|
137
|
+
// Filter runs for this workflow
|
|
138
|
+
sessionRuns = sessionRuns.filter(r =>
|
|
139
|
+
(r.metadata as any).workflowId === workflow.id ||
|
|
140
|
+
(r.metadata as any).workflowName === workflow.name
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Convert SessionInfo[] to WorkflowRun[] for renderer
|
|
145
|
+
const runs: WorkflowRun[] = sessionRuns.map(r => {
|
|
146
|
+
const m = r.metadata as any;
|
|
147
|
+
return {
|
|
148
|
+
id: r.id,
|
|
149
|
+
workflowId: m.workflowId || '',
|
|
150
|
+
workflowName: m.workflowName || workflow.name,
|
|
151
|
+
status: m.status,
|
|
152
|
+
startedAt: r.createdAt,
|
|
153
|
+
debugMode: false,
|
|
154
|
+
};
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
if (args.json) {
|
|
158
|
+
output.json({
|
|
159
|
+
workflow: {
|
|
160
|
+
id: workflow.id,
|
|
161
|
+
name: workflow.name,
|
|
162
|
+
version: workflow.version,
|
|
163
|
+
description: workflow.description,
|
|
164
|
+
definition: workflow.definition,
|
|
165
|
+
tags: workflow.tags,
|
|
166
|
+
createdAt: workflow.createdAt.toISOString(),
|
|
167
|
+
updatedAt: workflow.updatedAt.toISOString(),
|
|
168
|
+
},
|
|
169
|
+
runs: runs.map(r => ({
|
|
170
|
+
id: r.id,
|
|
171
|
+
status: r.status,
|
|
172
|
+
startedAt: r.startedAt?.toISOString(),
|
|
173
|
+
workflowId: r.workflowId,
|
|
174
|
+
})),
|
|
175
|
+
});
|
|
176
|
+
} else {
|
|
177
|
+
output.log(renderWorkflowDetail(workflow, { includeRuns: runs }));
|
|
178
|
+
|
|
179
|
+
// Show nodes if requested
|
|
180
|
+
if (args.includeNodes) {
|
|
181
|
+
output.log(chalk.bold('\n📋 All Nodes:'));
|
|
182
|
+
output.log(renderNodesList(workflow.definition.nodes));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
} catch (error) {
|
|
187
|
+
output.error(`Failed to get workflow: ${error}`);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
} finally {
|
|
190
|
+
await envService.dispose();
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Workflow List Command
|
|
3
|
+
*
|
|
4
|
+
* List all registered workflows
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { CommandModule } from 'yargs';
|
|
8
|
+
import { EnvironmentService } from '../../../services/environment.service';
|
|
9
|
+
import { OutputService } from '../../../services/output.service';
|
|
10
|
+
import { renderWorkflowList } from '../renderers';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import type { WorkflowService } from '@ai-setting/roy-agent-core/env/workflow/service';
|
|
13
|
+
|
|
14
|
+
export interface WorkflowListOptions {
|
|
15
|
+
tag?: string;
|
|
16
|
+
taskId?: number;
|
|
17
|
+
search?: string;
|
|
18
|
+
limit?: number;
|
|
19
|
+
offset?: number;
|
|
20
|
+
json?: boolean;
|
|
21
|
+
yaml?: boolean;
|
|
22
|
+
config?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* WorkflowListCommand - List workflows
|
|
27
|
+
*/
|
|
28
|
+
export const WorkflowListCommand: CommandModule<object, WorkflowListOptions> = {
|
|
29
|
+
command: 'list',
|
|
30
|
+
describe: '列出所有已注册的 Workflow',
|
|
31
|
+
|
|
32
|
+
builder: (yargs) =>
|
|
33
|
+
yargs
|
|
34
|
+
.option('tag', {
|
|
35
|
+
alias: 't',
|
|
36
|
+
describe: '按标签筛选',
|
|
37
|
+
type: 'string',
|
|
38
|
+
})
|
|
39
|
+
.option('task-id', {
|
|
40
|
+
alias: 'i',
|
|
41
|
+
describe: '按关联任务 ID 筛选',
|
|
42
|
+
type: 'number',
|
|
43
|
+
})
|
|
44
|
+
.option('search', {
|
|
45
|
+
alias: 's',
|
|
46
|
+
describe: '搜索 description 和 tags(支持 AND/OR/NOT 语法)',
|
|
47
|
+
type: 'string',
|
|
48
|
+
})
|
|
49
|
+
.option('limit', {
|
|
50
|
+
alias: 'l',
|
|
51
|
+
describe: '返回数量限制',
|
|
52
|
+
type: 'number',
|
|
53
|
+
default: 50,
|
|
54
|
+
})
|
|
55
|
+
.option('offset', {
|
|
56
|
+
alias: 'o',
|
|
57
|
+
describe: '分页偏移',
|
|
58
|
+
type: 'number',
|
|
59
|
+
default: 0,
|
|
60
|
+
})
|
|
61
|
+
.option('json', {
|
|
62
|
+
alias: 'j',
|
|
63
|
+
describe: 'JSON 格式输出',
|
|
64
|
+
type: 'boolean',
|
|
65
|
+
default: false,
|
|
66
|
+
})
|
|
67
|
+
.option('yaml', {
|
|
68
|
+
alias: 'y',
|
|
69
|
+
describe: 'YAML 格式输出',
|
|
70
|
+
type: 'boolean',
|
|
71
|
+
default: false,
|
|
72
|
+
})
|
|
73
|
+
.option('config', {
|
|
74
|
+
describe: '配置文件路径',
|
|
75
|
+
type: 'string',
|
|
76
|
+
}),
|
|
77
|
+
|
|
78
|
+
async handler(args) {
|
|
79
|
+
const output = new OutputService();
|
|
80
|
+
const envService = new EnvironmentService(output);
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
await envService.create({ configPath: args.config });
|
|
84
|
+
const env = envService.getEnvironment();
|
|
85
|
+
if (!env) {
|
|
86
|
+
output.error("Failed to create environment");
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const workflowComponent = env.getComponent('workflow');
|
|
91
|
+
|
|
92
|
+
if (!workflowComponent) {
|
|
93
|
+
output.error('WorkflowComponent not available');
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 获取 WorkflowService
|
|
98
|
+
const service = (workflowComponent as any).workflowService as WorkflowService;
|
|
99
|
+
|
|
100
|
+
if (!service) {
|
|
101
|
+
output.error('WorkflowService not initialized. Please run "roy workflow init" first.');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
const workflows = service.listWorkflows({
|
|
105
|
+
tag: args.tag,
|
|
106
|
+
taskId: args.taskId,
|
|
107
|
+
search: args.search,
|
|
108
|
+
limit: args.limit,
|
|
109
|
+
offset: args.offset,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
if (args.json) {
|
|
113
|
+
output.json({
|
|
114
|
+
workflows: workflows.map(w => ({
|
|
115
|
+
id: w.id,
|
|
116
|
+
name: w.name,
|
|
117
|
+
version: w.version,
|
|
118
|
+
description: w.description,
|
|
119
|
+
tags: w.tags,
|
|
120
|
+
taskId: w.metadata.taskId,
|
|
121
|
+
createdAt: w.createdAt.toISOString(),
|
|
122
|
+
updatedAt: w.updatedAt.toISOString(),
|
|
123
|
+
})),
|
|
124
|
+
total: workflows.length,
|
|
125
|
+
});
|
|
126
|
+
} else {
|
|
127
|
+
output.log(renderWorkflowList(workflows));
|
|
128
|
+
output.log(chalk.green(`\n✅ 共 ${workflows.length} 个 Workflow`));
|
|
129
|
+
}
|
|
130
|
+
} catch (error) {
|
|
131
|
+
output.error(`Failed to list workflows: ${error}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
} finally {
|
|
134
|
+
await envService.dispose();
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
};
|