Skip to content

feat: add imports.marketplaces and imports.plugins support#22829

Open
Copilot wants to merge 15 commits intomainfrom
copilot/add-support-for-marketplaces-plugins
Open

feat: add imports.marketplaces and imports.plugins support#22829
Copilot wants to merge 15 commits intomainfrom
copilot/add-support-for-marketplaces-plugins

Conversation

Copy link
Contributor

Copilot AI commented Mar 25, 2026

Adds imports.marketplaces and imports.plugins as new subfields of the imports object form, enabling workflows to register custom marketplaces and install agent extensions/plugins before the agent runs — using each engine CLI's native package support. Values defined in shared agentic workflows (imported via imports.aw) are automatically merged and deduplicated.

Plugin entries in imports.plugins can be plain plugin names, plugin@marketplace specs, or full GitHub tree URLs. When a GitHub tree URL is provided, the compiler automatically converts it to the OWNER/REPO:PATH/TO/PLUGIN format ("subdirectory in a repository" spec) accepted by the Copilot CLI — no separate marketplace registration is required since this is a direct GitHub reference. Marketplaces that are already built-in to the engine CLI are automatically skipped when registering via imports.marketplaces.

New frontmatter syntax

imports:
  marketplaces:
    - https://marketplace.example.com
  plugins:
    - my-extension
    - another-plugin@my-marketplace        # plugin@marketplace format
    # Full GitHub URL: auto-converted to OWNER/REPO:PATH format
    - https://github.com/github/copilot-plugins/tree/main/plugins/advanced-security/skills/secret-scanning

A URL like https://github.com/github/copilot-plugins/tree/main/plugins/advanced-security/skills/secret-scanning is automatically resolved to:

  • install argument: github/copilot-plugins:plugins/advanced-security/skills/secret-scanning (OWNER/REPO:PATH format — no marketplace registration needed)

The OWNER/REPO:PATH/TO/PLUGIN format is the "subdirectory in a repository" spec from the official Copilot CLI plugin reference. It resolves directly from GitHub without requiring a prior copilot plugin marketplace add step.

Values can also be defined in shared workflows and they will be merged:

# shared-tools.md
imports:
  marketplaces:
    - https://shared-marketplace.example.com
  plugins:
    - shared-plugin

Changes

Interface

  • New optional ImportsProvider interface in agentic_engine.go with GetBuiltinMarketplaces, GetMarketplaceSetupSteps, and GetPluginInstallSteps — follows the existing ISP pattern; engines opt-in by implementing it.
  • GetBuiltinMarketplaces() []string declares which marketplace URLs the engine CLI already registers by default, so the compiler can skip re-registering them (relevant when users explicitly list those URLs in imports.marketplaces).

Engine implementations

  • CopilotEngine: emits copilot plugin marketplace add <url> / copilot plugin install <spec>; declares https://github.com/github/copilot-plugins as a built-in marketplace. GitHub tree URLs are converted to OWNER/REPO:PATH format (e.g. github/copilot-plugins:plugins/advanced-security/skills/secret-scanning).
  • ClaudeEngine: emits claude plugin marketplace add <url> / claude plugin install <name>; no built-in marketplaces.
  • CodexEngine and GeminiEngine: do not implement ImportsProvider — neither CLI has native marketplace/plugin management commands (Codex uses npm packages + MCP config; Gemini uses .gemini/settings.json). Using imports.marketplaces or imports.plugins with these engines produces a compilation error.
  • All steps set GITHUB_TOKEN: ${{ github.token }} for authentication against GitHub-hosted registries.
  • Step name: values are double-quoted in the generated YAML to handle colons in URLs and names.

Compiler

  • extractMarketplacesFromFrontmatter / extractPluginsFromFrontmatter in frontmatter_extraction_metadata.go — mirrors imports.apm-packages extraction pattern.
  • Marketplaces []string / Plugins []string added to WorkflowData and toolsProcessingResult.
  • compiler_yaml_main_job.go checks for ImportsProvider and emits setup steps immediately before agent execution (after engine config steps).
  • plugin_url.goparseGitHubPluginURL(raw string) (pluginSpec string, ok bool) parses a GitHub tree URL into an OWNER/REPO:PATH/TO/PLUGIN spec. normalizePlugins applies this to the full plugin list; plain plugin names and plugin@marketplace specs pass through unchanged. GitHub tree URLs do not infer marketplace registrations.
  • compiler_orchestrator_tools.go normalizes plugins via normalizePlugins and filters explicitly-listed built-in marketplace URLs (via GetBuiltinMarketplaces) before emitting marketplace setup steps.
  • validateImportsProviderSupport() in agent_validation.go — errors with a clear message when imports.marketplaces or imports.plugins are used with an engine that does not implement ImportsProvider.

Import merging

  • importAccumulator in import_field_extractor.go extracts imports.marketplaces and imports.plugins from each imported shared workflow file during BFS traversal, accumulating unique values.
  • ImportsResult exposes MergedMarketplaces and MergedPlugins, merged (union, deduplicated) with the top-level values in the compiler.

Schema

  • marketplaces and plugins added as valid properties to the imports object form in main_workflow_schema.json.

💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.



✨ PR Review Safe Output Test - Run 23548639645

💥 [THE END] — Illustrated by Smoke Claude ·



✨ PR Review Safe Output Test - Run 23565361241

