Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/instructions/astro.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ This is a docs wrapper. Don't add interactive framework islands (Svelte, React,

## Building and verifying

After changing `astro.config.mjs` or anything under `website/src/`, build and verify the site with the [`build-and-verify-docs`](../skills/build-and-verify-docs/SKILL.md) skill. Its page-count invariant is the tripwire for unexpected routed pages: Starlight emits each of the 36 workshop routes for the root language and five configured locales, then adds the legacy redirect, for 217 built `index.html` pages excluding the 404 page. If the count changes without a corresponding route or locale change, check the locale layout under `docs/` and the underscore-directory exclude in `src/content.config.ts`.
After changing `astro.config.mjs` or anything under `website/src/`, build and verify the site with the [`build-and-verify-docs`](../skills/build-and-verify-docs/SKILL.md) skill. Its page-count invariant is the tripwire for unexpected routed pages: Starlight emits each of the 40 workshop routes for the root language and five configured locales, then adds the legacy redirect, for 241 built `index.html` pages excluding the 404 page. If the count changes without a corresponding route or locale change, check the locale layout under `docs/` and the underscore-directory exclude in `src/content.config.ts`.
2 changes: 1 addition & 1 deletion .github/instructions/markdown.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ Use Markdown image syntax with paths relative to the Markdown file:

## Path conventions

- Per-path lessons: `cli/`, `vscode/`, `cloud/`, `app/`. Files are numbered by lesson order: `1-installing.md`, `2-custom-instructions.md`, etc.
- Per-path lessons: `cli/`, `vscode/`, `cloud/`, `app/`. Files are numbered by lesson order: `1-install-copilot-cli.md`, `3-custom-instructions.md`, etc.
- Support images live in `_images/` directories and are excluded from routing by `website/src/content.config.ts`.

## Cross-repo links
Expand Down
7 changes: 3 additions & 4 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,10 @@

## Verification

<!-- Confirm the build + link checks pass before requesting review. -->
<!-- Confirm type, build, and link checks pass before requesting review. -->

- [ ] `cd website && rm -rf dist && npm run build` succeeds (target: 36 routes × 6 locales + 1 redirect = 217 built pages excluding 404; build reports 218 HTML files including 404, or note any intentional change)
- [ ] Lychee link check passes:
`mkdir -p /tmp/lychee-root && ln -sfn $PWD/website/dist /tmp/lychee-root/copilot-workshops && lychee --offline --no-progress --root-dir /tmp/lychee-root 'website/dist/**/*.html'`
- [ ] `cd website && npm run check:all && rm -rf dist && npm run build` succeeds (target: 40 routes × 6 locales + 1 redirect = 241 built pages excluding 404; build reports 242 HTML files including 404, or note any intentional change)
- [ ] Lychee link check passes: `mkdir -p /tmp/lychee-root && ln -sfn $PWD/website/dist /tmp/lychee-root/copilot-workshops && lychee --offline --no-progress --root-dir /tmp/lychee-root 'website/dist/**/*.html'`
- [ ] External GitHub URLs that I changed have been clicked manually (lychee runs offline)

## Screenshots
Expand Down
17 changes: 9 additions & 8 deletions .github/skills/build-and-verify-docs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ Open <http://localhost:4321/copilot-workshops/>. Lesson content lives in the rep

Run all three. Don't commit if any fails.

### 1. Build (clean)
### 1. Type-check and build (clean)

```bash
cd website && rm -rf dist && npm run build
cd website && npm run check:all && rm -rf dist && npm run build
```

### 2. Page-count invariant

