taskin 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/commands/commands.types.d.ts +13 -0
- package/dist/commands/commands.types.js +6 -0
- package/dist/commands/commands.types.js.map +1 -0
- package/dist/commands/define-command/define-command.d.ts +6 -0
- package/dist/commands/define-command/define-command.js +27 -0
- package/dist/commands/define-command/define-command.js.map +1 -0
- package/dist/commands/define-command/define-command.test.d.ts +4 -0
- package/dist/commands/define-command/define-command.test.js +125 -0
- package/dist/commands/define-command/define-command.test.js.map +1 -0
- package/dist/commands/define-command/define-command.types.d.ts +49 -0
- package/dist/commands/define-command/define-command.types.js +5 -0
- package/dist/commands/define-command/define-command.types.js.map +1 -0
- package/dist/commands/define-command/index.d.ts +5 -0
- package/dist/commands/define-command/index.js +6 -0
- package/dist/commands/define-command/index.js.map +1 -0
- package/dist/commands/finish.d.ts +4 -0
- package/dist/commands/finish.js +69 -0
- package/dist/commands/finish.js.map +1 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +192 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +4 -0
- package/dist/commands/lint.js +31 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.js +132 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/pause.d.ts +4 -0
- package/dist/commands/pause.js +69 -0
- package/dist/commands/pause.js.map +1 -0
- package/dist/commands/start.d.ts +4 -0
- package/dist/commands/start.js +70 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/colors.d.ts +26 -0
- package/dist/lib/colors.js +42 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.d.ts +36 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.js +219 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.mock.d.ts +81 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.mock.js +152 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.mock.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.test.d.ts +4 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.test.js +146 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.test.js.map +1 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.types.d.ts +52 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.types.js +6 -0
- package/dist/lib/file-system-task-linter/file-system-task-linter.types.js.map +1 -0
- package/dist/lib/file-system-task-linter/index.d.ts +6 -0
- package/dist/lib/file-system-task-linter/index.js +7 -0
- package/dist/lib/file-system-task-linter/index.js.map +1 -0
- package/dist/lib/help.d.ts +4 -0
- package/dist/lib/help.js +104 -0
- package/dist/lib/help.js.map +1 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.js +7 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/provider-installer/index.d.ts +5 -0
- package/dist/lib/provider-installer/index.js +6 -0
- package/dist/lib/provider-installer/index.js.map +1 -0
- package/dist/lib/provider-installer/provider-installer.d.ts +28 -0
- package/dist/lib/provider-installer/provider-installer.js +86 -0
- package/dist/lib/provider-installer/provider-installer.js.map +1 -0
- package/dist/lib/provider-installer/provider-installer.types.d.ts +4 -0
- package/dist/lib/provider-installer/provider-installer.types.js +5 -0
- package/dist/lib/provider-installer/provider-installer.types.js.map +1 -0
- package/dist/lib/provider-installer.d.ts +27 -0
- package/dist/lib/provider-installer.js +86 -0
- package/dist/lib/provider-installer.js.map +1 -0
- package/dist/lib/provider-registry/index.d.ts +5 -0
- package/dist/lib/provider-registry/index.js +6 -0
- package/dist/lib/provider-registry/index.js.map +1 -0
- package/dist/lib/provider-registry/provider-registry.d.ts +9 -0
- package/dist/lib/provider-registry/provider-registry.js +111 -0
- package/dist/lib/provider-registry/provider-registry.js.map +1 -0
- package/dist/lib/provider-registry/provider-registry.types.d.ts +5 -0
- package/dist/lib/provider-registry/provider-registry.types.js +6 -0
- package/dist/lib/provider-registry/provider-registry.types.js.map +1 -0
- package/dist/lib/provider-registry.d.ts +26 -0
- package/dist/lib/provider-registry.js +111 -0
- package/dist/lib/provider-registry.js.map +1 -0
- package/dist/lib/task-linter/index.d.ts +5 -0
- package/dist/lib/task-linter/index.js +6 -0
- package/dist/lib/task-linter/index.js.map +1 -0
- package/dist/lib/task-linter/task-linter.d.ts +36 -0
- package/dist/lib/task-linter/task-linter.js +219 -0
- package/dist/lib/task-linter/task-linter.js.map +1 -0
- package/dist/lib/task-linter/task-linter.types.d.ts +52 -0
- package/dist/lib/task-linter/task-linter.types.js +6 -0
- package/dist/lib/task-linter/task-linter.types.js.map +1 -0
- package/dist/lib/task-linter.d.ts +29 -0
- package/dist/lib/task-linter.js +215 -0
- package/dist/lib/task-linter.js.map +1 -0
- package/dist/lib/task-linter.types.d.ts +38 -0
- package/dist/lib/task-linter.types.js +5 -0
- package/dist/lib/task-linter.types.js.map +1 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.js +29 -0
- package/dist/main.js.map +1 -0
- package/dist/taskin.d.ts +33 -0
- package/dist/taskin.js +101 -0
- package/dist/taskin.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileSystemTaskLinter tests
|
|
3
|
+
*/
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { FileSystemTaskLinter } from './file-system-task-linter.js';
|
|
6
|
+
describe('FileSystemTaskLinter', () => {
|
|
7
|
+
let linter;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
linter = new FileSystemTaskLinter();
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
describe('validateMetadata', () => {
|
|
15
|
+
it('should return no errors for valid metadata', () => {
|
|
16
|
+
const metadata = {
|
|
17
|
+
assignee: 'john@example.com',
|
|
18
|
+
status: 'pending',
|
|
19
|
+
type: 'feat',
|
|
20
|
+
};
|
|
21
|
+
const errors = linter.validateMetadata(metadata, 'task-001.md');
|
|
22
|
+
expect(errors).toHaveLength(0);
|
|
23
|
+
});
|
|
24
|
+
it('should return error for invalid status', () => {
|
|
25
|
+
const metadata = {
|
|
26
|
+
assignee: 'john@example.com',
|
|
27
|
+
status: 'invalid-status',
|
|
28
|
+
type: 'feat', // Valid type to isolate the status error
|
|
29
|
+
};
|
|
30
|
+
const errors = linter.validateMetadata(metadata, 'task-001.md');
|
|
31
|
+
expect(errors).toHaveLength(1);
|
|
32
|
+
expect(errors[0].message).toContain('Invalid status');
|
|
33
|
+
expect(errors[0].severity).toBe('error');
|
|
34
|
+
expect(errors[0].file).toBe('task-001.md');
|
|
35
|
+
});
|
|
36
|
+
it('should return error for invalid type', () => {
|
|
37
|
+
const metadata = {
|
|
38
|
+
assignee: 'john@example.com',
|
|
39
|
+
status: 'pending', // Valid status to isolate the type error
|
|
40
|
+
type: 'invalid-type',
|
|
41
|
+
};
|
|
42
|
+
const errors = linter.validateMetadata(metadata, 'task-001.md');
|
|
43
|
+
expect(errors).toHaveLength(1);
|
|
44
|
+
expect(errors[0].message).toContain('Invalid type');
|
|
45
|
+
expect(errors[0].severity).toBe('error');
|
|
46
|
+
});
|
|
47
|
+
it('should return multiple errors for multiple invalid fields', () => {
|
|
48
|
+
const metadata = {
|
|
49
|
+
status: 'invalid-status',
|
|
50
|
+
type: 'invalid-type',
|
|
51
|
+
// Missing assignee - will generate warning
|
|
52
|
+
};
|
|
53
|
+
const errors = linter.validateMetadata(metadata, 'task-001.md');
|
|
54
|
+
expect(errors).toHaveLength(3); // 2 errors + 1 warning
|
|
55
|
+
expect(errors.filter((e) => e.severity === 'error')).toHaveLength(2);
|
|
56
|
+
expect(errors.filter((e) => e.severity === 'warning')).toHaveLength(1);
|
|
57
|
+
});
|
|
58
|
+
it('should return warning for missing assignee', () => {
|
|
59
|
+
const metadata = {
|
|
60
|
+
status: 'pending',
|
|
61
|
+
type: 'feat',
|
|
62
|
+
// Missing assignee
|
|
63
|
+
};
|
|
64
|
+
const errors = linter.validateMetadata(metadata, 'task-001.md');
|
|
65
|
+
expect(errors).toHaveLength(1);
|
|
66
|
+
expect(errors[0].message).toContain('Assignee');
|
|
67
|
+
expect(errors[0].severity).toBe('warning');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('lintFile', () => {
|
|
71
|
+
it('should validate a well-formed task file', async () => {
|
|
72
|
+
// Test will be implemented when we have file mocking utilities
|
|
73
|
+
expect(true).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
it('should detect missing required metadata', async () => {
|
|
76
|
+
// Test will be implemented when we have file mocking utilities
|
|
77
|
+
expect(true).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('should validate task filename format', async () => {
|
|
80
|
+
// Test will be implemented when we have file mocking utilities
|
|
81
|
+
expect(true).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('lintDirectory', () => {
|
|
85
|
+
it('should return valid result for directory with no tasks', async () => {
|
|
86
|
+
// Test will be implemented when we have directory mocking utilities
|
|
87
|
+
expect(true).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
it('should collect all errors from multiple files', async () => {
|
|
90
|
+
// Test will be implemented when we have directory mocking utilities
|
|
91
|
+
expect(true).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
it('should mark result as invalid when errors are found', async () => {
|
|
94
|
+
// Test will be implemented when we have directory mocking utilities
|
|
95
|
+
expect(true).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('printResults', () => {
|
|
99
|
+
it('should print success message for valid results', () => {
|
|
100
|
+
const consoleSpy = vi.spyOn(console, 'log');
|
|
101
|
+
const result = {
|
|
102
|
+
errors: [],
|
|
103
|
+
warnings: [],
|
|
104
|
+
filesChecked: 5,
|
|
105
|
+
valid: true,
|
|
106
|
+
};
|
|
107
|
+
FileSystemTaskLinter.printResults(result);
|
|
108
|
+
expect(consoleSpy).toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
it('should print errors when validation fails', () => {
|
|
111
|
+
const consoleSpy = vi.spyOn(console, 'log');
|
|
112
|
+
const result = {
|
|
113
|
+
errors: [
|
|
114
|
+
{
|
|
115
|
+
file: 'task-001.md',
|
|
116
|
+
message: 'Invalid status',
|
|
117
|
+
severity: 'error',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
warnings: [],
|
|
121
|
+
filesChecked: 1,
|
|
122
|
+
valid: false,
|
|
123
|
+
};
|
|
124
|
+
FileSystemTaskLinter.printResults(result);
|
|
125
|
+
expect(consoleSpy).toHaveBeenCalled();
|
|
126
|
+
});
|
|
127
|
+
it('should print warnings separately from errors', () => {
|
|
128
|
+
const consoleSpy = vi.spyOn(console, 'log');
|
|
129
|
+
const result = {
|
|
130
|
+
errors: [],
|
|
131
|
+
warnings: [
|
|
132
|
+
{
|
|
133
|
+
file: 'task-001.md',
|
|
134
|
+
message: 'Consider adding assignee',
|
|
135
|
+
severity: 'warning',
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
filesChecked: 1,
|
|
139
|
+
valid: true,
|
|
140
|
+
};
|
|
141
|
+
FileSystemTaskLinter.printResults(result);
|
|
142
|
+
expect(consoleSpy).toHaveBeenCalled();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=file-system-task-linter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system-task-linter.test.js","sourceRoot":"","sources":["../../../src/lib/file-system-task-linter/file-system-task-linter.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,MAA4B,CAAC;IAEjC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAG;gBACf,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,MAAM;aACb,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG;gBACf,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,gBAAgB;gBACxB,IAAI,EAAE,MAAM,EAAE,yCAAyC;aACxD,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG;gBACf,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,SAAS,EAAE,yCAAyC;gBAC5D,IAAI,EAAE,cAAc;aACrB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,QAAQ,GAAG;gBACf,MAAM,EAAE,gBAAgB;gBACxB,IAAI,EAAE,cAAc;gBACpB,2CAA2C;aAC5C,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;YACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAG;gBACf,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,MAAM;gBACZ,mBAAmB;aACpB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,+DAA+D;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,+DAA+D;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,+DAA+D;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,oEAAoE;YACpE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,oEAAoE;YACpE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,oEAAoE;YACpE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAE5C,MAAM,MAAM,GAAmB;gBAC7B,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC;YAEF,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAE5C,MAAM,MAAM,GAAmB;gBAC7B,MAAM,EAAE;oBACN;wBACE,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,gBAAgB;wBACzB,QAAQ,EAAE,OAAO;qBAClB;iBACF;gBACD,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE,KAAK;aACb,CAAC;YAEF,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAE5C,MAAM,MAAM,GAAmB;gBAC7B,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,0BAA0B;wBACnC,QAAQ,EAAE,SAAS;qBACpB;iBACF;gBACD,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC;YAEF,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileSystem task linter types
|
|
3
|
+
* Re-exports from @taskin/types-ts + FileSystem-specific extensions
|
|
4
|
+
*/
|
|
5
|
+
import type { TaskValidationIssue } from '@taskin/types-ts';
|
|
6
|
+
export type { TaskMetadata, TaskValidationIssue } from '@taskin/types-ts';
|
|
7
|
+
/**
|
|
8
|
+
* FileSystem-specific validation error
|
|
9
|
+
* Extends TaskValidationIssue with file-specific information
|
|
10
|
+
*/
|
|
11
|
+
export interface FileValidationError
|
|
12
|
+
extends Omit<TaskValidationIssue, 'taskId'> {
|
|
13
|
+
file: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* FileSystem-specific lint result
|
|
17
|
+
* Contains file-based validation results
|
|
18
|
+
*/
|
|
19
|
+
export interface FileLintResult {
|
|
20
|
+
errors: FileValidationError[];
|
|
21
|
+
filesChecked: number;
|
|
22
|
+
valid: boolean;
|
|
23
|
+
warnings: FileValidationError[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* FileSystem-specific task linter interface
|
|
27
|
+
* Defines validation operations for file-based task providers
|
|
28
|
+
*/
|
|
29
|
+
export interface IFileSystemTaskLinter {
|
|
30
|
+
/**
|
|
31
|
+
* Lint all task files in a directory
|
|
32
|
+
* @param tasksDir - Directory containing task markdown files
|
|
33
|
+
* @returns Validation results for all files
|
|
34
|
+
*/
|
|
35
|
+
lintDirectory(tasksDir: string): Promise<FileLintResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Lint a single task file
|
|
38
|
+
* @param filePath - Path to the task markdown file
|
|
39
|
+
* @returns Array of validation errors found in the file
|
|
40
|
+
*/
|
|
41
|
+
lintFile(filePath: string): Promise<FileValidationError[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Validate task metadata
|
|
44
|
+
* @param metadata - Task metadata to validate
|
|
45
|
+
* @param fileName - Name of the file being validated
|
|
46
|
+
* @returns Array of validation errors
|
|
47
|
+
*/
|
|
48
|
+
validateMetadata(
|
|
49
|
+
metadata: Record<string, unknown>,
|
|
50
|
+
fileName: string,
|
|
51
|
+
): FileValidationError[];
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system-task-linter.types.js","sourceRoot":"","sources":["../../../src/lib/file-system-task-linter/file-system-task-linter.types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/file-system-task-linter/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC"}
|
package/dist/lib/help.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom help display for the CLI
|
|
3
|
+
*/
|
|
4
|
+
import { colors, icons, printHeader } from './colors.js';
|
|
5
|
+
export function showCustomHelp() {
|
|
6
|
+
printHeader('Taskin - Task Management System', icons.rocket);
|
|
7
|
+
console.log(colors.info('📋 AVAILABLE COMMANDS'));
|
|
8
|
+
console.log(colors.highlight('═'.repeat(60)));
|
|
9
|
+
console.log();
|
|
10
|
+
const commands = [
|
|
11
|
+
{
|
|
12
|
+
name: colors.highlight('taskin list') + colors.normal(' [filter]'),
|
|
13
|
+
alias: colors.secondary('Alias: ls'),
|
|
14
|
+
description: 'List all tasks in the project',
|
|
15
|
+
examples: [
|
|
16
|
+
'taskin list',
|
|
17
|
+
'taskin list pending',
|
|
18
|
+
'taskin list --status in-progress',
|
|
19
|
+
'taskin list --type feat',
|
|
20
|
+
],
|
|
21
|
+
icon: '📊',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: colors.highlight('taskin start') + colors.normal(' <task-id>'),
|
|
25
|
+
alias: colors.secondary('Alias: begin'),
|
|
26
|
+
description: 'Start working on a task',
|
|
27
|
+
examples: [
|
|
28
|
+
'taskin start 001',
|
|
29
|
+
'taskin start task-001',
|
|
30
|
+
'taskin start 001 --force',
|
|
31
|
+
],
|
|
32
|
+
icon: '🚀',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: colors.highlight('taskin pause') + colors.normal(' <task-id>'),
|
|
36
|
+
alias: colors.secondary('Alias: stop'),
|
|
37
|
+
description: 'Pause a task (commit without push)',
|
|
38
|
+
examples: ['taskin pause 001', 'taskin pause 001 -m "saving progress"'],
|
|
39
|
+
icon: '⏸️',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: colors.highlight('taskin finish') + colors.normal(' <task-id>'),
|
|
43
|
+
alias: colors.secondary('Alias: done'),
|
|
44
|
+
description: 'Finish a task',
|
|
45
|
+
examples: ['taskin finish 001', 'taskin done task-001'],
|
|
46
|
+
icon: '✅',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: colors.highlight('taskin lint') + colors.normal(' [options]'),
|
|
50
|
+
alias: colors.secondary('Options: -p, --path <directory>'),
|
|
51
|
+
description: 'Validate task markdown files',
|
|
52
|
+
examples: [
|
|
53
|
+
'taskin lint',
|
|
54
|
+
'taskin lint --path ./TASKS',
|
|
55
|
+
'taskin lint -p /path/to/tasks',
|
|
56
|
+
],
|
|
57
|
+
icon: '🔍',
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
commands.forEach((cmd, index) => {
|
|
61
|
+
console.log(colors.warning(`${cmd.icon} ${cmd.name}`));
|
|
62
|
+
console.log(colors.normal(` ${cmd.alias}`));
|
|
63
|
+
console.log(colors.info(` ${cmd.description}`));
|
|
64
|
+
console.log();
|
|
65
|
+
console.log(colors.normal(` ${colors.info('📝 Examples:')}`));
|
|
66
|
+
cmd.examples.forEach((example) => {
|
|
67
|
+
console.log(colors.secondary(` ${example}`));
|
|
68
|
+
});
|
|
69
|
+
if (index < commands.length - 1) {
|
|
70
|
+
console.log();
|
|
71
|
+
console.log(colors.normal(' ' + colors.secondary('─'.repeat(50))));
|
|
72
|
+
console.log();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
console.log();
|
|
76
|
+
console.log(colors.highlight('═'.repeat(60)));
|
|
77
|
+
console.log();
|
|
78
|
+
console.log(colors.info('💡 QUICK TIPS'));
|
|
79
|
+
console.log(
|
|
80
|
+
colors.normal(
|
|
81
|
+
`${colors.warning('•')} Use short IDs: ${colors.highlight('001')}, ${colors.highlight('task-001')}`,
|
|
82
|
+
),
|
|
83
|
+
);
|
|
84
|
+
console.log(
|
|
85
|
+
colors.normal(
|
|
86
|
+
`${colors.warning('•')} All commands support ${colors.highlight('--help')} for more options`,
|
|
87
|
+
),
|
|
88
|
+
);
|
|
89
|
+
console.log(
|
|
90
|
+
colors.normal(
|
|
91
|
+
`${colors.warning('•')} Use aliases for faster commands: ${colors.highlight('ls')}, ${colors.highlight('begin')}, ${colors.highlight('stop')}, ${colors.highlight('done')}`,
|
|
92
|
+
),
|
|
93
|
+
);
|
|
94
|
+
console.log();
|
|
95
|
+
console.log(colors.info('🔧 FOR MORE HELP'));
|
|
96
|
+
console.log(
|
|
97
|
+
colors.secondary('taskin ') +
|
|
98
|
+
colors.highlight('<command>') +
|
|
99
|
+
colors.secondary(' --help'),
|
|
100
|
+
);
|
|
101
|
+
console.log();
|
|
102
|
+
return '';
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/lib/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,oCAAoC,CAAC;AACnD,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/provider-installer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider installer
|
|
3
|
+
* Detects, installs, and loads task providers dynamically
|
|
4
|
+
*/
|
|
5
|
+
import type { ProviderInfo } from '../provider-registry/provider-registry.types.js';
|
|
6
|
+
import type { PackageManager } from './provider-installer.types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect which package manager is being used
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectPackageManager(): PackageManager;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a package is installed
|
|
13
|
+
*/
|
|
14
|
+
export declare function isProviderInstalled(packageName: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Install a provider package
|
|
17
|
+
*/
|
|
18
|
+
export declare function installProvider(provider: ProviderInfo): void;
|
|
19
|
+
/**
|
|
20
|
+
* Load a provider dynamically
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadProvider(packageName: string): Promise<unknown>;
|
|
23
|
+
/**
|
|
24
|
+
* Ensure provider is installed and load it
|
|
25
|
+
*/
|
|
26
|
+
export declare function ensureProviderInstalled(
|
|
27
|
+
provider: ProviderInfo,
|
|
28
|
+
): Promise<unknown>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider installer
|
|
3
|
+
* Detects, installs, and loads task providers dynamically
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
/**
|
|
8
|
+
* Detect which package manager is being used
|
|
9
|
+
*/
|
|
10
|
+
export function detectPackageManager() {
|
|
11
|
+
// Check for lock files
|
|
12
|
+
if (existsSync('pnpm-lock.yaml')) {
|
|
13
|
+
return 'pnpm';
|
|
14
|
+
}
|
|
15
|
+
if (existsSync('yarn.lock')) {
|
|
16
|
+
return 'yarn';
|
|
17
|
+
}
|
|
18
|
+
// Default to npm
|
|
19
|
+
return 'npm';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if a package is installed
|
|
23
|
+
*/
|
|
24
|
+
export function isProviderInstalled(packageName) {
|
|
25
|
+
try {
|
|
26
|
+
// Try to resolve the package
|
|
27
|
+
require.resolve(packageName);
|
|
28
|
+
return true;
|
|
29
|
+
} catch {
|
|
30
|
+
// Package not found
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Install a provider package
|
|
36
|
+
*/
|
|
37
|
+
export function installProvider(provider) {
|
|
38
|
+
const packageManager = detectPackageManager();
|
|
39
|
+
const { packageName } = provider;
|
|
40
|
+
console.log(`\n📦 Installing ${packageName}...`);
|
|
41
|
+
try {
|
|
42
|
+
let command;
|
|
43
|
+
switch (packageManager) {
|
|
44
|
+
case 'pnpm':
|
|
45
|
+
command = `pnpm add ${packageName}`;
|
|
46
|
+
break;
|
|
47
|
+
case 'yarn':
|
|
48
|
+
command = `yarn add ${packageName}`;
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
command = `npm install ${packageName}`;
|
|
52
|
+
}
|
|
53
|
+
execSync(command, { stdio: 'inherit' });
|
|
54
|
+
console.log(`✅ ${packageName} installed successfully!\n`);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error(`\n❌ Failed to install ${packageName}`);
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load a provider dynamically
|
|
62
|
+
*/
|
|
63
|
+
export async function loadProvider(packageName) {
|
|
64
|
+
try {
|
|
65
|
+
// Dynamic import for ESM compatibility
|
|
66
|
+
const module = await import(packageName);
|
|
67
|
+
return module.default || module;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.error(`Failed to load provider: ${packageName}`);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Ensure provider is installed and load it
|
|
75
|
+
*/
|
|
76
|
+
export async function ensureProviderInstalled(provider) {
|
|
77
|
+
const { packageName } = provider;
|
|
78
|
+
// Check if already installed
|
|
79
|
+
if (!isProviderInstalled(packageName)) {
|
|
80
|
+
console.log(`\n⚠️ Provider ${packageName} is not installed.`);
|
|
81
|
+
installProvider(provider);
|
|
82
|
+
}
|
|
83
|
+
// Load the provider
|
|
84
|
+
return loadProvider(packageName);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=provider-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-installer.js","sourceRoot":"","sources":["../../../src/lib/provider-installer/provider-installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,uBAAuB;IACvB,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,iBAAiB;IACjB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,6BAA6B;QAC7B,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;IAC9C,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,IAAI,OAAe,CAAC;QACpB,QAAQ,cAAc,EAAE,CAAC;YACvB,KAAK,MAAM;gBACT,OAAO,GAAG,YAAY,WAAW,EAAE,CAAC;gBACpC,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,GAAG,YAAY,WAAW,EAAE,CAAC;gBACpC,MAAM;YACR;gBACE,OAAO,GAAG,eAAe,WAAW,EAAE,CAAC;QAC3C,CAAC;QAED,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAsB;IAEtB,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAEjC,6BAA6B;IAC7B,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,oBAAoB,CAAC,CAAC;QAC/D,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,oBAAoB;IACpB,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-installer.types.js","sourceRoot":"","sources":["../../../src/lib/provider-installer/provider-installer.types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider installer
|
|
3
|
+
* Detects, installs, and loads task providers dynamically
|
|
4
|
+
*/
|
|
5
|
+
import type { ProviderInfo } from './provider-registry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Detect which package manager is being used
|
|
8
|
+
*/
|
|
9
|
+
export declare function detectPackageManager(): 'npm' | 'pnpm' | 'yarn';
|
|
10
|
+
/**
|
|
11
|
+
* Check if a package is installed
|
|
12
|
+
*/
|
|
13
|
+
export declare function isProviderInstalled(packageName: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Install a provider package
|
|
16
|
+
*/
|
|
17
|
+
export declare function installProvider(provider: ProviderInfo): void;
|
|
18
|
+
/**
|
|
19
|
+
* Load a provider dynamically
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadProvider(packageName: string): Promise<unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Ensure provider is installed and load it
|
|
24
|
+
*/
|
|
25
|
+
export declare function ensureProviderInstalled(
|
|
26
|
+
provider: ProviderInfo,
|
|
27
|
+
): Promise<unknown>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider installer
|
|
3
|
+
* Detects, installs, and loads task providers dynamically
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
/**
|
|
8
|
+
* Detect which package manager is being used
|
|
9
|
+
*/
|
|
10
|
+
export function detectPackageManager() {
|
|
11
|
+
// Check for lock files
|
|
12
|
+
if (existsSync('pnpm-lock.yaml')) {
|
|
13
|
+
return 'pnpm';
|
|
14
|
+
}
|
|
15
|
+
if (existsSync('yarn.lock')) {
|
|
16
|
+
return 'yarn';
|
|
17
|
+
}
|
|
18
|
+
// Default to npm
|
|
19
|
+
return 'npm';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if a package is installed
|
|
23
|
+
*/
|
|
24
|
+
export function isProviderInstalled(packageName) {
|
|
25
|
+
try {
|
|
26
|
+
// Try to resolve the package
|
|
27
|
+
require.resolve(packageName);
|
|
28
|
+
return true;
|
|
29
|
+
} catch {
|
|
30
|
+
// Package not found
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Install a provider package
|
|
36
|
+
*/
|
|
37
|
+
export function installProvider(provider) {
|
|
38
|
+
const packageManager = detectPackageManager();
|
|
39
|
+
const { packageName } = provider;
|
|
40
|
+
console.log(`\n📦 Installing ${packageName}...`);
|
|
41
|
+
try {
|
|
42
|
+
let command;
|
|
43
|
+
switch (packageManager) {
|
|
44
|
+
case 'pnpm':
|
|
45
|
+
command = `pnpm add ${packageName}`;
|
|
46
|
+
break;
|
|
47
|
+
case 'yarn':
|
|
48
|
+
command = `yarn add ${packageName}`;
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
command = `npm install ${packageName}`;
|
|
52
|
+
}
|
|
53
|
+
execSync(command, { stdio: 'inherit' });
|
|
54
|
+
console.log(`✅ ${packageName} installed successfully!\n`);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error(`\n❌ Failed to install ${packageName}`);
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load a provider dynamically
|
|
62
|
+
*/
|
|
63
|
+
export async function loadProvider(packageName) {
|
|
64
|
+
try {
|
|
65
|
+
// Dynamic import for ESM compatibility
|
|
66
|
+
const module = await import(packageName);
|
|
67
|
+
return module.default || module;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.error(`Failed to load provider: ${packageName}`);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Ensure provider is installed and load it
|
|
75
|
+
*/
|
|
76
|
+
export async function ensureProviderInstalled(provider) {
|
|
77
|
+
const { packageName } = provider;
|
|
78
|
+
// Check if already installed
|
|
79
|
+
if (!isProviderInstalled(packageName)) {
|
|
80
|
+
console.log(`\n⚠️ Provider ${packageName} is not installed.`);
|
|
81
|
+
installProvider(provider);
|
|
82
|
+
}
|
|
83
|
+
// Load the provider
|
|
84
|
+
return loadProvider(packageName);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=provider-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-installer.js","sourceRoot":"","sources":["../../src/lib/provider-installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,uBAAuB;IACvB,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,iBAAiB;IACjB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,6BAA6B;QAC7B,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;IAC9C,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,IAAI,OAAe,CAAC;QACpB,QAAQ,cAAc,EAAE,CAAC;YACvB,KAAK,MAAM;gBACT,OAAO,GAAG,YAAY,WAAW,EAAE,CAAC;gBACpC,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,GAAG,YAAY,WAAW,EAAE,CAAC;gBACpC,MAAM;YACR;gBACE,OAAO,GAAG,eAAe,WAAW,EAAE,CAAC;QAC3C,CAAC;QAED,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAsB;IAEtB,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAEjC,6BAA6B;IAC7B,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,oBAAoB,CAAC,CAAC;QAC/D,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,oBAAoB;IACpB,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC"}
|