💥 [THE END] — Illustrated by Smoke Claude ·


Changeset

  • Type: patch
  • Description: Adds support for imports.marketplaces and imports.plugins, including shared-import merge/dedup and GitHub tree URL normalization to plugin install specs.

Generated by Changeset Generator for issue #22829 ·

@pelikhan
Copy link
Contributor

@copilot make sure shared agentic workflows can merge marketplaces and plugins

- Add `ImportsProvider` optional interface to agentic engine with
  `GetMarketplaceSetupSteps` and `GetPluginInstallSteps` methods
- Implement ImportsProvider for CopilotEngine:
  - Marketplace: `copilot marketplace add <url>` with GITHUB_TOKEN
  - Plugin: `copilot extension install <name>` with GITHUB_TOKEN
- Implement ImportsProvider for ClaudeEngine:
  - Marketplace: `claude marketplace add <url>` with GITHUB_TOKEN
  - Plugin: `claude plugin install <name>` with GITHUB_TOKEN
- Add `extractMarketplacesFromFrontmatter` and `extractPluginsFromFrontmatter`
  extraction functions following the imports.apm-packages pattern
- Add `Marketplaces` and `Plugins` fields to WorkflowData
- Emit marketplace/plugin setup steps before agent execution in
  compiler_yaml_main_job.go
- Update JSON schema to allow marketplaces/plugins subfields in imports
- Update import_bfs.go error message to mention new subfields
- Add comprehensive tests for all new functionality

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/d7c9f7e9-99ca-48d8-a99f-c880417474e5
Copilot AI changed the title [WIP] Add support for imports.marketplaces and imports.plugins lists feat: add imports.marketplaces and imports.plugins support Mar 25, 2026
Copilot AI requested a review from pelikhan March 25, 2026 05:17
@pelikhan
Copy link
Contributor

@copilot double check copilot cli syntax , check codex and Gemini

…tic workflows

- Add MergedMarketplaces/MergedPlugins to ImportsResult in import_processor.go
- Accumulate marketplaces/plugins with deduplication sets in importAccumulator
- Extract imports.marketplaces and imports.plugins from each imported workflow's
  frontmatter in extractAllImportFields
- Merge accumulated values with top-level values using mergeUnique in
  compiler_orchestrator_tools.go
- Add tests for shared import merging and deduplication

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/740ff634-cbc6-4464-9af7-6d2b057c64f4
Copy link
Contributor Author

Copilot AI commented Mar 25, 2026

@copilot make sure shared agentic workflows can merge marketplaces and plugins

Done in bc0b1c3. When a shared agentic workflow (imported via imports.aw) defines imports.marketplaces or imports.plugins, those values are now extracted during the BFS import traversal and merged (deduplicated) with the main workflow's own values. Duplicate URLs/names across multiple imported files are also deduplicated automatically.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha (http block)

If you need me to access, download, or install something from one of these locations, you can either:

…mands

- Copilot: `copilot marketplace add` → `copilot plugin marketplace add`
- Copilot: `copilot extension install` → `copilot plugin install`
- Claude: `claude marketplace add` → `claude plugin marketplace add`
- Update all test assertions to match corrected commands
- Add ImportsProvider interface tests confirming Codex and Gemini
  do not implement it (neither CLI has native marketplace/plugin support)

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/148f599e-1656-4f5c-be23-3fd2b306a1fa
Copy link
Contributor Author

Copilot AI commented Mar 25, 2026

@copilot double check copilot cli syntax , check codex and Gemini

Fixed in ef6299e. Corrections made:

Copilot CLI (from official docs at docs.github.com/en/copilot/reference/copilot-cli-reference):

  • copilot marketplace add <url>copilot plugin marketplace add <url>
  • copilot extension install <name>copilot plugin install <name>

Claude CLI:

  • claude marketplace add <url>claude plugin marketplace add <url>
  • claude plugin install <name> — already correct