The workshop has 36 distinct route slugs. Starlight emits each route for the English root locale and the five configured localized routes, using English fallback content when a translation is unavailable. The built site therefore contains $36 \times 6 = 216$ workshop routes plus the one legacy redirect (`/shared/0-prereqs/`, authored as a full-HTML redirect page at `website/src/pages/shared/0-prereqs.astro`). The expected count is 217 `index.html` files when excluding the 404 page. Astro reports 218 HTML files because it includes the 404 page.
The workshop has 40 distinct route slugs. Starlight emits each route for the English root locale and the five configured localized routes, using English fallback content when a translation is unavailable. The built site therefore contains $40 \times 6 = 240$ workshop routes plus the one legacy redirect (`/shared/0-prereqs/`, authored as a full-HTML redirect page at `website/src/pages/shared/0-prereqs.astro`). The expected count is 241 `index.html` files when excluding the 404 page. Astro reports 242 HTML files because it includes the 404 page.

```bash
# distinct route slugs in the English root locale (docs/README.md + docs/<harness>/*.md)
Expand All @@ -61,14 +61,14 @@ find website/dist -name index.html | grep -v 404 | wc -l

### 2b. Translations actually render (not silent English fallback)

The build and the page-count above are **blind to which content actually renders** — a mis-nested or wrongly-identified locale tree still emits 217 pages served from English fallback. Assert that a known translated page carries translated text and the right `lang` attribute:
The build and the page-count above are **blind to which content actually renders** — a mis-nested or wrongly-identified locale tree still emits 241 pages served from English fallback. Assert that a known translated page carries translated text and the right `lang` attribute:

```bash
grep -o '<title>[^<]*</title>' website/dist/es-es/app/2-add-star-rating/index.html # Spanish title
grep -o 'lang="[^"]*"' website/dist/es-es/app/2-add-star-rating/index.html | head -1 # lang="es-ES"
```

The Spanish title should read `Lección 2 - Ejecutar tu primera sesión de agente`, not the English string. Spot-check a second locale (e.g. `ja-jp` -> `lang="ja-JP"`).
The Spanish title should match the translated `title` in `docs/es-es/app/2-add-star-rating.md`, not the English string. Check the changed CLI pages as well, and spot-check another locale (e.g. `ja-jp` -> `lang="ja-JP"`).

### 3. Link check (lychee, offline)

Expand All @@ -86,8 +86,9 @@ Lychee runs offline and won't catch broken **external** GitHub URLs. When you ch
`.github/workflows/pages.yml` runs on PRs and on push to `main`. It runs **only**:

1. `npm ci`
2. `npm run build` (Astro build) — must succeed
3. lychee offline link check against `website/dist/` — must pass
2. `npm run check:all` (Astro and TypeScript checks) — must succeed
3. `npm run build` (Astro build) — must succeed
4. lychee offline link check against `website/dist/` — must pass

After a push to `main`, `pages.yml` deploys `website/dist` to GitHub Pages. Browser validation and content-alignment analysis are separate optional/safety-net workflows, not part of the Pages build job.

Expand All @@ -109,7 +110,7 @@ When in doubt, `grep -rn "<old-name>" --include='*.md' .` (excluding `node_modul

```bash
# from repo root
cd website && rm -rf dist && npm run build && cd ..
cd website && npm run check:all && rm -rf dist && npm run build && cd ..
mkdir -p /tmp/lychee-root && ln -sfn "$PWD/website/dist" /tmp/lychee-root/copilot-workshops \
&& lychee --offline --no-progress --root-dir /tmp/lychee-root 'website/dist/**/*.html'
```
4 changes: 2 additions & 2 deletions .github/skills/check-content-alignment/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ There are three recurring kinds of duplication in this repo. Most alignment gaps
- The "**Approve and run workflows**" step (appears in `cloud/5-iterating.md` and `vscode/6-iterating.md`).
- Shared prerequisites, MCP-setup, and recap blurbs.
2. **Parallel concepts across harnesses.** The same idea is taught up to four times, once per harness: `cli/`, `vscode/`, `app/`, and `cloud/`. A conceptual change (how MCP works, what a custom instruction is, how an agent proposes changes, the description of the Tailspin Toys demo app) often needs the same correction in the sibling lessons of the other harnesses.
3. **Cross-references and shared facts.** Reference-style links to a renamed/retitled lesson, lesson numbers in prose, the published URL shape (`/cli/3-generating-code/`), the demo-app repo URL (`github.com/github-samples/tailspin-toys/...`), tool/library names, and screenshots referenced from multiple pages.
3. **Cross-references and shared facts.** Reference-style links to a renamed/retitled lesson, lesson numbers in prose, the published URL shape (`/cli/4-build-filtering/`), the demo-app repo URL (`github.com/github-samples/tailspin-toys/...`), tool/library names, and screenshots referenced from multiple pages.

