From 50ff508de52a70588b18cb57895d3fb60c375e6d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 08:36:19 +0000 Subject: [PATCH 1/7] Use org-specific workshop landing URL in docs Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- docs/astro.config.mjs | 2 +- docs/scripts/sync-workshop-content.js | 2 +- .../workshop/WorkshopExperience.astro | 2 +- docs/src/content/docs/index.mdx | 2 +- .../workshop/hackathon-blue-bat-18.astro | 21 +++++++++++++++++++ docs/tests/workshop.spec.ts | 10 ++++----- 6 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 docs/src/pages/workshop/hackathon-blue-bat-18.astro diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 932cc1952ee..20c2779bd13 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -295,7 +295,7 @@ export default defineConfig({ errorOnLocalLinks: true, exclude: ({ file, link }) => file.includes('/src/generated/workshop-markdown/') - && link.startsWith('/gh-aw/workshop/?__gh_aw_workshop_local__='), + && link.startsWith('/gh-aw/workshop/hackathon-blue-bat-18/?__gh_aw_workshop_local__='), }) ], sidebar: [ diff --git a/docs/scripts/sync-workshop-content.js b/docs/scripts/sync-workshop-content.js index 39a5c2a10db..ca822122fbc 100644 --- a/docs/scripts/sync-workshop-content.js +++ b/docs/scripts/sync-workshop-content.js @@ -8,7 +8,7 @@ const outputFile = join(generatedDir, 'workshop-content.ts'); const workshopRepo = process.env.GH_AW_WORKSHOP_REPO || 'githubnext/gh-aw-workshop'; const workshopRef = process.env.GH_AW_WORKSHOP_REF || 'main'; const localWorkshopSourceDir = process.env.GH_AW_WORKSHOP_SOURCE_DIR; -const workshopLocalLinkPrefix = '/gh-aw/workshop/?__gh_aw_workshop_local__='; +const workshopLocalLinkPrefix = '/gh-aw/workshop/hackathon-blue-bat-18/?__gh_aw_workshop_local__='; const publicWorkshopBase = `https://github.com/${workshopRepo}`; const publicWorkshopTreeUrl = `${publicWorkshopBase}/tree/${workshopRef}/workshop`; const publicWorkshopBlobBaseUrl = `${publicWorkshopBase}/blob/${workshopRef}/workshop/`; diff --git a/docs/src/components/workshop/WorkshopExperience.astro b/docs/src/components/workshop/WorkshopExperience.astro index f4c8d9c0ddf..c080fad19af 100644 --- a/docs/src/components/workshop/WorkshopExperience.astro +++ b/docs/src/components/workshop/WorkshopExperience.astro @@ -35,7 +35,7 @@ type WorkshopMarkdownModule = { const workshopGithubBase = workshopSource.githubBaseUrl; const workshopImageBase = workshopSource.rawBaseUrl; -const workshopLocalLinkPrefix = '/gh-aw/workshop/?__gh_aw_workshop_local__='; +const workshopLocalLinkPrefix = '/gh-aw/workshop/hackathon-blue-bat-18/?__gh_aw_workshop_local__='; const workshopMarkdownModules = import.meta.glob('../../generated/workshop-markdown/*.md', { eager: true }) as Record; const primerIcons = octicons as Record) => string }>; diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index fbe7b0e1687..055e40098b4 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -202,7 +202,7 @@ Create custom agentic workflows directly from the GitHub web interface using nat ## Workshop - + Choose a terminal, browser, or Copilot path and work through the workshop directly in the docs with saved progress. diff --git a/docs/src/pages/workshop/hackathon-blue-bat-18.astro b/docs/src/pages/workshop/hackathon-blue-bat-18.astro new file mode 100644 index 00000000000..39b7da65f39 --- /dev/null +++ b/docs/src/pages/workshop/hackathon-blue-bat-18.astro @@ -0,0 +1,21 @@ +--- +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; +import WorkshopExperience from '../../components/workshop/WorkshopExperience.astro'; +--- + + + + + + diff --git a/docs/tests/workshop.spec.ts b/docs/tests/workshop.spec.ts index e552053f99b..6e3462134df 100644 --- a/docs/tests/workshop.spec.ts +++ b/docs/tests/workshop.spec.ts @@ -12,7 +12,7 @@ const workshopDevices = [ ]; async function startWorkshop(page: Page) { - await page.goto('/gh-aw/workshop/'); + await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-entry-path="ui-learner"]').click(); await page.locator('[data-workshop-scenario="daily-status"]').click(); @@ -188,7 +188,7 @@ test.describe('Workshop tutorial', () => { test.describe('Workshop URL hash navigation', () => { test('encodes journey and scenario in the URL hash after setup', async ({ page }) => { - await page.goto('/gh-aw/workshop/'); + await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-journey="github"]').click(); @@ -220,7 +220,7 @@ test.describe('Workshop URL hash navigation', () => { const stepPosition = await page.locator('[data-workshop-step-position]').textContent(); // Navigate away so storage would otherwise default back to step 1. - await page.goto('/gh-aw/workshop/'); + await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); // Clear session storage so the only source of truth for the step is the URL hash. await page.evaluate(() => sessionStorage.clear()); @@ -235,7 +235,7 @@ test.describe('Workshop URL hash navigation', () => { }); test('supports browser back navigation from tutorial to setup', async ({ page }) => { - await page.goto('/gh-aw/workshop/'); + await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-journey="github"]').click(); @@ -250,7 +250,7 @@ test.describe('Workshop URL hash navigation', () => { }); test('supports browser back navigation from scenario picker to workspace picker', async ({ page }) => { - await page.goto('/gh-aw/workshop/'); + await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-journey="github"]').click(); From 719683fa44611de1b74e18eaf6e2e554b9d83fe7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 08:44:13 +0000 Subject: [PATCH 2/7] Use dynamic org workshop route Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- .../workshop/{hackathon-blue-bat-18.astro => [org].astro} | 4 ++++ 1 file changed, 4 insertions(+) rename docs/src/pages/workshop/{hackathon-blue-bat-18.astro => [org].astro} (84%) diff --git a/docs/src/pages/workshop/hackathon-blue-bat-18.astro b/docs/src/pages/workshop/[org].astro similarity index 84% rename from docs/src/pages/workshop/hackathon-blue-bat-18.astro rename to docs/src/pages/workshop/[org].astro index 39b7da65f39..adeefe93a8e 100644 --- a/docs/src/pages/workshop/hackathon-blue-bat-18.astro +++ b/docs/src/pages/workshop/[org].astro @@ -1,6 +1,10 @@ --- import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import WorkshopExperience from '../../components/workshop/WorkshopExperience.astro'; + +export function getStaticPaths() { + return [{ params: { org: 'hackathon-blue-bat-18' } }]; +} --- Date: Sun, 19 Jul 2026 09:04:52 +0000 Subject: [PATCH 3/7] Update workshop URL to plural dated path Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- docs/astro.config.mjs | 2 +- docs/scripts/sync-workshop-content.js | 2 +- docs/src/components/workshop/WorkshopExperience.astro | 2 +- docs/src/content/docs/index.mdx | 2 +- docs/src/pages/{workshop => workshops}/[org].astro | 2 +- docs/tests/workshop.spec.ts | 10 +++++----- 6 files changed, 10 insertions(+), 10 deletions(-) rename docs/src/pages/{workshop => workshops}/[org].astro (89%) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 20c2779bd13..e813843261a 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -295,7 +295,7 @@ export default defineConfig({ errorOnLocalLinks: true, exclude: ({ file, link }) => file.includes('/src/generated/workshop-markdown/') - && link.startsWith('/gh-aw/workshop/hackathon-blue-bat-18/?__gh_aw_workshop_local__='), + && link.startsWith('/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/?__gh_aw_workshop_local__='), }) ], sidebar: [ diff --git a/docs/scripts/sync-workshop-content.js b/docs/scripts/sync-workshop-content.js index ca822122fbc..afbebd1ebfe 100644 --- a/docs/scripts/sync-workshop-content.js +++ b/docs/scripts/sync-workshop-content.js @@ -8,7 +8,7 @@ const outputFile = join(generatedDir, 'workshop-content.ts'); const workshopRepo = process.env.GH_AW_WORKSHOP_REPO || 'githubnext/gh-aw-workshop'; const workshopRef = process.env.GH_AW_WORKSHOP_REF || 'main'; const localWorkshopSourceDir = process.env.GH_AW_WORKSHOP_SOURCE_DIR; -const workshopLocalLinkPrefix = '/gh-aw/workshop/hackathon-blue-bat-18/?__gh_aw_workshop_local__='; +const workshopLocalLinkPrefix = '/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/?__gh_aw_workshop_local__='; const publicWorkshopBase = `https://github.com/${workshopRepo}`; const publicWorkshopTreeUrl = `${publicWorkshopBase}/tree/${workshopRef}/workshop`; const publicWorkshopBlobBaseUrl = `${publicWorkshopBase}/blob/${workshopRef}/workshop/`; diff --git a/docs/src/components/workshop/WorkshopExperience.astro b/docs/src/components/workshop/WorkshopExperience.astro index c080fad19af..f193bc6e5fb 100644 --- a/docs/src/components/workshop/WorkshopExperience.astro +++ b/docs/src/components/workshop/WorkshopExperience.astro @@ -35,7 +35,7 @@ type WorkshopMarkdownModule = { const workshopGithubBase = workshopSource.githubBaseUrl; const workshopImageBase = workshopSource.rawBaseUrl; -const workshopLocalLinkPrefix = '/gh-aw/workshop/hackathon-blue-bat-18/?__gh_aw_workshop_local__='; +const workshopLocalLinkPrefix = '/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/?__gh_aw_workshop_local__='; const workshopMarkdownModules = import.meta.glob('../../generated/workshop-markdown/*.md', { eager: true }) as Record; const primerIcons = octicons as Record) => string }>; diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 055e40098b4..844f7af9480 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -202,7 +202,7 @@ Create custom agentic workflows directly from the GitHub web interface using nat ## Workshop - + Choose a terminal, browser, or Copilot path and work through the workshop directly in the docs with saved progress. diff --git a/docs/src/pages/workshop/[org].astro b/docs/src/pages/workshops/[org].astro similarity index 89% rename from docs/src/pages/workshop/[org].astro rename to docs/src/pages/workshops/[org].astro index adeefe93a8e..631e4a511dd 100644 --- a/docs/src/pages/workshop/[org].astro +++ b/docs/src/pages/workshops/[org].astro @@ -3,7 +3,7 @@ import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import WorkshopExperience from '../../components/workshop/WorkshopExperience.astro'; export function getStaticPaths() { - return [{ params: { org: 'hackathon-blue-bat-18' } }]; + return [{ params: { org: '2026-07-24-hackathon-blue-bat-18' } }]; } --- diff --git a/docs/tests/workshop.spec.ts b/docs/tests/workshop.spec.ts index 6e3462134df..108805b0d9b 100644 --- a/docs/tests/workshop.spec.ts +++ b/docs/tests/workshop.spec.ts @@ -12,7 +12,7 @@ const workshopDevices = [ ]; async function startWorkshop(page: Page) { - await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); + await page.goto('/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-entry-path="ui-learner"]').click(); await page.locator('[data-workshop-scenario="daily-status"]').click(); @@ -188,7 +188,7 @@ test.describe('Workshop tutorial', () => { test.describe('Workshop URL hash navigation', () => { test('encodes journey and scenario in the URL hash after setup', async ({ page }) => { - await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); + await page.goto('/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-journey="github"]').click(); @@ -220,7 +220,7 @@ test.describe('Workshop URL hash navigation', () => { const stepPosition = await page.locator('[data-workshop-step-position]').textContent(); // Navigate away so storage would otherwise default back to step 1. - await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); + await page.goto('/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); // Clear session storage so the only source of truth for the step is the URL hash. await page.evaluate(() => sessionStorage.clear()); @@ -235,7 +235,7 @@ test.describe('Workshop URL hash navigation', () => { }); test('supports browser back navigation from tutorial to setup', async ({ page }) => { - await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); + await page.goto('/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-journey="github"]').click(); @@ -250,7 +250,7 @@ test.describe('Workshop URL hash navigation', () => { }); test('supports browser back navigation from scenario picker to workspace picker', async ({ page }) => { - await page.goto('/gh-aw/workshop/hackathon-blue-bat-18/'); + await page.goto('/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/'); await page.waitForLoadState('networkidle'); await page.locator('[data-workshop-journey="github"]').click(); From e35bc06cd29cd1fc9856f79ea18768e3851e0e7c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 09:25:22 +0000 Subject: [PATCH 4/7] refactor: extract WORKSHOP_ORG_SLUG constant to avoid hardcoding Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- docs/astro.config.mjs | 3 ++- docs/scripts/sync-workshop-content.js | 3 ++- docs/src/components/workshop/WorkshopExperience.astro | 3 ++- docs/src/content/docs/index.mdx | 3 ++- docs/src/lib/workshop/config.ts | 2 ++ docs/src/pages/workshops/[org].astro | 3 ++- 6 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 docs/src/lib/workshop/config.ts diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index e813843261a..b94ec9f120e 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -11,6 +11,7 @@ import { unified } from '@astrojs/markdown-remark'; import remarkStripEmojis from './src/lib/remark/stripEmojis.js'; import remarkTableDataLabels from './src/lib/remark/tableDataLabels.js'; import rehypeTableWrapper from './src/lib/rehype/tableWrapper.js'; +import { WORKSHOP_ORG_SLUG } from './src/lib/workshop/config.ts'; /** * Creates blog authors config with GitHub profile pictures @@ -295,7 +296,7 @@ export default defineConfig({ errorOnLocalLinks: true, exclude: ({ file, link }) => file.includes('/src/generated/workshop-markdown/') - && link.startsWith('/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/?__gh_aw_workshop_local__='), + && link.startsWith(`/gh-aw/workshops/${WORKSHOP_ORG_SLUG}/?__gh_aw_workshop_local__=`), }) ], sidebar: [ diff --git a/docs/scripts/sync-workshop-content.js b/docs/scripts/sync-workshop-content.js index afbebd1ebfe..ab5ab14913b 100644 --- a/docs/scripts/sync-workshop-content.js +++ b/docs/scripts/sync-workshop-content.js @@ -8,7 +8,8 @@ const outputFile = join(generatedDir, 'workshop-content.ts'); const workshopRepo = process.env.GH_AW_WORKSHOP_REPO || 'githubnext/gh-aw-workshop'; const workshopRef = process.env.GH_AW_WORKSHOP_REF || 'main'; const localWorkshopSourceDir = process.env.GH_AW_WORKSHOP_SOURCE_DIR; -const workshopLocalLinkPrefix = '/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/?__gh_aw_workshop_local__='; +const workshopOrgSlug = process.env.GH_AW_WORKSHOP_ORG_SLUG || '2026-07-24-hackathon-blue-bat-18'; +const workshopLocalLinkPrefix = `/gh-aw/workshops/${workshopOrgSlug}/?__gh_aw_workshop_local__=`; const publicWorkshopBase = `https://github.com/${workshopRepo}`; const publicWorkshopTreeUrl = `${publicWorkshopBase}/tree/${workshopRef}/workshop`; const publicWorkshopBlobBaseUrl = `${publicWorkshopBase}/blob/${workshopRef}/workshop/`; diff --git a/docs/src/components/workshop/WorkshopExperience.astro b/docs/src/components/workshop/WorkshopExperience.astro index f193bc6e5fb..ccb844e44c7 100644 --- a/docs/src/components/workshop/WorkshopExperience.astro +++ b/docs/src/components/workshop/WorkshopExperience.astro @@ -9,6 +9,7 @@ import { workshopRoutes, workshopScenarios, } from '../../lib/workshop/manifest'; +import { WORKSHOP_ORG_SLUG } from '../../lib/workshop/config'; import { workshopContent, workshopSource, type WorkshopContentEntry } from '../../generated/workshop-content.ts'; type WorkshopEntry = { @@ -35,7 +36,7 @@ type WorkshopMarkdownModule = { const workshopGithubBase = workshopSource.githubBaseUrl; const workshopImageBase = workshopSource.rawBaseUrl; -const workshopLocalLinkPrefix = '/gh-aw/workshops/2026-07-24-hackathon-blue-bat-18/?__gh_aw_workshop_local__='; +const workshopLocalLinkPrefix = `/gh-aw/workshops/${WORKSHOP_ORG_SLUG}/?__gh_aw_workshop_local__=`; const workshopMarkdownModules = import.meta.glob('../../generated/workshop-markdown/*.md', { eager: true }) as Record; const primerIcons = octicons as Record) => string }>; diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 844f7af9480..b2ef6c16a08 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -23,6 +23,7 @@ import FeatureGrid from '../../components/FeatureGrid.astro'; import Video from '../../components/Video.astro'; import BlogLinkSection from '../../components/BlogLinkSection.astro'; import WorkflowHero from '../../components/WorkflowHero.astro'; +import { WORKSHOP_ORG_SLUG } from '../../lib/workshop/config'; @@ -202,7 +203,7 @@ Create custom agentic workflows directly from the GitHub web interface using nat ## Workshop - + Choose a terminal, browser, or Copilot path and work through the workshop directly in the docs with saved progress. diff --git a/docs/src/lib/workshop/config.ts b/docs/src/lib/workshop/config.ts new file mode 100644 index 00000000000..a41ac1c9319 --- /dev/null +++ b/docs/src/lib/workshop/config.ts @@ -0,0 +1,2 @@ +/** Slug for the current active workshop, in the form `YYYY-MM-DD-org-name`. */ +export const WORKSHOP_ORG_SLUG = '2026-07-24-hackathon-blue-bat-18'; diff --git a/docs/src/pages/workshops/[org].astro b/docs/src/pages/workshops/[org].astro index 631e4a511dd..1bf4f1c68a6 100644 --- a/docs/src/pages/workshops/[org].astro +++ b/docs/src/pages/workshops/[org].astro @@ -1,9 +1,10 @@ --- import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import WorkshopExperience from '../../components/workshop/WorkshopExperience.astro'; +import { WORKSHOP_ORG_SLUG } from '../../lib/workshop/config'; export function getStaticPaths() { - return [{ params: { org: '2026-07-24-hackathon-blue-bat-18' } }]; + return [{ params: { org: WORKSHOP_ORG_SLUG } }]; } --- From 80abe3c551d61fee83dc6e09d873b54f9ddfa335 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 09:35:25 +0000 Subject: [PATCH 5/7] refactor: support multiple workshop slugs via WORKSHOP_SLUGS list Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- docs/astro.config.mjs | 4 ++-- .../src/components/workshop/WorkshopExperience.astro | 9 +++++++-- docs/src/content/docs/index.mdx | 4 ++-- docs/src/lib/workshop/config.ts | 12 ++++++++++-- docs/src/pages/workshops/[org].astro | 8 +++++--- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index b94ec9f120e..2984645efea 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -11,7 +11,6 @@ import { unified } from '@astrojs/markdown-remark'; import remarkStripEmojis from './src/lib/remark/stripEmojis.js'; import remarkTableDataLabels from './src/lib/remark/tableDataLabels.js'; import rehypeTableWrapper from './src/lib/rehype/tableWrapper.js'; -import { WORKSHOP_ORG_SLUG } from './src/lib/workshop/config.ts'; /** * Creates blog authors config with GitHub profile pictures @@ -296,7 +295,8 @@ export default defineConfig({ errorOnLocalLinks: true, exclude: ({ file, link }) => file.includes('/src/generated/workshop-markdown/') - && link.startsWith(`/gh-aw/workshops/${WORKSHOP_ORG_SLUG}/?__gh_aw_workshop_local__=`), + && link.startsWith('/gh-aw/workshops/') + && link.includes('?__gh_aw_workshop_local__='), }) ], sidebar: [ diff --git a/docs/src/components/workshop/WorkshopExperience.astro b/docs/src/components/workshop/WorkshopExperience.astro index ccb844e44c7..2bb81c90d05 100644 --- a/docs/src/components/workshop/WorkshopExperience.astro +++ b/docs/src/components/workshop/WorkshopExperience.astro @@ -9,9 +9,14 @@ import { workshopRoutes, workshopScenarios, } from '../../lib/workshop/manifest'; -import { WORKSHOP_ORG_SLUG } from '../../lib/workshop/config'; import { workshopContent, workshopSource, type WorkshopContentEntry } from '../../generated/workshop-content.ts'; +interface Props { + org: string; +} + +const { org } = Astro.props; + type WorkshopEntry = { id: string; title: string; @@ -36,7 +41,7 @@ type WorkshopMarkdownModule = { const workshopGithubBase = workshopSource.githubBaseUrl; const workshopImageBase = workshopSource.rawBaseUrl; -const workshopLocalLinkPrefix = `/gh-aw/workshops/${WORKSHOP_ORG_SLUG}/?__gh_aw_workshop_local__=`; +const workshopLocalLinkPrefix = `/gh-aw/workshops/${org}/?__gh_aw_workshop_local__=`; const workshopMarkdownModules = import.meta.glob('../../generated/workshop-markdown/*.md', { eager: true }) as Record; const primerIcons = octicons as Record) => string }>; diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index b2ef6c16a08..d1c5823f4cf 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -23,7 +23,7 @@ import FeatureGrid from '../../components/FeatureGrid.astro'; import Video from '../../components/Video.astro'; import BlogLinkSection from '../../components/BlogLinkSection.astro'; import WorkflowHero from '../../components/WorkflowHero.astro'; -import { WORKSHOP_ORG_SLUG } from '../../lib/workshop/config'; +import { CURRENT_WORKSHOP_SLUG } from '../../lib/workshop/config'; @@ -203,7 +203,7 @@ Create custom agentic workflows directly from the GitHub web interface using nat ## Workshop - + Choose a terminal, browser, or Copilot path and work through the workshop directly in the docs with saved progress. diff --git a/docs/src/lib/workshop/config.ts b/docs/src/lib/workshop/config.ts index a41ac1c9319..4622a296c94 100644 --- a/docs/src/lib/workshop/config.ts +++ b/docs/src/lib/workshop/config.ts @@ -1,2 +1,10 @@ -/** Slug for the current active workshop, in the form `YYYY-MM-DD-org-name`. */ -export const WORKSHOP_ORG_SLUG = '2026-07-24-hackathon-blue-bat-18'; +/** + * All workshop slugs, ordered newest-first, in the form `YYYY-MM-DD-org-name`. + * Add a new entry at the top of the array for each new workshop. + */ +export const WORKSHOP_SLUGS = [ + '2026-07-24-hackathon-blue-bat-18', +] as const; + +/** The slug for the current (latest) active workshop. */ +export const CURRENT_WORKSHOP_SLUG = WORKSHOP_SLUGS[0]; diff --git a/docs/src/pages/workshops/[org].astro b/docs/src/pages/workshops/[org].astro index 1bf4f1c68a6..a63ac36aaff 100644 --- a/docs/src/pages/workshops/[org].astro +++ b/docs/src/pages/workshops/[org].astro @@ -1,11 +1,13 @@ --- import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import WorkshopExperience from '../../components/workshop/WorkshopExperience.astro'; -import { WORKSHOP_ORG_SLUG } from '../../lib/workshop/config'; +import { WORKSHOP_SLUGS } from '../../lib/workshop/config'; export function getStaticPaths() { - return [{ params: { org: WORKSHOP_ORG_SLUG } }]; + return WORKSHOP_SLUGS.map((org) => ({ params: { org } })); } + +const { org } = Astro.params; --- - +