@taskhunt/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.
Files changed (44) hide show
  1. package/.turbo/turbo-build.log +9 -0
  2. package/CLAUDE.md +13 -0
  3. package/dist/api.d.ts +16 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +48 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/commands/agents.d.ts +3 -0
  8. package/dist/commands/agents.d.ts.map +1 -0
  9. package/dist/commands/agents.js +92 -0
  10. package/dist/commands/agents.js.map +1 -0
  11. package/dist/commands/auth.d.ts +3 -0
  12. package/dist/commands/auth.d.ts.map +1 -0
  13. package/dist/commands/auth.js +62 -0
  14. package/dist/commands/auth.js.map +1 -0
  15. package/dist/commands/tasks.d.ts +3 -0
  16. package/dist/commands/tasks.d.ts.map +1 -0
  17. package/dist/commands/tasks.js +285 -0
  18. package/dist/commands/tasks.js.map +1 -0
  19. package/dist/config.d.ts +13 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +41 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/format.d.ts +8 -0
  24. package/dist/format.d.ts.map +1 -0
  25. package/dist/format.js +30 -0
  26. package/dist/format.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +18 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/spinner.d.ts +2 -0
  32. package/dist/spinner.d.ts.map +1 -0
  33. package/dist/spinner.js +22 -0
  34. package/dist/spinner.js.map +1 -0
  35. package/package.json +28 -0
  36. package/src/api.ts +61 -0
  37. package/src/commands/agents.ts +129 -0
  38. package/src/commands/auth.ts +100 -0
  39. package/src/commands/tasks.ts +397 -0
  40. package/src/config.ts +52 -0
  41. package/src/format.ts +35 -0
  42. package/src/index.ts +22 -0
  43. package/src/spinner.ts +20 -0
  44. package/tsconfig.json +12 -0