## Procedure

Expand Down Expand Up @@ -69,7 +69,7 @@ grep -rn "Approve and run workflows" docs --include='*.md'
grep -rln "custom instruction" docs/cli docs/vscode docs/app docs/cloud --include='*.md'

# Find cross-references to a page you renamed/retitled
grep -rn "2-custom-instructions" docs --include='*.md'
grep -rn "4-build-filtering" docs --include='*.md'
```

Exclude the file(s) you already changed from the candidate list.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Build and deploy workshop site

# Builds the Astro + Starlight site under `website/` (sourcing lesson Markdown from
# `docs/`) and deploys to GitHub Pages on pushes to main. Every push and pull
# request runs a build-only validation pass plus a link check, so the build can
# request runs type-check, build, and offline link validation, so this job can
# serve as a required status check on any PR.

on:
Expand Down
20 changes: 10 additions & 10 deletions AUTHORING.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ copilot-workshops/
│ ├── cli/ ← Copilot CLI lessons (0-prerequisites.md + numbered exercises)
│ ├── vscode/ ← VS Code lessons (0-prerequisites.md + numbered exercises)
│ ├── cloud/ ← Cloud agent lessons (0-prerequisites.md + numbered exercises)
│ ├── app/ ← GitHub Copilot app lessons (setup folded into Exercise 1)
│ ├── es-es/ ja-jp/ ... ← Translated locale trees (currently the app harness)
│ ├── app/ ← GitHub Copilot app lessons (setup 0–1, core modules 2–10)
│ ├── es-es/ ja-jp/ ... ← Translated App and CLI locale trees
│ └── _images/ ← Screenshots and diagrams (shared across locales)
├── website/ ← Optional Astro + Starlight publisher
│ ├── astro.config.mjs ← Site URL, base path, locales, sidebar
Expand All @@ -31,7 +31,7 @@ copilot-workshops/

### Add a new lesson

1. **Pick a path and number.** Lessons live under `docs/{cli,vscode,app,cloud}/N-name.md`. `N` is the next available integer in that path; the number drives the URL slug (`/cli/3-generating-code/`).
1. **Pick a path and number.** Lessons live under `docs/{cli,vscode,app,cloud}/N-name.md`. `N` is the next available integer in that path; the number drives the URL slug (`/cli/4-build-filtering/`).
2. **Create the file** with frontmatter:
```markdown
---
Expand All @@ -44,8 +44,8 @@ copilot-workshops/
3. **Write the body.** Use Markdown and GitHub admonition syntax (`> [!NOTE]`) for callouts. See **Style essentials** below.
4. **Add prev/next navigation.** Define `[previous-lesson]` and `[next-lesson]` reference links at the bottom of the page, pointing at the adjacent lessons in the same path:
```markdown
[previous-lesson]: ../2-custom-instructions/
[next-lesson]: ../4-mcp/
[previous-lesson]: ../3-custom-instructions/
[next-lesson]: ../5-agent-skills/
```
Then surface them in the body using **the same style as the other lessons in your path** — don't mix styles within a path:
- **Woven into prose** (common in the CLI path): end the lesson with a sentence like ``the next step is to [create the PR][next-lesson]``.
Expand All @@ -60,7 +60,7 @@ copilot-workshops/
```
The first lesson in a path omits `[previous-lesson]`; the last omits `[next-lesson]`.
5. **Register in the sidebar.** Open `website/astro.config.mjs` and add an entry to the appropriate `items: []` block. The sidebar is *manually* maintained — order in the file is the order learners see.
6. **Preview and verify, then open a PR.** Preview locally and run the verification sequence before committing — see [Building and verifying](#building-and-verifying) below. CI runs the Astro build and the lychee link check; both must pass.
6. **Preview and verify, then open a PR.** Preview locally and run the verification sequence before committing — see [Building and verifying](#building-and-verifying) below. CI runs type checks, the Astro build, and the lychee link check; all must pass.

### Landing pages (folder `README.md`)

Expand All @@ -85,7 +85,7 @@ When you add a new harness or locale landing, name it `README.md` and set its `s

