-
Notifications
You must be signed in to change notification settings - Fork 0
feat: install Copilot CLI + seed MCP (WDIO) #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
ad2a7e3
165fb4d
5e8fb5c
ff19d4d
29bfb9b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -133,6 +133,61 @@ Each script should support: | |
|
|
||
| --- | ||
|
|
||
| ## 🤖 Copilot CLI + MCP (opt-in) | ||
|
|
||
| This image can optionally install GitHub Copilot CLI and seed a CLI-level MCP config for WebdriverIO MCP. | ||
|
|
||
| ### Enable during build | ||
|
|
||
| Use build args (recommended) to enable the install and seed the MCP config: | ||
|
|
||
| ```bash | ||
| COPILOT_CLI_ENABLED=true \ | ||
| COPILOT_CLI_MCP_SEED=true \ | ||
| docker compose -f docker-compose.yml up --build | ||
| ``` | ||
|
Comment on lines
+142
to
+148
|
||
|
|
||
| Optional build flags: | ||
|
|
||
| - `COPILOT_CLI_INSTALL_METHOD` = `auto` | `script` | `npm` | ||
| - `COPILOT_CLI_VERSION` = specific version (optional) | ||
| - `COPILOT_CLI_PREFIX` = install prefix (default `/usr/local`) | ||
| - `BROWSERS_ENABLED=true` to install Chromium for MCP browser automation | ||
netzulo marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ### MCP seed template | ||
|
|
||
| The template lives at [src/copilot/mcp-config.json](src/copilot/mcp-config.json) and is copied to: | ||
|
|
||
| ``` | ||
| ~/.copilot/mcp-config.json | ||
| ``` | ||
|
|
||
| ### Authenticate and verify | ||
|
|
||
| Inside the container: | ||
|
|
||
| ```bash | ||
| copilot --version | ||
| copilot | ||
| ``` | ||
|
|
||
| If prompted, run `/login` and follow the instructions. You can also set `GH_TOKEN` or `GITHUB_TOKEN`. | ||
|
|
||
| ### Minimal demo (headless browser + screenshot) | ||
|
|
||
| With MCP seeded and browsers enabled, run a simple flow from Copilot CLI: | ||
|
|
||
| 1. Start a session | ||
| 2. Navigate to a URL | ||
| 3. Take a screenshot | ||
| 4. Close the session | ||
|
|
||
| Example prompt to Copilot CLI: | ||
|
|
||
| "Use wdio-mcp to open a headless browser, navigate to https://example.com, take a screenshot at /workspace/example.png, then close the session." | ||
|
|
||
| --- | ||
|
|
||
| --- | ||
|
|
||
| ## 📄 Roadmap | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,6 +3,13 @@ services: | |
| build: | ||
| context: . | ||
| dockerfile: Dockerfile | ||
| args: | ||
| COPILOT_CLI_ENABLED: "${COPILOT_CLI_ENABLED:-false}" | ||
| COPILOT_CLI_MCP_SEED: "${COPILOT_CLI_MCP_SEED:-false}" | ||
| COPILOT_CLI_INSTALL_METHOD: "${COPILOT_CLI_INSTALL_METHOD:-auto}" | ||
| COPILOT_CLI_VERSION: "${COPILOT_CLI_VERSION:-}" | ||
| COPILOT_CLI_PREFIX: "${COPILOT_CLI_PREFIX:-/usr/local}" | ||
| BROWSERS_ENABLED: "${BROWSERS_ENABLED:-false}" | ||
| container_name: aw-dev-node | ||
| ports: | ||
| - "${VSCODE_PORT:-8443}:${VSCODE_PORT:-8443}" | ||
|
|
@@ -18,6 +25,12 @@ services: | |
| OPENAI_API_KEY: "${OPENAI_API_KEY}" | ||
| OPENAI_MODEL: "${OPENAI_MODEL}" | ||
| GITLAB_PERSONAL_ACCESS_TOKEN: "${GITLAB_PERSONAL_ACCESS_TOKEN}" | ||
| COPILOT_CLI_ENABLED: "${COPILOT_CLI_ENABLED:-false}" | ||
| COPILOT_CLI_MCP_SEED: "${COPILOT_CLI_MCP_SEED:-false}" | ||
| COPILOT_CLI_INSTALL_METHOD: "${COPILOT_CLI_INSTALL_METHOD:-auto}" | ||
| COPILOT_CLI_VERSION: "${COPILOT_CLI_VERSION:-}" | ||
| COPILOT_CLI_PREFIX: "${COPILOT_CLI_PREFIX:-/usr/local}" | ||
| BROWSERS_ENABLED: "${BROWSERS_ENABLED:-false}" | ||
|
Comment on lines
+20
to
+25
|
||
| volumes: | ||
| - ./src/workspace:/workspace | ||
| tty: true | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| { | ||
| "mcpServers": { | ||
| "wdio-mcp": { | ||
| "type": "stdio", | ||
| "command": "npx", | ||
| "args": ["-y", "@wdio/mcp"], | ||
netzulo marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| "tools": [ | ||
| "start_browser", | ||
| "navigate", | ||
| "get_visible_elements", | ||
| "click_element", | ||
| "set_value", | ||
| "scroll", | ||
| "take_screenshot", | ||
| "close_session" | ||
| ] | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| #!/usr/bin/env bash | ||
| set -euo pipefail | ||
|
|
||
| echo "Installing browser runtime (opt-in)" | ||
|
|
||
| : "${BROWSERS_ENABLED:=false}" | ||
|
|
||
| if [[ "${BROWSERS_ENABLED}" != "true" ]]; then | ||
| echo "BROWSERS_ENABLED is not true; skipping browser install." | ||
| exit 0 | ||
| fi | ||
|
|
||
| apt-get update | ||
|
|
||
| # Try Chromium first; fall back between package names across distros | ||
| if ! apt-get install -y --no-install-recommends \ | ||
| chromium-browser \ | ||
| libnss3 \ | ||
| libatk-bridge2.0-0 \ | ||
| libgtk-3-0 \ | ||
| libx11-xcb1 \ | ||
| libxcomposite1 \ | ||
| libxdamage1 \ | ||
| libxrandr2 \ | ||
| libgbm1 \ | ||
| libasound2 \ | ||
| fonts-liberation; then | ||
| apt-get install -y --no-install-recommends \ | ||
| chromium \ | ||
| libnss3 \ | ||
| libatk-bridge2.0-0 \ | ||
| libgtk-3-0 \ | ||
| libx11-xcb1 \ | ||
| libxcomposite1 \ | ||
| libxdamage1 \ | ||
| libxrandr2 \ | ||
| libgbm1 \ | ||
| libasound2 \ | ||
| fonts-liberation | ||
| fi | ||
|
|
||
| apt-get clean && rm -rf /var/lib/apt/lists/* | ||
|
|
||
| if command -v chromium-browser >/dev/null 2>&1; then | ||
| echo "Chromium installed: $(chromium-browser --version || true)" | ||
| elif command -v chromium >/dev/null 2>&1; then | ||
| echo "Chromium installed: $(chromium --version || true)" | ||
| else | ||
| echo "Browser install completed, but no Chromium binary found on PATH." >&2 | ||
netzulo marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| fi | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| #!/usr/bin/env bash | ||
| set -euo pipefail | ||
|
|
||
| echo "Installing GitHub Copilot CLI (opt-in)" | ||
|
|
||
| : "${COPILOT_CLI_ENABLED:=false}" | ||
| : "${COPILOT_CLI_INSTALL_METHOD:=auto}" | ||
| : "${COPILOT_CLI_INSTALL_URL:=https://gh.io/copilot-install}" | ||
| : "${COPILOT_CLI_PREFIX:=/usr/local}" | ||
| : "${COPILOT_CLI_VERSION:=}" | ||
| : "${COPILOT_CLI_MCP_SEED:=false}" | ||
| : "${COPILOT_CLI_MCP_CONFIG_TEMPLATE:=/opt/copilot/mcp-config.json}" | ||
| : "${COPILOT_CLI_MCP_CONFIG_PATH:=/root/.copilot/mcp-config.json}" | ||
|
|
||
|
Comment on lines
+14
to
+15
|
||
| if [[ "${COPILOT_CLI_ENABLED}" != "true" ]]; then | ||
| echo "COPILOT_CLI_ENABLED is not true; skipping Copilot CLI installation." | ||
| exit 0 | ||
| fi | ||
|
|
||
| install_via_script() { | ||
| echo "Installing Copilot CLI via official install script..." | ||
| if [[ -n "${COPILOT_CLI_VERSION}" ]]; then | ||
| curl -fsSL "${COPILOT_CLI_INSTALL_URL}" | VERSION="${COPILOT_CLI_VERSION}" PREFIX="${COPILOT_CLI_PREFIX}" bash | ||
| else | ||
| curl -fsSL "${COPILOT_CLI_INSTALL_URL}" | PREFIX="${COPILOT_CLI_PREFIX}" bash | ||
netzulo marked this conversation as resolved.
Show resolved
Hide resolved
Comment on lines
+24
to
+26
|
||
| fi | ||
| } | ||
|
|
||
| install_via_npm() { | ||
| echo "Installing Copilot CLI via npm..." | ||
| if ! command -v npm >/dev/null 2>&1; then | ||
| echo "npm not found; cannot install Copilot CLI via npm." >&2 | ||
| return 1 | ||
| fi | ||
| if [[ -n "${COPILOT_CLI_VERSION}" ]]; then | ||
| npm install -g "@github/copilot@${COPILOT_CLI_VERSION}" | ||
| else | ||
| npm install -g @github/copilot | ||
| fi | ||
| } | ||
|
|
||
| if [[ "${COPILOT_CLI_INSTALL_METHOD}" == "script" ]]; then | ||
| install_via_script | ||
| elif [[ "${COPILOT_CLI_INSTALL_METHOD}" == "npm" ]]; then | ||
| install_via_npm | ||
| else | ||
| install_via_script || install_via_npm | ||
| fi | ||
|
|
||
| if command -v copilot >/dev/null 2>&1; then | ||
| echo "Copilot CLI installed: $(copilot --version)" | ||
| else | ||
| echo "Copilot CLI installation finished, but 'copilot' is not on PATH." >&2 | ||
| fi | ||
|
|
||
| if [[ "${COPILOT_CLI_MCP_SEED}" == "true" ]]; then | ||
| if [[ -f "${COPILOT_CLI_MCP_CONFIG_TEMPLATE}" ]]; then | ||
| echo "Seeding Copilot CLI MCP config..." | ||
| mkdir -p "$(dirname "${COPILOT_CLI_MCP_CONFIG_PATH}")" | ||
| cp "${COPILOT_CLI_MCP_CONFIG_TEMPLATE}" "${COPILOT_CLI_MCP_CONFIG_PATH}" | ||
| else | ||
| echo "MCP config template not found at ${COPILOT_CLI_MCP_CONFIG_TEMPLATE}; skipping seed." >&2 | ||
| fi | ||
| else | ||
| echo "COPILOT_CLI_MCP_SEED is not true; skipping MCP config seed." | ||
| fi | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
install_browsers.shandinstall_copilot_cli.shrun at image build time, but the PR only wiresCOPILOT_CLI_ENABLED/BROWSERS_ENABLEDvia runtimedocker-composeenvironment variables. As a result, these opt-in installs can’t be enabled via compose as documented. UseARG+ENVin the Dockerfile andbuild.argsindocker-compose.yml(or move these installs to container startup).