Codex and Gemini: Neither the OpenAI Codex CLI nor the Google Gemini CLI has native marketplace/plugin management commands (Codex uses npm packages + MCP config; Gemini uses .gemini/settings.json). They intentionally do not implement ImportsProvider, and the compiler already handles this gracefully via the optional interface check. Tests were added to assert this explicitly.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • code.claude.com
    • Triggering command: /home/REDACTED/work/_temp/ghcca-node/node/bin/node /home/REDACTED/work/_temp/ghcca-node/node/bin/node --enable-source-maps /home/REDACTED/work/_temp/copilot-developer-action-main/dist/index.js (dns block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha _engine.go (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@pelikhan
Copy link
Contributor

@copilot add integration tests in pkg/cli/workflows

@pelikhan pelikhan marked this pull request as ready for review March 25, 2026 06:02
Copilot AI review requested due to automatic review settings March 25, 2026 06:02
…aces and imports.plugins

- Add 3 workflow fixture files in pkg/cli/workflows/:
  - test-copilot-imports-marketplaces-plugins.md
  - test-claude-imports-marketplaces-plugins.md
  - test-copilot-imports-marketplaces-plugins-shared.md
- Add shared/marketplace-plugins.md shared workflow fixture
- Add compile_imports_marketplaces_plugins_integration_test.go with:
  - TestCompileCopilotImportsMarketplacesPlugins
  - TestCompileClaudeImportsMarketplacesPlugins
  - TestCompileCopilotImportsMarketplacesPluginsShared (merging from shared import)
- Fix YAML step names to be double-quoted (URLs and names with colons are
  invalid as bare YAML mapping keys)

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/16770042-8c03-4592-b8a7-45b71f923513
Copy link
Contributor Author

Copilot AI commented Mar 25, 2026

@copilot add integration tests in pkg/cli/workflows

Done in 235ef11. Added three integration tests in pkg/cli/workflows along with workflow fixtures:

  • TestCompileCopilotImportsMarketplacesPlugins — compiles test-copilot-imports-marketplaces-plugins.md and asserts the lock file contains copilot plugin marketplace add and copilot plugin install steps before the agent execution step
  • TestCompileClaudeImportsMarketplacesPlugins — same for Claude (claude plugin marketplace add / claude plugin install)
  • TestCompileCopilotImportsMarketplacesPluginsShared — compiles test-copilot-imports-marketplaces-plugins-shared.md which imports shared/marketplace-plugins.md via imports.aw, and asserts both main and shared marketplace/plugin values are present in the lock file (merged, deduplicated)

Also fixed a YAML generation bug in the same commit: step name: values containing colons (from URLs like https://... or Install Copilot plugin: <name>) must be double-quoted to produce valid YAML — the step names are now emitted as name: "Register Copilot marketplace: <url>".

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw g/workflow/actio-c g/workflow/actio&#34;prettier&#34; --write &#39;scripts/**/*.js&#39; --ignore-path .prettierignore --log-level=error x_amd64/vet g/wo�� h ../../../.prettierignore g/workflow/activation_github_token_test.go x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw /home/REDACTED/wor-c /home/REDACTED/wornpx prettier --write &#39;../../../**/*.json&#39; &#39;!../../../pkg/workflow/js/**/*.json&#39; --ignore-path x_amd64/vet /pre�� test-copilot-imports\|workflows/test- /home/REDACTED/work/gh-aw/gh-aw/pkg/cli/ x_amd64/vet /home/REDACTED/wormake /home/REDACTED/worbuild /home/REDACTED/work/gh-aw/gh-aw/pk-unreachable=false x_amd64/vet (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha get --local /opt/pipx_bin/git user.email (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha get --local ndor/bin/bash user.email (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha get --local bin/bash user.email (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha h ../../../.prettierignore (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility json&#39; --ignore-path ../../../.pr**/*.json .cfg 64/pkg/tool/linux_amd64/vet /home/REDACTED/wor/usr/bin/gh /home/REDACTED/worapi /home/REDACTED/worgraphql 64/pkg/tool/linu-f --no�� th .prettierigno-f .cfg 64/pkg/tool/linu-f (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0 --jq .object.sha h ../../../.prettierignore (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/# --jq .object.sha k/gh-aw/gh-aw/pkg/cli/mcp_inspec-errorsas k/gh-aw/gh-aw/pkg/cli/mcp_logs_g-ifaceassert x_amd64/vet (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds support for imports.marketplaces and imports.plugins in workflow frontmatter, allowing supported engines to emit pre-agent setup steps to register custom marketplaces and install plugins, including merge+dedupe behavior across imports.aw shared workflows.

Changes:

  • Introduces ImportsProvider interface and implements it for Copilot and Claude engines to generate marketplace/plugin setup steps.
  • Extracts imports.marketplaces / imports.plugins from frontmatter, merges values from imported shared workflows, and emits steps before agent execution.
  • Extends the workflow schema and adds unit + integration tests for compilation, merging, and deduplication.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
pkg/workflow/imports_marketplaces_plugins_test.go Adds unit tests for frontmatter parsing, engine step generation, compilation ordering, merge, and dedupe.
pkg/workflow/frontmatter_extraction_metadata.go Implements frontmatter extraction helpers for marketplaces and plugins.
pkg/workflow/copilot_engine_imports.go Adds Copilot engine step generation for marketplace registration and plugin install.
pkg/workflow/claude_engine_imports.go Adds Claude engine step generation for marketplace registration and plugin install.
pkg/workflow/compiler_yaml_main_job.go Emits marketplace/plugin setup steps before the agent execution step when engine supports it.
pkg/workflow/compiler_types.go Adds Marketplaces and Plugins to WorkflowData.
pkg/workflow/compiler_orchestrator_workflow.go Plumbs extracted marketplaces/plugins into WorkflowData.
pkg/workflow/compiler_orchestrator_tools.go Extracts marketplaces/plugins from frontmatter and merges with imported values (deduped).
pkg/parser/schemas/main_workflow_schema.json Extends schema to allow imports.marketplaces and imports.plugins.
pkg/parser/import_processor.go Extends ImportsResult to expose merged marketplaces/plugins.
pkg/parser/import_field_extractor.go Accumulates marketplaces/plugins from imported shared workflows with dedupe sets.
pkg/parser/import_bfs.go Updates error message for invalid imports type to mention new subfields.
pkg/cli/workflows/test-.md, pkg/cli/workflows/shared/.md Adds canonical workflow fixtures demonstrating imports.marketplaces/plugins (including shared imports).
pkg/cli/compile_imports_marketplaces_plugins_integration_test.go Adds integration tests validating compiled lock files contain the expected steps and ordering.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +392 to +419
// Returns an empty slice if the field is absent.
func extractMarketplacesFromFrontmatter(frontmatter map[string]any) ([]string, error) {
importsAny, hasImports := frontmatter["imports"]
if !hasImports {
return nil, nil
}
importsMap, ok := importsAny.(map[string]any)
if !ok {
return nil, nil
}
marketplacesAny, hasMarketplaces := importsMap["marketplaces"]
if !hasMarketplaces {
return nil, nil
}

var marketplaces []string
switch v := marketplacesAny.(type) {
case []any:
for _, item := range v {
if s, ok := item.(string); ok && s != "" {
marketplaces = append(marketplaces, s)
}
}
case []string:
marketplaces = append(marketplaces, v...)
default:
return nil, errors.New("imports.marketplaces must be an array of strings")
}
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

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

The function comment says it “Returns an empty slice if the field is absent”, but the implementation returns nil in all absent-field cases, and the []string branch does not skip empty strings while the []any branch does. To avoid inconsistent behavior, either (a) update the doc to explicitly say it returns nil when absent, and filter out empty/whitespace-only entries in both branches, or (b) return []string{} consistently for “absent” and still filter empty entries.

Copilot uses AI. Check for mistakes.
Comment on lines +440 to +460
return nil, nil
}
importsMap, ok := importsAny.(map[string]any)
if !ok {
return nil, nil
}
pluginsAny, hasPlugins := importsMap["plugins"]
if !hasPlugins {
return nil, nil
}

var plugins []string
switch v := pluginsAny.(type) {
case []any:
for _, item := range v {
if s, ok := item.(string); ok && s != "" {
plugins = append(plugins, s)
}
}
case []string:
plugins = append(plugins, v...)
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

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

Same issue as marketplaces: the doc says “empty slice if absent” but the function returns nil, and empty-string filtering is applied only for the []any branch. Align return semantics/documentation and ensure empty/whitespace-only plugin entries are filtered consistently regardless of decoded type.

Suggested change
return nil, nil
}
importsMap, ok := importsAny.(map[string]any)
if !ok {
return nil, nil
}
pluginsAny, hasPlugins := importsMap["plugins"]
if !hasPlugins {
return nil, nil
}
var plugins []string
switch v := pluginsAny.(type) {
case []any:
for _, item := range v {
if s, ok := item.(string); ok && s != "" {
plugins = append(plugins, s)
}
}
case []string:
plugins = append(plugins, v...)
return []string{}, nil
}
importsMap, ok := importsAny.(map[string]any)
if !ok {
return []string{}, nil
}
pluginsAny, hasPlugins := importsMap["plugins"]
if !hasPlugins {
return []string{}, nil
}
var plugins []string
switch v := pluginsAny.(type) {
case []any:
for _, item := range v {
if s, ok := item.(string); ok {
if strings.TrimSpace(s) != "" {
plugins = append(plugins, s)
}
}
}
case []string:
for _, s := range v {
if strings.TrimSpace(s) != "" {
plugins = append(plugins, s)
}
}

Copilot uses AI. Check for mistakes.
Comment on lines +297 to +322
// Extract imports.marketplaces from imported file (merge into set to avoid duplicates)
if importsAny, hasImports := fm["imports"]; hasImports {
if importsMap, ok := importsAny.(map[string]any); ok {
if marketplacesAny, hasMarketplaces := importsMap["marketplaces"]; hasMarketplaces {
if marketplacesArr, ok := marketplacesAny.([]any); ok {
for _, item := range marketplacesArr {
if url, ok := item.(string); ok && url != "" && !acc.marketplacesSet[url] {
acc.marketplacesSet[url] = true
acc.marketplaces = append(acc.marketplaces, url)
}
}
}
}
// Extract imports.plugins from imported file (merge into set to avoid duplicates)
if pluginsAny, hasPlugins := importsMap["plugins"]; hasPlugins {
if pluginsArr, ok := pluginsAny.([]any); ok {
for _, item := range pluginsArr {
if name, ok := item.(string); ok && name != "" && !acc.pluginsSet[name] {
acc.pluginsSet[name] = true
acc.plugins = append(acc.plugins, name)
}
}
}
}
}
}
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

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

Imported shared workflows that specify imports.marketplaces / imports.plugins with an invalid type (or []string rather than []any) are silently ignored here, while the top-level extraction errors out on invalid types. This can lead to hard-to-debug “missing marketplace/plugin” behavior for shared imports. Consider reusing the same extraction logic as the compiler path (or a shared helper) and returning an error on invalid types, and support both []any and []string consistently for imported files too.

Copilot uses AI. Check for mistakes.
Comment on lines +24 to +27
` - name: "Register Copilot marketplace: ` + url + `"`,
" env:",
" GITHUB_TOKEN: ${{ github.token }}",
" run: copilot plugin marketplace add " + url,
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

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

url is concatenated directly into a run: shell command; if a workflow (or imported shared workflow) supplies a value containing shell metacharacters, this can change the executed command. Even if this is “workflow-author-controlled”, it becomes riskier when consuming shared imports from other repos. Prefer emitting a safely-escaped argument (via a dedicated shell-escape helper) or otherwise ensuring the value is treated as a single argument by the shell.

Copilot uses AI. Check for mistakes.
Comment on lines +24 to +27
` - name: "Register Claude marketplace: ` + url + `"`,
" env:",
" GITHUB_TOKEN: ${{ github.token }}",
" run: claude plugin marketplace add " + url,
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

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

Same command-concatenation issue as the Copilot implementation: marketplace URL and plugin name are interpolated into a shell command without escaping. To prevent shell injection via untrusted or externally-imported workflow content, emit shell-escaped arguments (recommended), or restructure the command generation so user-supplied values cannot alter the shell syntax.

Copilot uses AI. Check for mistakes.
if agentIdx == -1 {
agentIdx = strings.Index(yamlStr, "copilot --")
}
require.Positive(t, agentIdx, "Agent execution step should be present")
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

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

strings.Index returns 0 when the substring is found at the beginning; require.Positive requires > 0, so this assertion can fail even when the agent step is present. Use an assertion that checks agentIdx != -1 (or >= 0) instead.

Suggested change
require.Positive(t, agentIdx, "Agent execution step should be present")
require.NotEqual(t, -1, agentIdx, "Agent execution step should be present")

Copilot uses AI. Check for mistakes.
@pelikhan
Copy link
Contributor

@copilot raise error if marketplaces/plugins are used with unsupported agent.

…rted engine

Add validateImportsProviderSupport() to agent_validation.go that errors when
imports.marketplaces or imports.plugins are specified for an engine that does
not implement ImportsProvider (Codex, Gemini). Wire the validation into the
compiler orchestration layer after marketplace/plugin values are merged.

Add unit and integration tests to cover:
- Copilot and Claude pass validation
- Codex and Gemini fail with a clear error mentioning the unsupported field
  and the engine ID
- End-to-end compilation tests for both the error path (Codex+marketplace,
  Gemini+plugin) and happy path

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/50023f2a-8dca-411f-9330-77b9fbce6de2
Copy link
Contributor Author

Copilot AI commented Mar 25, 2026

@copilot raise error if marketplaces/plugins are used with unsupported agent.

Done in 9e33c80. Added validateImportsProviderSupport() in agent_validation.go that errors out when imports.marketplaces or imports.plugins are specified with an engine that doesn't implement ImportsProvider (Codex, Gemini). The error message explicitly names the unsupported field(s) and the engine:

imports.marketplaces not supported: engine 'codex' does not support marketplace/plugin installation
imports.marketplaces and imports.plugins not supported: engine 'gemini' does not support marketplace/plugin installation

Tests added: TestValidateImportsProviderSupport (unit, all 4 engines × both fields), TestCompileWorkflow_MarketplacesWithUnsupportedEngine, TestCompileWorkflow_PluginsWithUnsupportedEngine, and TestCompileCodexImportsMarketplacesPluginsError (integration).

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha &#34;prettier&#34; --cheGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go /opt/hostedtoolcGOPROXY -V=f�� GOMODCACHE go 64/bin/go -json GO111MODULE 64/bin/go go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha &#34;prettier&#34; --cheGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go /opt/hostedtoolcGOPROXY -V=f�� GOMODCACHE go /sh -json GO111MODULE 64/bin/go go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha &#34;prettier&#34; --cheGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go bash --no�� --noprofile go 64/bin/go -json GO111MODULE 64/bin/go go (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions
Copy link
Contributor

github-actions bot commented Mar 25, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions github-actions bot removed the smoke label Mar 25, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 25, 2026

✨ The prophecy is fulfilled... Smoke Codex has completed its mystical journey. The stars align. 🌟

@github-actions

This comment has been minimized.

@github-actions
Copy link
Contributor

📰 DEVELOPING STORY: Smoke Copilot reports failed. Our correspondents are investigating the incident...

@github-actions

This comment has been minimized.

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

💥 Automated smoke test review - all systems nominal!

💥 [THE END] — Illustrated by Smoke Claude

func TestCompileCopilotImportsMarketplacesPlugins(t *testing.T) {
setup := setupIntegrationTest(t)
defer setup.cleanup()

Copy link
Contributor

Choose a reason for hiding this comment

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

Good test structure using setupIntegrationTest. Consider adding a test for the case where a plugin URL is provided without a marketplace URL to ensure error handling is robust.

- shared/gh.md
- shared/reporting.md
- shared/github-queries-mcp-script.md
plugins:
Copy link
Contributor

Choose a reason for hiding this comment

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

The plugins import for secret-scanning is a good addition to the smoke test. This validates the marketplace plugin install flow end-to-end.

@github-actions

This comment has been minimized.

@pelikhan
Copy link
Contributor

@copilot update the copilot support with the following specification:

https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference#cli-commands
copilot plugin install SPECIFICATION | Install a plugin. See Plugin specification for install command below.
copilot plugin uninstall NAME | Remove a plugin
copilot plugin list | List installed plugins
copilot plugin update NAME | Update a plugin
copilot plugin update --all | Update all installed plugins
copilot plugin disable NAME | Temporarily disable a plugin without uninstalling it
copilot plugin enable NAME | Re-enable a disabled plugin
copilot plugin marketplace add SPECIFICATION | Register a marketplace
copilot plugin marketplace list | List registered marketplaces
copilot plugin marketplace browse NAME | Browse marketplace plugins
copilot plugin marketplace remove NAME | Unregister a marketplace

[Plugin specification for install command](https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference#plugin-specification-for-install-command)
Format	Example	Description
Marketplace	plugin@marketplace	Plugin from a registered marketplace
GitHub	OWNER/REPO	Root of a GitHub repository
GitHub subdir	OWNER/REPO:PATH/TO/PLUGIN	Subdirectory in a repository
Git URL	https://github.com/o/r.git	Any Git URL
Local path	./my-plugin or /abs/path	Local directory

Copy link
Contributor Author

Copilot AI commented Mar 25, 2026

@copilot update the copilot support with the following specification:

...

Updated in 9ebaad1. Per the official spec, GitHub tree URLs now use the OWNER/REPO:PATH/TO/PLUGIN format ("subdirectory in a repository"):

copilot plugin install github/copilot-plugins:plugins/advanced-security/skills/secret-scanning

This is a direct GitHub reference that doesn't require a prior copilot plugin marketplace add step, so marketplace inference from GitHub tree URLs has been removed. Plain plugin@marketplace entries still pass through unchanged (for plugins from explicitly registered marketplaces).

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw w7xPW-kHMyj5 (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw s3/y1GqWtsMNu0gZ/home/REDACTED/.npm/_npx/b388654678d519d9/node_modules/.bin/prettier (http block)
  • https://api.github.com/orgs/test-owner/actions/secrets
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name --local credential.username ache/go/1.25.0/x64/pkg/tool/linux_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name /tmp/gh-aw/aw-master.patch git /usr/bin/git --show-toplevel /opt/hostedtoolc/tmp/fuzz-expr-2392672866.js /usr/bin/git git rev-�� audit-workflows.md git /usr/bin/git --remote=https:/git v1.0.0 /usr/bin/git git (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha /home/REDACTED/work/gh-aw/gh-aw/.github/workflows/agent-performance-analyzer.md /opt/hostedtoolcache/go/1.25.0/xconfig /usr/bin/git te &#39;**/*.cjs&#39; &#39;*git /tmp/go-build131rev-parse e_modules/.bin/s--show-toplevel git rev-�� --show-toplevel /opt/hostedtoolc-trimpath /usr/bin/gh ithub/workflows /tmp/go-build131rev-parse ache/go/1.25.0/x--show-toplevel gh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha 1934-22183/test-3684123578/.github/workflows git /usr/bin/git --show-toplevel git /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha : ${{ github.repository }} git /opt/hostedtoolcache/node/24.14.0/x64/bin/node --show-toplevel git /usr/bin/git node js/f�� ache/node/24.14.--show-toplevel git /opt/hostedtoolcache/node/24.14.0/x64/bin/node user.name Test User /usr/bin/git node (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha -bool -buildtags /tmp/go-build2902106532/b414/envutil.test -errorsas -ifaceassert -nilfunc /tmp/go-build2902106532/b414/envutil.test -tes�� -test.paniconexit0 -test.v=true /usr/bin/git -test.timeout=10git -test.run=^Test -test.short=true--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha --show-toplevel git /usr/bin/git --show-toplevel x_amd64/link /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel PP/mr4PoslvBgNBtrev-parse /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha --show-toplevel git ache/node/24.14.0/x64/bin/node --show-toplevel git /usr/bin/git git _cod�� --show-toplevel git ache/node/24.14.0/x64/bin/node --show-toplevel git /usr/bin/git git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha ithub/workflows (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha Value: ${{ github.actor }} /opt/hostedtoolcache/go/1.25.0/x-importcfg /usr/bin/git -bool on (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel docker /usr/bin/git ai-moderator.md semgrep/semgrep:rev-parse /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git /home/REDACTED/worgit rev-parse 2106532/b424/mat--show-toplevel git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha /tmp/TestCompileErrorFormatting3866655141/001 config /usr/bin/git remote.origin.urgit (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha uts.branch ache/go/1.25.0/x-trimpath /usr/bin/git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha --show-toplevel git /usr/bin/git /home/REDACTED/worgit rev-parse cal/bin/bash git rev-�� --show-toplevel infocmp /usr/bin/git 1610-15449/test-git x_amd64/vet bin/bash git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha get --local r: $owner, name: $name) { hasDiscussionsEnabled } } committer.name (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha ../pkg/workflow/js/**/*.json&#39; ---n1 --local .cfg yAccounting=yes ota=5% yHigh=170M (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha --show-toplevel git /usr/bin/git --show-toplevel git /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha --show-toplevel git /opt/hostedtoolcache/node/24.14.0/x64/bin/node --show-toplevel git /usr/bin/git node js/f�� /usr/bin/git git /opt/hostedtoolcache/node/24.14.0/x64/bin/node --show-toplevel git /usr/bin/git node (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha --show-toplevel ache/go/1.25.0/x-buildtags /usr/bin/git --noprofile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha /home/REDACTED/work/gh-aw/gh-aw/.github/workflows/ai-moderator.md git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha --show-toplevel git /opt/hostedtoolcache/node/24.14.0/x64/bin/node --show-toplevel git 0/x64/bin/node node js/f�� /usr/bin/git git /opt/hostedtoolcache/node/24.14.0/x64/bin/node --show-toplevel git /usr/bin/git node (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha 2106532/b435/sliceutil.test rev-parse 2106532/b435/importcfg.link (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha --show-toplevel node /usr/bin/git /home/REDACTED/worgit XFjOiSQ6baL5 /usr/bin/git git form�� ..feature-branch --stdout 64/bin/go --show-toplevel x_amd64/vet /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha --show-toplevel git 0/x64/bin/node ithub/workflows git /usr/bin/git git js --show-toplevel git /usr/bin/git --show-toplevel git trepo.git git (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha ath ../../../.pr**/*.json (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0 --jq .object.sha ath ../../../.pr**/*.json (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha FwWM8pAbU 64/pkg/tool/linuconfig /home/REDACTED/.dotnet/tools/bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha --show-toplevel node /usr/bin/mkdir /home/REDACTED/worgit /opt/hostedtoolcrev-parse /usr/bin/git mkdir -p /tmp/gh-aw git /usr/bin/git --show-toplevel x_amd64/link /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha --show-toplevel git 0/x64/bin/node --show-toplevel x_amd64/vet /usr/bin/git git js --show-toplevel git 64/pkg/tool/linux_amd64/compile --show-toplevel git epo.git 64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha runs/20260325-201610-15449/test-3210990253/.github/workflows config /home/REDACTED/.config/composer/vendor/bin/bash remote.origin.urgit .cfg 64/pkg/tool/linu--show-toplevel bash --no�� k/gh-aw/gh-aw/.github/workflows 64/pkg/tool/linurev-parse 2106532/b441/styles.test --local .cfg 64/pkg/tool/linu--show-toplevel 2106532/b441/styles.test (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha --show-toplevel git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git log --oneline -10 /usr/bin/git --show-toplevel x_amd64/vet /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha --show-toplevel git 0/x64/bin/node --show-toplevel git /usr/bin/git git js --show-toplevel git 64/pkg/tool/linux_amd64/vet --show-toplevel git /usr/bin/git 64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/1/artifacts
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 /tmp/go-build131-c=4 /home/REDACTED/wor-nolocalimports ./../.prettieriggit (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12345/artifacts
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 -buildtags x_amd64/compile -errorsas -ifaceassert -nilfunc x_amd64/compile /opt�� ithub/workflows --write /opt/hostedtoolcache/node/24.14.0/x64/bin/node **/*.ts **/*.json --ignore-path node (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 git /usr/bin/git --show-toplevel bash (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12346/artifacts
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 -buildtags x_amd64/link -errorsas -ifaceassert -nilfunc x_amd64/link /opt�� k/gh-aw/gh-aw/.github/workflows --write x_amd64/compile l **/*.json ed } } x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 git /usr/bin/git --show-toplevel bash /usr/bin/git git rev-�� --show-toplevel git ache/node/24.14.0/x64/bin/node etup-node/git/regit /opt/hostedtoolcrev-parse /usr/bin/git ache/node/24.14.0/x64/bin/node (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/2/artifacts
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 /tmp/go-build1317960794/b074/vet.cfg /home/REDACTED/work/node_modules/.bin/sh ./../.prettieriggit (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 git /opt/hostedtoolcache/node/24.14.0/x64/bin/node --show-toplevel 2106532/b432/reprev-parse /usr/bin/git node /tmp�� /home/REDACTED/work/gh-aw/gh-aw/.github/workflows/bot-detection.md git /opt/hostedtoolcache/node/24.14.0/x64/bin/node --show-toplevel 0/x64/bin/node /usr/bin/git /opt/hostedtoolcache/node/24.14.origin (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/3/artifacts
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 /tmp/go-build1317960794/b061/vet.cfg x_amd64/vet ./../.prettierignode (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 git ache/node/24.14.0/x64/bin/node --show-toplevel 2106532/b435/slirev-parse /usr/bin/git ache/node/24.14.0/x64/bin/node 6858�� --show-toplevel git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/4/artifacts
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 -buildtags (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 git /usr/bin/git --show-toplevel 2106532/b428/parconfig /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git ctor }} ${{ github.actor }} ${{ remote.origin.url (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/5/artifacts
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 -buildtags x_amd64/compile ./../.prettieriggit -ifaceassert -nilfunc x_amd64/compile -c ithub/workflows -tests x_amd64/link (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 git /usr/bin/git --show-toplevel ache/go/1.25.0/xconfig /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel /opt/hostedtoolcrev-parse /usr/bin/git git (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path g_.a credential.username tions/setup/js/node_modules/.bin/prettier (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 100 (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 6 erignore -nilfunc sh -c k/gh-aw/gh-aw/.github/workflows -tests /home/REDACTED/work/gh-aw/gh-aw/node_modules/.bin/-f (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha ithub/workflows -tests /opt/hostedtoolcache/uv/0.11.1/x86_64/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha --show-toplevel git /usr/bin/git /home/REDACTED/worgit rev-parse /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git /home/REDACTED/worgit l ache/go/1.25.0/x--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha user.email test@example.com /usr/bin/git --show-toplevel git /opt/hostedtoolcache/node/24.14.xterm-color git rev-�� --show-toplevel node /usr/bin/gh /tmp/TestHashConnode git 0/x64/bin/node gh (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq .object.sha .js&#39; --ignore-path .prettierigno-f 7960794/b172/vet.cfg bin/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq .object.sha --show-toplevel git /usr/bin/git --show-toplevel /usr/bin/gh /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel git /usr/bin/git git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v2.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq .object.sha se 7960794/b188/vet.cfg repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq .object.sha se 7960794/b197/vet-ifaceassert ache/go/1.25.0/x-nilfunc (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq .object.sha se 7960794/b179/vetgithub.com/github/gh-aw/pkg/cli 64/bin/node (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v3.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq .object.sha se 7960794/b187/vet.cfg 0/x64/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq .object.sha --show-toplevel git /usr/bin/git --show-toplevel 6n/cLzQgjXlIjxIoconfig /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel eURLConverted /usr/bin/git git (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/# --jq .object.sha (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha -w pkg/workflow/cre-nolocalimports At,event,headBranch,headSha,displayTitle pkg/workflow/cregit pkg/workflow/crerev-parse pkg/workflow/cre--git-dir node /opt�� ithub/workflows --write 64/pkg/tool/linux_amd64/vet --ignore-path .prettierignore DiscussionsEnabl--show-toplevel 64/pkg/tool/linux_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha --show-toplevel docker /usr/bin/git r/test-repo/actigit mcp/arxiv-mcp-serev-parse /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git /home/REDACTED/worgit rev-parse 0/x64/bin/node git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha --show-toplevel git /usr/bin/git --show-toplevel git /opt/hostedtoolcache/node/24.14.--show-toplevel git init�� 64/bin/node node /usr/bin/git /tmp/TestHashConnode git /usr/bin/git git (http block)
  • https://api.github.com/repos/nonexistent/repo/actions/runs/12345
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion ./../.prettieriggit -ifaceassert -nilfunc sh -c 4283395323/.github/workflows -tests me: String!) { repository(owne-importcfg (http block)
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion --show-toplevel 2106532/b426/imprev-parse ache/node/24.14.--show-toplevel git rev-�� 1934-22183/test-4281172357/.github/workflows git /usr/bin/git --show-toplevel nly /usr/bin/git git (http block)
  • https://api.github.com/repos/owner/repo/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo ode (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo tions/setup/js/node_modules/.bin-importcfg (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo 64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/owner/repo/contents/file.md
    • Triggering command: /tmp/go-build2902106532/b402/cli.test /tmp/go-build2902106532/b402/cli.test -test.testlogfile=/tmp/go-build2902106532/b402/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true core.hooksPath (http block)
    • Triggering command: /tmp/go-build2479370518/b380/cli.test /tmp/go-build2479370518/b380/cli.test -test.paniconexit0 -test.timeout=10m0s -test.count=1 rev-�� 4477/001/stability-test.md git /usr/bin/sh p.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.prop.pro Test User /opt/hostedtoolc--show-toplevel sh -c exit 1 /opt/hostedtoolc--jq /usr/bin/git REDACTED.os /opt/hostedtoolcrev-parse /usr/bin/git git (http block)
  • https://api.github.com/repos/test-owner/test-repo/actions/secrets
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name 7428378/b069/exe/a.out credential.username de/node/bin/sh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@pelikhan pelikhan added the smoke label Mar 25, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 25, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions
Copy link
Contributor

github-actions bot commented Mar 25, 2026

✅ All tools validated successfully! Agent Container Smoke Test confirms agent container is ready.

@github-actions
Copy link
Contributor

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions github-actions bot removed the smoke label Mar 25, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 25, 2026

✨ The prophecy is fulfilled... Smoke Codex has completed its mystical journey. The stars align. 🌟

@github-actions
Copy link
Contributor

📰 DEVELOPING STORY: Smoke Copilot reports failed. Our correspondents are investigating the incident...

@github-actions
Copy link
Contributor

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.53.0
jq 1.7
yq 4.52.4
curl 8.5.0
gh 2.87.3
node 20.20.1
python3 3.12.3
go 1.24.13
java openjdk 21.0.10
dotnet 10.0.102

Result: 12/12 tools available ✅ — PASS

🔧 Tool validation by Agent Container Smoke Test ·

@github-actions
Copy link
Contributor

Smoke Test Run 23565361241

Core (#1–11): ✅✅✅✅✅✅✅✅✅✅✅
PR Review (#12–18): ✅✅✅⚠️✅✅⚠️

Status: PARTIAL (2 skipped: thread resolve, close PR)

💥 [THE END] — Illustrated by Smoke Claude ·

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

💥 Automated smoke test review - all systems nominal!

💥 [THE END] — Illustrated by Smoke Claude

func TestCompileCopilotImportsMarketplacesPlugins(t *testing.T) {
setup := setupIntegrationTest(t)
defer setup.cleanup()

Copy link
Contributor

Choose a reason for hiding this comment

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

Good use of setupIntegrationTest helper for consistent test setup and cleanup. The test clearly validates the full marketplace plugin compilation flow end-to-end.

This workflow tests that `imports.marketplaces` and `imports.plugins` are compiled into
`claude plugin marketplace add` and `claude plugin install` setup steps before the agent runs.

Process the issue and respond with a helpful comment.
Copy link
Contributor

Choose a reason for hiding this comment

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

Clean and minimal test workflow — the prompt is concise and the frontmatter correctly exercises both imports.marketplaces and imports.plugins for the Claude engine.

@github-actions
Copy link
Contributor

Commit pushed: a5c6d17

Generated by Changeset Generator

@github-actions
Copy link
Contributor

Smoke test results:

  • PRs: #22983 [log] Add debug logging to 5 previously unlogged files, #22972 [docs] Update documentation for features merged 2026-03-25
  • ✅ GitHub MCP
  • ✅ Serena MCP
  • ✅ Playwright
  • ✅ Web Fetch
  • ✅ File write + Bash readback
  • ✅ Build
  • Overall: PASS

🔮 The oracle has spoken through Smoke Codex ·

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants