diff --git a/documentation/blog/2025-05-06-recipe-for-success/index.md b/documentation/blog/2025-05-06-recipe-for-success/index.md index 70b79e02..08d7f470 100644 --- a/documentation/blog/2025-05-06-recipe-for-success/index.md +++ b/documentation/blog/2025-05-06-recipe-for-success/index.md @@ -104,7 +104,7 @@ When something breaks, Goose doesn't panic; it pivots. For example, Goose might It's been 18 years since the movie came out, and I'd like to imagine that Linguini has surpassed his cooking era and stepped into his mentor era. Instead of training every new cook inefficiently, he's documenting his favorite dishes to make his knowledge shareable and scalable. -Similarly, Goose is a forward-looking AI agent with a solution for scaling knowledge through [recipes](/docs/guides/session-recipes). Recipes are complete orchestrations you can rerun, remix, or share, passing on knowledge to anyone who needs it. +Similarly, Goose is a forward-looking AI agent with a solution for scaling knowledge through [recipes](/docs/guides/recipes/session-recipes). Recipes are complete orchestrations you can rerun, remix, or share, passing on knowledge to anyone who needs it. Sharing a prompt doesn't always recreate the experience; AI is non-deterministic, and people may not have the same extensions or context configured. Recipes solve this by packaging your entire Goose workflow: the extensions, the setup, the goal, and example activities. @@ -190,7 +190,7 @@ Skip the chaos. Drop a Recipe link and let every attendee spin up the same envir Your team is full of problem solvers. One teammate built a slick internal dashboard. Another nailed support ticket triage. Someone else automated changelog generation. Then there's the question: how do we make it easy for the entire team to use? Recipes turn your team's creations into reusable workflows that anyone can pick up. Build a shared library of Goose-powered processes and multiply your team's impact. - Grab [Goose](/docs/getting-started/installation) and start cooking up some [recipes](/docs/guides/session-recipes) of your own. Your future self (and team) will thank you! + Grab [Goose](/docs/getting-started/installation) and start cooking up some [recipes](/docs/guides/recipes/session-recipes) of your own. Your future self (and team) will thank you! diff --git a/documentation/blog/2025-05-09-developers-ai-playbook-for-team-efficiency/index.md b/documentation/blog/2025-05-09-developers-ai-playbook-for-team-efficiency/index.md index 9ef2162b..7ffe7086 100644 --- a/documentation/blog/2025-05-09-developers-ai-playbook-for-team-efficiency/index.md +++ b/documentation/blog/2025-05-09-developers-ai-playbook-for-team-efficiency/index.md @@ -36,7 +36,7 @@ As teams adopt AI tools like Goose, the ability to define and share these automa ## AI Plays: Standardizing Your Team's Workflows -Goose can help standardize and automate these tasks, by [creating recipes](/docs/guides/session-recipes). As a developer on your team uses Goose, they can create a recipe that describes how to perform a task, and then share that with the rest of the team. These recipes can be shared and reused, and improved over time, just like a sports team’s playbook. +Goose can help standardize and automate these tasks, by [creating recipes](/docs/guides/recipes/session-recipes). As a developer on your team uses Goose, they can create a recipe that describes how to perform a task, and then share that with the rest of the team. These recipes can be shared and reused, and improved over time, just like a sports team’s playbook. Recipes are built with an understanding of the workflow you want Goose to help with, and these may involve one or more MCP servers, such as [GitHub](/docs/mcp/github-mcp/) or [PostgreSQL](/docs/mcp/postgres-mcp/). The recipes are designed to be reusable and adaptable, allowing developers to create a library that can be used across different projects. @@ -50,7 +50,7 @@ A Goose Recipe can be saved from a current Goose session, or written as a YAML f ### Creating a Recipe -If you [create a recipe from a current Goose session](/docs/guides/session-recipes/#create-recipe), it will prompt you for a name and description and will generate some activities that you can edit, along with instructions that you should review and edit. You will be given a URL that you can share with your team. +If you [create a recipe from a current Goose session](/docs/guides/recipes/session-recipes/#create-recipe), it will prompt you for a name and description and will generate some activities that you can edit, along with instructions that you should review and edit. You will be given a URL that you can share with your team. To create a recipe from scratch, you can use the Goose CLI to create a new recipe file by using a `/recipe` command in the session. This will create a `recipe.yaml` file in your current directory. To make a custom file you can use `/recipe custom-filename.yaml`. From there, you will add your own instructions and activities. diff --git a/documentation/docs/guides/recipes/_category_.json b/documentation/docs/guides/recipes/_category_.json new file mode 100644 index 00000000..74096a02 --- /dev/null +++ b/documentation/docs/guides/recipes/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Recipes", + "position": 1, + "link": { + "type": "doc", + "id": "guides/recipes/index" + } +} diff --git a/documentation/docs/guides/recipes/index.md b/documentation/docs/guides/recipes/index.md new file mode 100644 index 00000000..c78cd8e4 --- /dev/null +++ b/documentation/docs/guides/recipes/index.md @@ -0,0 +1,75 @@ +--- +title: Recipes +hide_title: true +description: Reusable and shareable AI workflows +--- + +import Card from '@site/src/components/Card'; +import styles from '@site/src/components/Card/styles.module.css'; + +

