diff --git a/.github/workflows/rebuild-skills-marketplace.yml b/.github/workflows/rebuild-skills-marketplace.yml deleted file mode 100644 index b99a209c744f..000000000000 --- a/.github/workflows/rebuild-skills-marketplace.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: Rebuild Skills Marketplace - -# This workflow rebuilds the documentation site to pull in new skills -# from the Agent-Skills repository. It runs: -# 1. Every hour on a schedule -# 2. On manual trigger for testing - -on: - schedule: - # Run every hour at minute 15 - - cron: '15 * * * *' - workflow_dispatch: - inputs: - reason: - description: 'Reason for manual rebuild' - required: false - default: 'Manual trigger' - -concurrency: - group: pages - cancel-in-progress: false - -jobs: - rebuild-docs: - runs-on: ubuntu-latest - if: github.repository == 'aaif-goose/goose' - permissions: - contents: read - pages: write - id-token: write - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - steps: - - name: Log trigger info - env: - TRIGGER: ${{ github.event_name }} - REASON: ${{ github.event.inputs.reason }} - run: | - echo "Triggered by: $TRIGGER" - echo "Time: $(date -u)" - if [ "$TRIGGER" == "workflow_dispatch" ]; then - echo "Reason: $REASON" - fi - - - name: Checkout the branch - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - - name: Setup Node.js - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version: 20 - - - name: Cache Node.js modules (documentation) - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: ./documentation/node_modules - key: ${{ runner.os }}-documentation-${{ hashFiles('./documentation/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-documentation- - - - name: Install dependencies and build docs - working-directory: ./documentation - env: - INKEEP_API_KEY: ${{ secrets.INKEEP_API_KEY }} - INKEEP_INTEGRATION_ID: ${{ secrets.INKEEP_INTEGRATION_ID }} - INKEEP_ORG_ID: ${{ secrets.INKEEP_ORG_ID }} - run: | - npm install - npm run build - - - name: Verify docs map was generated - working-directory: ./documentation - run: ./scripts/verify-build.sh - - - name: Configure GitHub Pages - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 - with: - path: documentation/build - - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 diff --git a/documentation/blog/2025-04-01-mcp-nondevs/index.md b/documentation/blog/2025-04-01-mcp-nondevs/index.md index 6d21627507a3..d31cf432aaec 100644 --- a/documentation/blog/2025-04-01-mcp-nondevs/index.md +++ b/documentation/blog/2025-04-01-mcp-nondevs/index.md @@ -68,8 +68,6 @@ Asana: Create a new task in my Asana workspace called 'Review Q4 metrics' and se GitHub: Create a new branch called hello-world in my angiejones/goose-demo repository. Update the README.md file to say "this was written by goose" and commit it. Open a pull request with your changes. ``` -To see more examples just like this, along with the results you can get, check out this [Prompt Library](https://goose-docs.ai/prompt-library)! This is your central directory for discovering and using effective prompts with Goose. - ## The Possibilities Are Endless While some are developed by official providers, a vast majority of MCP servers you see are actually developed by community members! Plus, because MCP is an open standard, anyone can build an MCP server for any resource. You could even use Goose to help you build one! @@ -88,4 +86,4 @@ Hopefully now, instead of spending hours manually gathering data and creating yo - \ No newline at end of file + diff --git a/documentation/blog/2025-04-21-practical-use-cases-of-ai/index.md b/documentation/blog/2025-04-21-practical-use-cases-of-ai/index.md index a2ce8737c327..2ea46cc7231d 100644 --- a/documentation/blog/2025-04-21-practical-use-cases-of-ai/index.md +++ b/documentation/blog/2025-04-21-practical-use-cases-of-ai/index.md @@ -260,7 +260,7 @@ You'll see ideas go from prompt to prototype in one session. ## Looking for more examples? -This blog post included just a few of the ways I use Goose. If you're curious about what else it can do, check out the [Prompt Library](/prompt-library) or just ask: +This blog post included just a few of the ways I use goose. If you're curious about what else it can do, just ask: What are 5 useful things you can help me with today? @@ -278,4 +278,4 @@ Let goose surprise you. ✨ - \ No newline at end of file + diff --git a/documentation/docs/guides/recipes/index.mdx b/documentation/docs/guides/recipes/index.mdx index 6de6ad496749..915df23441e0 100644 --- a/documentation/docs/guides/recipes/index.mdx +++ b/documentation/docs/guides/recipes/index.mdx @@ -67,14 +67,9 @@ import VideoCarousel from '@site/src/components/VideoCarousel';
-

