@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.
- package/.aidev/assets/86c8yjxrr/9ea11c36-311c-4022-889c-1bb0915122dc.jpg-40e6939e3b68e864260f7ae7e85bd623_exif.jpg +0 -0
- package/.aidev/assets/86c9n1mkf/65d079a2-dc39-4c4e-9ea9-964d37e0402c.jpg-a639447a10296e31cd4c85d521e9705e_exif.jpg +0 -0
- package/.env.aidev.example +105 -105
- package/CONTRIBUTING.md +78 -78
- package/LICENSE +21 -21
- package/README.md +755 -755
- package/aidev.tasks.json +1 -0
- package/dist/autoCompress.d.ts +54 -0
- package/dist/autoCompress.d.ts.map +1 -0
- package/dist/autoCompress.js +300 -0
- package/dist/autoCompress.js.map +1 -0
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/help.js +80 -80
- package/dist/commands/init.js +105 -105
- package/dist/commands/run.js +146 -146
- package/dist/github.js +27 -27
- package/dist/providers/linear.js +106 -106
- package/dist/providers/monday.js +45 -45
- package/package.json +51 -51
- package/scripts/run-tests.cjs +18 -18
package/dist/providers/linear.js
CHANGED
|
@@ -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,
|
package/dist/providers/monday.js
CHANGED
|
@@ -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.
|
|
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
|
+
}
|
package/scripts/run-tests.cjs
CHANGED
|
@@ -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);
|