package.json (27443B)
1 { 2 "$schema": "https://www.raycast.com/schemas/extension.json", 3 "name": "kill-process", 4 "title": "Kill Process", 5 "description": "Terminate processes sorted by CPU or memory usage", 6 "icon": "icon.png", 7 "author": "rolandleth", 8 "contributors": [ 9 "crazyones110", 10 "zhenpewu", 11 "Saafo", 12 "erics118", 13 "xilopaint", 14 "validate", 15 "dead_hikikomori" 16 ], 17 "license": "MIT", 18 "commands": [ 19 { 20 "name": "index", 21 "title": "Kill Process", 22 "description": "Lists all running processes, ordered by CPU or memory usage and allows (force) killing one", 23 "mode": "view" 24 } 25 ], 26 "tools": [ 27 { 28 "name": "list-processes", 29 "title": "List Processes", 30 "description": "Lists running processes with their CPU and memory usage, sorted by memory usage", 31 "instructions": "List out all running processes.\nThis tool can be called by AI to answer queries like,\n\"What processes are running right now?\"\nor \"list processes containing xyz\"\nor \"list processes containing xyz and abc\"\n\nThrows an error if no processes are found matching the search terms", 32 "input": { 33 "type": "object", 34 "properties": { 35 "searchTerm": { 36 "type": "array", 37 "items": { 38 "type": "string" 39 }, 40 "description": "Optional array of search terms to filter processes.\nFor single process search, provide an array with one element.\nExample: [\"Logi\"] will find all processes containing \"Logi\" in their name\nExample: [\"Chrome\", \"Firefox\"] will find all processes containing either \"Chrome\" or \"Firefox\"" 41 }, 42 "sortBy": { 43 "type": "string", 44 "description": "Field to sort by (defaults to 'mem')", 45 "enum": [ 46 "id", 47 "pid", 48 "cpu", 49 "mem", 50 "type", 51 "path", 52 "processName", 53 "appName" 54 ] 55 }, 56 "sortOrder": { 57 "type": "string", 58 "description": "Sort order (defaults to 'desc')", 59 "enum": [ 60 "asc", 61 "desc" 62 ] 63 } 64 }, 65 "required": [] 66 }, 67 "confirmation": false 68 }, 69 { 70 "name": "kill-process", 71 "title": "(Force) Kill Process", 72 "description": "Terminates a process by its exact name or PID (Force kill requires enabling sudo authentication with touchID: https://dev.to/siddhantkcode/enable-touch-id-authentication-for-sudo-on-macos-sonoma-14x-4d28)", 73 "instructions": "Kill a process.\nProvide the process ID to kill.\nIf the process is not found, the tool will return an error.", 74 "input": { 75 "type": "object", 76 "properties": { 77 "processName": { 78 "type": "string", 79 "description": "App name to kill" 80 }, 81 "id": { 82 "type": "number", 83 "description": "Process ID to kill" 84 }, 85 "path": { 86 "type": "string", 87 "description": "Path to the process to kill" 88 } 89 }, 90 "required": [ 91 "id" 92 ] 93 }, 94 "confirmation": true 95 } 96 ], 97 "ai": { 98 "instructions": "When handling process termination requests:\n1. For single process (e.g. 'kill Safari'):\n - Use list-processes with searchTerm: ['Safari']\n - Only kill the exact process name match (e.g., 'Safari' matches 'Safari' but not 'Safari Helper')\n - DO NOT kill helper processes even if found in the search\n - Call kill-process directly - DO NOT ask for confirmation as the tool handles it\n2. For multiple processes (e.g. 'kill UpNote and Notion'):\n - Use list-processes ONCE with all terms in the array (e.g., searchTerm: ['UpNote', 'Notion'])\n - Only kill processes that exactly match the requested names\n - DO NOT kill helper processes even if they contain the search terms\n - Call kill-process directly for each process - DO NOT ask for confirmation\n - Example: 'kill UpNote and Notion' should only kill 'UpNote' and 'Notion', not 'UpNote Helper' or 'Notion Helper'\n3. For process with related processes (e.g. 'kill Chrome with related processes'):\n - Use list-processes with the app name (e.g., searchTerm: ['Chrome'])\n - Kill main process first, then all related helper processes\n - Include processes with matching name patterns (e.g. 'Chrome Helper')\n - Only kill helpers when explicitly requested with phrases like 'with related processes' or 'and all its processes'\n - Call kill-process directly for each process - DO NOT ask for confirmation\n4. When searching for processes:\n - Use list-processes tool which returns detailed process info\n - For exact matches, compare the full processName\n - DO NOT match partial names unless explicitly looking for helpers\n - Results include: id (PID), cpu usage, memory usage, type (app/binary/prefPane)\n5. When killing processes:\n - Always provide processName and id (PID) for kill-process\n - Include the full path for better process identification\n - Call kill-process directly - the tool will handle confirmation UI\n6. Process types and special handling:\n - 'app': Main application processes (.app)\n - 'binary': Helper processes and command line tools\n - 'prefPane': System preference panes\n7. Memory and CPU considerations:\n - Can sort processes by memory (mem) or CPU usage\n - Memory is in bytes, CPU in percentage\n8. Error handling:\n - Handle cases where process is not found\n - Handle failed kill operations gracefully\n - Provide clear feedback on success/failure\n9. IMPORTANT: When killing multiple processes:\n - Always use a single list-processes call with all search terms in the array\n - DO NOT make separate list-processes calls for each process\n - Only kill processes that exactly match the requested names\n - DO NOT kill helper processes unless explicitly requested\n - DO NOT ask for confirmation - the kill-process tool handles it\n - Example: 'kill UpNote and Notion' should only kill processes named exactly 'UpNote' and 'Notion'\n10. For PID-based termination (e.g. 'kill PID 12345, 23142, 32456'):\n - When user specifies PIDs directly, bypass list-processes tool\n - Call kill-process directly for each PID\n - No need to search for process names or paths\n - Handle multiple PIDs in a single request by calling kill-process for each PID\n - Example: For 'kill PID 12345, 23142, 32456', make three separate kill-process calls with respective PIDs", 99 "evals": [ 100 { 101 "input": "@kill-process list all processes", 102 "mocks": { 103 "list-processes": [ 104 { 105 "id": 1234, 106 "pid": 1, 107 "cpu": 10.5, 108 "mem": 1024000, 109 "type": "app", 110 "path": "/Applications/Firefox.app/Contents/MacOS/Firefox", 111 "processName": "firefox", 112 "appName": "Firefox" 113 }, 114 { 115 "id": 5678, 116 "pid": 1, 117 "cpu": 5.2, 118 "mem": 512000, 119 "type": "app", 120 "path": "/Applications/Safari.app/Contents/MacOS/Safari", 121 "processName": "Safari", 122 "appName": "Safari" 123 }, 124 { 125 "id": 9012, 126 "pid": 1, 127 "cpu": 15.3, 128 "mem": 2048000, 129 "type": "binary", 130 "path": "/usr/bin/Google Chrome Helper", 131 "processName": "Google Chrome Helper", 132 "appName": "undefined" 133 }, 134 { 135 "id": 9012, 136 "pid": 1, 137 "cpu": 15.3, 138 "mem": 2048000, 139 "type": "prefPane", 140 "path": "/System/Library/PreferencePanes/Displays.prefPane", 141 "processName": "Displays", 142 "appName": "undefined" 143 } 144 ] 145 }, 146 "expected": [ 147 { 148 "callsTool": "list-processes" 149 }, 150 { 151 "meetsCriteria": "Lists running processes with their CPU and memory usage" 152 } 153 ] 154 }, 155 { 156 "input": "@kill-process kill PID 12345", 157 "mocks": { 158 "kill-process": [ 159 { 160 "success": true, 161 "message": "Killed process: (PID: 12345)" 162 } 163 ] 164 }, 165 "expected": [ 166 { 167 "callsTool": { 168 "name": "kill-process", 169 "arguments": { 170 "id": 12345 171 } 172 } 173 }, 174 { 175 "meetsCriteria": "Directly kills a process by its PID" 176 } 177 ] 178 }, 179 { 180 "input": "@kill-process list Chrome processes", 181 "mocks": { 182 "list-processes": [ 183 { 184 "id": 9012, 185 "pid": 1, 186 "cpu": 15.3, 187 "mem": 2048000, 188 "type": "app", 189 "path": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", 190 "processName": "Google Chrome", 191 "appName": "Google Chrome" 192 }, 193 { 194 "id": 9013, 195 "pid": 9012, 196 "cpu": 15.3, 197 "mem": 2048000, 198 "type": "binary", 199 "path": "/usr/bin/Google Chrome Helper", 200 "processName": "Google Chrome Helper", 201 "appName": "undefined" 202 }, 203 { 204 "id": 9014, 205 "pid": 9012, 206 "cpu": 15.3, 207 "mem": 2048000, 208 "type": "binary", 209 "path": "/usr/bin/Google Chrome Helper (Renderer)", 210 "processName": "Google Chrome Helper (Renderer)", 211 "appName": "undefined" 212 } 213 ] 214 }, 215 "expected": [ 216 { 217 "callsTool": { 218 "name": "list-processes", 219 "arguments": { 220 "searchTerm": [ 221 "Chrome" 222 ] 223 } 224 } 225 }, 226 { 227 "meetsCriteria": "Shows Chrome-related processes" 228 } 229 ] 230 }, 231 { 232 "input": "@kill-process kill Safari", 233 "mocks": { 234 "list-processes": [ 235 { 236 "id": 5678, 237 "pid": 1, 238 "cpu": 5.2, 239 "mem": 512000, 240 "type": "app", 241 "path": "/Applications/Safari.app/Contents/MacOS/Safari", 242 "processName": "Safari", 243 "appName": "Safari" 244 }, 245 { 246 "id": 9015, 247 "pid": 5678, 248 "cpu": 5.2, 249 "mem": 512000, 250 "type": "binary", 251 "path": "/usr/bin/Safari Helper", 252 "processName": "Safari Helper", 253 "appName": "Safari" 254 }, 255 { 256 "id": 9016, 257 "pid": 5678, 258 "cpu": 5.2, 259 "mem": 512000, 260 "type": "binary", 261 "path": "/usr/bin/Safari Web Content", 262 "processName": "Safari Web Content", 263 "appName": "Safari" 264 }, 265 { 266 "id": 9017, 267 "pid": 5678, 268 "cpu": 5.2, 269 "mem": 512000, 270 "type": "binary", 271 "path": "/usr/bin/Safari Plugin", 272 "processName": "Safari Plugin", 273 "appName": "Safari" 274 } 275 ], 276 "kill-process": { 277 "success": true, 278 "message": "Killed process: Safari (PID: 5678)" 279 } 280 }, 281 "expected": [ 282 { 283 "callsTool": { 284 "name": "list-processes", 285 "arguments": { 286 "searchTerm": [ 287 "Safari" 288 ] 289 } 290 } 291 }, 292 { 293 "callsTool": { 294 "name": "kill-process", 295 "arguments": { 296 "processName": "Safari", 297 "id": 5678, 298 "path": "/Applications/Safari.app/Contents/MacOS/Safari" 299 } 300 } 301 }, 302 { 303 "meetsCriteria": "Confirms killing Safari process" 304 } 305 ] 306 }, 307 { 308 "input": "@kill-process kill Notion", 309 "mocks": { 310 "list-processes": [ 311 { 312 "id": 28588, 313 "pid": 1, 314 "cpu": 2.5, 315 "mem": 1024000, 316 "type": "app", 317 "path": "/Applications/Notion.app/Contents/MacOS/Notion", 318 "processName": "Notion", 319 "appName": "Notion" 320 }, 321 { 322 "id": 28601, 323 "pid": 28588, 324 "cpu": 1.2, 325 "mem": 512000, 326 "type": "binary", 327 "path": "/Applications/Notion.app/Contents/MacOS/Notion Helper (Renderer)", 328 "processName": "Notion Helper (Renderer)", 329 "appName": "Notion" 330 } 331 ], 332 "kill-process": { 333 "success": true, 334 "message": "Killed process: Notion (PID: 28588)" 335 } 336 }, 337 "expected": [ 338 { 339 "callsTool": { 340 "name": "list-processes", 341 "arguments": { 342 "searchTerm": [ 343 "Notion" 344 ] 345 } 346 } 347 }, 348 { 349 "callsTool": { 350 "name": "kill-process", 351 "arguments": { 352 "processName": "Notion", 353 "id": 28588, 354 "path": "/Applications/Notion.app/Contents/MacOS/Notion" 355 } 356 } 357 }, 358 { 359 "meetsCriteria": "Confirms killing Notion process" 360 } 361 ] 362 }, 363 { 364 "input": "@kill-process kill Notion with related processes", 365 "mocks": { 366 "list-processes": [ 367 { 368 "id": 28588, 369 "pid": 1, 370 "cpu": 2.5, 371 "mem": 1024000, 372 "type": "app", 373 "path": "/Applications/Notion.app/Contents/MacOS/Notion", 374 "processName": "Notion", 375 "appName": "Notion" 376 }, 377 { 378 "id": 28601, 379 "pid": 28588, 380 "cpu": 1.2, 381 "mem": 512000, 382 "type": "binary", 383 "path": "/Applications/Notion.app/Contents/MacOS/Notion Helper (Renderer)", 384 "processName": "Notion Helper (Renderer)", 385 "appName": "Notion" 386 }, 387 { 388 "id": 28596, 389 "pid": 28588, 390 "cpu": 0.8, 391 "mem": 256000, 392 "type": "binary", 393 "path": "/Applications/Notion.app/Contents/MacOS/Notion Helper", 394 "processName": "Notion Helper", 395 "appName": "Notion" 396 }, 397 { 398 "id": 28592, 399 "pid": 28588, 400 "cpu": 0.5, 401 "mem": 128000, 402 "type": "binary", 403 "path": "/Applications/Notion.app/Contents/MacOS/Notion Helper (GPU)", 404 "processName": "Notion Helper (GPU)", 405 "appName": "Notion" 406 } 407 ], 408 "kill-process": [ 409 { 410 "success": true, 411 "message": "Killed process: Notion (PID: 28588)" 412 }, 413 { 414 "success": false, 415 "message": "Failed to kill process: Notion Helper (Renderer) (PID: 28601)" 416 }, 417 { 418 "success": false, 419 "message": "Failed to kill process: Notion Helper (PID: 28596)" 420 }, 421 { 422 "success": false, 423 "message": "Failed to kill process: Notion Helper (GPU) (PID: 28592)" 424 } 425 ] 426 }, 427 "expected": [ 428 { 429 "callsTool": { 430 "name": "list-processes", 431 "arguments": { 432 "searchTerm": [ 433 "Notion" 434 ] 435 } 436 } 437 }, 438 { 439 "callsTool": { 440 "name": "kill-process", 441 "arguments": { 442 "processName": "Notion", 443 "id": 28588, 444 "path": "/Applications/Notion.app/Contents/MacOS/Notion" 445 } 446 } 447 }, 448 { 449 "meetsCriteria": "Kills Notion and all its helper processes as requested, but fails to kill some of them as main process is killed first" 450 } 451 ] 452 }, 453 { 454 "input": "@kill-process kill Notion and Notion Calendar", 455 "mocks": { 456 "list-processes": [ 457 { 458 "id": 41406, 459 "pid": 1, 460 "cpu": 2.5, 461 "mem": 1024000, 462 "type": "app", 463 "path": "/Applications/Notion.app/Contents/MacOS/Notion", 464 "processName": "Notion", 465 "appName": "Notion" 466 }, 467 { 468 "id": 28757, 469 "pid": 1, 470 "cpu": 1.2, 471 "mem": 512000, 472 "type": "app", 473 "path": "/Applications/Notion Calendar.app/Contents/MacOS/Notion Calendar", 474 "processName": "Notion Calendar", 475 "appName": "Notion Calendar" 476 } 477 ], 478 "kill-process": [ 479 { 480 "success": true, 481 "message": "Killed process: Notion (PID: 41406)" 482 }, 483 { 484 "success": true, 485 "message": "Killed process: Notion Calendar (PID: 28757)" 486 } 487 ] 488 }, 489 "expected": [ 490 { 491 "callsTool": { 492 "name": "list-processes", 493 "arguments": { 494 "searchTerm": [ 495 { 496 "includes": "Notion" 497 }, 498 { 499 "includes": "Notion Calendar" 500 } 501 ] 502 } 503 } 504 }, 505 { 506 "callsTool": { 507 "name": "kill-process", 508 "arguments": { 509 "processName": "Notion", 510 "id": 41406, 511 "path": "/Applications/Notion.app/Contents/MacOS/Notion" 512 } 513 } 514 }, 515 { 516 "callsTool": { 517 "name": "kill-process", 518 "arguments": { 519 "processName": "Notion Calendar", 520 "id": 28757, 521 "path": "/Applications/Notion Calendar.app/Contents/MacOS/Notion Calendar" 522 } 523 } 524 }, 525 { 526 "meetsCriteria": "Successfully kills both Notion and Notion Calendar processes sequentially" 527 } 528 ] 529 }, 530 { 531 "input": "@kill-process kill Arc and related processes", 532 "mocks": { 533 "list-processes": [ 534 { 535 "id": 12345, 536 "pid": 1, 537 "cpu": 5, 538 "mem": 2048000, 539 "type": "app", 540 "path": "/Applications/Arc.app/Contents/MacOS/Arc", 541 "processName": "Arc", 542 "appName": "Arc" 543 }, 544 { 545 "id": 12346, 546 "pid": 12345, 547 "cpu": 2, 548 "mem": 512000, 549 "type": "binary", 550 "path": "/Applications/Arc.app/Contents/MacOS/Arc Helper", 551 "processName": "Arc Helper", 552 "appName": "Arc" 553 }, 554 { 555 "id": 12347, 556 "pid": 12345, 557 "cpu": 1.5, 558 "mem": 256000, 559 "type": "binary", 560 "path": "/Applications/Arc.app/Contents/MacOS/Arc Helper (Renderer)", 561 "processName": "Arc Helper (Renderer)", 562 "appName": "Arc" 563 }, 564 { 565 "id": 12348, 566 "pid": 12345, 567 "cpu": 1.5, 568 "mem": 256000, 569 "type": "binary", 570 "path": "/Applications/Arc.app/Contents/MacOS/Arc Helper (GPU)", 571 "processName": "Arc Helper (GPU)", 572 "appName": "Arc" 573 } 574 ], 575 "kill-process": [ 576 { 577 "success": true, 578 "message": "Killed process: Arc (PID: 12345)" 579 }, 580 { 581 "success": false, 582 "message": "Failed to kill process: Arc Helper (PID: 12346)" 583 }, 584 { 585 "success": false, 586 "message": "Failed to kill process: Arc Helper (Renderer) (PID: 12347)" 587 }, 588 { 589 "success": false, 590 "message": "Failed to kill process: Arc Helper (GPU) (PID: 12348)" 591 } 592 ] 593 }, 594 "expected": [ 595 { 596 "callsTool": { 597 "name": "list-processes", 598 "arguments": { 599 "searchTerm": [ 600 "Arc" 601 ] 602 } 603 } 604 }, 605 { 606 "callsTool": { 607 "name": "kill-process", 608 "arguments": { 609 "processName": "Arc", 610 "id": 12345, 611 "path": "/Applications/Arc.app/Contents/MacOS/Arc" 612 } 613 } 614 }, 615 { 616 "meetsCriteria": "Kills Arc and all its helper processes as requested, but fails to kill some of them as main process is killed firstt" 617 } 618 ] 619 }, 620 { 621 "input": "@kill-process kill UpNote", 622 "mocks": { 623 "list-processes": [ 624 { 625 "id": 12348, 626 "pid": 1, 627 "cpu": 1.5, 628 "mem": 256000, 629 "type": "app", 630 "path": "/Applications/UpNote.app/Contents/MacOS/UpNote", 631 "processName": "UpNote", 632 "appName": "UpNote" 633 }, 634 { 635 "id": 12349, 636 "pid": 12348, 637 "cpu": 1.5, 638 "mem": 256000, 639 "type": "binary", 640 "path": "/Applications/UpNote.app/Contents/MacOS/UpNote Helper", 641 "processName": "UpNote Helper", 642 "appName": "UpNote" 643 }, 644 { 645 "id": 12350, 646 "pid": 12348, 647 "cpu": 1.5, 648 "mem": 256000, 649 "type": "binary", 650 "path": "/Applications/UpNote.app/Contents/MacOS/UpNote Helper (Renderer)", 651 "processName": "UpNote Helper (Renderer)", 652 "appName": "UpNote" 653 }, 654 { 655 "id": 12351, 656 "pid": 12348, 657 "cpu": 1.5, 658 "mem": 256000, 659 "type": "binary", 660 "path": "/Applications/UpNote.app/Contents/MacOS/UpNote Helper (GPU)", 661 "processName": "UpNote Helper (GPU)", 662 "appName": "UpNote" 663 } 664 ], 665 "kill-process": [ 666 { 667 "success": true, 668 "message": "Killed process: UpNote (PID: 12348)" 669 } 670 ] 671 }, 672 "expected": [ 673 { 674 "callsTool": { 675 "name": "list-processes", 676 "arguments": { 677 "searchTerm": [ 678 "UpNote" 679 ] 680 } 681 } 682 }, 683 { 684 "callsTool": { 685 "name": "kill-process", 686 "arguments": { 687 "processName": "UpNote", 688 "id": 12348, 689 "path": "/Applications/UpNote.app/Contents/MacOS/UpNote" 690 } 691 } 692 }, 693 { 694 "meetsCriteria": "Kills only the main UpNote process, as no helpers and/or related processes were specified" 695 } 696 ] 697 } 698 ] 699 }, 700 "preferences": [ 701 { 702 "description": "Determine whether the process path should be searched for the query or only the process name.", 703 "label": "Search Process Paths", 704 "name": "shouldSearchInPaths", 705 "required": false, 706 "default": false, 707 "title": "Filtering", 708 "type": "checkbox" 709 }, 710 { 711 "description": "Determine whether the process PID should be searched for the query or only the process name.", 712 "label": "Search Process PID", 713 "name": "shouldSearchInPid", 714 "required": false, 715 "default": false, 716 "title": "", 717 "type": "checkbox" 718 }, 719 { 720 "description": "Determine whether apps are listed before other results when filtering.", 721 "label": "Prioritize Apps", 722 "name": "shouldPrioritizeAppsWhenFiltering", 723 "required": false, 724 "default": false, 725 "title": "", 726 "type": "checkbox" 727 }, 728 { 729 "description": "Determine whether processes are sorted by CPU or memory usage.", 730 "label": "Sort by Memory Usage", 731 "name": "sortByMem", 732 "required": false, 733 "default": false, 734 "title": "", 735 "type": "checkbox" 736 }, 737 { 738 "description": "Determine whether aggregate processes belong to the same app.", 739 "label": "Aggregate Apps", 740 "name": "aggregateApps", 741 "required": false, 742 "default": false, 743 "title": "", 744 "type": "checkbox" 745 }, 746 { 747 "description": "Show process PID info.", 748 "label": "Show PID", 749 "name": "shouldShowPID", 750 "required": false, 751 "default": false, 752 "title": "Display", 753 "type": "checkbox" 754 }, 755 { 756 "description": "Show process path.", 757 "label": "Show Process Path", 758 "name": "shouldShowPath", 759 "required": false, 760 "default": false, 761 "title": "", 762 "type": "checkbox" 763 }, 764 { 765 "description": "Close window after killing a process", 766 "label": "Close Window", 767 "name": "closeWindowAfterKill", 768 "required": false, 769 "default": true, 770 "title": "After Killing", 771 "type": "checkbox" 772 }, 773 { 774 "description": "Clear search bar after killing a process", 775 "label": "Clear Search Bar", 776 "name": "clearSearchBarAfterKill", 777 "required": false, 778 "default": true, 779 "type": "checkbox" 780 }, 781 { 782 "description": "Go back to root search after killing a process", 783 "label": "Go back to Root Search", 784 "name": "goToRootAfterKill", 785 "required": false, 786 "default": false, 787 "type": "checkbox" 788 }, 789 { 790 "description": "Refresh duration in milliseconds (min: 1000ms; 0 to disable auto-refresh).", 791 "label": "Refresh Duration", 792 "name": "refreshDuration", 793 "required": false, 794 "title": "Refresh Duration", 795 "type": "textfield", 796 "default": "3000", 797 "placeholder": "3000" 798 } 799 ], 800 "dependencies": { 801 "@raycast/api": "^1.90.0", 802 "pretty-bytes": "^6.1.1" 803 }, 804 "devDependencies": { 805 "@raycast/eslint-config": "^1.0.11", 806 "@types/node": "18.18.4", 807 "@types/react": "18.2.37", 808 "eslint": "^8.57.0", 809 "prettier": "^3.3.3", 810 "typescript": "^5.5.4" 811 }, 812 "scripts": { 813 "build": "ray build -e dist", 814 "dev": "ray develop", 815 "fix-lint": "ray lint --fix", 816 "lint": "ray lint", 817 "publish": "npx @raycast/api@latest publish" 818 } 819 }