@qelos/aidev 0.7.2 → 0.7.3

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.
@@ -43,10 +43,10 @@ class LinearProvider {
43
43
  this.resolvedTeamId = this.teamIdInput;
44
44
  return this.resolvedTeamId;
45
45
  }
46
- const query = `
47
- query Team($id: String!) {
48
- team(id: $id) { id }
49
- }
46
+ const query = `
47
+ query Team($id: String!) {
48
+ team(id: $id) { id }
49
+ }
50
50
  `;
51
51
  const data = await this.graphql(query, { id: this.teamIdInput });
52
52
  if (!data.team?.id) {
@@ -78,16 +78,16 @@ class LinearProvider {
78
78
  return raw.data;
79
79
  }
80
80
  async fetchWorkflowStates() {
81
- const query = `
82
- query WorkflowStates($filter: WorkflowStateFilter) {
83
- workflowStates(filter: $filter) {
84
- nodes {
85
- id
86
- name
87
- type
88
- }
89
- }
90
- }
81
+ const query = `
82
+ query WorkflowStates($filter: WorkflowStateFilter) {
83
+ workflowStates(filter: $filter) {
84
+ nodes {
85
+ id
86
+ name
87
+ type
88
+ }
89
+ }
90
+ }
91
91
  `;
92
92
  const teamId = await this.resolveTeamId();
93
93
  const data = await this.graphql(query, { filter: { team: { id: { eq: teamId } } } });
