Skip to content

Copilot Workshops: new Astro site, GitHub Copilot App harness, localizations, and content-first restructure#146

Merged
GeekTrainer merged 69 commits into
mainfrom
geektrainer/app-course-followup
Jul 15, 2026
Merged

Copilot Workshops: new Astro site, GitHub Copilot App harness, localizations, and content-first restructure#146
GeekTrainer merged 69 commits into
mainfrom
geektrainer/app-course-followup

Conversation

@GeekTrainer

Copy link
Copy Markdown
Collaborator

Summary

This PR delivers the full "Copilot Workshops" revamp: a new GitHub Copilot App beginner harness, a migration of the site to Astro + Starlight with pure-Markdown lessons, five-locale translations of the App harness, and a content-first repository restructure (browsable Markdown at repo-root docs/, Astro tooling isolated in website/). The workshop is also renamed from "Agents in SDLC" to Copilot Workshops.

Type of change

  • Workshop content (lesson Markdown, images)
  • Site shell (website/ Astro + Starlight wrapper)
  • Copilot configuration (.github/copilot-instructions.md, instructions, agents, skills)
  • Repo housekeeping (CI, dependabot, README, license)
  • Other:

What's included

  • New GitHub Copilot App harness (docs/app/, 9 lessons) — a beginner path modeled on the CLI flow: install, first agent session, custom instructions, building a filtering feature, the Playwright MCP server, PR creation via Agent Merge (highlighting how it auto-invokes the contributor skill), canvases, and review. Grounded in the Copilot App docs.
  • Site migration — MkDocs → Astro + Starlight, then lessons converted from MDX to pure Markdown; the partials toolchain and MDX-era components retired.
  • Content-first restructure — lessons now live as plain Markdown at repo-root docs/** (browsable directly on github.com); the Astro/Starlight publisher moved to website/. Folder landings use README.md with explicit slug: frontmatter to preserve routes.
  • Localizations — App harness translated into es-es, ja-jp, ko-kr, pt-br, zh-cn, with a locales i18n block and a localizations skill + per-locale rules.
  • Rename to "Copilot Workshops" with a distinct home-page H1 ("Hands-on with GitHub Copilot's agents"). The agents-in-sdlc URL slug is intentionally kept until the repo is renamed post-merge.
  • Copilot config — imported skills/agents from awesome-copilot; added build-and-verify-docs, check-content-alignment, make-repo-contribution, and the content-alignment agentic workflow; standardized on GitHub admonition syntax everywhere.
  • Link fixes — corrected broken awesome-copilot and localized links across English and all locales.

Verification

  • cd website && rm -rf dist && npm run build succeeds — 218 built HTML files (217 pages + 404), matching the 36 routes × 6 locales + 1 redirect invariant.
  • Lychee offline link check passes — 0 errors.
  • External GitHub / awesome-copilot URLs that changed were checked manually online (lychee runs offline).

Notes for reviewers

  • This is a large, cumulative PR — it represents the whole workshop transformation on this branch. It merges cleanly (0 commits behind main).
  • The agents-in-sdlc slug (base path, Pages URL, edit-link base, CI lychee symlink) is deliberately unchanged. It will be updated in a single follow-up pass once the repository is renamed.
  • Incorporation into awesome-copilot is a separate, owner-driven follow-up and is not part of this PR.

Copilot AI and others added 30 commits April 30, 2026 12:56
Agent-Logs-Url: https://github.com/github-samples/agents-in-sdlc/sessions/fe23a7c4-299e-4150-9215-ce55e8e0682e

Co-authored-by: GeekTrainer <6109729+GeekTrainer@users.noreply.github.com>
…de, Cloud, Complete)

Agent-Logs-Url: https://github.com/github-samples/agents-in-sdlc/sessions/fe23a7c4-299e-4150-9215-ce55e8e0682e

Co-authored-by: GeekTrainer <6109729+GeekTrainer@users.noreply.github.com>
Builds out the workshop-content/ directory as a publishable MkDocs site
and removes long-standing duplication across the three learning paths.

Site infrastructure (Phase A1)
  - mkdocs.yml at repo root with Material theme, dark/light toggle,
    nav tabs, search, code-copy, edit links, and PyMdown Snippets
    configured against partials/.
  - requirements-docs.txt pinning mkdocs-material, pymdown-extensions,
    and mkdocs-callouts (renders > [!NOTE]/[!IMPORTANT]/[!TIP] blocks
    as Material admonitions).
  - .github/workflows/pages.yml builds with mkdocs --strict on PRs
    (validation only) and on push to main (build + deploy via
    actions/deploy-pages). Explicit per-job permissions; pages
    concurrency group; pinned actions.
  - site/ and .venv-docs/ added to .gitignore.

Content partials (Phase A2 — Tier 1)
  Five reusable snippets at repo-root partials/, replacing verbatim
  duplicates across paths via --8<-- includes:
    - sections/coding-agent-intro.md     (vscode/4 + cloud/2)
    - sections/iterating-recap.md        (vscode/7 + cloud/5)
    - sections/security-coding-agent.md  (vscode/7 + cloud/5)
    - scenarios/tech-debt.md             (vscode/4 + cloud/2)
    - scenarios/accessibility.md         (cli/6 + shared/coding-agent/custom-agents)
  Partials follow inline-links-only / no-images / no-H1 rules
  documented in partials/README.md.

Path-publishing fixes
  - Converted 3 outbound links pointing to .github/instructions/*.md
    to absolute github.com URLs (would otherwise break --strict).
  - Escaped <branch-name> placeholders in iterating files so they
    render as code spans, not stray HTML tags.
  - Escaping shared/1 link refs to absolute URLs preserves both raw
    GitHub readability and Pages strict build.

Prior dedup + cleanup (also pending on this branch, included here)
  - shared/coding-agent/{custom-agents,managing-agents}.md as
    canonical bodies for the cross-path coding-agent flows.
  - Wrappers in vscode/{5,6} and cloud/{3,4} reduced to skeletons
    pointing to the shared module.
  - Multiple polish passes from earlier session work
    (cli warm-up, hands-on demos, /delegate optional section, etc.).

Local validation: mkdocs build --strict passes with zero errors;
all 5 partials resolve correctly in rendered output; GitHub alerts
render as Material admonitions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the MkDocs Material build (and the opaque PyMdown --8<-- snippet
syntax) with a new Astro + Starlight project under docs/. Authored content
stays in workshop-content/ and is loaded via Astro's glob() loader.

- New docs/ project with Astro 5 + Starlight 0.36, separate from client/
- Convert all Markdown to .mdx with YAML frontmatter
- Replace --8<-- snippet includes with MDX partials in
  workshop-content/_partials/ and typed Astro components in
  docs/src/components/ (CalloutCloudAgentRequired, PrereqCopilotBase)
- Convert GitHub-style alerts (> [!NOTE], etc.) to Starlight <Aside>
- Drop manual prev/next tables; Starlight generates them from sidebar order
- Rename README.md -> index.mdx so directory URLs stay stable
- Rewrite internal .md links to relative directory-style route URLs so they
  work under the /agents-in-sdlc/ base path
- Rewrite .github/workflows/pages.yml for Node + Astro + lychee link check
- Symlink workshop-content/node_modules -> ../docs/node_modules so MDX
  outside docs/ can resolve @astrojs/starlight/components
- Delete mkdocs.yml, requirements-docs.txt, partials/, site/
- Update root README.md to describe the new docs build

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Previously it lived as a standalone top-level sidebar entry (mirroring the
old mkdocs nav). Each course should treat custom instructions as its own
module 1, so add it inside the VS Code, CLI, and Cloud agent path groups.
The destination URL still points at the shared page under /shared/1-custom-instructions/.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Each path now has its own hands-on module that walks through the
'add a docstring requirement to copilot-instructions.md and watch the
output change' exercise from main, using the path's actual tool:

- vscode/2-custom-instructions.mdx (was a stub) — full Copilot Chat walkthrough
- cli/3-custom-instructions.mdx (new) — same exercise driven by Copilot CLI
- _partials/instructions-add-docstring.mdx — shared steps for the
  copilot-instructions.md edit, imported by both pages

CLI path is renumbered so install precedes the new hands-on:
  3-mcp -> 4-mcp, 4-generating-code -> 5-generating-code,
  5-agent-skills -> 6-agent-skills, 6-custom-agents -> 7-custom-agents,
  7-slash-commands -> 8-slash-commands, 8-review -> 9-review.

Sidebar, prev/next chains, and cross-path index tables updated to match.
Fixes vscode prev/next refs that the bulk renumber sed accidentally
shifted (vscode/3-mcp, 6-custom-agents are unchanged).

Build: 28 pages. Lychee: 0 errors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Each learning path now owns its own module 1 covering custom instructions:
- VS Code: read + update + see impact via Copilot Chat
- CLI: install (1) then read + update + see impact via copilot CLI (2)
- Cloud agent: read + update only (impact shown later in cloud agent PRs)

Removed the shared lesson at shared/1-custom-instructions.mdx since each
path's coverage differs slightly. The shared overview content is now in
_partials/instructions-overview.mdx, imported into each path's module 1.

The shared prerequisites lesson now branches into the three paths.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- cli/2-custom-instructions: stop deleting publishers.py between rounds.
  Round 2 now asks Copilot to update the existing file to match the new
  documentation conventions, and learners leave the file in place.
- cli/4-generating-code: remove the redundant 'Warm-up: see custom
  instructions in action' section. That demo now lives entirely in
  module 2, so the generating-code lesson goes straight into plan mode.
- cli/4-generating-code: add a security caution around
  copilot --allow-all-tools, sourced from the GitHub Copilot CLI docs
  on allowing/denying tool use.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace repeated 'return to your codespace / open terminal / run copilot'
preambles with a single <Aside type="tip"> callout at the top of each
lesson page. Three partials cover: basic CLI, allow-all CLI (with link
to the full warning in 4-generating-code.mdx), and VS Code Chat. CLI
callouts mention 'copilot --continue' for resuming the most recent
session in the current project.

Also dedupes a duplicate mode/model selection block in
vscode/3-agent-mode.mdx and moves the long --allow-all-tools caution in
cli/4-generating-code.mdx out of step 3 into a standalone caution above
the step list.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Previously placed at the top of each lesson page (in the conceptual
intro area), the Start a Copilot CLI/Chat callouts now sit immediately
under the heading of the first exercise where the learner actually
opens Copilot. This keeps the callout adjacent to where its
instructions are needed, instead of being separated from the action by
scenario, objectives, and concept sections.

Affected pages:
- vscode/2-mcp.mdx -> '### Examine the impact of custom instructions'
- cli/3-mcp.mdx -> '## Setting up the GitHub MCP server in Copilot CLI'
- cli/4-generating-code.mdx -> '## Utilize plan mode'
- cli/5-agent-skills.mdx -> '## Using the skill'
- cli/6-custom-agents.mdx -> '## Using a custom agent in Copilot CLI'
- cli/7-slash-commands.mdx -> '## Sharing a session'

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…upes

Partials now follow a category-prefix scheme so role-in-lesson is
visible at a glance:

- callout-* for Aside/Tip blocks
- section-* for top-level concept blocks
- exercise-* for mid-lesson step inserts

Filename pattern is <category>-<topic>.mdx; component symbols are
PascalCase of the topic portion only, keeping lesson source readable
(<StartCopilotCli />, <CloudAgentIntro />).

Renamed all 10 existing partials and updated imports across 15 lesson
files. While touching imports, also corrected two pre-existing
component-name drifts (CodingAgentIntro -> CloudAgentIntro,
SecurityCodingAgent -> CloudAgentSecurity) and made scenario-block
filenames self-describing (accessibility -> section-accessibility-scenario,
tech-debt -> section-tech-debt-scenarios).

New shared partials:

- callout-model-choice-caution.mdx — adopted in vscode/2-mcp and
  vscode/3-agent-mode (one-word 'lab' vs 'workshop' drift now fixed).
- section-mcp-overview.mdx — adopted in cli/3-mcp and vscode/2-mcp.
  Uses inline links so it's self-contained when imported. Diagram and
  agent-mode framing paragraph stay in vscode/2 (VS-Code-specific).

Bug cleanups found during review:

- vscode/2-mcp.mdx had 'Ensure your codespace is ready' twice (H3 at
  line 14 and H2 at line 124). Kept the H3 occurrence; removed the H2
  duplicate that ran after the learner had already done the steps.
- vscode/4-cloud-agent.mdx had '## Summary and next steps' twice.
  Removed the stray early summary heading and its single paragraph;
  kept the full summary section that follows.

Build clean (28 pages); lychee 1694/0.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
cloud/2-cloud-agent.mdx and vscode/4-cloud-agent.mdx were ~95%
identical (190 lines each, only 11 lines + frontmatter + ref paths
differed). Apply the same redirect-stub pattern already used for
custom-agents and managing-agents.

Changes:

- New shared/cloud-agent/cloud-agent.mdx: full lesson body taken from
  the cloud/2 version (the superset). Image and partial paths shifted
  one level deeper.
- The cloud-only 'Custom instructions in this repository' section is
  kept unconditionally, with a one-sentence softening so it reads for
  both audiences (vscode learners get a quick reinforcement;
  cloud learners get the same pointer they had before).
- 'Return to your path' footer at the end mirroring the existing
  shared modules.
- cloud/2-cloud-agent.mdx and vscode/4-cloud-agent.mdx are now
  ~15-line redirect stubs.

Pre-existing bug fix folded in: both source files had a duplicated
step 9 ('Select **Assign**.' appeared once before and once after the
eyes-emoji image in the second issue-assignment list). Dropped the
stray second occurrence in the shared body.

Build clean (29 pages); lychee 1709/0.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replaces the app-development Copilot configuration with a content-focused
playbook now that the Tailspin Toys application has been extracted to
github.com/github-samples/tailspin-toys.

- Rewrite .github/copilot-instructions.md as the content-author core:
  scope, repo structure, partials prefix conventions (callout-/section-/
  exercise-), shared-module redirect-stub pattern, link patterns,
  build + lychee verification, commit hygiene.
- Add scoped instruction files with applyTo frontmatter:
  - mdx.instructions.md (workshop MDX patterns)
  - markdown.instructions.md (no hard-wrap; GitHub admonitions)
  - partials.instructions.md (naming + self-contained refs)
  - astro.instructions.md (docs/ wrapper conventions)
- Delete .github/agents/accessibility.md (app-focused custom agent).
- Delete the seven app-targeted files in .github/instructions/
  (astro, flask-endpoint, playwright, python-tests, svelte,
  tailwindcss, ui).

Atomic with the deletes so no intermediate state still tells agents
to use the deleted Flask/Svelte/Tailwind guidance.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The Flask + Astro/Svelte demo application has been extracted to
github.com/github-samples/tailspin-toys. This repo is now a content-only
authoring repo for the workshop.

Removed:
- client/, server/, data/ — application source and SQLite seed
- scripts/{setup-env,start-app,run-server-tests}.sh — app dev scripts
- venv/, .venv-docs/ — local virtualenvs
- .devcontainer/, .vscode/ — app-targeted dev environment config
- .github/workflows/copilot-setup-steps.yml — app cloud-agent setup
- .github/workflows/run-tests.yml — app test workflow

Updated:
- .gitignore: pruned Python/Flask/SQLite/devcontainer entries; kept
  workshop-content/node_modules (still needed for the symlink that
  pages.yml creates so MDX outside docs/ can resolve Starlight imports).
- .github/dependabot.yml: rescoped from /client + devcontainers to /docs.

Only pages.yml remains under .github/workflows/ — the workshop site
deployment is unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Both READMEs were app-aware (mentions of client/, scripts/start-app.sh,
the Tailspin Toys app description). Refocus them on workshop content
authoring now that the application lives at github-samples/tailspin-toys.

- Root README: scope, repo structure, local dev (with the
  workshop-content/node_modules symlink step), verification commands,
  pointers to authoring instructions and the tailspin-toys app repo.
- docs/README: drop client/ cross-reference; describe docs/ as the
  thin Astro+Starlight wrapper around workshop-content/.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Imported from github/awesome-copilot@65b20ad.

Skills (.github/skills/):
- create-github-pull-request-from-specification — explicitly requested.
  Adds .github/pull_request_template.md (the skill expects one) tailored
  to this repo's verification flow (build target + lychee).
- publish-to-pages — full directory including companion scripts
  (convert-pdf.py, convert-pptx.py, publish.sh). Also adds a local
  README clarifying that this skill is for spinning up a *separate*
  Pages site (e.g., a slide deck), NOT the deployment for this repo's
  workshop site (that's pages.yml).
- conventional-commit — commit message hygiene.
- update-markdown-file-index — keeps file-index sections in markdown
  files in sync with their folders.

Agents (.github/agents/):
- se-technical-writer — technical writing assistant.
- technical-content-evaluator — A-grade content quality eval.
- markdown-accessibility-assistant — five GitHub a11y best practices.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ilspin-toys

The Tailspin Toys application learners build through has moved to
github.com/github-samples/tailspin-toys. Update workshop content to
point there instead of the (now content-only) agents-in-sdlc repo.

- shared/0-prereqs.mdx: 'Use this template' instructions now point at
  github-samples/tailspin-toys.
- _partials/section-instructions-overview.mdx: ui-instructions and
  astro-instructions ref definitions now point at the tailspin-toys
  copies of those files.
- vscode/3-agent-mode.mdx: same UI instructions URL update.

Verified: docs build still produces 29 pages; lychee link check
passes (1460 OK, 0 errors).

Note for maintainers: github-samples/tailspin-toys is currently
INTERNAL — it must be made public (or the workshop run inside the
github-samples org) before learners can fork it from the template.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds scripts/render-markdown.py — a stdlib-only Python renderer that
converts workshop-content/**/*.mdx into plain GitHub-flavored Markdown
under workshop/. Two-pass design separates partial-inlining (file-relative
context) from link rewriting (URL-relative to importer). Stack-based
<Aside> parser handles nesting; admonitions wrap every body line including
code-fence delimiters with '> '. Stub pages are detected structurally and
shared content is inlined with a synthesized prev/next footer. All
unresolved partials, components, links, and images hard-fail.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds the rendered workshop/ output: 27 lesson Markdown files + 4 path
README.md indexes + a copy of workshop-content/images/. Generated from
workshop-content/ by scripts/render-markdown.py. Marked as
linguist-generated via .gitattributes so it doesn't dominate language
stats or PR diffs.

