duoops 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +181 -0
  3. package/bin/dev.cmd +3 -0
  4. package/bin/dev.js +7 -0
  5. package/bin/run.cmd +3 -0
  6. package/bin/run.js +8 -0
  7. package/dist/commands/act.d.ts +12 -0
  8. package/dist/commands/act.js +61 -0
  9. package/dist/commands/ask.d.ts +8 -0
  10. package/dist/commands/ask.js +22 -0
  11. package/dist/commands/init.d.ts +5 -0
  12. package/dist/commands/init.js +97 -0
  13. package/dist/commands/job/logs.d.ts +13 -0
  14. package/dist/commands/job/logs.js +26 -0
  15. package/dist/commands/measure/calculate.d.ts +19 -0
  16. package/dist/commands/measure/calculate.js +208 -0
  17. package/dist/commands/measure/component.d.ts +5 -0
  18. package/dist/commands/measure/component.js +23 -0
  19. package/dist/commands/measure/seed.d.ts +5 -0
  20. package/dist/commands/measure/seed.js +62 -0
  21. package/dist/commands/pipelines/list.d.ts +14 -0
  22. package/dist/commands/pipelines/list.js +62 -0
  23. package/dist/commands/pipelines/show.d.ts +13 -0
  24. package/dist/commands/pipelines/show.js +68 -0
  25. package/dist/commands/portal.d.ts +8 -0
  26. package/dist/commands/portal.js +139 -0
  27. package/dist/commands/undo.d.ts +5 -0
  28. package/dist/commands/undo.js +35 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.js +1 -0
  31. package/dist/lib/ai/agent.d.ts +6 -0
  32. package/dist/lib/ai/agent.js +139 -0
  33. package/dist/lib/ai/model.d.ts +2 -0
  34. package/dist/lib/ai/model.js +22 -0
  35. package/dist/lib/ai/tools/editing.d.ts +3 -0
  36. package/dist/lib/ai/tools/editing.js +61 -0
  37. package/dist/lib/ai/tools/filesystem.d.ts +4 -0
  38. package/dist/lib/ai/tools/filesystem.js +44 -0
  39. package/dist/lib/ai/tools/gitlab.d.ts +4 -0
  40. package/dist/lib/ai/tools/gitlab.js +81 -0
  41. package/dist/lib/ai/tools/measure.d.ts +3 -0
  42. package/dist/lib/ai/tools/measure.js +26 -0
  43. package/dist/lib/config.d.ts +18 -0
  44. package/dist/lib/config.js +72 -0
  45. package/dist/lib/gitlab/client.d.ts +6 -0
  46. package/dist/lib/gitlab/client.js +18 -0
  47. package/dist/lib/gitlab/index.d.ts +6 -0
  48. package/dist/lib/gitlab/index.js +49 -0
  49. package/dist/lib/gitlab/provider.d.ts +14 -0
  50. package/dist/lib/gitlab/provider.js +72 -0
  51. package/dist/lib/gitlab/types.d.ts +34 -0
  52. package/dist/lib/gitlab/types.js +5 -0
  53. package/dist/lib/integrations/bigquery-sink.d.ts +12 -0
  54. package/dist/lib/integrations/bigquery-sink.js +47 -0
  55. package/dist/lib/logger.d.ts +2 -0
  56. package/dist/lib/logger.js +11 -0
  57. package/dist/lib/measure/bigquery-service.d.ts +2 -0
  58. package/dist/lib/measure/bigquery-service.js +54 -0
  59. package/dist/lib/measure/carbon-calculator.d.ts +13 -0
  60. package/dist/lib/measure/carbon-calculator.js +125 -0
  61. package/dist/lib/measure/cli-utils.d.ts +2 -0
  62. package/dist/lib/measure/cli-utils.js +107 -0
  63. package/dist/lib/measure/intensity-provider.d.ts +6 -0
  64. package/dist/lib/measure/intensity-provider.js +34 -0
  65. package/dist/lib/measure/power-profile-repository.d.ts +19 -0
  66. package/dist/lib/measure/power-profile-repository.js +129 -0
  67. package/dist/lib/measure/types.d.ts +137 -0
  68. package/dist/lib/measure/types.js +1 -0
  69. package/dist/lib/measure/zone-mapper.d.ts +16 -0
  70. package/dist/lib/measure/zone-mapper.js +104 -0
  71. package/dist/lib/state.d.ts +4 -0
  72. package/dist/lib/state.js +21 -0
  73. package/dist/portal/assets/index-BP8FwWqA.css +1 -0
  74. package/dist/portal/assets/index-MU6EBerh.js +188 -0
  75. package/dist/portal/duoops.svg +4 -0
  76. package/dist/portal/index.html +24 -0
  77. package/dist/portal/vite.svg +1 -0
  78. package/oclif.manifest.json +415 -0
  79. package/package.json +103 -0