šŸ› ļø Tools & Generators

+

šŸ› ļø Recipe Cookbook

- - - - - - Use the online [Recipe Generator](https://goose-docs.ai/recipe-generator) tool to create a recipe. First choose your preferred format: - - - **URL Format**: Generates a shareable link that opens a session in goose Desktop - - **YAML Format**: Generates YAML content that you can save to file and then run in goose CLI - - Then fill out the recipe form by providing: - - A **title** for the recipe - - A **description** - - A set of **instructions** for the recipe. - - An optional initial **prompt**: - - In the Desktop, the prompt displays in the chat box. - - In the CLI, the prompt provides the initial message to run. Note that a prompt is required to run the recipe in headless (non-interactive) mode. - - A set of optional **activities** to display in the Desktop. - - YAML format only: Optional **author** contact information and **extensions** the recipe uses. - - :::tip Customize Recipe Generation diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index 5298dbe000de..8a07fe004a79 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -421,7 +421,7 @@ const config: Config = { }, ], ], - themes: ["@inkeep/docusaurus/chatButton", "@inkeep/docusaurus/searchBar"], + themes: ["@inkeep/docusaurus/searchBar"], themeConfig: { // Replace with your project's social card image: "img/home-banner.png", @@ -451,11 +451,6 @@ const config: Config = { position: "left", label: "Tutorials", }, - { - to: "/docs/category/mcp-servers", - position: "left", - label: "MCPs", - }, { to: "/blog", label: "Blog", position: "left" }, { type: "dropdown", @@ -466,18 +461,6 @@ const config: Config = { to: "/extensions", label: "Extensions", }, - { - to: "/skills", - label: "Skills Marketplace", - }, - { - to: "/recipe-generator", - label: "Recipe Generator", - }, - { - to: "/prompt-library", - label: "Prompt Library", - }, { to: "/recipes", label: "Recipe Cookbook", @@ -576,20 +559,6 @@ const config: Config = { organizationId: inkeepOrgId, primaryBrandColor: "#1E1E1E", }, - aiChatSettings: { - chatSubjectName: "goose", - botAvatarSrcUrl: "", - getHelpCallToActions: [ - { - name: "GitHub", - url: "https://github.com/aaif-goose/goose", - icon: { - builtIn: "FaGithub", - }, - }, - ], - quickQuestions: ["What is goose?"], - }, }, announcementBar: { id: 'goose-aaif-announcement', // Increment on new announcements to reuse the bar diff --git a/documentation/package.json b/documentation/package.json index 92723f97bc2b..b6c917ecd9ea 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -5,7 +5,7 @@ "scripts": { "docusaurus": "docusaurus", "start": "docusaurus start", - "build": "node scripts/generate-docs-map.js && node scripts/generate-skills-manifest.js && node scripts/generate-skills-zips.js && docusaurus build", + "build": "node scripts/generate-docs-map.js && docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", diff --git a/documentation/scripts/generate-skills-manifest.js b/documentation/scripts/generate-skills-manifest.js deleted file mode 100644 index 5a28413934ff..000000000000 --- a/documentation/scripts/generate-skills-manifest.js +++ /dev/null @@ -1,360 +0,0 @@ -/** - * Generate skills manifest from Agent-Skills repository - * - * This script clones the block/Agent-Skills repository and reads all SKILL.md files - * to generate a skills-manifest.json file that the frontend can fetch. - * - * It also supports external skills defined in a local external-skills.json file. - * - * Run this before building the documentation site. - */ - -const fs = require('fs'); -const path = require('path'); -const { execSync } = require('child_process'); -const matter = require('gray-matter'); - -// Configuration -const AGENT_SKILLS_REPO = 'https://github.com/block/Agent-Skills.git'; -const AGENT_SKILLS_REPO_URL = 'https://github.com/block/Agent-Skills'; -const TEMP_DIR = path.join(__dirname, '..', '.tmp'); -const CLONED_REPO_DIR = path.join(TEMP_DIR, 'agent-skills'); -const MANIFEST_OUTPUT = path.join(__dirname, '..', 'static', 'skills-manifest.json'); -const EXTERNAL_SKILLS_FILE = path.join(__dirname, '..', 'static', 'external-skills.json'); - -// Directories to skip when scanning for skills (not skill folders) -const SKIP_DIRS = ['.github', 'node_modules', '.git']; - -/** - * Clone or update the Agent-Skills repository - */ -function cloneAgentSkillsRepo() { - console.log('[generate-skills-manifest] Fetching Agent-Skills repository...'); - - // Create temp directory if it doesn't exist - if (!fs.existsSync(TEMP_DIR)) { - fs.mkdirSync(TEMP_DIR, { recursive: true }); - } - - // Remove existing clone if present - if (fs.existsSync(CLONED_REPO_DIR)) { - console.log('[generate-skills-manifest] Removing existing clone...'); - fs.rmSync(CLONED_REPO_DIR, { recursive: true, force: true }); - } - - // Shallow clone the repository - try { - execSync(`git clone --depth 1 ${AGENT_SKILLS_REPO} ${CLONED_REPO_DIR}`, { - stdio: 'pipe', - timeout: 60000 // 60 second timeout - }); - console.log('[generate-skills-manifest] Successfully cloned Agent-Skills repository'); - } catch (error) { - console.error('[generate-skills-manifest] ERROR: Failed to clone Agent-Skills repository'); - console.error('[generate-skills-manifest] Error:', error.message); - throw new Error('Failed to fetch Agent-Skills repository. Build cannot continue.'); - } -} - -/** - * Clean up temporary files - */ -function cleanup() { - if (fs.existsSync(CLONED_REPO_DIR)) { - console.log('[generate-skills-manifest] Cleaning up temporary files...'); - fs.rmSync(CLONED_REPO_DIR, { recursive: true, force: true }); - } -} - -/** - * Determine install method based on source configuration - */ -function determineInstallMethod(isExternal, sourceUrl) { - if (isExternal && sourceUrl) { - // External skill with a source URL - const simpleRepoPattern = /^https:\/\/github\.com\/[^\/]+\/[^\/]+\/?$/; - if (simpleRepoPattern.test(sourceUrl)) { - return 'npx-single'; - } - return 'npx-multi'; - } - // Official skill from Agent-Skills repo - return 'npx-multi'; -} - -/** - * Generate install command based on method and source - */ -function generateInstallCommand(skillId, isExternal, sourceUrl) { - if (isExternal && sourceUrl) { - const simpleRepoPattern = /^https:\/\/github\.com\/[^\/]+\/[^\/]+\/?$/; - if (simpleRepoPattern.test(sourceUrl)) { - const match = sourceUrl.match(/github\.com\/([^\/]+\/[^\/]+)/); - if (match) { - return `npx skills add ${match[1]}`; - } - } - return `npx skills add ${sourceUrl} --skill ${skillId}`; - } - // Official skill from Agent-Skills repo - return `npx skills add ${AGENT_SKILLS_REPO_URL} --skill ${skillId}`; -} - -/** - * Generate view source URL for a skill - */ -function generateViewSourceUrl(skillId, isExternal, sourceUrl) { - if (isExternal && sourceUrl) { - return sourceUrl; - } - // Official skill from Agent-Skills repo - return `${AGENT_SKILLS_REPO_URL}/tree/main/${skillId}`; -} - -/** - * Get supporting files in a skill directory (excluding SKILL.md) - */ -function getSupportingFiles(skillDir) { - const files = []; - - function walkDir(dir, prefix = '') { - const entries = fs.readdirSync(dir, { withFileTypes: true }); - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name; - - if (entry.isDirectory()) { - walkDir(fullPath, relativePath); - } else if (entry.name !== 'SKILL.md') { - files.push(relativePath); - } - } - } - - walkDir(skillDir); - return files; -} - -/** - * Determine the supporting files type based on file contents - * Returns: 'scripts' | 'templates' | 'multi-file' | 'none' - */ -function determineSupportingFilesType(supportingFiles) { - if (supportingFiles.length === 0) { - return 'none'; - } - - // Executable file extensions - const executableExtensions = ['.sh', '.bash', '.zsh', '.ps1', '.bat', '.cmd', '.py', '.rb', '.js', '.mjs', '.ts']; - - // Template-like patterns (file names or extensions) - const templatePatterns = [ - /\.template\./i, - /\.tmpl\./i, - /\.tpl\./i, - /template\./i, - /\.example\./i, - /\.sample\./i, - /\.skeleton\./i, - /\.stub\./i, - /\.j2$/i, - /\.jinja2?$/i, - /\.mustache$/i, - /\.hbs$/i, - /\.handlebars$/i, - /\.ejs$/i, - /\.erb$/i, - ]; - - const hasExecutable = supportingFiles.some(file => { - const ext = path.extname(file).toLowerCase(); - return executableExtensions.includes(ext); - }); - - if (hasExecutable) { - return 'scripts'; - } - - const hasTemplates = supportingFiles.some(file => { - return templatePatterns.some(pattern => pattern.test(file)); - }); - - if (hasTemplates) { - return 'templates'; - } - - return 'multi-file'; -} - -/** - * Check if a directory contains a SKILL.md file (i.e., is a skill folder) - */ -function isSkillDirectory(dirPath) { - const skillMdPath = path.join(dirPath, 'SKILL.md'); - return fs.existsSync(skillMdPath); -} - -/** - * Process official skills from the cloned Agent-Skills repo - */ -function processOfficialSkills() { - const skills = []; - - // Get all directories in the cloned repo - const entries = fs.readdirSync(CLONED_REPO_DIR, { withFileTypes: true }); - - for (const entry of entries) { - // Skip non-directories and special directories - if (!entry.isDirectory() || SKIP_DIRS.includes(entry.name)) { - continue; - } - - const skillId = entry.name; - const skillDir = path.join(CLONED_REPO_DIR, skillId); - - // Skip if not a skill directory (no SKILL.md) - if (!isSkillDirectory(skillDir)) { - continue; - } - - const skillMdPath = path.join(skillDir, 'SKILL.md'); - - try { - const rawContent = fs.readFileSync(skillMdPath, 'utf8'); - const parsed = matter(rawContent); - const frontmatter = parsed.data || {}; - const content = parsed.content || ''; - - const supportingFiles = getSupportingFiles(skillDir); - const sourceUrl = frontmatter.source_url || frontmatter.sourceUrl; - const author = frontmatter.author; - const isCommunity = author && author.toLowerCase() !== 'goose'; - - const supportingFilesType = determineSupportingFilesType(supportingFiles); - - const skill = { - id: skillId, - name: frontmatter.name || skillId, - description: frontmatter.description || 'No description provided.', - author, - version: frontmatter.version, - tags: Array.isArray(frontmatter.tags) ? frontmatter.tags : [], - sourceUrl, // Optional external source if skill references another repo - content, - hasSupporting: supportingFiles.length > 0, - supportingFiles, - supportingFilesType, - installMethod: determineInstallMethod(false, sourceUrl), - installCommand: generateInstallCommand(skillId, false, sourceUrl), - viewSourceUrl: generateViewSourceUrl(skillId, false, sourceUrl), - repoUrl: AGENT_SKILLS_REPO_URL, - isCommunity, - }; - - skills.push(skill); - console.log(`[generate-skills-manifest] Processed official skill: ${skillId}`); - } catch (error) { - console.error(`[generate-skills-manifest] Error processing ${skillId}:`, error.message); - } - } - - return skills; -} - -/** - * Process external skills from external-skills.json - */ -function processExternalSkills() { - const skills = []; - - if (!fs.existsSync(EXTERNAL_SKILLS_FILE)) { - console.log('[generate-skills-manifest] No external-skills.json found, skipping external skills'); - return skills; - } - - try { - const externalData = JSON.parse(fs.readFileSync(EXTERNAL_SKILLS_FILE, 'utf8')); - const externalSkills = externalData.skills || []; - - for (const extSkill of externalSkills) { - const skillId = extSkill.id; - const sourceUrl = extSkill.sourceUrl || extSkill.source_url; - const author = extSkill.author; - const isCommunity = author && author.toLowerCase() !== 'goose'; - - const skill = { - id: skillId, - name: extSkill.name || skillId, - description: extSkill.description || 'No description provided.', - author, - version: extSkill.version, - tags: Array.isArray(extSkill.tags) ? extSkill.tags : [], - sourceUrl, - content: extSkill.content || '', // External skills may not have content - hasSupporting: false, - supportingFiles: [], - supportingFilesType: 'none', - installMethod: determineInstallMethod(true, sourceUrl), - installCommand: generateInstallCommand(skillId, true, sourceUrl), - viewSourceUrl: generateViewSourceUrl(skillId, true, sourceUrl), - repoUrl: sourceUrl, - isCommunity, - }; - - skills.push(skill); - console.log(`[generate-skills-manifest] Processed external skill: ${skillId}`); - } - } catch (error) { - console.error('[generate-skills-manifest] Error processing external skills:', error.message); - } - - return skills; -} - -/** - * Main function to generate the manifest - */ -function generateManifest() { - console.log('[generate-skills-manifest] Starting...'); - - try { - // Clone the Agent-Skills repository - cloneAgentSkillsRepo(); - - // Process official skills from the cloned repo - const officialSkills = processOfficialSkills(); - - // Process external skills from local JSON file - const externalSkills = processExternalSkills(); - - // Combine all skills - const allSkills = [...officialSkills, ...externalSkills]; - - // Check if we have any skills - if (allSkills.length === 0) { - console.error('[generate-skills-manifest] ERROR: No skills found. Build cannot continue.'); - throw new Error('No skills found in Agent-Skills repository.'); - } - - // Generate manifest - const manifest = { - skills: allSkills, - generatedAt: new Date().toISOString(), - count: allSkills.length, - officialCount: officialSkills.length, - externalCount: externalSkills.length, - sourceRepo: AGENT_SKILLS_REPO_URL, - }; - - // Write manifest - fs.writeFileSync(MANIFEST_OUTPUT, JSON.stringify(manifest, null, 2)); - console.log(`[generate-skills-manifest] Generated manifest with ${allSkills.length} skills (${officialSkills.length} official, ${externalSkills.length} external): ${MANIFEST_OUTPUT}`); - - } finally { - // Always clean up - cleanup(); - } -} - -// Run the script -generateManifest(); diff --git a/documentation/scripts/generate-skills-zips.js b/documentation/scripts/generate-skills-zips.js deleted file mode 100644 index e27a70b9fafd..000000000000 --- a/documentation/scripts/generate-skills-zips.js +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Generate ZIP files for skills from Agent-Skills repository - * - * This script creates ZIP files for each skill in the Agent-Skills repo - * and outputs them to static/skills-data-zips/.zip - * - * Note: This script should run AFTER generate-skills-manifest.js - * because it relies on the cloned repo being present in .tmp/agent-skills - * - * Run this before building the documentation site. - */ - -const fs = require('fs'); -const path = require('path'); -const { execSync } = require('child_process'); - -// Configuration - must match generate-skills-manifest.js -const AGENT_SKILLS_REPO = 'https://github.com/block/Agent-Skills.git'; -const TEMP_DIR = path.join(__dirname, '..', '.tmp'); -const CLONED_REPO_DIR = path.join(TEMP_DIR, 'agent-skills'); -const ZIPS_OUTPUT_DIR = path.join(__dirname, '..', 'static', 'skills-data-zips'); - -// Directories to skip when scanning for skills (not skill folders) -const SKIP_DIRS = ['.github', 'node_modules', '.git']; - -/** - * Clone the Agent-Skills repository if not already present - */ -function ensureRepoCloned() { - if (fs.existsSync(CLONED_REPO_DIR)) { - console.log('[generate-skills-zips] Agent-Skills repo already cloned'); - return true; - } - - console.log('[generate-skills-zips] Cloning Agent-Skills repository...'); - - // Create temp directory if it doesn't exist - if (!fs.existsSync(TEMP_DIR)) { - fs.mkdirSync(TEMP_DIR, { recursive: true }); - } - - try { - execSync(`git clone --depth 1 ${AGENT_SKILLS_REPO} ${CLONED_REPO_DIR}`, { - stdio: 'pipe', - timeout: 60000 - }); - console.log('[generate-skills-zips] Successfully cloned Agent-Skills repository'); - return true; - } catch (error) { - console.error('[generate-skills-zips] ERROR: Failed to clone Agent-Skills repository'); - console.error('[generate-skills-zips] Error:', error.message); - return false; - } -} - -/** - * Check if a directory contains a SKILL.md file (i.e., is a skill folder) - */ -function isSkillDirectory(dirPath) { - const skillMdPath = path.join(dirPath, 'SKILL.md'); - return fs.existsSync(skillMdPath); -} - -/** - * Clean up temporary files - */ -function cleanup() { - if (fs.existsSync(CLONED_REPO_DIR)) { - console.log('[generate-skills-zips] Cleaning up temporary files...'); - fs.rmSync(CLONED_REPO_DIR, { recursive: true, force: true }); - } -} - -function generateSkillZips() { - console.log('[generate-skills-zips] Starting...'); - - // Ensure repo is cloned - if (!ensureRepoCloned()) { - console.error('[generate-skills-zips] Cannot generate ZIPs without Agent-Skills repo'); - process.exit(1); - } - - // Create output directory if it doesn't exist - if (!fs.existsSync(ZIPS_OUTPUT_DIR)) { - fs.mkdirSync(ZIPS_OUTPUT_DIR, { recursive: true }); - console.log(`[generate-skills-zips] Created output directory: ${ZIPS_OUTPUT_DIR}`); - } - - // Clean existing ZIPs - const existingZips = fs.readdirSync(ZIPS_OUTPUT_DIR).filter(f => f.endsWith('.zip')); - for (const zip of existingZips) { - fs.unlinkSync(path.join(ZIPS_OUTPUT_DIR, zip)); - } - console.log(`[generate-skills-zips] Cleaned ${existingZips.length} existing ZIP files`); - - // Get all skill directories from the cloned repo - const entries = fs.readdirSync(CLONED_REPO_DIR, { withFileTypes: true }); - const skillDirs = entries - .filter(d => d.isDirectory() && !SKIP_DIRS.includes(d.name)) - .map(d => d.name) - .filter(name => isSkillDirectory(path.join(CLONED_REPO_DIR, name))); - - let generatedCount = 0; - - for (const skillId of skillDirs) { - const skillDir = path.join(CLONED_REPO_DIR, skillId); - const zipPath = path.join(ZIPS_OUTPUT_DIR, `${skillId}.zip`); - - try { - // Use the system zip command to create the archive - // cd into the cloned repo and zip the skill folder to preserve the folder name - execSync(`cd "${CLONED_REPO_DIR}" && zip -r "${zipPath}" "${skillId}"`, { - stdio: 'pipe' - }); - - const stats = fs.statSync(zipPath); - console.log(`[generate-skills-zips] Created: ${skillId}.zip (${(stats.size / 1024).toFixed(1)} KB)`); - generatedCount++; - } catch (error) { - console.error(`[generate-skills-zips] Error creating ZIP for ${skillId}:`, error.message); - } - } - - console.log(`[generate-skills-zips] Generated ${generatedCount} ZIP files in ${ZIPS_OUTPUT_DIR}`); - - // Clean up the cloned repo - cleanup(); -} - -generateSkillZips(); diff --git a/documentation/src/components/prompt-card.tsx b/documentation/src/components/prompt-card.tsx deleted file mode 100644 index cec12f4ccd2f..000000000000 --- a/documentation/src/components/prompt-card.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { Download, Terminal, Info } from "lucide-react"; -import Link from "@docusaurus/Link"; -import { useState } from "react"; -import CodeBlock from '@theme/CodeBlock'; -import { motion, AnimatePresence } from "framer-motion"; -import { getGooseInstallLink } from "@site/src/utils/install-links"; -import type { MCPServer } from "@site/src/types/server"; -import type { Prompt, Extension } from "@site/src/types/prompt"; - -function extensionToMCPServer(extension: Extension): MCPServer { - return { - id: extension.command, - name: extension.name, - command: extension.command, - url: extension.url, - description: extension.name, - is_builtin: extension.is_builtin, - link: extension.link || '', - installation_notes: extension.installation_notes || '', - endorsed: false, - environmentVariables: extension.environmentVariables || [], - }; -} - -export function PromptCard({ prompt }: { prompt: Prompt }) { - const [expandedExtension, setExpandedExtension] = useState(null); - - return ( - -
-
-
-
-
-
- - {prompt.title} - -
-
-
-
-
-

{prompt.description}

-
- -
-
-
- {prompt.extensions.map((extension, index) => ( -
-
{ - e.preventDefault(); - e.stopPropagation(); - if (!extension.is_builtin) { - setExpandedExtension(expandedExtension === extension.command ? null : extension.command); - } - }} - title={extension.is_builtin ? "Built-in extension - can be enabled in settings" : "Click to see installation options"} - > - - {extension.name} - - {extension.is_builtin ? ( -
- - Built-in - -
- ) : ( - - - - )} -
- - {/* Inline Expansion */} - - {!extension.is_builtin && expandedExtension === extension.command && ( - -
- e.stopPropagation()} - > - - Install via Desktop - - -
- - - {extension.url ? ( - - goose session --with-remote-extension "{extension.url}" - - ) : ( - - goose session --with-extension "{extension.command}" - - )} -
- - )} - -
- ))} -
-
-
-
-
-
-
-
- - ); -} \ No newline at end of file diff --git a/documentation/src/components/skill-card.tsx b/documentation/src/components/skill-card.tsx deleted file mode 100644 index 65bc1e15717e..000000000000 --- a/documentation/src/components/skill-card.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import React, { useState } from "react"; -import Link from "@docusaurus/Link"; -import { Check, Copy } from "lucide-react"; -import type { Skill } from "@site/src/pages/skills/types"; - -function generateInstallCommand(repoUrl: string, skillId: string): string { - return `npx skills add ${repoUrl} --skill ${skillId}`; -} - -export function SkillCard({ skill }: { skill: Skill }) { - const [copied, setCopied] = useState(false); - - const handleCopyInstall = (e: React.MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - - const command = generateInstallCommand(skill.repoUrl, skill.id); - navigator.clipboard.writeText(command); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; - - return ( -
- -
- -
-
- {/* Header with name and badges */} -
-

- {skill.name} -

-
- {skill.isCommunity && ( - - Community - - )} - {skill.version && ( - - v{skill.version} - - )} -
-
- - {/* Description */} -

- {skill.description} -

- - {/* Tags - show max 4 on card, rest visible on detail page */} - {skill.tags.length > 0 && ( -
- {skill.tags.slice(0, 4).map((tag, index) => ( - - {tag} - - ))} -
- )} - - {/* Supporting files indicator */} - {skill.supportingFilesType === 'scripts' && ( -
- āš™ļø Runs scripts -
- )} - {skill.supportingFilesType === 'templates' && ( -
- šŸ“„ Includes templates -
- )} - {skill.supportingFilesType === 'multi-file' && ( -
- šŸ“ Multi-file skill -
- )} -
- - {/* Footer with actions */} -
- {/* Install command display */} -
- - $ {generateInstallCommand(skill.repoUrl, skill.id)} - - - {copied ? ( - - ) : ( - - )} - -
- - {/* View Details and Author */} -
- - View Details → - - - {/* Author */} - {skill.author && ( - - by {skill.author} - - )} -
-
-
- -
- ); -} - -export type { Skill }; diff --git a/documentation/src/css/extensions.css b/documentation/src/css/extensions.css index fdd01f947013..de1e06e53ed3 100644 --- a/documentation/src/css/extensions.css +++ b/documentation/src/css/extensions.css @@ -87,25 +87,6 @@ transition: all 0.3s ease; } -.prompt-card { - min-height: 200px; - 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; -} -.prompt-card-content { - flex: 1; - display: flex; - flex-direction: column; - padding: 0 1.5rem 1.5rem 1.5rem; - min-height: 0; -} - /* Card header styles */ .card-header { padding: 1.5rem 1.5rem 0.75rem 1.5rem; diff --git a/documentation/src/pages/index.tsx b/documentation/src/pages/index.tsx index 5db2d352e209..9ea3d4ec0e77 100644 --- a/documentation/src/pages/index.tsx +++ b/documentation/src/pages/index.tsx @@ -119,9 +119,10 @@ function FeaturesSection() { Model Context Protocol {" "} - open standard. Add community{" "} - skills, or{" "} - build your own. + open standard. Add{" "} + skills, + {" "}or{" "} + build your own extension.

} /> diff --git a/documentation/src/pages/prompt-library/data/prompts/access-currently-stored-preferences.json b/documentation/src/pages/prompt-library/data/prompts/access-currently-stored-preferences.json deleted file mode 100644 index 000f8d9b3ae7..000000000000 --- a/documentation/src/pages/prompt-library/data/prompts/access-currently-stored-preferences.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "access-currently-stored-preferences", - "title": "Access Currently Stored Preferences", - "description": "Retrieve and display the user's currently stored preferences from goose memory", - "category": "productivity", - "job": "operations", - "example_prompt": "What have I asked you to remember?", - "example_result": "You've asked me to remember the following:\n\n### Personal\n* My name is Ade. I like to read tech blogs, play with technical tools, and i'm interested in building agentic systems.", - "extensions": [ - { - "name": "Memory", - "command": "memory", - "is_builtin": true, - "environmentVariables": [] - } - ] -} diff --git a/documentation/src/pages/prompt-library/data/prompts/accessibility-audit.json b/documentation/src/pages/prompt-library/data/prompts/accessibility-audit.json deleted file mode 100644 index bd3134c8c764..000000000000 --- a/documentation/src/pages/prompt-library/data/prompts/accessibility-audit.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "id": "accessibility-audit", - "title": "Website Accessibility Audit", - "description": "Conduct a comprehensive accessibility audit of a website, including keyboard navigation, color contrast, and ARIA compliance", - "category": "technical", - "job": "design", - "example_prompt": "Can you check if my website is accessible? Please conduct a full accessibility audit, focusing on the following:\n\n1. Keyboard Navigation: Test all interactive elements (links, buttons, dropdowns, etc.) to ensure they are accessible without a mouse.\n\n2. Color Contrast Analysis: Verify that all text and UI elements meet WCAG contrast ratio standards.\n\n3. Screen Reader Compatibility: Test whether a screen reader can properly interpret content and navigation.\n\n4. ARIA & Semantic HTML Validation: Identify any missing or misused ARIA attributes and ensure proper semantic structure.\n\n5. Error Identification & Screenshots: Provide a comprehensive report with identified issues, along with screenshots if necessary.\n\n6. Fixes & Code Recommendations: Suggest HTML, CSS, or JavaScript changes to resolve any compliance issues.\n\nHere is the website to test: [URL]. I want to ensure that our documentation meets accessibility standards. Please generate a detailed report with steps to fix any issues found.", - "example_result": "I've completed the accessibility audit of your website. Here are the findings:\n\n1. Keyboard Navigation:\n- All interactive elements are keyboard accessible\n- Focus indicators are visible\n- Tab order is logical\n\n2. Color Contrast:\n- Main text meets WCAG AA standards (ratio 4.5:1)\n- Warning: Header text #FF8C00 on white background fails contrast requirements\n\n3. Screen Reader Compatibility:\n- All images have appropriate alt text\n- Headings are properly structured (H1 → H2 → H3)\n- Form fields have associated labels\n\n4. ARIA & Semantic HTML:\n- Navigation uses