/ 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 }