@@ -0,0 +1,9 @@
1
+
2
+ > @taskhunt/cli@0.1.0 build /Users/claw/models/taskhunt/packages/cli
3
+ > tsc
4
+
5
+ src/commands/tasks.ts(116,41): error TS2339: Property 'difficulty' does not exist on type 'TaskDetail'.
6
+ src/commands/tasks.ts(118,41): error TS2339: Property 'budgetAmount' does not exist on type 'TaskDetail'.
7
+ src/commands/tasks.ts(120,16): error TS2551: Property 'assigneeId' does not exist on type 'TaskDetail'. Did you mean 'assignedTo'?
8
+ src/commands/tasks.ts(120,62): error TS2551: Property 'assigneeId' does not exist on type 'TaskDetail'. Did you mean 'assignedTo'?
9
+  ELIFECYCLE  Command failed with exit code 2.
package/CLAUDE.md ADDED
@@ -0,0 +1,13 @@
1
+ # @taskhunt/cli
2
+
3
+ TaskHunt CLI 工具,面向 Agent 和开发者的命令行接口。
4
+
5
+ ## 结构
6
+
7
+ - `src/` — CLI 源代码
8
+
9
+ ## 规范
10
+
11
+ - 默认输出 JSON 格式(Agent 友好)
12
+ - 支持 --format table/yaml 选项
13
+ - 支持 stdin pipe 输入
package/dist/api.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export declare class ApiError extends Error {
2
+ readonly code: string;
3
+ readonly details?: Record<string, unknown> | undefined;
4
+ constructor(code: string, message: string, details?: Record<string, unknown> | undefined);
5
+ }
6
+ export declare const api: {
7
+ get: <T>(path: string) => Promise<T>;
8
+ post: <T>(path: string, body?: unknown) => Promise<T>;
9
+ patch: <T>(path: string, body?: unknown) => Promise<T>;
10
+ delete: <T>(path: string) => Promise<T>;
11
+ };
12
+ export declare function sseStream(path: string): {
13
+ url: string;
14
+ headers: Record<string, string>;
15
+ };
16
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAGA,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAmCD,eAAO,MAAM,GAAG;UACR,CAAC,QAAQ,MAAM;WACd,CAAC,QAAQ,MAAM,SAAS,OAAO;YAC9B,CAAC,QAAQ,MAAM,SAAS,OAAO;aAC9B,CAAC,QAAQ,MAAM;CACzB,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAMxF"}
package/dist/api.js ADDED
@@ -0,0 +1,48 @@
1
+ import { getApiUrl, requireApiKey } from './config.js';
2
+ export class ApiError extends Error {
3
+ code;
4
+ details;
5
+ constructor(code, message, details) {
6
+ super(message);
7
+ this.code = code;
8
+ this.details = details;
9
+ this.name = 'ApiError';
10
+ }
11
+ }
12
+ async function request(method, path, body) {
13
+ const url = `${getApiUrl()}/api/v1${path}`;
14
+ const apiKey = requireApiKey();
15
+ // API keys (th_live_* / th_test_*) use x-api-key header.
16
+ // Human JWT tokens use Authorization: Bearer.
17
+ const isApiKey = apiKey.startsWith('th_live_') || apiKey.startsWith('th_test_');
18
+ const headers = isApiKey
19
+ ? { 'x-api-key': apiKey, 'Accept': 'application/json' }
20
+ : { 'Authorization': `Bearer ${apiKey}`, 'Accept': 'application/json' };
21
+ if (body !== undefined) {
22
+ headers['Content-Type'] = 'application/json';
23
+ }
24
+ const res = await fetch(url, {
25
+ method,
26
+ headers,
27
+ body: body !== undefined ? JSON.stringify(body) : undefined,
28
+ });
29
+ const json = (await res.json());
30
+ if (!json.success) {
31
+ throw new ApiError(json.error.code, json.error.message, json.error.details);
32
+ }
33
+ return json.data;
34
+ }
35
+ export const api = {
36
+ get: (path) => request('GET', path),
37
+ post: (path, body) => request('POST', path, body),
38
+ patch: (path, body) => request('PATCH', path, body),
39
+ delete: (path) => request('DELETE', path),
40
+ };
41
+ export function sseStream(path) {
42
+ const apiKey = requireApiKey();
43
+ return {
44
+ url: `${getApiUrl()}/api/v1${path}`,
45
+ headers: { 'Authorization': `Bearer ${apiKey}` },
46
+ };
47
+ }
48
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IAEA;IAHlB,YACkB,IAAY,EAC5B,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,IAAc;IAEd,MAAM,GAAG,GAAG,GAAG,SAAS,EAAE,UAAU,IAAI,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,yDAAyD;IACzD,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAChF,MAAM,OAAO,GAA2B,QAAQ;QAC9C,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE;QACvD,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,MAAM,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC1E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;IAElD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,GAAG,EAAE,CAAI,IAAY,EAAE,EAAE,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC;IACjD,IAAI,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;IACzE,KAAK,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CAAC,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;IAC3E,MAAM,EAAE,CAAI,IAAY,EAAE,EAAE,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,CAAC;CACxD,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,OAAO;QACL,GAAG,EAAE,GAAG,SAAS,EAAE,UAAU,IAAI,EAAE;QACnC,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,MAAM,EAAE,EAAE;KACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createAgentsCommand(): Command;
3
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,mBAAmB,IAAI,OAAO,CAoG7C"}
@@ -0,0 +1,92 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { readFileSync } from 'node:fs';
4
+ import { api } from '../api.js';
5
+ import { withSpinner } from '../spinner.js';
6
+ import { printJson, printSuccess } from '../format.js';
7
+ import { loadConfig, saveConfig } from '../config.js';
8
+ export function createAgentsCommand() {
9
+ const agents = new Command('agents').description('Agent management commands');
10
+ agents
11
+ .command('register')
12
+ .description('Register as an agent (returns a one-time API key)')
13
+ .requiredOption('--config <file>', 'JSON config file with agent capabilities')
14
+ .action(async (opts) => {
15
+ const raw = readFileSync(opts.config, 'utf-8');
16
+ let config;
17
+ try {
18
+ config = JSON.parse(raw);
19
+ }
20
+ catch {
21
+ console.error(chalk.red('Config file must be valid JSON.'));
22
+ process.exit(1);
23
+ }
24
+ // Endpoint: POST /auth/agent/register (public, no auth required)
25
+ const data = await withSpinner('Registering agent...', () => api.post('/auth/agent/register', config));
26
+ const participantId = data.participant.id;
27
+ const apiKey = data.apiKey;
28
+ // Save API key to config (it is only returned once!)
29
+ const existing = loadConfig();
30
+ const base = existing ?? { apiUrl: 'https://taskhunt-api.bitbull-cn.workers.dev' };
31
+ saveConfig({ ...base, apiKey, participantId, agentId: participantId });
32
+ console.log();
33
+ printSuccess(`Agent registered!`);
34
+ console.log(chalk.bold(` Participant ID : ${participantId}`));
35
+ console.log(chalk.bold(` Display Name : ${data.participant.displayName}`));
36
+ console.log(chalk.yellow(` API Key : ${apiKey}`));
37
+ console.log();
38
+ console.log(chalk.dim('API key saved to ~/.taskhunt/config.json — keep it safe, it won\'t be shown again.'));
39
+ });
40
+ agents
41
+ .command('whoami')
42
+ .description('Show current agent info')
43
+ .option('--format <format>', 'Output format (json|table)', 'table')
44
+ .action(async (opts) => {
45
+ const config = loadConfig();
46
+ const agentId = config?.agentId;
47
+ if (!agentId) {
48
+ console.error(chalk.red('No agent registered. Run `taskhunt agents register` first.'));
49
+ process.exit(1);
50
+ }
51
+ const data = await withSpinner('Fetching agent info...', () => api.get(`/agents/${agentId}`));
52
+ if (opts.format === 'json') {
53
+ printJson(data);
54
+ return;
55
+ }
56
+ const { participant, agent } = data;
57
+ console.log(chalk.bold('Agent Info'));
58
+ console.log(` Participant ID : ${participant.id}`);
59
+ console.log(` Display Name : ${participant.displayName}`);
60
+ console.log(` Status : ${participant.status}`);
61
+ console.log(` Framework : ${agent.agentFramework}`);
62
+ if (agent.modelProvider)
63
+ console.log(` Model : ${agent.modelProvider}/${agent.modelName ?? ''}`);
64
+ console.log(` Max Concurrent : ${agent.maxConcurrent}`);
65
+ console.log(` Verified : ${agent.verified}`);
66
+ });
67
+ agents
68
+ .command('update')
69
+ .description('Update agent configuration')
70
+ .requiredOption('--config <file>', 'JSON config file with updates')
71
+ .action(async (opts) => {
72
+ const cliConfig = loadConfig();
73
+ const agentId = cliConfig?.agentId;
74
+ if (!agentId) {
75
+ console.error(chalk.red('No agent registered. Run `taskhunt agents register` first.'));
76
+ process.exit(1);
77
+ }
78
+ const raw = readFileSync(opts.config, 'utf-8');
79
+ let updates;
80
+ try {
81
+ updates = JSON.parse(raw);
82
+ }
83
+ catch {
84
+ console.error(chalk.red('Config file must be valid JSON.'));
85
+ process.exit(1);
86
+ }
87
+ await withSpinner('Updating agent...', () => api.patch(`/agents/${agentId}`, updates));
88
+ printSuccess('Agent updated!');
89
+ });
90
+ return agents;
91
+ }
92
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createAuthCommand(): Command;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+CpC,wBAAgB,iBAAiB,IAAI,OAAO,CAoD3C"}
@@ -0,0 +1,62 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { saveConfig, deleteConfig } from '../config.js';
4
+ import { api } from '../api.js';
5
+ import { withSpinner } from '../spinner.js';
6
+ import { printSuccess, printJson } from '../format.js';
7
+ function extractParticipant(me) {
8
+ const p = me.participant ?? me;
9
+ return {
10
+ id: p.id ?? '',
11
+ displayName: p.displayName ?? '',
12
+ type: p.type ?? '',
13
+ status: p.status ?? '',
14
+ roles: p.roles ?? [],
15
+ email: p.email,
16
+ };
17
+ }
18
+ export function createAuthCommand() {
19
+ const auth = new Command('auth').description('Authentication commands');
20
+ auth
21
+ .command('login')
22
+ .description('Authenticate with an API key')
23
+ .requiredOption('--api-key <key>', 'API key (e.g. th_live_xxx)')
24
+ .action(async (opts) => {
25
+ const apiUrl = process.env['TASKHUNT_API_URL'] ?? 'https://api.taskhunt.ai';
26
+ saveConfig({ apiKey: opts.apiKey, apiUrl });
27
+ const raw = await withSpinner('Verifying API key...', () => api.get('/auth/me'));
28
+ const me = extractParticipant(raw);
29
+ saveConfig({ apiKey: opts.apiKey, apiUrl, participantId: me.id });
30
+ printSuccess(`Logged in as ${chalk.bold(me.displayName)} (${me.type})`);
31
+ });
32
+ auth
33
+ .command('whoami')
34
+ .description('Show current authenticated user')
35
+ .option('--format <format>', 'Output format (json|table)', 'table')
36
+ .action(async (opts) => {
37
+ const raw = await withSpinner('Fetching profile...', () => api.get('/auth/me'));
38
+ const me = extractParticipant(raw);
39
+ if (opts.format === 'json') {
40
+ printJson(me);
41
+ }
42
+ else {
43
+ console.log(chalk.bold('Participant Info'));
44
+ console.log(` ID: ${me.id}`);
45
+ console.log(` Name: ${me.displayName}`);
46
+ console.log(` Type: ${me.type}`);
47
+ console.log(` Status: ${me.status}`);
48
+ console.log(` Roles: ${me.roles.join(', ')}`);
49
+ if (me.email)
50
+ console.log(` Email: ${me.email}`);
51
+ }
52
+ });
53
+ auth
54
+ .command('logout')
55
+ .description('Clear saved credentials')
56
+ .action(() => {
57
+ deleteConfig();
58
+ printSuccess('Logged out. Config cleared.');
59
+ });
60
+ return auth;
61
+ }
62
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createTasksCommand(): Command;
3
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoDpC,wBAAgB,kBAAkB,IAAI,OAAO,CAwV5C"}
@@ -0,0 +1,285 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { readFileSync } from 'node:fs';
4
+ import { api, sseStream } from '../api.js';
5
+ import { withSpinner } from '../spinner.js';
6
+ import { printJson, printTable, printSuccess, truncate, formatDate } from '../format.js';
7
+ export function createTasksCommand() {
8
+ const tasks = new Command('tasks').description('Task management commands');
9
+ tasks
10
+ .command('list')
11
+ .description('List tasks')
12
+ .option('--status <status>', 'Filter by status')
13
+ .option('--category <category>', 'Filter by category')
14
+ .option('--min-budget <n>', 'Minimum budget', parseFloat)
15
+ .option('--format <format>', 'Output format (json|table)', 'table')
16
+ .action(async (opts) => {
17
+ const params = new URLSearchParams();
18
+ if (opts.status)
19
+ params.set('status', opts.status);
20
+ if (opts.category)
21
+ params.set('category', opts.category);
22
+ if (opts.minBudget !== undefined)
23
+ params.set('min_budget', String(opts.minBudget));
24
+ const qs = params.toString();
25
+ const rows = await withSpinner('Fetching tasks...', () => api.get(`/tasks${qs ? `?${qs}` : ''}`));
26
+ if (opts.format === 'json') {
27
+ printJson(rows);
28
+ return;
29
+ }
30
+ if (rows.length === 0) {
31
+ console.log(chalk.dim('No tasks found.'));
32
+ return;
33
+ }
34
+ printTable(['ID', 'Title', 'Status', 'Category', 'Budget'], rows.map(t => [
35
+ t.id.slice(0, 8),
36
+ truncate(t.title, 40),
37
+ t.status,
38
+ t.category,
39
+ `${t.budgetValue} ${t.budgetCurrency}`,
40
+ ]));
41
+ console.log(chalk.dim(`Showing ${rows.length} task(s).`));
42
+ });
43
+ tasks
44
+ .command('get <id>')
45
+ .description('Get task details')
46
+ .option('--format <format>', 'Output format (json|table)', 'table')
47
+ .action(async (id, opts) => {
48
+ const task = await withSpinner('Fetching task...', () => api.get(`/tasks/${id}`));
49
+ if (opts.format === 'json') {
50
+ printJson(task);
51
+ return;
52
+ }
53
+ console.log(chalk.bold(task.title));
54
+ console.log(chalk.dim('─'.repeat(60)));
55
+ console.log(` ID: ${task.id}`);
56
+ console.log(` Status: ${task.status}`);
57
+ console.log(` Category: ${task.category}`);
58
+ console.log(` Bid Mode: ${task.bidMode}`);
59
+ console.log(` Budget: ${task.budgetValue} ${task.budgetCurrency}`);
60
+ console.log(` Poster: ${task.posterId}`);
61
+ if (task.assignedTo)
62
+ console.log(` Assignee: ${task.assignedTo}`);
63
+ if (task.deadline)
64
+ console.log(` Deadline: ${formatDate(task.deadline)}`);
65
+ console.log(` Created: ${formatDate(task.createdAt)}`);
66
+ console.log(` Updated: ${formatDate(task.updatedAt)}`);
67
+ console.log();
68
+ console.log(task.description);
69
+ });
70
+ tasks
71
+ .command('search <query>')
72
+ .description('Search tasks')
73
+ .option('--format <format>', 'Output format (json|table)', 'table')
74
+ .action(async (query, opts) => {
75
+ const data = await withSpinner('Searching...', () => api.get(`/tasks?q=${encodeURIComponent(query)}`));
76
+ if (opts.format === 'json') {
77
+ printJson(data);
78
+ return;
79
+ }
80
+ if (data.length === 0) {
81
+ console.log(chalk.dim('No tasks found.'));
82
+ return;
83
+ }
84
+ printTable(['ID', 'Title', 'Status', 'Category', 'Budget'], data.map(t => [
85
+ t.id.slice(0, 8),
86
+ truncate(t.title, 40),
87
+ t.status,
88
+ t.category,
89
+ `${t.budgetValue} ${t.budgetCurrency}`,
90
+ ]));
91
+ });
92
+ tasks
93
+ .command('claim <id>')
94
+ .description('Claim an open task (instant claim)')
95
+ .action(async (id) => {
96
+ const result = await withSpinner('Claiming task...', () => api.post(`/tasks/${id}/claim`));
97
+ printSuccess(`Task claimed! Status: ${result.status}`);
98
+ });
99
+ tasks
100
+ .command('propose <id>')
101
+ .description('Submit a proposal for a task')
102
+ .requiredOption('--approach <text>', 'Proposed approach')
103
+ .requiredOption('--price <n>', 'Proposed price', parseFloat)
104
+ .requiredOption('--time <minutes>', 'Estimated time in minutes', parseInt)
105
+ .action(async (id, opts) => {
106
+ const result = await withSpinner('Submitting proposal...', () => api.post(`/tasks/${id}/proposals`, {
107
+ approach: opts.approach,
108
+ priceValue: String(opts.price),
109
+ priceCurrency: 'USD',
110
+ estimatedTime: opts.time,
111
+ }));
112
+ printSuccess(`Proposal submitted! ID: ${result.id}`);
113
+ });
114
+ tasks
115
+ .command('submit <id>')
116
+ .description('Submit work for a task')
117
+ .option('--content <text>', 'Submission content')
118
+ .option('--output <file>', 'JSON file with outputs array')
119
+ .option('--summary <text>', 'Submission summary')
120
+ .action(async (id, opts) => {
121
+ let content = opts.content;
122
+ let outputs;
123
+ // Read from stdin if no --content provided
124
+ if (!content && !opts.output && !process.stdin.isTTY) {
125
+ const chunks = [];
126
+ for await (const chunk of process.stdin) {
127
+ chunks.push(chunk);
128
+ }
129
+ content = Buffer.concat(chunks).toString('utf-8').trim();
130
+ }
131
+ if (opts.output) {
132
+ outputs = JSON.parse(readFileSync(opts.output, 'utf-8'));
133
+ }
134
+ const result = await withSpinner('Submitting work...', () => api.post(`/tasks/${id}/submissions`, {
135
+ content,
136
+ outputs,
137
+ summary: opts.summary,
138
+ }));
139
+ printSuccess(`Submission created! ID: ${result.id}, Status: ${result.status}`);
140
+ });
141
+ tasks
142
+ .command('checkpoint <id>')
143
+ .description('Create a progress checkpoint')
144
+ .requiredOption('--label <text>', 'Checkpoint label')
145
+ .action(async (id, opts) => {
146
+ const result = await withSpinner('Creating checkpoint...', () => api.post(`/tasks/${id}/checkpoint`, {
147
+ label: opts.label,
148
+ }));
149
+ printSuccess(`Checkpoint created: ${result.label}`);
150
+ });
151
+ tasks
152
+ .command('watch <id>')
153
+ .description('Watch task events in real-time (SSE)')
154
+ .action(async (id) => {
155
+ const { url, headers } = sseStream(`/events/stream?task_id=${id}`);
156
+ console.log(chalk.dim(`Watching events for task ${id}... (Ctrl+C to stop)`));
157
+ console.log();
158
+ const res = await fetch(url, { headers });
159
+ if (!res.ok || !res.body) {
160
+ console.error(chalk.red(`Failed to connect: ${res.status} ${res.statusText}`));
161
+ process.exit(1);
162
+ }
163
+ const reader = res.body.getReader();
164
+ const decoder = new TextDecoder();
165
+ let buffer = '';
166
+ while (true) {
167
+ const { done, value } = await reader.read();
168
+ if (done)
169
+ break;
170
+ buffer += decoder.decode(value, { stream: true });
171
+ const lines = buffer.split('\n');
172
+ buffer = lines.pop() ?? '';
173
+ for (const line of lines) {
174
+ if (line.startsWith('data: ')) {
175
+ const payload = line.slice(6);
176
+ try {
177
+ const event = JSON.parse(payload);
178
+ const time = new Date(event.timestamp).toLocaleTimeString();
179
+ console.log(`${chalk.dim(time)} ${chalk.bold(event.type)}`);
180
+ if (event.data) {
181
+ console.log(chalk.dim(JSON.stringify(event.data, null, 2)));
182
+ }
183
+ }
184
+ catch {
185
+ console.log(chalk.dim(payload));
186
+ }
187
+ }
188
+ }
189
+ }
190
+ });
191
+ tasks
192
+ .command('create')
193
+ .description('Create a task from a JSON spec file')
194
+ .requiredOption('--spec <file>', 'Path to JSON spec file')
195
+ .action(async (opts) => {
196
+ const spec = JSON.parse(readFileSync(opts.spec, 'utf-8'));
197
+ const result = await withSpinner('Creating task...', () => api.post('/tasks', spec));
198
+ printSuccess(`Task created! ID: ${result.id}, Status: ${result.status}`);
199
+ });
200
+ tasks
201
+ .command('publish <id>')
202
+ .description('Publish a draft task')
203
+ .action(async (id) => {
204
+ const result = await withSpinner('Publishing task...', () => api.post(`/tasks/${id}/publish`));
205
+ printSuccess(`Task published! Status: ${result.status}`);
206
+ });
207
+ tasks
208
+ .command('proposals <id>')
209
+ .description('List proposals for a task')
210
+ .option('--format <format>', 'Output format (json|table)', 'table')
211
+ .action(async (id, opts) => {
212
+ const rows = await withSpinner('Fetching proposals...', () => api.get(`/tasks/${id}/proposals`));
213
+ if (opts.format === 'json') {
214
+ printJson(rows);
215
+ return;
216
+ }
217
+ if (rows.length === 0) {
218
+ console.log(chalk.dim('No proposals yet.'));
219
+ return;
220
+ }
221
+ printTable(['ID', 'Proposer', 'Price', 'Status'], rows.map((p) => {
222
+ const proposal = p;
223
+ return [
224
+ String(proposal['id'] ?? '').slice(0, 8),
225
+ String(proposal['proposerId'] ?? '').slice(0, 8),
226
+ `${proposal['priceValue'] ?? ''} ${proposal['priceCurrency'] ?? ''}`,
227
+ String(proposal['status'] ?? ''),
228
+ ];
229
+ }));
230
+ });
231
+ tasks
232
+ .command('accept-proposal <taskId> <proposalId>')
233
+ .description('Accept a proposal (poster only)')
234
+ .action(async (taskId, proposalId) => {
235
+ const result = await withSpinner('Accepting proposal...', () => api.post(`/tasks/${taskId}/proposals/${proposalId}/accept`));
236
+ printSuccess(`Proposal accepted! Task status: ${result.status}`);
237
+ });
238
+ tasks
239
+ .command('stake <id>')
240
+ .description('Confirm stake to start task (worker, when requireStake=true)')
241
+ .action(async (id) => {
242
+ const result = await withSpinner('Confirming stake...', () => api.post(`/tasks/${id}/stake`));
243
+ printSuccess(`Stake confirmed! Task status: ${result.status}`);
244
+ });
245
+ tasks
246
+ .command('submissions <id>')
247
+ .description('List submissions for a task')
248
+ .option('--format <format>', 'Output format (json|table)', 'table')
249
+ .action(async (id, opts) => {
250
+ const rows = await withSpinner('Fetching submissions...', () => api.get(`/tasks/${id}/submissions`));
251
+ if (opts.format === 'json') {
252
+ printJson(rows);
253
+ return;
254
+ }
255
+ if (rows.length === 0) {
256
+ console.log(chalk.dim('No submissions yet.'));
257
+ return;
258
+ }
259
+ printTable(['ID', 'Attempt', 'Status', 'Created'], rows.map((s) => {
260
+ const sub = s;
261
+ return [
262
+ String(sub['id'] ?? '').slice(0, 8),
263
+ String(sub['attempt'] ?? ''),
264
+ String(sub['status'] ?? ''),
265
+ formatDate(String(sub['createdAt'] ?? '')),
266
+ ];
267
+ }));
268
+ });
269
+ tasks
270
+ .command('review <submissionId>')
271
+ .description('Review a submission (poster only)')
272
+ .requiredOption('--verdict <v>', 'APPROVED | REJECTED | REVISION_REQUESTED')
273
+ .option('--comment <text>', 'Optional review comment')
274
+ .option('--score <n>', 'Overall score 0-10', parseFloat)
275
+ .action(async (submissionId, opts) => {
276
+ const result = await withSpinner('Submitting review...', () => api.post(`/submissions/${submissionId}/review`, {
277
+ verdict: opts.verdict,
278
+ comment: opts.comment,
279
+ overallScore: opts.score,
280
+ }));
281
+ printSuccess(`Review submitted! Verdict: ${result.verdict}`);
282
+ });
283
+ return tasks;
284
+ }
285
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface CliConfig {
2
+ apiKey: string;
3
+ apiUrl: string;
4
+ participantId?: string;
5
+ agentId?: string;
6
+ }
7
+ export declare function getApiUrl(): string;
8
+ export declare function getApiKey(): string | undefined;
9
+ export declare function requireApiKey(): string;
10
+ export declare function loadConfig(): CliConfig | null;
11
+ export declare function saveConfig(config: CliConfig): void;
12
+ export declare function deleteConfig(): void;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAED,wBAAgB,UAAU,IAAI,SAAS,GAAG,IAAI,CAO7C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAKlD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAInC"}