diff --git a/.github/workflows/deploy-docs-and-extensions.yml b/.github/workflows/deploy-docs-and-extensions.yml index 3efd92802111..f3dbeacfadbe 100644 --- a/.github/workflows/deploy-docs-and-extensions.yml +++ b/.github/workflows/deploy-docs-and-extensions.yml @@ -1,4 +1,4 @@ -name: Deploy Docs & Extensions # (/documentation and /extensions-site) +name: Deploy Documentation on: push: @@ -8,7 +8,6 @@ on: pull_request: paths: - 'documentation/**' - - 'extensions-site/**' jobs: deploy: @@ -43,34 +42,9 @@ jobs: npm install npm run build - - name: Cache Node.js modules (extensions-site) - uses: actions/cache@v3 - with: - path: ./extensions-site/node_modules - key: ${{ runner.os }}-extensions-${{ hashFiles('./extensions-site/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-extensions- - - - name: Install dependencies and build extensions-site - working-directory: ./extensions-site - env: - VITE_BASENAME: "/goose/v1/extensions/" # Set the base URL here for the extensions site - run: | - npm install - npm run build - - - name: Combine builds into one directory - run: | - mkdir combined-build - cp -r documentation/build/* combined-build/ - mkdir -p combined-build/v1/extensions - mkdir -p combined-build/v1/extensions/install-link-generator - cp -r extensions-site/build/client/* combined-build/v1/extensions/ - cp -r extensions-site/install-link-generator/* combined-build/v1/extensions/install-link-generator/ - - name: Deploy to /gh-pages if: github.event_name == 'push' && github.ref == 'refs/heads/main' uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: combined-build + publish_dir: documentation/build diff --git a/.github/workflows/pr-website-preview.yml b/.github/workflows/pr-website-preview.yml index 95cc62d85085..faeca2fbaf12 100644 --- a/.github/workflows/pr-website-preview.yml +++ b/.github/workflows/pr-website-preview.yml @@ -9,7 +9,6 @@ on: - closed paths: - 'documentation/**' - - 'extensions-site/**' concurrency: preview-${{ github.ref }} @@ -21,8 +20,8 @@ jobs: uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v3 if: github.event.action != 'closed' + uses: actions/setup-node@v3 with: node-version: 20 @@ -38,24 +37,8 @@ jobs: npm install npm run build - - name: Install dependencies and build extensions-site - working-directory: ./extensions-site - env: - VITE_BASENAME: "/goose/pr-preview/pr-${{ github.event.number }}/v1/extensions/" # Set the base URL here for the extensions site - run: | - npm install - npm run build - - - name: Combine builds into one directory - if: github.event.action != 'closed' - run: | - mkdir combined-build - cp -r documentation/build/* combined-build/ - mkdir -p combined-build/v1/extensions - cp -r extensions-site/build/client/* combined-build/v1/extensions/ - - name: Deploy preview uses: rossjrw/pr-preview-action@v1 if: ${{ github.event.pull_request.head.repo.full_name == 'block/goose' }} with: - source-dir: combined-build + source-dir: documentation/build diff --git a/documentation/.gitignore b/documentation/.gitignore index b2d6de30624f..70973d918f6f 100644 --- a/documentation/.gitignore +++ b/documentation/.gitignore @@ -1,5 +1,5 @@ # Dependencies -/node_modules +/node_modules/ # Production /build diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index 0bc82494b682..3cc97dd900e3 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -1,6 +1,7 @@ import { themes as prismThemes } from "prism-react-renderer"; import type { Config } from "@docusaurus/types"; import type * as Preset from "@docusaurus/preset-classic"; +import tailwindPlugin from "./plugins/tailwind-config.cjs"; // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) @@ -58,7 +59,11 @@ const config: Config = { blogSidebarCount: 'ALL' }, theme: { - customCss: "./src/css/custom.css", + customCss: [ + "./src/css/custom.css", + "./src/css/extensions.css", + "./src/css/tailwind.css", + ], }, } satisfies Preset.Options, ], @@ -95,10 +100,15 @@ const config: Config = { { from: '/docs', to: '/docs/category/getting-started' + }, + { + from: '/v1/extensions', + to: '/extensions' } - ] + ], }, ], + tailwindPlugin, ], themes: ["@inkeep/docusaurus/chatButton", "@inkeep/docusaurus/searchBar"], themeConfig: { @@ -118,7 +128,7 @@ const config: Config = { position: "left", }, { - to: "https://block.github.io/goose/v1/extensions/", + to: "/extensions", label: "Extensions", position: "left", }, @@ -127,6 +137,7 @@ const config: Config = { position: "left", label: "Docs", }, + { to: "/docs/category/tutorials", position: "left", @@ -157,7 +168,7 @@ const config: Config = { }, { label: "Extensions", - to: "https://block.github.io/goose/v1/extensions/", + to: "/extensions", }, ], }, @@ -236,4 +247,4 @@ const config: Config = { } satisfies Preset.ThemeConfig, }; -export default config; +export default config; \ No newline at end of file diff --git a/documentation/package-lock.json b/documentation/package-lock.json index 4fe648ca0017..ea31c8b4c41a 100644 --- a/documentation/package-lock.json +++ b/documentation/package-lock.json @@ -13,11 +13,17 @@ "@docusaurus/preset-classic": "3.7.0", "@inkeep/docusaurus": "^2.0.16", "@mdx-js/react": "^3.0.0", + "autoprefixer": "^10.4.17", "clsx": "^2.0.0", "dotenv": "^16.4.7", + "framer-motion": "^11.0.0", + "lucide-react": "^0.475.0", + "postcss": "^8.4.35", + "postcss-import": "^16.1.0", "prism-react-renderer": "^2.3.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "tailwindcss": "^3.4.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.7.0", @@ -260,6 +266,18 @@ "node": ">= 14.0.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -3843,6 +3861,50 @@ "integrity": "sha512-dQhjlvFnl3CVr0gWeJ/V/qLnDy1XYrCfkdVSa2D3gJTxI9/vOf9639Y1aPxTxO88DiXuW9CertLrZLB6SoJ2yg==", "license": "MIT" }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -4024,6 +4086,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -5240,6 +5312,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -5712,6 +5790,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -7102,6 +7189,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -7114,6 +7207,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -8098,6 +8197,34 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/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/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -8265,6 +8392,33 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "11.18.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "license": "MIT", + "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -9671,6 +9825,21 @@ "node": ">=0.10.0" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -10005,6 +10174,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.475.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz", + "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -12398,6 +12576,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", + "license": "MIT" + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -12426,6 +12628,17 @@ "multicast-dns": "cli.js" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.8", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", @@ -12637,6 +12850,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", @@ -12849,6 +13071,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -13003,6 +13231,28 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, "node_modules/path-to-regexp": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", @@ -13039,6 +13289,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", @@ -13128,9 +13396,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "funding": [ { "type": "opencollective", @@ -13698,6 +13966,42 @@ "postcss": "^8.4" } }, + "node_modules/postcss-import": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", + "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, "node_modules/postcss-lab-function": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.7.tgz", @@ -13727,6 +14031,53 @@ "postcss": "^8.4" } }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-loader": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", @@ -13973,6 +14324,31 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, "node_modules/postcss-nesting": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", @@ -15100,6 +15476,15 @@ "react": ">=15" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -16461,6 +16846,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "license": "MIT" + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -16528,6 +16934,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -16583,6 +17002,81 @@ "postcss": "^8.4.31" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/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/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/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/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -16647,6 +17141,72 @@ "node": ">= 10" } }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -16749,6 +17309,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -16817,6 +17398,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -17872,6 +18459,44 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "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/wrap-ansi-cjs/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==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", diff --git a/documentation/package.json b/documentation/package.json index 22df8a4d832f..160db1aa3a79 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -12,7 +12,8 @@ "serve": "docusaurus serve", "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", - "typecheck": "tsc" + "typecheck": "tsc", + "generate-detail-pages": "node scripts/generate-detail-pages.js" }, "dependencies": { "@docusaurus/core": "3.7.0", @@ -20,11 +21,17 @@ "@docusaurus/preset-classic": "3.7.0", "@inkeep/docusaurus": "^2.0.16", "@mdx-js/react": "^3.0.0", + "autoprefixer": "^10.4.17", "clsx": "^2.0.0", "dotenv": "^16.4.7", + "framer-motion": "^11.0.0", + "lucide-react": "^0.475.0", + "postcss": "^8.4.35", + "postcss-import": "^16.1.0", "prism-react-renderer": "^2.3.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "tailwindcss": "^3.4.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.7.0", @@ -47,4 +54,4 @@ "engines": { "node": ">=18.0" } -} +} \ No newline at end of file diff --git a/documentation/plugins/tailwind-config.cjs b/documentation/plugins/tailwind-config.cjs new file mode 100644 index 000000000000..f2b1775bdfd8 --- /dev/null +++ b/documentation/plugins/tailwind-config.cjs @@ -0,0 +1,15 @@ +function tailwindPlugin(context, options) { + return { + name: 'tailwind-plugin', + configurePostCss(postcssOptions) { + postcssOptions.plugins = [ + require('postcss-import'), + require('tailwindcss'), + require('autoprefixer'), + ]; + return postcssOptions; + }, + }; + } + + module.exports = tailwindPlugin; \ No newline at end of file diff --git a/documentation/postcss.config.js b/documentation/postcss.config.js new file mode 100644 index 000000000000..3b9828bbbce1 --- /dev/null +++ b/documentation/postcss.config.js @@ -0,0 +1,8 @@ +module.exports = { + plugins: { + 'postcss-import': {}, + 'tailwindcss/nesting': {}, + 'tailwindcss': {}, + 'autoprefixer': {}, + }, +}; \ No newline at end of file diff --git a/documentation/src/components/server-card.tsx b/documentation/src/components/server-card.tsx new file mode 100644 index 000000000000..db6754d9c1f5 --- /dev/null +++ b/documentation/src/components/server-card.tsx @@ -0,0 +1,138 @@ +import { Star, Download, Terminal, ChevronRight, Info } from "lucide-react"; +import { Badge } from "@site/src/components/ui/badge"; +import { Button } from "@site/src/components/ui/button"; +import type { MCPServer } from "@site/src/types/server"; +import Link from "@docusaurus/Link"; +import { useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { getGooseInstallLink } from "@site/src/utils/install-links"; + +export function ServerCard({ server }: { server: MCPServer }) { + const [isCommandVisible, setIsCommandVisible] = useState(false); + + return ( +
+
+
+
+
+
+ + + + + + + + {server.name} + +
+
+
+
+
+

