@qelos/aidev 0.3.0 → 0.4.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 (61) hide show
  1. package/.env.aidev.example +81 -62
  2. package/CONTRIBUTING.md +78 -78
  3. package/LICENSE +21 -21
  4. package/README.md +499 -467
  5. package/dist/__tests__/clickup-format.test.d.ts +2 -0
  6. package/dist/__tests__/clickup-format.test.d.ts.map +1 -0
  7. package/dist/__tests__/clickup-format.test.js +256 -0
  8. package/dist/__tests__/clickup-format.test.js.map +1 -0
  9. package/dist/__tests__/hooks.test.d.ts +2 -0
  10. package/dist/__tests__/hooks.test.d.ts.map +1 -0
  11. package/dist/__tests__/hooks.test.js +329 -0
  12. package/dist/__tests__/hooks.test.js.map +1 -0
  13. package/dist/__tests__/init.test.js +33 -0
  14. package/dist/__tests__/init.test.js.map +1 -1
  15. package/dist/__tests__/local-provider.test.js +31 -31
  16. package/dist/__tests__/platform.test.js +5 -5
  17. package/dist/__tests__/providers.test.js +166 -0
  18. package/dist/__tests__/providers.test.js.map +1 -1
  19. package/dist/__tests__/run.test.js +21 -8
  20. package/dist/__tests__/run.test.js.map +1 -1
  21. package/dist/cli.js +5 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/help.d.ts.map +1 -1
  24. package/dist/commands/help.js +67 -61
  25. package/dist/commands/help.js.map +1 -1
  26. package/dist/commands/init.d.ts +1 -0
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +125 -0
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/run.d.ts +2 -1
  31. package/dist/commands/run.d.ts.map +1 -1
  32. package/dist/commands/run.js +248 -119
  33. package/dist/commands/run.js.map +1 -1
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +16 -1
  36. package/dist/config.js.map +1 -1
  37. package/dist/github.js +23 -23
  38. package/dist/hooks.d.ts +106 -0
  39. package/dist/hooks.d.ts.map +1 -0
  40. package/dist/hooks.js +146 -0
  41. package/dist/hooks.js.map +1 -0
  42. package/dist/providers/clickup-format.d.ts +16 -0
  43. package/dist/providers/clickup-format.d.ts.map +1 -0
  44. package/dist/providers/clickup-format.js +255 -0
  45. package/dist/providers/clickup-format.js.map +1 -0
  46. package/dist/providers/clickup.d.ts.map +1 -1
  47. package/dist/providers/clickup.js +8 -6
  48. package/dist/providers/clickup.js.map +1 -1
  49. package/dist/providers/index.d.ts.map +1 -1
  50. package/dist/providers/index.js +2 -1
  51. package/dist/providers/index.js.map +1 -1
  52. package/dist/providers/linear.js +70 -70
  53. package/dist/providers/monday.js +39 -39
  54. package/dist/providers/trello.d.ts +32 -0
  55. package/dist/providers/trello.d.ts.map +1 -0
  56. package/dist/providers/trello.js +227 -0
  57. package/dist/providers/trello.js.map +1 -0
  58. package/dist/types.d.ts +12 -0
  59. package/dist/types.d.ts.map +1 -1
  60. package/package.json +51 -50
  61. package/scripts/run-tests.cjs +18 -18
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clickup-format.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickup-format.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/clickup-format.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const clickup_format_1 = require("../providers/clickup-format");
9
+ (0, node_test_1.describe)('clickupBlocksToMarkdown', () => {
10
+ (0, node_test_1.it)('converts plain text blocks', () => {
11
+ const blocks = [
12
+ { text: 'Hello world' },
13
+ { text: '\n' },
14
+ ];
15
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), 'Hello world');
16
+ });
17
+ (0, node_test_1.it)('converts bold text', () => {
18
+ const blocks = [
19
+ { text: 'This is ', attributes: {} },
20
+ { text: 'bold', attributes: { bold: true } },
21
+ { text: ' text\n' },
22
+ ];
23
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), 'This is **bold** text');
24
+ });
25
+ (0, node_test_1.it)('converts italic text', () => {
26
+ const blocks = [
27
+ { text: 'This is ', attributes: {} },
28
+ { text: 'italic', attributes: { italic: true } },
29
+ { text: '\n' },
30
+ ];
31
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), 'This is *italic*');
32
+ });
33
+ (0, node_test_1.it)('converts inline code', () => {
34
+ const blocks = [
35
+ { text: 'Use ' },
36
+ { text: 'npm install', attributes: { code: true } },
37
+ { text: '\n' },
38
+ ];
39
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), 'Use `npm install`');
40
+ });
41
+ (0, node_test_1.it)('converts links', () => {
42
+ const blocks = [
43
+ { text: 'Click ' },
44
+ { text: 'here', attributes: { link: 'https://example.com' } },
45
+ { text: '\n' },
46
+ ];
47
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), 'Click [here](https://example.com)');
48
+ });
49
+ (0, node_test_1.it)('converts bullet list', () => {
50
+ const blocks = [
51
+ { text: 'First item' },
52
+ { text: '\n', attributes: { list: { list: 'bullet' } } },
53
+ { text: 'Second item' },
54
+ { text: '\n', attributes: { list: { list: 'bullet' } } },
55
+ ];
56
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), '- First item\n- Second item');
57
+ });
58
+ (0, node_test_1.it)('converts ordered list', () => {
59
+ const blocks = [
60
+ { text: 'First' },
61
+ { text: '\n', attributes: { list: { list: 'ordered' } } },
62
+ { text: 'Second' },
63
+ { text: '\n', attributes: { list: { list: 'ordered' } } },
64
+ ];
65
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), '1. First\n2. Second');
66
+ });
67
+ (0, node_test_1.it)('converts checklist', () => {
68
+ const blocks = [
69
+ { text: 'Done task' },
70
+ { text: '\n', attributes: { list: { list: 'checked' } } },
71
+ { text: 'Pending task' },
72
+ { text: '\n', attributes: { list: { list: 'unchecked' } } },
73
+ ];
74
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), '- [x] Done task\n- [ ] Pending task');
75
+ });
76
+ (0, node_test_1.it)('converts code block', () => {
77
+ const blocks = [
78
+ { text: 'const x = 1;' },
79
+ { text: '\n', attributes: { 'code-block': 'javascript' } },
80
+ { text: 'const y = 2;' },
81
+ { text: '\n', attributes: { 'code-block': 'javascript' } },
82
+ ];
83
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), '```\nconst x = 1;\nconst y = 2;\n```');
84
+ });
85
+ (0, node_test_1.it)('handles code-block with nested object format', () => {
86
+ const blocks = [
87
+ { text: 'hello()' },
88
+ { text: '\n', attributes: { 'code-block': { 'code-block': 'plain' } } },
89
+ ];
90
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), '```\nhello()\n```');
91
+ });
92
+ (0, node_test_1.it)('handles mixed content', () => {
93
+ const blocks = [
94
+ { text: 'Title', attributes: { bold: true } },
95
+ { text: '\n' },
96
+ { text: 'Item A' },
97
+ { text: '\n', attributes: { list: { list: 'bullet' } } },
98
+ { text: 'Item B' },
99
+ { text: '\n', attributes: { list: { list: 'bullet' } } },
100
+ ];
101
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), '**Title**\n- Item A\n- Item B');
102
+ });
103
+ (0, node_test_1.it)('returns empty string for empty/null input', () => {
104
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)([]), '');
105
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(null), '');
106
+ });
107
+ (0, node_test_1.it)('handles list attribute as plain string', () => {
108
+ const blocks = [
109
+ { text: 'item' },
110
+ { text: '\n', attributes: { list: 'bullet' } },
111
+ ];
112
+ strict_1.default.equal((0, clickup_format_1.clickupBlocksToMarkdown)(blocks), '- item');
113
+ });
114
+ });
115
+ (0, node_test_1.describe)('markdownToClickupBlocks', () => {
116
+ (0, node_test_1.it)('converts plain text', () => {
117
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('Hello world');
118
+ strict_1.default.deepEqual(blocks, [
119
+ { text: 'Hello world' },
120
+ { text: '\n' },
121
+ ]);
122
+ });
123
+ (0, node_test_1.it)('converts bold text', () => {
124
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('This is **bold** text');
125
+ strict_1.default.deepEqual(blocks, [
126
+ { text: 'This is ' },
127
+ { text: 'bold', attributes: { bold: true } },
128
+ { text: ' text' },
129
+ { text: '\n' },
130
+ ]);
131
+ });
132
+ (0, node_test_1.it)('converts italic text', () => {
133
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('This is *italic* text');
134
+ strict_1.default.deepEqual(blocks, [
135
+ { text: 'This is ' },
136
+ { text: 'italic', attributes: { italic: true } },
137
+ { text: ' text' },
138
+ { text: '\n' },
139
+ ]);
140
+ });
141
+ (0, node_test_1.it)('converts inline code', () => {
142
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('Use `npm install` now');
143
+ strict_1.default.deepEqual(blocks, [
144
+ { text: 'Use ' },
145
+ { text: 'npm install', attributes: { code: true } },
146
+ { text: ' now' },
147
+ { text: '\n' },
148
+ ]);
149
+ });
150
+ (0, node_test_1.it)('converts links', () => {
151
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('Click [here](https://example.com)');
152
+ strict_1.default.deepEqual(blocks, [
153
+ { text: 'Click ' },
154
+ { text: 'here', attributes: { link: 'https://example.com' } },
155
+ { text: '\n' },
156
+ ]);
157
+ });
158
+ (0, node_test_1.it)('converts bullet list', () => {
159
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('- First\n- Second');
160
+ strict_1.default.deepEqual(blocks, [
161
+ { text: 'First' },
162
+ { text: '\n', attributes: { list: { list: 'bullet' } } },
163
+ { text: 'Second' },
164
+ { text: '\n', attributes: { list: { list: 'bullet' } } },
165
+ ]);
166
+ });
167
+ (0, node_test_1.it)('converts ordered list', () => {
168
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('1. First\n2. Second');
169
+ strict_1.default.deepEqual(blocks, [
170
+ { text: 'First' },
171
+ { text: '\n', attributes: { list: { list: 'ordered' } } },
172
+ { text: 'Second' },
173
+ { text: '\n', attributes: { list: { list: 'ordered' } } },
174
+ ]);
175
+ });
176
+ (0, node_test_1.it)('converts checklist', () => {
177
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('- [x] Done\n- [ ] Todo');
178
+ strict_1.default.deepEqual(blocks, [
179
+ { text: 'Done' },
180
+ { text: '\n', attributes: { list: { list: 'checked' } } },
181
+ { text: 'Todo' },
182
+ { text: '\n', attributes: { list: { list: 'unchecked' } } },
183
+ ]);
184
+ });
185
+ (0, node_test_1.it)('converts code block', () => {
186
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('```js\nconst x = 1;\n```');
187
+ strict_1.default.deepEqual(blocks, [
188
+ { text: 'const x = 1;' },
189
+ { text: '\n', attributes: { 'code-block': { 'code-block': 'js' } } },
190
+ ]);
191
+ });
192
+ (0, node_test_1.it)('converts headings to bold', () => {
193
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('## My Heading');
194
+ strict_1.default.deepEqual(blocks, [
195
+ { text: 'My Heading', attributes: { bold: true } },
196
+ { text: '\n' },
197
+ ]);
198
+ });
199
+ (0, node_test_1.it)('handles empty lines as paragraph breaks', () => {
200
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('Line 1\n\nLine 2');
201
+ strict_1.default.deepEqual(blocks, [
202
+ { text: 'Line 1' },
203
+ { text: '\n' },
204
+ { text: '\n' },
205
+ { text: 'Line 2' },
206
+ { text: '\n' },
207
+ ]);
208
+ });
209
+ (0, node_test_1.it)('handles inline formatting inside list items', () => {
210
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)('- **bold** item');
211
+ strict_1.default.deepEqual(blocks, [
212
+ { text: 'bold', attributes: { bold: true } },
213
+ { text: ' item' },
214
+ { text: '\n', attributes: { list: { list: 'bullet' } } },
215
+ ]);
216
+ });
217
+ });
218
+ (0, node_test_1.describe)('round-trip conversion', () => {
219
+ (0, node_test_1.it)('preserves plain text through round-trip', () => {
220
+ const md = 'Hello world';
221
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)(md);
222
+ const result = (0, clickup_format_1.clickupBlocksToMarkdown)(blocks);
223
+ strict_1.default.equal(result, md);
224
+ });
225
+ (0, node_test_1.it)('preserves bullet list through round-trip', () => {
226
+ const md = '- Item A\n- Item B\n- Item C';
227
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)(md);
228
+ const result = (0, clickup_format_1.clickupBlocksToMarkdown)(blocks);
229
+ strict_1.default.equal(result, md);
230
+ });
231
+ (0, node_test_1.it)('preserves ordered list through round-trip', () => {
232
+ const md = '1. First\n2. Second\n3. Third';
233
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)(md);
234
+ const result = (0, clickup_format_1.clickupBlocksToMarkdown)(blocks);
235
+ strict_1.default.equal(result, md);
236
+ });
237
+ (0, node_test_1.it)('preserves bold and italic through round-trip', () => {
238
+ const md = 'This is **bold** and *italic* text';
239
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)(md);
240
+ const result = (0, clickup_format_1.clickupBlocksToMarkdown)(blocks);
241
+ strict_1.default.equal(result, md);
242
+ });
243
+ (0, node_test_1.it)('preserves inline code through round-trip', () => {
244
+ const md = 'Run `npm test` now';
245
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)(md);
246
+ const result = (0, clickup_format_1.clickupBlocksToMarkdown)(blocks);
247
+ strict_1.default.equal(result, md);
248
+ });
249
+ (0, node_test_1.it)('preserves links through round-trip', () => {
250
+ const md = 'Visit [docs](https://docs.example.com) for info';
251
+ const blocks = (0, clickup_format_1.markdownToClickupBlocks)(md);
252
+ const result = (0, clickup_format_1.clickupBlocksToMarkdown)(blocks);
253
+ strict_1.default.equal(result, md);
254
+ });
255
+ });
256
+ //# sourceMappingURL=clickup-format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickup-format.test.js","sourceRoot":"","sources":["../../src/__tests__/clickup-format.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hooks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const strict_1 = __importDefault(require("node:assert/strict"));
41
+ const fs = __importStar(require("node:fs"));
42
+ const path = __importStar(require("node:path"));
43
+ const os = __importStar(require("node:os"));
44
+ const hooks_1 = require("../hooks");
45
+ function stubConfig() {
46
+ return { provider: 'local' };
47
+ }
48
+ // ─── loadHooks ───────────────────────────────────────────────────────────────
49
+ (0, node_test_1.describe)('loadHooks', () => {
50
+ let tmpDir;
51
+ (0, node_test_1.beforeEach)(() => {
52
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aidev-hooks-test-'));
53
+ });
54
+ (0, node_test_1.afterEach)(() => {
55
+ fs.rmSync(tmpDir, { recursive: true, force: true });
56
+ });
57
+ (0, node_test_1.it)('returns empty object when path is empty', () => {
58
+ const hooks = (0, hooks_1.loadHooks)('');
59
+ strict_1.default.deepEqual(hooks, {});
60
+ });
61
+ (0, node_test_1.it)('returns empty object when file does not exist', () => {
62
+ const hooks = (0, hooks_1.loadHooks)(path.join(tmpDir, 'nonexistent.js'));
63
+ strict_1.default.deepEqual(hooks, {});
64
+ });
65
+ (0, node_test_1.it)('loads a JS hooks file with valid functions', () => {
66
+ const hooksFile = path.join(tmpDir, 'hooks.js');
67
+ fs.writeFileSync(hooksFile, `
68
+ module.exports = {
69
+ beforeRun: async (ctx) => ctx,
70
+ afterRun: async () => {},
71
+ };
72
+ `, 'utf8');
73
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
74
+ strict_1.default.equal(typeof hooks.beforeRun, 'function');
75
+ strict_1.default.equal(typeof hooks.afterRun, 'function');
76
+ });
77
+ (0, node_test_1.it)('ignores non-function exports', () => {
78
+ const hooksFile = path.join(tmpDir, 'hooks.js');
79
+ fs.writeFileSync(hooksFile, `
80
+ module.exports = {
81
+ beforeRun: 'not a function',
82
+ afterRun: async () => {},
83
+ };
84
+ `, 'utf8');
85
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
86
+ strict_1.default.equal(hooks.beforeRun, undefined);
87
+ strict_1.default.equal(typeof hooks.afterRun, 'function');
88
+ });
89
+ (0, node_test_1.it)('resolves relative paths from cwd', () => {
90
+ const hooksFile = path.join(tmpDir, 'hooks.js');
91
+ fs.writeFileSync(hooksFile, `
92
+ module.exports = { beforeRun: async () => {} };
93
+ `, 'utf8');
94
+ const originalCwd = process.cwd();
95
+ try {
96
+ process.chdir(tmpDir);
97
+ const hooks = (0, hooks_1.loadHooks)('./hooks.js');
98
+ strict_1.default.equal(typeof hooks.beforeRun, 'function');
99
+ }
100
+ finally {
101
+ process.chdir(originalCwd);
102
+ }
103
+ });
104
+ (0, node_test_1.it)('handles default export', () => {
105
+ const hooksFile = path.join(tmpDir, 'hooks.js');
106
+ fs.writeFileSync(hooksFile, `
107
+ module.exports.default = {
108
+ beforeEachTask: async (ctx) => ctx,
109
+ };
110
+ `, 'utf8');
111
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
112
+ strict_1.default.equal(typeof hooks.beforeEachTask, 'function');
113
+ });
114
+ (0, node_test_1.it)('returns empty object when require fails', () => {
115
+ const hooksFile = path.join(tmpDir, 'hooks.js');
116
+ fs.writeFileSync(hooksFile, 'this is not valid javascript{{{', 'utf8');
117
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
118
+ strict_1.default.deepEqual(hooks, {});
119
+ });
120
+ (0, node_test_1.it)('ignores unknown export keys', () => {
121
+ const hooksFile = path.join(tmpDir, 'hooks.js');
122
+ fs.writeFileSync(hooksFile, `
123
+ module.exports = {
124
+ beforeRun: async () => {},
125
+ notAHook: async () => {},
126
+ extraField: 42,
127
+ };
128
+ `, 'utf8');
129
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
130
+ strict_1.default.equal(typeof hooks.beforeRun, 'function');
131
+ strict_1.default.equal(hooks.notAHook, undefined);
132
+ });
133
+ (0, node_test_1.it)('loads a TypeScript hooks file via jiti', () => {
134
+ const hooksFile = path.join(tmpDir, 'hooks.ts');
135
+ fs.writeFileSync(hooksFile, `
136
+ interface Ctx { config: Record<string, unknown>; filter: string; taskCount: number }
137
+ const hooks = {
138
+ beforeRun: async (ctx: Ctx) => ctx,
139
+ afterRun: async () => {},
140
+ };
141
+ module.exports = hooks;
142
+ `, 'utf8');
143
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
144
+ strict_1.default.equal(typeof hooks.beforeRun, 'function');
145
+ strict_1.default.equal(typeof hooks.afterRun, 'function');
146
+ });
147
+ (0, node_test_1.it)('loads a TypeScript hooks file with export default via jiti', () => {
148
+ const hooksFile = path.join(tmpDir, 'hooks-default.ts');
149
+ fs.writeFileSync(hooksFile, `
150
+ export default {
151
+ beforeEachTask: async (ctx: any) => ctx,
152
+ };
153
+ `, 'utf8');
154
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
155
+ strict_1.default.equal(typeof hooks.beforeEachTask, 'function');
156
+ });
157
+ (0, node_test_1.it)('returns empty object when TypeScript file has syntax errors', () => {
158
+ const hooksFile = path.join(tmpDir, 'bad.ts');
159
+ fs.writeFileSync(hooksFile, 'this is not valid typescript{{{', 'utf8');
160
+ const hooks = (0, hooks_1.loadHooks)(hooksFile);
161
+ strict_1.default.deepEqual(hooks, {});
162
+ });
163
+ });
164
+ // ─── executeHook ─────────────────────────────────────────────────────────────
165
+ (0, node_test_1.describe)('executeHook', () => {
166
+ const mockVM = {
167
+ runAI: async () => ({ success: true, output: 'ok', error: '' }),
168
+ postComment: async () => { },
169
+ updateStatus: async () => { },
170
+ getComments: async () => [],
171
+ log: { info: () => { }, warn: () => { }, error: () => { } },
172
+ };
173
+ (0, node_test_1.it)('returns original context when hook does not exist', async () => {
174
+ const hooks = {};
175
+ const ctx = { config: stubConfig(), filter: 'all', taskCount: 5 };
176
+ const result = await (0, hooks_1.executeHook)(hooks, 'beforeRun', ctx, mockVM);
177
+ strict_1.default.deepEqual(result, ctx);
178
+ });
179
+ (0, node_test_1.it)('returns modified context when hook returns one', async () => {
180
+ const hooks = {
181
+ beforeRun: async (ctx) => ({ ...ctx, taskCount: 99 }),
182
+ };
183
+ const ctx = { config: stubConfig(), filter: 'all', taskCount: 5 };
184
+ const result = await (0, hooks_1.executeHook)(hooks, 'beforeRun', ctx, mockVM);
185
+ strict_1.default.equal(result.taskCount, 99);
186
+ });
187
+ (0, node_test_1.it)('returns original context when hook returns void', async () => {
188
+ const hooks = {
189
+ beforeRun: async () => { },
190
+ };
191
+ const ctx = { config: stubConfig(), filter: 'all', taskCount: 5 };
192
+ const result = await (0, hooks_1.executeHook)(hooks, 'beforeRun', ctx, mockVM);
193
+ strict_1.default.equal(result.taskCount, 5);
194
+ });
195
+ (0, node_test_1.it)('propagates errors thrown by hooks', async () => {
196
+ const hooks = {
197
+ beforeRun: async () => { throw new Error('hook abort'); },
198
+ };
199
+ const ctx = { config: stubConfig(), filter: 'all', taskCount: 5 };
200
+ await strict_1.default.rejects(() => (0, hooks_1.executeHook)(hooks, 'beforeRun', ctx, mockVM), { message: 'hook abort' });
201
+ });
202
+ (0, node_test_1.it)('passes vm to hook function', async () => {
203
+ let receivedVM;
204
+ const hooks = {
205
+ afterRun: async (_ctx, vm) => { receivedVM = vm; },
206
+ };
207
+ const ctx = { config: stubConfig(), filter: 'all', taskCount: 0, processed: 0, skipped: 0 };
208
+ await (0, hooks_1.executeHook)(hooks, 'afterRun', ctx, mockVM);
209
+ strict_1.default.equal(receivedVM, mockVM);
210
+ });
211
+ (0, node_test_1.it)('allows beforeEachTask to modify prompt', async () => {
212
+ const hooks = {
213
+ beforeEachTask: async (ctx) => {
214
+ return { ...ctx, prompt: ctx.prompt + '\nExtra instructions' };
215
+ },
216
+ };
217
+ const ctx = {
218
+ task: { id: '1', name: 'test', description: '', status: 'open', url: '', tags: [] },
219
+ config: stubConfig(),
220
+ branchName: 'test-branch',
221
+ prompt: 'Original prompt',
222
+ };
223
+ const result = await (0, hooks_1.executeHook)(hooks, 'beforeEachTask', ctx, mockVM);
224
+ strict_1.default.ok(result.prompt.includes('Extra instructions'));
225
+ strict_1.default.ok(result.prompt.includes('Original prompt'));
226
+ });
227
+ (0, node_test_1.it)('allows beforeThinkingTask to adjust subtasks', async () => {
228
+ const hooks = {
229
+ beforeThinkingTask: async (ctx) => ({
230
+ ...ctx,
231
+ subtasks: ctx.subtasks.map((s) => s.id === 1 ? { ...s, title: s.title + ' (edited)' } : s),
232
+ }),
233
+ };
234
+ const ctx = {
235
+ task: { id: 't1', name: 'think', description: '', status: 'open', url: '', tags: [] },
236
+ config: stubConfig(),
237
+ branchName: 'b',
238
+ subtasks: [
239
+ { id: 1, title: 'Step one', description: 'd1', status: 'pending' },
240
+ { id: 2, title: 'Step two', description: 'd2', status: 'pending' },
241
+ ],
242
+ };
243
+ const result = await (0, hooks_1.executeHook)(hooks, 'beforeThinkingTask', ctx, mockVM);
244
+ strict_1.default.equal(result.subtasks[0].title, 'Step one (edited)');
245
+ strict_1.default.equal(result.subtasks[1].title, 'Step two');
246
+ });
247
+ });
248
+ // ─── createHookVM ────────────────────────────────────────────────────────────
249
+ (0, node_test_1.describe)('createHookVM', () => {
250
+ (0, node_test_1.it)('creates a VM with all required methods', () => {
251
+ const mockProvider = {
252
+ fetchTasks: async () => [],
253
+ postComment: async () => { },
254
+ getComments: async () => [],
255
+ updateStatus: async () => { },
256
+ createTask: async () => ({ id: '1', url: '' }),
257
+ };
258
+ const mockRunner = {
259
+ name: 'test-runner',
260
+ isAvailable: () => true,
261
+ run: async () => ({ success: true, output: 'ok', error: '' }),
262
+ };
263
+ const vm = (0, hooks_1.createHookVM)(mockProvider, [mockRunner]);
264
+ strict_1.default.equal(typeof vm.runAI, 'function');
265
+ strict_1.default.equal(typeof vm.postComment, 'function');
266
+ strict_1.default.equal(typeof vm.updateStatus, 'function');
267
+ strict_1.default.equal(typeof vm.getComments, 'function');
268
+ strict_1.default.equal(typeof vm.log.info, 'function');
269
+ strict_1.default.equal(typeof vm.log.warn, 'function');
270
+ strict_1.default.equal(typeof vm.log.error, 'function');
271
+ });
272
+ (0, node_test_1.it)('runAI delegates to first available runner', async () => {
273
+ const mockProvider = {
274
+ fetchTasks: async () => [],
275
+ postComment: async () => { },
276
+ getComments: async () => [],
277
+ updateStatus: async () => { },
278
+ createTask: async () => ({ id: '1', url: '' }),
279
+ };
280
+ let capturedPrompt = '';
281
+ const mockRunner = {
282
+ name: 'test-runner',
283
+ isAvailable: () => true,
284
+ run: async (prompt) => {
285
+ capturedPrompt = prompt;
286
+ return { success: true, output: 'result', error: '' };
287
+ },
288
+ };
289
+ const vm = (0, hooks_1.createHookVM)(mockProvider, [mockRunner]);
290
+ const result = await vm.runAI('test prompt');
291
+ strict_1.default.equal(capturedPrompt, 'test prompt');
292
+ strict_1.default.equal(result.success, true);
293
+ strict_1.default.equal(result.output, 'result');
294
+ });
295
+ (0, node_test_1.it)('runAI returns failure when no runner is available', async () => {
296
+ const mockProvider = {
297
+ fetchTasks: async () => [],
298
+ postComment: async () => { },
299
+ getComments: async () => [],
300
+ updateStatus: async () => { },
301
+ createTask: async () => ({ id: '1', url: '' }),
302
+ };
303
+ const unavailableRunner = {
304
+ name: 'unavailable',
305
+ isAvailable: () => false,
306
+ run: async () => ({ success: false, output: '', error: '' }),
307
+ };
308
+ const vm = (0, hooks_1.createHookVM)(mockProvider, [unavailableRunner]);
309
+ const result = await vm.runAI('test prompt');
310
+ strict_1.default.equal(result.success, false);
311
+ strict_1.default.ok(result.error.includes('No AI runner available'));
312
+ });
313
+ (0, node_test_1.it)('postComment delegates to provider', async () => {
314
+ let capturedTaskId = '';
315
+ let capturedText = '';
316
+ const mockProvider = {
317
+ fetchTasks: async () => [],
318
+ postComment: async (taskId, text) => { capturedTaskId = taskId; capturedText = text; },
319
+ getComments: async () => [],
320
+ updateStatus: async () => { },
321
+ createTask: async () => ({ id: '1', url: '' }),
322
+ };
323
+ const vm = (0, hooks_1.createHookVM)(mockProvider, []);
324
+ await vm.postComment('task-123', 'hello');
325
+ strict_1.default.equal(capturedTaskId, 'task-123');
326
+ strict_1.default.equal(capturedText, 'hello');
327
+ });
328
+ });
329
+ //# sourceMappingURL=hooks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.js","sourceRoot":"","sources":["../../src/__tests__/hooks.test.ts"],"names":[],"mappings":"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"}