Learners can now take the workshop directly on GitHub.com via
workshop/README.md without visiting the published Pages site or running
any tooling locally.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds .github/workflows/render-markdown.yml. On every PR that touches
workshop-content/, workshop/, the renderer, or the workflow itself:
re-runs scripts/render-markdown.py, fails on `git diff --exit-code
workshop/` if the committed output is stale, then runs lychee against
workshop/**/*.md as a second gate to catch broken-but-self-consistent
link rewrites.

Permissions: contents: read.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- README: top section now sends learners to workshop/README.md (the
  GitHub.com-readable view) alongside the published Pages site, with an
  explicit warning not to edit workshop/ by hand. Adds the render step
  to the pre-PR verification checklist.
- copilot-instructions.md: documents the render pipeline. When editing
  anything under workshop-content/, run `python scripts/render-markdown.py`
  and commit the resulting workshop/ changes in the same PR. CI rejects
  drift.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Flips the render-markdown workflow from a verify-on-PR gate to a generate-
on-main pattern.

- On pull_request: run the renderer as a hard-fail validation gate (catches
  missing partials, unresolved components, broken internal links, missing
  images), plus lychee on the rendered output. Does not commit.
- On push to main: regenerate workshop/ and commit any diff back to main as
  github-actions[bot] with [skip ci] in the message to avoid recursion.
  pages.yml watches workshop-content/** and docs/**, not workshop/**, so it
  also will not re-fire on the bot commit.

Authors no longer need to commit workshop/ alongside workshop-content/
edits — the bot owns that folder. The local renderer script
(scripts/render-markdown.py) remains for previewing if desired but running
it is optional.

If branch protection on main blocks bot pushes, options: configure bypass
for github-actions[bot], use a PAT with bypass, or switch to bot-PR
pattern. Will surface on first merge after this change.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ance

- Add AUTHORING.md as the author entry point: mental model, recipe-style
  step-by-steps for adding lessons / partials / images / edits, local
  preview, style essentials, CI expectations, troubleshooting.
- Rewrite CONTRIBUTING.md as a short pointer (drops Go / golangci-lint
  boilerplate inherited from a template repo).
- Fix astro.instructions.md: sidebar is manually maintained in
  astro.config.mjs, not auto-generated. Remove now-obsolete guidance
  about node_modules symlinks (next commit moves content into docs/).

Path references in these files describe the post-migration layout
(docs/src/content/docs/); the next commit makes that layout real.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Eliminates the workshop/ <-> workshop-content/ name collision at the
repo root and removes the workshop-content/node_modules symlink hack.
Lesson MDX now lives at Astro's standard content-collection location,
so packages resolve natively from docs/node_modules.

Mechanics:
- git mv workshop-content -> docs/src/content/docs
- content.config.ts: shorten loader base to 'src/content.docs'.
  Custom glob() loader is retained because Starlight's default
  docsLoader() only excludes underscore-prefixed *filenames*, not
  *directories*; without the custom loader, _partials/* would route
  as pages.
- astro.config.mjs: editLink.baseUrl -> .../edit/main/docs/. Starlight
  appends entry.filePath (project-rooted, e.g. src/content/docs/...),
  so the resulting edit URL is correct with no doubled segments.
- scripts/render-markdown.py: SOURCE_DIR + banner + docstrings +
  comments + error messages all updated.
- pages.yml: drop the now-impossible 'Link node_modules into
  workshop-content' step (parent dir no longer exists post-move).
  paths filter narrowed to docs/**.
- render-markdown.yml: paths filter -> docs/src/content/docs/**;
  bot commit message references the new path.
- copilot-instructions.md, partials.instructions.md,
  markdown.instructions.md, README.md, docs/README.md: all path
  references updated.
- .gitignore: drop workshop-content/node_modules entry (no symlink).
- workshop/: regenerated. Diff is banner-only (Source: line).

Verified:
- python scripts/render-markdown.py -> banner-only diff
- cd docs && npm run build -> 29 pages (no _partials routed)
- Edit-this-page link sample: .../edit/main/docs/src/content/docs/...
  (no doubled path segments)
- lychee --offline 'workshop/**/*.md' -> 195 OK / 0 errors

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Covers __pycache__/, compiled bytecode, pytest/mypy/ruff caches, and
common venv directories. The renderer script under scripts/ produces
__pycache__/ on every local run.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…practice