{server.description}

+
+ +
+ {server.is_builtin ? ( +
+ + + Can be enabled in the goose settings page + +
+ ) : ( + <> + + + {isCommandVisible && ( + + + {`goose session --with-extension "${server.command}"`} + + + )} + + + )} +
+
+ +
+ e.stopPropagation()} + > + + {server.githubStars} on Github + +
+ {server.is_builtin ? ( +
+ Built-in +
+ ) : ( + + Install + + + )} +
+
+
+
+
+
+ ); +} diff --git a/extensions-site/app/components/ui/badge.tsx b/documentation/src/components/ui/badge.tsx similarity index 100% rename from extensions-site/app/components/ui/badge.tsx rename to documentation/src/components/ui/badge.tsx diff --git a/extensions-site/app/components/ui/button.tsx b/documentation/src/components/ui/button.tsx similarity index 100% rename from extensions-site/app/components/ui/button.tsx rename to documentation/src/components/ui/button.tsx diff --git a/extensions-site/app/components/ui/card.tsx b/documentation/src/components/ui/card.tsx similarity index 100% rename from extensions-site/app/components/ui/card.tsx rename to documentation/src/components/ui/card.tsx diff --git a/extensions-site/app/components/ui/input.tsx b/documentation/src/components/ui/input.tsx similarity index 100% rename from extensions-site/app/components/ui/input.tsx rename to documentation/src/components/ui/input.tsx diff --git a/documentation/src/css/custom.css b/documentation/src/css/custom.css index 7f97b9dca97b..09de8a0ca4dd 100644 --- a/documentation/src/css/custom.css +++ b/documentation/src/css/custom.css @@ -49,6 +49,25 @@ --ifm-code-font-size: 95%; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + /* Additional Arcade color system variables */ + --background-app: var(--constant-white); + --background-prominent: var(--grey-80); + --background-standard: var(--grey-90); + --background-subtle: var(--grey-95); + + --border-divider: var(--grey-90); + --border-inverse: var(--constant-white); + --border-prominent: var(--grey-10); + --border-standard: var(--grey-60); + --border-subtle: var(--grey-90); + + --icon-disabled: var(--grey-60); + --icon-extra-subtle: var(--grey-60); + --icon-inverse: var(--constant-white); + --icon-prominent: var(--grey-10); + --icon-standard: var(--grey-20); + --icon-subtle: var(--grey-50); + /* arcade colors */ --constant-white: #ffffff; --constant-black: #000000; @@ -162,8 +181,7 @@ /* video adnomition */ --ifm-color-video-alert-contrast-background: #336e62; --ifm-color-video-alert-contrast-foreground: rgb(216 251 216); - --ifm-color-video-alert-border: #99d5c5 - ; + --ifm-color-video-alert-border: #99d5c5; } /* overrides */ @@ -255,13 +273,64 @@ html[data-theme="light"] .hide-in-light { } .alert--video { - --ifm-alert-background-color: var(--ifm-color-video-alert-contrast-background); + --ifm-alert-background-color: var( + --ifm-color-video-alert-contrast-background + ); --ifm-alert-background-color-highlight: rgba(84, 199, 236, 0.15); - --ifm-alert-foreground-color: var(--ifm-color-video-alert-contrast-foreground); + --ifm-alert-foreground-color: var( + --ifm-color-video-alert-contrast-foreground + ); --ifm-alert-border-color: var(--ifm-color-video-alert-border); } .aspect-ratio{ aspect-ratio: 16 / 9; width: 100%; -} \ No newline at end of file +} + +.navbar { + border-bottom: 1px solid var(--border-divider); +} + +.navbar__item { + display: flex; + align-items: center; +} + +.iconExternalLink_nPIU { + margin-left: 8px !important; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} +.container { + width: 100%; +} diff --git a/documentation/src/css/extensions.css b/documentation/src/css/extensions.css new file mode 100644 index 000000000000..1e742592136a --- /dev/null +++ b/documentation/src/css/extensions.css @@ -0,0 +1,296 @@ +/* Animation for card hover effect */ +@keyframes rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* Search styling */ +.search-container { + position: relative; + margin-bottom: 2rem; +} + +.search-input { + width: 100%; + padding: 1rem 0; + font-size: 1rem; + color: var(--text-standard); + background: transparent; + border: none; + border-bottom: 1px solid var(--border-subtle); + transition: border-color 0.2s; +} + +.search-input:focus { + outline: none; + border-bottom-color: var(--border-standard); +} + +.search-input::placeholder { + color: var(--text-placeholder); +} + +/* Card base styles */ +.server-card { + position: relative; + height: 100%; + padding: 2px; + overflow: hidden; + border-radius: 17px; + background-color: var(--border-subtle); + transition: all 0.3s ease; +} + +.server-card.interactive:hover { + background-color: transparent; + transform: translateY(-2px); +} + +.server-card:hover .card-glow { + opacity: 1; +} + +.card-glow { + position: absolute; + opacity: 0; + pointer-events: none; + width: 600px; + height: 600px; + top: -150px; + left: -50px; + transform-origin: center; + background: linear-gradient(45deg, #13bbaf, #ff4f00); + animation: rotate 6s linear infinite; + z-index: -1; + transition: opacity 0.2s; +} + +.card { + height: 100%; + display: flex; + flex-direction: column; + background-color: var(--background-app); + border-radius: 15px; + box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + border: 1px solid var(--border-subtle); + overflow: hidden; + transition: all 0.3s ease; +} + +/* Card header styles */ +.card-header { + padding: 1.5rem 1.5rem 0.75rem 1.5rem; + display: flex; + align-items: center; +} + +.card-header-content { + display: flex; + align-items: center; + gap: 0.5rem; + width: 100%; +} + +/* Extension name and icon layout */ +.extension-title { + display: flex; + align-items: center; + gap: 0.5rem; + text-decoration: none !important; + color: var(--text-standard); + transition: color 0.2s; +} + +.extension-title:hover { + color: var(--text-prominent); + text-decoration: none !important; +} + +.extension-icon { + flex-shrink: 0; + width: 13px; + height: 12px; +} + +.home-page-server-name { + font-size: 1rem; + font-weight: 500; + line-height: 1.2; +} + +.home-page-server-name:hover { + color: var(--text-prominent); + text-decoration: none; +} + +/* Card content layout */ +.card-content { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 0 1.5rem 1.5rem 1.5rem; + gap: 1rem; +} + +.card-description { + font-size: 0.875rem; + line-height: 1.5; + color: var(--text-standard); + margin: 0; +} + +/* Command section styles */ +.command-toggle { + display: flex; + align-items: center; + width: 100%; + padding: 0.5rem 0; + font-size: 0.875rem; + color: var(--text-standard); + background: transparent; + border: none; + cursor: pointer; + transition: all 0.2s ease; +} + +.command-toggle:hover { + color: var(--text-prominent); +} + +.command-toggle h4 { + font-size: 0.875rem; + font-weight: 500; + margin: 0; +} + +.command-toggle svg { + width: 16px; + height: 16px; +} + +.command-content { + background-color: var(--background-subtle); + padding: 0.75rem; + border-radius: 0.375rem; + font-size: 0.875rem; + color: var(--text-standard); + margin-top: 0.5rem; +} + +.command-content code { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + font-size: 0.875rem; + background-color: transparent; + border: none; +} + +/* Card footer */ +.card-footer { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: auto; +} + +/* GitHub stats link */ +.card-stats { + display: flex; + align-items: center; + gap: 0.25rem; + font-size: 0.75rem; + color: var(--text-subtle); + transition: color 0.2s; + text-decoration: none !important; +} + +.card-stats:hover { + color: var(--text-prominent); + text-decoration: none !important; +} + +.card-stats svg { + width: 16px; + height: 16px; +} + +/* Card actions (Install button/Built-in badge) */ +.card-action { + margin-left: auto; +} + +.install-button { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.75rem; + color: var(--text-subtle); + transition: all 0.2s ease; + text-decoration: none !important; + padding: 0; +} + +.install-button:hover { + color: var(--text-prominent); + text-decoration: none !important; +} + +.install-button svg { + width: 16px; + height: 16px; + transition: color 0.2s; +} + +.install-button:hover svg { + color: #fa5204; +} + +.built-in-badge { + font-size: 0.75rem; + padding: 0.25rem 0.5rem; + border-radius: 999px; + background-color: var(--background-subtle); + color: var(--text-subtle); + cursor: help; +} + +/* Grid layout */ +.cards-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: 1.5rem; + width: 100%; + padding: 1rem 0; +} + +@media (min-width: 768px) { + .cards-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1024px) { + .cards-grid { + grid-template-columns: repeat(3, 1fr); + } +} + +/* Dark mode adjustments */ +html[data-theme="dark"] .card { + background-color: var(--background-app); + border-color: var(--border-subtle); + box-shadow: none; +} + +html[data-theme="dark"] .command-content { + background-color: rgba(255, 255, 255, 0.05); +} + +html[data-theme="dark"] .built-in-badge { + background-color: rgba(255, 255, 255, 0.1); +} diff --git a/documentation/src/css/tailwind.css b/documentation/src/css/tailwind.css new file mode 100644 index 000000000000..8619333c1f2e --- /dev/null +++ b/documentation/src/css/tailwind.css @@ -0,0 +1,75 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + /* start arcade colors */ + --constant-white: #ffffff; + --constant-black: #000000; + --grey-10: #101010; + --grey-20: #1e1e1e; + --grey-50: #666666; + --grey-60: #959595; + --grey-80: #cccccc; + --grey-85: #dadada; + --grey-90: #e8e8e8; + --grey-95: #f0f0f0; + --dark-grey-15: #1a1a1a; + --dark-grey-25: #232323; + --dark-grey-30: #2a2a2a; + --dark-grey-40: #333333; + --dark-grey-45: #595959; + --dark-grey-60: #878787; + --dark-grey-90: #e1e1e1; + + --background-app: var(--constant-white); + --background-prominent: var(--grey-80); + --background-standard: var(--grey-90); + --background-subtle: var(--grey-95); + + --border-divider: var(--grey-90); + --border-inverse: var(--constant-white); + --border-prominent: var(--grey-10); + --border-standard: var(--grey-60); + --border-subtle: var(--grey-90); + + --icon-disabled: var(--grey-60); + --icon-extra-subtle: var(--grey-60); + --icon-inverse: var(--constant-white); + --icon-prominent: var(--grey-10); + --icon-standard: var(--grey-20); + --icon-subtle: var(--grey-50); + + --text-placeholder: var(--grey-60); + --text-prominent: var(--grey-10); + --text-standard: var(--grey-20); + --text-subtle: var(--grey-50); + + &.dark { + --background-app: var(--constant-black); + --background-prominent: var(--dark-grey-40); + --background-standard: var(--dark-grey-25); + --background-subtle: var(--dark-grey-15); + + --border-divider: var(--dark-grey-25); + --border-inverse: var(--constant-black); + --border-prominent: var(--constant-white); + --border-standard: var(--dark-grey-45); + --border-subtle: var(--dark-grey-25); + + --icon-disabled: var(--dark-grey-45); + --icon-extra-subtle: var(--dark-grey-45); + --icon-inverse: var(--constant-black); + --icon-prominent: var(--constant-white); + --icon-standard: var(--dark-grey-90); + --icon-subtle: var(--dark-grey-60); + + --text-placeholder: var(--dark-grey-45); + --text-prominent: var(--constant-white); + --text-standard: var(--dark-grey-90); + --text-subtle: var(--dark-grey-60); + } + /* end arcade colors */ + } +} diff --git a/documentation/src/pages/extensions/detail.tsx b/documentation/src/pages/extensions/detail.tsx new file mode 100644 index 000000000000..32fadf02d743 --- /dev/null +++ b/documentation/src/pages/extensions/detail.tsx @@ -0,0 +1,259 @@ +import Layout from "@theme/Layout"; +import { Download, Terminal, Star, ArrowLeft, Info } from "lucide-react"; +import { Button } from "@site/src/components/ui/button"; +import { Badge } from "@site/src/components/ui/badge"; +import { getGooseInstallLink } from "@site/src/utils/install-links"; +import { useLocation } from "@docusaurus/router"; +import { useEffect, useState } from "react"; +import type { MCPServer } from "@site/src/types/server"; +import { fetchMCPServers } from "@site/src/utils/mcp-servers"; +import Link from "@docusaurus/Link"; + +function ExtensionDetail({ server }: { server: MCPServer }) { + return ( + +
+
+
+
+ + + +
+ +
+
+
+
+