@@ -96,21 +96,21 @@ class LinearProvider {
96
96
  async fetchTasks() {
97
97
  const teamId = await this.resolveTeamId();
98
98
  logger_1.logger.debug(`Fetching Linear issues for team ${teamId} with label "${this.label}"`);
99
- const query = `
100
- query Issues($filter: IssueFilter) {
101
- issues(filter: $filter, first: 100) {
102
- nodes {
103
- id
104
- identifier
105
- title
106
- description
107
- url
108
- state { id name type }
109
- priority
110
- labels { nodes { name } }
111
- }
112
- }
113
- }
99
+ const query = `
100
+ query Issues($filter: IssueFilter) {
101
+ issues(filter: $filter, first: 100) {
102
+ nodes {
103
+ id
104
+ identifier
105
+ title
106
+ description
107
+ url
108
+ state { id name type }
109
+ priority
110
+ labels { nodes { name } }
111
+ }
112
+ }
113
+ }
114
114
  `;
115
115
  const filter = {
116
116
  team: { id: { eq: teamId } },
@@ -141,13 +141,13 @@ class LinearProvider {
141
141
  async postComment(taskId, text) {
142
142
  logger_1.logger.debug(`Posting comment to Linear issue ${taskId}`);
143
143
  const issueId = await this.resolveIssueId(taskId);
144
- const mutation = `
145
- mutation CreateComment($input: CommentCreateInput!) {
146
- commentCreate(input: $input) {
147
- success
148
- comment { id }
149
- }
150
- }
144
+ const mutation = `
145
+ mutation CreateComment($input: CommentCreateInput!) {
146
+ commentCreate(input: $input) {
147
+ success
148
+ comment { id }
149
+ }
150
+ }
151
151
  `;
152
152
  await this.graphql(mutation, {
153
153
  input: { issueId, body: text },
@@ -156,19 +156,19 @@ class LinearProvider {
156
156
  async getComments(taskId) {
157
157
  logger_1.logger.debug(`Fetching comments for Linear issue ${taskId}`);
158
158
  const issueId = await this.resolveIssueId(taskId);
159
- const query = `
160
- query IssueComments($id: String!) {
161
- issue(id: $id) {
162
- comments {
163
- nodes {
164
- id
165
- body
166
- user { name id }
167
- createdAt
168
- }
169
- }
170
- }
171
- }
159
+ const query = `
160
+ query IssueComments($id: String!) {
161
+ issue(id: $id) {
162
+ comments {
163
+ nodes {
164
+ id
165
+ body
166
+ user { name id }
167
+ createdAt
168
+ }
169
+ }
170
+ }
171
+ }
172
172
  `;
173
173
  const data = await this.graphql(query, { id: issueId });
174
174
  const nodes = data.issue?.comments?.nodes ?? [];
@@ -186,12 +186,12 @@ class LinearProvider {
186
186
  if (match) {
187
187
  const teamKey = match[1].toUpperCase();
188
188
  const number = Number(match[2]);
189
- const query = `
190
- query IssueByIdentifier($filter: IssueFilter) {
191
- issues(filter: $filter, first: 1) {
192
- nodes { id }
193
- }
194
- }
189
+ const query = `
190
+ query IssueByIdentifier($filter: IssueFilter) {
191
+ issues(filter: $filter, first: 1) {
192
+ nodes { id }
193
+ }
194
+ }
195
195
  `;
196
196
  const data = await this.graphql(query, {
197
197
  filter: { team: { key: { eq: teamKey } }, number: { eq: number } },
@@ -200,12 +200,12 @@ class LinearProvider {
200
200
  if (id)
201
201
  return id;
202
202
  }
203
- const byIdQuery = `
204
- query Issue($id: String!) {
205
- issue(id: $id) {
206
- id
207
- }
208
- }
203
+ const byIdQuery = `
204
+ query Issue($id: String!) {
205
+ issue(id: $id) {
206
+ id
207
+ }
208
+ }
209
209
  `;
210
210
  const byId = await this.graphql(byIdQuery, { id: identifier });
211
211
  if (byId.issue?.id)
@@ -241,12 +241,12 @@ class LinearProvider {
241
241
  throw new Error(`Linear: no workflow state matching "${status}". Available names: ${names}. Available types: ${types}`);
242
242
  }
243
243
  const issueId = await this.resolveIssueId(taskId);
244
- const mutation = `
245
- mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) {
246
- issueUpdate(id: $id, input: $input) {
247
- success
248
- }
249
- }
244
+ const mutation = `
245
+ mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) {
246
+ issueUpdate(id: $id, input: $input) {
247
+ success
248
+ }
249
+ }
250
250
  `;
251
251
  await this.graphql(mutation, {
252
252
  id: issueId,
@@ -256,24 +256,24 @@ class LinearProvider {
256
256
  async removeTag(taskId, tag) {
257
257
  logger_1.logger.debug(`Removing label "${tag}" from Linear issue ${taskId}`);
258
258
  const issueId = await this.resolveIssueId(taskId);
259
- const query = `
260
- query IssueLabels($id: String!) {
261
- issue(id: $id) {
262
- labels { nodes { id name } }
263
- }
264
- }
259
+ const query = `
260
+ query IssueLabels($id: String!) {
261
+ issue(id: $id) {
262
+ labels { nodes { id name } }
263
+ }
264
+ }
265
265
  `;
266
266
  const data = await this.graphql(query, { id: issueId });
267
267
  const want = tag.toLowerCase();
268
268
  const label = data.issue?.labels.nodes.find((l) => l.name.toLowerCase() === want);
269
269
  if (!label)
270
270
  return;
271
- const mutation = `
272
- mutation IssueRemoveLabel($id: String!, $labelId: String!) {
273
- issueRemoveLabel(id: $id, labelId: $labelId) {
274
- success
275
- }
276
- }
271
+ const mutation = `
272
+ mutation IssueRemoveLabel($id: String!, $labelId: String!) {
273
+ issueRemoveLabel(id: $id, labelId: $labelId) {
274
+ success
275
+ }
276
+ }
277
277
  `;
278
278
  await this.graphql(mutation, {
279
279
  id: issueId,
@@ -281,13 +281,13 @@ class LinearProvider {
281
281
  });
282
282
  }
283
283
  async fetchTeamLabels() {
284
- const query = `
285
- query IssueLabels($filter: IssueLabelFilter, $after: String) {
286
- issueLabels(filter: $filter, first: 250, after: $after) {
287
- nodes { id name }
288
- pageInfo { hasNextPage endCursor }
289
- }
290
- }
284
+ const query = `
285
+ query IssueLabels($filter: IssueLabelFilter, $after: String) {
286
+ issueLabels(filter: $filter, first: 250, after: $after) {
287
+ nodes { id name }
288
+ pageInfo { hasNextPage endCursor }
289
+ }
290
+ }
291
291
  `;
292
292
  const teamId = await this.resolveTeamId();
293
293
  const all = [];
@@ -332,13 +332,13 @@ class LinearProvider {
332
332
  return map;
333
333
  };
334
334
  let byName = indexByName(existing);
335
- const createMutation = `
336
- mutation IssueLabelCreate($input: IssueLabelCreateInput!) {
337
- issueLabelCreate(input: $input) {
338
- success
339
- issueLabel { id name }
340
- }
341
- }
335
+ const createMutation = `
336
+ mutation IssueLabelCreate($input: IssueLabelCreateInput!) {
337
+ issueLabelCreate(input: $input) {
338
+ success
339
+ issueLabel { id name }
340
+ }
341
+ }
342
342
  `;
343
343
  const ids = [];
344
344
  for (const name of wanted) {
@@ -383,12 +383,12 @@ class LinearProvider {
383
383
  const displayNameCandidate = angleMatch
384
384
  ? value.slice(0, angleMatch.index).trim()
385
385
  : value.includes('@') ? '' : value;
386
- const query = `
387
- query Users($filter: UserFilter) {
388
- users(filter: $filter, first: 2) {
389
- nodes { id email displayName }
390
- }
391
- }
386
+ const query = `
387
+ query Users($filter: UserFilter) {
388
+ users(filter: $filter, first: 2) {
389
+ nodes { id email displayName }
390
+ }
391
+ }
392
392
  `;
393
393
  try {
394
394
  if (emailCandidate) {
@@ -418,13 +418,13 @@ class LinearProvider {
418
418
  }
419
419
  async createTask(params) {
420
420
  const teamId = await this.resolveTeamId();
421
- const mutation = `
422
- mutation IssueCreate($input: IssueCreateInput!) {
423
- issueCreate(input: $input) {
424
- success
425
- issue { id identifier url }
426
- }
427
- }
421
+ const mutation = `
422
+ mutation IssueCreate($input: IssueCreateInput!) {
423
+ issueCreate(input: $input) {
424
+ success
425
+ issue { id identifier url }
426
+ }
427
+ }
428
428
  `;
429
429
  const input = {
430
430
  teamId,
@@ -53,21 +53,21 @@ class MondayProvider {
53
53
  }
54
54
  async fetchTasks() {
55
55
  logger_1.logger.debug(`Fetching items from Monday board ${this.boardId}`);
56
- const query = `
57
- query ($boardId: ID!, $limit: Int!) {
58
- boards(ids: [$boardId]) {
59
- items_page(limit: $limit) {
60
- cursor
61
- items {
62
- id
63
- name
64
- url
65
- description { description }
66
- column_values { id value text }
67
- }
68
- }
69
- }
70
- }
56
+ const query = `
57
+ query ($boardId: ID!, $limit: Int!) {
58
+ boards(ids: [$boardId]) {
59
+ items_page(limit: $limit) {
60
+ cursor
61
+ items {
62
+ id
63
+ name
64
+ url
65
+ description { description }
66
+ column_values { id value text }
67
+ }
68
+ }
69
+ }
70
+ }
71
71
  `;
72
72
  const data = await this.graphql(query, {
73
73
  boardId: this.boardId,
@@ -102,10 +102,10 @@ class MondayProvider {
102
102
  }
103
103
  async postComment(taskId, text) {
104
104
  logger_1.logger.debug(`Posting update to Monday item ${taskId}`);
105
- const mutation = `
106
- mutation ($itemId: ID!, $body: String!) {
107
- create_update(item_id: $itemId, body: $body) { id }
108
- }
105
+ const mutation = `
106
+ mutation ($itemId: ID!, $body: String!) {
107
+ create_update(item_id: $itemId, body: $body) { id }
108
+ }
109
109
  `;
110
110
  await this.graphql(mutation, {
111
111
  itemId: taskId,
@@ -114,18 +114,18 @@ class MondayProvider {
114
114
  }
115
115
  async getComments(taskId) {
116
116
  logger_1.logger.debug(`Fetching updates for Monday item ${taskId}`);
117
- const query = `
118
- query ($itemId: ID!) {
119
- items(ids: [$itemId]) {
120
- updates(limit: 100) {
121
- id
122
- text_body
123
- body
124
- created_at
125
- creator { id name }
126
- }
127
- }
128
- }
117
+ const query = `
118
+ query ($itemId: ID!) {
119
+ items(ids: [$itemId]) {
120
+ updates(limit: 100) {
121
+ id
122
+ text_body
123
+ body
124
+ created_at
125
+ creator { id name }
126
+ }
127
+ }
128
+ }
129
129
  `;
130
130
  const data = await this.graphql(query, { itemId: taskId });
131
131
  const item = data.items?.[0];
@@ -141,12 +141,12 @@ class MondayProvider {
141
141
  return comments;
142
142
  }
143
143
  async fetchAvailableStatuses() {
144
- const query = `
145
- query ($boardId: ID!) {
146
- boards(ids: [$boardId]) {
147
- columns { id settings_str }
148
- }
149
- }
144
+ const query = `
145
+ query ($boardId: ID!) {
146
+ boards(ids: [$boardId]) {
147
+ columns { id settings_str }
148
+ }
149
+ }
150
150
  `;
151
151
  const data = await this.graphql(query, { boardId: this.boardId });
152
152
  const col = data.boards?.[0]?.columns?.find((c) => c.id === this.statusColumnId);
@@ -162,10 +162,10 @@ class MondayProvider {
162
162
  }
163
163
  async updateStatus(taskId, status) {
164
164
  logger_1.logger.debug(`Updating Monday item ${taskId} status to "${status}"`);
165
- const mutation = `
166
- mutation ($boardId: ID!, $itemId: ID!, $columnId: String!, $value: String!) {
167
- change_column_value(board_id: $boardId, item_id: $itemId, column_id: $columnId, value: $value) { id }
168
- }
165
+ const mutation = `
166
+ mutation ($boardId: ID!, $itemId: ID!, $columnId: String!, $value: String!) {
167
+ change_column_value(board_id: $boardId, item_id: $itemId, column_id: $columnId, value: $value) { id }
168
+ }
169
169
  `;
170
170
  const value = JSON.stringify({ label: status });
171
171
  await this.graphql(mutation, {
@@ -177,10 +177,10 @@ class MondayProvider {
177
177
  }
178
178
  async createTask(params) {
179
179
  const groupId = this.groupId || 'topics';
180
- const mutation = `
181
- mutation ($boardId: ID!, $groupId: String!, $itemName: String!, $columnValues: JSON) {
182
- create_item(board_id: $boardId, group_id: $groupId, item_name: $itemName, column_values: $columnValues) { id }
183
- }
180
+ const mutation = `
181
+ mutation ($boardId: ID!, $groupId: String!, $itemName: String!, $columnValues: JSON) {
182
+ create_item(board_id: $boardId, group_id: $groupId, item_name: $itemName, column_values: $columnValues) { id }
183
+ }
184
184
  `;
185
185
  const columnValues = {};
186
186
  if (this.statusColumnId) {
package/package.json CHANGED
@@ -1,51 +1,51 @@
1
- {
2
- "name": "@qelos/aidev",
3
- "version": "0.7.2",
4
- "description": "AI-powered task executor — polls ClickUp (and more) to implement tasks with Claude, Cursor, Windsurf, or Antigravity",
5
- "type": "commonjs",
6
- "bin": {
7
- "aidev": "dist/cli.js"
8
- },
9
- "main": "./dist/cli.js",
10
- "engines": {
11
- "node": ">=22.0.0"
12
- },
13
- "scripts": {
14
- "build": "tsc && node -e \"if(process.platform!=='win32')require('node:fs').chmodSync('dist/cli.js',0o755)\"",
15
- "dev": "tsx src/cli.ts",
16
- "test": "node scripts/run-tests.cjs",
17
- "prepublishOnly": "npm run build"
18
- },
19
- "keywords": [
20
- "ai",
21
- "cli",
22
- "clickup",
23
- "claude",
24
- "cursor",
25
- "automation"
26
- ],
27
- "author": "",
28
- "license": "MIT",
29
- "repository": {
30
- "type": "git",
31
- "url": "git+https://github.com/qelos-io/aidev.git"
32
- },
33
- "bugs": {
34
- "url": "https://github.com/qelos-io/aidev/issues"
35
- },
36
- "homepage": "https://github.com/qelos-io/aidev#readme",
37
- "publishConfig": {
38
- "access": "public"
39
- },
40
- "dependencies": {
41
- "chalk": "^4.1.2",
42
- "commander": "^12.0.0",
43
- "dotenv": "^16.4.0",
44
- "jiti": "^2.6.1"
45
- },
46
- "devDependencies": {
47
- "@types/node": "^22.0.0",
48
- "tsx": "^4.0.0",
49
- "typescript": "^5.0.0"
50
- }
51
- }
1
+ {
2
+ "name": "@qelos/aidev",
3
+ "version": "0.7.3",
4
+ "description": "AI-powered task executor — polls ClickUp (and more) to implement tasks with Claude, Cursor, Windsurf, or Antigravity",
5
+ "type": "commonjs",
6
+ "bin": {
7
+ "aidev": "dist/cli.js"
8
+ },
9
+ "main": "./dist/cli.js",
10
+ "engines": {
11
+ "node": ">=22.0.0"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc && node -e \"if(process.platform!=='win32')require('node:fs').chmodSync('dist/cli.js',0o755)\"",
15
+ "dev": "tsx src/cli.ts",
16
+ "test": "node scripts/run-tests.cjs",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "ai",
21
+ "cli",
22
+ "clickup",
23
+ "claude",
24
+ "cursor",
25
+ "automation"
26
+ ],
27
+ "author": "",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/qelos-io/aidev.git"
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/qelos-io/aidev/issues"
35
+ },
36
+ "homepage": "https://github.com/qelos-io/aidev#readme",
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "dependencies": {
41
+ "chalk": "^4.1.2",
42
+ "commander": "^12.0.0",
43
+ "dotenv": "^16.4.0",
44
+ "jiti": "^2.6.1"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.0.0",
48
+ "tsx": "^4.0.0",
49
+ "typescript": "^5.0.0"
50
+ }
51
+ }
@@ -1,18 +1,18 @@
1
- 'use strict';
2
-
3
- const { spawnSync } = require('node:child_process');
4
- const { globSync } = require('node:fs');
5
- const path = require('node:path');
6
-
7
- const root = path.join(__dirname, '..');
8
- const files = globSync('src/__tests__/**/*.test.ts', { cwd: root }).sort();
9
- if (files.length === 0) {
10
- console.error('No test files found under src/__tests__');
11
- process.exit(1);
12
- }
13
- const abs = files.map((f) => path.join(root, f));
14
- const r = spawnSync(process.execPath, ['--require', 'tsx/cjs', '--test', ...abs], {
15
- cwd: root,
16
- stdio: 'inherit',
17
- });
18
- process.exit(r.status === null ? 1 : r.status);
1
+ 'use strict';
2
+
3
+ const { spawnSync } = require('node:child_process');
4
+ const { globSync } = require('node:fs');
5
+ const path = require('node:path');
6
+
7
+ const root = path.join(__dirname, '..');
8
+ const files = globSync('src/__tests__/**/*.test.ts', { cwd: root }).sort();
9
+ if (files.length === 0) {
10
+ console.error('No test files found under src/__tests__');
11
+ process.exit(1);
12
+ }
13
+ const abs = files.map((f) => path.join(root, f));
14
+ const r = spawnSync(process.execPath, ['--require', 'tsx/cjs', '--test', ...abs], {
15
+ cwd: root,
16
+ stdio: 'inherit',
17
+ });
18
+ process.exit(r.status === null ? 1 : r.status);