@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.
Files changed (158) hide show
  1. package/README.md +126 -0
  2. package/dist/bin/roy.js +127297 -0
  3. package/dist/roy-agent-darwin-arm64/bin/roy.js +127297 -0
  4. package/dist/roy-agent-darwin-x64/bin/roy.js +127297 -0
  5. package/dist/roy-agent-linux-arm64/bin/roy.js +127297 -0
  6. package/dist/roy-agent-linux-x64/bin/roy.js +127297 -0
  7. package/dist/roy-agent-windows-x64/bin/roy.js +127297 -0
  8. package/package.json +91 -0
  9. package/src/bin/roy.ts +12 -0
  10. package/src/cli.ts +101 -0
  11. package/src/commands/act.ts +480 -0
  12. package/src/commands/commands-add.ts +110 -0
  13. package/src/commands/commands-dirs.ts +70 -0
  14. package/src/commands/commands-info.ts +90 -0
  15. package/src/commands/commands-list.ts +161 -0
  16. package/src/commands/commands-remove.ts +147 -0
  17. package/src/commands/commands.ts +55 -0
  18. package/src/commands/config/config-service.test.ts +449 -0
  19. package/src/commands/config/config-service.ts +312 -0
  20. package/src/commands/config/deep-merge.test.ts +168 -0
  21. package/src/commands/config/deep-merge.ts +63 -0
  22. package/src/commands/config/export.ts +97 -0
  23. package/src/commands/config/filter-history-e2e.test.ts +141 -0
  24. package/src/commands/config/import-preserve-refs.test.ts +212 -0
  25. package/src/commands/config/import.ts +119 -0
  26. package/src/commands/config/index.ts +35 -0
  27. package/src/commands/config/list.ts +281 -0
  28. package/src/commands/config/roy-config-e2e.test.ts +297 -0
  29. package/src/commands/config/types.ts +54 -0
  30. package/src/commands/debug/index.ts +38 -0
  31. package/src/commands/debug/log.test.ts +233 -0
  32. package/src/commands/debug/log.ts +123 -0
  33. package/src/commands/debug/span.test.ts +297 -0
  34. package/src/commands/debug/span.ts +211 -0
  35. package/src/commands/debug/trace.test.ts +254 -0
  36. package/src/commands/debug/trace.ts +140 -0
  37. package/src/commands/eventsource/add.ts +133 -0
  38. package/src/commands/eventsource/index.ts +48 -0
  39. package/src/commands/eventsource/list.ts +194 -0
  40. package/src/commands/eventsource/remove.ts +95 -0
  41. package/src/commands/eventsource/start.ts +103 -0
  42. package/src/commands/eventsource/status.ts +185 -0
  43. package/src/commands/eventsource/stop.ts +89 -0
  44. package/src/commands/index.ts +22 -0
  45. package/src/commands/input-handler.test.ts +76 -0
  46. package/src/commands/input-handler.ts +43 -0
  47. package/src/commands/interactive-esc.test.ts +254 -0
  48. package/src/commands/interactive.shutdown.test.ts +122 -0
  49. package/src/commands/interactive.test.ts +221 -0
  50. package/src/commands/interactive.ts +1015 -0
  51. package/src/commands/lsp/check.ts +92 -0
  52. package/src/commands/lsp/index.ts +32 -0
  53. package/src/commands/lsp/install.ts +126 -0
  54. package/src/commands/lsp/list.ts +64 -0
  55. package/src/commands/mcp/index.ts +27 -0
  56. package/src/commands/mcp/list.ts +116 -0
  57. package/src/commands/mcp/reload.ts +70 -0
  58. package/src/commands/mcp/tools.ts +121 -0
  59. package/src/commands/memory/extract-e2e.test.ts +388 -0
  60. package/src/commands/memory/index.ts +11 -0
  61. package/src/commands/memory/memory-simplified.test.ts +58 -0
  62. package/src/commands/memory/memory.ts +25 -0
  63. package/src/commands/memory/organize.ts +300 -0
  64. package/src/commands/memory/recall.test.ts +120 -0
  65. package/src/commands/memory/recall.ts +88 -0
  66. package/src/commands/memory/record-extract-handle-query.test.ts +385 -0
  67. package/src/commands/memory/record-prompt-component.test.ts +343 -0
  68. package/src/commands/memory/record.test.ts +92 -0
  69. package/src/commands/memory/record.ts +332 -0
  70. package/src/commands/plugin.test.ts +292 -0
  71. package/src/commands/plugin.ts +267 -0
  72. package/src/commands/sessions/active.ts +96 -0
  73. package/src/commands/sessions/add-message.ts +96 -0
  74. package/src/commands/sessions/checkpoints.ts +154 -0
  75. package/src/commands/sessions/compact.test.ts +215 -0
  76. package/src/commands/sessions/compact.ts +269 -0
  77. package/src/commands/sessions/delete.ts +236 -0
  78. package/src/commands/sessions/get.ts +165 -0
  79. package/src/commands/sessions/grep.ts +233 -0
  80. package/src/commands/sessions/index.ts +95 -0
  81. package/src/commands/sessions/list.ts +210 -0
  82. package/src/commands/sessions/messages.test.ts +333 -0
  83. package/src/commands/sessions/messages.ts +248 -0
  84. package/src/commands/sessions/mock.ts +194 -0
  85. package/src/commands/sessions/new.ts +82 -0
  86. package/src/commands/sessions/rename.ts +98 -0
  87. package/src/commands/shared/event-handler.ts +213 -0
  88. package/src/commands/shared/event-message-formatter.ts +295 -0
  89. package/src/commands/shared/index.ts +11 -0
  90. package/src/commands/shared/query-executor.test.ts +434 -0
  91. package/src/commands/shared/query-executor.ts +324 -0
  92. package/src/commands/shared/repl-engine.test.ts +354 -0
  93. package/src/commands/shared/session-manager.test.ts +212 -0
  94. package/src/commands/shared/session-manager.ts +114 -0
  95. package/src/commands/skills/get.ts +90 -0
  96. package/src/commands/skills/index.ts +39 -0
  97. package/src/commands/skills/list.ts +129 -0
  98. package/src/commands/skills/reload.ts +59 -0
  99. package/src/commands/skills/search.ts +132 -0
  100. package/src/commands/skills/show-config.ts +93 -0
  101. package/src/commands/tasks/complete.ts +92 -0
  102. package/src/commands/tasks/create.ts +118 -0
  103. package/src/commands/tasks/delete.ts +86 -0
  104. package/src/commands/tasks/get.ts +116 -0
  105. package/src/commands/tasks/index.ts +53 -0
  106. package/src/commands/tasks/list.ts +140 -0
  107. package/src/commands/tasks/operations.ts +120 -0
  108. package/src/commands/tasks/update.ts +122 -0
  109. package/src/commands/tools/exec-tool.ts +128 -0
  110. package/src/commands/tools/get.ts +114 -0
  111. package/src/commands/tools/index.ts +35 -0
  112. package/src/commands/tools/list.ts +107 -0
  113. package/src/commands/tools/shared/index.ts +7 -0
  114. package/src/commands/tools/shared/schema-helper.ts +111 -0
  115. package/src/commands/workflow/commands/add.ts +315 -0
  116. package/src/commands/workflow/commands/get.ts +193 -0
  117. package/src/commands/workflow/commands/list.ts +137 -0
  118. package/src/commands/workflow/commands/nodes.ts +528 -0
  119. package/src/commands/workflow/commands/remove.ts +94 -0
  120. package/src/commands/workflow/commands/run.ts +398 -0
  121. package/src/commands/workflow/commands/status.ts +147 -0
  122. package/src/commands/workflow/commands/stop.ts +91 -0
  123. package/src/commands/workflow/commands/update.ts +130 -0
  124. package/src/commands/workflow/commands/validate.ts +139 -0
  125. package/src/commands/workflow/commands/workflow-cli.test.ts +196 -0
  126. package/src/commands/workflow/index.ts +65 -0
  127. package/src/commands/workflow/renderers.ts +358 -0
  128. package/src/commands/workflow/validators/index.ts +8 -0
  129. package/src/commands/workflow/validators/node-validator-factory.ts +40 -0
  130. package/src/commands/workflow/validators/node-validator.ts +125 -0
  131. package/src/commands/workflow/validators/nodes/agent-node-validator.ts +58 -0
  132. package/src/commands/workflow/validators/nodes/condition-node-validator.ts +34 -0
  133. package/src/commands/workflow/validators/nodes/decorator-node-validator.ts +45 -0
  134. package/src/commands/workflow/validators/nodes/merge-node-validator.ts +46 -0
  135. package/src/commands/workflow/validators/nodes/skill-node-validator.ts +33 -0
  136. package/src/commands/workflow/validators/nodes/tool-node-validator.ts +54 -0
  137. package/src/commands/workflow/validators/nodes/workflow-node-validator.ts +33 -0
  138. package/src/commands/workflow/validators/types.ts +78 -0
  139. package/src/commands/workflow/validators/workflow-validator.test.ts +273 -0
  140. package/src/commands/workflow/validators/workflow-validator.ts +320 -0
  141. package/src/index.ts +19 -0
  142. package/src/plugin/apply.ts +103 -0
  143. package/src/plugin/discover.ts +219 -0
  144. package/src/plugin/index.ts +45 -0
  145. package/src/plugin/registry.ts +272 -0
  146. package/src/plugin/types.ts +165 -0
  147. package/src/services/context-handler.service.test.ts +501 -0
  148. package/src/services/context-handler.service.ts +372 -0
  149. package/src/services/environment.service.commands-prompt.test.ts +167 -0
  150. package/src/services/environment.service.ts +656 -0
  151. package/src/services/output.service.test.ts +92 -0
  152. package/src/services/output.service.ts +122 -0
  153. package/src/services/quiet-mode.service.test.ts +114 -0
  154. package/src/services/quiet-mode.service.ts +81 -0
  155. package/src/services/stream-output.service.test.ts +214 -0
  156. package/src/services/stream-output.service.ts +323 -0
  157. package/src/util/which.test.ts +101 -0
  158. 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
+ };