/ package.json
package.json
  1  {
  2    "version": "0.6.0",
  3    "name": "radicle",
  4    "displayName": "Radicle",
  5    "description": "Bring support for the Radicle network to your VS code.",
  6    "galleryBanner": {
  7      "color": "#0A0D10",
  8      "theme": "dark"
  9    },
 10    "icon": "assets/marketplace-icon.png",
 11    "publisher": "radicle-ide-plugins-team",
 12    "author": "Konstantinos Maninakis <maninak@protonmail.com>",
 13    "contributors": [
 14      "Konstantinos Maninakis <maninak@protonmail.com>"
 15    ],
 16    "license": "./LICENSE",
 17    "repository": "https://github.com/cytechmobile/radicle-vscode-extension",
 18    "bugs": "https://app.radicle.at/nodes/seed.radicle.at/rad:z3Makm6fsQQXmpSFE43DZqwupaEhk/issues",
 19    "pricing": "Free",
 20    "engines": {
 21      "vscode": "^1.91.0",
 22      "npm": "^7"
 23    },
 24    "packageManager": "pnpm@9.0.0",
 25    "keywords": [
 26      "radicle",
 27      "git"
 28    ],
 29    "categories": [
 30      "SCM Providers"
 31    ],
 32    "scripts": {
 33      "preinstall": "npx -y only-allow pnpm",
 34      "vscode:prepublish": "npm run verify-deps && npm run lint && npm run test && npm run build",
 35      "verify-deps": "npx npm-run-all -pl verify-deps:*",
 36      "verify-deps:extension": "npx --yes pnpm@latest i --frozen-lockfile --prefer-offline",
 37      "verify-deps:webviews": "cd ./src/webviews && npm run verify-deps",
 38      "compile:extension": "esbuild ./src/extension.ts --bundle --outfile=./dist/extension.js --external:vscode --format=cjs --platform=node --target=es2020",
 39      "build": "run-p -l build:*",
 40      "build:extension": "npm run compile:extension -- --minify",
 41      "build:webviews": "cd ./src/webviews && npm run build",
 42      "dev": "npm run verify-deps && run-s dev:*",
 43      "dev:webviews": "cd ./src/webviews && npm run dev",
 44      "dev:extension": "npm run compile:extension -- --sourcemap --watch",
 45      "lint": "run-p lint:*",
 46      "lint:extension": "eslint . --ext .vue,.ts,.tsx,.js,.jsx --max-warnings 0 --cache --cache-location node_modules/.cache/eslint",
 47      "lint:webviews": "cd ./src/webviews && npm run lintfix",
 48      "test": "npm run test:typings && npm run test:unit",
 49      "test:typings": "run-p test:typings:*",
 50      "test:typings:extension": "tsc --noEmit",
 51      "test:typings:webviews": "cd ./src/webviews && npm run type-check",
 52      "test:unit": "echo \"Unit testing not yet implemented.\"",
 53      "test:e2e": "TS_NODE_PROJECT=test/e2e/tsconfig.wdio.json wdio run ./test/e2e/wdio.conf.ts"
 54    },
 55    "main": "./dist/extension.js",
 56    "activationEvents": [
 57      "onWebviewPanel:webview-patch-detail"
 58    ],
 59    "contributes": {
 60      "commands": [
 61        {
 62          "command": "radicle.troubleshootRadCliInstallation",
 63          "title": "Troubleshoot Radicle CLI (a.k.a. `rad`) Installation",
 64          "shortTitle": "Troubleshoot rad CLI",
 65          "category": "Radicle",
 66          "icon": "$(wand)",
 67          "enablement": "!radicle.isRadCliInstalled"
 68        },
 69        {
 70          "command": "radicle.sync",
 71          "title": "Synchronize Local and Network Changes",
 72          "shortTitle": "Sync",
 73          "category": "Radicle",
 74          "icon": "$(rad-sync)",
 75          "enablement": "radicle.isRadInitialized"
 76        },
 77        {
 78          "command": "radicle.fetch",
 79          "title": "Fetch Latest Changes from the Network",
 80          "shortTitle": "Fetch",
 81          "category": "Radicle",
 82          "icon": "$(rad-pull)",
 83          "enablement": "radicle.isRadInitialized"
 84        },
 85        {
 86          "command": "radicle.announce",
 87          "title": "Announce Local Changes to the Network",
 88          "shortTitle": "Announce",
 89          "category": "Radicle",
 90          "icon": "$(rad-push)",
 91          "enablement": "radicle.isRadInitialized"
 92        },
 93        {
 94          "command": "radicle.clone",
 95          "title": "Clone a Radicle Repository Locally",
 96          "shortTitle": "Clone",
 97          "category": "Radicle",
 98          "icon": "$(rad-clone)"
 99        },
100        {
101          "command": "radicle.showExtensionLog",
102          "title": "Show Everything Logged in the Output Panel",
103          "shortTitle": "Extension log",
104          "category": "Radicle",
105          "icon": "$(output)"
106        },
107        {
108          "command": "radicle.deAuthCurrentIdentity",
109          "title": "De-authenticate / Re-seal the Currently Used Radicle Identity",
110          "shortTitle": "De-auth",
111          "category": "Radicle",
112          "icon": "$(sign-out)"
113        },
114        {
115          "command": "radicle.collapsePatches",
116          "title": "Collapse All Items in Patches View",
117          "shortTitle": "Collapse Patches",
118          "category": "Radicle",
119          "icon": "$(collapse-all)",
120          "enablement": "radicle.isRadInitialized"
121        },
122        {
123          "command": "radicle.refreshAllPatches",
124          "title": "Refresh All Patch Data",
125          "shortTitle": "Refresh Patches",
126          "category": "Radicle",
127          "icon": "$(refresh)",
128          "enablement": "radicle.isRadInitialized"
129        },
130        {
131          "command": "radicle.refreshOnePatch",
132          "title": "Refresh Patch Data",
133          "shortTitle": "Refresh Patch",
134          "category": "Radicle",
135          "icon": "$(refresh)",
136          "enablement": "radicle.isRadInitialized"
137        },
138        {
139          "command": "radicle.viewPatchDetails",
140          "title": "Open Patch Details",
141          "shortTitle": "Patch Details",
142          "category": "Radicle",
143          "icon": "$(preview)",
144          "enablement": "radicle.isRadInitialized"
145        },
146        {
147          "command": "radicle.checkoutPatch",
148          "title": "Check Out Patch Branch",
149          "shortTitle": "Check Out Patch",
150          "category": "Radicle",
151          "icon": "$(check)"
152        },
153        {
154          "command": "radicle.checkoutDefaultBranch",
155          "title": "Check Out Default Git Branch",
156          "shortTitle": "Check Out Default",
157          "category": "Radicle",
158          "icon": "$(home)"
159        },
160        {
161          "command": "radicle.copyPatchId",
162          "title": "Copy Patch Identifier to Clipboard",
163          "shortTitle": "Copy id",
164          "category": "Radicle",
165          "icon": "$(copy)"
166        },
167        {
168          "command": "radicle.openOriginalVersionOfPatchedFile",
169          "title": "Open Original Version",
170          "shortTitle": "Open Original",
171          "category": "Radicle",
172          "icon": "$(go-to-file)"
173        },
174        {
175          "command": "radicle.openChangedVersionOfPatchedFile",
176          "title": "Open Changed Version",
177          "shortTitle": "Open Changed",
178          "category": "Radicle",
179          "icon": "$(go-to-file)"
180        },
181        {
182          "command": "radicle.draftizePatch",
183          "title": "Change Patch Status to Draft",
184          "shortTitle": "Draft",
185          "category": "Radicle",
186          "icon": "git-pull-request-draft",
187          "enablement": "radicle.isRadInitialized"
188        },
189        {
190          "command": "radicle.openPatch",
191          "title": "Change Patch Status to Open",
192          "shortTitle": "Open",
193          "category": "Radicle",
194          "icon": "git-pull-request",
195          "enablement": "radicle.isRadInitialized"
196        },
197        {
198          "command": "radicle.archivePatch",
199          "title": "Change Patch Status to Archived",
200          "shortTitle": "Archive",
201          "category": "Radicle",
202          "icon": "git-pull-request-closed",
203          "enablement": "radicle.isRadInitialized"
204        }
205      ],
206      "menus": {
207        "commandPalette": [
208          {
209            "command": "radicle.viewPatchDetails",
210            "when": "false"
211          },
212          {
213            "command": "radicle.refreshOnePatch",
214            "when": "false"
215          },
216          {
217            "command": "radicle.checkoutPatch",
218            "when": "false"
219          },
220          {
221            "command": "radicle.copyPatchId",
222            "when": "false"
223          },
224          {
225            "command": "radicle.openOriginalVersionOfPatchedFile",
226            "when": "false"
227          },
228          {
229            "command": "radicle.openChangedVersionOfPatchedFile",
230            "when": "false"
231          },
232          {
233            "command": "radicle.draftizePatch",
234            "when": "false"
235          },
236          {
237            "command": "radicle.openPatch",
238            "when": "false"
239          },
240          {
241            "command": "radicle.archivePatch",
242            "when": "false"
243          }
244        ],
245        "scm/title": [
246          {
247            "command": "radicle.sync",
248            "group": "navigation",
249            "when": "radicle.isRadInitialized"
250          },
251          {
252            "submenu": "submenu-scm-radicle"
253          }
254        ],
255        "view/title": [
256          {
257            "command": "radicle.refreshAllPatches",
258            "when": "view == patches-view",
259            "group": "navigation@1"
260          }
261        ],
262        "view/item/context": [
263          {
264            "command": "radicle.viewPatchDetails",
265            "when": "view == patches-view && viewItem =~ /patch/",
266            "group": "inline@1"
267          },
268          {
269            "command": "radicle.viewPatchDetails",
270            "when": "view == patches-view && viewItem =~ /patch/",
271            "group": "contextMenu.A@1"
272          },
273          {
274            "command": "radicle.refreshOnePatch",
275            "when": "view == patches-view && viewItem =~ /patch/",
276            "group": "contextMenu.A@2"
277          },
278          {
279            "command": "radicle.checkoutPatch",
280            "when": "view == patches-view && viewItem =~ /patch/ && viewItem =~ /:checked-out-false/",
281            "group": "inline@2"
282          },
283          {
284            "command": "radicle.checkoutPatch",
285            "when": "view == patches-view && viewItem =~ /patch/ && viewItem =~ /:checked-out-false/",
286            "group": "contextMenu.B@1"
287          },
288          {
289            "command": "radicle.checkoutDefaultBranch",
290            "when": "view == patches-view && viewItem =~ /patch/ && viewItem =~ /:checked-out-true/",
291            "group": "contextMenu.B@1"
292          },
293          {
294            "command": "radicle.draftizePatch",
295            "when": "view == patches-view && viewItem =~ /patch/ && viewItem =~ /:status-editable/  && (viewItem =~ /:status-open/ || viewItem =~ /:status-archived/)",
296            "group": "contextMenu.C@1"
297          },
298          {
299            "command": "radicle.openPatch",
300            "when": "view == patches-view && viewItem =~ /patch/ && viewItem =~ /:status-editable/ && (viewItem =~ /:status-draft/ || viewItem =~ /:status-archived/)",
301            "group": "contextMenu.C@2"
302          },
303          {
304            "command": "radicle.archivePatch",
305            "when": "view == patches-view && viewItem =~ /patch/ && viewItem =~ /:status-editable/ && (viewItem =~ /:status-draft/ || viewItem =~ /:status-open/)",
306            "group": "contextMenu.C@3"
307          },
308          {
309            "command": "radicle.copyPatchId",
310            "when": "view == patches-view && viewItem =~ /patch/",
311            "group": "contextMenu.D@1"
312          },
313          {
314            "command": "radicle.checkoutDefaultBranch",
315            "when": "view == patches-view && viewItem =~ /patch/ && viewItem =~ /:checked-out-true/",
316            "group": "inline@2"
317          },
318          {
319            "command": "radicle.openOriginalVersionOfPatchedFile",
320            "when": "view == patches-view && viewItem =~ /filechange/ && viewItem =~ /:(deleted|modified|copied|moved)/",
321            "group": "contextMenu.diff@1"
322          },
323          {
324            "command": "radicle.openChangedVersionOfPatchedFile",
325            "when": "view == patches-view && viewItem =~ /filechange/ && viewItem =~ /:(added|modified|copied|moved)/",
326            "group": "contextMenu.diff@2"
327          }
328        ],
329        "submenu-scm-radicle": [
330          {
331            "command": "radicle.sync",
332            "when": "radicle.isRadInitialized"
333          },
334          {
335            "command": "radicle.fetch",
336            "when": "radicle.isRadInitialized"
337          },
338          {
339            "command": "radicle.announce",
340            "when": "radicle.isRadInitialized"
341          },
342          {
343            "command": "radicle.clone"
344          }
345        ]
346      },
347      "submenus": [
348        {
349          "id": "submenu-scm-radicle",
350          "label": "Radicle",
351          "icon": "$(radicle-logo)"
352        }
353      ],
354      "viewsContainers": {
355        "activitybar": [
356          {
357            "id": "radicle",
358            "title": "Radicle",
359            "icon": "$(radicle-logo)"
360          }
361        ]
362      },
363      "views": {
364        "radicle": [
365          {
366            "id": "getting-started",
367            "contextualTitle": "Radicle",
368            "name": "Getting Started",
369            "icon": "$(radicle-logo)",
370            "initialSize": 1,
371            "when": "!radicle.isRadCliInstalled || !radicle.isRadInitialized"
372          },
373          {
374            "id": "cli-commands",
375            "contextualTitle": "Radicle",
376            "name": "CLI Commands",
377            "icon": "$(radicle-logo)",
378            "initialSize": 1,
379            "when": "radicle.isRadCliInstalled && radicle.isRadInitialized"
380          },
381          {
382            "id": "patches-view",
383            "contextualTitle": "Radicle",
384            "name": "Patches",
385            "icon": "$(git-pull-request)",
386            "initialSize": 4,
387            "when": "radicle.isRadCliInstalled && radicle.isRadInitialized",
388            "type": "tree"
389          }
390        ]
391      },
392      "viewsWelcome": [
393        {
394          "view": "getting-started",
395          "contents": "Activating extension ...",
396          "when": "!radicle.isExtensionActivated"
397        },
398        {
399          "view": "getting-started",
400          "contents": "Failed resolving the Radicle CLI binary.\nPlease ensure it is installed on your machine and either that it is globally accessible in the shell as `rad` or that its path is correctly defined in the extension's settings.\nPlease expect the extention's capabilities to remain severely limited until this issue is resolved.\n[$(wand)Troubleshoot](command:radicle.troubleshootRadCliInstallation)",
401          "when": "radicle.isExtensionActivated && !radicle.isRadCliInstalled"
402        },
403        {
404          "view": "getting-started",
405          "contents": "No folder is currently opened in your workspace.\nTo use Radicle, you must open a folder containing a Git repository.\n[Open Folder](command:workbench.action.files.openFolder)\n[$(rad-clone)Clone from Radicle](command:radicle.clone)\n",
406          "when": "radicle.isExtensionActivated && radicle.isRadCliInstalled && workspaceFolderCount == 0"
407        },
408        {
409          "view": "getting-started",
410          "contents": "The folder currently opened in your workspace is not a Git code repository.\nIn order to use Radicle with it, this folder must first be initialized as a Git code repository.\n[Initialize Repository With Git](command:git.init?%5Btrue%5D)\n[Choose a Different Folder](command:workbench.action.files.openFolder)\nTo learn more about how to use Git and source control in VS Code [read the docs](https://code.visualstudio.com/docs/sourcecontrol/overview).",
411          "when": "radicle.isExtensionActivated && radicle.isRadCliInstalled && workspaceFolderCount > 0 && gitOpenRepositoryCount == 0"
412        },
413        {
414          "view": "getting-started",
415          "contents": "The Git repository currently opened in your workspace is not yet initialized with Radicle.\nTo use Radicle with it, please run `rad init` in your terminal.\nOnce rad-initialized, this repo will have access to advanced source control, collaboration and project management capabilities powered by both Git and Radicle.\nDuring this reversible rad-initializing process you also get to choose whether your repo will be private or public, among other options.\nTo learn more [read the Radicle User Guide](https://docs.radicle.xyz/guides/user#git-going-with-repositories).",
416          "when": "radicle.isExtensionActivated && radicle.isRadCliInstalled && workspaceFolderCount > 0 && gitOpenRepositoryCount > 0 && !radicle.isRadInitialized"
417        },
418        {
419          "view": "cli-commands",
420          "contents": "Use the buttons below to perform common interactions with the Radicle network.\n[$(rad-sync) Sync](command:radicle.sync)\n[$(rad-pull) Fetch](command:radicle.fetch)\n[$(rad-push) Announce](command:radicle.announce)",
421          "enablement": "radicle.isRadCliInstalled"
422        }
423      ],
424      "icons": {
425        "radicle-logo": {
426          "description": "Radicle logo",
427          "default": {
428            "fontPath": "./assets/radicle-icons.woff",
429            "fontCharacter": "A"
430          }
431        },
432        "rad-push": {
433          "description": "Radicle-themed arrow pointing away from user",
434          "default": {
435            "fontPath": "./assets/radicle-icons.woff",
436            "fontCharacter": "B"
437          }
438        },
439        "rad-pull": {
440          "description": "Radicle-themed arrow pointing towards user",
441          "default": {
442            "fontPath": "./assets/radicle-icons.woff",
443            "fontCharacter": "C"
444          }
445        },
446        "rad-sync": {
447          "description": "Radicle-themed circulating arrows",
448          "default": {
449            "fontPath": "./assets/radicle-icons.woff",
450            "fontCharacter": "D"
451          }
452        },
453        "rad-spread": {
454          "description": "Radicle-themed node propagating to further nodes",
455          "default": {
456            "fontPath": "./assets/radicle-icons.woff",
457            "fontCharacter": "E"
458          }
459        },
460        "rad-clone": {
461          "description": "Radicle-themed book with a copy of it on the side",
462          "default": {
463            "fontPath": "./assets/radicle-icons.woff",
464            "fontCharacter": "F"
465          }
466        }
467      },
468      "colors": [
469        {
470          "id": "issue.open",
471          "defaults": {
472            "dark": "#57ab5a",
473            "light": "#4c954f",
474            "highContrast": "editor.foreground",
475            "highContrastLight": "editor.foreground"
476          },
477          "description": "The color used for indicating that a Radicle Issue is open."
478        },
479        {
480          "id": "issue.closed",
481          "defaults": {
482            "dark": "#986ee2",
483            "light": "#825ec0",
484            "highContrast": "editor.foreground",
485            "highContrastLight": "editor.foreground"
486          },
487          "description": "The color used for indicating that a Radicle Issue is closed."
488        },
489        {
490          "id": "patch.draft",
491          "defaults": {
492            "dark": "#8999a8",
493            "light": "#75828f",
494            "highContrast": "editor.foreground",
495            "highContrastLight": "editor.foreground"
496          },
497          "description": "The color used for indicating that a Radicle Patch is a draft."
498        },
499        {
500          "id": "patch.open",
501          "defaults": {
502            "dark": "issue.open",
503            "light": "issue.open",
504            "highContrast": "editor.foreground",
505            "highContrastLight": "editor.foreground"
506          },
507          "description": "The color used for indicating that a Radicle Patch is open."
508        },
509        {
510          "id": "patch.archived",
511          "defaults": {
512            "dark": "#dd655f",
513            "light": "#c74942",
514            "highContrast": "editor.foreground",
515            "highContrastLight": "editor.foreground"
516          },
517          "description": "The color used for indicating that a Radicle Patch is archived."
518        },
519        {
520          "id": "patch.merged",
521          "defaults": {
522            "dark": "issue.closed",
523            "light": "issue.closed",
524            "highContrast": "editor.foreground",
525            "highContrastLight": "editor.foreground"
526          },
527          "description": "The color used for indicating that a Radicle Patch is merged."
528        }
529      ],
530      "configuration": [
531        {
532          "properties": {
533            "radicle.hideTempFiles": {
534              "scope": "application",
535              "type": "boolean",
536              "default": "true",
537              "description": "Exclude temporary files generated by the extension (e.g. old/new versions of files changed in patches) from being listed among the recently opened or in search."
538            }
539          }
540        },
541        {
542          "title": "Advanced",
543          "properties": {
544            "radicle.advanced.pathToRadBinary": {
545              "scope": "machine-overridable",
546              "type": "string",
547              "pattern": "^$|^(/[^/ ]*)+/?$",
548              "patternErrorMessage": "Current input doesn't match any supported path patterns.",
549              "default": "",
550              "markdownDescription": "Specifies the _absolute_ path to the Radicle CLI binary stored on your machine. \n\nLeave empty to use the default path for your OS or if command `rad` is already globally available in your shell."
551            },
552            "radicle.advanced.pathToNodeHome": {
553              "scope": "machine-overridable",
554              "type": "string",
555              "default": "",
556              "markdownDescription": "Specifies the path to the Radicle node's home directory. \n\nLeave empty to use the default path or if environment variable `RAD_HOME` is already globally available in your shell."
557            },
558            "radicle.advanced.httpApiEndpoint": {
559              "scope": "machine-overridable",
560              "type": "string",
561              "default": "http://127.0.0.1:8080",
562              "format": "uri",
563              "markdownDescription": "Specifies the endpoint to the root of the Radicle HTTP API connected to a seed node. This is commonly served via `radicle-httpd` and can be any Fully-Qualified Domain Name (FQDN) i.e. $protocol://$host:$port/$path ."
564            }
565          }
566        }
567      ]
568    },
569    "lint-staged": {
570      "*.{vue,ts,tsx,js,jsx}": "eslint --fix --max-warnings 0 --cache --cache-location node_modules/.cache/eslint"
571    },
572    "dependencies": {
573      "@vue/reactivity": "^3.4.20",
574      "javascript-time-ago": "^2.5.9",
575      "lodash": "^4.17.21",
576      "ofetch": "^1.3.3",
577      "pinia": "^2.1.7"
578    },
579    "devDependencies": {
580      "@antfu/eslint-config": "^0.39.8",
581      "@total-typescript/ts-reset": "^0.5.1",
582      "@types/javascript-time-ago": "^2.0.8",
583      "@types/lodash": "^4.17.6",
584      "@types/mocha": "^10.0.9",
585      "@types/node": "^20.11.21",
586      "@types/vscode": "^1.91.0",
587      "@wdio/cli": "^8.41.0",
588      "@wdio/globals": "^8.41.0",
589      "@wdio/local-runner": "^8.41.0",
590      "@wdio/mocha-framework": "^8.41.0",
591      "@wdio/spec-reporter": "^8.41.0",
592      "@wdio/types": "^8.41.0",
593      "esbuild": "^0.23.0",
594      "eslint": "^8.57.0",
595      "eslint-config-prettier": "^8.10.0",
596      "eslint-plugin-jasmine": "^4.2.2",
597      "eslint-plugin-prettier-vue": "^4.2.0",
598      "eslint-plugin-tailwindcss": "^3.14.3",
599      "eslint-plugin-vue-scoped-css": "^2.7.2",
600      "npm-run-all": "^4.1.5",
601      "simple-git-hooks": "^2.9.0",
602      "ts-node": "^10.9.2",
603      "ts-xor": "^1.3.0",
604      "typescript": "^5.3.3",
605      "wdio-vscode-service": "^6.1.2",
606      "webdriverio": "^8.41.0",
607      "zx": "^8.1.9"
608    },
609    "simple-git-hooks": {
610      "pre-commit": "npm run lint"
611    },
612    "private": true
613  }