- cli/1-install-copilot-cli.mdx: title was 'Exercise 2' and the
  next-lesson sentence pointed to 'Exercise 3'. The CLI overview
  correctly lists this lesson as Exercise 1 and the next as Exercise 2.
  Renumber both. Workshop/ regenerated to match.
- partials.instructions.md: previous guidance said callout partials
  must NOT import Aside (host page imports it). Every existing
  callout-*.mdx contradicts this — they all import Aside themselves.
  Reverse the guidance to match practice: callout partials are
  self-contained and import their own Starlight components.

Both findings surfaced in Copilot's PR review on #140.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Pin lycheeverse/lychee-action from the floating @v2 tag to commit
  SHA 8646ba30535128ac92d33dfc9133794bfdd9b411 (v2.6.1) in both
  pages.yml and render-markdown.yml. Resolves CodeQL findings about
  unpinned third-party actions on PR #140.
- Split render-markdown.yml into a 'validate' job (contents: read,
  runs on every event) and a 'commit' job (contents: write, runs only
  on push to main, depends on validate). Previously the workflow
  granted contents: write at the workflow level, which also applied
  to PR runs even though those never push. Now PR runs execute with
  read-only contents permission, matching least-privilege guidance.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add a sync system that generates per-partial .d.ts declaration files
