From 2f81a16320d0e1eeeaa837c592a1a01463eaece0 Mon Sep 17 00:00:00 2001 From: Mara Nikola Kiefer Date: Sat, 18 Jul 2026 12:47:52 +0200 Subject: [PATCH 1/8] Add devcontainer profiles for various workshop scenarios --- .../.devcontainer/devcontainer.json | 23 ++ .../.devcontainer/post-create.sh | 10 + .../base/.devcontainer/devcontainer.json | 13 + .../base/.devcontainer/post-create.sh | 10 + .../examples/devcontainers/profile-map.json | 350 ++++++++++++++++++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 33 ++ .../.devcontainer/devcontainer.json | 34 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 32 ++ .../.devcontainer/devcontainer.json | 32 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 31 ++ .../.devcontainer/devcontainer.json | 33 ++ .../.devcontainer/devcontainer.json | 34 ++ .../.devcontainer/devcontainer.json | 31 ++ .../generate-workshop-devcontainers.js | 350 ++++++++++++++++++ 22 files changed, 1264 insertions(+) create mode 100644 workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/actions-write/.devcontainer/post-create.sh create mode 100644 workshop/examples/devcontainers/base/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/base/.devcontainer/post-create.sh create mode 100644 workshop/examples/devcontainers/profile-map.json create mode 100644 workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json create mode 100644 workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js diff --git a/workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json new file mode 100644 index 00000000..b4b285bd --- /dev/null +++ b/workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json @@ -0,0 +1,23 @@ +{ + "name": "gh-aw workshop (terminal triggers)", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write" + } + } + } + }, + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ] + } + }, + "postCreateCommand": "bash .devcontainer/post-create.sh" +} \ No newline at end of file diff --git a/workshop/examples/devcontainers/actions-write/.devcontainer/post-create.sh b/workshop/examples/devcontainers/actions-write/.devcontainer/post-create.sh new file mode 100644 index 00000000..ff741760 --- /dev/null +++ b/workshop/examples/devcontainers/actions-write/.devcontainer/post-create.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v code >/dev/null 2>&1; then + code --install-extension GitHub.copilot --force + code --install-extension GitHub.copilot-chat --force +else + echo "The code CLI is not available during post-create." + echo "GitHub Copilot extensions will still install from devcontainer customizations." +fi \ No newline at end of file diff --git a/workshop/examples/devcontainers/base/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/base/.devcontainer/devcontainer.json new file mode 100644 index 00000000..f86dd68c --- /dev/null +++ b/workshop/examples/devcontainers/base/.devcontainer/devcontainer.json @@ -0,0 +1,13 @@ +{ + "name": "gh-aw workshop", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ] + } + }, + "postCreateCommand": "bash .devcontainer/post-create.sh" +} \ No newline at end of file diff --git a/workshop/examples/devcontainers/base/.devcontainer/post-create.sh b/workshop/examples/devcontainers/base/.devcontainer/post-create.sh new file mode 100644 index 00000000..ff741760 --- /dev/null +++ b/workshop/examples/devcontainers/base/.devcontainer/post-create.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v code >/dev/null 2>&1; then + code --install-extension GitHub.copilot --force + code --install-extension GitHub.copilot-chat --force +else + echo "The code CLI is not available during post-create." + echo "GitHub Copilot extensions will still install from devcontainer customizations." +fi \ No newline at end of file diff --git a/workshop/examples/devcontainers/profile-map.json b/workshop/examples/devcontainers/profile-map.json new file mode 100644 index 00000000..9519624a --- /dev/null +++ b/workshop/examples/devcontainers/profile-map.json @@ -0,0 +1,350 @@ +{ + "version": 1, + "generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "hashFormat": "#j=&s=&t=", + "startupCommandId": "simpleBrowser.show", + "schema": { + "tutorialBaseUrl": "Hosted workshop entry page for browser-based routing", + "hashFormat": "URL hash contract used by the tutorial browser state", + "startupCommandId": "VS Code command palette command that should open the hosted workshop inside the integrated browser", + "journeyId": "Tutorial path identifier used by the workshop browser state", + "scenarioId": "Scenario identifier used by the workshop browser state", + "stepKeyHints": "Workshop step keys stored in the URL hash `t` parameter that should resolve to this profile", + "devcontainerPath": "Relative path to the self-contained profile folder" + }, + "profiles": [ + { + "id": "codespaces-terminal__foundation", + "journeyId": "codespaces-terminal", + "scenarioId": "foundation", + "devcontainerPath": "profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-report-status.md", + "stepFiles": [ + "02a-setup-codespace.md", + "03a-create-your-repo-terminal.md", + "06a-install-terminal.md", + "07a-your-first-workflow-terminal.md", + "07a-part2-your-first-workflow-instructions.md", + "07d-confirm-model-access.md", + "08-run-your-workflow.md" + ], + "stepKeyHints": [ + "02a-setup-codespace", + "03a-create-your-repo-terminal", + "06a-install-terminal", + "07a-your-first-workflow-terminal", + "07a-part2-your-first-workflow-instructions", + "07d-confirm-model-access", + "08-run-your-workflow" + ], + "optionalStarterId": "actions-write" + }, + { + "id": "local-terminal__foundation", + "journeyId": "local-terminal", + "scenarioId": "foundation", + "devcontainerPath": "profiles/local-terminal__foundation/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-report-status.md", + "stepFiles": [ + "02b-setup-local.md", + "03a-create-your-repo-terminal.md", + "06b-install-local.md", + "07a-your-first-workflow-terminal.md", + "07a-part2-your-first-workflow-instructions.md", + "07d-confirm-model-access.md", + "08-run-your-workflow.md" + ], + "stepKeyHints": [ + "02b-setup-local", + "03a-create-your-repo-terminal", + "06b-install-local", + "07a-your-first-workflow-terminal", + "07a-part2-your-first-workflow-instructions", + "07d-confirm-model-access", + "08-run-your-workflow" + ] + }, + { + "id": "github-ui__foundation", + "journeyId": "github-ui", + "scenarioId": "foundation", + "devcontainerPath": "profiles/github-ui__foundation/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-report-status.md", + "stepFiles": [ + "03b-create-your-repo-ui.md", + "06c-install-ui.md", + "07b-your-first-workflow-ui.md", + "07d-confirm-model-access.md", + "08-run-your-workflow.md" + ], + "stepKeyHints": [ + "03b-create-your-repo-ui", + "06c-install-ui", + "07b-your-first-workflow-ui", + "07d-confirm-model-access", + "08-run-your-workflow" + ] + }, + { + "id": "copilot-agent__foundation", + "journeyId": "copilot-agent", + "scenarioId": "foundation", + "devcontainerPath": "profiles/copilot-agent__foundation/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-report-status.md", + "stepFiles": [ + "03b-create-your-repo-ui.md", + "07c-your-first-workflow-copilot.md", + "07d-confirm-model-access.md", + "08-run-your-workflow.md" + ], + "stepKeyHints": [ + "03b-create-your-repo-ui", + "07c-your-first-workflow-copilot", + "07d-confirm-model-access", + "08-run-your-workflow" + ] + }, + { + "id": "codespaces-terminal__daily-status", + "journeyId": "codespaces-terminal", + "scenarioId": "daily-status", + "devcontainerPath": "profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-status.md", + "stepFiles": [ + "10a-design-daily-status.md", + "11a-build-daily-status.md", + "11a-build-daily-status-terminal.md", + "11a2-run-daily-status-terminal.md", + "12-test-and-iterate.md", + "13a-schedule-it-terminal.md" + ], + "stepKeyHints": [ + "10a-design-daily-status", + "11a-build-daily-status", + "11a-build-daily-status-terminal", + "11a2-run-daily-status-terminal", + "12-test-and-iterate", + "13a-schedule-it-terminal" + ], + "optionalStarterId": "actions-write" + }, + { + "id": "local-terminal__daily-status", + "journeyId": "local-terminal", + "scenarioId": "daily-status", + "devcontainerPath": "profiles/local-terminal__daily-status/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-status.md", + "stepFiles": [ + "10a-design-daily-status.md", + "11a-build-daily-status.md", + "11a-build-daily-status-terminal.md", + "11a2-run-daily-status-terminal.md", + "12-test-and-iterate.md", + "13a-schedule-it-terminal.md" + ], + "stepKeyHints": [ + "10a-design-daily-status", + "11a-build-daily-status", + "11a-build-daily-status-terminal", + "11a2-run-daily-status-terminal", + "12-test-and-iterate", + "13a-schedule-it-terminal" + ] + }, + { + "id": "github-ui__daily-status", + "journeyId": "github-ui", + "scenarioId": "daily-status", + "devcontainerPath": "profiles/github-ui__daily-status/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-status.md", + "stepFiles": [ + "10a-design-daily-status.md", + "11a-build-daily-status.md", + "11a-build-daily-status-ui.md", + "12-test-and-iterate.md", + "13b-schedule-it-ui.md" + ], + "stepKeyHints": [ + "10a-design-daily-status", + "11a-build-daily-status", + "11a-build-daily-status-ui", + "12-test-and-iterate", + "13b-schedule-it-ui" + ] + }, + { + "id": "copilot-agent__daily-status", + "journeyId": "copilot-agent", + "scenarioId": "daily-status", + "devcontainerPath": "profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-status.md", + "stepFiles": [ + "10-choose-your-scenario.md", + "11d-build-copilot-agents.md", + "11d2-review-and-merge.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10-choose-your-scenario", + "11d-build-copilot-agents", + "11d2-review-and-merge", + "12-test-and-iterate" + ] + }, + { + "id": "codespaces-terminal__daily-docs", + "journeyId": "codespaces-terminal", + "scenarioId": "daily-docs", + "devcontainerPath": "profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-docs.md", + "stepFiles": [ + "10b-design-daily-docs.md", + "11b-build-daily-docs.md", + "11b-build-daily-docs-terminal.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10b-design-daily-docs", + "11b-build-daily-docs", + "11b-build-daily-docs-terminal", + "12-test-and-iterate" + ], + "optionalStarterId": "actions-write" + }, + { + "id": "local-terminal__daily-docs", + "journeyId": "local-terminal", + "scenarioId": "daily-docs", + "devcontainerPath": "profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-docs.md", + "stepFiles": [ + "10b-design-daily-docs.md", + "11b-build-daily-docs.md", + "11b-build-daily-docs-terminal.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10b-design-daily-docs", + "11b-build-daily-docs", + "11b-build-daily-docs-terminal", + "12-test-and-iterate" + ] + }, + { + "id": "github-ui__daily-docs", + "journeyId": "github-ui", + "scenarioId": "daily-docs", + "devcontainerPath": "profiles/github-ui__daily-docs/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-docs.md", + "stepFiles": [ + "10b-design-daily-docs.md", + "11b-build-daily-docs.md", + "11b-build-daily-docs-ui.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10b-design-daily-docs", + "11b-build-daily-docs", + "11b-build-daily-docs-ui", + "12-test-and-iterate" + ] + }, + { + "id": "copilot-agent__daily-docs", + "journeyId": "copilot-agent", + "scenarioId": "daily-docs", + "devcontainerPath": "profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/daily-docs.md", + "stepFiles": [ + "10-choose-your-scenario.md", + "11d-build-copilot-agents.md", + "11d2-review-and-merge.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10-choose-your-scenario", + "11d-build-copilot-agents", + "11d2-review-and-merge", + "12-test-and-iterate" + ] + }, + { + "id": "codespaces-terminal__pr-reviewer", + "journeyId": "codespaces-terminal", + "scenarioId": "pr-reviewer", + "devcontainerPath": "profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/pr-code-reviewer.md", + "stepFiles": [ + "10c-design-pr-reviewer.md", + "11c-build-pr-reviewer.md", + "11c-build-pr-reviewer-terminal.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10c-design-pr-reviewer", + "11c-build-pr-reviewer", + "11c-build-pr-reviewer-terminal", + "12-test-and-iterate" + ], + "optionalStarterId": "actions-write" + }, + { + "id": "local-terminal__pr-reviewer", + "journeyId": "local-terminal", + "scenarioId": "pr-reviewer", + "devcontainerPath": "profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/pr-code-reviewer.md", + "stepFiles": [ + "10c-design-pr-reviewer.md", + "11c-build-pr-reviewer.md", + "11c-build-pr-reviewer-terminal.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10c-design-pr-reviewer", + "11c-build-pr-reviewer", + "11c-build-pr-reviewer-terminal", + "12-test-and-iterate" + ] + }, + { + "id": "github-ui__pr-reviewer", + "journeyId": "github-ui", + "scenarioId": "pr-reviewer", + "devcontainerPath": "profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/pr-code-reviewer.md", + "stepFiles": [ + "10c-design-pr-reviewer.md", + "11c-build-pr-reviewer.md", + "11c-build-pr-reviewer-ui.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10c-design-pr-reviewer", + "11c-build-pr-reviewer", + "11c-build-pr-reviewer-ui", + "12-test-and-iterate" + ] + }, + { + "id": "copilot-agent__pr-reviewer", + "journeyId": "copilot-agent", + "scenarioId": "pr-reviewer", + "devcontainerPath": "profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json", + "workflowFile": ".github/workflows/pr-code-reviewer.md", + "stepFiles": [ + "10-choose-your-scenario.md", + "11d-build-copilot-agents.md", + "11d2-review-and-merge.md", + "12-test-and-iterate.md" + ], + "stepKeyHints": [ + "10-choose-your-scenario", + "11d-build-copilot-agents", + "11d2-review-and-merge", + "12-test-and-iterate" + ] + } + ] +} diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json new file mode 100644 index 00000000..b025bfd4 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: codespaces terminal / daily-docs", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "codespaces-terminal__daily-docs", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-docs&t=10b-design-daily-docs", + "gh-aw-workshop.journeyId": "codespaces-terminal", + "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", + "gh-aw-workshop.stepKeys": [ + "10b-design-daily-docs", + "11b-build-daily-docs", + "11b-build-daily-docs-terminal", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json new file mode 100644 index 00000000..7f526204 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json @@ -0,0 +1,33 @@ +{ + "name": "gh-aw workshop: codespaces terminal / daily-status", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "codespaces-terminal__daily-status", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-status&t=10a-design-daily-status", + "gh-aw-workshop.journeyId": "codespaces-terminal", + "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", + "gh-aw-workshop.stepKeys": [ + "10a-design-daily-status", + "11a-build-daily-status", + "11a-build-daily-status-terminal", + "11a2-run-daily-status-terminal", + "12-test-and-iterate", + "13a-schedule-it-terminal" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json new file mode 100644 index 00000000..b9ca354d --- /dev/null +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json @@ -0,0 +1,34 @@ +{ + "name": "gh-aw workshop: codespaces terminal / foundation", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "codespaces-terminal__foundation", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=foundation&t=02a-setup-codespace", + "gh-aw-workshop.journeyId": "codespaces-terminal", + "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", + "gh-aw-workshop.stepKeys": [ + "02a-setup-codespace", + "03a-create-your-repo-terminal", + "06a-install-terminal", + "07a-your-first-workflow-terminal", + "07a-part2-your-first-workflow-instructions", + "07d-confirm-model-access", + "08-run-your-workflow" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json new file mode 100644 index 00000000..e85da450 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: codespaces terminal / pr-reviewer", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "codespaces-terminal__pr-reviewer", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=pr-reviewer&t=10c-design-pr-reviewer", + "gh-aw-workshop.journeyId": "codespaces-terminal", + "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", + "gh-aw-workshop.stepKeys": [ + "10c-design-pr-reviewer", + "11c-build-pr-reviewer", + "11c-build-pr-reviewer-terminal", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json new file mode 100644 index 00000000..a7d3ec95 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: Copilot agent / daily-docs", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "copilot-agent__daily-docs", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-docs&t=10-choose-your-scenario", + "gh-aw-workshop.journeyId": "copilot-agent", + "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", + "gh-aw-workshop.stepKeys": [ + "10-choose-your-scenario", + "11d-build-copilot-agents", + "11d2-review-and-merge", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json new file mode 100644 index 00000000..bc50e59a --- /dev/null +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: Copilot agent / daily-status", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "copilot-agent__daily-status", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-status&t=10-choose-your-scenario", + "gh-aw-workshop.journeyId": "copilot-agent", + "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", + "gh-aw-workshop.stepKeys": [ + "10-choose-your-scenario", + "11d-build-copilot-agents", + "11d2-review-and-merge", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json new file mode 100644 index 00000000..60f1a869 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: Copilot agent / foundation", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "copilot-agent__foundation", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=foundation&t=03b-create-your-repo-ui", + "gh-aw-workshop.journeyId": "copilot-agent", + "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", + "gh-aw-workshop.stepKeys": [ + "03b-create-your-repo-ui", + "07c-your-first-workflow-copilot", + "07d-confirm-model-access", + "08-run-your-workflow" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json new file mode 100644 index 00000000..70fd8bfc --- /dev/null +++ b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: Copilot agent / pr-reviewer", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "copilot-agent__pr-reviewer", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=pr-reviewer&t=10-choose-your-scenario", + "gh-aw-workshop.journeyId": "copilot-agent", + "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", + "gh-aw-workshop.stepKeys": [ + "10-choose-your-scenario", + "11d-build-copilot-agents", + "11d2-review-and-merge", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json new file mode 100644 index 00000000..674aeaf0 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: GitHub UI / daily-docs", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "github-ui__daily-docs", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-docs&t=10b-design-daily-docs", + "gh-aw-workshop.journeyId": "github-ui", + "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", + "gh-aw-workshop.stepKeys": [ + "10b-design-daily-docs", + "11b-build-daily-docs", + "11b-build-daily-docs-ui", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json new file mode 100644 index 00000000..e3e762b2 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json @@ -0,0 +1,32 @@ +{ + "name": "gh-aw workshop: GitHub UI / daily-status", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "github-ui__daily-status", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-status&t=10a-design-daily-status", + "gh-aw-workshop.journeyId": "github-ui", + "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", + "gh-aw-workshop.stepKeys": [ + "10a-design-daily-status", + "11a-build-daily-status", + "11a-build-daily-status-ui", + "12-test-and-iterate", + "13b-schedule-it-ui" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json new file mode 100644 index 00000000..31646a24 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json @@ -0,0 +1,32 @@ +{ + "name": "gh-aw workshop: GitHub UI / foundation", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "github-ui__foundation", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=foundation&t=03b-create-your-repo-ui", + "gh-aw-workshop.journeyId": "github-ui", + "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", + "gh-aw-workshop.stepKeys": [ + "03b-create-your-repo-ui", + "06c-install-ui", + "07b-your-first-workflow-ui", + "07d-confirm-model-access", + "08-run-your-workflow" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json new file mode 100644 index 00000000..d5624c24 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: GitHub UI / pr-reviewer", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "github-ui__pr-reviewer", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=pr-reviewer&t=10c-design-pr-reviewer", + "gh-aw-workshop.journeyId": "github-ui", + "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", + "gh-aw-workshop.stepKeys": [ + "10c-design-pr-reviewer", + "11c-build-pr-reviewer", + "11c-build-pr-reviewer-ui", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json new file mode 100644 index 00000000..b9e64a94 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: local terminal / daily-docs", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "local-terminal__daily-docs", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-docs&t=10b-design-daily-docs", + "gh-aw-workshop.journeyId": "local-terminal", + "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", + "gh-aw-workshop.stepKeys": [ + "10b-design-daily-docs", + "11b-build-daily-docs", + "11b-build-daily-docs-terminal", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json new file mode 100644 index 00000000..61d6541d --- /dev/null +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json @@ -0,0 +1,33 @@ +{ + "name": "gh-aw workshop: local terminal / daily-status", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "local-terminal__daily-status", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-status&t=10a-design-daily-status", + "gh-aw-workshop.journeyId": "local-terminal", + "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", + "gh-aw-workshop.stepKeys": [ + "10a-design-daily-status", + "11a-build-daily-status", + "11a-build-daily-status-terminal", + "11a2-run-daily-status-terminal", + "12-test-and-iterate", + "13a-schedule-it-terminal" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json new file mode 100644 index 00000000..4cecb836 --- /dev/null +++ b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json @@ -0,0 +1,34 @@ +{ + "name": "gh-aw workshop: local terminal / foundation", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "local-terminal__foundation", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=foundation&t=02b-setup-local", + "gh-aw-workshop.journeyId": "local-terminal", + "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", + "gh-aw-workshop.stepKeys": [ + "02b-setup-local", + "03a-create-your-repo-terminal", + "06b-install-local", + "07a-your-first-workflow-terminal", + "07a-part2-your-first-workflow-instructions", + "07d-confirm-model-access", + "08-run-your-workflow" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json new file mode 100644 index 00000000..2e66b23a --- /dev/null +++ b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "gh-aw workshop: local terminal / pr-reviewer", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "customizations": { + "vscode": { + "extensions": [ + "GitHub.copilot", + "GitHub.copilot-chat" + ], + "settings": { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": "local-terminal__pr-reviewer", + "gh-aw-workshop.tutorialBaseUrl": "https://github.github.com/gh-aw/workshop/", + "gh-aw-workshop.hashFormat": "#j=&s=&t=", + "gh-aw-workshop.startupCommandId": "simpleBrowser.show", + "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=pr-reviewer&t=10c-design-pr-reviewer", + "gh-aw-workshop.journeyId": "local-terminal", + "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", + "gh-aw-workshop.stepKeys": [ + "10c-design-pr-reviewer", + "11c-build-pr-reviewer", + "11c-build-pr-reviewer-terminal", + "12-test-and-iterate" + ] + } + } + }, + "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" +} diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js new file mode 100644 index 00000000..6fca0c20 --- /dev/null +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -0,0 +1,350 @@ +#!/usr/bin/env node +"use strict"; + +const fs = require("node:fs"); +const path = require("node:path"); + +const tutorialBaseUrl = "https://github.github.com/gh-aw/workshop/"; +const hashFormat = "#j=&s=&t="; +const startupCommandId = "simpleBrowser.show"; +const postCreateCommand = + "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'"; +const workflowFileByScenario = { + foundation: ".github/workflows/daily-report-status.md", + "daily-status": ".github/workflows/daily-status.md", + "daily-docs": ".github/workflows/daily-docs.md", + "pr-reviewer": ".github/workflows/pr-code-reviewer.md" +}; + +const workshopDir = path.resolve(__dirname, "../../../"); +const devcontainersDir = path.resolve(__dirname, ".."); +const profilesDir = path.join(devcontainersDir, "profiles"); +const profileMapPath = path.join(devcontainersDir, "profile-map.json"); + +const journeyDefinitions = { + "codespaces-terminal": { + label: "codespaces terminal", + setupKey: "02a-setup-codespace", + repoCreateKey: "03a-create-your-repo-terminal", + installKey: "06a-install-terminal", + firstWorkflowPrefix: "07a-", + includeModelAccess: true, + includeRunStep: true, + buildVariant: "terminal", + optionalStarterId: "actions-write" + }, + "local-terminal": { + label: "local terminal", + setupKey: "02b-setup-local", + repoCreateKey: "03a-create-your-repo-terminal", + installKey: "06b-install-local", + firstWorkflowPrefix: "07a-", + includeModelAccess: true, + includeRunStep: true, + buildVariant: "terminal" + }, + "github-ui": { + label: "GitHub UI", + repoCreateKey: "03b-create-your-repo-ui", + installKey: "06c-install-ui", + firstWorkflowPrefix: "07b-", + includeModelAccess: true, + includeRunStep: true, + buildVariant: "ui" + }, + "copilot-agent": { + label: "Copilot agent", + repoCreateKey: "03b-create-your-repo-ui", + firstWorkflowPrefix: "07c-", + includeModelAccess: true, + includeRunStep: true, + scenarioEntryKey: "10-choose-your-scenario", + buildKey: "11d-build-copilot-agents", + buildFollowUpKey: "11d2-review-and-merge" + } +}; + +function toStem(fileName) { + return fileName.replace(/\.md$/i, ""); +} + +function listWorkshopStepFiles() { + const readmePath = path.join(workshopDir, "README.md"); + const collator = new Intl.Collator("en", { numeric: true, sensitivity: "base" }); + const fileEntries = fs + .readdirSync(workshopDir, { withFileTypes: true }) + .filter( + (entry) => + entry.isFile() && + entry.name.endsWith(".md") && + !entry.name.startsWith("side-quest") && + entry.name !== "README.md" + ) + .map((entry) => ({ + file: entry.name, + stepKey: toStem(entry.name) + })); + + const defaultOrder = [...fileEntries].sort((left, right) => collator.compare(left.file, right.file)); + if (!fs.existsSync(readmePath)) { + return defaultOrder; + } + + const filesByName = new Map(fileEntries.map((entry) => [entry.file, entry])); + const orderedFromReadme = []; + const seen = new Set(); + const readme = fs.readFileSync(readmePath, "utf8"); + const curriculumSection = readme.split("## Optional Side Quests")[0] || readme; + const linkPattern = /\]\(([^)]+\.md)\)/g; + let match; + while ((match = linkPattern.exec(curriculumSection)) !== null) { + const fileName = match[1]; + const entry = filesByName.get(fileName); + if (entry && !seen.has(fileName)) { + orderedFromReadme.push(entry); + seen.add(fileName); + } + } + + const remaining = defaultOrder.filter((entry) => !seen.has(entry.file)); + return [...orderedFromReadme, ...remaining]; +} + +function indexSteps(stepEntries) { + const byKey = new Map(); + for (const entry of stepEntries) { + byKey.set(entry.stepKey, entry); + } + return byKey; +} + +function ensureStepExists(stepByKey, stepKey) { + if (!stepByKey.has(stepKey)) { + throw new Error(`Workshop step '${stepKey}.md' does not exist under ${workshopDir}`); + } +} + +function maybeAddStep(stepKeys, stepByKey, stepKey) { + if (stepKey && stepByKey.has(stepKey)) { + stepKeys.push(stepKey); + } +} + +function addMatchingSteps(stepKeys, stepEntries, predicate) { + for (const entry of stepEntries) { + if (predicate(entry.stepKey)) { + stepKeys.push(entry.stepKey); + } + } +} + +function stepOrderIndex(stepEntries) { + return new Map(stepEntries.map((entry, index) => [entry.stepKey, index])); +} + +function uniqueStepKeys(stepKeys, orderIndex) { + return [...new Set(stepKeys)].sort((left, right) => (orderIndex.get(left) ?? Number.MAX_SAFE_INTEGER) - (orderIndex.get(right) ?? Number.MAX_SAFE_INTEGER)); +} + +function discoverScenarioDefinitions(stepByKey) { + const scenarios = { + foundation: { + workflowFile: workflowFileByScenario.foundation + } + }; + + for (const stepKey of stepByKey.keys()) { + const match = /^10([a-z])-design-(.+)$/.exec(stepKey); + if (!match) { + continue; + } + const [, trackId, slug] = match; + scenarios[slug] = { + trackId, + designKey: stepKey, + workflowFile: workflowFileByScenario[slug] || null + }; + } + + return scenarios; +} + +function buildFoundationStepKeys(journey, stepEntries, stepByKey, orderIndex) { + const stepKeys = []; + maybeAddStep(stepKeys, stepByKey, journey.setupKey); + maybeAddStep(stepKeys, stepByKey, journey.repoCreateKey); + maybeAddStep(stepKeys, stepByKey, journey.installKey); + addMatchingSteps(stepKeys, stepEntries, (stepKey) => stepKey.startsWith(journey.firstWorkflowPrefix)); + if (journey.includeModelAccess) { + maybeAddStep(stepKeys, stepByKey, "07d-confirm-model-access"); + } + if (journey.includeRunStep) { + maybeAddStep(stepKeys, stepByKey, "08-run-your-workflow"); + } + return uniqueStepKeys(stepKeys, orderIndex); +} + +function buildScenarioStepKeys(journeyId, journey, scenario, stepEntries, stepByKey, orderIndex) { + const stepKeys = []; + + if (journeyId === "copilot-agent") { + maybeAddStep(stepKeys, stepByKey, journey.scenarioEntryKey); + maybeAddStep(stepKeys, stepByKey, journey.buildKey); + maybeAddStep(stepKeys, stepByKey, journey.buildFollowUpKey); + maybeAddStep(stepKeys, stepByKey, "12-test-and-iterate"); + return uniqueStepKeys(stepKeys, orderIndex); + } + + maybeAddStep(stepKeys, stepByKey, scenario.designKey); + + const buildPrefix = `11${scenario.trackId}`; + const scenarioSlug = scenario.designKey.replace(/^10[a-z]-design-/, ""); + maybeAddStep(stepKeys, stepByKey, `${buildPrefix}-build-${scenarioSlug}`); + addMatchingSteps( + stepKeys, + stepEntries, + (stepKey) => + stepKey.startsWith(buildPrefix) && + stepKey.includes(scenarioSlug) && + stepKey.endsWith(`-${journey.buildVariant}`) + ); + + maybeAddStep(stepKeys, stepByKey, "12-test-and-iterate"); + + if (scenario.designKey === "10a-design-daily-status") { + maybeAddStep(stepKeys, stepByKey, journey.buildVariant === "terminal" ? "13a-schedule-it-terminal" : "13b-schedule-it-ui"); + } + + return uniqueStepKeys(stepKeys, orderIndex); +} + +function launchUrlFor(journeyId, scenarioId, stepKey) { + return `${tutorialBaseUrl}#j=${journeyId}&s=${scenarioId}&t=${stepKey}`; +} + +function writeJson(filePath, value) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`); +} + +function removeStaleProfileDirs(validProfileIds) { + if (!fs.existsSync(profilesDir)) { + return; + } + for (const entry of fs.readdirSync(profilesDir, { withFileTypes: true })) { + if (!entry.isDirectory()) { + continue; + } + if (!validProfileIds.has(entry.name)) { + fs.rmSync(path.join(profilesDir, entry.name), { recursive: true, force: true }); + } + } +} + +function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, optionalStarterId) { + const journey = journeyDefinitions[journeyId]; + const firstStep = stepKeys[0]; + const settings = { + "gh-aw-workshop.profileVersion": 1, + "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + "gh-aw-workshop.profileId": profileId, + "gh-aw-workshop.tutorialBaseUrl": tutorialBaseUrl, + "gh-aw-workshop.hashFormat": hashFormat, + "gh-aw-workshop.startupCommandId": startupCommandId, + "gh-aw-workshop.launchUrl": launchUrlFor(journeyId, scenarioId, firstStep), + "gh-aw-workshop.journeyId": journeyId, + "gh-aw-workshop.scenarioId": scenarioId, + "gh-aw-workshop.workflowFile": workflowFile, + "gh-aw-workshop.stepKeys": stepKeys + }; + + const devcontainer = { + name: `gh-aw workshop: ${journey.label} / ${scenarioId}`, + image: "mcr.microsoft.com/devcontainers/universal:2", + customizations: { + vscode: { + extensions: ["GitHub.copilot", "GitHub.copilot-chat"], + settings + } + }, + postCreateCommand + }; + + const profile = { + id: profileId, + journeyId, + scenarioId, + devcontainerPath: `profiles/${profileId}/.devcontainer/devcontainer.json`, + workflowFile, + stepFiles: stepKeys.map((stepKey) => `${stepKey}.md`), + stepKeyHints: stepKeys + }; + + if (optionalStarterId) { + profile.optionalStarterId = optionalStarterId; + } + + return { profile, devcontainer }; +} + +function main() { + const workshopSteps = listWorkshopStepFiles(); + const workshopStepByKey = indexSteps(workshopSteps); + const workshopStepOrder = stepOrderIndex(workshopSteps); + const scenarioDefinitions = discoverScenarioDefinitions(workshopStepByKey); + const profiles = []; + const validProfileIds = new Set(); + + for (const [scenarioId, scenario] of Object.entries(scenarioDefinitions)) { + for (const journeyId of Object.keys(journeyDefinitions)) { + const journey = journeyDefinitions[journeyId]; + const stepKeys = + scenarioId === "foundation" + ? buildFoundationStepKeys(journey, workshopSteps, workshopStepByKey, workshopStepOrder) + : buildScenarioStepKeys(journeyId, journey, scenario, workshopSteps, workshopStepByKey, workshopStepOrder); + + if (stepKeys.length === 0) { + continue; + } + + stepKeys.forEach((stepKey) => ensureStepExists(workshopStepByKey, stepKey)); + const profileId = `${journeyId}__${scenarioId}`; + validProfileIds.add(profileId); + const { profile, devcontainer } = buildProfile( + profileId, + journeyId, + scenarioId, + scenario.workflowFile, + stepKeys, + journey.optionalStarterId + ); + profiles.push(profile); + writeJson(path.join(profilesDir, profileId, ".devcontainer", "devcontainer.json"), devcontainer); + } + } + + removeStaleProfileDirs(validProfileIds); + + writeJson(profileMapPath, { + version: 1, + generatedBy: "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", + tutorialBaseUrl, + hashFormat, + startupCommandId, + schema: { + tutorialBaseUrl: "Hosted workshop entry page for browser-based routing", + hashFormat: "URL hash contract used by the tutorial browser state", + startupCommandId: + "VS Code command palette command that should open the hosted workshop inside the integrated browser", + journeyId: "Tutorial path identifier used by the workshop browser state", + scenarioId: "Scenario identifier used by the workshop browser state", + stepKeyHints: "Workshop step keys stored in the URL hash `t` parameter that should resolve to this profile", + devcontainerPath: "Relative path to the self-contained profile folder" + }, + profiles + }); + + process.stdout.write(`Generated ${profiles.length} workshop devcontainer profiles.\n`); +} + +main(); \ No newline at end of file From b7b96852e05b11320775b6e71973cabc5668265a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:02:39 +0000 Subject: [PATCH 2/8] Use devcontainer copilot-cli feature in generated profiles Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../.devcontainer/devcontainer.json | 6 ++++-- .../scripts/generate-workshop-devcontainers.js | 9 +++++---- 17 files changed, 69 insertions(+), 36 deletions(-) diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json index b025bfd4..f8c766e8 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: codespaces terminal / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json index 7f526204..66f6c26e 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: codespaces terminal / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -28,6 +31,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json index b9ca354d..d326bd31 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: codespaces terminal / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -29,6 +32,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json index e85da450..f56817a6 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: codespaces terminal / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json index a7d3ec95..64248647 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: Copilot agent / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json index bc50e59a..b0c6f7fc 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: Copilot agent / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json index 60f1a869..0b045531 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: Copilot agent / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json index 70fd8bfc..77815110 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: Copilot agent / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json index 674aeaf0..cc804152 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: GitHub UI / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json index e3e762b2..35cd0aa7 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: GitHub UI / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -27,6 +30,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json index 31646a24..c4dba3f1 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: GitHub UI / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -27,6 +30,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json index d5624c24..a1194567 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: GitHub UI / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json index b9e64a94..c61bf5a6 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: local terminal / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json index 61d6541d..f4ba23a6 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: local terminal / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -28,6 +31,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json index 4cecb836..7a51f12c 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: local terminal / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -29,6 +32,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json index 2e66b23a..ed1b102d 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -1,6 +1,9 @@ { "name": "gh-aw workshop: local terminal / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/copilot-cli:1": {} + }, "customizations": { "vscode": { "extensions": [ @@ -26,6 +29,5 @@ ] } } - }, - "postCreateCommand": "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'" + } } diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js index 6fca0c20..7775f0f5 100644 --- a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -7,8 +7,7 @@ const path = require("node:path"); const tutorialBaseUrl = "https://github.github.com/gh-aw/workshop/"; const hashFormat = "#j=&s=&t="; const startupCommandId = "simpleBrowser.show"; -const postCreateCommand = - "bash -lc 'if command -v code >/dev/null 2>&1; then code --install-extension GitHub.copilot --force && code --install-extension GitHub.copilot-chat --force; fi'"; +const copilotCliFeatureRef = "ghcr.io/devcontainers/features/copilot-cli:1"; const workflowFileByScenario = { foundation: ".github/workflows/daily-report-status.md", "daily-status": ".github/workflows/daily-status.md", @@ -261,13 +260,15 @@ function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, const devcontainer = { name: `gh-aw workshop: ${journey.label} / ${scenarioId}`, image: "mcr.microsoft.com/devcontainers/universal:2", + features: { + [copilotCliFeatureRef]: {} + }, customizations: { vscode: { extensions: ["GitHub.copilot", "GitHub.copilot-chat"], settings } - }, - postCreateCommand + } }; const profile = { From 63599f0593e289346e15266c63074bc3b2137e48 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:07:58 +0000 Subject: [PATCH 3/8] Add GitHub CLI feature and issue/PR write permissions Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../.devcontainer/devcontainer.json | 7 ++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../.devcontainer/devcontainer.json | 15 ++++++++++++++- .../scripts/generate-workshop-devcontainers.js | 17 ++++++++++++++++- 18 files changed, 246 insertions(+), 18 deletions(-) diff --git a/workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json index b4b285bd..9333f2b2 100644 --- a/workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/actions-write/.devcontainer/devcontainer.json @@ -1,13 +1,18 @@ { "name": "gh-aw workshop (terminal triggers)", "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {} + }, "customizations": { "codespaces": { "repositories": { "YOUR-USERNAME/YOUR-REPO": { "permissions": { "actions": "write", - "workflows": "write" + "workflows": "write", + "issues": "write", + "pull_requests": "write" } } } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json index f8c766e8..5c9db0bc 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: codespaces terminal / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json index 66f6c26e..381509cf 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: codespaces terminal / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json index d326bd31..1214a489 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: codespaces terminal / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json index f56817a6..9278930d 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: codespaces terminal / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json index 64248647..9610a81a 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: Copilot agent / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json index b0c6f7fc..0f4a07e7 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: Copilot agent / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json index 0b045531..fe550c25 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: Copilot agent / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json index 77815110..815efa07 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: Copilot agent / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json index cc804152..870150b5 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: GitHub UI / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json index 35cd0aa7..99bb02c8 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: GitHub UI / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json index c4dba3f1..b7193b92 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: GitHub UI / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json index a1194567..a6b79883 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: GitHub UI / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json index c61bf5a6..6f02b02b 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: local terminal / daily-docs", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json index f4ba23a6..80900dbd 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: local terminal / daily-status", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json index 7a51f12c..e283da7c 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: local terminal / foundation", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json index ed1b102d..0ab2e67e 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -2,9 +2,22 @@ "name": "gh-aw workshop: local terminal / pr-reviewer", "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {} + "ghcr.io/devcontainers/features/copilot-cli:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} }, "customizations": { + "codespaces": { + "repositories": { + "YOUR-USERNAME/YOUR-REPO": { + "permissions": { + "actions": "write", + "workflows": "write", + "issues": "write", + "pull_requests": "write" + } + } + } + }, "vscode": { "extensions": [ "GitHub.copilot", diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js index 7775f0f5..9aa0bc9a 100644 --- a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -8,6 +8,13 @@ const tutorialBaseUrl = "https://github.github.com/gh-aw/workshop/"; const hashFormat = "#j=&s=&t="; const startupCommandId = "simpleBrowser.show"; const copilotCliFeatureRef = "ghcr.io/devcontainers/features/copilot-cli:1"; +const githubCliFeatureRef = "ghcr.io/devcontainers/features/github-cli:1"; +const repositoryPermissions = { + actions: "write", + workflows: "write", + issues: "write", + pull_requests: "write" +}; const workflowFileByScenario = { foundation: ".github/workflows/daily-report-status.md", "daily-status": ".github/workflows/daily-status.md", @@ -261,9 +268,17 @@ function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, name: `gh-aw workshop: ${journey.label} / ${scenarioId}`, image: "mcr.microsoft.com/devcontainers/universal:2", features: { - [copilotCliFeatureRef]: {} + [copilotCliFeatureRef]: {}, + [githubCliFeatureRef]: {} }, customizations: { + codespaces: { + repositories: { + "YOUR-USERNAME/YOUR-REPO": { + permissions: repositoryPermissions + } + } + }, vscode: { extensions: ["GitHub.copilot", "GitHub.copilot-chat"], settings From ce883bd7b7421011ce447176f6ff1cc7458d9471 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:21:50 +0000 Subject: [PATCH 4/8] Align generated devcontainer shape with working path example Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../.devcontainer/devcontainer.json | 24 +++++-------- .../generate-workshop-devcontainers.js | 36 +++++++++---------- 17 files changed, 145 insertions(+), 275 deletions(-) diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json index 5c9db0bc..8e973cb4 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: codespaces terminal / daily-docs", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-docs&t=10b-design-daily-docs\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json index 381509cf..a757ccb9 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: codespaces terminal / daily-status", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -44,5 +34,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-status&t=10a-design-daily-status\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json index 1214a489..19554544 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: codespaces terminal / foundation", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -45,5 +35,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=foundation&t=02a-setup-codespace\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json index 9278930d..9ccb6073 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: codespaces terminal / pr-reviewer", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=pr-reviewer&t=10c-design-pr-reviewer\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json index 9610a81a..dd528cab 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: Copilot agent / daily-docs", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-docs&t=10-choose-your-scenario\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json index 0f4a07e7..5a1d9bad 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: Copilot agent / daily-status", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-status&t=10-choose-your-scenario\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json index fe550c25..ace2dec2 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: Copilot agent / foundation", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=foundation&t=03b-create-your-repo-ui\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json index 815efa07..e3879d4c 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: Copilot agent / pr-reviewer", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=pr-reviewer&t=10-choose-your-scenario\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json index 870150b5..b604c2f2 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: GitHub UI / daily-docs", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-docs&t=10b-design-daily-docs\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json index 99bb02c8..79e034b0 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: GitHub UI / daily-status", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -43,5 +33,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-status&t=10a-design-daily-status\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json index b7193b92..dc55d918 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: GitHub UI / foundation", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -43,5 +33,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=foundation&t=03b-create-your-repo-ui\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json index a6b79883..416f9208 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: GitHub UI / pr-reviewer", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=pr-reviewer&t=10c-design-pr-reviewer\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json index 6f02b02b..866e01fa 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: local terminal / daily-docs", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-docs&t=10b-design-daily-docs\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json index 80900dbd..37719175 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: local terminal / daily-status", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -44,5 +34,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-status&t=10a-design-daily-status\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json index e283da7c..ae76248d 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: local terminal / foundation", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -45,5 +35,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=foundation&t=02b-setup-local\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json index 0ab2e67e..dc84270b 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -1,23 +1,13 @@ { "name": "gh-aw workshop: local terminal / pr-reviewer", - "image": "mcr.microsoft.com/devcontainers/universal:2", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", "features": { - "ghcr.io/devcontainers/features/copilot-cli:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "lts" + } }, "customizations": { - "codespaces": { - "repositories": { - "YOUR-USERNAME/YOUR-REPO": { - "permissions": { - "actions": "write", - "workflows": "write", - "issues": "write", - "pull_requests": "write" - } - } - } - }, "vscode": { "extensions": [ "GitHub.copilot", @@ -42,5 +32,7 @@ ] } } - } + }, + "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", + "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=pr-reviewer&t=10c-design-pr-reviewer\\n\\n\"; gh --version; node --version'" } diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js index 9aa0bc9a..677888dd 100644 --- a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -7,14 +7,10 @@ const path = require("node:path"); const tutorialBaseUrl = "https://github.github.com/gh-aw/workshop/"; const hashFormat = "#j=&s=&t="; const startupCommandId = "simpleBrowser.show"; -const copilotCliFeatureRef = "ghcr.io/devcontainers/features/copilot-cli:1"; +const devcontainerImage = "mcr.microsoft.com/devcontainers/base:ubuntu-24.04"; const githubCliFeatureRef = "ghcr.io/devcontainers/features/github-cli:1"; -const repositoryPermissions = { - actions: "write", - workflows: "write", - issues: "write", - pull_requests: "write" -}; +const nodeFeatureRef = "ghcr.io/devcontainers/features/node:1"; +const postCreateCommand = "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'"; const workflowFileByScenario = { foundation: ".github/workflows/daily-report-status.md", "daily-status": ".github/workflows/daily-status.md", @@ -228,6 +224,10 @@ function launchUrlFor(journeyId, scenarioId, stepKey) { return `${tutorialBaseUrl}#j=${journeyId}&s=${scenarioId}&t=${stepKey}`; } +function postAttachCommandFor(launchUrl) { + return `bash -lc 'printf "\\nWorkshop URL: ${launchUrl}\\n\\n"; gh --version; node --version'`; +} + function writeJson(filePath, value) { fs.mkdirSync(path.dirname(filePath), { recursive: true }); fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`); @@ -250,6 +250,7 @@ function removeStaleProfileDirs(validProfileIds) { function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, optionalStarterId) { const journey = journeyDefinitions[journeyId]; const firstStep = stepKeys[0]; + const launchUrl = launchUrlFor(journeyId, scenarioId, firstStep); const settings = { "gh-aw-workshop.profileVersion": 1, "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", @@ -257,7 +258,7 @@ function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, "gh-aw-workshop.tutorialBaseUrl": tutorialBaseUrl, "gh-aw-workshop.hashFormat": hashFormat, "gh-aw-workshop.startupCommandId": startupCommandId, - "gh-aw-workshop.launchUrl": launchUrlFor(journeyId, scenarioId, firstStep), + "gh-aw-workshop.launchUrl": launchUrl, "gh-aw-workshop.journeyId": journeyId, "gh-aw-workshop.scenarioId": scenarioId, "gh-aw-workshop.workflowFile": workflowFile, @@ -266,24 +267,21 @@ function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, const devcontainer = { name: `gh-aw workshop: ${journey.label} / ${scenarioId}`, - image: "mcr.microsoft.com/devcontainers/universal:2", + image: devcontainerImage, features: { - [copilotCliFeatureRef]: {}, - [githubCliFeatureRef]: {} + [githubCliFeatureRef]: {}, + [nodeFeatureRef]: { + version: "lts" + } }, customizations: { - codespaces: { - repositories: { - "YOUR-USERNAME/YOUR-REPO": { - permissions: repositoryPermissions - } - } - }, vscode: { extensions: ["GitHub.copilot", "GitHub.copilot-chat"], settings } - } + }, + postCreateCommand, + postAttachCommand: postAttachCommandFor(launchUrl) }; const profile = { From 08a8e43285a09bd164ccaa0462baf805281b3367 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:22:52 +0000 Subject: [PATCH 5/8] Escape launch URL in generated post-attach command Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../github-ui__daily-docs/.devcontainer/devcontainer.json | 2 +- .../github-ui__daily-status/.devcontainer/devcontainer.json | 2 +- .../github-ui__foundation/.devcontainer/devcontainer.json | 2 +- .../github-ui__pr-reviewer/.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../scripts/generate-workshop-devcontainers.js | 6 +++++- 17 files changed, 21 insertions(+), 17 deletions(-) diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json index 8e973cb4..6af95a56 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-docs&t=10b-design-daily-docs\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-docs&t=10b-design-daily-docs'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json index a757ccb9..ad3ead2e 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json @@ -36,5 +36,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-status&t=10a-design-daily-status\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-status&t=10a-design-daily-status'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json index 19554544..02748fcc 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json @@ -37,5 +37,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=foundation&t=02a-setup-codespace\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=foundation&t=02a-setup-codespace'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json index 9ccb6073..c3af5971 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=pr-reviewer&t=10c-design-pr-reviewer\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=pr-reviewer&t=10c-design-pr-reviewer'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json index dd528cab..403edd68 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-docs&t=10-choose-your-scenario\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-docs&t=10-choose-your-scenario'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json index 5a1d9bad..f5770607 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-status&t=10-choose-your-scenario\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-status&t=10-choose-your-scenario'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json index ace2dec2..b1cc4418 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=foundation&t=03b-create-your-repo-ui\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=foundation&t=03b-create-your-repo-ui'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json index e3879d4c..8e59a327 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=pr-reviewer&t=10-choose-your-scenario\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=pr-reviewer&t=10-choose-your-scenario'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json index b604c2f2..43fa16a8 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-docs&t=10b-design-daily-docs\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-docs&t=10b-design-daily-docs'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json index 79e034b0..fc1341fb 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json @@ -35,5 +35,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-status&t=10a-design-daily-status\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-status&t=10a-design-daily-status'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json index dc55d918..35de6264 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json @@ -35,5 +35,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=foundation&t=03b-create-your-repo-ui\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=foundation&t=03b-create-your-repo-ui'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json index 416f9208..b3ad86b7 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=github-ui&s=pr-reviewer&t=10c-design-pr-reviewer\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=pr-reviewer&t=10c-design-pr-reviewer'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json index 866e01fa..47893e59 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-docs&t=10b-design-daily-docs\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-docs&t=10b-design-daily-docs'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json index 37719175..db6f26b2 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json @@ -36,5 +36,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-status&t=10a-design-daily-status\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-status&t=10a-design-daily-status'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json index ae76248d..6d872d9c 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json @@ -37,5 +37,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=foundation&t=02b-setup-local\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=foundation&t=02b-setup-local'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json index dc84270b..e0ec8ae9 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc 'printf \"\\nWorkshop URL: https://github.github.com/gh-aw/workshop/#j=local-terminal&s=pr-reviewer&t=10c-design-pr-reviewer\\n\\n\"; gh --version; node --version'" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=pr-reviewer&t=10c-design-pr-reviewer'; gh --version; node --version\"" } diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js index 677888dd..37384a43 100644 --- a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -224,8 +224,12 @@ function launchUrlFor(journeyId, scenarioId, stepKey) { return `${tutorialBaseUrl}#j=${journeyId}&s=${scenarioId}&t=${stepKey}`; } +function shellSingleQuoted(value) { + return `'${String(value).replace(/'/g, `'\"'\"'`)}'`; +} + function postAttachCommandFor(launchUrl) { - return `bash -lc 'printf "\\nWorkshop URL: ${launchUrl}\\n\\n"; gh --version; node --version'`; + return `bash -lc "printf '\\nWorkshop URL: %s\\n\\n' ${shellSingleQuoted(launchUrl)}; gh --version; node --version"`; } function writeJson(filePath, value) { From ead281c5f0effd442044813f8cd94f170540f788 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Jul 2026 12:24:00 +0000 Subject: [PATCH 6/8] Pass launch URL as positional shell arg Co-authored-by: mnkiefer <8320933+mnkiefer@users.noreply.github.com> --- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../copilot-agent__daily-docs/.devcontainer/devcontainer.json | 2 +- .../copilot-agent__daily-status/.devcontainer/devcontainer.json | 2 +- .../copilot-agent__foundation/.devcontainer/devcontainer.json | 2 +- .../copilot-agent__pr-reviewer/.devcontainer/devcontainer.json | 2 +- .../github-ui__daily-docs/.devcontainer/devcontainer.json | 2 +- .../github-ui__daily-status/.devcontainer/devcontainer.json | 2 +- .../github-ui__foundation/.devcontainer/devcontainer.json | 2 +- .../github-ui__pr-reviewer/.devcontainer/devcontainer.json | 2 +- .../local-terminal__daily-docs/.devcontainer/devcontainer.json | 2 +- .../.devcontainer/devcontainer.json | 2 +- .../local-terminal__foundation/.devcontainer/devcontainer.json | 2 +- .../local-terminal__pr-reviewer/.devcontainer/devcontainer.json | 2 +- .../devcontainers/scripts/generate-workshop-devcontainers.js | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json index 6af95a56..d2cfe13d 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-docs&t=10b-design-daily-docs'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-docs&t=10b-design-daily-docs'" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json index ad3ead2e..74c9eb6b 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json @@ -36,5 +36,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-status&t=10a-design-daily-status'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-status&t=10a-design-daily-status'" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json index 02748fcc..cf304611 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json @@ -37,5 +37,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=foundation&t=02a-setup-codespace'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=foundation&t=02a-setup-codespace'" } diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json index c3af5971..427fa83d 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=pr-reviewer&t=10c-design-pr-reviewer'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=pr-reviewer&t=10c-design-pr-reviewer'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json index 403edd68..ba6d05ce 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-docs&t=10-choose-your-scenario'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-docs&t=10-choose-your-scenario'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json index f5770607..03849919 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-status&t=10-choose-your-scenario'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-status&t=10-choose-your-scenario'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json index b1cc4418..4aa67820 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=foundation&t=03b-create-your-repo-ui'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=foundation&t=03b-create-your-repo-ui'" } diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json index 8e59a327..19b8eda8 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=pr-reviewer&t=10-choose-your-scenario'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=pr-reviewer&t=10-choose-your-scenario'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json index 43fa16a8..9719873a 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-docs&t=10b-design-daily-docs'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-docs&t=10b-design-daily-docs'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json index fc1341fb..9257e28c 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json @@ -35,5 +35,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-status&t=10a-design-daily-status'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-status&t=10a-design-daily-status'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json index 35de6264..3aba5be6 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json @@ -35,5 +35,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=foundation&t=03b-create-your-repo-ui'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=foundation&t=03b-create-your-repo-ui'" } diff --git a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json index b3ad86b7..0e4e81dc 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=pr-reviewer&t=10c-design-pr-reviewer'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=github-ui&s=pr-reviewer&t=10c-design-pr-reviewer'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json index 47893e59..6134dbe9 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-docs&t=10b-design-daily-docs'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-docs&t=10b-design-daily-docs'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json index db6f26b2..7353c6b2 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json @@ -36,5 +36,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-status&t=10a-design-daily-status'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-status&t=10a-design-daily-status'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json index 6d872d9c..217716ff 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json @@ -37,5 +37,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=foundation&t=02b-setup-local'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=foundation&t=02b-setup-local'" } diff --git a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json index e0ec8ae9..54c38b91 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -34,5 +34,5 @@ } }, "postCreateCommand": "bash -lc 'gh extension install github/gh-copilot --force && npm install -g @github/copilot@latest'", - "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=pr-reviewer&t=10c-design-pr-reviewer'; gh --version; node --version\"" + "postAttachCommand": "bash -lc \"printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version\" -- 'https://github.github.com/gh-aw/workshop/#j=local-terminal&s=pr-reviewer&t=10c-design-pr-reviewer'" } diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js index 37384a43..f3c085f6 100644 --- a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -229,7 +229,7 @@ function shellSingleQuoted(value) { } function postAttachCommandFor(launchUrl) { - return `bash -lc "printf '\\nWorkshop URL: %s\\n\\n' ${shellSingleQuoted(launchUrl)}; gh --version; node --version"`; + return `bash -lc "printf '\\nWorkshop URL: %s\\n\\n' \"\\$1\"; gh --version; node --version" -- ${shellSingleQuoted(launchUrl)}`; } function writeJson(filePath, value) { From 3ff93f22f086d38fa372c79bfb54fd0ce2098f22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 08:22:22 +0000 Subject: [PATCH 7/8] Merge main and align devcontainer metadata with journey/adventure frontmatter Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../examples/devcontainers/profile-map.json | 132 ++++++++++++++++++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 9 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 8 ++ .../.devcontainer/devcontainer.json | 9 ++ .../.devcontainer/devcontainer.json | 8 ++ .../generate-workshop-devcontainers.js | 37 ++++- 18 files changed, 296 insertions(+), 3 deletions(-) diff --git a/workshop/examples/devcontainers/profile-map.json b/workshop/examples/devcontainers/profile-map.json index 9519624a..14e1e77e 100644 --- a/workshop/examples/devcontainers/profile-map.json +++ b/workshop/examples/devcontainers/profile-map.json @@ -10,6 +10,8 @@ "startupCommandId": "VS Code command palette command that should open the hosted workshop inside the integrated browser", "journeyId": "Tutorial path identifier used by the workshop browser state", "scenarioId": "Scenario identifier used by the workshop browser state", + "journeys": "Unique set of `journey` frontmatter values present in the mapped workshop steps", + "adventures": "Unique set of `adventure` frontmatter values present in the mapped workshop steps", "stepKeyHints": "Workshop step keys stored in the URL hash `t` parameter that should resolve to this profile", "devcontainerPath": "Relative path to the self-contained profile folder" }, @@ -18,6 +20,15 @@ "id": "codespaces-terminal__foundation", "journeyId": "codespaces-terminal", "scenarioId": "foundation", + "journeys": [ + "all", + "codespace", + "terminal" + ], + "adventures": [ + "core", + "setup" + ], "devcontainerPath": "profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-report-status.md", "stepFiles": [ @@ -44,6 +55,15 @@ "id": "local-terminal__foundation", "journeyId": "local-terminal", "scenarioId": "foundation", + "journeys": [ + "all", + "local", + "terminal" + ], + "adventures": [ + "core", + "setup" + ], "devcontainerPath": "profiles/local-terminal__foundation/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-report-status.md", "stepFiles": [ @@ -69,6 +89,14 @@ "id": "github-ui__foundation", "journeyId": "github-ui", "scenarioId": "foundation", + "journeys": [ + "all", + "ui" + ], + "adventures": [ + "core", + "setup" + ], "devcontainerPath": "profiles/github-ui__foundation/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-report-status.md", "stepFiles": [ @@ -90,6 +118,14 @@ "id": "copilot-agent__foundation", "journeyId": "copilot-agent", "scenarioId": "foundation", + "journeys": [ + "all", + "copilot", + "ui" + ], + "adventures": [ + "core" + ], "devcontainerPath": "profiles/copilot-agent__foundation/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-report-status.md", "stepFiles": [ @@ -109,6 +145,14 @@ "id": "codespaces-terminal__daily-status", "journeyId": "codespaces-terminal", "scenarioId": "daily-status", + "journeys": [ + "all", + "terminal" + ], + "adventures": [ + "core", + "scenario-a" + ], "devcontainerPath": "profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-status.md", "stepFiles": [ @@ -133,6 +177,14 @@ "id": "local-terminal__daily-status", "journeyId": "local-terminal", "scenarioId": "daily-status", + "journeys": [ + "all", + "terminal" + ], + "adventures": [ + "core", + "scenario-a" + ], "devcontainerPath": "profiles/local-terminal__daily-status/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-status.md", "stepFiles": [ @@ -156,6 +208,14 @@ "id": "github-ui__daily-status", "journeyId": "github-ui", "scenarioId": "daily-status", + "journeys": [ + "all", + "ui" + ], + "adventures": [ + "core", + "scenario-a" + ], "devcontainerPath": "profiles/github-ui__daily-status/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-status.md", "stepFiles": [ @@ -177,6 +237,14 @@ "id": "copilot-agent__daily-status", "journeyId": "copilot-agent", "scenarioId": "daily-status", + "journeys": [ + "all", + "copilot" + ], + "adventures": [ + "core", + "scenario-d" + ], "devcontainerPath": "profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-status.md", "stepFiles": [ @@ -196,6 +264,14 @@ "id": "codespaces-terminal__daily-docs", "journeyId": "codespaces-terminal", "scenarioId": "daily-docs", + "journeys": [ + "all", + "terminal" + ], + "adventures": [ + "core", + "scenario-b" + ], "devcontainerPath": "profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-docs.md", "stepFiles": [ @@ -216,6 +292,14 @@ "id": "local-terminal__daily-docs", "journeyId": "local-terminal", "scenarioId": "daily-docs", + "journeys": [ + "all", + "terminal" + ], + "adventures": [ + "core", + "scenario-b" + ], "devcontainerPath": "profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-docs.md", "stepFiles": [ @@ -235,6 +319,14 @@ "id": "github-ui__daily-docs", "journeyId": "github-ui", "scenarioId": "daily-docs", + "journeys": [ + "all", + "ui" + ], + "adventures": [ + "core", + "scenario-b" + ], "devcontainerPath": "profiles/github-ui__daily-docs/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-docs.md", "stepFiles": [ @@ -254,6 +346,14 @@ "id": "copilot-agent__daily-docs", "journeyId": "copilot-agent", "scenarioId": "daily-docs", + "journeys": [ + "all", + "copilot" + ], + "adventures": [ + "core", + "scenario-d" + ], "devcontainerPath": "profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/daily-docs.md", "stepFiles": [ @@ -273,6 +373,14 @@ "id": "codespaces-terminal__pr-reviewer", "journeyId": "codespaces-terminal", "scenarioId": "pr-reviewer", + "journeys": [ + "all", + "terminal" + ], + "adventures": [ + "core", + "scenario-c" + ], "devcontainerPath": "profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/pr-code-reviewer.md", "stepFiles": [ @@ -293,6 +401,14 @@ "id": "local-terminal__pr-reviewer", "journeyId": "local-terminal", "scenarioId": "pr-reviewer", + "journeys": [ + "all", + "terminal" + ], + "adventures": [ + "core", + "scenario-c" + ], "devcontainerPath": "profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/pr-code-reviewer.md", "stepFiles": [ @@ -312,6 +428,14 @@ "id": "github-ui__pr-reviewer", "journeyId": "github-ui", "scenarioId": "pr-reviewer", + "journeys": [ + "all", + "ui" + ], + "adventures": [ + "core", + "scenario-c" + ], "devcontainerPath": "profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/pr-code-reviewer.md", "stepFiles": [ @@ -331,6 +455,14 @@ "id": "copilot-agent__pr-reviewer", "journeyId": "copilot-agent", "scenarioId": "pr-reviewer", + "journeys": [ + "all", + "copilot" + ], + "adventures": [ + "core", + "scenario-d" + ], "devcontainerPath": "profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json", "workflowFile": ".github/workflows/pr-code-reviewer.md", "stepFiles": [ diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json index d2cfe13d..13e69413 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-docs/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-docs&t=10b-design-daily-docs", "gh-aw-workshop.journeyId": "codespaces-terminal", "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.journeys": [ + "all", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-b" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", "gh-aw-workshop.stepKeys": [ "10b-design-daily-docs", diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json index 74c9eb6b..b1c98a2d 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__daily-status/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=daily-status&t=10a-design-daily-status", "gh-aw-workshop.journeyId": "codespaces-terminal", "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.journeys": [ + "all", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-a" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", "gh-aw-workshop.stepKeys": [ "10a-design-daily-status", diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json index cf304611..5dbeb0a8 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__foundation/.devcontainer/devcontainer.json @@ -23,6 +23,15 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=foundation&t=02a-setup-codespace", "gh-aw-workshop.journeyId": "codespaces-terminal", "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.journeys": [ + "all", + "codespace", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "setup" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", "gh-aw-workshop.stepKeys": [ "02a-setup-codespace", diff --git a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json index 427fa83d..30692a94 100644 --- a/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/codespaces-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=codespaces-terminal&s=pr-reviewer&t=10c-design-pr-reviewer", "gh-aw-workshop.journeyId": "codespaces-terminal", "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.journeys": [ + "all", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-c" + ], "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", "gh-aw-workshop.stepKeys": [ "10c-design-pr-reviewer", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json index ba6d05ce..f8821b83 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-docs/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-docs&t=10-choose-your-scenario", "gh-aw-workshop.journeyId": "copilot-agent", "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.journeys": [ + "all", + "copilot" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-d" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", "gh-aw-workshop.stepKeys": [ "10-choose-your-scenario", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json index 03849919..a0bb5c5e 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__daily-status/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=daily-status&t=10-choose-your-scenario", "gh-aw-workshop.journeyId": "copilot-agent", "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.journeys": [ + "all", + "copilot" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-d" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", "gh-aw-workshop.stepKeys": [ "10-choose-your-scenario", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json index 4aa67820..9f798e1c 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__foundation/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=foundation&t=03b-create-your-repo-ui", "gh-aw-workshop.journeyId": "copilot-agent", "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.journeys": [ + "all", + "copilot", + "ui" + ], + "gh-aw-workshop.adventures": [ + "core" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", "gh-aw-workshop.stepKeys": [ "03b-create-your-repo-ui", diff --git a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json index 19b8eda8..6bc77e5b 100644 --- a/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/copilot-agent__pr-reviewer/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=copilot-agent&s=pr-reviewer&t=10-choose-your-scenario", "gh-aw-workshop.journeyId": "copilot-agent", "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.journeys": [ + "all", + "copilot" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-d" + ], "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", "gh-aw-workshop.stepKeys": [ "10-choose-your-scenario", diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json index 9719873a..7819cd3e 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-docs/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-docs&t=10b-design-daily-docs", "gh-aw-workshop.journeyId": "github-ui", "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.journeys": [ + "all", + "ui" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-b" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", "gh-aw-workshop.stepKeys": [ "10b-design-daily-docs", diff --git a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json index 9257e28c..6d9c818f 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__daily-status/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=daily-status&t=10a-design-daily-status", "gh-aw-workshop.journeyId": "github-ui", "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.journeys": [ + "all", + "ui" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-a" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", "gh-aw-workshop.stepKeys": [ "10a-design-daily-status", diff --git a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json index 3aba5be6..1af79245 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__foundation/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=foundation&t=03b-create-your-repo-ui", "gh-aw-workshop.journeyId": "github-ui", "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.journeys": [ + "all", + "ui" + ], + "gh-aw-workshop.adventures": [ + "core", + "setup" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", "gh-aw-workshop.stepKeys": [ "03b-create-your-repo-ui", diff --git a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json index 0e4e81dc..527bf220 100644 --- a/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/github-ui__pr-reviewer/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=github-ui&s=pr-reviewer&t=10c-design-pr-reviewer", "gh-aw-workshop.journeyId": "github-ui", "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.journeys": [ + "all", + "ui" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-c" + ], "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", "gh-aw-workshop.stepKeys": [ "10c-design-pr-reviewer", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json index 6134dbe9..b7574b5d 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-docs/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-docs&t=10b-design-daily-docs", "gh-aw-workshop.journeyId": "local-terminal", "gh-aw-workshop.scenarioId": "daily-docs", + "gh-aw-workshop.journeys": [ + "all", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-b" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-docs.md", "gh-aw-workshop.stepKeys": [ "10b-design-daily-docs", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json index 7353c6b2..0ff68ce8 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__daily-status/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=daily-status&t=10a-design-daily-status", "gh-aw-workshop.journeyId": "local-terminal", "gh-aw-workshop.scenarioId": "daily-status", + "gh-aw-workshop.journeys": [ + "all", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-a" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-status.md", "gh-aw-workshop.stepKeys": [ "10a-design-daily-status", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json index 217716ff..f0460ec4 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__foundation/.devcontainer/devcontainer.json @@ -23,6 +23,15 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=foundation&t=02b-setup-local", "gh-aw-workshop.journeyId": "local-terminal", "gh-aw-workshop.scenarioId": "foundation", + "gh-aw-workshop.journeys": [ + "all", + "local", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "setup" + ], "gh-aw-workshop.workflowFile": ".github/workflows/daily-report-status.md", "gh-aw-workshop.stepKeys": [ "02b-setup-local", diff --git a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json index 54c38b91..19674cdf 100644 --- a/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json +++ b/workshop/examples/devcontainers/profiles/local-terminal__pr-reviewer/.devcontainer/devcontainer.json @@ -23,6 +23,14 @@ "gh-aw-workshop.launchUrl": "https://github.github.com/gh-aw/workshop/#j=local-terminal&s=pr-reviewer&t=10c-design-pr-reviewer", "gh-aw-workshop.journeyId": "local-terminal", "gh-aw-workshop.scenarioId": "pr-reviewer", + "gh-aw-workshop.journeys": [ + "all", + "terminal" + ], + "gh-aw-workshop.adventures": [ + "core", + "scenario-c" + ], "gh-aw-workshop.workflowFile": ".github/workflows/pr-code-reviewer.md", "gh-aw-workshop.stepKeys": [ "10c-design-pr-reviewer", diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js index f3c085f6..5dc5927d 100644 --- a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -70,6 +70,23 @@ function toStem(fileName) { return fileName.replace(/\.md$/i, ""); } +function parseWorkshopFrontmatter(filePath) { + const content = fs.readFileSync(filePath, "utf8"); + const frontmatterMatch = /^---\n([\s\S]*?)\n---/m.exec(content); + if (!frontmatterMatch) { + return {}; + } + + const metadata = {}; + for (const line of frontmatterMatch[1].split("\n")) { + const match = /^\s*([a-zA-Z][\w-]*)\s*:\s*(.+?)\s*$/.exec(line); + if (match) { + metadata[match[1]] = match[2]; + } + } + return metadata; +} + function listWorkshopStepFiles() { const readmePath = path.join(workshopDir, "README.md"); const collator = new Intl.Collator("en", { numeric: true, sensitivity: "base" }); @@ -84,7 +101,8 @@ function listWorkshopStepFiles() { ) .map((entry) => ({ file: entry.name, - stepKey: toStem(entry.name) + stepKey: toStem(entry.name), + ...parseWorkshopFrontmatter(path.join(workshopDir, entry.name)) })); const defaultOrder = [...fileEntries].sort((left, right) => collator.compare(left.file, right.file)); @@ -251,10 +269,16 @@ function removeStaleProfileDirs(validProfileIds) { } } -function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, optionalStarterId) { +function metadataValues(stepKeys, stepByKey, field) { + return [...new Set(stepKeys.map((stepKey) => stepByKey.get(stepKey)?.[field]).filter(Boolean))].sort(); +} + +function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, optionalStarterId, stepByKey) { const journey = journeyDefinitions[journeyId]; const firstStep = stepKeys[0]; const launchUrl = launchUrlFor(journeyId, scenarioId, firstStep); + const journeys = metadataValues(stepKeys, stepByKey, "journey"); + const adventures = metadataValues(stepKeys, stepByKey, "adventure"); const settings = { "gh-aw-workshop.profileVersion": 1, "gh-aw-workshop.generatedBy": "workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js", @@ -265,6 +289,8 @@ function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, "gh-aw-workshop.launchUrl": launchUrl, "gh-aw-workshop.journeyId": journeyId, "gh-aw-workshop.scenarioId": scenarioId, + "gh-aw-workshop.journeys": journeys, + "gh-aw-workshop.adventures": adventures, "gh-aw-workshop.workflowFile": workflowFile, "gh-aw-workshop.stepKeys": stepKeys }; @@ -292,6 +318,8 @@ function buildProfile(profileId, journeyId, scenarioId, workflowFile, stepKeys, id: profileId, journeyId, scenarioId, + journeys, + adventures, devcontainerPath: `profiles/${profileId}/.devcontainer/devcontainer.json`, workflowFile, stepFiles: stepKeys.map((stepKey) => `${stepKey}.md`), @@ -334,7 +362,8 @@ function main() { scenarioId, scenario.workflowFile, stepKeys, - journey.optionalStarterId + journey.optionalStarterId, + workshopStepByKey ); profiles.push(profile); writeJson(path.join(profilesDir, profileId, ".devcontainer", "devcontainer.json"), devcontainer); @@ -356,6 +385,8 @@ function main() { "VS Code command palette command that should open the hosted workshop inside the integrated browser", journeyId: "Tutorial path identifier used by the workshop browser state", scenarioId: "Scenario identifier used by the workshop browser state", + journeys: "Unique set of `journey` frontmatter values present in the mapped workshop steps", + adventures: "Unique set of `adventure` frontmatter values present in the mapped workshop steps", stepKeyHints: "Workshop step keys stored in the URL hash `t` parameter that should resolve to this profile", devcontainerPath: "Relative path to the self-contained profile folder" }, From 06b455adee40f70bf8687d966b5cbed4ec06633d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 08:24:06 +0000 Subject: [PATCH 8/8] Refine frontmatter parsing for journey and adventure metadata Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../generate-workshop-devcontainers.js | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js index 5dc5927d..5791dd58 100644 --- a/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js +++ b/workshop/examples/devcontainers/scripts/generate-workshop-devcontainers.js @@ -77,14 +77,19 @@ function parseWorkshopFrontmatter(filePath) { return {}; } - const metadata = {}; - for (const line of frontmatterMatch[1].split("\n")) { - const match = /^\s*([a-zA-Z][\w-]*)\s*:\s*(.+?)\s*$/.exec(line); - if (match) { - metadata[match[1]] = match[2]; - } - } - return metadata; + const normalizeScalar = (value) => { + const trimmed = value.trim(); + const quotedMatch = /^(["'])([\s\S]*)\1$/.exec(trimmed); + return quotedMatch ? quotedMatch[2] : trimmed; + }; + + const journeyMatch = /^\s*journey\s*:\s*(.+?)\s*$/m.exec(frontmatterMatch[1]); + const adventureMatch = /^\s*adventure\s*:\s*(.+?)\s*$/m.exec(frontmatterMatch[1]); + + return { + ...(journeyMatch ? { journey: normalizeScalar(journeyMatch[1]) } : {}), + ...(adventureMatch ? { adventure: normalizeScalar(adventureMatch[1]) } : {}) + }; } function listWorkshopStepFiles() {