dyson-swarm-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 (77) hide show
  1. package/dist/__tests__/help.test.d.ts +2 -0
  2. package/dist/__tests__/help.test.d.ts.map +1 -0
  3. package/dist/__tests__/help.test.js +42 -0
  4. package/dist/__tests__/help.test.js.map +1 -0
  5. package/dist/commands/__tests__/assign.test.d.ts +2 -0
  6. package/dist/commands/__tests__/assign.test.d.ts.map +1 -0
  7. package/dist/commands/__tests__/assign.test.js +47 -0
  8. package/dist/commands/__tests__/assign.test.js.map +1 -0
  9. package/dist/commands/__tests__/create.test.d.ts +2 -0
  10. package/dist/commands/__tests__/create.test.d.ts.map +1 -0
  11. package/dist/commands/__tests__/create.test.js +98 -0
  12. package/dist/commands/__tests__/create.test.js.map +1 -0
  13. package/dist/commands/__tests__/delete.test.d.ts +2 -0
  14. package/dist/commands/__tests__/delete.test.d.ts.map +1 -0
  15. package/dist/commands/__tests__/delete.test.js +46 -0
  16. package/dist/commands/__tests__/delete.test.js.map +1 -0
  17. package/dist/commands/__tests__/get.test.d.ts +2 -0
  18. package/dist/commands/__tests__/get.test.d.ts.map +1 -0
  19. package/dist/commands/__tests__/get.test.js +67 -0
  20. package/dist/commands/__tests__/get.test.js.map +1 -0
  21. package/dist/commands/__tests__/list.test.d.ts +2 -0
  22. package/dist/commands/__tests__/list.test.d.ts.map +1 -0
  23. package/dist/commands/__tests__/list.test.js +74 -0
  24. package/dist/commands/__tests__/list.test.js.map +1 -0
  25. package/dist/commands/__tests__/status.test.d.ts +2 -0
  26. package/dist/commands/__tests__/status.test.d.ts.map +1 -0
  27. package/dist/commands/__tests__/status.test.js +71 -0
  28. package/dist/commands/__tests__/status.test.js.map +1 -0
  29. package/dist/commands/__tests__/unassign.test.d.ts +2 -0
  30. package/dist/commands/__tests__/unassign.test.d.ts.map +1 -0
  31. package/dist/commands/__tests__/unassign.test.js +47 -0
  32. package/dist/commands/__tests__/unassign.test.js.map +1 -0
  33. package/dist/commands/__tests__/update.test.d.ts +2 -0
  34. package/dist/commands/__tests__/update.test.d.ts.map +1 -0
  35. package/dist/commands/__tests__/update.test.js +88 -0
  36. package/dist/commands/__tests__/update.test.js.map +1 -0
  37. package/dist/commands/assign.d.ts +3 -0
  38. package/dist/commands/assign.d.ts.map +1 -0
  39. package/dist/commands/assign.js +26 -0
  40. package/dist/commands/assign.js.map +1 -0
  41. package/dist/commands/create.d.ts +3 -0
  42. package/dist/commands/create.d.ts.map +1 -0
  43. package/dist/commands/create.js +38 -0
  44. package/dist/commands/create.js.map +1 -0
  45. package/dist/commands/delete.d.ts +3 -0
  46. package/dist/commands/delete.d.ts.map +1 -0
  47. package/dist/commands/delete.js +29 -0
  48. package/dist/commands/delete.js.map +1 -0
  49. package/dist/commands/get.d.ts +3 -0
  50. package/dist/commands/get.d.ts.map +1 -0
  51. package/dist/commands/get.js +39 -0
  52. package/dist/commands/get.js.map +1 -0
  53. package/dist/commands/list.d.ts +3 -0
  54. package/dist/commands/list.d.ts.map +1 -0
  55. package/dist/commands/list.js +51 -0
  56. package/dist/commands/list.js.map +1 -0
  57. package/dist/commands/status.d.ts +3 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +29 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/unassign.d.ts +3 -0
  62. package/dist/commands/unassign.d.ts.map +1 -0
  63. package/dist/commands/unassign.js +25 -0
  64. package/dist/commands/unassign.js.map +1 -0
  65. package/dist/commands/update.d.ts +3 -0
  66. package/dist/commands/update.d.ts.map +1 -0
  67. package/dist/commands/update.js +42 -0
  68. package/dist/commands/update.js.map +1 -0
  69. package/dist/help.d.ts +2 -0
  70. package/dist/help.d.ts.map +1 -0
  71. package/dist/help.js +38 -0
  72. package/dist/help.js.map +1 -0
  73. package/dist/index.d.ts +3 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +31 -0
  76. package/dist/index.js.map +1 -0
  77. package/package.json +40 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=help.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/help.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Command } from '@cliffy/command';
