From cc479571ba0585b0d401ac3bc420f40c2d362cc1 Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sun, 6 Apr 2025 13:30:40 -0400 Subject: [PATCH 01/11] Add AI tools --- extensions/shortcut/package-lock.json | 2447 +++++++++++++++++++++---- extensions/shortcut/package.json | 891 ++++++++- raycast-env.d.ts | 43 + src/tools/create-story.ts | 150 ++ src/tools/current-member-info.ts | 6 + src/tools/get-epics.ts | 6 + src/tools/get-groups.ts | 6 + src/tools/get-iterations.ts | 6 + src/tools/get-members.ts | 6 + src/tools/get-projects.ts | 6 + src/tools/get-workflows.ts | 6 + src/tools/search-stories.ts | 181 ++ 12 files changed, 3408 insertions(+), 346 deletions(-) create mode 100644 raycast-env.d.ts create mode 100644 src/tools/create-story.ts create mode 100644 src/tools/current-member-info.ts create mode 100644 src/tools/get-epics.ts create mode 100644 src/tools/get-groups.ts create mode 100644 src/tools/get-iterations.ts create mode 100644 src/tools/get-members.ts create mode 100644 src/tools/get-projects.ts create mode 100644 src/tools/get-workflows.ts create mode 100644 src/tools/search-stories.ts diff --git a/extensions/shortcut/package-lock.json b/extensions/shortcut/package-lock.json index dada13aac0c..7935ab34c4c 100644 --- a/extensions/shortcut/package-lock.json +++ b/extensions/shortcut/package-lock.json @@ -7,8 +7,8 @@ "name": "shortcut", "license": "MIT", "dependencies": { - "@raycast/api": "^1.38.1", - "@raycast/utils": "^1.0.6", + "@raycast/api": "^1.94.3", + "@raycast/utils": "^1.17.0", "@useshortcut/client": "^1.0.0" }, "devDependencies": { @@ -123,6 +123,406 @@ "node": ">=4" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -172,11 +572,328 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@inquirer/checkbox": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz", + "integrity": "sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", + "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", + "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.10.tgz", + "integrity": "sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.12.tgz", + "integrity": "sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", + "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.9.tgz", + "integrity": "sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.12.tgz", + "integrity": "sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.12.tgz", + "integrity": "sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.4.1.tgz", + "integrity": "sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.5", + "@inquirer/confirm": "^5.1.9", + "@inquirer/editor": "^4.2.10", + "@inquirer/expand": "^4.0.12", + "@inquirer/input": "^4.1.9", + "@inquirer/number": "^3.0.12", + "@inquirer/password": "^4.0.12", + "@inquirer/rawlist": "^4.0.12", + "@inquirer/search": "^3.0.12", + "@inquirer/select": "^4.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.12.tgz", + "integrity": "sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.12.tgz", + "integrity": "sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.1.1.tgz", + "integrity": "sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", + "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -189,7 +906,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -198,7 +914,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -207,33 +922,178 @@ "node": ">= 8" } }, + "node_modules/@oclif/core": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.10.tgz", + "integrity": "sha512-fAqcXgqkUm4v5FYy7qWP4w1HaOlVSVJveah+yVTo5Nm5kTiXhmD5mQQ7+knGeBaStyrtQy6WardoC2xSic9rlQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@oclif/core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@oclif/core/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@oclif/plugin-autocomplete": { + "version": "3.2.27", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.27.tgz", + "integrity": "sha512-Aywx0Vw36k0fQVBa2uLb8FKblGAP7ly1cQ5bdKqL4BmhJnUasy37tpyIDMUor93asOS+kKFQg+52pOxQgXHi1A==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.16.0", + "debug": "^4.4.0", + "ejs": "^3.1.10" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-help": { + "version": "6.2.27", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.27.tgz", + "integrity": "sha512-RWSWtCFVObRmCwgxVOye3lsYbPHTnB7G4He5LEAg2tf600Sil5yXEOL/ULx1TqL/XOQxKqRvmLn/rLQOMT85YA==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found": { + "version": "3.2.49", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.49.tgz", + "integrity": "sha512-3V74/O5aFAqTTCJ7+X04M6vmt59Dk8HimB2uOlGgJrR7yLMW9JsVWKpDZZ6fl1hfd5kK9Jn4oaEt/1LuwfW1wQ==", + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.4.1", + "@oclif/core": "^4", + "ansis": "^3.17.0", + "fast-levenshtein": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, "node_modules/@raycast/api": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.38.1.tgz", - "integrity": "sha512-xAmMn9EWfJwsuzMwtShbbYB+VNPs1+liI/jmKI7mLaXnyd/9Dpa/3ixPxrvqIND+TLee6bPQap9vhNK0oMjLcg==", + "version": "1.94.3", + "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.94.3.tgz", + "integrity": "sha512-f1d8Tafpc5ZbG9GALzPOmlr3wArjHl6AuylwPys5iFtoRGVWhNr0DWoFjvw3iFd/Or92vqCydH7py9JELKdlJg==", + "license": "MIT", "dependencies": { - "@types/node": "16.10.3", - "@types/react": "18.0.9", - "react": "18.1.0", - "react-reconciler": "0.28.0" + "@oclif/core": "^4.0.33", + "@oclif/plugin-autocomplete": "^3.2.10", + "@oclif/plugin-help": "^6.2.18", + "@oclif/plugin-not-found": "^3.2.28", + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "esbuild": "^0.25.1", + "react": "19.0.0" }, "bin": { - "ray": "bin/ray" + "ray": "bin/run.js" + }, + "engines": { + "node": ">=22.14.0" + }, + "peerDependencies": { + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "react-devtools": "6.1.1" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "react-devtools": { + "optional": true + } } }, "node_modules/@raycast/utils": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@raycast/utils/-/utils-1.0.6.tgz", - "integrity": "sha512-hC9HyzITzn4AZ/AgWWVr5Xb1Bez8I8chLfavLO60Nlzba3HrHpkkca43G7lXKpXC3JLrN2FogR2gBW7N+0niQA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@raycast/utils/-/utils-1.19.1.tgz", + "integrity": "sha512-/udUGcTZCgZZwzesmjBkqG5naQZTD/ZLHbqRwkWcF+W97vf9tr9raxKyQjKsdZ17OVllw2T3sHBQsVUdEmCm2g==", + "license": "MIT", "dependencies": { - "content-type": "^1.0.4", + "cross-fetch": "^3.1.6", "dequal": "^2.0.3", - "media-typer": "^1.1.0", "object-hash": "^3.0.0", - "undici": "^5.6.0" + "signal-exit": "^4.0.2", + "stream-chain": "^2.2.5", + "stream-json": "^1.8.0" }, "peerDependencies": { - "@raycast/api": ">=1.38.1" + "@raycast/api": ">=1.69.0" } }, "node_modules/@types/json-schema": { @@ -243,30 +1103,23 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", - "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } }, "node_modules/@types/react": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz", - "integrity": "sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==", + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.30.7", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", @@ -506,11 +1359,37 @@ "node": ">=6" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -519,7 +1398,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -530,6 +1408,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -543,7 +1430,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -557,6 +1443,12 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -573,14 +1465,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -590,7 +1480,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -611,7 +1500,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -620,14 +1508,55 @@ "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" } }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -638,8 +1567,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -655,15 +1583,15 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" } }, "node_modules/cross-spawn": { @@ -681,17 +1609,18 @@ } }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -728,7 +1657,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -748,11 +1676,25 @@ "node": ">=6.0.0" } }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/enquirer": { "version": "2.3.6", @@ -766,11 +1708,50 @@ "node": ">=8.6" } }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -1034,6 +2015,20 @@ "node": ">=0.10.0" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1044,7 +2039,6 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1068,11 +2062,19 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -1089,11 +2091,40 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1164,6 +2195,15 @@ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1188,7 +2228,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1215,7 +2254,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -1235,16 +2273,26 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, "engines": { "node": ">= 4" } @@ -1274,6 +2322,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1290,11 +2347,25 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1303,7 +2374,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -1312,7 +2382,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -1324,21 +2393,51 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", @@ -1378,6 +2477,18 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1390,42 +2501,10 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -1434,7 +2513,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -1466,7 +2544,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1475,10 +2552,19 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, "node_modules/natural-compare": { "version": "1.4.0", @@ -1486,6 +2572,26 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", @@ -1520,6 +2626,15 @@ "node": ">= 0.8.0" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -1554,7 +2669,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -1563,7 +2677,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -1617,7 +2730,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -1634,29 +2746,12 @@ ] }, "node_modules/react": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", - "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-reconciler": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.28.0.tgz", - "integrity": "sha512-sGIHDOpgVjRYgsi8NgosDnbkDvvkYFFSF900ZUhUw0+lSBEA5n76TcKFaVkfYMIuYm+7W6mT8Q673DLBfuTxcQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.22.0" - }, + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.1.0" } }, "node_modules/regexpp": { @@ -1693,7 +2788,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -1718,7 +2812,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -1737,22 +2830,17 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/scheduler": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", - "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1781,11 +2869,22 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -1813,11 +2912,25 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1831,7 +2944,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1855,7 +2967,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -1907,11 +3018,22 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -1919,6 +3041,12 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -1977,13 +3105,11 @@ "node": ">=4.2.0" } }, - "node_modules/undici": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.8.0.tgz", - "integrity": "sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q==", - "engines": { - "node": ">=12.18" - } + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" }, "node_modules/uri-js": { "version": "4.4.1", @@ -2000,6 +3126,22 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2015,6 +3157,18 @@ "node": ">= 8" } }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -2024,17 +3178,46 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -2122,6 +3305,156 @@ } } }, + "@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "optional": true + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -2164,11 +3497,167 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@inquirer/checkbox": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz", + "integrity": "sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + } + }, + "@inquirer/confirm": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", + "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" + } + }, + "@inquirer/core": { + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", + "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", + "requires": { + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "dependencies": { + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "@inquirer/editor": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.10.tgz", + "integrity": "sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "external-editor": "^3.1.0" + } + }, + "@inquirer/expand": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.12.tgz", + "integrity": "sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" + } + }, + "@inquirer/figures": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", + "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==" + }, + "@inquirer/input": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.9.tgz", + "integrity": "sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" + } + }, + "@inquirer/number": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.12.tgz", + "integrity": "sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" + } + }, + "@inquirer/password": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.12.tgz", + "integrity": "sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2" + } + }, + "@inquirer/prompts": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.4.1.tgz", + "integrity": "sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==", + "requires": { + "@inquirer/checkbox": "^4.1.5", + "@inquirer/confirm": "^5.1.9", + "@inquirer/editor": "^4.2.10", + "@inquirer/expand": "^4.0.12", + "@inquirer/input": "^4.1.9", + "@inquirer/number": "^3.0.12", + "@inquirer/password": "^4.0.12", + "@inquirer/rawlist": "^4.0.12", + "@inquirer/search": "^3.0.12", + "@inquirer/select": "^4.1.1" + } + }, + "@inquirer/rawlist": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.12.tgz", + "integrity": "sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" + } + }, + "@inquirer/search": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.12.tgz", + "integrity": "sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "yoctocolors-cjs": "^2.1.2" + } + }, + "@inquirer/select": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.1.1.tgz", + "integrity": "sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==", + "requires": { + "@inquirer/core": "^10.1.10", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + } + }, + "@inquirer/type": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", + "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", + "requires": {} + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2177,40 +3666,134 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, + "@oclif/core": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.10.tgz", + "integrity": "sha512-fAqcXgqkUm4v5FYy7qWP4w1HaOlVSVJveah+yVTo5Nm5kTiXhmD5mQQ7+knGeBaStyrtQy6WardoC2xSic9rlQ==", + "requires": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@oclif/plugin-autocomplete": { + "version": "3.2.27", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.27.tgz", + "integrity": "sha512-Aywx0Vw36k0fQVBa2uLb8FKblGAP7ly1cQ5bdKqL4BmhJnUasy37tpyIDMUor93asOS+kKFQg+52pOxQgXHi1A==", + "requires": { + "@oclif/core": "^4", + "ansis": "^3.16.0", + "debug": "^4.4.0", + "ejs": "^3.1.10" + } + }, + "@oclif/plugin-help": { + "version": "6.2.27", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.27.tgz", + "integrity": "sha512-RWSWtCFVObRmCwgxVOye3lsYbPHTnB7G4He5LEAg2tf600Sil5yXEOL/ULx1TqL/XOQxKqRvmLn/rLQOMT85YA==", + "requires": { + "@oclif/core": "^4" + } + }, + "@oclif/plugin-not-found": { + "version": "3.2.49", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.49.tgz", + "integrity": "sha512-3V74/O5aFAqTTCJ7+X04M6vmt59Dk8HimB2uOlGgJrR7yLMW9JsVWKpDZZ6fl1hfd5kK9Jn4oaEt/1LuwfW1wQ==", + "requires": { + "@inquirer/prompts": "^7.4.1", + "@oclif/core": "^4", + "ansis": "^3.17.0", + "fast-levenshtein": "^3.0.0" + }, + "dependencies": { + "fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "requires": { + "fastest-levenshtein": "^1.0.7" + } + } + } + }, "@raycast/api": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.38.1.tgz", - "integrity": "sha512-xAmMn9EWfJwsuzMwtShbbYB+VNPs1+liI/jmKI7mLaXnyd/9Dpa/3ixPxrvqIND+TLee6bPQap9vhNK0oMjLcg==", + "version": "1.94.3", + "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.94.3.tgz", + "integrity": "sha512-f1d8Tafpc5ZbG9GALzPOmlr3wArjHl6AuylwPys5iFtoRGVWhNr0DWoFjvw3iFd/Or92vqCydH7py9JELKdlJg==", "requires": { - "@types/node": "16.10.3", - "@types/react": "18.0.9", - "react": "18.1.0", - "react-reconciler": "0.28.0" + "@oclif/core": "^4.0.33", + "@oclif/plugin-autocomplete": "^3.2.10", + "@oclif/plugin-help": "^6.2.18", + "@oclif/plugin-not-found": "^3.2.28", + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "esbuild": "^0.25.1", + "react": "19.0.0" } }, "@raycast/utils": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@raycast/utils/-/utils-1.0.6.tgz", - "integrity": "sha512-hC9HyzITzn4AZ/AgWWVr5Xb1Bez8I8chLfavLO60Nlzba3HrHpkkca43G7lXKpXC3JLrN2FogR2gBW7N+0niQA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@raycast/utils/-/utils-1.19.1.tgz", + "integrity": "sha512-/udUGcTZCgZZwzesmjBkqG5naQZTD/ZLHbqRwkWcF+W97vf9tr9raxKyQjKsdZ17OVllw2T3sHBQsVUdEmCm2g==", "requires": { - "content-type": "^1.0.4", + "cross-fetch": "^3.1.6", "dequal": "^2.0.3", - "media-typer": "^1.1.0", "object-hash": "^3.0.0", - "undici": "^5.6.0" + "signal-exit": "^4.0.2", + "stream-chain": "^2.2.5", + "stream-json": "^1.8.0" } }, "@types/json-schema": { @@ -2220,30 +3803,21 @@ "dev": true }, "@types/node": { - "version": "16.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", - "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "requires": { + "undici-types": "~6.20.0" + } }, "@types/react": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz", - "integrity": "sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==", + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, "@typescript-eslint/eslint-plugin": { "version": "5.30.7", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", @@ -2379,21 +3953,39 @@ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } }, + "ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2406,8 +3998,7 @@ "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "astral-regex": { "version": "2.0.0", @@ -2415,6 +4006,11 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2431,14 +4027,12 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2448,7 +4042,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -2463,17 +4056,38 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "requires": { + "escape-string-regexp": "4.0.0" + } + }, + "cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==" + }, + "cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -2481,8 +4095,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { "version": "1.0.8", @@ -2495,13 +4108,15 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "requires": { + "node-fetch": "^2.7.0" + } }, "cross-spawn": { "version": "7.0.3", @@ -2515,17 +4130,16 @@ } }, "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "deep-is": { @@ -2548,7 +4162,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "requires": { "path-type": "^4.0.0" } @@ -2562,11 +4175,18 @@ "esutils": "^2.0.2" } }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "requires": { + "jake": "^10.8.5" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "enquirer": { "version": "2.3.6", @@ -2577,11 +4197,42 @@ "ansi-colors": "^4.1.1" } }, + "esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "requires": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { "version": "7.32.0", @@ -2773,6 +4424,16 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2783,7 +4444,6 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2804,11 +4464,15 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -2822,11 +4486,36 @@ "flat-cache": "^3.0.4" } }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -2874,6 +4563,11 @@ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2892,7 +4586,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -2910,7 +4603,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2923,14 +4615,20 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "import-fresh": { "version": "3.3.0", @@ -2948,6 +4646,11 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2964,23 +4667,25 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -2988,8 +4693,15 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } }, "isexe": { "version": "2.0.0", @@ -2997,10 +4709,22 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "3.14.1", @@ -3034,6 +4758,11 @@ "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3046,39 +4775,15 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" - }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -3101,16 +4806,19 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==" }, "natural-compare": { "version": "1.4.0", @@ -3118,6 +4826,14 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", @@ -3146,6 +4862,11 @@ "word-wrap": "^1.2.3" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3170,14 +4891,12 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "prelude-ls": { "version": "1.2.1", @@ -3206,25 +4925,12 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "react": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", - "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-reconciler": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.28.0.tgz", - "integrity": "sha512-sGIHDOpgVjRYgsi8NgosDnbkDvvkYFFSF900ZUhUw0+lSBEA5n76TcKFaVkfYMIuYm+7W6mT8Q673DLBfuTxcQ==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.22.0" - } + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==" }, "regexpp": { "version": "3.2.0", @@ -3247,8 +4953,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", @@ -3263,27 +4968,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } }, - "scheduler": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", - "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", - "requires": { - "loose-envify": "^1.1.0" - } + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==" }, "shebang-command": { "version": "2.0.0", @@ -3300,11 +4997,15 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "4.0.0", @@ -3323,11 +5024,23 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==" + }, + "stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "requires": { + "stream-chain": "^2.2.5" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3338,7 +5051,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -3353,7 +5065,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3397,15 +5108,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -3442,10 +5165,10 @@ "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, - "undici": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.8.0.tgz", - "integrity": "sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q==" + "undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "uri-js": { "version": "4.4.1", @@ -3462,6 +5185,20 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3471,23 +5208,45 @@ "isexe": "^2.0.0" } }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==" } } } diff --git a/extensions/shortcut/package.json b/extensions/shortcut/package.json index de8d19b16a8..16963145662 100644 --- a/extensions/shortcut/package.json +++ b/extensions/shortcut/package.json @@ -51,6 +51,893 @@ "subtitle": "Shortcut" } ], + "tools": [ + { + "name": "search-stories", + "title": "Search Stories", + "description": "Search Stories on Shortcut" + }, + { + "name": "current-member-info", + "title": "Current User Info", + "description": "Get the currently authenticated Shortcut user" + }, + { + "name": "get-members", + "title": "Get Members", + "description": "Get members in current workspace" + }, + { + "name": "get-epics", + "title": "Get Epics", + "description": "Get Epics in current workspace" + }, + { + "name": "get-iterations", + "title": "Get Iterations", + "description": "Get iterations in current workspace" + }, + { + "name": "get-groups", + "title": "Get Groups", + "description": "Get groups in current workspace" + }, + { + "name": "get-projects", + "title": "Get Projects", + "description": "Get list of Projects in current workspace" + }, + { + "name": "get-workflows", + "title": "Get Workflows", + "description": "Get the Workflows in current workspace" + }, + { + "name": "create-story", + "title": "Create Story", + "description": "Creates a Shortcut story" + } + ], + "ai": { + "evals": [ + { + "input" : "@shortcut give me all my stories", + "mocks" : { + "current-member-info" : { + "id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "mention_name" : "john-doe-test99", + "name" : "John Doe", + "workspace2" : { + "estimate_scale" : [ + 0, + 1, + 2, + 4, + 8 + ], + "url_slug" : "raycast-test", + "utc_offset" : "-05:00" + } + }, + "search-stories" : { + "data" : { + "epics" : { + "data" : [ + { + "app_url" : "https://app.shortcut.com/raycast-test/epic/28", + "archived" : false, + "associated_groups" : null, + "comments" : [ + + ], + "completed" : false, + "completed_at" : null, + "completed_at_override" : null, + "created_at" : "2024-03-07T02:33:26Z", + "deadline" : "2024-04-06T02:33:26Z", + "description" : "An **Epic** is a collection of Stories that make up a larger deliverable of work, like a feature.\n\n**🏁 Tips for Epics:**\n- Include Stories for product, design, and marketing efforts in your Epic, alongside the engineering work.\n- Working collaboratively with another team on a feature? Use filters, sorting, and group-by to view Stories by team or owner.", + "entity_type" : "epic", + "epic_state_id" : 500000002, + "external_id" : null, + "follower_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "global_id" : "v2:e:65e92776-8a54-4c23-8aaa-f75b4f0506e5:28", + "group_id" : "65e92776-0227-47f8-acb7-16b8eb2c2508", + "group_ids" : [ + "65e92776-0227-47f8-acb7-16b8eb2c2508" + ], + "group_mention_ids" : [ + + ], + "id" : 28, + "label_ids" : [ + + ], + "labels" : [ + + ], + "member_mention_ids" : [ + + ], + "mention_ids" : [ + + ], + "milestone_id" : 26, + "name" : "🏁 Our second Epic", + "objective_ids" : [ + 26 + ], + "owner_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "planned_start_date" : "2024-03-07T02:33:26Z", + "position" : 2, + "productboard_id" : null, + "productboard_name" : null, + "productboard_plugin_id" : null, + "productboard_url" : null, + "project_ids" : [ + + ], + "requested_by_id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "started" : false, + "started_at" : null, + "started_at_override" : null, + "state" : "to do", + "stats" : { + "num_points" : 0, + "num_points_backlog" : 0, + "num_points_done" : 0, + "num_points_started" : 0, + "num_points_unstarted" : 0, + "num_related_documents" : 0, + "num_stories_backlog" : 0, + "num_stories_done" : 0, + "num_stories_started" : 0, + "num_stories_total" : 0, + "num_stories_unestimated" : 0, + "num_stories_unstarted" : 0 + }, + "stories_without_projects" : 0, + "updated_at" : "2024-03-07T02:33:26Z" + }, + { + "app_url" : "https://app.shortcut.com/raycast-test/epic/27", + "archived" : false, + "associated_groups" : null, + "comments" : [ + + ], + "completed" : false, + "completed_at" : null, + "completed_at_override" : null, + "created_at" : "2024-03-07T02:33:26Z", + "deadline" : "2024-04-06T02:33:26Z", + "description" : "An **Epic** is a collection of Stories that make up a larger deliverable of work, like a feature.\n\n**🏁 Tips for Epics:**\n- Include Stories for product, design, and marketing efforts in your Epic, alongside the engineering work.\n- Working collaboratively with another team on a feature? Use filters, sorting, and group-by to view Stories by team or owner.", + "entity_type" : "epic", + "epic_state_id" : 500000002, + "external_id" : null, + "follower_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "global_id" : "v2:e:65e92776-8a54-4c23-8aaa-f75b4f0506e5:27", + "group_id" : "65e92776-0227-47f8-acb7-16b8eb2c2508", + "group_ids" : [ + "65e92776-0227-47f8-acb7-16b8eb2c2508" + ], + "group_mention_ids" : [ + + ], + "id" : 27, + "label_ids" : [ + + ], + "labels" : [ + + ], + "member_mention_ids" : [ + + ], + "mention_ids" : [ + + ], + "milestone_id" : 25, + "name" : "🏁 Our first Epic", + "objective_ids" : [ + 25 + ], + "owner_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "planned_start_date" : "2024-03-07T02:33:26Z", + "position" : 1, + "productboard_id" : null, + "productboard_name" : null, + "productboard_plugin_id" : null, + "productboard_url" : null, + "project_ids" : [ + + ], + "requested_by_id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "started" : false, + "started_at" : null, + "started_at_override" : null, + "state" : "to do", + "stats" : { + "last_story_update" : "2025-04-12T20:40:01Z", + "num_points" : 2, + "num_points_backlog" : 0, + "num_points_done" : 0, + "num_points_started" : 2, + "num_points_unstarted" : 0, + "num_related_documents" : 0, + "num_stories_backlog" : 0, + "num_stories_done" : 0, + "num_stories_started" : 1, + "num_stories_total" : 2, + "num_stories_unestimated" : 1, + "num_stories_unstarted" : 1 + }, + "stories_without_projects" : 2, + "updated_at" : "2024-03-07T02:33:26Z" + } + ], + "next" : null, + "total" : 2 + }, + "stories" : { + "data" : [ + { + "app_url" : "https://app.shortcut.com/raycast-test/story/32", + "archived" : false, + "blocked" : false, + "blocker" : false, + "branches" : [ + + ], + "comments" : [ + + ], + "commits" : [ + + ], + "completed" : false, + "completed_at" : null, + "completed_at_override" : null, + "created_at" : "2024-03-07T02:33:26Z", + "custom_fields" : [ + + ], + "deadline" : null, + "description" : "➡️ **User Story**\nx\n\n\n**Acceptance Criteria**\n- x\n- x", + "entity_type" : "story", + "epic_id" : 27, + "estimate" : null, + "external_id" : null, + "external_links" : [ + + ], + "files" : [ + + ], + "follower_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "formatted_vcs_branch_name" : null, + "global_id" : "v2:s:65e92776-8a54-4c23-8aaa-f75b4f0506e5:32", + "group_id" : "65e92776-0227-47f8-acb7-16b8eb2c2508", + "group_mention_ids" : [ + + ], + "id" : 32, + "iteration_id" : 29, + "label_ids" : [ + + ], + "labels" : [ + + ], + "linked_files" : [ + + ], + "member_mention_ids" : [ + + ], + "mention_ids" : [ + + ], + "moved_at" : "2024-03-07T02:33:26Z", + "name" : "Sample Story 2", + "owner_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "position" : 22147483648, + "previous_iteration_ids" : [ + + ], + "project_id" : null, + "pull_requests" : [ + + ], + "requested_by_id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "started" : false, + "started_at" : null, + "started_at_override" : null, + "stats" : { + "num_related_documents" : 0 + }, + "story_links" : [ + + ], + "story_template_id" : null, + "story_type" : "bug", + "tasks" : [ + + ], + "updated_at" : "2025-04-12T20:40:01Z", + "workflow_id" : 500000005, + "workflow_state_id" : 500000007 + }, + { + "app_url" : "https://app.shortcut.com/raycast-test/story/30", + "archived" : false, + "blocked" : false, + "blocker" : false, + "branches" : [ + + ], + "comments" : [ + { + "app_url" : "https://app.shortcut.com/raycast-test/story/30/sample-story-1#activity-34", + "author_id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "created_at" : "2024-03-07T02:33:26Z", + "deleted" : false, + "entity_type" : "story-comment", + "external_id" : null, + "group_mention_ids" : [ + + ], + "id" : 34, + "linked_to_slack" : false, + "member_mention_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "mention_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "parent_id" : null, + "position" : 1, + "reactions" : [ + + ], + "story_id" : 30, + "text" : "Welcome to Shortcut [@john-doe-test99](shortcutapp://members/65e92776-6c3b-4626-ae4e-75a5ffc0a6f6)! This is where you'll see all mentions and activities", + "updated_at" : "2024-03-07T02:33:26Z" + } + ], + "commits" : [ + + ], + "completed" : false, + "completed_at" : null, + "completed_at_override" : null, + "created_at" : "2024-03-07T02:33:26Z", + "custom_fields" : [ + + ], + "deadline" : "2024-03-14T02:33:26Z", + "description" : "**Stories** are the standard unit of work in Shortcut representing individual features, bugs, and chores.\n\n## Here's an example:\n\n➡️ **User Story**\nAs a user, I want to see the news on my home screen.\n\n\n**Acceptance Criteria**\n- Given a user is logged in, when they click home on the nav\n- News modal appear in the left hand corner of the home screen\n\n---\n\n✅ Add **Tasks** (below) to Stories to break down the work granularly, or assign those smaller tasks to other users.", + "entity_type" : "story", + "epic_id" : 27, + "estimate" : 2, + "external_id" : null, + "external_links" : [ + + ], + "files" : [ + + ], + "follower_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "formatted_vcs_branch_name" : null, + "global_id" : "v2:s:65e92776-8a54-4c23-8aaa-f75b4f0506e5:30", + "group_id" : "65e92776-0227-47f8-acb7-16b8eb2c2508", + "group_mention_ids" : [ + + ], + "id" : 30, + "iteration_id" : 29, + "label_ids" : [ + + ], + "labels" : [ + + ], + "linked_files" : [ + + ], + "member_mention_ids" : [ + + ], + "mention_ids" : [ + + ], + "moved_at" : "2024-03-07T02:33:26Z", + "name" : "Sample Story 1", + "owner_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "position" : 32147483648, + "previous_iteration_ids" : [ + + ], + "project_id" : null, + "pull_requests" : [ + + ], + "requested_by_id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "started" : true, + "started_at" : "2024-03-07T02:33:26Z", + "started_at_override" : null, + "stats" : { + "num_related_documents" : 0 + }, + "story_links" : [ + + ], + "story_template_id" : null, + "story_type" : "chore", + "tasks" : [ + { + "complete" : false, + "completed_at" : null, + "created_at" : "2024-03-07T02:33:26Z", + "description" : "Your first task", + "entity_type" : "story-task", + "external_id" : null, + "global_id" : "v2:ta:65e92776-8a54-4c23-8aaa-f75b4f0506e5:31", + "group_mention_ids" : [ + + ], + "id" : 31, + "member_mention_ids" : [ + + ], + "mention_ids" : [ + + ], + "owner_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "position" : 1, + "story_id" : 30, + "updated_at" : "2024-03-07T02:33:26Z" + } + ], + "updated_at" : "2024-03-07T02:33:26Z", + "workflow_id" : 500000005, + "workflow_state_id" : 500000008 + } + ], + "next" : null, + "total" : 2 + } + }, + "searchQuery" : "owner:john-doe-test99" + } + }, + "expected" : [ + { + "callsTool" : { + "arguments" : { + + }, + "name" : "current-member-info" + } + }, + { + "callsTool" : { + "arguments" : { + "searchQuery" : "owner:john-doe-test99" + }, + "name" : "search-stories" + } + } + ] + }, + { + "input" : "@shortcut Create story 'Implement user profile page' ", + "mocks" : { + "create-story" : { + "app_url" : "https://app.shortcut.com/raycast-test/story/53", + "archived" : false, + "blocked" : false, + "blocker" : false, + "branches" : [ + + ], + "comments" : [ + + ], + "commits" : [ + + ], + "completed" : false, + "completed_at" : null, + "completed_at_override" : null, + "created_at" : "2025-04-12T20:48:56Z", + "custom_fields" : [ + + ], + "deadline" : null, + "description" : "", + "entity_type" : "story", + "epic_id" : null, + "estimate" : null, + "external_id" : null, + "external_links" : [ + + ], + "files" : [ + + ], + "follower_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "formatted_vcs_branch_name" : null, + "global_id" : "v2:s:65e92776-8a54-4c23-8aaa-f75b4f0506e5:53", + "group_id" : null, + "group_mention_ids" : [ + + ], + "id" : 53, + "iteration_id" : null, + "label_ids" : [ + + ], + "labels" : [ + + ], + "linked_files" : [ + + ], + "member_mention_ids" : [ + + ], + "mention_ids" : [ + + ], + "moved_at" : "2025-04-12T20:48:56Z", + "name" : "Implement user profile page", + "owner_ids" : [ + + ], + "position" : 22148401152, + "previous_iteration_ids" : [ + + ], + "project_id" : null, + "pull_requests" : [ + + ], + "requested_by_id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "started" : false, + "started_at" : null, + "started_at_override" : null, + "stats" : { + "num_related_documents" : 0 + }, + "story_links" : [ + + ], + "story_template_id" : null, + "story_type" : "feature", + "tasks" : [ + + ], + "updated_at" : "2025-04-12T20:48:56Z", + "workflow_id" : 500000005, + "workflow_state_id" : 500000007 + }, + "get-workflows" : [ + { + "auto_assign_owner" : true, + "created_at" : "2024-03-07T02:33:26Z", + "default_state_id" : 500000007, + "description" : "Our default workflow, designed for product and engineering teams. Add to or edit these States to customize your team's workflow.", + "entity_type" : "workflow", + "id" : 500000005, + "name" : "Standard", + "project_ids" : [ + + ], + "states" : [ + { + "created_at" : "2024-03-07T02:33:26Z", + "description" : "", + "entity_type" : "workflow-state", + "global_id" : "v2:wfs:65e92776-8a54-4c23-8aaa-f75b4f0506e5:500000006", + "id" : 500000006, + "name" : "Backlog", + "num_stories" : 1, + "num_story_templates" : 0, + "position" : 1, + "type" : "backlog", + "updated_at" : "2024-03-07T02:33:26Z", + "verb" : null + }, + { + "created_at" : "2024-03-07T02:33:26Z", + "description" : "", + "entity_type" : "workflow-state", + "global_id" : "v2:wfs:65e92776-8a54-4c23-8aaa-f75b4f0506e5:500000007", + "id" : 500000007, + "name" : "To Do", + "num_stories" : 13, + "num_story_templates" : 0, + "position" : 2, + "type" : "unstarted", + "updated_at" : "2024-03-07T02:33:26Z", + "verb" : null + }, + { + "created_at" : "2024-03-07T02:33:26Z", + "description" : "", + "entity_type" : "workflow-state", + "global_id" : "v2:wfs:65e92776-8a54-4c23-8aaa-f75b4f0506e5:500000008", + "id" : 500000008, + "name" : "In Progress", + "num_stories" : 1, + "num_story_templates" : 0, + "position" : 3, + "type" : "started", + "updated_at" : "2024-03-07T02:33:26Z", + "verb" : "start" + }, + { + "created_at" : "2024-03-07T02:33:26Z", + "description" : "", + "entity_type" : "workflow-state", + "global_id" : "v2:wfs:65e92776-8a54-4c23-8aaa-f75b4f0506e5:500000009", + "id" : 500000009, + "name" : "In Review", + "num_stories" : 0, + "num_story_templates" : 0, + "position" : 4, + "type" : "started", + "updated_at" : "2024-03-07T02:33:26Z", + "verb" : null + }, + { + "created_at" : "2024-03-07T02:33:26Z", + "description" : "", + "entity_type" : "workflow-state", + "global_id" : "v2:wfs:65e92776-8a54-4c23-8aaa-f75b4f0506e5:500000010", + "id" : 500000010, + "name" : "Done", + "num_stories" : 1, + "num_story_templates" : 0, + "position" : 5, + "type" : "done", + "updated_at" : "2024-03-07T02:33:26Z", + "verb" : "finish" + } + ], + "team_id" : 1, + "updated_at" : "2024-03-07T02:33:26Z" + } + ] + }, + "expected" : [ + { + "callsTool" : { + "arguments" : { + + }, + "name" : "get-workflows" + } + }, + { + "callsTool" : { + "arguments" : { + "name" : "Implement user profile page", + "workflow_state_id" : "500000007" + }, + "name" : "create-story" + } + } + ] + }, + { + "input" : "@shortcut Which stories were completed by John in the past 2 weeks? ", + "mocks" : { + "current-member-info" : { + "id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "mention_name" : "john-doe-test99", + "name" : "John Doe", + "workspace2" : { + "estimate_scale" : [ + 0, + 1, + 2, + 4, + 8 + ], + "url_slug" : "raycast-test", + "utc_offset" : "-05:00" + } + }, + "get-members" : [ + { + "created_at" : "2024-03-07T02:33:26Z", + "created_without_invite" : false, + "disabled" : false, + "entity_type" : "member", + "global_id" : "v2:p:65e92776-8a54-4c23-8aaa-f75b4f0506e5:65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "group_ids" : [ + "65e92776-0227-47f8-acb7-16b8eb2c2508" + ], + "id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "profile" : { + "deactivated" : false, + "display_icon" : null, + "email_address" : "johdoe@email.com", + "entity_type" : "profile", + "gravatar_hash" : "6b962a84122618b09a736f03c2ef5f31", + "id" : "65e92776-0869-44d6-b28c-d5149ebb24ac", + "is_owner" : true, + "mention_name" : "john-doe-test99", + "name" : "John Doe", + "two_factor_auth_activated" : false + }, + "role" : "admin", + "state" : "full", + "updated_at" : "2024-03-07T02:33:26Z" + } + ], + "search-stories" : { + "data" : { + "epics" : { + "data" : [ + + ], + "next" : null, + "total" : 0 + }, + "stories" : { + "data" : [ + { + "app_url" : "https://app.shortcut.com/raycast-test/story/54", + "archived" : false, + "blocked" : false, + "blocker" : false, + "branches" : [ + + ], + "comments" : [ + + ], + "commits" : [ + + ], + "completed" : true, + "completed_at" : "2025-04-12T20:52:42Z", + "completed_at_override" : null, + "created_at" : "2025-04-12T20:52:30Z", + "custom_fields" : [ + + ], + "cycle_time" : 4, + "deadline" : null, + "description" : "This is a test story", + "entity_type" : "story", + "epic_id" : null, + "estimate" : 2, + "external_id" : null, + "external_links" : [ + + ], + "files" : [ + + ], + "follower_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "formatted_vcs_branch_name" : null, + "global_id" : "v2:s:65e92776-8a54-4c23-8aaa-f75b4f0506e5:54", + "group_id" : "65e92776-0227-47f8-acb7-16b8eb2c2508", + "group_mention_ids" : [ + + ], + "id" : 54, + "iteration_id" : null, + "label_ids" : [ + + ], + "labels" : [ + + ], + "lead_time" : 11, + "linked_files" : [ + + ], + "member_mention_ids" : [ + + ], + "mention_ids" : [ + + ], + "moved_at" : "2025-04-12T20:52:42Z", + "name" : "Sample Story 6", + "owner_ids" : [ + "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6" + ], + "position" : 52147483647, + "previous_iteration_ids" : [ + + ], + "project_id" : null, + "pull_requests" : [ + + ], + "requested_by_id" : "65e92776-6c3b-4626-ae4e-75a5ffc0a6f6", + "started" : true, + "started_at" : "2025-04-12T20:52:37Z", + "started_at_override" : null, + "stats" : { + "num_related_documents" : 0 + }, + "story_links" : [ + + ], + "story_template_id" : null, + "story_type" : "feature", + "tasks" : [ + + ], + "updated_at" : "2025-04-12T20:52:42Z", + "workflow_id" : 500000005, + "workflow_state_id" : 500000010 + } + ], + "next" : null, + "total" : 1 + } + }, + "searchQuery" : "owner:john-doe-test99 completed:2025-03-29..2025-04-12" + } + }, + "expected" : [ + { + "callsTool" : { + "arguments" : { + + }, + "name" : "current-member-info" + } + }, + { + "callsTool" : { + "arguments" : { + + }, + "name" : "get-members" + } + }, + { + "callsTool" : { + "arguments" : { + "searchQuery" : "owner:john-doe-test99 completed:2025-03-29..2025-04-12" + }, + "name" : "search-stories" + } + } + ] + } + ] + }, "preferences": [ { "name": "apiToken", @@ -61,8 +948,8 @@ } ], "dependencies": { - "@raycast/api": "^1.38.1", - "@raycast/utils": "^1.0.6", + "@raycast/api": "^1.94.3", + "@raycast/utils": "^1.17.0", "@useshortcut/client": "^1.0.0" }, "devDependencies": { diff --git a/raycast-env.d.ts b/raycast-env.d.ts new file mode 100644 index 00000000000..65d1eb074a0 --- /dev/null +++ b/raycast-env.d.ts @@ -0,0 +1,43 @@ +/// + +/* 🚧 🚧 🚧 + * This file is auto-generated from the extension's manifest. + * Do not modify manually. Instead, update the `package.json` file. + * 🚧 🚧 🚧 */ + +/* eslint-disable @typescript-eslint/ban-types */ + +type ExtensionPreferences = { + /** API Token - The API token for the Shortcut */ + "apiToken": string +} + +/** Preferences accessible in all the extension's commands */ +declare type Preferences = ExtensionPreferences + +declare namespace Preferences { + /** Preferences accessible in the `assigned-stories` command */ + export type AssignedStories = ExtensionPreferences & {} + /** Preferences accessible in the `show-iterations` command */ + export type ShowIterations = ExtensionPreferences & {} + /** Preferences accessible in the `show-epics` command */ + export type ShowEpics = ExtensionPreferences & {} + /** Preferences accessible in the `create-story` command */ + export type CreateStory = ExtensionPreferences & {} + /** Preferences accessible in the `search-stories` command */ + export type SearchStories = ExtensionPreferences & {} +} + +declare namespace Arguments { + /** Arguments passed to the `assigned-stories` command */ + export type AssignedStories = {} + /** Arguments passed to the `show-iterations` command */ + export type ShowIterations = {} + /** Arguments passed to the `show-epics` command */ + export type ShowEpics = {} + /** Arguments passed to the `create-story` command */ + export type CreateStory = {} + /** Arguments passed to the `search-stories` command */ + export type SearchStories = {} +} + diff --git a/src/tools/create-story.ts b/src/tools/create-story.ts new file mode 100644 index 00000000000..f7d8a4ed4cf --- /dev/null +++ b/src/tools/create-story.ts @@ -0,0 +1,150 @@ +import { CreateStoryParams } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +type Input = { + /** REQUIRED - The name of the story. */ + name: string; + /** The description of the story. */ + description?: string; + // /** The type of story (feature, bug, chore). */ + story_type?: "feature" | "chore" | "bug"; + /** + * The ID of the iteration the story belongs to. + * @format int64 + */ + iteration_id?: string; + /** + * The id of the group to associate with this story. + * @format uuid + */ + group_id?: string; + /** + * REQUIRED - The ID of the workflow state the story will be in. Mapped to the WorkflowState.id field. Ignore EpicWorkflow. + * @format int64 + */ + workflow_state_id: string; + /** An array of UUIDs of the owners of this story. */ + owner_ids?: string[]; + /** + * The ID of the project the story belongs to. + * @format int64 + */ + project_id?: string; + /** + * The ID of the epic the story belongs to. + * @format int64 + */ + epic_id?: string; + /** + * The numeric point estimate of the story. Can also be null, which means unestimated. + * @format int64 + */ + estimate?: string; + /** + * The due date of the story. + * @format date-time + */ + deadline?: string; +} + +const mapInputToStoryParams = (input: Input): CreateStoryParams => { + const storyParams: CreateStoryParams = Object.entries(input).reduce( + (acc, [key, value]) => { + if (value === undefined || value === null || value === "") { + return acc; // Skip undefined, null, and empty string values + } + switch (key) { + case "iteration_id": + case "project_id": + case "epic_id": + case "estimate": + case "workflow_state_id": + return { + ...acc, + [key]: parseInt(value as string, 10), + }; + case "owner_ids": + return { + ...acc, + [key]: (value as string[]) || [], // Ensure it's an array or default to an empty array + }; + default: + return { + ...acc, + [key]: value, + }; + } + }, + {} as CreateStoryParams + ); + + return storyParams; + }; + +const tool = async (input: Input) => { + if (!input.name) { + throw new Error("Name is required"); + } + if (!input.workflow_state_id) { + throw new Error("Workflow state ID is required"); + } + + return shortcut.createStory(mapInputToStoryParams(input)) + .then(response => response.data); +}; + +export const confirmation = async (input: Input) => { + const info = [ + { name: "Name", value: input.name }, + ]; + + if (input.description) { + info.push({ name: "Description", value: input.description }); + } + + if (input.story_type) { + info.push({ name: "Type", value: input.story_type }); + } + + if (input.deadline) { + info.push({ name: "Due Date", value: new Date(input.deadline).toLocaleDateString() }); + } + + if (input.estimate) { + info.push({ name: "Estimate", value: `${input.estimate}` }); + } + + if(input.iteration_id) { + const { data: iteration } = await shortcut.getIteration(parseInt(input.iteration_id as string, 10)); + info.push({ name: "Iteration", value: iteration.name }); + } + + if (input.group_id) { + const { data: group } = await shortcut.getGroup(input.group_id); + info.push({ name: "Group", value: group.name }); + } + + if (input.epic_id) { + const { data: epic } = await shortcut.getEpic(parseInt(input.epic_id as string, 10)); + info.push({ name: "Epic", value: epic.name }); + } + + if (input.project_id) { + const { data: project } = await shortcut.getProject(parseInt(input.project_id as string, 10)); + info.push({ name: "Project", value: project.name }); + } + + if (input.owner_ids) { + const owners = await Promise.all( + input.owner_ids.map(async (ownerId) => { + const { data: owner } = await shortcut.getMember(ownerId, {}); + return owner.profile.name; + }) + ); + info.push({ name: "Owners", value: owners.join(", ") }); + } + + return { info }; +}; + +export default tool; \ No newline at end of file diff --git a/src/tools/current-member-info.ts b/src/tools/current-member-info.ts new file mode 100644 index 00000000000..717b5b40364 --- /dev/null +++ b/src/tools/current-member-info.ts @@ -0,0 +1,6 @@ +import { MemberInfo } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.getCurrentMemberInfo().then(response => response.data); + +export default tool; \ No newline at end of file diff --git a/src/tools/get-epics.ts b/src/tools/get-epics.ts new file mode 100644 index 00000000000..aa6cdaf8546 --- /dev/null +++ b/src/tools/get-epics.ts @@ -0,0 +1,6 @@ +import shortcut from "../utils/shortcut"; +import { EpicSlim } from "@useshortcut/client"; + +const tool = (): Promise => shortcut.listEpics({}).then(response => response.data); + +export default tool; \ No newline at end of file diff --git a/src/tools/get-groups.ts b/src/tools/get-groups.ts new file mode 100644 index 00000000000..da12c7d040d --- /dev/null +++ b/src/tools/get-groups.ts @@ -0,0 +1,6 @@ +import { Group } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listGroups().then(response => response.data); + +export default tool; \ No newline at end of file diff --git a/src/tools/get-iterations.ts b/src/tools/get-iterations.ts new file mode 100644 index 00000000000..5a46801fa4d --- /dev/null +++ b/src/tools/get-iterations.ts @@ -0,0 +1,6 @@ +import { IterationSlim } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listIterations().then(response => response.data); + +export default tool; \ No newline at end of file diff --git a/src/tools/get-members.ts b/src/tools/get-members.ts new file mode 100644 index 00000000000..1157d563f02 --- /dev/null +++ b/src/tools/get-members.ts @@ -0,0 +1,6 @@ +import { Member } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listMembers({}).then(response => response.data); + +export default tool; \ No newline at end of file diff --git a/src/tools/get-projects.ts b/src/tools/get-projects.ts new file mode 100644 index 00000000000..24ef7a4a54c --- /dev/null +++ b/src/tools/get-projects.ts @@ -0,0 +1,6 @@ +import { ListMembers, Member, Project } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listProjects().then(response => response.data); + +export default tool; \ No newline at end of file diff --git a/src/tools/get-workflows.ts b/src/tools/get-workflows.ts new file mode 100644 index 00000000000..67b73a282a4 --- /dev/null +++ b/src/tools/get-workflows.ts @@ -0,0 +1,6 @@ +import { Workflow } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listWorkflows().then(response => response.data); + +export default tool; \ No newline at end of file diff --git a/src/tools/search-stories.ts b/src/tools/search-stories.ts new file mode 100644 index 00000000000..15f1a79d251 --- /dev/null +++ b/src/tools/search-stories.ts @@ -0,0 +1,181 @@ +import { Search, SearchResults } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +type Input = { + searchQuery: string; +}; + +/** + * A Shortcut Search Query string used to filter and find Stories, Epics, and Objectives. + * + * Shortcut's search allows users to locate work items based on their attributes using specific operators and keywords. Queries primarily target Story titles, descriptions, and comments. This documentation provides a reference for the search syntax, supported operators, filtering logic, and examples. + * + * Search Logic: + * - By default, multiple operators or terms in a query are combined using AND logic. + * - OR logic is not currently supported directly within the search query string (though it may be available in UI filters). + * - Free text search (without specific operators) targets Story titles, descriptions, and comments. + * + * Basic Structure: + * Queries are typically composed of operators followed by values, often separated by a colon: + * operator:value + * Example: state:"Ready for Dev" + * Some operators act as boolean flags: + * is:blocker + * Free text can also be included: + * backend fix state:completed + * + * Operator Categories: + * Operators fall into two main categories: + * 1. Story-Specific Operators: Find results only for Stories (e.g., `type:`, `estimate:`). + * 2. General Operators: Find results across Stories, Epics, and Objectives (e.g., `id:`, `title:`, `owner:`). + * + * Supported Operators and Fields: + * + * Content Search: + * - (Free Text): Searches Story titles, descriptions, and comments. `hello world` searches for "hello" AND "world" anywhere in those fields. + * - title: Searches Story, Epic, Objective, and Iteration titles. + * - `title:hello` searches for "hello". + * - `title:"hello world"` searches for the exact phrase "hello world". + * - `title:hello world` searches for "hello" in titles AND "world" in titles/descriptions/comments. + * - description: Searches Story, Epic, and Objective descriptions. Behaves like `title:` regarding multiple words/quotes. + * - comment: Searches Story and Epic comments. Behaves like `title:` regarding multiple words/quotes. + * + * Item Identification & Type: + * - id: Finds an item by its numeric ID (e.g., `id:123`). Applies to Stories, Epics, Objectives. + * - type: [Story-Specific] Finds Stories of a specific type (`feature`, `bug`, or `chore`). Only one `type:` operator per query. `type:bug` + * - is:story: Returns only Stories. + * - is:epic: Returns only Epics. + * + * Attributes & Classification: + * - estimate: [Story-Specific] Finds Stories with a specific point estimate. `estimate:4` + * - state: Finds Stories in a specific Workflow state. Use quotes for multi-word states. `state:"In Development"` + * - label: Finds Stories or Epics with a specific label. Use quotes for multi-word labels. `label:"needs review"` (Note: Stories don't inherit Epic labels). + * - project: Finds Stories in a specific Project (name or ID), or Epics containing Stories in that Project. Use quotes for multi-word names. `project:frontend` (Note: Projects is a Legacy feature). + * - epic: Finds Stories within a specific Epic (name or ID). Use quotes for exact matches. `epic:"Q3 Launch"` + * - objective: Finds Stories in Epics linked to a specific Objective. Use quotes for multi-word names. `objective:"Increase Engagement"` + * - team: Finds Stories, Epics, and Iterations associated with a specific Team (use Team Name, not @-mention). `team:"Core Platform"` `team:"Product Development"` + * + * User Involvement: + * - owner: Finds Stories or Epics owned by a specific user (@-mention name without the '@'). `owner:janedoe` + * - requester: Finds Stories or Epics requested by a specific user (@-mention name without the '@'). `requester:johnsmith` + * + * Relationships & Status: + * - is:blocked: [Story-Specific] Finds Stories marked as blocked by another Story. + * - is:blocker: [Story-Specific] Finds Stories marked as blocking another Story. + * - has:epic: [Story-Specific] Finds Stories that have been added to an Epic. + * + * Existence Checks (`has:`): + * - has:attachment: [Story-Specific] Finds Stories with file attachments (not inline images). + * - has:task: [Story-Specific] Finds Stories with tasks. + * - has:comment: Finds Stories with comments. + * - has:label: Finds Stories with any label. + * - has:deadline: Finds Stories with a due date set. + * - has:owner: Finds Stories with an owner assigned. + * + * Boolean States (`is:`): + * - is:unstarted: Finds Stories in an "Unstarted" workflow state type. + * - is:started: Finds Stories in a "Started" workflow state type. + * - is:done: Finds Stories in a "Done" workflow state type. + * - is:unestimated: Finds Stories with a point estimate of 0. + * - is:overdue: Finds Stories whose due date is in the past. + * - is:archived: Finds archived Stories. + * + * VCS Integration: + * - has:branch: [Story-Specific] Finds Stories with any associated VCS branch. + * - has:commit: [Story-Specific] Finds Stories with any associated VCS commit. + * - has:pr: [Story-Specific] Finds Stories with any associated VCS pull request. + * - branch: [Story-Specific] Finds Stories associated with a VCS branch by name. `branch:feature/new-login` + * - commit: [Story-Specific] Finds Stories associated with a VCS commit by full hash or URL. `commit:a1b2c3d4` + * - pr: [Story-Specific] Finds Stories associated with a VCS pull request by number or URL. `pr:123` + * + * Custom Fields (Shortcut Defined Only): + * - skill-set: Filters by the 'Skill Set' custom field value. + * - product-area: Filters by the 'Product Area' custom field value. + * - technical-area: Filters by the 'Technical Area' custom field value. + * - priority: Filters by the 'Priority' custom field value. + * - severity: Filters by the 'Severity' custom field value. + * *Note: Advanced (user-created) Custom Fields are not searchable via operators at this time.* + * + * Date-Based Filtering: + * - Date Format: Use `YYYY-MM-DD`. + * - Date Ranges: Use `..` between dates: `YYYY-MM-DD..YYYY-MM-DD`. + * - Open-Ended Ranges: Use `*`: `*..YYYY-MM-DD` (before), `YYYY-MM-DD..*` (after). + * - Keywords: `today`, `yesterday`. `tomorrow` (only for `due:`). Cannot mix keywords and YYYY-MM-DD dates in a range. + * - created: Filters by creation date/range. `created:2023-10-01..2023-10-31` `created:yesterday` + * - updated: Filters by last updated date/range. `updated:2023-11-01..*` + * - completed: Filters by completion date/range. `completed:today` + * - moved: Filters by date/range the Story changed workflow state. `moved:*..2023-09-30` + * - due: Filters by due date/range. `due:tomorrow` `due:2023-12-25` + * + * Combining Conditions & Negation: + * - AND (Default): Multiple terms/operators are implicitly joined by AND. `bug label:critical owner:janedoe` finds critical bugs owned by janedoe. + * - NOT (Exclusion): Prefix an operator with `!` or `-` to negate it. + * Example: `!has:comment` finds Stories with no comments. + * Example: `-label:critical` finds Stories without the "critical" label. + * - OR: Not supported directly in search queries. + * - Quoting: Use double quotes `"` around multi-word values for operators like `state:`, `label:`, `project:`, `epic:`, `objective:`, `team:`, and for exact phrase matching in `title:`, `description:`, `comment:`. + * + * Sorting Results: + * Sorting is not controlled via the search query string itself. Result order depends on Shortcut's ranking, and pagination tokens should be used for stable results across pages. + * + * Examples of Shortcut Search Queries: + * 1. Find all bugs assigned to me: + * `type:bug owner:myusername` + * 2. Find features in the "Mobile App" project that are not done: + * `type:feature project:"Mobile App" !is:done` + * 3. Find stories with the "urgent" label updated since the start of the month: + * `label:urgent updated:YYYY-MM-01..*` (replace YYYY-MM with current year/month) + * 4. Find stories mentioning "database migration" in comments or description, requested by johnsmith: + * `"database migration" requester:johnsmith` + * 5. Find stories without an estimate in the "Ready for Dev" state: + * `is:unestimated state:"Ready for Dev"` + * 6. Find stories due today or tomorrow: + * `due:today OR due:tomorrow` (Note: This conceptual OR needs two separate queries or UI filtering, as OR is not supported in one query string) + * *Actual Queries:* `due:today` and `due:tomorrow` run separately. + * 7. Find stories that are blockers and are overdue: + * `is:blocker is:overdue` + * 8. Find epics related to the "Q4 Goals" objective: + * `is:epic objective:"Q4 Goals"` + * 9. Find stories with attached PRs but no comments: + * `has:pr !has:comment` + * 10. Find chores created yesterday: + * `type:chore created:yesterday` + * + * Special Considerations: + * - Quoting: Essential for multi-word values in many operators and for exact phrase searches. + * - Legacy Features: `project:` operator relates to a legacy feature. + * - Custom Fields: Only specific, predefined custom fields are searchable with operators. + * - User Mentions: Use the `@`-name *without* the `@` for `owner:` and `requester:`. + * + * Limitations: + * - No OR logic combinator within a single query string. + * - No direct sorting control via the query string. + * - Limited searchability for user-created custom fields. + * + * Example Query Strings: + * `"state:\"Ready for Dev\" owner:leetHacker !label:\"needs design\""` + * `"type:chore updated:today"` + * `"is:overdue project:\"Mobile App\""` + * `"epic:\"User Authentication\" has:pr"` + * + * IMPORTANT: For general discovery, starting with free text search combined with key operators like `state:`, `owner:`, `type:`, or `label:` is often most effective. Remember to use quotes for multi-word values. + */ +const tool = async (input: Input) => { + const { searchQuery } = input; + + if (!searchQuery) { + return { data: null, searchQuery }; + } + + return shortcut.search({ query: searchQuery } as Search) + .then(response => { + const searchResultData: SearchResults = response.data; + return { data: searchResultData, searchQuery }; + }) + .catch((error: any) => { + console.error(`Search tool failed for query "${searchQuery}":`, error); + return { error: error?.message ?? "An unknown search error occurred", searchQuery }; + }); +}; + +export default tool; \ No newline at end of file From 34d79e42f318fb3fcee93b8a3973cda9a2d7ad4d Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 17:15:43 -0400 Subject: [PATCH 02/11] Update changelog --- extensions/shortcut/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/shortcut/CHANGELOG.md b/extensions/shortcut/CHANGELOG.md index 4d1c04a6d55..0035f50b18d 100644 --- a/extensions/shortcut/CHANGELOG.md +++ b/extensions/shortcut/CHANGELOG.md @@ -1,5 +1,7 @@ # Shortcut Changelog +## [✨ AI Enhancements] - {PR_MERGE_DATE} + ## [Improvement] - 2024-03-20 Adds copy actions to a story. From feb9fe267a9b6b599a5dee2b916e2b1ecdcd631b Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 17:28:56 -0400 Subject: [PATCH 03/11] fix import --- extensions/shortcut/src/search-stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/shortcut/src/search-stories.tsx b/extensions/shortcut/src/search-stories.tsx index 08f53b95921..fe40724b73b 100644 --- a/extensions/shortcut/src/search-stories.tsx +++ b/extensions/shortcut/src/search-stories.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { JSX, useState } from "react"; import { List } from "@raycast/api"; import { useSearch } from "./hooks"; import EpicListItem from "./components/EpicListItem"; From ec9189b3de1180facbb90568347ed7cd5efedf48 Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 17:32:32 -0400 Subject: [PATCH 04/11] lint d --- src/tools/create-story.ts | 248 ++++++++++++------------ src/tools/current-member-info.ts | 4 +- src/tools/get-epics.ts | 4 +- src/tools/get-groups.ts | 4 +- src/tools/get-iterations.ts | 4 +- src/tools/get-members.ts | 4 +- src/tools/get-projects.ts | 4 +- src/tools/get-workflows.ts | 4 +- src/tools/search-stories.ts | 317 ++++++++++++++++--------------- 9 files changed, 294 insertions(+), 299 deletions(-) diff --git a/src/tools/create-story.ts b/src/tools/create-story.ts index f7d8a4ed4cf..bd644f3b8e7 100644 --- a/src/tools/create-story.ts +++ b/src/tools/create-story.ts @@ -2,149 +2,143 @@ import { CreateStoryParams } from "@useshortcut/client"; import shortcut from "../utils/shortcut"; type Input = { - /** REQUIRED - The name of the story. */ - name: string; - /** The description of the story. */ - description?: string; - // /** The type of story (feature, bug, chore). */ - story_type?: "feature" | "chore" | "bug"; - /** - * The ID of the iteration the story belongs to. - * @format int64 - */ - iteration_id?: string; - /** - * The id of the group to associate with this story. - * @format uuid - */ - group_id?: string; - /** - * REQUIRED - The ID of the workflow state the story will be in. Mapped to the WorkflowState.id field. Ignore EpicWorkflow. - * @format int64 - */ - workflow_state_id: string; - /** An array of UUIDs of the owners of this story. */ - owner_ids?: string[]; - /** - * The ID of the project the story belongs to. - * @format int64 - */ - project_id?: string; - /** - * The ID of the epic the story belongs to. - * @format int64 - */ - epic_id?: string; - /** - * The numeric point estimate of the story. Can also be null, which means unestimated. - * @format int64 - */ - estimate?: string; - /** - * The due date of the story. - * @format date-time - */ - deadline?: string; -} + /** REQUIRED - The name of the story. */ + name: string; + /** The description of the story. */ + description?: string; + // /** The type of story (feature, bug, chore). */ + story_type?: "feature" | "chore" | "bug"; + /** + * The ID of the iteration the story belongs to. + * @format int64 + */ + iteration_id?: string; + /** + * The id of the group to associate with this story. + * @format uuid + */ + group_id?: string; + /** + * REQUIRED - The ID of the workflow state the story will be in. Mapped to the WorkflowState.id field. Ignore EpicWorkflow. + * @format int64 + */ + workflow_state_id: string; + /** An array of UUIDs of the owners of this story. */ + owner_ids?: string[]; + /** + * The ID of the project the story belongs to. + * @format int64 + */ + project_id?: string; + /** + * The ID of the epic the story belongs to. + * @format int64 + */ + epic_id?: string; + /** + * The numeric point estimate of the story. Can also be null, which means unestimated. + * @format int64 + */ + estimate?: string; + /** + * The due date of the story. + * @format date-time + */ + deadline?: string; +}; const mapInputToStoryParams = (input: Input): CreateStoryParams => { - const storyParams: CreateStoryParams = Object.entries(input).reduce( - (acc, [key, value]) => { - if (value === undefined || value === null || value === "") { - return acc; // Skip undefined, null, and empty string values - } - switch (key) { - case "iteration_id": - case "project_id": - case "epic_id": - case "estimate": - case "workflow_state_id": - return { - ...acc, - [key]: parseInt(value as string, 10), - }; - case "owner_ids": - return { - ...acc, - [key]: (value as string[]) || [], // Ensure it's an array or default to an empty array - }; - default: - return { - ...acc, - [key]: value, - }; - } - }, - {} as CreateStoryParams - ); - - return storyParams; - }; - -const tool = async (input: Input) => { - if (!input.name) { - throw new Error("Name is required"); + const storyParams: CreateStoryParams = Object.entries(input).reduce((acc, [key, value]) => { + if (value === undefined || value === null || value === "") { + return acc; // Skip undefined, null, and empty string values } - if (!input.workflow_state_id) { - throw new Error("Workflow state ID is required"); + switch (key) { + case "iteration_id": + case "project_id": + case "epic_id": + case "estimate": + case "workflow_state_id": + return { + ...acc, + [key]: parseInt(value as string, 10), + }; + case "owner_ids": + return { + ...acc, + [key]: (value as string[]) || [], // Ensure it's an array or default to an empty array + }; + default: + return { + ...acc, + [key]: value, + }; } + }, {} as CreateStoryParams); + + return storyParams; +}; + +const tool = async (input: Input) => { + if (!input.name) { + throw new Error("Name is required"); + } + if (!input.workflow_state_id) { + throw new Error("Workflow state ID is required"); + } - return shortcut.createStory(mapInputToStoryParams(input)) - .then(response => response.data); + return shortcut.createStory(mapInputToStoryParams(input)).then((response) => response.data); }; export const confirmation = async (input: Input) => { - const info = [ - { name: "Name", value: input.name }, - ]; + const info = [{ name: "Name", value: input.name }]; - if (input.description) { - info.push({ name: "Description", value: input.description }); - } + if (input.description) { + info.push({ name: "Description", value: input.description }); + } - if (input.story_type) { - info.push({ name: "Type", value: input.story_type }); - } + if (input.story_type) { + info.push({ name: "Type", value: input.story_type }); + } - if (input.deadline) { - info.push({ name: "Due Date", value: new Date(input.deadline).toLocaleDateString() }); - } + if (input.deadline) { + info.push({ name: "Due Date", value: new Date(input.deadline).toLocaleDateString() }); + } - if (input.estimate) { - info.push({ name: "Estimate", value: `${input.estimate}` }); - } + if (input.estimate) { + info.push({ name: "Estimate", value: `${input.estimate}` }); + } - if(input.iteration_id) { - const { data: iteration } = await shortcut.getIteration(parseInt(input.iteration_id as string, 10)); - info.push({ name: "Iteration", value: iteration.name }); - } + if (input.iteration_id) { + const { data: iteration } = await shortcut.getIteration(parseInt(input.iteration_id as string, 10)); + info.push({ name: "Iteration", value: iteration.name }); + } - if (input.group_id) { - const { data: group } = await shortcut.getGroup(input.group_id); - info.push({ name: "Group", value: group.name }); - } + if (input.group_id) { + const { data: group } = await shortcut.getGroup(input.group_id); + info.push({ name: "Group", value: group.name }); + } - if (input.epic_id) { - const { data: epic } = await shortcut.getEpic(parseInt(input.epic_id as string, 10)); - info.push({ name: "Epic", value: epic.name }); - } + if (input.epic_id) { + const { data: epic } = await shortcut.getEpic(parseInt(input.epic_id as string, 10)); + info.push({ name: "Epic", value: epic.name }); + } - if (input.project_id) { - const { data: project } = await shortcut.getProject(parseInt(input.project_id as string, 10)); - info.push({ name: "Project", value: project.name }); - } - - if (input.owner_ids) { - const owners = await Promise.all( - input.owner_ids.map(async (ownerId) => { - const { data: owner } = await shortcut.getMember(ownerId, {}); - return owner.profile.name; - }) - ); - info.push({ name: "Owners", value: owners.join(", ") }); - } + if (input.project_id) { + const { data: project } = await shortcut.getProject(parseInt(input.project_id as string, 10)); + info.push({ name: "Project", value: project.name }); + } + + if (input.owner_ids) { + const owners = await Promise.all( + input.owner_ids.map(async (ownerId) => { + const { data: owner } = await shortcut.getMember(ownerId, {}); + return owner.profile.name; + }) + ); + info.push({ name: "Owners", value: owners.join(", ") }); + } - return { info }; + return { info }; }; -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/current-member-info.ts b/src/tools/current-member-info.ts index 717b5b40364..10b65cc5d91 100644 --- a/src/tools/current-member-info.ts +++ b/src/tools/current-member-info.ts @@ -1,6 +1,6 @@ import { MemberInfo } from "@useshortcut/client"; import shortcut from "../utils/shortcut"; -const tool = (): Promise => shortcut.getCurrentMemberInfo().then(response => response.data); +const tool = (): Promise => shortcut.getCurrentMemberInfo().then((response) => response.data); -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/get-epics.ts b/src/tools/get-epics.ts index aa6cdaf8546..e86b298022d 100644 --- a/src/tools/get-epics.ts +++ b/src/tools/get-epics.ts @@ -1,6 +1,6 @@ import shortcut from "../utils/shortcut"; import { EpicSlim } from "@useshortcut/client"; -const tool = (): Promise => shortcut.listEpics({}).then(response => response.data); +const tool = (): Promise => shortcut.listEpics({}).then((response) => response.data); -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/get-groups.ts b/src/tools/get-groups.ts index da12c7d040d..e6684bfc760 100644 --- a/src/tools/get-groups.ts +++ b/src/tools/get-groups.ts @@ -1,6 +1,6 @@ import { Group } from "@useshortcut/client"; import shortcut from "../utils/shortcut"; -const tool = (): Promise => shortcut.listGroups().then(response => response.data); +const tool = (): Promise => shortcut.listGroups().then((response) => response.data); -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/get-iterations.ts b/src/tools/get-iterations.ts index 5a46801fa4d..9ebf6d4bc26 100644 --- a/src/tools/get-iterations.ts +++ b/src/tools/get-iterations.ts @@ -1,6 +1,6 @@ import { IterationSlim } from "@useshortcut/client"; import shortcut from "../utils/shortcut"; -const tool = (): Promise => shortcut.listIterations().then(response => response.data); +const tool = (): Promise => shortcut.listIterations().then((response) => response.data); -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/get-members.ts b/src/tools/get-members.ts index 1157d563f02..0b051412cae 100644 --- a/src/tools/get-members.ts +++ b/src/tools/get-members.ts @@ -1,6 +1,6 @@ import { Member } from "@useshortcut/client"; import shortcut from "../utils/shortcut"; -const tool = (): Promise => shortcut.listMembers({}).then(response => response.data); +const tool = (): Promise => shortcut.listMembers({}).then((response) => response.data); -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/get-projects.ts b/src/tools/get-projects.ts index 24ef7a4a54c..660ec85bd80 100644 --- a/src/tools/get-projects.ts +++ b/src/tools/get-projects.ts @@ -1,6 +1,6 @@ import { ListMembers, Member, Project } from "@useshortcut/client"; import shortcut from "../utils/shortcut"; -const tool = (): Promise => shortcut.listProjects().then(response => response.data); +const tool = (): Promise => shortcut.listProjects().then((response) => response.data); -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/get-workflows.ts b/src/tools/get-workflows.ts index 67b73a282a4..10ccb708e69 100644 --- a/src/tools/get-workflows.ts +++ b/src/tools/get-workflows.ts @@ -1,6 +1,6 @@ import { Workflow } from "@useshortcut/client"; import shortcut from "../utils/shortcut"; -const tool = (): Promise => shortcut.listWorkflows().then(response => response.data); +const tool = (): Promise => shortcut.listWorkflows().then((response) => response.data); -export default tool; \ No newline at end of file +export default tool; diff --git a/src/tools/search-stories.ts b/src/tools/search-stories.ts index 15f1a79d251..3425454b824 100644 --- a/src/tools/search-stories.ts +++ b/src/tools/search-stories.ts @@ -6,169 +6,170 @@ type Input = { }; /** - * A Shortcut Search Query string used to filter and find Stories, Epics, and Objectives. - * - * Shortcut's search allows users to locate work items based on their attributes using specific operators and keywords. Queries primarily target Story titles, descriptions, and comments. This documentation provides a reference for the search syntax, supported operators, filtering logic, and examples. - * - * Search Logic: - * - By default, multiple operators or terms in a query are combined using AND logic. - * - OR logic is not currently supported directly within the search query string (though it may be available in UI filters). - * - Free text search (without specific operators) targets Story titles, descriptions, and comments. - * - * Basic Structure: - * Queries are typically composed of operators followed by values, often separated by a colon: - * operator:value - * Example: state:"Ready for Dev" - * Some operators act as boolean flags: - * is:blocker - * Free text can also be included: - * backend fix state:completed - * - * Operator Categories: - * Operators fall into two main categories: - * 1. Story-Specific Operators: Find results only for Stories (e.g., `type:`, `estimate:`). - * 2. General Operators: Find results across Stories, Epics, and Objectives (e.g., `id:`, `title:`, `owner:`). - * - * Supported Operators and Fields: - * - * Content Search: - * - (Free Text): Searches Story titles, descriptions, and comments. `hello world` searches for "hello" AND "world" anywhere in those fields. - * - title: Searches Story, Epic, Objective, and Iteration titles. - * - `title:hello` searches for "hello". - * - `title:"hello world"` searches for the exact phrase "hello world". - * - `title:hello world` searches for "hello" in titles AND "world" in titles/descriptions/comments. - * - description: Searches Story, Epic, and Objective descriptions. Behaves like `title:` regarding multiple words/quotes. - * - comment: Searches Story and Epic comments. Behaves like `title:` regarding multiple words/quotes. - * - * Item Identification & Type: - * - id: Finds an item by its numeric ID (e.g., `id:123`). Applies to Stories, Epics, Objectives. - * - type: [Story-Specific] Finds Stories of a specific type (`feature`, `bug`, or `chore`). Only one `type:` operator per query. `type:bug` - * - is:story: Returns only Stories. - * - is:epic: Returns only Epics. - * - * Attributes & Classification: - * - estimate: [Story-Specific] Finds Stories with a specific point estimate. `estimate:4` - * - state: Finds Stories in a specific Workflow state. Use quotes for multi-word states. `state:"In Development"` - * - label: Finds Stories or Epics with a specific label. Use quotes for multi-word labels. `label:"needs review"` (Note: Stories don't inherit Epic labels). - * - project: Finds Stories in a specific Project (name or ID), or Epics containing Stories in that Project. Use quotes for multi-word names. `project:frontend` (Note: Projects is a Legacy feature). - * - epic: Finds Stories within a specific Epic (name or ID). Use quotes for exact matches. `epic:"Q3 Launch"` - * - objective: Finds Stories in Epics linked to a specific Objective. Use quotes for multi-word names. `objective:"Increase Engagement"` - * - team: Finds Stories, Epics, and Iterations associated with a specific Team (use Team Name, not @-mention). `team:"Core Platform"` `team:"Product Development"` - * - * User Involvement: - * - owner: Finds Stories or Epics owned by a specific user (@-mention name without the '@'). `owner:janedoe` - * - requester: Finds Stories or Epics requested by a specific user (@-mention name without the '@'). `requester:johnsmith` - * - * Relationships & Status: - * - is:blocked: [Story-Specific] Finds Stories marked as blocked by another Story. - * - is:blocker: [Story-Specific] Finds Stories marked as blocking another Story. - * - has:epic: [Story-Specific] Finds Stories that have been added to an Epic. - * - * Existence Checks (`has:`): - * - has:attachment: [Story-Specific] Finds Stories with file attachments (not inline images). - * - has:task: [Story-Specific] Finds Stories with tasks. - * - has:comment: Finds Stories with comments. - * - has:label: Finds Stories with any label. - * - has:deadline: Finds Stories with a due date set. - * - has:owner: Finds Stories with an owner assigned. - * - * Boolean States (`is:`): - * - is:unstarted: Finds Stories in an "Unstarted" workflow state type. - * - is:started: Finds Stories in a "Started" workflow state type. - * - is:done: Finds Stories in a "Done" workflow state type. - * - is:unestimated: Finds Stories with a point estimate of 0. - * - is:overdue: Finds Stories whose due date is in the past. - * - is:archived: Finds archived Stories. - * - * VCS Integration: - * - has:branch: [Story-Specific] Finds Stories with any associated VCS branch. - * - has:commit: [Story-Specific] Finds Stories with any associated VCS commit. - * - has:pr: [Story-Specific] Finds Stories with any associated VCS pull request. - * - branch: [Story-Specific] Finds Stories associated with a VCS branch by name. `branch:feature/new-login` - * - commit: [Story-Specific] Finds Stories associated with a VCS commit by full hash or URL. `commit:a1b2c3d4` - * - pr: [Story-Specific] Finds Stories associated with a VCS pull request by number or URL. `pr:123` - * - * Custom Fields (Shortcut Defined Only): - * - skill-set: Filters by the 'Skill Set' custom field value. - * - product-area: Filters by the 'Product Area' custom field value. - * - technical-area: Filters by the 'Technical Area' custom field value. - * - priority: Filters by the 'Priority' custom field value. - * - severity: Filters by the 'Severity' custom field value. - * *Note: Advanced (user-created) Custom Fields are not searchable via operators at this time.* - * - * Date-Based Filtering: - * - Date Format: Use `YYYY-MM-DD`. - * - Date Ranges: Use `..` between dates: `YYYY-MM-DD..YYYY-MM-DD`. - * - Open-Ended Ranges: Use `*`: `*..YYYY-MM-DD` (before), `YYYY-MM-DD..*` (after). - * - Keywords: `today`, `yesterday`. `tomorrow` (only for `due:`). Cannot mix keywords and YYYY-MM-DD dates in a range. - * - created: Filters by creation date/range. `created:2023-10-01..2023-10-31` `created:yesterday` - * - updated: Filters by last updated date/range. `updated:2023-11-01..*` - * - completed: Filters by completion date/range. `completed:today` - * - moved: Filters by date/range the Story changed workflow state. `moved:*..2023-09-30` - * - due: Filters by due date/range. `due:tomorrow` `due:2023-12-25` - * - * Combining Conditions & Negation: - * - AND (Default): Multiple terms/operators are implicitly joined by AND. `bug label:critical owner:janedoe` finds critical bugs owned by janedoe. - * - NOT (Exclusion): Prefix an operator with `!` or `-` to negate it. - * Example: `!has:comment` finds Stories with no comments. - * Example: `-label:critical` finds Stories without the "critical" label. - * - OR: Not supported directly in search queries. - * - Quoting: Use double quotes `"` around multi-word values for operators like `state:`, `label:`, `project:`, `epic:`, `objective:`, `team:`, and for exact phrase matching in `title:`, `description:`, `comment:`. - * - * Sorting Results: - * Sorting is not controlled via the search query string itself. Result order depends on Shortcut's ranking, and pagination tokens should be used for stable results across pages. - * - * Examples of Shortcut Search Queries: - * 1. Find all bugs assigned to me: - * `type:bug owner:myusername` - * 2. Find features in the "Mobile App" project that are not done: - * `type:feature project:"Mobile App" !is:done` - * 3. Find stories with the "urgent" label updated since the start of the month: - * `label:urgent updated:YYYY-MM-01..*` (replace YYYY-MM with current year/month) - * 4. Find stories mentioning "database migration" in comments or description, requested by johnsmith: - * `"database migration" requester:johnsmith` - * 5. Find stories without an estimate in the "Ready for Dev" state: - * `is:unestimated state:"Ready for Dev"` - * 6. Find stories due today or tomorrow: - * `due:today OR due:tomorrow` (Note: This conceptual OR needs two separate queries or UI filtering, as OR is not supported in one query string) - * *Actual Queries:* `due:today` and `due:tomorrow` run separately. - * 7. Find stories that are blockers and are overdue: - * `is:blocker is:overdue` - * 8. Find epics related to the "Q4 Goals" objective: - * `is:epic objective:"Q4 Goals"` - * 9. Find stories with attached PRs but no comments: - * `has:pr !has:comment` - * 10. Find chores created yesterday: - * `type:chore created:yesterday` - * - * Special Considerations: - * - Quoting: Essential for multi-word values in many operators and for exact phrase searches. - * - Legacy Features: `project:` operator relates to a legacy feature. - * - Custom Fields: Only specific, predefined custom fields are searchable with operators. - * - User Mentions: Use the `@`-name *without* the `@` for `owner:` and `requester:`. - * - * Limitations: - * - No OR logic combinator within a single query string. - * - No direct sorting control via the query string. - * - Limited searchability for user-created custom fields. - * - * Example Query Strings: - * `"state:\"Ready for Dev\" owner:leetHacker !label:\"needs design\""` - * `"type:chore updated:today"` - * `"is:overdue project:\"Mobile App\""` - * `"epic:\"User Authentication\" has:pr"` - * - * IMPORTANT: For general discovery, starting with free text search combined with key operators like `state:`, `owner:`, `type:`, or `label:` is often most effective. Remember to use quotes for multi-word values. - */ + * A Shortcut Search Query string used to filter and find Stories, Epics, and Objectives. + * + * Shortcut's search allows users to locate work items based on their attributes using specific operators and keywords. Queries primarily target Story titles, descriptions, and comments. This documentation provides a reference for the search syntax, supported operators, filtering logic, and examples. + * + * Search Logic: + * - By default, multiple operators or terms in a query are combined using AND logic. + * - OR logic is not currently supported directly within the search query string (though it may be available in UI filters). + * - Free text search (without specific operators) targets Story titles, descriptions, and comments. + * + * Basic Structure: + * Queries are typically composed of operators followed by values, often separated by a colon: + * operator:value + * Example: state:"Ready for Dev" + * Some operators act as boolean flags: + * is:blocker + * Free text can also be included: + * backend fix state:completed + * + * Operator Categories: + * Operators fall into two main categories: + * 1. Story-Specific Operators: Find results only for Stories (e.g., `type:`, `estimate:`). + * 2. General Operators: Find results across Stories, Epics, and Objectives (e.g., `id:`, `title:`, `owner:`). + * + * Supported Operators and Fields: + * + * Content Search: + * - (Free Text): Searches Story titles, descriptions, and comments. `hello world` searches for "hello" AND "world" anywhere in those fields. + * - title: Searches Story, Epic, Objective, and Iteration titles. + * - `title:hello` searches for "hello". + * - `title:"hello world"` searches for the exact phrase "hello world". + * - `title:hello world` searches for "hello" in titles AND "world" in titles/descriptions/comments. + * - description: Searches Story, Epic, and Objective descriptions. Behaves like `title:` regarding multiple words/quotes. + * - comment: Searches Story and Epic comments. Behaves like `title:` regarding multiple words/quotes. + * + * Item Identification & Type: + * - id: Finds an item by its numeric ID (e.g., `id:123`). Applies to Stories, Epics, Objectives. + * - type: [Story-Specific] Finds Stories of a specific type (`feature`, `bug`, or `chore`). Only one `type:` operator per query. `type:bug` + * - is:story: Returns only Stories. + * - is:epic: Returns only Epics. + * + * Attributes & Classification: + * - estimate: [Story-Specific] Finds Stories with a specific point estimate. `estimate:4` + * - state: Finds Stories in a specific Workflow state. Use quotes for multi-word states. `state:"In Development"` + * - label: Finds Stories or Epics with a specific label. Use quotes for multi-word labels. `label:"needs review"` (Note: Stories don't inherit Epic labels). + * - project: Finds Stories in a specific Project (name or ID), or Epics containing Stories in that Project. Use quotes for multi-word names. `project:frontend` (Note: Projects is a Legacy feature). + * - epic: Finds Stories within a specific Epic (name or ID). Use quotes for exact matches. `epic:"Q3 Launch"` + * - objective: Finds Stories in Epics linked to a specific Objective. Use quotes for multi-word names. `objective:"Increase Engagement"` + * - team: Finds Stories, Epics, and Iterations associated with a specific Team (use Team Name, not @-mention). `team:"Core Platform"` `team:"Product Development"` + * + * User Involvement: + * - owner: Finds Stories or Epics owned by a specific user (@-mention name without the '@'). `owner:janedoe` + * - requester: Finds Stories or Epics requested by a specific user (@-mention name without the '@'). `requester:johnsmith` + * + * Relationships & Status: + * - is:blocked: [Story-Specific] Finds Stories marked as blocked by another Story. + * - is:blocker: [Story-Specific] Finds Stories marked as blocking another Story. + * - has:epic: [Story-Specific] Finds Stories that have been added to an Epic. + * + * Existence Checks (`has:`): + * - has:attachment: [Story-Specific] Finds Stories with file attachments (not inline images). + * - has:task: [Story-Specific] Finds Stories with tasks. + * - has:comment: Finds Stories with comments. + * - has:label: Finds Stories with any label. + * - has:deadline: Finds Stories with a due date set. + * - has:owner: Finds Stories with an owner assigned. + * + * Boolean States (`is:`): + * - is:unstarted: Finds Stories in an "Unstarted" workflow state type. + * - is:started: Finds Stories in a "Started" workflow state type. + * - is:done: Finds Stories in a "Done" workflow state type. + * - is:unestimated: Finds Stories with a point estimate of 0. + * - is:overdue: Finds Stories whose due date is in the past. + * - is:archived: Finds archived Stories. + * + * VCS Integration: + * - has:branch: [Story-Specific] Finds Stories with any associated VCS branch. + * - has:commit: [Story-Specific] Finds Stories with any associated VCS commit. + * - has:pr: [Story-Specific] Finds Stories with any associated VCS pull request. + * - branch: [Story-Specific] Finds Stories associated with a VCS branch by name. `branch:feature/new-login` + * - commit: [Story-Specific] Finds Stories associated with a VCS commit by full hash or URL. `commit:a1b2c3d4` + * - pr: [Story-Specific] Finds Stories associated with a VCS pull request by number or URL. `pr:123` + * + * Custom Fields (Shortcut Defined Only): + * - skill-set: Filters by the 'Skill Set' custom field value. + * - product-area: Filters by the 'Product Area' custom field value. + * - technical-area: Filters by the 'Technical Area' custom field value. + * - priority: Filters by the 'Priority' custom field value. + * - severity: Filters by the 'Severity' custom field value. + * *Note: Advanced (user-created) Custom Fields are not searchable via operators at this time.* + * + * Date-Based Filtering: + * - Date Format: Use `YYYY-MM-DD`. + * - Date Ranges: Use `..` between dates: `YYYY-MM-DD..YYYY-MM-DD`. + * - Open-Ended Ranges: Use `*`: `*..YYYY-MM-DD` (before), `YYYY-MM-DD..*` (after). + * - Keywords: `today`, `yesterday`. `tomorrow` (only for `due:`). Cannot mix keywords and YYYY-MM-DD dates in a range. + * - created: Filters by creation date/range. `created:2023-10-01..2023-10-31` `created:yesterday` + * - updated: Filters by last updated date/range. `updated:2023-11-01..*` + * - completed: Filters by completion date/range. `completed:today` + * - moved: Filters by date/range the Story changed workflow state. `moved:*..2023-09-30` + * - due: Filters by due date/range. `due:tomorrow` `due:2023-12-25` + * + * Combining Conditions & Negation: + * - AND (Default): Multiple terms/operators are implicitly joined by AND. `bug label:critical owner:janedoe` finds critical bugs owned by janedoe. + * - NOT (Exclusion): Prefix an operator with `!` or `-` to negate it. + * Example: `!has:comment` finds Stories with no comments. + * Example: `-label:critical` finds Stories without the "critical" label. + * - OR: Not supported directly in search queries. + * - Quoting: Use double quotes `"` around multi-word values for operators like `state:`, `label:`, `project:`, `epic:`, `objective:`, `team:`, and for exact phrase matching in `title:`, `description:`, `comment:`. + * + * Sorting Results: + * Sorting is not controlled via the search query string itself. Result order depends on Shortcut's ranking, and pagination tokens should be used for stable results across pages. + * + * Examples of Shortcut Search Queries: + * 1. Find all bugs assigned to me: + * `type:bug owner:myusername` + * 2. Find features in the "Mobile App" project that are not done: + * `type:feature project:"Mobile App" !is:done` + * 3. Find stories with the "urgent" label updated since the start of the month: + * `label:urgent updated:YYYY-MM-01..*` (replace YYYY-MM with current year/month) + * 4. Find stories mentioning "database migration" in comments or description, requested by johnsmith: + * `"database migration" requester:johnsmith` + * 5. Find stories without an estimate in the "Ready for Dev" state: + * `is:unestimated state:"Ready for Dev"` + * 6. Find stories due today or tomorrow: + * `due:today OR due:tomorrow` (Note: This conceptual OR needs two separate queries or UI filtering, as OR is not supported in one query string) + * *Actual Queries:* `due:today` and `due:tomorrow` run separately. + * 7. Find stories that are blockers and are overdue: + * `is:blocker is:overdue` + * 8. Find epics related to the "Q4 Goals" objective: + * `is:epic objective:"Q4 Goals"` + * 9. Find stories with attached PRs but no comments: + * `has:pr !has:comment` + * 10. Find chores created yesterday: + * `type:chore created:yesterday` + * + * Special Considerations: + * - Quoting: Essential for multi-word values in many operators and for exact phrase searches. + * - Legacy Features: `project:` operator relates to a legacy feature. + * - Custom Fields: Only specific, predefined custom fields are searchable with operators. + * - User Mentions: Use the `@`-name *without* the `@` for `owner:` and `requester:`. + * + * Limitations: + * - No OR logic combinator within a single query string. + * - No direct sorting control via the query string. + * - Limited searchability for user-created custom fields. + * + * Example Query Strings: + * `"state:\"Ready for Dev\" owner:leetHacker !label:\"needs design\""` + * `"type:chore updated:today"` + * `"is:overdue project:\"Mobile App\""` + * `"epic:\"User Authentication\" has:pr"` + * + * IMPORTANT: For general discovery, starting with free text search combined with key operators like `state:`, `owner:`, `type:`, or `label:` is often most effective. Remember to use quotes for multi-word values. + */ const tool = async (input: Input) => { const { searchQuery } = input; - + if (!searchQuery) { return { data: null, searchQuery }; } - return shortcut.search({ query: searchQuery } as Search) - .then(response => { + return shortcut + .search({ query: searchQuery } as Search) + .then((response) => { const searchResultData: SearchResults = response.data; return { data: searchResultData, searchQuery }; }) @@ -178,4 +179,4 @@ const tool = async (input: Input) => { }); }; -export default tool; \ No newline at end of file +export default tool; From 44ccd8b9e6ce1714141060fd39f09d24bbd6a5bb Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 18:07:34 -0400 Subject: [PATCH 05/11] fix cherry-pick --- extensions/shortcut/src/tools/create-story.ts | 144 ++++++++++++++ .../shortcut/src/tools/current-member-info.ts | 6 + extensions/shortcut/src/tools/get-epics.ts | 6 + extensions/shortcut/src/tools/get-groups.ts | 6 + .../shortcut/src/tools/get-iterations.ts | 6 + extensions/shortcut/src/tools/get-members.ts | 6 + extensions/shortcut/src/tools/get-projects.ts | 6 + .../shortcut/src/tools/get-workflows.ts | 6 + .../shortcut/src/tools/search-stories.ts | 182 ++++++++++++++++++ 9 files changed, 368 insertions(+) create mode 100644 extensions/shortcut/src/tools/create-story.ts create mode 100644 extensions/shortcut/src/tools/current-member-info.ts create mode 100644 extensions/shortcut/src/tools/get-epics.ts create mode 100644 extensions/shortcut/src/tools/get-groups.ts create mode 100644 extensions/shortcut/src/tools/get-iterations.ts create mode 100644 extensions/shortcut/src/tools/get-members.ts create mode 100644 extensions/shortcut/src/tools/get-projects.ts create mode 100644 extensions/shortcut/src/tools/get-workflows.ts create mode 100644 extensions/shortcut/src/tools/search-stories.ts diff --git a/extensions/shortcut/src/tools/create-story.ts b/extensions/shortcut/src/tools/create-story.ts new file mode 100644 index 00000000000..bd644f3b8e7 --- /dev/null +++ b/extensions/shortcut/src/tools/create-story.ts @@ -0,0 +1,144 @@ +import { CreateStoryParams } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +type Input = { + /** REQUIRED - The name of the story. */ + name: string; + /** The description of the story. */ + description?: string; + // /** The type of story (feature, bug, chore). */ + story_type?: "feature" | "chore" | "bug"; + /** + * The ID of the iteration the story belongs to. + * @format int64 + */ + iteration_id?: string; + /** + * The id of the group to associate with this story. + * @format uuid + */ + group_id?: string; + /** + * REQUIRED - The ID of the workflow state the story will be in. Mapped to the WorkflowState.id field. Ignore EpicWorkflow. + * @format int64 + */ + workflow_state_id: string; + /** An array of UUIDs of the owners of this story. */ + owner_ids?: string[]; + /** + * The ID of the project the story belongs to. + * @format int64 + */ + project_id?: string; + /** + * The ID of the epic the story belongs to. + * @format int64 + */ + epic_id?: string; + /** + * The numeric point estimate of the story. Can also be null, which means unestimated. + * @format int64 + */ + estimate?: string; + /** + * The due date of the story. + * @format date-time + */ + deadline?: string; +}; + +const mapInputToStoryParams = (input: Input): CreateStoryParams => { + const storyParams: CreateStoryParams = Object.entries(input).reduce((acc, [key, value]) => { + if (value === undefined || value === null || value === "") { + return acc; // Skip undefined, null, and empty string values + } + switch (key) { + case "iteration_id": + case "project_id": + case "epic_id": + case "estimate": + case "workflow_state_id": + return { + ...acc, + [key]: parseInt(value as string, 10), + }; + case "owner_ids": + return { + ...acc, + [key]: (value as string[]) || [], // Ensure it's an array or default to an empty array + }; + default: + return { + ...acc, + [key]: value, + }; + } + }, {} as CreateStoryParams); + + return storyParams; +}; + +const tool = async (input: Input) => { + if (!input.name) { + throw new Error("Name is required"); + } + if (!input.workflow_state_id) { + throw new Error("Workflow state ID is required"); + } + + return shortcut.createStory(mapInputToStoryParams(input)).then((response) => response.data); +}; + +export const confirmation = async (input: Input) => { + const info = [{ name: "Name", value: input.name }]; + + if (input.description) { + info.push({ name: "Description", value: input.description }); + } + + if (input.story_type) { + info.push({ name: "Type", value: input.story_type }); + } + + if (input.deadline) { + info.push({ name: "Due Date", value: new Date(input.deadline).toLocaleDateString() }); + } + + if (input.estimate) { + info.push({ name: "Estimate", value: `${input.estimate}` }); + } + + if (input.iteration_id) { + const { data: iteration } = await shortcut.getIteration(parseInt(input.iteration_id as string, 10)); + info.push({ name: "Iteration", value: iteration.name }); + } + + if (input.group_id) { + const { data: group } = await shortcut.getGroup(input.group_id); + info.push({ name: "Group", value: group.name }); + } + + if (input.epic_id) { + const { data: epic } = await shortcut.getEpic(parseInt(input.epic_id as string, 10)); + info.push({ name: "Epic", value: epic.name }); + } + + if (input.project_id) { + const { data: project } = await shortcut.getProject(parseInt(input.project_id as string, 10)); + info.push({ name: "Project", value: project.name }); + } + + if (input.owner_ids) { + const owners = await Promise.all( + input.owner_ids.map(async (ownerId) => { + const { data: owner } = await shortcut.getMember(ownerId, {}); + return owner.profile.name; + }) + ); + info.push({ name: "Owners", value: owners.join(", ") }); + } + + return { info }; +}; + +export default tool; diff --git a/extensions/shortcut/src/tools/current-member-info.ts b/extensions/shortcut/src/tools/current-member-info.ts new file mode 100644 index 00000000000..10b65cc5d91 --- /dev/null +++ b/extensions/shortcut/src/tools/current-member-info.ts @@ -0,0 +1,6 @@ +import { MemberInfo } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.getCurrentMemberInfo().then((response) => response.data); + +export default tool; diff --git a/extensions/shortcut/src/tools/get-epics.ts b/extensions/shortcut/src/tools/get-epics.ts new file mode 100644 index 00000000000..e86b298022d --- /dev/null +++ b/extensions/shortcut/src/tools/get-epics.ts @@ -0,0 +1,6 @@ +import shortcut from "../utils/shortcut"; +import { EpicSlim } from "@useshortcut/client"; + +const tool = (): Promise => shortcut.listEpics({}).then((response) => response.data); + +export default tool; diff --git a/extensions/shortcut/src/tools/get-groups.ts b/extensions/shortcut/src/tools/get-groups.ts new file mode 100644 index 00000000000..e6684bfc760 --- /dev/null +++ b/extensions/shortcut/src/tools/get-groups.ts @@ -0,0 +1,6 @@ +import { Group } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listGroups().then((response) => response.data); + +export default tool; diff --git a/extensions/shortcut/src/tools/get-iterations.ts b/extensions/shortcut/src/tools/get-iterations.ts new file mode 100644 index 00000000000..9ebf6d4bc26 --- /dev/null +++ b/extensions/shortcut/src/tools/get-iterations.ts @@ -0,0 +1,6 @@ +import { IterationSlim } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listIterations().then((response) => response.data); + +export default tool; diff --git a/extensions/shortcut/src/tools/get-members.ts b/extensions/shortcut/src/tools/get-members.ts new file mode 100644 index 00000000000..0b051412cae --- /dev/null +++ b/extensions/shortcut/src/tools/get-members.ts @@ -0,0 +1,6 @@ +import { Member } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listMembers({}).then((response) => response.data); + +export default tool; diff --git a/extensions/shortcut/src/tools/get-projects.ts b/extensions/shortcut/src/tools/get-projects.ts new file mode 100644 index 00000000000..660ec85bd80 --- /dev/null +++ b/extensions/shortcut/src/tools/get-projects.ts @@ -0,0 +1,6 @@ +import { ListMembers, Member, Project } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listProjects().then((response) => response.data); + +export default tool; diff --git a/extensions/shortcut/src/tools/get-workflows.ts b/extensions/shortcut/src/tools/get-workflows.ts new file mode 100644 index 00000000000..10ccb708e69 --- /dev/null +++ b/extensions/shortcut/src/tools/get-workflows.ts @@ -0,0 +1,6 @@ +import { Workflow } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +const tool = (): Promise => shortcut.listWorkflows().then((response) => response.data); + +export default tool; diff --git a/extensions/shortcut/src/tools/search-stories.ts b/extensions/shortcut/src/tools/search-stories.ts new file mode 100644 index 00000000000..3425454b824 --- /dev/null +++ b/extensions/shortcut/src/tools/search-stories.ts @@ -0,0 +1,182 @@ +import { Search, SearchResults } from "@useshortcut/client"; +import shortcut from "../utils/shortcut"; + +type Input = { + searchQuery: string; +}; + +/** + * A Shortcut Search Query string used to filter and find Stories, Epics, and Objectives. + * + * Shortcut's search allows users to locate work items based on their attributes using specific operators and keywords. Queries primarily target Story titles, descriptions, and comments. This documentation provides a reference for the search syntax, supported operators, filtering logic, and examples. + * + * Search Logic: + * - By default, multiple operators or terms in a query are combined using AND logic. + * - OR logic is not currently supported directly within the search query string (though it may be available in UI filters). + * - Free text search (without specific operators) targets Story titles, descriptions, and comments. + * + * Basic Structure: + * Queries are typically composed of operators followed by values, often separated by a colon: + * operator:value + * Example: state:"Ready for Dev" + * Some operators act as boolean flags: + * is:blocker + * Free text can also be included: + * backend fix state:completed + * + * Operator Categories: + * Operators fall into two main categories: + * 1. Story-Specific Operators: Find results only for Stories (e.g., `type:`, `estimate:`). + * 2. General Operators: Find results across Stories, Epics, and Objectives (e.g., `id:`, `title:`, `owner:`). + * + * Supported Operators and Fields: + * + * Content Search: + * - (Free Text): Searches Story titles, descriptions, and comments. `hello world` searches for "hello" AND "world" anywhere in those fields. + * - title: Searches Story, Epic, Objective, and Iteration titles. + * - `title:hello` searches for "hello". + * - `title:"hello world"` searches for the exact phrase "hello world". + * - `title:hello world` searches for "hello" in titles AND "world" in titles/descriptions/comments. + * - description: Searches Story, Epic, and Objective descriptions. Behaves like `title:` regarding multiple words/quotes. + * - comment: Searches Story and Epic comments. Behaves like `title:` regarding multiple words/quotes. + * + * Item Identification & Type: + * - id: Finds an item by its numeric ID (e.g., `id:123`). Applies to Stories, Epics, Objectives. + * - type: [Story-Specific] Finds Stories of a specific type (`feature`, `bug`, or `chore`). Only one `type:` operator per query. `type:bug` + * - is:story: Returns only Stories. + * - is:epic: Returns only Epics. + * + * Attributes & Classification: + * - estimate: [Story-Specific] Finds Stories with a specific point estimate. `estimate:4` + * - state: Finds Stories in a specific Workflow state. Use quotes for multi-word states. `state:"In Development"` + * - label: Finds Stories or Epics with a specific label. Use quotes for multi-word labels. `label:"needs review"` (Note: Stories don't inherit Epic labels). + * - project: Finds Stories in a specific Project (name or ID), or Epics containing Stories in that Project. Use quotes for multi-word names. `project:frontend` (Note: Projects is a Legacy feature). + * - epic: Finds Stories within a specific Epic (name or ID). Use quotes for exact matches. `epic:"Q3 Launch"` + * - objective: Finds Stories in Epics linked to a specific Objective. Use quotes for multi-word names. `objective:"Increase Engagement"` + * - team: Finds Stories, Epics, and Iterations associated with a specific Team (use Team Name, not @-mention). `team:"Core Platform"` `team:"Product Development"` + * + * User Involvement: + * - owner: Finds Stories or Epics owned by a specific user (@-mention name without the '@'). `owner:janedoe` + * - requester: Finds Stories or Epics requested by a specific user (@-mention name without the '@'). `requester:johnsmith` + * + * Relationships & Status: + * - is:blocked: [Story-Specific] Finds Stories marked as blocked by another Story. + * - is:blocker: [Story-Specific] Finds Stories marked as blocking another Story. + * - has:epic: [Story-Specific] Finds Stories that have been added to an Epic. + * + * Existence Checks (`has:`): + * - has:attachment: [Story-Specific] Finds Stories with file attachments (not inline images). + * - has:task: [Story-Specific] Finds Stories with tasks. + * - has:comment: Finds Stories with comments. + * - has:label: Finds Stories with any label. + * - has:deadline: Finds Stories with a due date set. + * - has:owner: Finds Stories with an owner assigned. + * + * Boolean States (`is:`): + * - is:unstarted: Finds Stories in an "Unstarted" workflow state type. + * - is:started: Finds Stories in a "Started" workflow state type. + * - is:done: Finds Stories in a "Done" workflow state type. + * - is:unestimated: Finds Stories with a point estimate of 0. + * - is:overdue: Finds Stories whose due date is in the past. + * - is:archived: Finds archived Stories. + * + * VCS Integration: + * - has:branch: [Story-Specific] Finds Stories with any associated VCS branch. + * - has:commit: [Story-Specific] Finds Stories with any associated VCS commit. + * - has:pr: [Story-Specific] Finds Stories with any associated VCS pull request. + * - branch: [Story-Specific] Finds Stories associated with a VCS branch by name. `branch:feature/new-login` + * - commit: [Story-Specific] Finds Stories associated with a VCS commit by full hash or URL. `commit:a1b2c3d4` + * - pr: [Story-Specific] Finds Stories associated with a VCS pull request by number or URL. `pr:123` + * + * Custom Fields (Shortcut Defined Only): + * - skill-set: Filters by the 'Skill Set' custom field value. + * - product-area: Filters by the 'Product Area' custom field value. + * - technical-area: Filters by the 'Technical Area' custom field value. + * - priority: Filters by the 'Priority' custom field value. + * - severity: Filters by the 'Severity' custom field value. + * *Note: Advanced (user-created) Custom Fields are not searchable via operators at this time.* + * + * Date-Based Filtering: + * - Date Format: Use `YYYY-MM-DD`. + * - Date Ranges: Use `..` between dates: `YYYY-MM-DD..YYYY-MM-DD`. + * - Open-Ended Ranges: Use `*`: `*..YYYY-MM-DD` (before), `YYYY-MM-DD..*` (after). + * - Keywords: `today`, `yesterday`. `tomorrow` (only for `due:`). Cannot mix keywords and YYYY-MM-DD dates in a range. + * - created: Filters by creation date/range. `created:2023-10-01..2023-10-31` `created:yesterday` + * - updated: Filters by last updated date/range. `updated:2023-11-01..*` + * - completed: Filters by completion date/range. `completed:today` + * - moved: Filters by date/range the Story changed workflow state. `moved:*..2023-09-30` + * - due: Filters by due date/range. `due:tomorrow` `due:2023-12-25` + * + * Combining Conditions & Negation: + * - AND (Default): Multiple terms/operators are implicitly joined by AND. `bug label:critical owner:janedoe` finds critical bugs owned by janedoe. + * - NOT (Exclusion): Prefix an operator with `!` or `-` to negate it. + * Example: `!has:comment` finds Stories with no comments. + * Example: `-label:critical` finds Stories without the "critical" label. + * - OR: Not supported directly in search queries. + * - Quoting: Use double quotes `"` around multi-word values for operators like `state:`, `label:`, `project:`, `epic:`, `objective:`, `team:`, and for exact phrase matching in `title:`, `description:`, `comment:`. + * + * Sorting Results: + * Sorting is not controlled via the search query string itself. Result order depends on Shortcut's ranking, and pagination tokens should be used for stable results across pages. + * + * Examples of Shortcut Search Queries: + * 1. Find all bugs assigned to me: + * `type:bug owner:myusername` + * 2. Find features in the "Mobile App" project that are not done: + * `type:feature project:"Mobile App" !is:done` + * 3. Find stories with the "urgent" label updated since the start of the month: + * `label:urgent updated:YYYY-MM-01..*` (replace YYYY-MM with current year/month) + * 4. Find stories mentioning "database migration" in comments or description, requested by johnsmith: + * `"database migration" requester:johnsmith` + * 5. Find stories without an estimate in the "Ready for Dev" state: + * `is:unestimated state:"Ready for Dev"` + * 6. Find stories due today or tomorrow: + * `due:today OR due:tomorrow` (Note: This conceptual OR needs two separate queries or UI filtering, as OR is not supported in one query string) + * *Actual Queries:* `due:today` and `due:tomorrow` run separately. + * 7. Find stories that are blockers and are overdue: + * `is:blocker is:overdue` + * 8. Find epics related to the "Q4 Goals" objective: + * `is:epic objective:"Q4 Goals"` + * 9. Find stories with attached PRs but no comments: + * `has:pr !has:comment` + * 10. Find chores created yesterday: + * `type:chore created:yesterday` + * + * Special Considerations: + * - Quoting: Essential for multi-word values in many operators and for exact phrase searches. + * - Legacy Features: `project:` operator relates to a legacy feature. + * - Custom Fields: Only specific, predefined custom fields are searchable with operators. + * - User Mentions: Use the `@`-name *without* the `@` for `owner:` and `requester:`. + * + * Limitations: + * - No OR logic combinator within a single query string. + * - No direct sorting control via the query string. + * - Limited searchability for user-created custom fields. + * + * Example Query Strings: + * `"state:\"Ready for Dev\" owner:leetHacker !label:\"needs design\""` + * `"type:chore updated:today"` + * `"is:overdue project:\"Mobile App\""` + * `"epic:\"User Authentication\" has:pr"` + * + * IMPORTANT: For general discovery, starting with free text search combined with key operators like `state:`, `owner:`, `type:`, or `label:` is often most effective. Remember to use quotes for multi-word values. + */ +const tool = async (input: Input) => { + const { searchQuery } = input; + + if (!searchQuery) { + return { data: null, searchQuery }; + } + + return shortcut + .search({ query: searchQuery } as Search) + .then((response) => { + const searchResultData: SearchResults = response.data; + return { data: searchResultData, searchQuery }; + }) + .catch((error: any) => { + console.error(`Search tool failed for query "${searchQuery}":`, error); + return { error: error?.message ?? "An unknown search error occurred", searchQuery }; + }); +}; + +export default tool; From 4fb7ff47a920223dfd7fdff8626bf281780b9038 Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 18:09:09 -0400 Subject: [PATCH 06/11] delete wrong files --- raycast-env.d.ts | 43 ------------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 raycast-env.d.ts diff --git a/raycast-env.d.ts b/raycast-env.d.ts deleted file mode 100644 index 65d1eb074a0..00000000000 --- a/raycast-env.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -/// - -/* 🚧 🚧 🚧 - * This file is auto-generated from the extension's manifest. - * Do not modify manually. Instead, update the `package.json` file. - * 🚧 🚧 🚧 */ - -/* eslint-disable @typescript-eslint/ban-types */ - -type ExtensionPreferences = { - /** API Token - The API token for the Shortcut */ - "apiToken": string -} - -/** Preferences accessible in all the extension's commands */ -declare type Preferences = ExtensionPreferences - -declare namespace Preferences { - /** Preferences accessible in the `assigned-stories` command */ - export type AssignedStories = ExtensionPreferences & {} - /** Preferences accessible in the `show-iterations` command */ - export type ShowIterations = ExtensionPreferences & {} - /** Preferences accessible in the `show-epics` command */ - export type ShowEpics = ExtensionPreferences & {} - /** Preferences accessible in the `create-story` command */ - export type CreateStory = ExtensionPreferences & {} - /** Preferences accessible in the `search-stories` command */ - export type SearchStories = ExtensionPreferences & {} -} - -declare namespace Arguments { - /** Arguments passed to the `assigned-stories` command */ - export type AssignedStories = {} - /** Arguments passed to the `show-iterations` command */ - export type ShowIterations = {} - /** Arguments passed to the `show-epics` command */ - export type ShowEpics = {} - /** Arguments passed to the `create-story` command */ - export type CreateStory = {} - /** Arguments passed to the `search-stories` command */ - export type SearchStories = {} -} - From 339d08a227411713d446b0237b49022de9fdb65e Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 18:11:06 -0400 Subject: [PATCH 07/11] delete --- src/tools/create-story.ts | 144 ------------------------ src/tools/current-member-info.ts | 6 - src/tools/get-epics.ts | 6 - src/tools/get-groups.ts | 6 - src/tools/get-iterations.ts | 6 - src/tools/get-members.ts | 6 - src/tools/get-projects.ts | 6 - src/tools/get-workflows.ts | 6 - src/tools/search-stories.ts | 182 ------------------------------- 9 files changed, 368 deletions(-) delete mode 100644 src/tools/create-story.ts delete mode 100644 src/tools/current-member-info.ts delete mode 100644 src/tools/get-epics.ts delete mode 100644 src/tools/get-groups.ts delete mode 100644 src/tools/get-iterations.ts delete mode 100644 src/tools/get-members.ts delete mode 100644 src/tools/get-projects.ts delete mode 100644 src/tools/get-workflows.ts delete mode 100644 src/tools/search-stories.ts diff --git a/src/tools/create-story.ts b/src/tools/create-story.ts deleted file mode 100644 index bd644f3b8e7..00000000000 --- a/src/tools/create-story.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { CreateStoryParams } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -type Input = { - /** REQUIRED - The name of the story. */ - name: string; - /** The description of the story. */ - description?: string; - // /** The type of story (feature, bug, chore). */ - story_type?: "feature" | "chore" | "bug"; - /** - * The ID of the iteration the story belongs to. - * @format int64 - */ - iteration_id?: string; - /** - * The id of the group to associate with this story. - * @format uuid - */ - group_id?: string; - /** - * REQUIRED - The ID of the workflow state the story will be in. Mapped to the WorkflowState.id field. Ignore EpicWorkflow. - * @format int64 - */ - workflow_state_id: string; - /** An array of UUIDs of the owners of this story. */ - owner_ids?: string[]; - /** - * The ID of the project the story belongs to. - * @format int64 - */ - project_id?: string; - /** - * The ID of the epic the story belongs to. - * @format int64 - */ - epic_id?: string; - /** - * The numeric point estimate of the story. Can also be null, which means unestimated. - * @format int64 - */ - estimate?: string; - /** - * The due date of the story. - * @format date-time - */ - deadline?: string; -}; - -const mapInputToStoryParams = (input: Input): CreateStoryParams => { - const storyParams: CreateStoryParams = Object.entries(input).reduce((acc, [key, value]) => { - if (value === undefined || value === null || value === "") { - return acc; // Skip undefined, null, and empty string values - } - switch (key) { - case "iteration_id": - case "project_id": - case "epic_id": - case "estimate": - case "workflow_state_id": - return { - ...acc, - [key]: parseInt(value as string, 10), - }; - case "owner_ids": - return { - ...acc, - [key]: (value as string[]) || [], // Ensure it's an array or default to an empty array - }; - default: - return { - ...acc, - [key]: value, - }; - } - }, {} as CreateStoryParams); - - return storyParams; -}; - -const tool = async (input: Input) => { - if (!input.name) { - throw new Error("Name is required"); - } - if (!input.workflow_state_id) { - throw new Error("Workflow state ID is required"); - } - - return shortcut.createStory(mapInputToStoryParams(input)).then((response) => response.data); -}; - -export const confirmation = async (input: Input) => { - const info = [{ name: "Name", value: input.name }]; - - if (input.description) { - info.push({ name: "Description", value: input.description }); - } - - if (input.story_type) { - info.push({ name: "Type", value: input.story_type }); - } - - if (input.deadline) { - info.push({ name: "Due Date", value: new Date(input.deadline).toLocaleDateString() }); - } - - if (input.estimate) { - info.push({ name: "Estimate", value: `${input.estimate}` }); - } - - if (input.iteration_id) { - const { data: iteration } = await shortcut.getIteration(parseInt(input.iteration_id as string, 10)); - info.push({ name: "Iteration", value: iteration.name }); - } - - if (input.group_id) { - const { data: group } = await shortcut.getGroup(input.group_id); - info.push({ name: "Group", value: group.name }); - } - - if (input.epic_id) { - const { data: epic } = await shortcut.getEpic(parseInt(input.epic_id as string, 10)); - info.push({ name: "Epic", value: epic.name }); - } - - if (input.project_id) { - const { data: project } = await shortcut.getProject(parseInt(input.project_id as string, 10)); - info.push({ name: "Project", value: project.name }); - } - - if (input.owner_ids) { - const owners = await Promise.all( - input.owner_ids.map(async (ownerId) => { - const { data: owner } = await shortcut.getMember(ownerId, {}); - return owner.profile.name; - }) - ); - info.push({ name: "Owners", value: owners.join(", ") }); - } - - return { info }; -}; - -export default tool; diff --git a/src/tools/current-member-info.ts b/src/tools/current-member-info.ts deleted file mode 100644 index 10b65cc5d91..00000000000 --- a/src/tools/current-member-info.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { MemberInfo } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -const tool = (): Promise => shortcut.getCurrentMemberInfo().then((response) => response.data); - -export default tool; diff --git a/src/tools/get-epics.ts b/src/tools/get-epics.ts deleted file mode 100644 index e86b298022d..00000000000 --- a/src/tools/get-epics.ts +++ /dev/null @@ -1,6 +0,0 @@ -import shortcut from "../utils/shortcut"; -import { EpicSlim } from "@useshortcut/client"; - -const tool = (): Promise => shortcut.listEpics({}).then((response) => response.data); - -export default tool; diff --git a/src/tools/get-groups.ts b/src/tools/get-groups.ts deleted file mode 100644 index e6684bfc760..00000000000 --- a/src/tools/get-groups.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Group } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -const tool = (): Promise => shortcut.listGroups().then((response) => response.data); - -export default tool; diff --git a/src/tools/get-iterations.ts b/src/tools/get-iterations.ts deleted file mode 100644 index 9ebf6d4bc26..00000000000 --- a/src/tools/get-iterations.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IterationSlim } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -const tool = (): Promise => shortcut.listIterations().then((response) => response.data); - -export default tool; diff --git a/src/tools/get-members.ts b/src/tools/get-members.ts deleted file mode 100644 index 0b051412cae..00000000000 --- a/src/tools/get-members.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Member } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -const tool = (): Promise => shortcut.listMembers({}).then((response) => response.data); - -export default tool; diff --git a/src/tools/get-projects.ts b/src/tools/get-projects.ts deleted file mode 100644 index 660ec85bd80..00000000000 --- a/src/tools/get-projects.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ListMembers, Member, Project } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -const tool = (): Promise => shortcut.listProjects().then((response) => response.data); - -export default tool; diff --git a/src/tools/get-workflows.ts b/src/tools/get-workflows.ts deleted file mode 100644 index 10ccb708e69..00000000000 --- a/src/tools/get-workflows.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Workflow } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -const tool = (): Promise => shortcut.listWorkflows().then((response) => response.data); - -export default tool; diff --git a/src/tools/search-stories.ts b/src/tools/search-stories.ts deleted file mode 100644 index 3425454b824..00000000000 --- a/src/tools/search-stories.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { Search, SearchResults } from "@useshortcut/client"; -import shortcut from "../utils/shortcut"; - -type Input = { - searchQuery: string; -}; - -/** - * A Shortcut Search Query string used to filter and find Stories, Epics, and Objectives. - * - * Shortcut's search allows users to locate work items based on their attributes using specific operators and keywords. Queries primarily target Story titles, descriptions, and comments. This documentation provides a reference for the search syntax, supported operators, filtering logic, and examples. - * - * Search Logic: - * - By default, multiple operators or terms in a query are combined using AND logic. - * - OR logic is not currently supported directly within the search query string (though it may be available in UI filters). - * - Free text search (without specific operators) targets Story titles, descriptions, and comments. - * - * Basic Structure: - * Queries are typically composed of operators followed by values, often separated by a colon: - * operator:value - * Example: state:"Ready for Dev" - * Some operators act as boolean flags: - * is:blocker - * Free text can also be included: - * backend fix state:completed - * - * Operator Categories: - * Operators fall into two main categories: - * 1. Story-Specific Operators: Find results only for Stories (e.g., `type:`, `estimate:`). - * 2. General Operators: Find results across Stories, Epics, and Objectives (e.g., `id:`, `title:`, `owner:`). - * - * Supported Operators and Fields: - * - * Content Search: - * - (Free Text): Searches Story titles, descriptions, and comments. `hello world` searches for "hello" AND "world" anywhere in those fields. - * - title: Searches Story, Epic, Objective, and Iteration titles. - * - `title:hello` searches for "hello". - * - `title:"hello world"` searches for the exact phrase "hello world". - * - `title:hello world` searches for "hello" in titles AND "world" in titles/descriptions/comments. - * - description: Searches Story, Epic, and Objective descriptions. Behaves like `title:` regarding multiple words/quotes. - * - comment: Searches Story and Epic comments. Behaves like `title:` regarding multiple words/quotes. - * - * Item Identification & Type: - * - id: Finds an item by its numeric ID (e.g., `id:123`). Applies to Stories, Epics, Objectives. - * - type: [Story-Specific] Finds Stories of a specific type (`feature`, `bug`, or `chore`). Only one `type:` operator per query. `type:bug` - * - is:story: Returns only Stories. - * - is:epic: Returns only Epics. - * - * Attributes & Classification: - * - estimate: [Story-Specific] Finds Stories with a specific point estimate. `estimate:4` - * - state: Finds Stories in a specific Workflow state. Use quotes for multi-word states. `state:"In Development"` - * - label: Finds Stories or Epics with a specific label. Use quotes for multi-word labels. `label:"needs review"` (Note: Stories don't inherit Epic labels). - * - project: Finds Stories in a specific Project (name or ID), or Epics containing Stories in that Project. Use quotes for multi-word names. `project:frontend` (Note: Projects is a Legacy feature). - * - epic: Finds Stories within a specific Epic (name or ID). Use quotes for exact matches. `epic:"Q3 Launch"` - * - objective: Finds Stories in Epics linked to a specific Objective. Use quotes for multi-word names. `objective:"Increase Engagement"` - * - team: Finds Stories, Epics, and Iterations associated with a specific Team (use Team Name, not @-mention). `team:"Core Platform"` `team:"Product Development"` - * - * User Involvement: - * - owner: Finds Stories or Epics owned by a specific user (@-mention name without the '@'). `owner:janedoe` - * - requester: Finds Stories or Epics requested by a specific user (@-mention name without the '@'). `requester:johnsmith` - * - * Relationships & Status: - * - is:blocked: [Story-Specific] Finds Stories marked as blocked by another Story. - * - is:blocker: [Story-Specific] Finds Stories marked as blocking another Story. - * - has:epic: [Story-Specific] Finds Stories that have been added to an Epic. - * - * Existence Checks (`has:`): - * - has:attachment: [Story-Specific] Finds Stories with file attachments (not inline images). - * - has:task: [Story-Specific] Finds Stories with tasks. - * - has:comment: Finds Stories with comments. - * - has:label: Finds Stories with any label. - * - has:deadline: Finds Stories with a due date set. - * - has:owner: Finds Stories with an owner assigned. - * - * Boolean States (`is:`): - * - is:unstarted: Finds Stories in an "Unstarted" workflow state type. - * - is:started: Finds Stories in a "Started" workflow state type. - * - is:done: Finds Stories in a "Done" workflow state type. - * - is:unestimated: Finds Stories with a point estimate of 0. - * - is:overdue: Finds Stories whose due date is in the past. - * - is:archived: Finds archived Stories. - * - * VCS Integration: - * - has:branch: [Story-Specific] Finds Stories with any associated VCS branch. - * - has:commit: [Story-Specific] Finds Stories with any associated VCS commit. - * - has:pr: [Story-Specific] Finds Stories with any associated VCS pull request. - * - branch: [Story-Specific] Finds Stories associated with a VCS branch by name. `branch:feature/new-login` - * - commit: [Story-Specific] Finds Stories associated with a VCS commit by full hash or URL. `commit:a1b2c3d4` - * - pr: [Story-Specific] Finds Stories associated with a VCS pull request by number or URL. `pr:123` - * - * Custom Fields (Shortcut Defined Only): - * - skill-set: Filters by the 'Skill Set' custom field value. - * - product-area: Filters by the 'Product Area' custom field value. - * - technical-area: Filters by the 'Technical Area' custom field value. - * - priority: Filters by the 'Priority' custom field value. - * - severity: Filters by the 'Severity' custom field value. - * *Note: Advanced (user-created) Custom Fields are not searchable via operators at this time.* - * - * Date-Based Filtering: - * - Date Format: Use `YYYY-MM-DD`. - * - Date Ranges: Use `..` between dates: `YYYY-MM-DD..YYYY-MM-DD`. - * - Open-Ended Ranges: Use `*`: `*..YYYY-MM-DD` (before), `YYYY-MM-DD..*` (after). - * - Keywords: `today`, `yesterday`. `tomorrow` (only for `due:`). Cannot mix keywords and YYYY-MM-DD dates in a range. - * - created: Filters by creation date/range. `created:2023-10-01..2023-10-31` `created:yesterday` - * - updated: Filters by last updated date/range. `updated:2023-11-01..*` - * - completed: Filters by completion date/range. `completed:today` - * - moved: Filters by date/range the Story changed workflow state. `moved:*..2023-09-30` - * - due: Filters by due date/range. `due:tomorrow` `due:2023-12-25` - * - * Combining Conditions & Negation: - * - AND (Default): Multiple terms/operators are implicitly joined by AND. `bug label:critical owner:janedoe` finds critical bugs owned by janedoe. - * - NOT (Exclusion): Prefix an operator with `!` or `-` to negate it. - * Example: `!has:comment` finds Stories with no comments. - * Example: `-label:critical` finds Stories without the "critical" label. - * - OR: Not supported directly in search queries. - * - Quoting: Use double quotes `"` around multi-word values for operators like `state:`, `label:`, `project:`, `epic:`, `objective:`, `team:`, and for exact phrase matching in `title:`, `description:`, `comment:`. - * - * Sorting Results: - * Sorting is not controlled via the search query string itself. Result order depends on Shortcut's ranking, and pagination tokens should be used for stable results across pages. - * - * Examples of Shortcut Search Queries: - * 1. Find all bugs assigned to me: - * `type:bug owner:myusername` - * 2. Find features in the "Mobile App" project that are not done: - * `type:feature project:"Mobile App" !is:done` - * 3. Find stories with the "urgent" label updated since the start of the month: - * `label:urgent updated:YYYY-MM-01..*` (replace YYYY-MM with current year/month) - * 4. Find stories mentioning "database migration" in comments or description, requested by johnsmith: - * `"database migration" requester:johnsmith` - * 5. Find stories without an estimate in the "Ready for Dev" state: - * `is:unestimated state:"Ready for Dev"` - * 6. Find stories due today or tomorrow: - * `due:today OR due:tomorrow` (Note: This conceptual OR needs two separate queries or UI filtering, as OR is not supported in one query string) - * *Actual Queries:* `due:today` and `due:tomorrow` run separately. - * 7. Find stories that are blockers and are overdue: - * `is:blocker is:overdue` - * 8. Find epics related to the "Q4 Goals" objective: - * `is:epic objective:"Q4 Goals"` - * 9. Find stories with attached PRs but no comments: - * `has:pr !has:comment` - * 10. Find chores created yesterday: - * `type:chore created:yesterday` - * - * Special Considerations: - * - Quoting: Essential for multi-word values in many operators and for exact phrase searches. - * - Legacy Features: `project:` operator relates to a legacy feature. - * - Custom Fields: Only specific, predefined custom fields are searchable with operators. - * - User Mentions: Use the `@`-name *without* the `@` for `owner:` and `requester:`. - * - * Limitations: - * - No OR logic combinator within a single query string. - * - No direct sorting control via the query string. - * - Limited searchability for user-created custom fields. - * - * Example Query Strings: - * `"state:\"Ready for Dev\" owner:leetHacker !label:\"needs design\""` - * `"type:chore updated:today"` - * `"is:overdue project:\"Mobile App\""` - * `"epic:\"User Authentication\" has:pr"` - * - * IMPORTANT: For general discovery, starting with free text search combined with key operators like `state:`, `owner:`, `type:`, or `label:` is often most effective. Remember to use quotes for multi-word values. - */ -const tool = async (input: Input) => { - const { searchQuery } = input; - - if (!searchQuery) { - return { data: null, searchQuery }; - } - - return shortcut - .search({ query: searchQuery } as Search) - .then((response) => { - const searchResultData: SearchResults = response.data; - return { data: searchResultData, searchQuery }; - }) - .catch((error: any) => { - console.error(`Search tool failed for query "${searchQuery}":`, error); - return { error: error?.message ?? "An unknown search error occurred", searchQuery }; - }); -}; - -export default tool; From f36de0213082807325473e7e30690a9b8d1e9fa2 Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 18:18:27 -0400 Subject: [PATCH 08/11] Update extensions/shortcut/src/tools/create-story.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- extensions/shortcut/src/tools/create-story.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/shortcut/src/tools/create-story.ts b/extensions/shortcut/src/tools/create-story.ts index bd644f3b8e7..995d915e3b3 100644 --- a/extensions/shortcut/src/tools/create-story.ts +++ b/extensions/shortcut/src/tools/create-story.ts @@ -6,7 +6,7 @@ type Input = { name: string; /** The description of the story. */ description?: string; - // /** The type of story (feature, bug, chore). */ + /** The type of story (feature, bug, chore). */ story_type?: "feature" | "chore" | "bug"; /** * The ID of the iteration the story belongs to. From 60795809860d833daedd9ef2e222bc626c93d607 Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 18:20:52 -0400 Subject: [PATCH 09/11] Update extensions/shortcut/src/tools/create-story.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- extensions/shortcut/src/tools/create-story.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/shortcut/src/tools/create-story.ts b/extensions/shortcut/src/tools/create-story.ts index 995d915e3b3..a60d6b00abb 100644 --- a/extensions/shortcut/src/tools/create-story.ts +++ b/extensions/shortcut/src/tools/create-story.ts @@ -65,7 +65,7 @@ const mapInputToStoryParams = (input: Input): CreateStoryParams => { case "owner_ids": return { ...acc, - [key]: (value as string[]) || [], // Ensure it's an array or default to an empty array + [key]: value as string[], }; default: return { From a83d7321e02135b2c98f4490426bc0b25c40379e Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 19:37:12 -0400 Subject: [PATCH 10/11] Use new Yukaii name --- extensions/shortcut/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/shortcut/package.json b/extensions/shortcut/package.json index 16963145662..90737feb66d 100644 --- a/extensions/shortcut/package.json +++ b/extensions/shortcut/package.json @@ -4,7 +4,7 @@ "title": "Shortcut", "description": "Raycast extension for Shortcut", "icon": "command-icon.png", - "author": "Yukai", + "author": "Yukaii", "categories": [ "Productivity" ], From 02b8d0afa233ef8edf0377213b0338bd4dd19a06 Mon Sep 17 00:00:00 2001 From: "Vincent S.-G." Date: Sat, 12 Apr 2025 19:41:42 -0400 Subject: [PATCH 11/11] I guess it was correct after alll --- extensions/shortcut/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/shortcut/package.json b/extensions/shortcut/package.json index 90737feb66d..16963145662 100644 --- a/extensions/shortcut/package.json +++ b/extensions/shortcut/package.json @@ -4,7 +4,7 @@ "title": "Shortcut", "description": "Raycast extension for Shortcut", "icon": "command-icon.png", - "author": "Yukaii", + "author": "Yukai", "categories": [ "Productivity" ],