### Edit an existing lesson

1. **Find the file** under `docs/` (use the published URL as a hint — `/cli/3-generating-code/` lives at `docs/cli/3-generating-code.md`).
1. **Find the file** under `docs/` (use the published URL as a hint — `/cli/4-build-filtering/` lives at `docs/cli/4-build-filtering.md`).
2. **Edit the Markdown.** Same conventions apply — see **Style essentials** below.
3. **Preview** with `npm run dev` in `website/`.
4. **Commit, PR, merge.**
Expand All @@ -112,11 +112,11 @@ The site runs at <http://localhost:4321/copilot-workshops/>.

**Verify** before committing:

1. **Build** — `cd website && rm -rf dist && npm run build`. Must succeed.
2. **Page-count invariant** — Starlight emits 36 workshop routes for English and each of the five configured locales, then adds the legacy redirect. This equals 217 built `index.html` pages when excluding the 404 page; the build reports 218 HTML files including the 404 page.
1. **Type-check and build** — `cd website && npm run check:all && rm -rf dist && npm run build`. Must succeed.
2. **Page-count invariant** — Starlight emits 40 workshop routes for English and each of the five configured locales, then adds the legacy redirect. This equals 241 built `index.html` pages when excluding the 404 page; the build reports 242 HTML files including the 404 page.
3. **Link check** — lychee (offline) against the built `website/dist/`. Catches broken internal links/images.

**What CI enforces vs. what you run locally:** CI (`pages.yml`) runs the **build** and the **lychee** link check on every PR. It does not run browser validation or the content-alignment agentic workflow as part of the Pages build job. After merge to `main`, `pages.yml` deploys the site to GitHub Pages.
**What CI enforces vs. what you run locally:** CI (`pages.yml`) runs **`check:all`**, the **build**, and the **lychee** link check on every PR. It does not run browser validation or the content-alignment agentic workflow as part of the Pages build job. After merge to `main`, `pages.yml` deploys the site to GitHub Pages.

**Consistency pass.** When a change renames a file or folder, adds or removes a skill or instruction file, touches duplicated prose, or changes how the build works, also sweep for stale references — the structure trees and cross-doc pointers in `README.md`, `AUTHORING.md`, and `.github/copilot-instructions.md` aren't checked by the Astro build. The [`build-and-verify-docs`](./.github/skills/build-and-verify-docs/SKILL.md) skill has the full checklist, and the `check-content-alignment` skill plus `.github/workflows/content-alignment.md` help catch prose that needs aligned updates.