+ {server.name} +

+ {server.is_builtin && ( + + Built-in + + )} +
+
+ +
+
+

+ {server.description} +

+
+ + {server.installation_notes && ( +
+

+ {server.installation_notes} +

+
+ )} + +
+ {server.is_builtin ? ( +
+ + + Can be enabled in the goose settings page + +
+ ) : ( + <> +
+ +

Command

+
+
+ + {`goose session --with-extension "${server.command}"`} + +
+ + )} +
+ + {server.environmentVariables && ( +
+

+ Environment Variables +

+ {server.environmentVariables.length > 0 ? ( +
+ {server.environmentVariables.map((env) => ( +
+
+ {env.name} +
+
+ {env.description} +
+ {env.required && ( + + Required + + )} +
+ ))} +
+ ) : ( +
+ + No environment variables needed +
+ )} +
+ )} + +
+ + + {server.githubStars} on Github + + + {server.is_builtin ? ( +
+ Built-in +
+ ) : ( + + Install + + + )} +
+
+
+
+
+
+
+
+ ); +} + +export default function DetailPage(): JSX.Element { + const location = useLocation(); + const [server, setServer] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const loadServer = async () => { + try { + setLoading(true); + setError(null); + const servers = await fetchMCPServers(); + // Get the ID from the query parameter + const params = new URLSearchParams(location.search); + const id = params.get("id"); + if (!id) { + setError("No extension ID provided"); + return; + } + const foundServer = servers.find((s) => s.id === id); + if (foundServer) { + setServer(foundServer); + } else { + setError("Extension not found"); + } + } catch (err) { + setError("Failed to load extension details"); + console.error(err); + } finally { + setLoading(false); + } + }; + + loadServer(); + }, [location]); + + if (loading) { + return ( + +
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ); + } + + if (error || !server) { + return ( + +
+
+
+
+ + + +
+
+
+
+ {error || "Extension not found"} +
+
+
+
+
+
+
+ ); + } + + return ; +} diff --git a/documentation/src/pages/extensions/index.tsx b/documentation/src/pages/extensions/index.tsx new file mode 100644 index 000000000000..85772c188a55 --- /dev/null +++ b/documentation/src/pages/extensions/index.tsx @@ -0,0 +1,118 @@ +import { Search } from "lucide-react"; +import { Button } from "@site/src/components/ui/button"; +import { Input } from "@site/src/components/ui/input"; +import { ServerCard } from "@site/src/components/server-card"; +import { useState, useEffect } from "react"; +import type { MCPServer } from "@site/src/types/server"; +import { fetchMCPServers, searchMCPServers } from "@site/src/utils/mcp-servers"; +import { motion } from "framer-motion"; +import Layout from "@theme/Layout"; + +export default function HomePage() { + const [servers, setServers] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + // Combined effect for initial load and search + useEffect(() => { + const loadServers = async () => { + try { + setIsLoading(true); + setError(null); + + const trimmedQuery = searchQuery.trim(); + const results = trimmedQuery + ? await searchMCPServers(trimmedQuery) + : await fetchMCPServers(); + + console.log("Loaded servers:", results); + setServers(results); + } catch (err) { + const errorMessage = + err instanceof Error ? err.message : "Unknown error"; + setError(`Failed to load servers: ${errorMessage}`); + console.error("Error loading servers:", err); + } finally { + setIsLoading(false); + } + }; + + // Debounce all server loads + const timeoutId = setTimeout(loadServers, 300); + return () => clearTimeout(timeoutId); + }, [searchQuery]); + + return ( + +
+
+

+ Browse Extensions +

+

+ Your central directory for discovering and installing extensions. +

+
+ +
+ setSearchQuery(e.target.value)} + /> +
+ + {error && ( +
{error}
+ )} + +
+
+

+ {searchQuery + ? `${servers.length} result${ + servers.length > 1 ? "s" : "" + } for "${searchQuery}"` + : ""} +

+
+ + {isLoading ? ( +
Loading servers...
+ ) : servers.length === 0 ? ( +
+ {searchQuery + ? "No servers found matching your search." + : "No servers available."} +
+ ) : ( +
+ {servers + .sort((a, b) => { + // Sort built-in servers first + if (a.is_builtin && !b.is_builtin) return -1; + if (!a.is_builtin && b.is_builtin) return 1; + return 0; + }) + .map((server) => ( + + + + ))} +
+ )} +
+
+
+ ); +} diff --git a/extensions-site/app/styles/main.css b/documentation/src/pages/extensions/styles/main.css similarity index 100% rename from extensions-site/app/styles/main.css rename to documentation/src/pages/extensions/styles/main.css diff --git a/extensions-site/app/types/server.ts b/documentation/src/types/server.ts similarity index 100% rename from extensions-site/app/types/server.ts rename to documentation/src/types/server.ts diff --git a/documentation/src/utils/install-links.ts b/documentation/src/utils/install-links.ts new file mode 100644 index 000000000000..e5b27dadf61e --- /dev/null +++ b/documentation/src/utils/install-links.ts @@ -0,0 +1,5 @@ +import type { MCPServer } from "../types/server"; + +export function getGooseInstallLink(server: MCPServer): string { + return `goose://install/${encodeURIComponent(server.command)}`; +} \ No newline at end of file diff --git a/extensions-site/app/utils/install-links.tsx b/documentation/src/utils/install-links.tsx similarity index 100% rename from extensions-site/app/utils/install-links.tsx rename to documentation/src/utils/install-links.tsx diff --git a/documentation/src/utils/mcp-servers.ts b/documentation/src/utils/mcp-servers.ts new file mode 100644 index 000000000000..eb99b5a0a269 --- /dev/null +++ b/documentation/src/utils/mcp-servers.ts @@ -0,0 +1,33 @@ +import type { MCPServer } from "../types/server"; + +const SERVERS_URL = "/goose/servers.json"; + +export async function fetchMCPServers(): Promise { + try { + const response = await fetch(SERVERS_URL); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + console.log('Fetched MCP servers data:', data); + return data; + } catch (error) { + console.error("Error fetching MCP servers:", error); + throw error; + } +} + +export async function searchMCPServers(query: string): Promise { + const servers = await fetchMCPServers(); + const normalizedQuery = query.toLowerCase(); + + return servers.filter((server) => { + const normalizedName = server.name.toLowerCase(); + const normalizedDescription = server.description.toLowerCase(); + + return ( + normalizedName.includes(normalizedQuery) || + normalizedDescription.includes(normalizedQuery) + ); + }); +} \ No newline at end of file diff --git a/extensions-site/app/assets/goose.svg b/documentation/static/img/goose.svg similarity index 100% rename from extensions-site/app/assets/goose.svg rename to documentation/static/img/goose.svg diff --git a/extensions-site/install-link-generator/index.html b/documentation/static/install-link-generator/index.html similarity index 95% rename from extensions-site/install-link-generator/index.html rename to documentation/static/install-link-generator/index.html index 9a73ce0e40c8..3fff8ece03c2 100644 --- a/extensions-site/install-link-generator/index.html +++ b/documentation/static/install-link-generator/index.html @@ -4,7 +4,7 @@ Goose Install Link Generator - +
@@ -67,6 +67,6 @@

Generated Link

- + \ No newline at end of file diff --git a/extensions-site/install-link-generator/script.js b/documentation/static/install-link-generator/script.js similarity index 100% rename from extensions-site/install-link-generator/script.js rename to documentation/static/install-link-generator/script.js diff --git a/extensions-site/install-link-generator/styles.css b/documentation/static/install-link-generator/styles.css similarity index 100% rename from extensions-site/install-link-generator/styles.css rename to documentation/static/install-link-generator/styles.css diff --git a/extensions-site/public/servers.json b/documentation/static/servers.json similarity index 100% rename from extensions-site/public/servers.json rename to documentation/static/servers.json diff --git a/extensions-site/tailwind.config.ts b/documentation/tailwind.config.js similarity index 73% rename from extensions-site/tailwind.config.ts rename to documentation/tailwind.config.js index e998d3a38b4b..b568a8c0b8d9 100644 --- a/extensions-site/tailwind.config.ts +++ b/documentation/tailwind.config.js @@ -1,13 +1,11 @@ -import type { Config } from "tailwindcss"; - -export default { - content: ["./app/**/{**,.client,.server}/**/*.{js,jsx,ts,tsx}"], +// tailwind.config.js +module.exports = { + content: ["./src/**/*.{js,jsx,ts,tsx}"], darkMode: "class", - safelist: ["dark"], theme: { extend: { colors: { - // start arcade colors + // Arcade colors bgApp: "var(--background-app)", bgSubtle: "var(--background-subtle)", bgStandard: "var(--background-standard)", @@ -24,12 +22,11 @@ export default { iconProminent: "var(--icon-prominent)", iconStandard: "var(--icon-standard)", iconSubtle: "var(--icon-subtle)", - // end arcade colors }, fontFamily: { - sans: ['"Cash Sans"'], + sans: ['"Cash Sans"', "sans-serif"], }, }, }, plugins: [], -} satisfies Config; +}; diff --git a/documentation/yarn.lock b/documentation/yarn.lock index bc2760c5ed32..248bf1c27a33 100644 --- a/documentation/yarn.lock +++ b/documentation/yarn.lock @@ -150,6 +150,11 @@ dependencies: "@algolia/client-common" "5.20.0" +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + "@ampproject/remapping@^2.2.0": version "2.3.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" @@ -1887,6 +1892,18 @@ resolved "https://registry.npmjs.org/@inkeep/docusaurus/-/docusaurus-2.0.16.tgz" integrity sha512-dQhjlvFnl3CVr0gWeJ/V/qLnDy1XYrCfkdVSa2D3gJTxI9/vOf9639Y1aPxTxO88DiXuW9CertLrZLB6SoJ2yg== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" @@ -1906,7 +1923,7 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== @@ -2009,6 +2026,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@pnpm/config.env-replace@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz" @@ -2816,6 +2838,11 @@ ansi-styles@^6.1.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" @@ -2824,7 +2851,7 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -arg@^5.0.0: +arg@^5.0.0, arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== @@ -2861,7 +2888,7 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.19: +autoprefixer@^10.4.17, autoprefixer@^10.4.19: version "10.4.20" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz" integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== @@ -3004,6 +3031,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" @@ -3093,6 +3127,11 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" @@ -3186,7 +3225,7 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.4.2, chokidar@^3.5.3: +chokidar@^3.4.2, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3298,6 +3337,11 @@ commander@^2.20.0: resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commander@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" @@ -3464,7 +3508,7 @@ cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: parse-json "^5.2.0" path-type "^4.0.0" -cross-spawn@^7.0.3: +cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -3806,6 +3850,11 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -3813,6 +3862,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + dns-packet@^5.2.2: version "5.6.1" resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" @@ -4256,7 +4310,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.3" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -4386,6 +4440,14 @@ follow-redirects@^1.0.0: resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" @@ -4425,6 +4487,15 @@ fraction.js@^4.3.7: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +framer-motion@^11.0.0: + version "11.18.2" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz" + integrity sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w== + dependencies: + motion-dom "^11.18.1" + motion-utils "^11.18.1" + tslib "^2.4.0" + fresh@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" @@ -4527,11 +4598,30 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -5267,6 +5357,15 @@ isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-util@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" @@ -5298,7 +5397,7 @@ jest-worker@^29.4.3: merge-stream "^2.0.0" supports-color "^8.0.0" -jiti@^1.20.0: +jiti@^1.20.0, jiti@^1.21.6: version "1.21.7" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== @@ -5415,7 +5514,7 @@ leven@^3.1.0: resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -lilconfig@^3.1.1: +lilconfig@^3.0.0, lilconfig@^3.1.1, lilconfig@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== @@ -5510,6 +5609,11 @@ lowercase-keys@^3.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" @@ -5517,6 +5621,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lucide-react@^0.475.0: + version "0.475.0" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz" + integrity sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg== + markdown-extensions@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz" @@ -6315,11 +6424,35 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +motion-dom@^11.18.1: + version "11.18.1" + resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz" + integrity sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw== + dependencies: + motion-utils "^11.18.1" + +motion-utils@^11.18.1: + version "11.18.1" + resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz" + integrity sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA== + mrmime@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" @@ -6343,6 +6476,15 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nanoid@^3.3.8: version "3.3.8" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" @@ -6433,11 +6575,16 @@ null-loader@^4.0.1: loader-utils "^2.0.0" schema-utils "^3.0.0" -object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.13.3: version "1.13.3" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" @@ -6572,6 +6719,11 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + package-json@^8.1.0: version "8.1.1" resolved "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz" @@ -6688,6 +6840,14 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@^1.7.0: version "1.9.0" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz" @@ -6720,6 +6880,16 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + pkg-dir@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz" @@ -6907,6 +7077,31 @@ postcss-image-set-function@^7.0.0: "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-import@^16.1.0: + version "16.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz" + integrity sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + postcss-lab-function@^7.0.7: version "7.0.7" resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.7.tgz" @@ -6918,6 +7113,14 @@ postcss-lab-function@^7.0.7: "@csstools/postcss-progressive-custom-properties" "^4.0.0" "@csstools/utilities" "^2.0.0" +postcss-load-config@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + postcss-loader@^7.3.3: version "7.3.4" resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz" @@ -7020,6 +7223,13 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" +postcss-nested@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== + dependencies: + postcss-selector-parser "^6.1.1" + postcss-nesting@^13.0.1: version "13.0.1" resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz" @@ -7233,7 +7443,7 @@ postcss-selector-not@^8.0.1: dependencies: postcss-selector-parser "^7.0.0" -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== @@ -7271,7 +7481,7 @@ postcss-unique-selectors@^6.0.4: dependencies: postcss-selector-parser "^6.0.16" -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== @@ -7281,10 +7491,10 @@ postcss-zindex@^6.0.2: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz" integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.2, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.6: - version "8.5.1" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz" - integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.2.2, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.35, postcss@^8.4.38, postcss@^8.4.47, postcss@^8.4.6, postcss@>=8.0.9: + version "8.5.2" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz" + integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== dependencies: nanoid "^3.3.8" picocolors "^1.1.1" @@ -7551,11 +7761,18 @@ react-router@^5.3.4, react-router@>=5, react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@*, "react@^16.13.1 || ^17.0.0 || ^18.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", react@^19.0.0, "react@>= 16.8.0 < 19.0.0", react@>=15, react@>=16, react@>=16.0.0: +react@*, "react@^16.13.1 || ^17.0.0 || ^18.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", react@^19.0.0, "react@>= 16.8.0 < 19.0.0", react@>=15, react@>=16, react@>=16.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz" integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + readable-stream@^2.0.1: version "2.3.8" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" @@ -7856,7 +8073,7 @@ resolve-pathname@^3.0.0: resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.1.6, resolve@^1.14.2: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.8: version "1.22.10" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -8178,6 +8395,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sirv@^2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz" @@ -8336,6 +8558,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -8380,6 +8611,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -8429,6 +8667,19 @@ stylehacks@^6.1.1: browserslist "^4.23.0" postcss-selector-parser "^6.0.16" +sucrase@^3.35.0: + version "3.35.0" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -8466,6 +8717,34 @@ svgo@^3.0.2, svgo@^3.2.0: csso "^5.0.5" picocolors "^1.0.0" +tailwindcss@^3.4.1: + version "3.4.17" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz" + integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.6.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.2" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.6" + lilconfig "^3.1.3" + micromatch "^4.0.8" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.1.1" + postcss "^8.4.47" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" + tapable@^1.0.0: version "1.1.3" resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" @@ -8502,6 +8781,20 @@ text-table@^0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + thunky@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" @@ -8544,7 +8837,12 @@ trough@^2.0.0: resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== -tslib@^2.0.3, tslib@^2.6.0: +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0: version "2.8.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -8986,6 +9284,15 @@ wildcard@^2.0.0, wildcard@^2.0.1: resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -9051,6 +9358,11 @@ yaml@^1.7.2: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.3.4: + version "2.7.0" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" diff --git a/extensions-site/.dockerignore b/extensions-site/.dockerignore deleted file mode 100644 index 9b8d514712ec..000000000000 --- a/extensions-site/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.react-router -build -node_modules -README.md \ No newline at end of file diff --git a/extensions-site/.github/pages.yml b/extensions-site/.github/pages.yml deleted file mode 100644 index f28bd9456d26..000000000000 --- a/extensions-site/.github/pages.yml +++ /dev/null @@ -1,4 +0,0 @@ -# This file is used to configure GitHub Pages - -name: Goose Extensions -description: Your central directory for discovering and installing extensions \ No newline at end of file diff --git a/extensions-site/.gitignore b/extensions-site/.gitignore deleted file mode 100644 index 9b7c041f96ea..000000000000 --- a/extensions-site/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.DS_Store -/node_modules/ - -# React Router -/.react-router/ -/build/ diff --git a/extensions-site/.npmrc b/extensions-site/.npmrc deleted file mode 100644 index 214c29d13959..000000000000 --- a/extensions-site/.npmrc +++ /dev/null @@ -1 +0,0 @@ -registry=https://registry.npmjs.org/ diff --git a/extensions-site/Dockerfile b/extensions-site/Dockerfile deleted file mode 100644 index 207bf937e383..000000000000 --- a/extensions-site/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM node:20-alpine AS development-dependencies-env -COPY . /app -WORKDIR /app -RUN npm ci - -FROM node:20-alpine AS production-dependencies-env -COPY ./package.json package-lock.json /app/ -WORKDIR /app -RUN npm ci --omit=dev - -FROM node:20-alpine AS build-env -COPY . /app/ -COPY --from=development-dependencies-env /app/node_modules /app/node_modules -WORKDIR /app -RUN npm run build - -FROM node:20-alpine -COPY ./package.json package-lock.json /app/ -COPY --from=production-dependencies-env /app/node_modules /app/node_modules -COPY --from=build-env /app/build /app/build -WORKDIR /app -CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/extensions-site/README.md b/extensions-site/README.md deleted file mode 100644 index 72c5e77d2f2d..000000000000 --- a/extensions-site/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Goose Extensions - -``` -npm i -npm run dev -``` diff --git a/extensions-site/app/assets/favicon.ico b/extensions-site/app/assets/favicon.ico deleted file mode 100644 index 29e3cfdc344b..000000000000 Binary files a/extensions-site/app/assets/favicon.ico and /dev/null differ diff --git a/extensions-site/app/components/header.tsx b/extensions-site/app/components/header.tsx deleted file mode 100644 index 8770beb062dd..000000000000 --- a/extensions-site/app/components/header.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { IconDownload } from "./icons/download"; -import { IconGoose } from "./icons/goose"; -import { ThemeToggle } from "./themeToggle"; -import { Button } from "./ui/button"; -import { SiteURLs } from '../constants'; -import { NavLink, useLocation } from "react-router"; - -export const Header = () => { - const location = useLocation(); - const { hash, pathname, search } = location; - - const stableDownload = "https://github.com/block/goose/releases/download/stable/Goose.zip"; - - // link back to the main site if the icon is clicked on the extensions homepage - // otherwise link back to the extensions homepage - const gooseIconLink = pathname === "/" ? SiteURLs.GOOSE_HOMEPAGE : "/"; - return ( -
-
- - - - -
-
- ); -}; diff --git a/extensions-site/app/components/icons/download.tsx b/extensions-site/app/components/icons/download.tsx deleted file mode 100644 index 77125ddb1aec..000000000000 --- a/extensions-site/app/components/icons/download.tsx +++ /dev/null @@ -1,20 +0,0 @@ -export const IconDownload = ({ className = "" }) => { - return ( - - ); -}; diff --git a/extensions-site/app/components/icons/goose.tsx b/extensions-site/app/components/icons/goose.tsx deleted file mode 100644 index fa5713b92648..000000000000 --- a/extensions-site/app/components/icons/goose.tsx +++ /dev/null @@ -1,24 +0,0 @@ -export const IconGoose = ({ className = "" }) => { - return ( - - - - - - - - - ); -}; diff --git a/extensions-site/app/components/server-card.tsx b/extensions-site/app/components/server-card.tsx deleted file mode 100644 index c0db9a6dadc1..000000000000 --- a/extensions-site/app/components/server-card.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import { Star, Download, Terminal, ChevronRight, Info } from "lucide-react"; -import { Badge } from "./ui/badge"; -import { Button } from "./ui/button"; -import { Card, CardContent, CardHeader } from "./ui/card"; -import type { MCPServer } from "../types/server"; -import { Link, NavLink } from "react-router"; -import { useState } from "react"; -import { motion, AnimatePresence } from "motion/react"; -import { getGooseInstallLink } from "../utils/install-links"; - -export function ServerCard({ server }: { server: MCPServer }) { - const [isCommandVisible, setIsCommandVisible] = useState(false); - - return ( -
-
- - -
- - - - - - - -
- {server.name} -
-
-
-
- -
-
-

{server.description}

-
- -
- {server.is_builtin ? ( -
- {/* */} - - Can be enabled in the goose settings page -
- ) : ( - <> - - - {isCommandVisible && ( - - - {`goose session --with-extension "${server.command}"`} - - - )} - - - )} -
-
- -
- - - {server.githubStars} on Github - - {server.is_builtin ? ( -
- - Built-in - -
- ) : ( - - - - )} -
-
-
-
- ); -} diff --git a/extensions-site/app/components/themeToggle.tsx b/extensions-site/app/components/themeToggle.tsx deleted file mode 100644 index 5a07aa5de5ff..000000000000 --- a/extensions-site/app/components/themeToggle.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { useEffect, useState } from "react"; - -export const ThemeToggle = ({ className = "" }) => { - const [activeTheme, setActiveTheme] = useState("system"); - - useEffect(() => { - const savedTheme = localStorage.getItem("theme"); - if (savedTheme === "system" || !savedTheme) { - applySystemTheme(); - setActiveTheme("system"); - } else { - applyTheme(savedTheme); - setActiveTheme(savedTheme); - } - - const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); - const handleSystemThemeChange = () => { - if (!savedTheme || savedTheme === "system") { - applySystemTheme(); - } - }; - - mediaQuery.addEventListener("change", handleSystemThemeChange); - - return () => { - mediaQuery.removeEventListener("change", handleSystemThemeChange); - }; - }, []); - - const applyTheme = (theme: string) => { - if (theme === "dark") { - document.documentElement.classList.add("dark"); - } else if (theme === "light") { - document.documentElement.classList.remove("dark"); - } - }; - - const handleThemeChange = (newTheme: string) => { - setActiveTheme(newTheme); - localStorage.setItem("theme", newTheme); - if (newTheme === "system") { - applySystemTheme(); - } else { - applyTheme(newTheme); - } - }; - - const applySystemTheme = () => { - const systemPrefersDark = window.matchMedia( - "(prefers-color-scheme: dark)" - ).matches; - if (systemPrefersDark) { - document.documentElement.classList.add("dark"); - } else { - document.documentElement.classList.remove("dark"); - } - }; - - return ( -
- - - -
- ); -}; diff --git a/extensions-site/app/constants.ts b/extensions-site/app/constants.ts deleted file mode 100644 index 319d5279a8b4..000000000000 --- a/extensions-site/app/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const SiteURLs = { - GOOSE_HOMEPAGE: "https://block.github.io/goose/", -}; diff --git a/extensions-site/app/index.tsx b/extensions-site/app/index.tsx deleted file mode 100644 index f5741783331f..000000000000 --- a/extensions-site/app/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import { RouterProvider } from "react-router"; -import { router } from "./router"; -import "./styles/main.css"; - -ReactDOM.createRoot(document.getElementById("root")!).render( - - - -); diff --git a/extensions-site/app/mcp-servers.ts b/extensions-site/app/mcp-servers.ts deleted file mode 100644 index a290d869ab26..000000000000 --- a/extensions-site/app/mcp-servers.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { MCPServer } from '../app/types/server'; - -export async function fetchMCPServers(): Promise { - try { - // Use absolute path from root - const serverUrl = "https://block.github.io/goose/v1/extensions/servers.json"; - const response = await fetch(serverUrl); - if (!response.ok) { - throw new Error(`Failed to fetch servers: ${response.status} ${response.statusText}`); - } - const text = await response.text(); - const servers = JSON.parse(text); - return servers.sort((a, b) => b.githubStars - a.githubStars); - } catch (error) { - console.error('Error fetching servers:', error); - throw error; - } -} - - -export async function searchMCPServers(query: string): Promise { - const allServers = await fetchMCPServers(); - const searchTerms = query.toLowerCase().split(' ').filter(term => term.length > 0); - - return allServers.filter(server => { - const searchText = `${server.name} ${server.description}`.toLowerCase(); - return searchTerms.every(term => searchText.includes(term)); - }); -} \ No newline at end of file diff --git a/extensions-site/app/root.tsx b/extensions-site/app/root.tsx deleted file mode 100644 index 1e073fb3d80a..000000000000 --- a/extensions-site/app/root.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { - isRouteErrorResponse, - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "react-router"; - -import type { Route } from "./+types/root"; -import stylesheet from "./styles/main.css?url"; -import { Header } from "./components/header"; -import favicon from "./assets/favicon.ico?url"; - -export const links: Route.LinksFunction = () => [ - { rel: "preconnect", href: "https://fonts.googleapis.com" }, - { - rel: "preconnect", - href: "https://fonts.gstatic.com", - crossOrigin: "anonymous", - }, - { - rel: "stylesheet", - href: "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap", - }, - { rel: "stylesheet", href: stylesheet }, - { rel: "icon", type: "image/x-icon", href: favicon }, -]; - -export function Layout({ children }: { children: React.ReactNode }) { - return ( - - - - - Extensions | codename goose - - - - -
-
-
{children}
-
- - - - - ); -} - -export default function App() { - return ; -} - -export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { - let message = "Oops!"; - let details = "An unexpected error occurred."; - let stack: string | undefined; - - if (isRouteErrorResponse(error)) { - message = error.status === 404 ? "404" : "Error"; - details = - error.status === 404 - ? "The requested page could not be found." - : error.statusText || details; - } else if (import.meta.env.DEV && error && error instanceof Error) { - details = error.message; - stack = error.stack; - } - - return ( -
-

{message}

-

{details}

- {stack && ( -
-          {stack}
-        
- )} -
- ); -} diff --git a/extensions-site/app/router.tsx b/extensions-site/app/router.tsx deleted file mode 100644 index 08bb75237d73..000000000000 --- a/extensions-site/app/router.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { createBrowserRouter } from "react-router"; -import HomePage from "./routes/home"; -import DetailPage from "./routes/detail"; - -export const router = createBrowserRouter([ - { - path: "/", - element: , - }, - { - path: "/detail/:id", - element: , - }, -]); diff --git a/extensions-site/app/routes.ts b/extensions-site/app/routes.ts deleted file mode 100644 index a59d77c8013e..000000000000 --- a/extensions-site/app/routes.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type RouteConfig, index, route } from "@react-router/dev/routes"; - -export default [ - index("routes/home.tsx"), - route("detail/:id", "./routes/detail.tsx") -] satisfies RouteConfig; \ No newline at end of file diff --git a/extensions-site/app/routes/detail.tsx b/extensions-site/app/routes/detail.tsx deleted file mode 100644 index 3bbcd5d6a7e3..000000000000 --- a/extensions-site/app/routes/detail.tsx +++ /dev/null @@ -1,220 +0,0 @@ -import { useParams, Link } from "react-router"; -import { - Download, - Star, - Terminal, - ArrowLeft, - Info -} from "lucide-react"; -import { Button } from "../components/ui/button"; -import { Badge } from "../components/ui/badge"; -import { Card, CardContent, CardHeader } from "../components/ui/card"; -import { useEffect, useState } from "react"; -import { fetchMCPServers } from "../mcp-servers"; -import { getGooseInstallLink } from "../utils/install-links"; -import type { MCPServer } from "../types/server"; - - -export default function DetailPage() { - const { id } = useParams(); - const [server, setServer] = useState(null); - const [isCommandVisible, setIsCommandVisible] = useState(true); - const [error, setError] = useState(null); - const [isLoading, setIsLoading] = useState(true); - - useEffect(() => { - const loadServer = async () => { - try { - setIsLoading(true); - setError(null); - const servers = await fetchMCPServers(); - const foundServer = servers.find((s) => s.id === id); - if (!foundServer) { - setError(`Server with ID "${id}" not found`); - return; - } - setServer(foundServer); - } catch (err) { - const errorMessage = err instanceof Error ? err.message : "Unknown error"; - setError(`Failed to load server: ${errorMessage}`); - console.error("Error loading server:", err); - } finally { - setIsLoading(false); - } - }; - - loadServer(); - }, [id]); - - if (!server) { - return ( -
-
- - - -
- - Goose Extensions - {" "} - / -
-
-
-
-
-
-
-
- ); - } - - return ( -
-
-
- - - -
- - - -
- {/* - - - - - */} -

- {server.name} -

-
-
- -
-

{server.description}

- {/* */} -
-
-

{server.installation_notes}

-
- -
- {server.is_builtin ? ( -
- - Can be enabled in the goose settings page -
- ) : ( - <> -
- -

Command

-
- - {`goose session --with-extension "${server.command}"`} - - - )} -
-
-

- Environment Variables -

- {server.environmentVariables.length > 0 ? ( -
- {server.environmentVariables.map((env) => ( -
-
- {env.name} -
-
- {env.description} -
- {env.required && ( - - Required - - )} -
- ))} -
- ) : ( -
- - No environment variables needed -
- )} -
- -
-
- - {server.githubStars} on Github -
- - {server.is_builtin ? ( -
- - Built-in - -
- ) : ( - - - - )} -
-
-
-
-
- ); -} diff --git a/extensions-site/app/routes/home.tsx b/extensions-site/app/routes/home.tsx deleted file mode 100644 index 30507a9c323e..000000000000 --- a/extensions-site/app/routes/home.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import { Search } from "lucide-react"; -import { Button } from "../components/ui/button"; -import { Input } from "../components/ui/input"; -import { ServerCard } from "../components/server-card"; -import { useState, useEffect } from "react"; -import type { MCPServer } from "../types/server"; -import { fetchMCPServers, searchMCPServers } from "../mcp-servers"; -import { motion, AnimatePresence } from "framer-motion"; - -export default function HomePage() { - const [servers, setServers] = useState([]); - const [searchQuery, setSearchQuery] = useState(""); - const [isLoading, setIsLoading] = useState(true); - const [error, setError] = useState(null); - - // Combined effect for initial load and search - useEffect(() => { - const loadServers = async () => { - try { - setIsLoading(true); - setError(null); - - const trimmedQuery = searchQuery.trim(); - const results = trimmedQuery - ? await searchMCPServers(trimmedQuery) - : await fetchMCPServers(); - - setServers(results); - } catch (err) { - const errorMessage = - err instanceof Error ? err.message : "Unknown error"; - setError(`Failed to load servers: ${errorMessage}`); - console.error("Error loading servers:", err); - } finally { - setIsLoading(false); - } - }; - - // Debounce all server loads - const timeoutId = setTimeout(loadServers, 300); - return () => clearTimeout(timeoutId); - }, [searchQuery]); - - return ( -
-
-

- Browse Extensions -

-

- Your central directory for discovering and installing extensions. -

-
- -
- {/* */} - setSearchQuery(e.target.value)} - /> -
- - {error && ( -
{error}
- )} - -
-
- {/*

{searchQuery ? "Search Results" : ""}

*/} -