from frontmatter descriptions in docs/src/content/docs/_partials/.
This gives authors hover-style tooltips on partial imports in VS Code
and lets the renderer enforce that every partial is documented.

- scripts/_partials_lib.py: shared parser for partial frontmatter
- scripts/lint_partials.py: validates frontmatter conventions and
  flags missing imports/orphaned partials in the docs tree
- scripts/sync_partial_metadata.py: regenerates .d.ts files under
  docs/src/types/_partials/ from frontmatter descriptions
- .github/skills/sync-partial-metadata: workflow skill for authors
- render-markdown workflow runs lint as a hard-fail PR gate

Add description frontmatter to every existing partial, regenerate
declaration files, and document the workflow in AUTHORING.md plus
the partials/markdown instruction files. Mark generated .d.ts files
read-only via .vscode/settings.json so authors don't edit them
directly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
GeekTrainer and others added 17 commits June 30, 2026 13:45
Convert every lesson callout from Starlight ::: aside directives to GitHub
admonition syntax (> [!NOTE]) so the same callout syntax works in the repo's
READMEs, on github.com, and in the published site. A remark plugin
(remark-github-admonitions-to-directives, wired in astro.config.mjs) rewrites
the admonitions into Starlight asides at build time, mapping NOTE/IMPORTANT to
note, TIP to tip, and WARNING/CAUTION to caution.