Recipes

+

+ Recipes are reusable workflows that package extensions, prompts, and settings together. Share proven workflows with your team and reproduce successful results consistently. +

+ + + + + +
+

📚 Documentation & Guides

+
+ + +
+
+ +
+

🛠️ Tools & Generators

+
+ + +
+
+ +
+

📝 Featured Blog Posts

+
+ + +
+
diff --git a/documentation/docs/guides/recipe-reference.md b/documentation/docs/guides/recipes/recipe-reference.md similarity index 98% rename from documentation/docs/guides/recipe-reference.md rename to documentation/docs/guides/recipes/recipe-reference.md index bb7e07fc..b05cd2e9 100644 --- a/documentation/docs/guides/recipe-reference.md +++ b/documentation/docs/guides/recipes/recipe-reference.md @@ -1,7 +1,7 @@ --- -sidebar_position: 18 +sidebar_position: 2 title: Recipe Reference Guide -sidebar_label: Recipe Reference Guide +description: Complete technical reference for creating and customizing recipes in Goose via the CLI. --- Recipes are reusable Goose configurations that package up a specific setup so it can be easily shared and launched by others. diff --git a/documentation/docs/guides/session-recipes.md b/documentation/docs/guides/recipes/session-recipes.md similarity index 99% rename from documentation/docs/guides/session-recipes.md rename to documentation/docs/guides/recipes/session-recipes.md index f1a8e3e0..93438093 100644 --- a/documentation/docs/guides/session-recipes.md +++ b/documentation/docs/guides/recipes/session-recipes.md @@ -1,7 +1,6 @@ --- -sidebar_position: 5 -title: Create a Recipe from Your Session -sidebar_label: Shareable Recipes +sidebar_position: 1 +title: Shareable Recipes description: "Share a Goose session setup (including tools, goals, and instructions) as a reusable recipe that others can launch with a single click" --- diff --git a/documentation/docs/guides/tips.md b/documentation/docs/guides/tips.md index a942d751..65867c89 100644 --- a/documentation/docs/guides/tips.md +++ b/documentation/docs/guides/tips.md @@ -39,7 +39,7 @@ Commit your code changes early and often. This allows you to rollback any unexpe Administrators can use an [allowlist](/docs/guides/allowlist) to restrict Goose to approved extensions only. This helps prevent risky installs from unknown MCP servers. ### Set up starter templates -You can turn a successful session into a reusable "[recipe](/docs/guides/session-recipes)" to share with others or use again later—no need to start from scratch. +You can turn a successful session into a reusable "[recipe](/docs/guides/recipes/session-recipes)" to share with others or use again later—no need to start from scratch. ### Embrace an experimental mindset You don’t need to get it right the first time. Iterating on prompts and tools is part of the workflow. diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index 71ed32df..9ccd0102 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -108,7 +108,15 @@ const config: Config = { }, { from: '/docs/guides/share-goose-sessions', - to: '/docs/guides/session-recipes' + to: '/docs/guides/recipes/session-recipes' + }, + { + from: '/docs/guides/session-recipes', + to: '/docs/guides/recipes/session-recipes' + }, + { + from: '/docs/guides/recipe-reference', + to: '/docs/guides/recipes/recipe-reference' }, // MCP tutorial redirects - moved from /docs/tutorials/ to /docs/mcp/ { diff --git a/documentation/src/components/Card/index.tsx b/documentation/src/components/Card/index.tsx new file mode 100644 index 00000000..fff960e4 --- /dev/null +++ b/documentation/src/components/Card/index.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import styles from './styles.module.css'; + +interface CardProps { + title: string; + description: string; + link: string; + icon?: string; +} + +export default function Card({ title, description, link, icon }: CardProps): JSX.Element { + const isInternalLink = link.startsWith('/'); + const CardWrapper = isInternalLink ? Link : 'a'; + const wrapperProps = isInternalLink ? { to: link } : { href: link }; + + return ( + +
+ {icon && ( +
+ +
+ )} +