Expand Down
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ If you want to **author or edit content**, start with [`AUTHORING.md`](./AUTHORI

CI (`pages.yml`) must be green on your PR. It runs:

- **Type checks** — `npm run check:all` (Astro and TypeScript checks).
- **`pages.yml` build** — `npm run build` (Astro site build).
- **Lychee** — offline link check of the built `website/dist/`.

Before you push, run the full local verification sequence described in [AUTHORING.md → Building and verifying](./AUTHORING.md#building-and-verifying): clean build, page-count check, and lychee link check.
Before you push, run the full local verification sequence described in [AUTHORING.md → Building and verifying](./AUTHORING.md#building-and-verifying): type checks, clean build, page-count check, and lychee link check.

## Commit messages

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ For PR/CI rules, see **[CONTRIBUTING.md](./CONTRIBUTING.md)**.
- **`docs/`** — **Lesson source (plain Markdown). Edit here.** Browsable directly on github.com, no build required.
- `README.md` — Workshop landing page (also the published site's home via `slug: index`).
- `cli/`, `vscode/`, `cloud/`, `app/` — Per-harness lessons (Copilot CLI / VS Code / cloud agent / GitHub Copilot app). Each codespace-based harness opens with its own `0-prerequisites.md` setup lesson, and a folder `README.md` (routed via a `slug:` matching the folder) is its landing page.
- `es-es/`, `ja-jp/`, `ko-kr/`, `pt-br/`, `zh-cn/` — Translated locale trees (currently the app harness).
- `es-es/`, `ja-jp/`, `ko-kr/`, `pt-br/`, `zh-cn/` — Translated App and CLI locale trees.
- `_images/` — Screenshots and diagrams (shared across all locales).
- **`website/`** — Optional Astro + Starlight site that publishes `docs/` to GitHub Pages. Only needed to self-host or preview the rendered site.
- `astro.config.mjs` — Site URL, base path, `locales` block, sidebar.
Expand All @@ -49,7 +49,7 @@ The site runs at <http://localhost:4321/copilot-workshops/>.

## Verification

Before opening a PR, build the site and run the full verification sequence — clean build, page-count check, and offline link check (lychee). The canonical commands live in **[AUTHORING.md → Building and verifying](./AUTHORING.md#building-and-verifying)** and the [`build-and-verify-docs`](./.github/skills/build-and-verify-docs/SKILL.md) skill. CI (`pages.yml`) runs the build and the lychee link check.
Before opening a PR, run the full verification sequence — type checks, clean build, page-count check, and offline link check (lychee). The canonical commands live in **[AUTHORING.md → Building and verifying](./AUTHORING.md#building-and-verifying)** and the [`build-and-verify-docs`](./.github/skills/build-and-verify-docs/SKILL.md) skill. CI (`pages.yml`) runs `check:all`, the build, and the lychee link check.

## License

Expand Down
6 changes: 3 additions & 3 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Hands-on with GitHub Copilot's agents"
slug: index
authors:
- geektrainer
lastUpdated: 2026-06-30
lastUpdated: 2026-09-11
---

The recent additions to the capabilities of GitHub Copilot provide powerful tools to the developer across the entire software development lifecycle (SDLC). This includes working with issues and pull requests on GitHub, interacting with external services, and of course code creation. This lab explores the functionality, providing real-world use cases and tips on how to get the most out of the tools.
Expand All @@ -23,11 +23,11 @@ GitHub Copilot inside **Visual Studio Code** and GitHub Codespaces. Work with Co

### 💻 [Copilot CLI](cli/)

**GitHub Copilot CLI** — an agentic assistant that runs in your terminal. Install it, connect MCP servers, generate code with plan mode, and build your own skills, custom agents, and slash commands, all from the command line.
**GitHub Copilot CLI** — an agentic assistant that runs in your terminal. After setup, follow nine core modules: ship a star-rating quick win, establish instructions, plan and build filtering, create a quality-checks skill, validate through Playwright MCP, create a QA agent, and merge the feature. Finish with CLI controls and a wrap-up. The flow has three pull-request milestones.

### 🤖 [Copilot App](app/)

The **GitHub Copilot app** — a desktop application built on Copilot CLI. Run parallel agent sessions, switch session modes, collaborate on canvases, and manage GitHub issues and pull requests natively — including **Agent Merge**, which shepherds a pull request through rebases, review feedback, CI fixes, and merge.
The **GitHub Copilot app** — a desktop application built on Copilot CLI. Follow the same setup and nine core modules through the star-rating, instructions, filtering, skill, MCP, QA, and feature-PR workflow, using the app's isolated sessions and **Agent Merge**. Create and merge a repository-backed canvas as the fourth pull-request milestone, then wrap up.

### ☁️ [Copilot Cloud Agent](cloud/)

Expand Down
Loading
Loading