- {searchQuery - ? `${servers.length} result${ - servers.length > 1 ? "s" : "" - } for "${searchQuery}"` - : ""} -

-
- - {isLoading ? ( -
Loading servers...
- ) : servers.length === 0 ? ( -
- {searchQuery - ? "No servers found matching your search." - : "No servers available."} -
- ) : ( -
- {/* */} - {servers - .sort((a, b) => { - // Sort built-in servers first - if (a.is_builtin && !b.is_builtin) return -1; - if (!a.is_builtin && b.is_builtin) return 1; - return 0; - }) - .map((server, index) => ( - - - - ))} - {/* */} -
- )} -
-
- ); -} diff --git a/extensions-site/package.json b/extensions-site/package.json deleted file mode 100644 index 002566e0f5e0..000000000000 --- a/extensions-site/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "goose-extensions-site", - "private": true, - "type": "module", - "scripts": { - "build": "cross-env NODE_ENV=production react-router build", - "dev": "react-router dev", - "start": "cross-env NODE_ENV=production react-router-serve ./build/server/index.js", - "typecheck": "react-router typegen && tsc" - }, - "dependencies": { - "@react-router/node": "^7.1.1", - "@react-router/serve": "^7.1.1", - "isbot": "^5.1.17", - "lucide-react": "^0.471.1", - "motion": "^12.0.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "^7.1.1" - }, - "devDependencies": { - "@react-router/dev": "^7.1.1", - "@types/node": "^20", - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", - "autoprefixer": "^10.4.20", - "cross-env": "^7.0.3", - "postcss": "^8.4.49", - "tailwindcss": "^3.4.16", - "tailwindcss-view-transitions": "^0.1.1", - "typescript": "^5.7.2", - "vite": "^5.4.11", - "vite-tsconfig-paths": "^5.1.4" - } -} diff --git a/extensions-site/public/favicon.ico b/extensions-site/public/favicon.ico deleted file mode 100644 index 5dbdfcddcb14..000000000000 Binary files a/extensions-site/public/favicon.ico and /dev/null differ diff --git a/extensions-site/react-router.config.ts b/extensions-site/react-router.config.ts deleted file mode 100644 index 9e4bcd07ef98..000000000000 --- a/extensions-site/react-router.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Config } from "@react-router/dev/config"; - -const basename = process.env.VITE_BASENAME || ""; - -export default { - basename, - ssr: false, -} satisfies Config; diff --git a/extensions-site/tsconfig.json b/extensions-site/tsconfig.json deleted file mode 100644 index dc391a45f77b..000000000000 --- a/extensions-site/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "include": [ - "**/*", - "**/.server/**/*", - "**/.client/**/*", - ".react-router/types/**/*" - ], - "compilerOptions": { - "lib": ["DOM", "DOM.Iterable", "ES2022"], - "types": ["node", "vite/client"], - "target": "ES2022", - "module": "ES2022", - "moduleResolution": "bundler", - "jsx": "react-jsx", - "rootDirs": [".", "./.react-router/types"], - "baseUrl": ".", - "paths": { - "~/*": ["./app/*"] - }, - "esModuleInterop": true, - "verbatimModuleSyntax": true, - "noEmit": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true - } -} diff --git a/extensions-site/vite.config.ts b/extensions-site/vite.config.ts deleted file mode 100644 index 7541d1aa7c9c..000000000000 --- a/extensions-site/vite.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { reactRouter } from "@react-router/dev/vite"; -import autoprefixer from "autoprefixer"; -import tailwindcss from "tailwindcss"; -import { defineConfig } from "vite"; -import tsconfigPaths from "vite-tsconfig-paths"; - -const basename = process.env.VITE_BASENAME || ""; - -export default defineConfig({ - base: basename, - css: { - postcss: { - plugins: [tailwindcss, autoprefixer], - }, - }, - plugins: [reactRouter(), tsconfigPaths()], -}); diff --git a/ui/desktop/src/components/ChatView.tsx b/ui/desktop/src/components/ChatView.tsx index 3474a4ac68c1..961b4af046e3 100644 --- a/ui/desktop/src/components/ChatView.tsx +++ b/ui/desktop/src/components/ChatView.tsx @@ -206,7 +206,6 @@ export default function ChatView({ // One message with text content and tool calls // const messages = [{"role":"assistant","created":1742484388,"content":[{"type":"text","text":"Sure, let's break this down into two steps:\n\n1. **Write content to a `.txt` file.**\n2. **Read the content from the `.txt` file.**\n\nLet's start by writing some example content to a `.txt` file. I'll create a file named `example.txt` and write a sample sentence into it. Then I'll read the content back. \n\n### Sample Content\nWe'll write the following content into the `example.txt` file:\n\n```\nHello World! This is an example text file.\n```\n\nLet's proceed with this task."},{"type":"toolRequest","id":"call_CmvAsxMxiWVKZvONZvnz4QCE","toolCall":{"status":"success","value":{"name":"developer__text_editor","arguments":{"command":"write","file_text":"Hello World! This is an example text file.","path":"/Users/alexhancock/Development/example.txt"}}}}]}]; - // Update chat messages when they change and save to sessionStorage useEffect(() => { setChat((prevChat) => {