GitHub syntax has no custom-title or nesting form, so the six nested
"Start a Copilot CLI session" tip/caution blocks are flattened into sibling
admonitions, and titled callouts use a bold lead-in line. Verified: clean
build (37 pages), 116 asides render with no literal markers leaked, Playwright
crawl of all 37 routes clean, lychee 0 errors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Update authoring guidance to reflect that lessons and repo docs now share one
callout syntax. markdown.instructions.md replaces the published-vs-repo split
with a single GitHub-admonition section documenting the Starlight mapping, the
bold-lead-in pattern for titles, and the no-nesting / blank-line-between-callouts
rules. Mirror the change in copilot-instructions.md, AUTHORING.md style
essentials, instructions.instructions.md example, and the validate-site
Playwright skill's literal-marker check.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the GitHub Copilot app lesson content with the revised version from
the copilot-app-markdown branch, ported into the Starlight structure. Applies
the copy edits from PR review (Ctl->Ctrl, "followed by creating", plural
possessive "Tailspin Toys'", missing "to", "select add" reword, and
consecutive list renumbering) and revises the file-exploration and terminal
workflow in lessons 2-4 to use the app's review panel.

Image paths and cross-lesson links are rewritten for the site: images/ ->
../_images/, N-name.md -> ../N-name/ routes, and the cross-harness links in
lesson 8 to relative site routes so they build and pass the offline link check.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add app-show-folder-view.png and app-terminal-screenshot.png (prefixed to
match the harness image convention) for the revised review-panel file and
terminal steps in lessons 2-4.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Trim the unsupported "with static-Astro constraints" phrase from the
lesson 4 "you learned" recap so it matches the "you will" list and the
lesson body, which only cover planning with Plan mode and building with
Autopilot.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
Extend the Starlight content schema with an optional `authors` field and
stamp `authors: geektrainer` plus a git-derived `lastUpdated` date onto all
36 routable lessons and index pages. This pre-stages the metadata the
awesome-copilot Learning Hub mirror expects and surfaces a per-page
"Last updated" footer on the site.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
Remove the three remaining placeholder images and their references. They
were stand-ins that added no clarity to the MCP setup and automation steps
while adding to the repo size; the surrounding prose already describes each
step fully.