{title}

+

{description}

+
+
+ ); +} diff --git a/documentation/src/components/Card/styles.module.css b/documentation/src/components/Card/styles.module.css new file mode 100644 index 00000000..9f529f9b --- /dev/null +++ b/documentation/src/components/Card/styles.module.css @@ -0,0 +1,79 @@ +.categorySection { + margin: 3rem 0; +} + +.categoryTitle { + font-size: 1.5rem; + margin-bottom: 1.5rem; + color: var(--ifm-heading-color); + font-weight: 600; +} + +.cardGrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1.5rem; + margin: 1rem 0; +} + +.singleCardGrid { + display: grid; + grid-template-columns: minmax(300px, 600px); + gap: 1.5rem; + margin: 1rem 0; +} + +.pageTitle { + font-size: 2.5rem; + margin-bottom: 1rem; + color: var(--ifm-heading-color); +} + +.pageDescription { + font-size: 1.2rem; + color: var(--ifm-color-emphasis-700); + margin-bottom: 2rem; + line-height: 1.6; +} + +/* Video container styles */ +:global(.video-container) { + position: relative; + width: 100%; + max-width: 800px; + margin: 0 auto 3rem; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 4px 12px -6px rgba(0, 0, 0, 0.1); +} + +/* Card styles */ +.card { + display: block; + padding: 1.75rem; + border-radius: 12px; + background: transparent; + border: 1px solid var(--ifm-color-emphasis-200); + transition: border-color 0.2s ease, box-shadow 0.2s ease; + text-decoration: none !important; + color: inherit !important; +} + +.card:hover { + border-color: var(--ifm-color-emphasis-500); + box-shadow: 0 4px 12px -6px rgba(0, 0, 0, 0.1); + text-decoration: none; +} + +.cardTitle { + font-size: 1.4rem; + margin: 0 0 0.75rem 0; + color: var(--ifm-heading-color); + font-weight: 600; +} + +.cardDescription { + margin: 0; + color: var(--ifm-color-emphasis-700); + line-height: 1.6; +} diff --git a/documentation/src/pages/recipe-generator.tsx b/documentation/src/pages/recipe-generator.tsx index 3b2794ea..fbc168a7 100644 --- a/documentation/src/pages/recipe-generator.tsx +++ b/documentation/src/pages/recipe-generator.tsx @@ -12,7 +12,7 @@ export default function RecipeGenerator() { const [activities, setActivities] = useState([]); const [newActivity, setNewActivity] = useState(''); const [copied, setCopied] = useState(false); - const [errors, setErrors] = useState({}); + const [errors, setErrors] = useState<{[key: string]: string}>({}); const [outputFormat, setOutputFormat] = useState('url'); // 'url' or 'yaml' const [authorContact, setAuthorContact] = useState(''); const [extensionsList, setExtensionsList] = useState([ @@ -59,7 +59,7 @@ export default function RecipeGenerator() { // Form validation const validateForm = useCallback(() => { - const newErrors = {}; + const newErrors: {[key: string]: string} = {}; if (!title.trim()) { newErrors.title = 'Title is required'; @@ -89,6 +89,7 @@ export default function RecipeGenerator() { title, description, instructions, + prompt: prompt.trim() || undefined, activities: activities.length > 0 ? activities : undefined }; @@ -272,6 +273,23 @@ instructions: ${instructions} {errors.instructions &&
{errors.instructions}
} + {/* Initial Prompt */} +
+ +