@@ -0,0 +1,4 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M22.65 14.39L18.53 1.69C18.42 1.35 17.97 1.35 17.86 1.69L15.28 9.61H8.71L6.13 1.69C6.02 1.35 5.57 1.35 5.46 1.69L1.35 14.39C1.22 14.81 1.37 15.27 1.72 15.53L12 23L22.28 15.53C22.63 15.27 22.78 14.81 22.65 14.39Z" fill="#E24329"/>
3
+ <path d="M1.35 14.39L5.46 1.69C5.57 1.35 6.02 1.35 6.13 1.69L8.71 9.61H15.28L17.86 1.69C17.97 1.35 18.42 1.35 18.53 1.69L22.65 14.39C22.78 14.81 22.63 15.27 22.28 15.53L12 23L1.72 15.53C1.37 15.27 1.22 14.81 1.35 14.39Z" stroke="#E24329" stroke-width="1.5" stroke-linejoin="round"/>
4
+ </svg>
@@ -0,0 +1,24 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/duoops.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+
8
+ <title>DuoOps Portal - CI/CD Intelligence</title>
9
+ <meta name="description" content="AI-powered dashboard for GitLab CI pipelines, job debugging, and sustainability metrics." />
10
+ <meta name="theme-color" content="#09090b" />
11
+
12
+ <!-- Open Graph / Social -->
13
+ <meta property="og:type" content="website" />
14
+ <meta property="og:title" content="DuoOps Portal" />
15
+ <meta property="og:description" content="Explainable and Sustainable CI on GitLab with AI-powered insights." />
16
+
17
+ <meta name="robots" content="noindex, nofollow" />
18
+ <script type="module" crossorigin src="/assets/index-MU6EBerh.js"></script>
19
+ <link rel="stylesheet" crossorigin href="/assets/index-BP8FwWqA.css">
20
+ </head>
21
+ <body>
22
+ <div id="root"></div>
23
+ </body>
24
+ </html>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
@@ -0,0 +1,415 @@
1
+ {
2
+ "commands": {
3
+ "act": {
4
+ "aliases": [],
5
+ "args": {
6
+ "project-id": {
7
+ "description": "GitLab project ID (or use default from duoops init)",
8
+ "name": "project-id",
9
+ "required": false
10
+ }
11
+ },
12
+ "description": "Fetch recent CI carbon metrics from BigQuery and get the agent's recommendations",
13
+ "examples": [
14
+ "<%= config.bin %> <%= command.id %>",
15
+ "<%= config.bin %> <%= command.id %> 12345 --limit 20"
16
+ ],
17
+ "flags": {
18
+ "limit": {
19
+ "char": "n",
20
+ "description": "Number of recent job records to fetch",
21
+ "name": "limit",
22
+ "default": 20,
23
+ "hasDynamicHelp": false,
24
+ "multiple": false,
25
+ "type": "option"
26
+ }
27
+ },
28
+ "hasDynamicHelp": false,
29
+ "hiddenAliases": [],
30
+ "id": "act",
31
+ "pluginAlias": "duoops",
32
+ "pluginName": "duoops",
33
+ "pluginType": "core",
34
+ "strict": true,
35
+ "enableJsonFlag": false,
36
+ "isESM": true,
37
+ "relativePath": [
38
+ "dist",
39
+ "commands",
40
+ "act.js"
41
+ ]
42
+ },
43
+ "ask": {
44
+ "aliases": [],
45
+ "args": {
46
+ "question": {
47
+ "description": "The question to ask the agent",
48
+ "name": "question",
49
+ "required": true
50
+ }
51
+ },
52
+ "description": "Ask questions about your CI/CD pipelines, logs, and sustainability",
53
+ "flags": {},
54
+ "hasDynamicHelp": false,
55
+ "hiddenAliases": [],
56
+ "id": "ask",
57
+ "pluginAlias": "duoops",
58
+ "pluginName": "duoops",
59
+ "pluginType": "core",
60
+ "strict": true,
61
+ "enableJsonFlag": false,
62
+ "isESM": true,
63
+ "relativePath": [
64
+ "dist",
65
+ "commands",
66
+ "ask.js"
67
+ ]
68
+ },
69
+ "init": {
70
+ "aliases": [],
71
+ "args": {},
72
+ "description": "Initialize the configuration for DuoOps",
73
+ "flags": {},
74
+ "hasDynamicHelp": false,
75
+ "hiddenAliases": [],
76
+ "id": "init",
77
+ "pluginAlias": "duoops",
78
+ "pluginName": "duoops",
79
+ "pluginType": "core",
80
+ "strict": true,
81
+ "enableJsonFlag": false,
82
+ "isESM": true,
83
+ "relativePath": [
84
+ "dist",
85
+ "commands",
86
+ "init.js"
87
+ ]
88
+ },
89
+ "portal": {
90
+ "aliases": [],
91
+ "args": {},
92
+ "description": "Launch the DuoOps web portal",
93
+ "flags": {
94
+ "port": {
95
+ "char": "p",
96
+ "description": "Port to run the portal on",
97
+ "name": "port",
98
+ "default": 3000,
99
+ "hasDynamicHelp": false,
100
+ "multiple": false,
101
+ "type": "option"
102
+ }
103
+ },
104
+ "hasDynamicHelp": false,
105
+ "hiddenAliases": [],
106
+ "id": "portal",
107
+ "pluginAlias": "duoops",
108
+ "pluginName": "duoops",
109
+ "pluginType": "core",
110
+ "strict": true,
111
+ "enableJsonFlag": false,
112
+ "isESM": true,
113
+ "relativePath": [
114
+ "dist",
115
+ "commands",
116
+ "portal.js"
117
+ ]
118
+ },
119
+ "undo": {
120
+ "aliases": [],
121
+ "args": {},
122
+ "description": "Undo the last edit performed by DuoOps",
123
+ "flags": {},
124
+ "hasDynamicHelp": false,
125
+ "hiddenAliases": [],
126
+ "id": "undo",
127
+ "pluginAlias": "duoops",
128
+ "pluginName": "duoops",
129
+ "pluginType": "core",
130
+ "strict": true,
131
+ "enableJsonFlag": false,
132
+ "isESM": true,
133
+ "relativePath": [
134
+ "dist",
135
+ "commands",
136
+ "undo.js"
137
+ ]
138
+ },
139
+ "job:logs": {
140
+ "aliases": [],
141
+ "args": {
142
+ "project": {
143
+ "description": "Project ID or path (e.g. group/project)",
144
+ "name": "project",
145
+ "required": true
146
+ },
147
+ "job_id": {
148
+ "description": "Job ID",
149
+ "name": "job_id",
150
+ "required": true
151
+ }
152
+ },
153
+ "description": "Get job log trace",
154
+ "examples": [
155
+ "<%= config.bin %> <%= command.id %> group/my-project 12345"
156
+ ],
157
+ "flags": {},
158
+ "hasDynamicHelp": false,
159
+ "hiddenAliases": [],
160
+ "id": "job:logs",
161
+ "pluginAlias": "duoops",
162
+ "pluginName": "duoops",
163
+ "pluginType": "core",
164
+ "strict": true,
165
+ "enableJsonFlag": false,
166
+ "isESM": true,
167
+ "relativePath": [
168
+ "dist",
169
+ "commands",
170
+ "job",
171
+ "logs.js"
172
+ ]
173
+ },
174
+ "pipelines:list": {
175
+ "aliases": [],
176
+ "args": {
177
+ "project": {
178
+ "description": "Project ID or path (e.g. group/project)",
179
+ "name": "project",
180
+ "required": false
181
+ }
182
+ },
183
+ "description": "List GitLab CI pipelines for a project",
184
+ "examples": [
185
+ "<%= config.bin %> <%= command.id %> group/my-project",
186
+ "<%= config.bin %> <%= command.id %> 123 --limit 20 --ref main"
187
+ ],
188
+ "flags": {
189
+ "limit": {
190
+ "char": "n",
191
+ "description": "Maximum number of pipelines to return",
192
+ "name": "limit",
193
+ "default": 10,
194
+ "hasDynamicHelp": false,
195
+ "multiple": false,
196
+ "type": "option"
197
+ },
198
+ "ref": {
199
+ "description": "Filter by branch or tag",
200
+ "name": "ref",
201
+ "hasDynamicHelp": false,
202
+ "multiple": false,
203
+ "type": "option"
204
+ },
205
+ "status": {
206
+ "description": "Filter by status (created, pending, running, success, failed, canceled, skipped, manual, scheduled)",
207
+ "name": "status",
208
+ "hasDynamicHelp": false,
209
+ "multiple": false,
210
+ "type": "option"
211
+ }
212
+ },
213
+ "hasDynamicHelp": false,
214
+ "hiddenAliases": [],
215
+ "id": "pipelines:list",
216
+ "pluginAlias": "duoops",
217
+ "pluginName": "duoops",
218
+ "pluginType": "core",
219
+ "strict": true,
220
+ "enableJsonFlag": false,
221
+ "isESM": true,
222
+ "relativePath": [
223
+ "dist",
224
+ "commands",
225
+ "pipelines",
226
+ "list.js"
227
+ ]
228
+ },
229
+ "pipelines:show": {
230
+ "aliases": [],
231
+ "args": {
232
+ "project": {
233
+ "description": "Project ID (e.g. 123456)",
234
+ "name": "project",
235
+ "required": true
236
+ },
237
+ "pipeline_id": {
238
+ "description": "Pipeline ID",
239
+ "name": "pipeline_id",
240
+ "required": true
241
+ }
242
+ },
243
+ "description": "Show pipeline details and jobs",
244
+ "examples": [
245
+ "<%= config.bin %> <%= command.id %> 12345 67890"
246
+ ],
247
+ "flags": {},
248
+ "hasDynamicHelp": false,
249
+ "hiddenAliases": [],
250
+ "id": "pipelines:show",
251
+ "pluginAlias": "duoops",
252
+ "pluginName": "duoops",
253
+ "pluginType": "core",
254
+ "strict": true,
255
+ "enableJsonFlag": false,
256
+ "isESM": true,
257
+ "relativePath": [
258
+ "dist",
259
+ "commands",
260
+ "pipelines",
261
+ "show.js"
262
+ ]
263
+ },
264
+ "measure:calculate": {
265
+ "aliases": [],
266
+ "args": {},
267
+ "description": "Calculate carbon emissions from CPU/RAM timeseries",
268
+ "examples": [
269
+ "<%= config.bin %> <%= command.id %> --provider gcp --machine e2-standard-4 --region us-central1 --cpu cpu.json --ram-used ram_used.json"
270
+ ],
271
+ "flags": {
272
+ "budget": {
273
+ "description": "Carbon budget in grams CO2e",
274
+ "name": "budget",
275
+ "hasDynamicHelp": false,
276
+ "multiple": false,
277
+ "type": "option"
278
+ },
279
+ "cpu-timeseries": {
280
+ "description": "Path to CPU timeseries JSON",
281
+ "name": "cpu-timeseries",
282
+ "required": true,
283
+ "hasDynamicHelp": false,
284
+ "multiple": false,
285
+ "type": "option"
286
+ },
287
+ "fail-on-budget": {
288
+ "description": "Exit with error if budget exceeded",
289
+ "name": "fail-on-budget",
290
+ "allowNo": false,
291
+ "type": "boolean"
292
+ },
293
+ "machine": {
294
+ "char": "m",
295
+ "description": "Machine type (e.g., e2-standard-4)",
296
+ "name": "machine",
297
+ "required": true,
298
+ "hasDynamicHelp": false,
299
+ "multiple": false,
300
+ "type": "option"
301
+ },
302
+ "out-json": {
303
+ "description": "Path to write JSON report",
304
+ "name": "out-json",
305
+ "hasDynamicHelp": false,
306
+ "multiple": false,
307
+ "type": "option"
308
+ },
309
+ "out-md": {
310
+ "description": "Path to write Markdown report",
311
+ "name": "out-md",
312
+ "hasDynamicHelp": false,
313
+ "multiple": false,
314
+ "type": "option"
315
+ },
316
+ "provider": {
317
+ "char": "p",
318
+ "description": "Cloud provider",
319
+ "name": "provider",
320
+ "default": "gcp",
321
+ "hasDynamicHelp": false,
322
+ "multiple": false,
323
+ "options": [
324
+ "gcp",
325
+ "aws"
326
+ ],
327
+ "type": "option"
328
+ },
329
+ "ram-size-timeseries": {
330
+ "description": "Path to RAM size timeseries JSON",
331
+ "name": "ram-size-timeseries",
332
+ "required": false,
333
+ "hasDynamicHelp": false,
334
+ "multiple": false,
335
+ "type": "option"
336
+ },
337
+ "ram-used-timeseries": {
338
+ "description": "Path to RAM used timeseries JSON",
339
+ "name": "ram-used-timeseries",
340
+ "required": true,
341
+ "hasDynamicHelp": false,
342
+ "multiple": false,
343
+ "type": "option"
344
+ },
345
+ "region": {
346
+ "char": "r",
347
+ "description": "Region (e.g., us-central1)",
348
+ "name": "region",
349
+ "required": true,
350
+ "hasDynamicHelp": false,
351
+ "multiple": false,
352
+ "type": "option"
353
+ }
354
+ },
355
+ "hasDynamicHelp": false,
356
+ "hiddenAliases": [],
357
+ "id": "measure:calculate",
358
+ "pluginAlias": "duoops",
359
+ "pluginName": "duoops",
360
+ "pluginType": "core",
361
+ "strict": true,
362
+ "enableJsonFlag": false,
363
+ "isESM": true,
364
+ "relativePath": [
365
+ "dist",
366
+ "commands",
367
+ "measure",
368
+ "calculate.js"
369
+ ]
370
+ },
371
+ "measure:component": {
372
+ "aliases": [],
373
+ "args": {},
374
+ "description": "Output the GitLab CI component configuration",
375
+ "flags": {},
376
+ "hasDynamicHelp": false,
377
+ "hiddenAliases": [],
378
+ "id": "measure:component",
379
+ "pluginAlias": "duoops",
380
+ "pluginName": "duoops",
381
+ "pluginType": "core",
382
+ "strict": true,
383
+ "enableJsonFlag": false,
384
+ "isESM": true,
385
+ "relativePath": [
386
+ "dist",
387
+ "commands",
388
+ "measure",
389
+ "component.js"
390
+ ]
391
+ },
392
+ "measure:seed": {
393
+ "aliases": [],
394
+ "args": {},
395
+ "description": "Seed the BigQuery emissions table with sample data for testing",
396
+ "flags": {},
397
+ "hasDynamicHelp": false,
398
+ "hiddenAliases": [],
399
+ "id": "measure:seed",
400
+ "pluginAlias": "duoops",
401
+ "pluginName": "duoops",
402
+ "pluginType": "core",
403
+ "strict": true,
404
+ "enableJsonFlag": false,
405
+ "isESM": true,
406
+ "relativePath": [
407
+ "dist",
408
+ "commands",
409
+ "measure",
410
+ "seed.js"
411
+ ]
412
+ }
413
+ },
414
+ "version": "0.0.0"
415
+ }
package/package.json ADDED
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "duoops",
3
+ "description": "Toolset for Explainable and Sustainable CI on Gitlab.",
4
+ "version": "0.0.0",
5
+ "author": "Younes Laaroussi",
6
+ "bin": {
7
+ "duoops": "./bin/run.js"
8
+ },
9
+ "bugs": "https://github.com/youneslaaroussi/duoops/issues",
10
+ "dependencies": {
11
+ "@ai-sdk/google-vertex": "^4.0.51",
12
+ "@ai-sdk/provider": "^3.0.8",
13
+ "@ai-sdk/provider-utils": "^4.0.14",
14
+ "@gitbeaker/rest": "^43.8.0",
15
+ "@gitlab/gitlab-ai-provider": "^3.5.0",
16
+ "@google-cloud/bigquery": "^8.1.1",
17
+ "@inquirer/prompts": "^8.2.0",
18
+ "@oclif/core": "^4",
19
+ "@oclif/plugin-help": "^6",
20
+ "@oclif/plugin-plugins": "^5",
21
+ "@radix-ui/react-dialog": "^1.1.15",
22
+ "@radix-ui/react-separator": "^1.1.8",
23
+ "ai": "^6.0.79",
24
+ "asciichart": "^1.5.25",
25
+ "axios": "^1.13.5",
26
+ "cors": "^2.8.6",
27
+ "cubic-spline": "^3.0.3",
28
+ "diff": "^8.0.3",
29
+ "express": "^5.2.1",
30
+ "kleur": "^4.1.5",
31
+ "open": "^11.0.0",
32
+ "pino": "^10.3.1",
33
+ "remark-gfm": "^4.0.1",
34
+ "zod": "^4.3.6"
35
+ },
36
+ "devDependencies": {
37
+ "@eslint/compat": "^1",
38
+ "@oclif/prettier-config": "^0.2.1",
39
+ "@oclif/test": "^4",
40
+ "@types/asciichart": "^1.5.8",
41
+ "@types/chai": "^4",
42
+ "@types/cors": "^2.8.19",
43
+ "@types/express": "^5.0.6",
44
+ "@types/mocha": "^10",
45
+ "@types/node": "^18",
46
+ "chai": "^4",
47
+ "dotenv": "^17.3.0",
48
+ "eslint": "^9",
49
+ "eslint-config-oclif": "^6",
50
+ "eslint-config-prettier": "^10",
51
+ "mocha": "^10",
52
+ "oclif": "^4",
53
+ "pino-pretty": "^13.1.3",
54
+ "shx": "^0.3.3",
55
+ "ts-node": "^10",
56
+ "typescript": "^5"
57
+ },
58
+ "engines": {
59
+ "node": ">=18.0.0"
60
+ },
61
+ "files": [
62
+ "./bin",
63
+ "./dist",
64
+ "./oclif.manifest.json"
65
+ ],
66
+ "homepage": "https://gitlab.com/youneslaaroussi/duoops",
67
+ "keywords": [
68
+ "oclif"
69
+ ],
70
+ "license": "MIT",
71
+ "main": "dist/index.js",
72
+ "type": "module",
73
+ "oclif": {
74
+ "bin": "duoops",
75
+ "dirname": "duoops",
76
+ "commands": "./dist/commands",
77
+ "plugins": [
78
+ "@oclif/plugin-help",
79
+ "@oclif/plugin-plugins"
80
+ ],
81
+ "topicSeparator": " ",
82
+ "topics": {
83
+ "pipelines": {
84
+ "description": "View and explore GitLab CI pipelines"
85
+ },
86
+ "job": {
87
+ "description": "Inspect CI job details and logs"
88
+ }
89
+ }
90
+ },
91
+ "repository": "youneslaaroussi/duoops",
92
+ "publishConfig": {
93
+ "access": "public"
94
+ },
95
+ "types": "dist/index.d.ts",
96
+ "scripts": {
97
+ "build": "shx rm -rf dist && tsc -b && pnpm --filter portal run build && shx cp -r portal/dist dist/portal",
98
+ "lint": "eslint --ignore-pattern \"portal/**\"",
99
+ "posttest": "pnpm run lint",
100
+ "test": "mocha --forbid-only \"test/**/*.test.ts\"",
101
+ "version": "oclif readme && git add README.md"
102
+ }
103
+ }