- vscode/3-mcp.md, cli/4-mcp.md: drop the Playwright MCP config placeholders
- app/8-review.md: drop the New automation dialog placeholder

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…website/

Restructure to a content-first layout: lessons now live as plain Markdown at
the repo root under docs/ (browsable directly on github.com, no build), and the
Astro + Starlight project moves to a sibling website/ folder as an optional
publisher. The content loader sources lessons via base: '../docs', and the
landing page (docs/README.md) maps to the site home via slug: index.

- Relocate app/cli/vscode/cloud lessons, 5 locale trees, and _images/ from
  docs/src/content/docs/** up to docs/**.
- Move Astro tooling (astro.config.mjs, package.json, public/, src/pages/,
  content.config.ts, tsconfig.json, .gitignore) into website/.
- Update CI (pages.yml), dependabot, .vscode, .gitignore, instruction files,
  skills, and the content-alignment workflow to the new paths.
- Remove dead MDX-era components.

Build verified: 217 workshop pages, translations render, lychee 0 errors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
The [awesome-copilot] and [awesome-copilot-canvases] reference links pointed
at non-existent paths (awesome-copilot.github.com/github and /canvases, both
404). Point them at the real collection: the site root for the general
"awesome-copilot" reference and /extensions/ for canvases (which ship as
canvas extensions). Applied across the English lessons and all five locale
translations (es-es, ja-jp, ko-kr, pt-br, zh-cn).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
github.com auto-renders a folder's README.md when browsing into it, but not
index.md — so with the content-first layout the harness and locale folders
showed a bare file list instead of their landing page. Rename every folder
landing from index.md to README.md and add an explicit slug: to each so
Starlight keeps routing it to the same URL (the site already used this
mechanism for the root docs/README.md via slug: index).

- docs/<harness>/README.md → slug: <harness>
- docs/<locale>/README.md → slug: <locale>
- docs/<locale>/<harness>/README.md → slug: <locale>/<harness>

Update the authoring docs, copilot-instructions, astro instructions, and the
localizations skill to document the README-landing + slug convention
(including that localized landings must use locale-prefixed slugs).

Build verified: 217 workshop pages, routes preserved, translations render.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
Update the human-facing name across content and repo docs: the site title,
the landing-page H1 (English + all five locales, now the brand name with the
SDLC descriptor dropped), the root README, AUTHORING, CONTRIBUTING,
copilot-instructions, the content-alignment workflow prose, and the three
skill descriptions.

The repo URL slug (agents-in-sdlc) is intentionally left unchanged — the base
path, GitHub Pages URL, edit links, clone URLs, CI symlink, and npm package
name still resolve until the repository itself is renamed.

Build verified: 217 pages, titles updated, translations render, lychee 0 errors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
The site name is "Copilot Workshops", which made the home page <title> read
"Copilot Workshops | Copilot Workshops". Give the landing page its own H1 —
"Hands-on with GitHub Copilot's agents" — so the title is distinct and
descriptive. Localized taglines added for all five locales (GitHub Copilot
kept untranslated as the brand name).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
The site shell moved to website/ in the content-first restructure; update the
"Type of change" bullet to match.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
Copilot AI review requested due to automatic review settings July 15, 2026 18:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Revamps the repository into Copilot Workshops: a content-first, multi-harness workshop with lessons as browsable pure Markdown under docs/, published via a new Astro + Starlight site isolated in website/, plus localization additions and repo housekeeping to support the new structure.

Changes:

  • Migrates workshop content to docs/** (new harness structure + localized content) and removes the legacy workshop-content/** tree.
  • Introduces website/ (Astro + Starlight) as the optional publisher sourcing from docs/, including a legacy redirect page and build tooling.
  • Removes the old Tailspin Toys demo app code (client/, server/, scripts/tests) and replaces CI with a Pages build + offline link-check workflow.
Show a summary per file
File Description
workshop-content/README.md Removes legacy workshop landing page (content moved to docs/).
workshop-content/5-custom-agents.md Removes legacy lesson (replaced by new harness content under docs/).
workshop-content/0-prereqs.md Removes legacy prerequisites lesson (now per-harness).
website/tsconfig.json Adds strict Astro TS config for the publishing site.
website/src/pages/shared/0-prereqs.astro Adds legacy URL redirect page (full HTML doc) to preserve old bookmarks.
website/src/content.config.ts Adds custom content collection loader sourcing ../docs and excluding _*/ assets.
website/README.md Documents local dev/build/deploy for the publisher project.
website/public/favicon.svg Adds site favicon for the publisher.
website/package.json Adds Astro + Starlight dependencies and scripts for the publisher.
website/.gitignore Ignores publisher build output and Node artifacts.
server/utils/seed_database.py Removes legacy Flask seed script (server removed from this repo).
server/utils/seed_data/games.csv Removes legacy seed data (server removed).
server/utils/database.py Removes legacy DB helper (server removed).
server/utils/init.py Removes legacy server utils package marker.
server/tests/test_models.py Removes legacy model tests (server removed).
server/tests/init.py Removes legacy tests package marker.
server/routes/games.py Removes legacy API routes (server removed).
server/routes/init.py Removes legacy routes package marker.
server/requirements.txt Removes legacy Python requirements (server removed).
server/models/publisher.py Removes legacy SQLAlchemy model (server removed).
server/models/game.py Removes legacy SQLAlchemy model (server removed).
server/models/category.py Removes legacy SQLAlchemy model (server removed).
server/models/base.py Removes legacy model base (server removed).
server/models/init.py Removes legacy model package initialization.
server/app.py Removes legacy Flask app entrypoint.
server/init.py Removes legacy server package marker.
scripts/start-app.sh Removes legacy start script (app removed).
scripts/setup-env.sh Removes legacy env bootstrap script (app removed).
scripts/run-server-tests.sh Removes legacy server test runner script.
README.md Replaces repo README to reflect Copilot Workshops content + new structure.
docs/zh-cn/README.md Adds Simplified Chinese landing page (localized workshop overview).
docs/zh-cn/app/README.md Adds Simplified Chinese Copilot app harness landing page.
docs/zh-cn/app/6-agent-merge.md Adds localized Agent Merge lesson.
docs/zh-cn/app/0-prerequisites.md Adds localized prerequisites for the app harness.
docs/vscode/README.md Adds VS Code harness landing page.
docs/vscode/images/.gitkeep Keeps images dir tracked for VS Code harness.
docs/vscode/5-managing-agents.md Adds VS Code harness lesson: managing agents.
docs/vscode/0-prerequisites.md Adds VS Code harness prerequisites lesson.
docs/README.md Adds main workshop landing page (site home via slug: index).
docs/pt-br/README.md Adds Brazilian Portuguese landing page.
docs/pt-br/app/README.md Adds Brazilian Portuguese app harness landing page.
docs/pt-br/app/6-agent-merge.md Adds localized Agent Merge lesson.
docs/pt-br/app/0-prerequisites.md Adds localized prerequisites for the app harness.
docs/ko-kr/README.md Adds Korean landing page.
docs/ko-kr/app/README.md Adds Korean app harness landing page.
docs/ko-kr/app/6-agent-merge.md Adds localized Agent Merge lesson.
docs/ko-kr/app/0-prerequisites.md Adds localized prerequisites for the app harness.
docs/ja-jp/README.md Adds Japanese landing page.
docs/ja-jp/app/README.md Adds Japanese app harness landing page.
docs/es-es/README.md Adds Spanish landing page.
docs/es-es/app/README.md Adds Spanish app harness landing page.
docs/es-es/app/6-agent-merge.md Adds localized Agent Merge lesson.
docs/es-es/app/0-prerequisites.md Adds localized prerequisites for the app harness.
docs/cloud/README.md Adds Copilot cloud agent harness landing page.
docs/cloud/images/.gitkeep Keeps images dir tracked for cloud harness.
docs/cloud/0-prerequisites.md Adds cloud harness prerequisites lesson.
docs/cli/README.md Adds Copilot CLI harness landing page.
docs/cli/images/.gitkeep Keeps images dir tracked for CLI harness.
docs/cli/8-review.md Adds CLI harness review/next steps lesson.
docs/cli/0-prerequisites.md Adds CLI harness prerequisites lesson.
docs/app/README.md Adds Copilot app harness landing page (English).
docs/app/8-review.md Adds app harness review/next steps lesson.
docs/app/6-agent-merge.md Adds app harness Agent Merge lesson.
docs/app/5-mcp-playwright.md Adds app harness Playwright MCP lesson.
docs/app/0-prerequisites.md Adds app harness prerequisites lesson.
CONTRIBUTING.md Updates contribution guide for new content + CI expectations.
client/tsconfig.json Removes legacy app TS config (client removed).
client/svelte.config.js Removes legacy Svelte config (client removed).
client/src/styles/global.css Removes legacy Tailwind import (client removed).
client/src/pages/index.astro Removes legacy app page (client removed).
client/src/pages/game/[id].astro Removes legacy dynamic page (client removed).
client/src/pages/about.astro Removes legacy about page (client removed).
client/src/middleware.ts Removes legacy API proxy middleware (client removed).
client/src/layouts/Layout.astro Removes legacy app layout (client removed).
client/src/components/LoadingSkeleton.svelte Removes legacy UI component (client removed).
client/src/components/Header.astro Removes legacy header component (client removed).
client/src/components/GameList.svelte Removes legacy UI component (client removed).
client/src/components/GameCard.svelte Removes legacy UI component (client removed).
client/src/components/ErrorMessage.svelte Removes legacy UI component (client removed).
client/src/components/EmptyState.svelte Removes legacy UI component (client removed).
client/src/assets/background.svg Removes legacy asset (client removed).
client/README.md Removes legacy Astro starter README.
client/public/favicon.svg Removes legacy favicon (client removed).
client/playwright.config.ts Removes legacy Playwright config (client removed).
client/package.json Removes legacy app package manifest (client removed).
client/e2e-tests/home.spec.ts Removes legacy e2e tests (client removed).
client/e2e-tests/games.spec.ts Removes legacy e2e tests (client removed).
client/Dockerfile Removes legacy container build file (client removed).
client/astro.config.mjs Removes legacy Astro config (client removed).
client/.gitignore Removes legacy client gitignore.
client/.dockerignore Removes legacy dockerignore.
.vscode/settings.json Updates editor settings for the new website/ TS SDK usage.
.vscode/mcp.json Removes legacy VS Code MCP config file.
.vscode/extensions.json Adds extension recommendations (MDX tooling).
.vscode/.copilotignore Removes legacy Copilot ignore rule for old content tree.
.mcp.json Adds repo-level MCP server config (Playwright).
.gitignore Updates ignore rules for new website/ build artifacts and tooling caches.
.github/workflows/run-tests.yml Removes legacy backend/frontend test workflow (app removed).
.github/workflows/pages.yml Adds new GitHub Pages build+deploy workflow for website/ and offline lychee checks.
.github/workflows/copilot-setup-steps.yml Removes legacy Copilot setup workflow (old app deps).
.github/workflows/content-alignment.md Adds Copilot-driven advisory workflow for cross-lesson content drift detection.
.github/skills/update-markdown-file-index/SKILL.md Adds skill to generate/update file indexes in Markdown.
.github/skills/README.md Adds skills index documenting repo skills and when to use them.
.github/skills/publish-to-pages/scripts/publish.sh Adds publish-to-pages helper script for external artifacts (not this repo’s site).
.github/skills/publish-to-pages/README.md Documents publish-to-pages scope vs this repo’s Pages workflow.
.github/skills/make-repo-contribution/assets/pr-template.md Adds reusable PR template asset for the contribution skill.
.github/skills/make-repo-contribution/assets/issue-template.md Adds reusable issue template asset for the contribution skill.
.github/pull_request_template.md Adds PR template emphasizing build + link-check verification.
.github/instructions/ui.instructions.md Removes legacy UI/app instruction file (app moved out).
.github/instructions/tailwindcss.instructions.md Removes legacy Tailwind instruction file (app moved out).
.github/instructions/svelte.instructions.md Removes legacy Svelte instruction file (app moved out).
.github/instructions/python-tests.instructions.md Removes legacy Python testing instruction file (server removed).
.github/instructions/playwright.instructions.md Removes legacy Playwright test instruction file (client removed).
.github/instructions/instructions.instructions.md Adds guidance for authoring/maintaining instruction files in this content repo.
.github/instructions/flask-endpoint.instructions.md Removes legacy Flask endpoint instruction file (server removed).
.github/instructions/astro.instructions.md Updates Astro instructions to match the new website/ publisher conventions.
.github/dependabot.yml Retargets dependabot updates from /client to /website.
.github/aw/actions-lock.json Adds locked-action metadata for action version pinning.
.gitattributes Marks workflow lockfiles as generated and enforces merge strategy for them.
.devcontainer/devcontainer.json Removes legacy devcontainer definition (old app tooling).