3
+ import { generateHelp } from '../help.js';
4
+ describe('generateHelp', () => {
5
+ it('should generate help text', () => {
6
+ const cmd = new Command()
7
+ .name('test')
8
+ .description('Test CLI')
9
+ .command('create', new Command()
10
+ .description('Create a task')
11
+ .arguments('<title>')
12
+ .argument('[description]', 'Task description'))
13
+ .command('list', new Command()
14
+ .description('List tasks')
15
+ .option('-s, --status <status>', 'Filter by status'));
16
+ const helpText = generateHelp(cmd);
17
+ const expected = `Usage: test [options] [command]
18
+
19
+ Test CLI
20
+
21
+ Commands:
22
+ create <title> [description] Create a task
23
+ <title> (Required)
24
+ [description] (Optional) Task description
25
+
26
+ list List tasks
27
+ -s, --status Filter by status `;
28
+ expect(helpText).toBe(expected);
29
+ });
30
+ it('should handle no subcommands', () => {
31
+ const cmd = new Command()
32
+ .name('test')
33
+ .description('Test CLI with no commands')
34
+ .option('-v, --verbose', 'Enable verbose output');
35
+ const helpText = generateHelp(cmd);
36
+ const expected = `Usage: test [options] [command]
37
+
38
+ Test CLI with no commands`;
39
+ expect(helpText).toBe(expected);
40
+ });
41
+ });
42
+ //# sourceMappingURL=help.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.test.js","sourceRoot":"","sources":["../../src/__tests__/help.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;aACtB,IAAI,CAAC,MAAM,CAAC;aACZ,WAAW,CAAC,UAAU,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,IAAI,OAAO,EAAE;aAC7B,WAAW,CAAC,eAAe,CAAC;aAC5B,SAAS,CAAC,SAAS,CAAC;aACpB,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAC/C;aACA,OAAO,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE;aAC3B,WAAW,CAAC,YAAY,CAAC;aACzB,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CACrD,CAAC;QAEJ,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG;;;;;;;;;;2DAUsC,CAAC;QAExD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;aACtB,IAAI,CAAC,MAAM,CAAC;aACZ,WAAW,CAAC,2BAA2B,CAAC;aACxC,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG;;0BAEK,CAAC;QAEvB,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=assign.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assign.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/assign.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { assignAction } from '../assign.js';
3
+ // Mock the TaskManager
4
+ const mockAssignTask = vi.fn();
5
+ vi.mock("dyson-swarm", () => ({
6
+ TaskManager: vi.fn().mockImplementation(() => ({
7
+ assignTask: mockAssignTask,
8
+ })),
9
+ }));
10
+ // Mock console
11
+ const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
12
+ const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Mock process.exit
14
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ describe('assign command', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ it('should assign task successfully', async () => {
22
+ const mockTask = {
23
+ id: 'task-1',
24
+ frontmatter: { title: 'Test Task', assignee: 'john.doe' },
25
+ status: 'in-progress',
26
+ };
27
+ mockAssignTask.mockResolvedValue(mockTask);
28
+ await assignAction('task-1', 'john.doe');
29
+ expect(mockAssignTask).toHaveBeenCalledWith('task-1', 'john.doe');
30
+ expect(mockConsoleLog).toHaveBeenCalledWith('Assigned task task-1 to: john.doe');
31
+ expect(mockConsoleLog).toHaveBeenCalledWith('Title: Test Task');
32
+ expect(mockConsoleLog).toHaveBeenCalledWith('Status: in-progress');
33
+ });
34
+ it('should handle task not found', async () => {
35
+ mockAssignTask.mockResolvedValue(null);
36
+ await expect(assignAction('task-1', 'john.doe')).rejects.toThrow('process.exit called');
37
+ expect(mockConsoleError).toHaveBeenCalledWith('Task not found: task-1');
38
+ expect(mockExit).toHaveBeenCalledWith(1);
39
+ });
40
+ it('should handle errors', async () => {
41
+ mockAssignTask.mockRejectedValue(new Error('Database error'));
42
+ await expect(assignAction('task-1', 'john.doe')).rejects.toThrow('process.exit called');
43
+ expect(mockConsoleError).toHaveBeenCalledWith('Failed to assign task:', 'Database error');
44
+ expect(mockExit).toHaveBeenCalledWith(1);
45
+ });
46
+ });
47
+ //# sourceMappingURL=assign.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assign.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/assign.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/create.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { createAction } from '../create.js';
3
+ // Mock the TaskManager
4
+ const mockCreateTask = vi.fn();
5
+ vi.mock("dyson-swarm", () => ({
6
+ TaskManager: vi.fn().mockImplementation(() => ({
7
+ createTask: mockCreateTask,
8
+ })),
9
+ }));
10
+ // Mock console
11
+ const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
12
+ const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Mock process.exit
14
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ describe('create command', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ it('should create a task successfully', async () => {
22
+ const mockTask = {
23
+ id: 'test-task-id',
24
+ frontmatter: { title: 'Test Task' },
25
+ status: 'open',
26
+ subtasks: [],
27
+ };
28
+ mockCreateTask.mockResolvedValue(mockTask);
29
+ await createAction({
30
+ title: 'Test Task',
31
+ description: 'Test Description',
32
+ });
33
+ expect(mockCreateTask).toHaveBeenCalledWith({
34
+ title: 'Test Task',
35
+ description: 'Test Description',
36
+ assignee: undefined,
37
+ subtasks: undefined,
38
+ });
39
+ expect(mockConsoleLog).toHaveBeenCalledWith('Created task: test-task-id');
40
+ expect(mockConsoleLog).toHaveBeenCalledWith('Title: Test Task');
41
+ expect(mockConsoleLog).toHaveBeenCalledWith('Status: open');
42
+ });
43
+ it('should create a task with assignee', async () => {
44
+ const mockTask = {
45
+ id: 'test-task-id',
46
+ frontmatter: { title: 'Test Task', assignee: 'john.doe' },
47
+ status: 'in-progress',
48
+ subtasks: [],
49
+ };
50
+ mockCreateTask.mockResolvedValue(mockTask);
51
+ await createAction({
52
+ title: 'Test Task',
53
+ description: 'Test Description',
54
+ assignee: 'john.doe',
55
+ });
56
+ expect(mockCreateTask).toHaveBeenCalledWith({
57
+ title: 'Test Task',
58
+ description: 'Test Description',
59
+ assignee: 'john.doe',
60
+ subtasks: undefined,
61
+ });
62
+ expect(mockConsoleLog).toHaveBeenCalledWith('Assignee: john.doe');
63
+ });
64
+ it('should create a task with subtasks', async () => {
65
+ const mockTask = {
66
+ id: 'test-task-id',
67
+ frontmatter: { title: 'Test Task' },
68
+ status: 'open',
69
+ subtasks: [{ frontmatter: { title: 'Subtask 1' } }, { frontmatter: { title: 'Subtask 2' } }],
70
+ };
71
+ mockCreateTask.mockResolvedValue(mockTask);
72
+ await createAction({
73
+ title: 'Test Task',
74
+ description: 'Test Description',
75
+ subtasks: ['Subtask 1', 'Subtask 2'],
76
+ });
77
+ expect(mockCreateTask).toHaveBeenCalledWith({
78
+ title: 'Test Task',
79
+ description: 'Test Description',
80
+ assignee: undefined,
81
+ subtasks: [
82
+ { title: 'Subtask 1', description: '' },
83
+ { title: 'Subtask 2', description: '' },
84
+ ],
85
+ });
86
+ expect(mockConsoleLog).toHaveBeenCalledWith('Subtasks: 2');
87
+ });
88
+ it('should handle errors', async () => {
89
+ mockCreateTask.mockRejectedValue(new Error('Database error'));
90
+ await expect(createAction({
91
+ title: 'Test Task',
92
+ description: 'Test Description',
93
+ })).rejects.toThrow('process.exit called');
94
+ expect(mockConsoleError).toHaveBeenCalledWith('Failed to create task:', 'Database error');
95
+ expect(mockExit).toHaveBeenCalledWith(1);
96
+ });
97
+ });
98
+ //# sourceMappingURL=create.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/create.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=delete.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/delete.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { deleteAction } from '../delete.js';
3
+ // Mock the TaskManager
4
+ const mockDeleteTask = vi.fn();
5
+ vi.mock("dyson-swarm", () => ({
6
+ TaskManager: vi.fn().mockImplementation(() => ({
7
+ deleteTask: mockDeleteTask,
8
+ })),
9
+ }));
10
+ // Mock console
11
+ const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
12
+ const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Mock process.exit
14
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ describe('delete command', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ it('should delete task with force flag', async () => {
22
+ mockDeleteTask.mockResolvedValue(true);
23
+ await deleteAction('task-1', { force: true });
24
+ expect(mockDeleteTask).toHaveBeenCalledWith('task-1');
25
+ expect(mockConsoleLog).toHaveBeenCalledWith('Deleted task: task-1');
26
+ });
27
+ it('should require force flag', async () => {
28
+ await expect(deleteAction('task-1', { force: false })).rejects.toThrow('process.exit called');
29
+ expect(mockConsoleLog).toHaveBeenCalledWith('Are you sure you want to delete task task-1?');
30
+ expect(mockConsoleLog).toHaveBeenCalledWith('Use --force to skip this confirmation.');
31
+ expect(mockExit).toHaveBeenCalledWith(1);
32
+ });
33
+ it('should handle task not found', async () => {
34
+ mockDeleteTask.mockResolvedValue(false);
35
+ await expect(deleteAction('task-1', { force: true })).rejects.toThrow('process.exit called');
36
+ expect(mockConsoleError).toHaveBeenCalledWith('Task not found: task-1');
37
+ expect(mockExit).toHaveBeenCalledWith(1);
38
+ });
39
+ it('should handle errors', async () => {
40
+ mockDeleteTask.mockRejectedValue(new Error('Database error'));
41
+ await expect(deleteAction('task-1', { force: true })).rejects.toThrow('process.exit called');
42
+ expect(mockConsoleError).toHaveBeenCalledWith('Failed to delete task:', 'Database error');
43
+ expect(mockExit).toHaveBeenCalledWith(1);
44
+ });
45
+ });
46
+ //# sourceMappingURL=delete.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/delete.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=get.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/get.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { getAction } from '../get.js';
3
+ // Mock the TaskManager
4
+ const mockGetTask = vi.fn();
5
+ vi.mock("dyson-swarm", () => ({
6
+ TaskManager: vi.fn().mockImplementation(() => ({
7
+ getTask: mockGetTask,
8
+ })),
9
+ }));
10
+ // Mock console
11
+ const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
12
+ const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Mock process.exit
14
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ describe('get command', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ it('should get a task successfully', async () => {
22
+ const mockTask = {
23
+ id: 'task-1',
24
+ frontmatter: { title: 'Test Task', assignee: 'john.doe' },
25
+ status: 'in-progress',
26
+ description: 'Task description',
27
+ subtasks: [
28
+ { frontmatter: { title: 'Subtask 1' }, status: 'open', description: 'Subtask desc' },
29
+ ],
30
+ };
31
+ mockGetTask.mockResolvedValue(mockTask);
32
+ await getAction('task-1');
33
+ expect(mockGetTask).toHaveBeenCalledWith('task-1');
34
+ expect(mockConsoleLog).toHaveBeenCalledWith('ID: task-1');
35
+ expect(mockConsoleLog).toHaveBeenCalledWith('Title: Test Task');
36
+ expect(mockConsoleLog).toHaveBeenCalledWith('Status: in-progress');
37
+ expect(mockConsoleLog).toHaveBeenCalledWith('Assignee: john.doe');
38
+ expect(mockConsoleLog).toHaveBeenCalledWith('\nDescription:');
39
+ expect(mockConsoleLog).toHaveBeenCalledWith('Task description');
40
+ expect(mockConsoleLog).toHaveBeenCalledWith('\nSubtasks:');
41
+ });
42
+ it('should handle task without subtasks', async () => {
43
+ const mockTask = {
44
+ id: 'task-1',
45
+ frontmatter: { title: 'Simple Task' },
46
+ status: 'open',
47
+ description: 'Simple description',
48
+ };
49
+ mockGetTask.mockResolvedValue(mockTask);
50
+ await getAction('task-1');
51
+ expect(mockConsoleLog).toHaveBeenCalledWith('ID: task-1');
52
+ expect(mockConsoleLog).toHaveBeenCalledWith('Title: Simple Task');
53
+ });
54
+ it('should handle task not found', async () => {
55
+ mockGetTask.mockResolvedValue(null);
56
+ await expect(getAction('non-existent')).rejects.toThrow('process.exit called');
57
+ expect(mockConsoleError).toHaveBeenCalledWith('Task not found: non-existent');
58
+ expect(mockExit).toHaveBeenCalledWith(1);
59
+ });
60
+ it('should handle errors', async () => {
61
+ mockGetTask.mockRejectedValue(new Error('Database error'));
62
+ await expect(getAction('task-1')).rejects.toThrow('process.exit called');
63
+ expect(mockConsoleError).toHaveBeenCalledWith('Failed to get task:', 'Database error');
64
+ expect(mockExit).toHaveBeenCalledWith(1);
65
+ });
66
+ });
67
+ //# sourceMappingURL=get.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/get.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/list.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { listAction } from '../list.js';
3
+ // Mock the TaskManager
4
+ const mockListTasks = vi.fn();
5
+ vi.mock("dyson-swarm", () => ({
6
+ TaskManager: vi.fn().mockImplementation(() => ({
7
+ listTasks: mockListTasks,
8
+ })),
9
+ }));
10
+ // Mock console
11
+ const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
12
+ const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Mock process.exit
14
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ describe('list command', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ it('should list all tasks', async () => {
22
+ const mockTasks = [
23
+ { id: 'task-1', frontmatter: { title: 'Task 1' }, status: 'open' },
24
+ { id: 'task-2', frontmatter: { title: 'Task 2', assignee: 'john.doe' }, status: 'in-progress' },
25
+ ];
26
+ mockListTasks.mockResolvedValue(mockTasks);
27
+ await listAction({});
28
+ expect(mockListTasks).toHaveBeenCalledWith({});
29
+ expect(mockConsoleLog).toHaveBeenCalledWith('Found 2 task(s):\n');
30
+ expect(mockConsoleLog).toHaveBeenCalledWith('ID: task-1');
31
+ expect(mockConsoleLog).toHaveBeenCalledWith('ID: task-2');
32
+ });
33
+ it('should filter by status', async () => {
34
+ const mockTasks = [
35
+ { id: 'task-1', frontmatter: { title: 'Task 1' }, status: 'open' },
36
+ ];
37
+ mockListTasks.mockResolvedValue(mockTasks);
38
+ await listAction({ status: 'open' });
39
+ expect(mockListTasks).toHaveBeenCalledWith({ status: 'open' });
40
+ });
41
+ it('should filter by assignee', async () => {
42
+ const mockTasks = [
43
+ { id: 'task-1', frontmatter: { title: 'Task 1', assignee: 'john.doe' }, status: 'in-progress' },
44
+ ];
45
+ mockListTasks.mockResolvedValue(mockTasks);
46
+ await listAction({ assignee: 'john.doe' });
47
+ expect(mockListTasks).toHaveBeenCalledWith({ assignee: 'john.doe' });
48
+ });
49
+ it('should filter by hasSubtasks', async () => {
50
+ const mockTasks = [
51
+ { id: 'task-1', frontmatter: { title: 'Task 1' }, status: 'open', subtasks: [{ id: 'sub-1' }] },
52
+ ];
53
+ mockListTasks.mockResolvedValue(mockTasks);
54
+ await listAction({ hasSubtasks: true });
55
+ expect(mockListTasks).toHaveBeenCalledWith({ hasSubtasks: true });
56
+ });
57
+ it('should handle invalid status', async () => {
58
+ await expect(listAction({ status: 'invalid' })).rejects.toThrow('process.exit called');
59
+ expect(mockConsoleError).toHaveBeenCalledWith('Invalid status. Must be one of: open, in-progress, closed');
60
+ expect(mockExit).toHaveBeenCalledWith(1);
61
+ });
62
+ it('should show message when no tasks found', async () => {
63
+ mockListTasks.mockResolvedValue([]);
64
+ await listAction({});
65
+ expect(mockConsoleLog).toHaveBeenCalledWith('No tasks found.');
66
+ });
67
+ it('should handle errors', async () => {
68
+ mockListTasks.mockRejectedValue(new Error('Database error'));
69
+ await expect(listAction({})).rejects.toThrow('process.exit called');
70
+ expect(mockConsoleError).toHaveBeenCalledWith('Failed to list tasks:', 'Database error');
71
+ expect(mockExit).toHaveBeenCalledWith(1);
72
+ });
73
+ });
74
+ //# sourceMappingURL=list.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/list.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/status.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { statusAction } from '../status.js';
3
+ // Mock the TaskManager
4
+ const mockChangeTaskStatus = vi.fn();
5
+ vi.mock("dyson-swarm", () => ({
6
+ TaskManager: vi.fn().mockImplementation(() => ({
7
+ changeTaskStatus: mockChangeTaskStatus,
8
+ })),
9
+ }));
10
+ // Mock console
11
+ const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
12
+ const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Mock process.exit
14
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ describe('status command', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ it('should change status to closed', async () => {
22
+ const mockTask = {
23
+ id: 'task-1',
24
+ frontmatter: { title: 'Test Task' },
25
+ status: 'closed',
26
+ };
27
+ mockChangeTaskStatus.mockResolvedValue(mockTask);
28
+ await statusAction('task-1', 'closed');
29
+ expect(mockChangeTaskStatus).toHaveBeenCalledWith('task-1', 'closed');
30
+ expect(mockConsoleLog).toHaveBeenCalledWith('Changed status of task task-1 to: closed');
31
+ expect(mockConsoleLog).toHaveBeenCalledWith('Title: Test Task');
32
+ });
33
+ it('should change status to in-progress', async () => {
34
+ const mockTask = {
35
+ id: 'task-1',
36
+ frontmatter: { title: 'Test Task' },
37
+ status: 'in-progress',
38
+ };
39
+ mockChangeTaskStatus.mockResolvedValue(mockTask);
40
+ await statusAction('task-1', 'in-progress');
41
+ expect(mockChangeTaskStatus).toHaveBeenCalledWith('task-1', 'in-progress');
42
+ });
43
+ it('should change status to open', async () => {
44
+ const mockTask = {
45
+ id: 'task-1',
46
+ frontmatter: { title: 'Test Task' },
47
+ status: 'open',
48
+ };
49
+ mockChangeTaskStatus.mockResolvedValue(mockTask);
50
+ await statusAction('task-1', 'open');
51
+ expect(mockChangeTaskStatus).toHaveBeenCalledWith('task-1', 'open');
52
+ });
53
+ it('should handle invalid status', async () => {
54
+ await expect(statusAction('task-1', 'invalid')).rejects.toThrow('process.exit called');
55
+ expect(mockConsoleError).toHaveBeenCalledWith('Invalid status. Must be one of: open, in-progress, closed');
56
+ expect(mockExit).toHaveBeenCalledWith(1);
57
+ });
58
+ it('should handle task not found', async () => {
59
+ mockChangeTaskStatus.mockResolvedValue(null);
60
+ await expect(statusAction('task-1', 'closed')).rejects.toThrow('process.exit called');
61
+ expect(mockConsoleError).toHaveBeenCalledWith('Task not found: task-1');
62
+ expect(mockExit).toHaveBeenCalledWith(1);
63
+ });
64
+ it('should handle errors', async () => {
65
+ mockChangeTaskStatus.mockRejectedValue(new Error('Database error'));
66
+ await expect(statusAction('task-1', 'closed')).rejects.toThrow('process.exit called');
67
+ expect(mockConsoleError).toHaveBeenCalledWith('Failed to change task status:', 'Database error');
68
+ expect(mockExit).toHaveBeenCalledWith(1);
69
+ });
70
+ });
71
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/status.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=unassign.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unassign.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/unassign.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { unassignAction } from '../unassign.js';
3
+ // Mock the TaskManager
4
+ const mockUnassignTask = vi.fn();
5
+ vi.mock("dyson-swarm", () => ({
6
+ TaskManager: vi.fn().mockImplementation(() => ({
7
+ unassignTask: mockUnassignTask,
8
+ })),
9
+ }));
10
+ // Mock console
11
+ const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => { });
12
+ const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Mock process.exit
14
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ describe('unassign command', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ it('should unassign task successfully', async () => {
22
+ const mockTask = {
23
+ id: 'task-1',
24
+ frontmatter: { title: 'Test Task' },
25
+ status: 'open',
26
+ };
27
+ mockUnassignTask.mockResolvedValue(mockTask);
28
+ await unassignAction('task-1');
29
+ expect(mockUnassignTask).toHaveBeenCalledWith('task-1');
30
+ expect(mockConsoleLog).toHaveBeenCalledWith('Unassigned task: task-1');
31
+ expect(mockConsoleLog).toHaveBeenCalledWith('Title: Test Task');
32
+ expect(mockConsoleLog).toHaveBeenCalledWith('Status: open');
33
+ });
34
+ it('should handle task not found', async () => {
35
+ mockUnassignTask.mockResolvedValue(null);
36
+ await expect(unassignAction('task-1')).rejects.toThrow('process.exit called');
37
+ expect(mockConsoleError).toHaveBeenCalledWith('Task not found: task-1');
38
+ expect(mockExit).toHaveBeenCalledWith(1);
39
+ });
40
+ it('should handle errors', async () => {
41
+ mockUnassignTask.mockRejectedValue(new Error('Database error'));
42
+ await expect(unassignAction('task-1')).rejects.toThrow('process.exit called');
43
+ expect(mockConsoleError).toHaveBeenCalledWith('Failed to unassign task:', 'Database error');
44
+ expect(mockExit).toHaveBeenCalledWith(1);
45
+ });
46
+ });
47
+ //# sourceMappingURL=unassign.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unassign.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/unassign.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=update.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/update.test.ts"],"names":[],"mappings":""}