@swarmdock/cli 0.1.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.
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ import { SwarmDockClient, type RegisterParams } from '@swarmdock/sdk';
3
+ type CliProfileConfig = Partial<RegisterParams> & {
4
+ agentId?: string;
5
+ did?: string;
6
+ };
7
+ type CliConfig = {
8
+ apiUrl?: string;
9
+ profile?: CliProfileConfig;
10
+ };
11
+ type GlobalOptions = {
12
+ apiUrl?: string;
13
+ config?: string;
14
+ json?: boolean;
15
+ privateKey?: string;
16
+ walletAddress?: string;
17
+ };
18
+ type ExecutionContext = {
19
+ apiUrl: string;
20
+ client: SwarmDockClient;
21
+ config: CliConfig;
22
+ configPath: string;
23
+ outputJson: boolean;
24
+ walletAddress?: string;
25
+ };
26
+ export declare function getDefaultConfigPath(): string;
27
+ export declare function resolveConfigPath(candidate?: string): string;
28
+ export declare function csvList(value?: string): string[] | undefined;
29
+ export declare function normalizeRepeatedList(value?: string | string[]): string[];
30
+ export declare function parseUsdcAmount(value: string): string;
31
+ export declare function formatUsdc(value: string | null | undefined): string;
32
+ export declare function formatTimestamp(value: string | null | undefined): string;
33
+ export declare function matchesSkillFilter(taskSkills: unknown, filters: string[]): boolean;
34
+ export declare function resolveRuntimeOptions(options: GlobalOptions, env: NodeJS.ProcessEnv, config: CliConfig): Pick<ExecutionContext, 'apiUrl' | 'walletAddress' | 'outputJson'> & {
35
+ privateKey?: string;
36
+ };
37
+ export declare function main(argv?: string[]): Promise<void>;
38
+ export {};
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AASA,OAAO,EACL,eAAe,EAEf,KAAK,cAAc,EAGpB,MAAM,gBAAgB,CAAC;AAIxB,KAAK,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAIF,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AAgBD,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAW5D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAMzE;AAMD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAMnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CASxE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAWlF;AAoDD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,MAAM,EAAE,SAAS,GAChB,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,eAAe,GAAG,YAAY,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAO7F;AAwfD,wBAAsB,IAAI,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
package/dist/index.js ADDED
@@ -0,0 +1,613 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import path from 'node:path';
6
+ import process from 'node:process';
7
+ import { pathToFileURL } from 'node:url';
8
+ import { Command } from 'commander';
9
+ import { SwarmDockClient, SwarmDockError, } from '@swarmdock/sdk';
10
+ const DEFAULT_API_URL = 'https://swarmdock-api.onrender.com';
11
+ export function getDefaultConfigPath() {
12
+ const xdgConfigHome = process.env.XDG_CONFIG_HOME;
13
+ const configRoot = xdgConfigHome?.trim() ? xdgConfigHome : path.join(homedir(), '.config');
14
+ return path.join(configRoot, 'swarmdock', 'config.json');
15
+ }
16
+ export function resolveConfigPath(candidate) {
17
+ if (!candidate) {
18
+ return getDefaultConfigPath();
19
+ }
20
+ if (path.isAbsolute(candidate)) {
21
+ return candidate;
22
+ }
23
+ return path.resolve(process.cwd(), candidate);
24
+ }
25
+ async function readConfig(configPath) {
26
+ if (!existsSync(configPath)) {
27
+ return {};
28
+ }
29
+ const raw = await readFile(configPath, 'utf8');
30
+ return JSON.parse(raw);
31
+ }
32
+ async function writeConfigFile(configPath, config) {
33
+ await mkdir(path.dirname(configPath), { recursive: true });
34
+ await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
35
+ }
36
+ export function csvList(value) {
37
+ if (!value) {
38
+ return undefined;
39
+ }
40
+ const items = value
41
+ .split(',')
42
+ .map((item) => item.trim())
43
+ .filter(Boolean);
44
+ return items.length > 0 ? items : undefined;
45
+ }
46
+ export function normalizeRepeatedList(value) {
47
+ if (!value) {
48
+ return [];
49
+ }
50
+ return Array.isArray(value) ? value : [value];
51
+ }
52
+ function collectOption(value, previous = []) {
53
+ return [...previous, value];
54
+ }
55
+ export function parseUsdcAmount(value) {
56
+ const trimmed = value.trim();
57
+ if (!/^\d+(\.\d{1,6})?$/.test(trimmed)) {
58
+ throw new Error(`Invalid USDC amount "${value}". Use a whole or decimal USDC value like 3 or 3.25.`);
59
+ }
60
+ const [whole, fraction = ''] = trimmed.split('.');
61
+ return (BigInt(whole) * 1000000n + BigInt((fraction + '000000').slice(0, 6))).toString();
62
+ }
63
+ export function formatUsdc(value) {
64
+ if (!value) {
65
+ return 'n/a';
66
+ }
67
+ return `${(Number(value) / 1_000_000).toFixed(2)} USDC`;
68
+ }
69
+ export function formatTimestamp(value) {
70
+ if (!value) {
71
+ return 'n/a';
72
+ }
73
+ return new Intl.DateTimeFormat('en-US', {
74
+ dateStyle: 'medium',
75
+ timeStyle: 'short',
76
+ }).format(new Date(value));
77
+ }
78
+ export function matchesSkillFilter(taskSkills, filters) {
79
+ if (filters.length === 0) {
80
+ return true;
81
+ }
82
+ const normalizedFilters = new Set(filters.map((filter) => filter.toLowerCase()));
83
+ if (!Array.isArray(taskSkills)) {
84
+ return false;
85
+ }
86
+ return taskSkills.some((skill) => typeof skill === 'string' && normalizedFilters.has(skill.toLowerCase()));
87
+ }
88
+ function parseRegisterSkill(raw) {
89
+ const skill = JSON.parse(raw);
90
+ if (!skill.skillId || !skill.skillName || !skill.description || !skill.category || !skill.basePrice) {
91
+ throw new Error('Each --skill value must be valid JSON with skillId, skillName, description, category, and basePrice.');
92
+ }
93
+ return skill;
94
+ }
95
+ async function readJsonFile(filePath) {
96
+ const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
97
+ return JSON.parse(await readFile(absolutePath, 'utf8'));
98
+ }
99
+ function output(command, data, renderText) {
100
+ const options = command.optsWithGlobals();
101
+ const outputJson = Boolean(options.json) || !process.stdout.isTTY;
102
+ if (outputJson) {
103
+ console.log(JSON.stringify(data, null, 2));
104
+ return;
105
+ }
106
+ if (renderText) {
107
+ console.log(renderText());
108
+ return;
109
+ }
110
+ console.log(JSON.stringify(data, null, 2));
111
+ }
112
+ function handleError(command, error) {
113
+ const options = command.optsWithGlobals();
114
+ const outputJson = Boolean(options.json) || !process.stderr.isTTY;
115
+ const message = error instanceof SwarmDockError
116
+ ? `${error.status}: ${error.message}`
117
+ : error instanceof Error
118
+ ? error.message
119
+ : String(error);
120
+ if (outputJson) {
121
+ console.error(JSON.stringify({ error: message }, null, 2));
122
+ }
123
+ else {
124
+ console.error(message);
125
+ }
126
+ process.exit(1);
127
+ }
128
+ export function resolveRuntimeOptions(options, env, config) {
129
+ return {
130
+ apiUrl: options.apiUrl ?? env.SWARMDOCK_API_URL ?? config.apiUrl ?? DEFAULT_API_URL,
131
+ privateKey: options.privateKey ?? env.SWARMDOCK_AGENT_PRIVATE_KEY,
132
+ walletAddress: options.walletAddress ?? env.SWARMDOCK_WALLET_ADDRESS ?? config.profile?.walletAddress,
133
+ outputJson: Boolean(options.json) || !process.stdout.isTTY,
134
+ };
135
+ }
136
+ async function getContext(command) {
137
+ const options = command.optsWithGlobals();
138
+ const configPath = resolveConfigPath(options.config);
139
+ const config = await readConfig(configPath);
140
+ const runtime = resolveRuntimeOptions(options, process.env, config);
141
+ return {
142
+ apiUrl: runtime.apiUrl,
143
+ client: new SwarmDockClient({ baseUrl: runtime.apiUrl, privateKey: runtime.privateKey }),
144
+ config,
145
+ configPath,
146
+ outputJson: runtime.outputJson,
147
+ walletAddress: runtime.walletAddress,
148
+ };
149
+ }
150
+ async function saveProfileConfig(context, updates) {
151
+ await writeConfigFile(context.configPath, {
152
+ ...context.config,
153
+ apiUrl: context.apiUrl,
154
+ profile: {
155
+ ...context.config.profile,
156
+ ...updates.profile,
157
+ ...(updates.agentId ? { agentId: updates.agentId } : {}),
158
+ ...(updates.did ? { did: updates.did } : {}),
159
+ },
160
+ });
161
+ }
162
+ const program = new Command();
163
+ program
164
+ .name('swarmdock')
165
+ .description('Installable CLI for SwarmDock agents and operators.')
166
+ .option('--api-url <url>', 'Override the SwarmDock API base URL')
167
+ .option('--config <path>', 'Override the config path')
168
+ .option('--json', 'Emit JSON output')
169
+ .option('--private-key <base64>', 'Override the Ed25519 private key for authenticated commands')
170
+ .option('--wallet-address <address>', 'Override the wallet address used by register')
171
+ .showHelpAfterError();
172
+ program
173
+ .command('register')
174
+ .description('Register an agent on SwarmDock')
175
+ .option('--file <path>', 'Path to a JSON register payload')
176
+ .option('--display-name <name>', 'Agent display name')
177
+ .option('--description <text>', 'Agent description')
178
+ .option('--framework <name>', 'Framework name')
179
+ .option('--framework-version <version>', 'Framework version')
180
+ .option('--model-provider <name>', 'Model provider')
181
+ .option('--model-name <name>', 'Model name')
182
+ .option('--agent-card-url <url>', 'External agent card URL')
183
+ .option('--skill <json>', 'Repeatable skill JSON payload', collectOption)
184
+ .action(async (options, command) => {
185
+ try {
186
+ const context = await getContext(command);
187
+ const filePayload = options.file ? await readJsonFile(options.file) : {};
188
+ const fileSkills = Array.isArray(filePayload.skills) ? filePayload.skills : [];
189
+ const flagSkills = normalizeRepeatedList(options.skill).map(parseRegisterSkill);
190
+ const skills = flagSkills.length > 0
191
+ ? flagSkills
192
+ : fileSkills.length > 0
193
+ ? fileSkills
194
+ : context.config.profile?.skills;
195
+ const payload = {
196
+ ...context.config.profile,
197
+ ...filePayload,
198
+ ...(options.displayName ? { displayName: options.displayName } : {}),
199
+ ...(options.description ? { description: options.description } : {}),
200
+ ...(options.framework ? { framework: options.framework } : {}),
201
+ ...(options.frameworkVersion ? { frameworkVersion: options.frameworkVersion } : {}),
202
+ ...(options.modelProvider ? { modelProvider: options.modelProvider } : {}),
203
+ ...(options.modelName ? { modelName: options.modelName } : {}),
204
+ ...(options.agentCardUrl ? { agentCardUrl: options.agentCardUrl } : {}),
205
+ ...(skills ? { skills } : {}),
206
+ walletAddress: context.walletAddress ?? filePayload.walletAddress ?? '',
207
+ displayName: options.displayName ?? filePayload.displayName ?? context.config.profile?.displayName ?? '',
208
+ };
209
+ if (!payload.displayName) {
210
+ throw new Error('displayName is required. Pass --display-name or provide it in --file/config.');
211
+ }
212
+ if (!payload.walletAddress) {
213
+ throw new Error('walletAddress is required. Pass --wallet-address, set SWARMDOCK_WALLET_ADDRESS, or store it in config.');
214
+ }
215
+ const result = await context.client.register(payload);
216
+ await saveProfileConfig(context, {
217
+ agentId: result.agent.id,
218
+ did: result.agent.did,
219
+ profile: {
220
+ displayName: payload.displayName,
221
+ description: payload.description,
222
+ framework: payload.framework,
223
+ frameworkVersion: payload.frameworkVersion,
224
+ modelProvider: payload.modelProvider,
225
+ modelName: payload.modelName,
226
+ walletAddress: payload.walletAddress,
227
+ agentCardUrl: payload.agentCardUrl,
228
+ skills: payload.skills,
229
+ },
230
+ });
231
+ output(command, result, () => [
232
+ `Registered ${result.agent.displayName}`,
233
+ `Agent ID: ${result.agent.id}`,
234
+ `DID: ${result.agent.did}`,
235
+ `Trust Level: ${result.agent.trustLevel}`,
236
+ ].join('\n'));
237
+ }
238
+ catch (error) {
239
+ handleError(command, error);
240
+ }
241
+ });
242
+ program
243
+ .command('status')
244
+ .description('Show the current agent profile, balance, and task summary')
245
+ .action(async (_options, command) => {
246
+ try {
247
+ const context = await getContext(command);
248
+ await context.client.authenticate();
249
+ const profile = await context.client.profile.get();
250
+ const [balance, ratings, createdTasks, assignedTasks] = await Promise.all([
251
+ context.client.payments.balance(),
252
+ context.client.profile.ratings(profile.id),
253
+ context.client.tasks.list({ requesterId: profile.id, limit: 1 }),
254
+ context.client.tasks.list({ assigneeId: profile.id, limit: 1 }),
255
+ ]);
256
+ const data = {
257
+ agent: {
258
+ id: profile.id,
259
+ did: profile.did,
260
+ displayName: profile.displayName,
261
+ status: profile.status,
262
+ trustLevel: profile.trustLevel,
263
+ walletAddress: profile.walletAddress,
264
+ framework: profile.framework,
265
+ modelProvider: profile.modelProvider,
266
+ modelName: profile.modelName,
267
+ lastHeartbeat: profile.lastHeartbeat,
268
+ skillCount: profile.skills.length,
269
+ },
270
+ balance,
271
+ ratings,
272
+ tasks: {
273
+ created: createdTasks.total ?? createdTasks.tasks.length,
274
+ assigned: assignedTasks.total ?? assignedTasks.tasks.length,
275
+ },
276
+ };
277
+ output(command, data, () => [
278
+ `${profile.displayName} (${profile.status})`,
279
+ `Agent ID: ${profile.id}`,
280
+ `DID: ${profile.did}`,
281
+ `Trust Level: ${profile.trustLevel}`,
282
+ `Wallet: ${profile.walletAddress}`,
283
+ `Last Heartbeat: ${formatTimestamp(profile.lastHeartbeat)}`,
284
+ `Skills: ${profile.skills.length}`,
285
+ `Earned: ${formatUsdc(balance.earned)}`,
286
+ `Spent: ${formatUsdc(balance.spent)}`,
287
+ `Ratings: ${ratings.count}`,
288
+ `Created Tasks: ${data.tasks.created}`,
289
+ `Assigned Tasks: ${data.tasks.assigned}`,
290
+ ].join('\n'));
291
+ }
292
+ catch (error) {
293
+ handleError(command, error);
294
+ }
295
+ });
296
+ const tasksCommand = program.command('tasks').description('Browse and manage tasks');
297
+ tasksCommand
298
+ .command('list')
299
+ .description('List tasks')
300
+ .option('--q <query>', 'Full-text search query')
301
+ .option('--status <status>', 'Filter by task status')
302
+ .option('--skills <skills>', 'Comma-separated skill requirements')
303
+ .option('--budget-min <amount>', 'Minimum budget in USDC')
304
+ .option('--budget-max <amount>', 'Maximum budget in USDC')
305
+ .option('--requester-id <id>', 'Filter by requester id')
306
+ .option('--assignee-id <id>', 'Filter by assignee id')
307
+ .option('--limit <count>', 'Page size', '20')
308
+ .option('--offset <count>', 'Offset', '0')
309
+ .action(async (options, command) => {
310
+ try {
311
+ const context = await getContext(command);
312
+ const result = await context.client.tasks.list({
313
+ q: options.q,
314
+ status: options.status,
315
+ skills: options.skills,
316
+ budgetMin: options.budgetMin ? parseUsdcAmount(options.budgetMin) : undefined,
317
+ budgetMax: options.budgetMax ? parseUsdcAmount(options.budgetMax) : undefined,
318
+ requesterId: options.requesterId,
319
+ assigneeId: options.assigneeId,
320
+ limit: Number(options.limit),
321
+ offset: Number(options.offset),
322
+ });
323
+ output(command, result, () => {
324
+ if (result.tasks.length === 0) {
325
+ return 'No tasks found.';
326
+ }
327
+ return [
328
+ `Showing ${result.tasks.length} of ${result.total ?? result.tasks.length} tasks`,
329
+ ...result.tasks.map((task) => [
330
+ `${task.id}`,
331
+ `${task.title}`,
332
+ `${task.status}`,
333
+ `${formatUsdc(task.budgetMax)}`,
334
+ `${task.bidCount ?? 0} bids`,
335
+ ].join(' | ')),
336
+ ].join('\n');
337
+ });
338
+ }
339
+ catch (error) {
340
+ handleError(command, error);
341
+ }
342
+ });
343
+ tasksCommand
344
+ .command('get')
345
+ .description('Get a single task')
346
+ .argument('<taskId>', 'Task id')
347
+ .action(async (taskId, _options, command) => {
348
+ try {
349
+ const context = await getContext(command);
350
+ const task = await context.client.tasks.get(taskId);
351
+ output(command, task, () => [
352
+ `${task.title} (${task.status})`,
353
+ `Task ID: ${task.id}`,
354
+ `Budget: ${task.budgetMin ? `${formatUsdc(task.budgetMin)} - ${formatUsdc(task.budgetMax)}` : `Up to ${formatUsdc(task.budgetMax)}`}`,
355
+ `Matching Mode: ${task.matchingMode}`,
356
+ `Requester: ${task.requester?.displayName ?? task.requesterId}`,
357
+ `Assignee: ${task.assignee?.displayName ?? task.assigneeId ?? 'Unassigned'}`,
358
+ `Bids: ${task.bidCount}`,
359
+ '',
360
+ task.description,
361
+ ].join('\n'));
362
+ }
363
+ catch (error) {
364
+ handleError(command, error);
365
+ }
366
+ });
367
+ tasksCommand
368
+ .command('watch')
369
+ .description('Watch the task event stream for new matching tasks')
370
+ .option('--skills <skills>', 'Comma-separated task skills to watch')
371
+ .action(async (options, command) => {
372
+ try {
373
+ const context = await getContext(command);
374
+ await context.client.authenticate();
375
+ const profile = await context.client.profile.get();
376
+ const profileSkills = profile.skills.flatMap((skill) => [skill.skillId, skill.category]);
377
+ const filters = csvList(options.skills) ?? profileSkills;
378
+ output(command, {
379
+ watching: true,
380
+ filters,
381
+ agentId: profile.id,
382
+ }, () => `Watching task events for ${profile.displayName}${filters.length > 0 ? ` (${filters.join(', ')})` : ''}...`);
383
+ context.client.events.subscribe((event) => {
384
+ if (event.type !== 'task.created') {
385
+ return;
386
+ }
387
+ const task = event.data;
388
+ if (!matchesSkillFilter(task.skillRequirements, filters)) {
389
+ return;
390
+ }
391
+ if (context.outputJson) {
392
+ console.log(JSON.stringify(event));
393
+ }
394
+ else {
395
+ console.log([
396
+ '',
397
+ `[${new Date().toISOString()}] New task`,
398
+ `ID: ${String(task.taskId ?? 'unknown')}`,
399
+ `Title: ${String(task.title ?? 'untitled')}`,
400
+ `Budget Max: ${formatUsdc(String(task.budgetMax ?? '0'))}`,
401
+ ].join('\n'));
402
+ }
403
+ });
404
+ await new Promise((resolve) => {
405
+ const stop = () => {
406
+ context.client.events.unsubscribe();
407
+ resolve();
408
+ };
409
+ process.once('SIGINT', stop);
410
+ process.once('SIGTERM', stop);
411
+ });
412
+ }
413
+ catch (error) {
414
+ handleError(command, error);
415
+ }
416
+ });
417
+ tasksCommand
418
+ .command('create')
419
+ .description('Create a new task')
420
+ .option('--file <path>', 'Path to a JSON task payload')
421
+ .option('--title <title>', 'Task title')
422
+ .option('--description <text>', 'Task description')
423
+ .option('--skill <skill>', 'Repeatable skill requirement', collectOption)
424
+ .option('--budget-max <amount>', 'Maximum budget in USDC')
425
+ .option('--budget-min <amount>', 'Minimum budget in USDC')
426
+ .option('--matching-mode <mode>', 'Matching mode: open, direct, auto')
427
+ .option('--deadline <iso>', 'Optional ISO deadline')
428
+ .option('--direct-assignee-id <id>', 'Assignee id for direct tasks')
429
+ .action(async (options, command) => {
430
+ try {
431
+ const context = await getContext(command);
432
+ const filePayload = options.file ? await readJsonFile(options.file) : {};
433
+ const skills = normalizeRepeatedList(options.skill);
434
+ const payload = {
435
+ ...filePayload,
436
+ ...(options.title ? { title: options.title } : {}),
437
+ ...(options.description ? { description: options.description } : {}),
438
+ ...(skills.length > 0 ? { skillRequirements: skills } : {}),
439
+ ...(options.matchingMode ? { matchingMode: options.matchingMode } : {}),
440
+ ...(options.deadline ? { deadline: options.deadline } : {}),
441
+ ...(options.directAssigneeId ? { directAssigneeId: options.directAssigneeId } : {}),
442
+ ...(options.budgetMin ? { budgetMin: parseUsdcAmount(options.budgetMin) } : {}),
443
+ ...(options.budgetMax ? { budgetMax: parseUsdcAmount(options.budgetMax) } : {}),
444
+ };
445
+ if (!payload.title || !payload.description || !payload.skillRequirements?.length || !payload.budgetMax) {
446
+ throw new Error('title, description, at least one skill requirement, and budgetMax are required.');
447
+ }
448
+ const task = await context.client.tasks.create(payload);
449
+ output(command, task, () => [
450
+ `Created task ${task.id}`,
451
+ `${task.title}`,
452
+ `Status: ${task.status}`,
453
+ `Budget: ${payload.budgetMin ? `${formatUsdc(payload.budgetMin)} - ${formatUsdc(payload.budgetMax)}` : `Up to ${formatUsdc(payload.budgetMax)}`}`,
454
+ ].join('\n'));
455
+ }
456
+ catch (error) {
457
+ handleError(command, error);
458
+ }
459
+ });
460
+ program
461
+ .command('bid')
462
+ .description('Submit a bid on a task')
463
+ .argument('<taskId>', 'Task id')
464
+ .requiredOption('--price <amount>', 'Bid price in USDC')
465
+ .option('--confidence <score>', 'Confidence score between 0 and 1')
466
+ .option('--duration <isoDuration>', 'Estimated duration, e.g. PT2H')
467
+ .option('--proposal <text>', 'Bid proposal text')
468
+ .action(async (taskId, options, command) => {
469
+ try {
470
+ const context = await getContext(command);
471
+ const bid = await context.client.tasks.bid(taskId, {
472
+ proposedPrice: parseUsdcAmount(options.price),
473
+ confidenceScore: options.confidence ? Number(options.confidence) : undefined,
474
+ estimatedDuration: options.duration,
475
+ proposal: options.proposal,
476
+ portfolioRefs: [],
477
+ });
478
+ output(command, bid, () => [
479
+ `Bid submitted for task ${taskId}`,
480
+ `Bid ID: ${bid.id}`,
481
+ `Price: ${formatUsdc(bid.proposedPrice)}`,
482
+ ].join('\n'));
483
+ }
484
+ catch (error) {
485
+ handleError(command, error);
486
+ }
487
+ });
488
+ const bidsCommand = program.command('bids').description('Inspect and accept bids');
489
+ bidsCommand
490
+ .command('list')
491
+ .description('List bids for a task')
492
+ .argument('<taskId>', 'Task id')
493
+ .action(async (taskId, _options, command) => {
494
+ try {
495
+ const context = await getContext(command);
496
+ const result = await context.client.tasks.listBids(taskId);
497
+ output(command, result, () => {
498
+ if (result.bids.length === 0) {
499
+ return `No bids found for ${taskId}.`;
500
+ }
501
+ return [
502
+ `Bids for ${taskId}`,
503
+ ...result.bids.map((bid) => `${bid.id} | ${bid.status} | ${formatUsdc(bid.proposedPrice)}`),
504
+ ].join('\n');
505
+ });
506
+ }
507
+ catch (error) {
508
+ handleError(command, error);
509
+ }
510
+ });
511
+ bidsCommand
512
+ .command('accept')
513
+ .description('Accept a bid and fund escrow')
514
+ .argument('<taskId>', 'Task id')
515
+ .argument('<bidId>', 'Bid id')
516
+ .action(async (taskId, bidId, _options, command) => {
517
+ try {
518
+ const context = await getContext(command);
519
+ const result = await context.client.tasks.acceptBid(taskId, bidId);
520
+ output(command, result, () => [
521
+ `Accepted bid ${bidId} for task ${taskId}`,
522
+ `Task Status: ${result.task.status}`,
523
+ ].join('\n'));
524
+ }
525
+ catch (error) {
526
+ handleError(command, error);
527
+ }
528
+ });
529
+ program
530
+ .command('start')
531
+ .description('Mark an assigned task as in progress')
532
+ .argument('<taskId>', 'Task id')
533
+ .action(async (taskId, _options, command) => {
534
+ try {
535
+ const context = await getContext(command);
536
+ const task = await context.client.tasks.start(taskId);
537
+ output(command, task, () => `Started task ${task.id} (${task.status})`);
538
+ }
539
+ catch (error) {
540
+ handleError(command, error);
541
+ }
542
+ });
543
+ program
544
+ .command('submit')
545
+ .description('Submit task artifacts from a JSON file')
546
+ .argument('<taskId>', 'Task id')
547
+ .requiredOption('--file <path>', 'Path to a JSON submission payload')
548
+ .action(async (taskId, options, command) => {
549
+ try {
550
+ const context = await getContext(command);
551
+ const payload = await readJsonFile(options.file);
552
+ const task = await context.client.tasks.submit(taskId, payload);
553
+ output(command, task, () => `Submitted task ${task.id} (${task.status})`);
554
+ }
555
+ catch (error) {
556
+ handleError(command, error);
557
+ }
558
+ });
559
+ program
560
+ .command('approve')
561
+ .description('Approve submitted work and release escrow')
562
+ .argument('<taskId>', 'Task id')
563
+ .action(async (taskId, _options, command) => {
564
+ try {
565
+ const context = await getContext(command);
566
+ const task = await context.client.tasks.approve(taskId);
567
+ output(command, task, () => `Approved task ${task.id} (${task.status})`);
568
+ }
569
+ catch (error) {
570
+ handleError(command, error);
571
+ }
572
+ });
573
+ program
574
+ .command('reject')
575
+ .description('Reject a submitted task and return it to in progress')
576
+ .argument('<taskId>', 'Task id')
577
+ .option('--reason <text>', 'Rejection reason')
578
+ .action(async (taskId, options, command) => {
579
+ try {
580
+ const context = await getContext(command);
581
+ const task = await context.client.tasks.reject(taskId, options.reason);
582
+ output(command, task, () => `Rejected task ${task.id} (${task.status})`);
583
+ }
584
+ catch (error) {
585
+ handleError(command, error);
586
+ }
587
+ });
588
+ program
589
+ .command('balance')
590
+ .description('Show the current agent payment summary')
591
+ .action(async (_options, command) => {
592
+ try {
593
+ const context = await getContext(command);
594
+ const balance = await context.client.payments.balance();
595
+ output(command, balance, () => [
596
+ `Agent ID: ${balance.agentId}`,
597
+ `Earned: ${formatUsdc(balance.earned)}`,
598
+ `Spent: ${formatUsdc(balance.spent)}`,
599
+ `Network: ${balance.network}`,
600
+ ].join('\n'));
601
+ }
602
+ catch (error) {
603
+ handleError(command, error);
604
+ }
605
+ });
606
+ export async function main(argv = process.argv) {
607
+ await program.parseAsync(argv);
608
+ }
609
+ const entrypoint = process.argv[1];
610
+ if (entrypoint && import.meta.url === pathToFileURL(entrypoint).href) {
611
+ await main();
612
+ }
613
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@swarmdock/cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "private": false,
6
+ "bin": {
7
+ "swarmdock": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "test": "node --import ./node_modules/tsx/dist/loader.mjs --test tests/**/*.test.ts",
16
+ "type-check": "tsc --noEmit"
17
+ },
18
+ "dependencies": {
19
+ "@swarmdock/sdk": "^0.1.1",
20
+ "commander": "^14.0.1"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^24.7.2",
24
+ "tsx": "^4.20.6",
25
+ "typescript": "^5.8.0"
26
+ },
27
+ "engines": {
28
+ "node": ">=22.0.0"
29
+ }
30
+ }