Review details

  • Files reviewed: 161/265 changed files
  • Comments generated: 6
  • Review effort level: Low

Comment thread docs/cli/8-review.md Outdated
Comment thread docs/app/6-agent-merge.md Outdated
Comment thread docs/app/5-mcp-playwright.md Outdated
Comment thread website/tsconfig.json Outdated
Comment thread website/package.json
Comment thread .mcp.json
Comment on lines +3 to +8
"playwright": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@playwright/mcp@latest"],
"tools": ["*"]
}
GeekTrainer and others added 3 commits July 15, 2026 11:53
Drop the path filters so the build + link check reports on every PR,
making it usable as a required status check for a branch ruleset.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
- cli/8-review: 'uses cases' -> 'use cases'
- app/6-agent-merge: 'ran tests' -> 'run tests'
- app/5-mcp-playwright: 'require' -> 'requires', 'end to end' -> 'end-to-end'
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
- Pin @playwright/mcp to 0.0.78 instead of @latest for a deterministic,
  supply-chain-safer MCP server version.
- Remove the @mdx-js/typescript-plugin devDependency and tsconfig plugin
  entry; the workshop is pure Markdown with no .mdx files (Starlight's own
  MDX support remains transitive and untouched).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 64357866-3a3f-4fd8-914b-77826de5be5a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants