diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 8e1206c..26fc17f 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -31,7 +31,7 @@ body: attributes: label: What happened? description: Describe the issue clearly. If a step, prompt, or command didn't work as described, include the exact text you used. - placeholder: "When I submitted the prompt from the 'Start a Session from an Issue' exercise, I got..." + placeholder: "When I submitted the prompt from the 'Start a Session from a Branch and Attach an Issue' exercise, I got..." validations: required: true diff --git a/.github/scripts/setup-training-scenarios.js b/.github/scripts/setup-training-scenarios.js index 9884a40..4c16265 100644 --- a/.github/scripts/setup-training-scenarios.js +++ b/.github/scripts/setup-training-scenarios.js @@ -483,7 +483,6 @@ function ensurePrComment(prNumber, marker, body) { "pr", "view", prNumber, - "--comments", "--json", "comments", ]); @@ -869,12 +868,21 @@ Course use: } log(""); + if (dryRun) { + log("Dry run complete. No changes were made."); + log( + "Confirm that the Repository line above shows your fork, then run the script again with --yes.", + ); + return; + } log("Setup complete."); log("Next checks:"); log( "- Open the GitHub Copilot app and connect this fork/training repository.", ); - log("- Confirm the seeded issues and PRs appear in My work."); + log( + "- Confirm the seeded issues and PRs appear in the Issues and Pull requests views.", + ); log( "- Wait for the failing-check PR workflow to finish before using that lesson.", ); diff --git a/.github/skills/check-screenshots-content/SKILL.md b/.github/skills/check-screenshots-content/SKILL.md index 974c5b1..b09f725 100644 --- a/.github/skills/check-screenshots-content/SKILL.md +++ b/.github/skills/check-screenshots-content/SKILL.md @@ -27,9 +27,10 @@ For every `app-*` screenshot, compare the **exact on-screen text** to how the course refers to it: 1. **Label casing and wording** — UI labels must match the screenshot verbatim, - including casing. For example the sidebar shows `My work` (lowercase "w"), - `Home`, `Automations`, `Search`, `Sessions`, `Quick chats`. Flag any course - text that writes `My Work`, `Quick Chats`, etc. + including casing. For example the sidebar shows `Pull requests` (lowercase + "r"), `Issues`, `Automations`, `Customize`, `More`, and the `Chats` row under + `Projects`. Flag any course text that writes `Pull Requests`, `New Chat`, + etc. 2. **Buttons, menu items, and dialog options** — names the README tells the user to click must match the screenshot, e.g. `Create from…`, `Toggle review panel`, `Exit plan mode and I will prompt myself`, `Local folder or repository`, @@ -75,7 +76,7 @@ UI map disagree, trust the screenshot and note that the UI map needs a refresh. 4. **Cross-check** the transcribed text against the README using the rules in *What To Check* above. Also scan the whole course for the visible labels to catch casing drift in chapters that do not embed the image - (e.g. `grep -rn "My Work" .`). + (e.g. `grep -rn "Pull Requests" .`). 5. **Report** findings (see *Output*). Do not edit images or rename files as part of the check. Only propose or apply text fixes if the user asks. @@ -100,4 +101,4 @@ Keep citations exact (`path/README.md:NN`) so fixes are easy to apply. - Screenshots may contain account names, private repo names, or paths. Do not copy private data into the report; describe the UI generically. - Casing matters: product labels use the app's exact sentence case - (e.g. `My work`, `Quick chats`), even inside Title Case headings. + (e.g. `Pull requests`, `Assigned to me`), even inside Title Case headings. diff --git a/.github/skills/github-copilot-app-automation/SKILL.md b/.github/skills/github-copilot-app-automation/SKILL.md index a7d8032..991d84d 100644 --- a/.github/skills/github-copilot-app-automation/SKILL.md +++ b/.github/skills/github-copilot-app-automation/SKILL.md @@ -29,18 +29,22 @@ For each screenshot, launch a new app process from the persistent, signed-in ```bash SK=.github/skills/github-copilot-app-automation/sample_codes/macos-accessibility PERSONA="demo" -REPO="$HOME/Desktop/projects/copilot-app-for-beginners" +# The local clone of the training fork, not the upstream course repository. +REPO="$HOME/copilot-app-for-beginners" COPILOT_PID="$(bash "$SK/prepare-persona.sh" "$PERSONA" "$REPO" 60)" ``` This keeps the existing login and persona data, starts a separate app process, -switches only that process to full screen, resets the display zoom and zooms in -twice, enables and verifies **Streamer Mode**, verifies that the account is -signed in, verifies the exact local repository, and returns its process ID. If the +sets only that window to a standard 1920x1080-point frame, resets the display +zoom and zooms in twice (the zoom is measured and confirmed), enables and +verifies **Streamer Mode**, verifies that the account is signed in, verifies the +exact local repository, dismisses transient banners, and returns its process +ID. If the repository is missing, the pre-step opens the exact folder through the native folder picker and verifies it before capture. A setup failure keeps the process for inspection and does not return a successful process ID. Do not select a -target by app name when another Copilot instance is open. +target by app name when another Copilot instance is open. Do not use full +screen: it can draw the menu bar and title bar over the app content. Before preparing the visible state, extract the Markdown around the image reference: @@ -59,7 +63,12 @@ Add numbered red callouts when one screenshot shows two or more controls that the reader must select in order. The nearby instructions must identify each number, for example, "select **+** (callout 1), then select **Add GitHub repository** (callout 2)." Do not add callouts to a single-action screenshot, -an output example, or an evidence screenshot. +an output example, or an evidence screenshot. To point at one item without a +sequence, such as a menu item to select, use a red highlight box (`--box`) +instead. To point at one small status or control, such as a status pill, use a +red arrow (`--arrow TAIL_X:TAIL_Y:HEAD_X:HEAD_Y`). Recreate the callouts, +boxes, or arrows of an existing image when you retake it, at the new positions +of the same controls. Keep the process ID and use it for all UI operations and capture. Do not use `navigate_to` or other app/session APIs to prepare this window because those @@ -71,10 +80,14 @@ The persona can still show the current GitHub account name and avatar. Process-specific capture automatically derives the visible profile name from the accessibility tree and replaces that text with **Copilot Dev**. If an account handle or repository owner matches the normalized profile name, it -replaces that text with **copilotdev**. It preserves the avatar and unrelated -people and organizations. On a Settings screen, it also removes the displayed -app version. Never hard-code a person's name or an app version. Never treat -the persona name alone as proof that the capture is sanitized. +replaces that text with **copilotdev**, including inside paths and branch names. +The macOS account name and machine name, which terminal prompts and paths can +show, become **copilotdev** and **copilot-dev-mac**. It preserves the avatar +and unrelated people and organizations. On a Settings screen, it also removes +the displayed app version. Never hard-code a person's name or an app version. +Never treat the persona name alone as proof that the capture is sanitized. +Zoom in on every replaced span: a partial replacement can leave letters of the +private name next to the new text. ## Non-Interactive / Hidden-Session Rule @@ -128,20 +141,23 @@ Observed on this machine: After macOS Accessibility permission was enabled, `System Events` could address the app as process `GitHub Copilot`. -Useful exposed controls: +Useful exposed controls (app 1.1.26; see [app-ui-map.md](references/app-ui-map.md) for the full map): | Control | Role | Use | |---|---|---| | `GitHub Copilot` | `AXWindow` | Main app window | | `GitHub Copilot` | `AXWebArea` | Main webview-backed app content | | `Sidebar` | `AXGroup` | Sidebar region | -| `Toggle sidebar` | `AXCheckBox` | Collapse/expand sidebar | -| `Create new project or session` | `AXPopUpButton` | New project/session menu | -| `New session in ` | `AXButton` | Project-specific new session entry | +| `Toggle sidebar, Command + B` | `AXCheckBox` | Collapse/expand sidebar | +| `New`, `Pull requests`, `Issues`, `Automations`, `Customize` | `AXButton` | Sidebar views (Quick links) | +| `More` | `AXPopUpButton` | Sidebar menu with **Edit sidebar...** | +| `New project or session` | `AXPopUpButton` | Projects **+** menu | +| `New session in ` | `AXButton` | Project-specific new session entry (visible on hover or focus) | | `Message` | `AXTextArea` | Prompt composer | -| `Select model` | `AXComboBox` | Model picker | -| `Conversation timeline` | `AXGroup` | Main conversation history | -| `Open changes` | `AXButton` | Diff/changes surface | +| `Project: ` | `AXComboBox` | Composer project picker | +| `Workspace: , branch: ` | `AXPopUpButton` | **Where to work** menu | +| `Toggle panel, Command + Option + B` | `AXCheckBox` | Review panel | +| `Add tab, Command + T` | `AXPopUpButton` | Review panel tab menu | See [macos-accessibility.md](references/macos-accessibility.md) for scripts and caveats. @@ -177,41 +193,58 @@ Use [type-and-clear-draft.applescript](sample_codes/macos-accessibility/type-and Only use this workflow when the user has agreed the App can be visible or when the target state is already visible in a dedicated App window. Capture from a **sanitized training account** on the training fork — never the user's real private projects. 1. Run `screenshot-context.py` for the referenced image and turn the nearby - course text into a concrete capture checklist. -2. Launch a new full-screen process from the persistent `demo` persona with - `prepare-persona.sh`. The pre-step resets zoom, zooms in twice, and enables - and verifies **Streamer Mode**. It fails closed if Streamer Mode cannot be - verified. Pass the exact local training repository and keep the returned - process ID. + course text into a concrete capture checklist. If you retake an existing + image, view the old image first and list its callouts, boxes, and crop. +2. Launch a new process from the persistent `demo` persona with + `prepare-persona.sh`. The pre-step sets a standard 1920x1080-point window, + resets zoom, zooms in twice, and enables and verifies **Streamer Mode**. It + fails closed if Streamer Mode or the zoom cannot be verified. Pass the exact + local training repository and keep the returned process ID. Turn off Siri + before you capture: its waveform orb can appear next to a focused text field, + and the capture script fails when it sees the orb. 3. Map that process with `COPILOT_PID="$COPILOT_PID" map-app.sh` so steps match the current app build. 4. Navigate that process to the exact state with Accessibility controls and let - spinners settle. -5. Capture the window owned by that process ID and convert it to WebP. When the - image requires ordered callouts, pass each badge in instruction order at its - final 1920x1080 coordinates: + spinners settle. Use `prepare-copilot-state.swift` for states that a named + action cannot create: `focus` shows a hover-only control (such as the **+** + on the **Chats** row), `highlight-menu-item` selects a menu item with the + keyboard (web menus ignore synthetic pointer moves), `set-value` fills a + field without pressing Return, and `park` moves the pointer and focus away + so no hover effects or focus rings remain. +5. Find the final coordinates of each control with + `locate-copilot-element.swift`, then capture the window owned by that process + ID and convert it to WebP. Pass callouts in instruction order, highlight + boxes, and an optional crop, all in final 1920x1080 coordinates: ```bash bash sample_codes/macos-accessibility/capture-window.sh \ /assets 40 "$COPILOT_PID" bash sample_codes/macos-accessibility/capture-window.sh \ 00-setup/assets app-add-project 40 "$COPILOT_PID" \ - --callout 1:472:324 --callout 2:743:501 + --callout 1:372:338 --callout 2:585:437 + + bash sample_codes/macos-accessibility/capture-window.sh \ + 06-canvases/assets app-open-repo-issues-canvas 40 "$COPILOT_PID" \ + --box 1287:266:1551:309 --crop 352:0:1920:700 ``` 6. For callout images, confirm that every badge is next to its control, does not cover a label or icon, and matches the instruction order. The standard style - is a 26px-radius `#ff594b` circle with a white number. + is a 26px-radius `#ff594b` circle with a white number. Keep each badge at + least its radius plus 2 px from the image edge. 7. Keep PNG as the source artifact; use WebP in web/course pages. -8. Confirm that both files are exactly 1920x1080. +8. Confirm that full-window files are exactly 1920x1080. A crop keeps the size + of its crop rectangle. 9. Confirm that the image has a 2px `#cccccc` border inside its edges. 10. Confirm that the output keeps the avatar, shows **Copilot Dev** instead of a person's profile name, and uses **copilotdev** for matching personal - repository owners. + repository owners, paths, and branch names. 11. For Settings screenshots, confirm that no app version is visible. 12. Review the screenshot for other private data before committing or publishing. -13. Close the exact process with `cleanup-persona.sh` only after the capture is - verified. Keep the signed-in persona for the next screenshot. +13. Restore any persona state that you changed for the capture (hidden + projects, installed plugins or MCP servers, test automations or sessions), + then close the exact process with `cleanup-persona.sh` only after the + capture is verified. Keep the signed-in persona for the next screenshot. To work through the course's pending shots, discover them dynamically and process one at a time (never hardcode the list): `screenshots.sh list` -> `screenshots.sh next` -> capture -> `screenshots.sh embed`. See [missing-screenshots.md](references/missing-screenshots.md). @@ -225,14 +258,16 @@ Use: - [ensure-streamer-mode.swift](sample_codes/macos-accessibility/ensure-streamer-mode.swift) — enables and verifies Streamer Mode before screenshot preparation - [cleanup-persona.sh](sample_codes/macos-accessibility/cleanup-persona.sh) — stops one exact screenshot process and preserves the signed-in persona - [launch-persona.sh](sample_codes/macos-accessibility/launch-persona.sh) — low-level launcher used by `prepare-persona.sh` -- [control-copilot-window.swift](sample_codes/macos-accessibility/control-copilot-window.swift) — activates or enters full screen for one exact app process +- [control-copilot-window.swift](sample_codes/macos-accessibility/control-copilot-window.swift) — sets the 1920x1080-point capture frame and the measured 125% capture zoom for one exact app process - [control-copilot-ui.swift](sample_codes/macos-accessibility/control-copilot-ui.swift) — presses one named Accessibility control in an exact app process +- [prepare-copilot-state.swift](sample_codes/macos-accessibility/prepare-copilot-state.swift) — prepares transient states: focus a hover-only control, highlight a menu item, set a field value, dismiss banners, and park the pointer +- [locate-copilot-element.swift](sample_codes/macos-accessibility/locate-copilot-element.swift) — prints the final 1920x1080 coordinates of named controls for callouts, boxes, and crops - [find-private-identities.swift](sample_codes/macos-accessibility/find-private-identities.swift) — derives profile names and matching personal repository owners without hard-coded identities -- [sanitize-screenshot.sh](sample_codes/macos-accessibility/sanitize-screenshot.sh) — replaces identity text while preserving avatars -- [app-ui-map.md](references/app-ui-map.md) — sanitized factual UI map (menus, sidebar, composer controls), regenerable via map-app.sh -- [capture-window.sh](sample_codes/macos-accessibility/capture-window.sh) — recommended: process-filtered CoreGraphics window capture + WebP -- [finalize-screenshot.py](sample_codes/macos-accessibility/finalize-screenshot.py) — enforces 1920x1080 output and adds the required 2px `#cccccc` inside border -- [add-step-callouts.py](sample_codes/macos-accessibility/add-step-callouts.py) — adds ordered red step badges to a finalized screenshot when one image shows multiple actions +- [sanitize-screenshot.sh](sample_codes/macos-accessibility/sanitize-screenshot.sh) — replaces identity text while preserving avatars; caches identities per process because dialogs can hide the sidebar +- [app-ui-map.md](references/app-ui-map.md) — sanitized factual UI map (menus, sidebar, views, composer controls), regenerable via map-app.sh +- [capture-window.sh](sample_codes/macos-accessibility/capture-window.sh) — recommended: process-filtered CoreGraphics window capture + WebP, with `--callout`, `--box`, `--arrow`, and `--crop` +- [finalize-screenshot.py](sample_codes/macos-accessibility/finalize-screenshot.py) — enforces 1920x1080 output, adds the required 2px `#cccccc` inside border, and crops +- [add-step-callouts.py](sample_codes/macos-accessibility/add-step-callouts.py) — adds ordered red step badges, red highlight boxes, and red arrows to a finalized screenshot - [find-copilot-window.swift](sample_codes/macos-accessibility/find-copilot-window.swift) — lists on-screen Copilot windows with their window and process IDs - [map-app.sh](sample_codes/macos-accessibility/map-app.sh) — version-stamped UI map for grounding steps and diffing app updates - [capture-copilot-window.sh](sample_codes/macos-accessibility/capture-copilot-window.sh) — older Accessibility-rectangle fallback diff --git a/.github/skills/github-copilot-app-automation/references/app-ui-map.md b/.github/skills/github-copilot-app-automation/references/app-ui-map.md index e649047..59cc660 100644 --- a/.github/skills/github-copilot-app-automation/references/app-ui-map.md +++ b/.github/skills/github-copilot-app-automation/references/app-ui-map.md @@ -1,72 +1,264 @@ # GitHub Copilot app UI Map -- app_version: 1.1.20 -- captured: 2026-09-13 (macOS, New screen) +- app_version: 1.1.26 +- captured: 2026-09-30, checked again on 2026-10-01 for 1.1.26 (macOS, `demo` + persona, Streamer Mode on) - privacy: project names, session names, pull request titles, and the account name are redacted to ``. Regenerate with [map-app.sh](../sample_codes/macos-accessibility/map-app.sh) from a sanitized account, then re-redact before committing. A factual reference for grounding course steps and screenshots in the app's real -UI. Menus are always mappable; window controls below were captured with the New -screen visible on the active Space. Re-run `map-app.sh` after an app update and -diff against this file. +UI. Menus are always mappable. The other sections were checked with +Accessibility in a process-scoped persona. Re-run `map-app.sh` after an app +update and diff against this file. ## Menus - **GitHub Copilot**: About GitHub Copilot · Settings… · Check for Updates… · Services · Hide… · Quit -- **File**: New Session · New Session Without Project · New Session from Recent · Open URL From Clipboard · Create from Local Folder or Repository · Create from GitHub · Create from URL · Close Window +- **File**: New Session · New Session from Recent · New Chat · Open URL From Clipboard · Create from Local Folder or Repository · Create from GitHub · Create from URL · Close Window - **Edit**: Undo · Redo · Cut · Copy · Paste · Select All · Writing Tools · AutoFill · Start Dictation… · Emoji & Symbols - **View**: Toggle Sidebar · Toggle Review Panel · Toggle Terminal · Command Palette · Back · Forward · Actual Size · Zoom In · Zoom Out · Enter Full Screen -- **Window**: New Window · Minimize · Zoom · Bring All to Front +- **Window**: Minimize · Zoom · Bring All to Front - **Help**: Documentation · Keyboard Shortcuts · What's New · Manage Copilot Subscription · Automations · MCP Servers · Skills · Share Feedback · Run Health Check · Show Home Tips Again · Credits +## Onboarding (first run) + +- Sign-in screen: **Sign in to GitHub** · **Sign in to GitHub Enterprise Cloud + (*.ghe.com)** · Accessibility settings. If the app already has an account, + it shows **Continue as @``** and **Use a different account** instead. +- **Connect your repositories. We've selected these based on your activity.**: + Add local repositories · Select from GitHub (suggested repositories, not + selected) · "Nothing selected yet. Repositories can be added anytime." · + **Continue**. +- 1.1.25 and 1.1.26 have no theme step. **Continue** opens the New view, and a + one-time tip about **Customize** can appear. GitHub Docs can still describe a + theme step. +- The app stores the state in the `app_state` table of + `/.copilot/data.db` (key `copilot-onboarding`, field + `hasCompletedOnboarding`). To see onboarding again in the `demo` persona, + close it, back up `data.db`, `data.db-wal`, and `data.db-shm`, set the field + to `false`, and launch it again. The app sets the field to `true` when + onboarding ends. + ## Sidebar (navigation) -- Toggle sidebar (checkbox) · Go back · Go forward · Resize sidebar -- **Quick links**: New · My work · Automations · Customize -- **Projects**: Configure sessions · New project or session - - Chats (+ New chat) - - One row per connected project: ``, each with - "Create project from pull requests, branches, or issues in ``" - and "New session in ``" -- **User profile and settings** (bottom): "Open user menu for ``" · Share feedback · Settings +- Toggle sidebar (checkbox) · Search · Back · Forward · Resize sidebar +- **Quick links**: New · Pull requests · Issues · Automations · Customize · More + - **More** (AXPopUpButton) has one item, **Edit sidebar...**. That dialog has + a check box for each Quick link (New, Pull requests, Issues, Automations, + Customize) to show or hide it. +- **Projects** heading: **Configure sessions** · **New project or session** (+) + - Configure sessions: Grouping · Ordering · Show (Project, Branch) · Status · + PR · Environment · Source · Reset filters · Collapse all · Mark all as read + - New project or session (+): Chat · "Start session in" `` (one row + per visible project) · Add GitHub repository · Clone repository · Open folder. + Its footer shows "New session, Command + N. New chat, Command + Shift + N." + - **Chats** row, with **New chat** (+) on hover. In 1.1.26 the row appears + only when at least one chat exists. **Show** and **Edit sidebar** have no + option for it. Start the first chat with **+** > **Chat**. + - One row per connected project. On hover: **Create from…** ("Create project + from pull requests, branches, or issues in ``") and **New session + in ``** (+). Right-click: New session · Create from… · Show in + Finder · Open on GitHub · Settings · Hide · Customize… · Manage sessions · + Remove repository + - Session rows (right-click): Rename · Pin · Mark as unread · Show in Finder · + Copy · Open in… · Create nested session · Archive · Delete. Chat rows have + no Open in… or Create nested session, and add Share as secret gist. +- **User profile and settings** (bottom): "``, open user menu" · Share feedback · Settings + +## Pull requests and Issues views + +- Heading, repository picker (AXComboBox, **All repositories** or + `/`), and **Open detail panel**. Issues also has **New issue**. +- Pull requests tabs: Authored by me · Assigned to me · Involves me · Review + requests · Done · New view (+) +- Issues tabs: Assigned to me · Created by me · Mentioning me · Done · New view (+) +- **Filter: ``** (filter icon) shows or hides a query box with Simple and + Query modes. Defaults: `state:open author:@me` (Authored by me) and + `state:open assignee:@me` (Assigned to me). +- The repository picker selection is separate for each view and stays when you + change tabs. A typed `repo:` term sets the picker to **Custom** ("managed by + query filter") and is removed when you change tabs. +- Pull request detail: New session (+ New session options: New session, Chat) · + Review (Comment, Approve, Request changes) · Ready to merge · Close detail + panel; tabs Overview and Changes. A failing check shows "Some checks were not + successful", "Failing (n)", and an options menu (Open on GitHub, Re-run). + The PR tab in a session's review panel adds a **Check status** heading with + **Fix failing checks** (options: Fix with instructions). +- **Ready to merge** (merge-readiness button in the PR header and the session + header) opens the **Merge pull request** panel: **Agent merge** toggle + ("Automatically address reviews, fix CI failures, and resolve conflicts."), + readiness heading, checks with **Fix failing checks**, and comment status. + Do not press merge controls during capture. +- Issue detail: New session (+ options) · Assignees · Labels · Type · Add + property · Create sub-issue · Close issue · Comment + +## Automations view + +- Heading with **New automation**. Empty state: "Set up automations", + **Start automating**, template cards, and a Skills list with a + **New automation** button for each skill. +- After an automation exists: Search automations… · Templates · New automation; + **Your automations** cards (Trigger, description, Environment, last run, Run) + and **Recent runs**. +- New automation form: Name · Trigger (default **Daily**; Manual, Hourly, + Daily, Weekly, CRON, Issue, Discussion comment, Discussion opened, Discussion + updated, Pull request, Sub issue added) · Hours (00:00–23:00, default 09:00) · + Minute (:00, :15, :30, :45) · Run in the cloud · Prompt (Mode default + Autopilot, model) · project picker ("Select project"; "Without a project, + this automation will run as a chat.") · **Workspace** picker after a project + is chosen (New worktree, Current checkout) · Cancel · Create + "Create + automation options" → Create and run. **Create** stays disabled until the + prompt has text. +- CRON trigger: **Expression** fields min · hour · day · month · weekday, each + with a hint, "Evaluated in local time.", a preview such as "Runs at 8:00 AM + every day.", and errors such as "Invalid CRON, Minute must be 0 to 59." +- Run in the cloud adds **Add another trigger** and **Tools** (default "All + tools selected"; sections Issues, Pull Requests, Discussions, Repos, Actions, + Labels, Code Security). Selecting one tool while all are selected clears that + tool only. +- Automation detail: name button opens **Automation details** (Tokens, Context, + Session spend, Environment, Schedule, Next run, Runs, Edit automation, Disable + automation, Delete automation) · Open as chat · Edit · Run automation. Edit + opens **Edit automation** with **Save automation**. -## Session composer (New) +## Customize view -- AXTextArea **Message** — placeholder: "Ask anything or paste a URL. Use / for commands, & sessions, # issues…" -- AXPopUpButton **Add context** -- AXPopUpButton **Mode: Interactive** (session mode selector) -- AXPopUpButton **Model and reasoning** (e.g., "GPT-5.6 Sol · Medium") -- AXPopUpButton **Set up voice dictation** -- AXComboBox **Chat** or the selected project name +- Tabs: Featured · MCP · Plugins · Skills · Extensions · Canvas · Installed; + tab-specific search ("Search MCP servers", "Search plugins", "Search skills") + and **Add** (MCP Server…, Plugin…, Skill…, Canvas from URL…). +- MCP: Featured cards and **Available** by category. Search a server name, then + **Add server** on its row opens a dialog titled with the server name (About, + Configuration: Server name, Server type (Local/HTTP/SSE; the **Server type** + label is new in 1.1.26), URL, Headers, OAuth Client ID, Timeout). Installed + servers show a connected icon, an enabled toggle, and Actions (right-click + the row: Disable, Edit configuration, View on GitHub, Remove; Remove asks + "Remove ``?"). +- Plugins: Featured cards and **Available** marketplace rows (copilot-plugins, + awesome-copilot). A marketplace is searched only after you expand it. The gear + icon is **Manage marketplaces** (Source field, Add marketplace). Installed + plugins have Actions (Update, Uninstall) and an enabled toggle. +- Skills: Installed list with filters All · Project · Built-in. There is no + Personal filter. +- Installed: sections that include **Extensions** and **Canvas** (with a + count). Canvas lists the Built-in Editor, Browser, and Terminal canvases, + then Personal (user-scoped) canvases. A personal canvas has no uninstall + action. Its details show only Copy path and Reveal in Finder, so delete + `~/.copilot/extensions/` to remove it. + +## Session composer + +- AXTextArea **Message** — placeholder: "Ask anything. Use / for commands, @ files, & sessions, # issues..." (in Plan mode: "Plan a task. …") +- AXPopUpButton **Add context & more** · **Mode: ``** · model and + reasoning (for example "GPT-6.1 Sol · Medium") · Set up voice dictation · Send message +- Mode menu: Interactive ("Step-by-step collaboration") · Plan ("Plan first, + execute when ready") · Autopilot ("End-to-end execution without + interruption") · **Tool permissions** (submenu: Always ask · Assisted + (Experimental) · Approve all). A new 1.1.26 profile defaults to **Approve + all** (`permission-mode-default-on` in `app_state`). +- Model and reasoning menu: Auto · Model (submenu: Claude Opus 5.5, Claude + Sonnet 5.5, GPT-6.1 Sol, GPT-6 Astra, GPT-5.6 Sol, and others, then More + models) · Effort · Context window. The last model you pick becomes the + default for new sessions, so restore it after a test. +- AXComboBox **Project: ``** (or **Chat**) +- AXPopUpButton **Workspace: ``, branch: ``** — menu heading + **Where to work**: New worktree ("Separate directory for each session") · + Current checkout ("Work in the existing checkout") · Cloud ("Runs in a cloud + sandbox") · Base branch (submenu). The label reads "New worktree · main". + The app remembers the last choice across views and restarts. **Create from** + always makes a new worktree. +- **Agent: ``** picker appears only when a custom agent is loaded (menu: + Default agent, then custom agents). `/agent` ("Choose a custom agent for this + session.") lists Default and custom agents. A new agent file needs an app + restart before it appears. +- **Review plan** replaces the composer after a Plan-mode plan. Options: + Approve and implement this plan (switches to Autopilot) · Exit plan mode and + I will prompt myself (returns to Interactive) · Suggest changes to the plan… + (text field) · Cancel · Continue. Each option shows a short badge, and its + Accessibility label is the badge, a period, and the option text. Badges have + changed between versions, so find options by their text, and do not use the + badge in course text. A mouse click on an option submits it at once. AXPress + only selects an option, and **Continue** or Return then submits the selected + option (the first option by default). The plan also opens in a **Plan** tab + in the review panel. The agent often asks a **Question** first (answer + options, a free-text answer field, Skip, Continue). +- Items above the composer: **Changes +n −n** (Accessibility label "Open + changes, Command + Backslash"; it opens the **Changes (n), +n, -n** tab), + **PR #n**, and **Background n**. **Background n** opens **Background + activity**: Running and Completed tasks, a Stop button for each running task, + and a **Detached** label on detached tasks. An attached running task keeps + the turn open. +- `/context` opens the session information menu (branch from base, Remote + control, Path, Project, Session name, Session ID, Changes, Tokens, Context bar + with Toggle breakdown, Session spend). It needs an active conversation: as the + first message of a new session, **Send** and Return do nothing (1.1.26). +- `/agent` appears in the `/` list only after a custom agent is loaded. + +## Session view and review panel + +- Header: ` · /` (long branch names are shortened + with an ellipsis) · Run · Open in Visual Studio Code · Open in other apps · + **Create PR** (with Create PR options) when the branch has changes +- **Changes** tab toolbar (1.1.26): scope menu ("Uncommitted n files, changes + scope": Committed · Uncommitted) on the left; on the right, branch actions + for `` (Commit changes · Push changes · Rename branch) · Collapse all + files · Diff view options · Show file tree. +- **Toggle panel, Command + Option + B** opens the review panel (the View menu + item is still **Toggle Review Panel**). On the New view, the menu item is + visible and enabled but does nothing, so submit a first prompt (or use + **Create from**) before you open the panel. A new panel shows a list: + Changes · Browser · Terminal · Files · Canvas. **Maximize panel, Command + + Option + E** widens it. +- **Add tab, Command + T** (+): Changes · Terminal · Browser · Files · Side chat · + Insights · Canvas. **Canvas** opens a submenu with installed canvases, then + "Discover more": Import canvas from gist/URL · Import canvas from repo. Before + the first prompt of a session, the submenu shows only the import items. +- Sidebar session row > right-click > **Delete** opens **Delete session?** + ("Permanently deletes `` and all its files (about n MB)", "Uncommitted + changes are backed up to a recovery branch before deletion", Don't ask + again, Cancel, Delete session). The app then removes the session branch. + Sessions from **Create from** > `main` are all named **main**. Identify a row + by its Accessibility label, which includes "Last updated …". +- Browser tab: URL field, Light/Dark preview theme, **Pick & Polish, + Command + Shift + C**. +- **Resize panel** splitter (AXValue 30–80) responds to Left/Right arrow keys + when focused. ## New content - Composer for a chat or selected project -- Project picker: Chat · connected projects · Add GitHub repository · Clone repository · Open folder -- Sample project or prompt idea cards vary by selected project state +- Project picker: Search · Chat · connected projects · Add GitHub repository · Clone repository · Open folder +- Three suggested prompt cards that change between visits - Footer: "GitHub Copilot uses AI. Check for mistakes." ## Settings dialog - Standard categories: General · Accounts · Sessions · Themes · Accessibility · - Voice dictation · Customize · Model providers · Experimental + Voice dictation · Customize · Model providers · Experimental, then a + **Projects** list. A project page has **Show in sidebar** and sandbox settings. - The General category can show the current app version. Remove that version from course screenshots because it changes frequently. - -## Window chrome - -- Close · Minimize · Enter Full Screen · Notifications +- Sessions > **Default branch prefix** has a **Reset default branch prefix** + button that restores `%username%-`. ## Notes for the course - Enable and verify Streamer Mode before mapping or capturing. It hides unreleased features that the public cannot access. -- The composer exposes Mode and the combined model and reasoning control directly - (grounds Chapter 01's model/reasoning guidance). -- The File menu's "Create from Local Folder or Repository / GitHub / URL" matches - Chapter 00's connect-the-repository options. -- "New", "My work", "Automations", and "Customize" are top-level Quick links - when Streamer Mode is enabled. +- The app's docs can still say "My work". Follow the app: the sidebar has + separate **Pull requests** and **Issues** views. - "Chats" and connected repositories appear under "Projects". +- The **+** (**New chat**) on the **Chats** row, and the **+** and **Create + from** icons on each project row, appear only while the pointer is over that + row. Screenshots taken without hover do not show these controls, so do not + report them as missing. Course steps should tell learners to point to the + row first. The **+** next to the **Projects** heading is always visible. +- The **Start session in** group of the Projects **+** menu lists visible + projects. A first-run learner has no project yet, so hide the project + (Settings > project > Show in sidebar) to show their menu, then show it again. +- **New session** on a project opens the New view with that project selected. + The session is created when you submit the first prompt. +- In the **Create from** dialog, Return on a search that matches no branch + creates a new local branch with the typed text. Check the search text before + you press Return. diff --git a/.github/skills/github-copilot-app-automation/references/macos-accessibility.md b/.github/skills/github-copilot-app-automation/references/macos-accessibility.md index 600a9cd..7588c89 100644 --- a/.github/skills/github-copilot-app-automation/references/macos-accessibility.md +++ b/.github/skills/github-copilot-app-automation/references/macos-accessibility.md @@ -77,8 +77,9 @@ verify the exact repository: ```bash SK=.github/skills/github-copilot-app-automation/sample_codes/macos-accessibility PERSONA="demo" +# The local clone of the training fork, not the upstream course repository. COPILOT_PID="$(bash "$SK/prepare-persona.sh" \ - "$PERSONA" "$HOME/Desktop/projects/copilot-app-for-beginners" 60)" + "$PERSONA" "$HOME/copilot-app-for-beginners" 60)" ``` Use the returned process ID for subsequent Accessibility operations and pass it @@ -102,11 +103,17 @@ A process-specific `capture-window.sh` run automatically: - Derives matching account handles and personal repository owners by normalized comparison. - Replaces profile text with `Copilot Dev`. -- Replaces matching account handles and repository owners with `copilotdev`. +- Replaces matching account handles and repository owners with `copilotdev`, + also inside paths and branch names. +- Replaces the macOS account name and machine name with `copilotdev` and + `copilot-dev-mac`. - Keeps the avatar and unrelated people and organizations unchanged. - Verifies with OCR that the source identity text is absent. - Adds ordered red number callouts when repeated - `--callout NUMBER:X:Y` arguments are supplied. + `--callout NUMBER:X:Y` arguments are supplied, red highlight boxes for + `--box LEFT:TOP:RIGHT:BOTTOM`, red arrows for + `--arrow TAIL_X:TAIL_Y:HEAD_X:HEAD_Y`, and a bordered crop for `--crop`. +- Fails if a Siri waveform orb is visible next to a focused field. This step requires `tesseract` and Pillow. If identity detection succeeds but OCR cannot find or remove the text, capture fails and keeps the `.raw.png` file diff --git a/.github/skills/github-copilot-app-automation/references/missing-screenshots.md b/.github/skills/github-copilot-app-automation/references/missing-screenshots.md index 5db602f..4cc3a26 100644 --- a/.github/skills/github-copilot-app-automation/references/missing-screenshots.md +++ b/.github/skills/github-copilot-app-automation/references/missing-screenshots.md @@ -14,11 +14,12 @@ chapters add, edit, or remove placeholders over time. > From the repo root, with: > `SK=.github/skills/github-copilot-app-automation/sample_codes/macos-accessibility` -Prepare a new full-screen persona instance before each screenshot: +Prepare a new persona instance (standard 1920x1080-point window, 125% zoom) +before each screenshot. Pass the local clone of the training fork: ```bash COPILOT_PID="$(bash "$SK/prepare-persona.sh" \ - demo "$HOME/Desktop/projects/copilot-app-for-beginners" 60)" + demo "$HOME/copilot-app-for-beginners" 60)" ``` Keep this process ID. It prevents capture from selecting another open Copilot @@ -47,24 +48,25 @@ bash "$SK/screenshots.sh" next # or: next 13 for a specific index # two or more controls that the reader must select in order. python3 "$SK/screenshot-context.py" /README.md .webp -# c) Prepare the dedicated full-screen demo persona and get that instance to the -# required state. Run the Node.js setup script first for data shots. +# c) Prepare the dedicated demo persona and get that instance to the required +# state. Run the Node.js setup script first for data shots. COPILOT_PID="$(bash "$SK/prepare-persona.sh" \ - demo "$HOME/Desktop/projects/copilot-app-for-beginners" 60)" + demo "$HOME/copilot-app-for-beginners" 60)" # d) Capture (PNG + WebP into the chapter's assets/). Use the slug from step (a), # or any name you prefer: bash "$SK/capture-window.sh" 40 "$COPILOT_PID" # For one image that shows multiple ordered actions, append one callout for -# each action. Use final 1920x1080 image coordinates: +# each action. Use final 1920x1080 image coordinates (locate-copilot-element +# prints them). Use --box for one item and --crop for a detail area: bash "$SK/capture-window.sh" 40 "$COPILOT_PID" \ --callout 1:X:Y --callout 2:X:Y # e) Confirm the avatar remains, profile text shows "Copilot Dev", and a -# matching personal repository owner shows "copilotdev". Then review for -# other private data. Confirm that callouts match the instruction order and -# do not cover control labels or icons. +# matching personal repository owner, path, or branch shows "copilotdev". +# Then review for other private data. Confirm that callouts match the +# instruction order and do not cover control labels or icons. # f) Replace the placeholder with the embed: bash "$SK/screenshots.sh" embed .webp "" @@ -84,10 +86,10 @@ Judge each shot from its description — don't rely on a stored list: - **App-chrome shots** (settings tabs, composer, pickers, the new-automation form): capturable any time; no seeded data needed. Keep private panels (e.g., the sidebar session list) out of frame, or capture from a clean account. -- **Data shots** (My work, issue/PR details, diffs, failing checks, run history, - a live session or canvas): need the **training fork** with - `node .github/scripts/setup-training-scenarios.js --yes` run, from a - sanitized account. +- **Data shots** (Issues and Pull requests views, issue/PR details, diffs, + failing checks, run history, a live session or canvas): need the **training + fork** with `node .github/scripts/setup-training-scenarios.js --yes` run, + from a sanitized account. - **Policy/build-gated shots** (Agent Merge, cloud automations, canvas authoring): capture when available; otherwise leave the placeholder as demo-only. diff --git a/.github/skills/github-copilot-app-automation/references/screenshot-capture.md b/.github/skills/github-copilot-app-automation/references/screenshot-capture.md index a26515f..1253139 100644 --- a/.github/skills/github-copilot-app-automation/references/screenshot-capture.md +++ b/.github/skills/github-copilot-app-automation/references/screenshot-capture.md @@ -6,13 +6,16 @@ Capture visible GitHub Copilot app states for course material: - Save a **PNG** as the high-quality source artifact. - Save a **WebP** optimized version for web delivery. -- Make both files exactly **1920x1080**. -- Add a **2px `#cccccc` border** inside the image edges. -- Reset display zoom, then zoom in exactly twice before preparing the screen. +- Make full-window files exactly **1920x1080**. A crop keeps the size of its + crop rectangle. +- Add a **2px `#cccccc` border** inside the image edges, also on crops. +- Capture a standard 1920x1080-point window, not full screen. +- Reset display zoom, then zoom in exactly twice (125%) before preparing the + screen. - Enable and verify **Streamer Mode** before preparing the screen. - Remove the app version from Settings screenshots after capture. - Add ordered red number callouts when one image shows multiple controls that - the reader must select in sequence. + the reader must select in sequence. Use a red highlight box for one item. - Keep screenshots deterministic and safe by using a known separate session that is already visible, or by getting explicit approval before changing the visible App window. ## Dedicated Persona Instance @@ -23,7 +26,8 @@ For each course screenshot, launch a new process from the persistent, signed-in ```bash SK=.github/skills/github-copilot-app-automation/sample_codes/macos-accessibility PERSONA="demo" -REPO="$HOME/Desktop/projects/copilot-app-for-beginners" +# The local clone of the training fork, not the upstream course repository. +REPO="$HOME/copilot-app-for-beginners" COPILOT_PID="$(bash "$SK/prepare-persona.sh" "$PERSONA" "$REPO" 60)" ``` @@ -33,12 +37,16 @@ The preparation workflow: - Keeps login and account state in `CopilotPersonas/demo`. - Starts a new app instance with `open -na`. - Finds the new process instead of reusing an existing Copilot process. -- Switches only that process to full screen. -- Resets display zoom and zooms in twice. +- Sets only that process's main window to a standard 1920x1080-point frame, + centered on its display. +- Resets display zoom, zooms in twice, and measures a sidebar control to + confirm the 125% zoom. It retries and fails if it cannot confirm the zoom. - Enables and verifies Streamer Mode so unreleased features are hidden. - Verifies that the persona is signed in. - Opens the exact repository path through the native folder picker if needed. - Verifies that the repository name appears in the selected process. +- Dismisses transient banners (only buttons on a safe allowlist) and moves the + pointer away from the content. - Prints its process ID for exact capture targeting. The separate `HOME` isolates app files, but it does not isolate credentials in @@ -46,13 +54,19 @@ the macOS Keychain. The new instance can still show the signed-in account name and avatar. Process-specific capture reads the profile control, replaces the person's name with **Copilot Dev**, and keeps the avatar. It also replaces a visible account handle or repository owner with **copilotdev** when that value -matches the normalized profile name. It does not hard-code real names or -replace unrelated people or organizations. On Settings screens, it removes -the displayed app version because that value changes frequently. +matches the normalized profile name, also inside paths and branch names. The +macOS account name and the machine name, which terminal prompts and paths can +show, become **copilotdev** and **copilot-dev-mac**. It does not hard-code real +names or replace unrelated people or organizations. On Settings screens, it +removes the displayed app version because that value changes frequently. -The automation caller needs macOS Accessibility permission to switch the new -window to full screen. Full-screen mode creates or activates a separate macOS -Space, so wait for the transition before navigating or capturing. +The identities are cached for each process the first time the sidebar is +visible, because an open dialog can hide the sidebar from Accessibility. +`cleanup-persona.sh` removes that cache. + +The automation caller needs macOS Accessibility permission to set the window +frame and zoom. Do not use full screen for course captures: while the app is +active, macOS can draw the menu bar and title bar over the app content. Do not use `navigate_to` or another app/session API to prepare this window. Those APIs belong to the Copilot instance that hosts the agent and can navigate @@ -98,6 +112,108 @@ tables, terminal evidence, or images that only illustrate a concept. If a current label differs from the course, update the directly related text. Do not reproduce an obsolete UI to keep old text unchanged. +When you retake an existing image, view the old image first. Recreate its +numbered callouts, highlight boxes, and arrows on the same controls at their +new positions, and keep a similar crop. If the old target no longer exists +(for example, a **Running...** state that now ends in seconds), point at the +nearest element that shows the same result, and say so in your report. + +## Prepare Transient UI States + +Many course states are hard to create with a plain button press. Use +[prepare-copilot-state.swift](../sample_codes/macos-accessibility/prepare-copilot-state.swift) +and [locate-copilot-element.swift](../sample_codes/macos-accessibility/locate-copilot-element.swift): + +| Need | Approach | +|---|---| +| Show a hover-only control, such as **New chat** (+) on the **Chats** row or **Create from** on a project row | `focus