From 567225f3a7e6428b64623aba99602201ce3a3c29 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 10:18:35 +0000 Subject: [PATCH 1/5] Initial plan From e981ed7570d893a7e108fc525b093dbe2b8aed60 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 10:29:48 +0000 Subject: [PATCH 2/5] chore: outline plan for gh aw add spec parsing fix Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- ...ly-compiler-threat-spec-optimizer.lock.yml | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml b/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml index dc7ee0fa391..91a33f21d9d 100644 --- a/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml +++ b/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"92d4db5190674780e53e1c9dc02d7ec3b44e9b37467aa8c5d7599fb7ccfe033e","body_hash":"8761535078c69ec3df664e51b40b25d49c9704cc69a8a6bfe003ffe4409bd20c","strict":true,"agent_id":"copilot"} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"3318b7415c6a6e13a76c9ab75cf996e2c7ef63ebbec2e216cf57489a448081b1","body_hash":"8761535078c69ec3df664e51b40b25d49c9704cc69a8a6bfe003ffe4409bd20c","strict":true,"agent_id":"copilot"} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.55"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.55"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.25.55"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.55"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.19"},{"image":"ghcr.io/github/github-mcp-server:v1.0.4","digest":"sha256:e3816a476a977cfb836e7d221510011436c654d11861db66ecfd826601aba6a4","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.4@sha256:e3816a476a977cfb836e7d221510011436c654d11861db66ecfd826601aba6a4"},{"image":"node:lts-alpine","digest":"sha256:2bdb65ed1dab192432bc31c95f94155ca5ad7fc1392fb7eb7526ab682fa5bf14","pinned_image":"node:lts-alpine@sha256:2bdb65ed1dab192432bc31c95f94155ca5ad7fc1392fb7eb7526ab682fa5bf14"}]} # ___ _ _ # / _ \ | | (_) @@ -62,8 +62,8 @@ name: "Daily Compiler Threat Spec Optimizer" on: schedule: - - cron: "19 2 * * *" - # Friendly format: daily (scattered) + - cron: "6 3 * * 1" + # Friendly format: weekly on monday around 03:00 (scattered) workflow_dispatch: inputs: aw_context: @@ -208,23 +208,23 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_6801afa46256074c_EOF' + cat << 'GH_AW_PROMPT_6bd877931be036c6_EOF' - GH_AW_PROMPT_6801afa46256074c_EOF + GH_AW_PROMPT_6bd877931be036c6_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_6801afa46256074c_EOF' + cat << 'GH_AW_PROMPT_6bd877931be036c6_EOF' Tools: create_discussion, create_pull_request, missing_tool, missing_data, noop - GH_AW_PROMPT_6801afa46256074c_EOF + GH_AW_PROMPT_6bd877931be036c6_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_create_pull_request.md" - cat << 'GH_AW_PROMPT_6801afa46256074c_EOF' + cat << 'GH_AW_PROMPT_6bd877931be036c6_EOF' - GH_AW_PROMPT_6801afa46256074c_EOF + GH_AW_PROMPT_6bd877931be036c6_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_6801afa46256074c_EOF' + cat << 'GH_AW_PROMPT_6bd877931be036c6_EOF' The following GitHub context information is available for this workflow: {{#if github.actor}} @@ -253,15 +253,15 @@ jobs: {{/if}} - GH_AW_PROMPT_6801afa46256074c_EOF + GH_AW_PROMPT_6bd877931be036c6_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/cli_proxy_with_safeoutputs_prompt.md" - cat << 'GH_AW_PROMPT_6801afa46256074c_EOF' + cat << 'GH_AW_PROMPT_6bd877931be036c6_EOF' {{#runtime-import .github/workflows/shared/otlp.md}} {{#runtime-import .github/workflows/shared/reporting.md}} {{#runtime-import .github/workflows/shared/noop-reminder.md}} {{#runtime-import .github/workflows/daily-compiler-threat-spec-optimizer.md}} - GH_AW_PROMPT_6801afa46256074c_EOF + GH_AW_PROMPT_6bd877931be036c6_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -481,9 +481,9 @@ jobs: mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_9d020f430f3c4f8f_EOF' + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_fd3adc6fcc4e382b_EOF' {"create_discussion":{"category":"audits","close_older_discussions":true,"expires":72,"fallback_to_issue":true,"max":1,"title_prefix":"[compiler-threat-spec] "},"create_pull_request":{"draft":false,"expires":168,"labels":["security","compiler","specification","automation"],"max":1,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"],"protected_files_policy":"request_review","title_prefix":"[compiler-threat-spec] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} - GH_AW_SAFE_OUTPUTS_CONFIG_9d020f430f3c4f8f_EOF + GH_AW_SAFE_OUTPUTS_CONFIG_fd3adc6fcc4e382b_EOF - name: Generate Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | @@ -723,7 +723,7 @@ jobs: mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_e6c1f019753cc2b0_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_db88cf8bac8590ee_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { "safeoutputs": { @@ -753,7 +753,7 @@ jobs: } } } - GH_AW_MCP_CONFIG_e6c1f019753cc2b0_EOF + GH_AW_MCP_CONFIG_db88cf8bac8590ee_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true @@ -1346,7 +1346,7 @@ jobs: export GH_AW_NODE_BIN export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK" (umask 177 && touch /tmp/gh-aw/threat-detection/detection.log) - printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.25.55/awf-config.schema.json","network":{"allowDomains":["api.business.githubcopilot.com","api.enterprise.githubcopilot.com","api.github.com","api.githubcopilot.com","api.individual.githubcopilot.com","github.com","host.docker.internal","telemetry.enterprise.githubcopilot.com"]},"apiProxy":{"enabled":true,"enableTokenSteering":true,"maxRuns":500,"maxEffectiveTokens":25000000},"container":{"imageTag":"0.25.55"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" + printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.25.55/awf-config.schema.json","network":{"allowDomains":["api.business.githubcopilot.com","api.enterprise.githubcopilot.com","api.github.com","api.githubcopilot.com","api.individual.githubcopilot.com","github.com","host.docker.internal","registry.npmjs.org","telemetry.enterprise.githubcopilot.com"]},"apiProxy":{"enabled":true,"enableTokenSteering":true,"maxRuns":500,"maxEffectiveTokens":25000000},"container":{"imageTag":"0.25.55"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS="" if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then From 9fc298edd44b04cc1aa73c081ce99bef9b7e5c0b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 10:39:08 +0000 Subject: [PATCH 3/5] test/docs: cover and clarify direct workflow path@ref support in add Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- docs/src/content/docs/setup/cli.md | 1 + pkg/cli/add_command.go | 3 ++- pkg/cli/add_package_manifest_test.go | 33 ++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/src/content/docs/setup/cli.md b/docs/src/content/docs/setup/cli.md index 146507d9246..59cc63fac87 100644 --- a/docs/src/content/docs/setup/cli.md +++ b/docs/src/content/docs/setup/cli.md @@ -164,6 +164,7 @@ Add workflows from The Agentics collection or other repositories to `.github/wor ```bash wrap gh aw add githubnext/agentics/ci-doctor # Add single workflow gh aw add githubnext/agentics/ci-doctor@v1.0.0 # Add specific version +gh aw add my-org/my-repo/agentic-workflows/pr-review.md@feature/github-agentic-workflows gh aw add githubnext/agentics/ci-doctor --dir shared # Organize in subdirectory gh aw add githubnext/agentics/ci-doctor --create-pull-request # Create PR instead of commit gh aw add https://example.com/workflows/my-workflow.md # Arbitrary HTTPS URL (markdown) diff --git a/pkg/cli/add_command.go b/pkg/cli/add_command.go index f8722f6720f..cc03191bd1a 100644 --- a/pkg/cli/add_command.go +++ b/pkg/cli/add_command.go @@ -61,6 +61,7 @@ Examples: ` + string(constants.CLIExtensionPrefix) + ` add githubnext/agentics/packages/repo-assist # Add package from nested aw.yml ` + string(constants.CLIExtensionPrefix) + ` add githubnext/agentics/ci-doctor@v1.0.0 # Add with version ` + string(constants.CLIExtensionPrefix) + ` add githubnext/agentics/workflows/ci-doctor.md@main + ` + string(constants.CLIExtensionPrefix) + ` add my-org/my-repo/agentic-workflows/pr-review.md@feature/github-agentic-workflows ` + string(constants.CLIExtensionPrefix) + ` add https://github.com/githubnext/agentics/blob/main/workflows/ci-doctor.md ` + string(constants.CLIExtensionPrefix) + ` add https://example.com/my-workflow.md # Add workflow from any HTTPS URL ` + string(constants.CLIExtensionPrefix) + ` add https://example.com/workflow.json # Import JSON workflow definition @@ -80,7 +81,7 @@ Workflow specifications: - application/json → converted from a JSON workflow definition - Local file: "./path/to/workflow.md" (adds a workflow from local filesystem) - Local wildcard: "./*.md" or "./dir/*.md" (adds all .md files matching pattern) - - Version can be tag, branch, or SHA (for remote workflows) + - Version can be a tag, branch (including branches with slashes like feature/my-branch), or commit SHA (for remote workflows) The -n flag allows you to specify a custom name for the workflow file (not allowed when adding multiple workflows at once). The --dir flag allows you to specify the workflow directory (default: .github/workflows). diff --git a/pkg/cli/add_package_manifest_test.go b/pkg/cli/add_package_manifest_test.go index e4c886d331b..2d4caa7fb52 100644 --- a/pkg/cli/add_package_manifest_test.go +++ b/pkg/cli/add_package_manifest_test.go @@ -494,6 +494,34 @@ func TestResolveWorkflows_FallsBackToWorkflowWhenNestedManifestMissing(t *testin assert.Equal(t, "workflows/review.md", resolved.Workflows[0].Spec.WorkflowPath) } +func TestResolveWorkflows_DirectWorkflowPathWithBranchRef(t *testing.T) { + originalFetchFn := fetchWorkflowFromSourceWithContextFn + originalDownload := downloadPackageFileFromGitHubForHost + t.Cleanup(func() { + fetchWorkflowFromSourceWithContextFn = originalFetchFn + downloadPackageFileFromGitHubForHost = originalDownload + }) + + downloadPackageFileFromGitHubForHost = func(owner, repo, path, ref, host string) ([]byte, error) { + t.Fatalf("direct workflow path must not be resolved as repository package (unexpected aw.yml lookup: %s)", path) + return nil, nil + } + fetchWorkflowFromSourceWithContextFn = func(_ context.Context, spec *WorkflowSpec, _ bool) (*FetchedWorkflow, error) { + return &FetchedWorkflow{ + Content: []byte("---\nname: Test\non: push\n---\n"), + CommitSHA: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + IsLocal: false, + SourcePath: spec.WorkflowPath, + }, nil + } + + resolved, err := ResolveWorkflows(context.Background(), []string{"owner/repo/agentic-workflows/pr-review.md@feature/github-agentic-workflows"}, false) + require.NoError(t, err) + require.Len(t, resolved.Workflows, 1) + assert.Equal(t, "agentic-workflows/pr-review.md", resolved.Workflows[0].Spec.WorkflowPath) + assert.Equal(t, "feature/github-agentic-workflows", resolved.Workflows[0].Spec.Version) +} + func TestParseRepositoryPackageSpec(t *testing.T) { tests := []struct { name string @@ -521,6 +549,11 @@ func TestParseRepositoryPackageSpec(t *testing.T) { spec: "owner/repo/workflows/review.md", wantOK: false, }, + { + name: "workflow path with branch ref is not package", + spec: "owner/repo/agentic-workflows/pr-review.md@feature/github-agentic-workflows", + wantOK: false, + }, { name: "url is not package", spec: "https://github.com/owner/repo", From 18589467f9eee51e8544909a1b7308cd2b8f532b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 10:59:15 +0000 Subject: [PATCH 4/5] test(cli): cover owner/repo@ref and owner/repo/route@ref specs Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/cli/add_package_manifest_test.go | 92 ++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/pkg/cli/add_package_manifest_test.go b/pkg/cli/add_package_manifest_test.go index 2d4caa7fb52..1bd4e362b7a 100644 --- a/pkg/cli/add_package_manifest_test.go +++ b/pkg/cli/add_package_manifest_test.go @@ -417,6 +417,57 @@ files: assert.Equal(t, ".github/workflows/nightly-review.md", resolved.Workflows[1].Spec.WorkflowPath) } +func TestResolveWorkflows_RepositoryPackageWithRef(t *testing.T) { + originalFetchFn := fetchWorkflowFromSourceWithContextFn + originalDownload := downloadPackageFileFromGitHubForHost + originalList := listPackageWorkflowFilesForHost + originalDefaultBranch := getRepositoryPackageDefaultBranch + t.Cleanup(func() { + fetchWorkflowFromSourceWithContextFn = originalFetchFn + downloadPackageFileFromGitHubForHost = originalDownload + listPackageWorkflowFilesForHost = originalList + getRepositoryPackageDefaultBranch = originalDefaultBranch + }) + getRepositoryPackageDefaultBranch = func(repoSlug, host string) (string, error) { + t.Fatalf("default branch lookup should not be used when ref is explicitly provided") + return "", nil + } + + const expectedRef = "feature/github-agentic-workflows" + downloadPackageFileFromGitHubForHost = func(owner, repo, path, ref, host string) ([]byte, error) { + assert.Equal(t, expectedRef, ref) + switch path { + case "aw.yml": + return []byte(`name: Repo Assist +files: + - workflows/review.md +`), nil + case "README.md": + return []byte("# Repo Assist\n"), nil + } + return nil, createRepositoryPackageNotFoundError(path) + } + listPackageWorkflowFilesForHost = func(owner, repo, ref, workflowPath, host string) ([]string, error) { + t.Fatalf("unexpected scan of %s", workflowPath) + return nil, nil + } + fetchWorkflowFromSourceWithContextFn = func(_ context.Context, spec *WorkflowSpec, _ bool) (*FetchedWorkflow, error) { + assert.Equal(t, expectedRef, spec.Version) + return &FetchedWorkflow{ + Content: []byte("---\nname: Test\non: push\n---\n"), + CommitSHA: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + IsLocal: false, + SourcePath: spec.WorkflowPath, + }, nil + } + + resolved, err := ResolveWorkflows(context.Background(), []string{"owner/repo@" + expectedRef}, false) + require.NoError(t, err) + require.Len(t, resolved.Workflows, 1) + assert.Equal(t, "workflows/review.md", resolved.Workflows[0].Spec.WorkflowPath) + assert.Equal(t, expectedRef, resolved.Workflows[0].Spec.Version) +} + func TestResolveWorkflows_NestedRepositoryPackage(t *testing.T) { originalFetchFn := fetchWorkflowFromSourceWithContextFn originalDownload := downloadPackageFileFromGitHubForHost @@ -494,6 +545,38 @@ func TestResolveWorkflows_FallsBackToWorkflowWhenNestedManifestMissing(t *testin assert.Equal(t, "workflows/review.md", resolved.Workflows[0].Spec.WorkflowPath) } +func TestResolveWorkflows_FallsBackToWorkflowWithRefWhenNestedManifestMissing(t *testing.T) { + originalFetchFn := fetchWorkflowFromSourceWithContextFn + originalDownload := downloadPackageFileFromGitHubForHost + originalDefaultBranch := getRepositoryPackageDefaultBranch + t.Cleanup(func() { + fetchWorkflowFromSourceWithContextFn = originalFetchFn + downloadPackageFileFromGitHubForHost = originalDownload + getRepositoryPackageDefaultBranch = originalDefaultBranch + }) + getRepositoryPackageDefaultBranch = func(repoSlug, host string) (string, error) { + return "main", nil + } + + downloadPackageFileFromGitHubForHost = func(owner, repo, path, ref, host string) ([]byte, error) { + return nil, createRepositoryPackageNotFoundError(path) + } + fetchWorkflowFromSourceWithContextFn = func(_ context.Context, spec *WorkflowSpec, _ bool) (*FetchedWorkflow, error) { + return &FetchedWorkflow{ + Content: []byte("---\nname: Test\non: push\n---\n"), + CommitSHA: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + IsLocal: false, + SourcePath: spec.WorkflowPath, + }, nil + } + + resolved, err := ResolveWorkflows(context.Background(), []string{"owner/repo/review@feature/github-agentic-workflows"}, false) + require.NoError(t, err) + require.Len(t, resolved.Workflows, 1) + assert.Equal(t, "workflows/review.md", resolved.Workflows[0].Spec.WorkflowPath) + assert.Equal(t, "feature/github-agentic-workflows", resolved.Workflows[0].Spec.Version) +} + func TestResolveWorkflows_DirectWorkflowPathWithBranchRef(t *testing.T) { originalFetchFn := fetchWorkflowFromSourceWithContextFn originalDownload := downloadPackageFileFromGitHubForHost @@ -530,6 +613,7 @@ func TestParseRepositoryPackageSpec(t *testing.T) { wantErr string wantRepoSlug string wantPackagePath string + wantVersion string }{ { name: "repo only package", @@ -537,6 +621,13 @@ func TestParseRepositoryPackageSpec(t *testing.T) { wantOK: true, wantRepoSlug: "owner/repo", }, + { + name: "repo only package with ref", + spec: "owner/repo@feature/github-agentic-workflows", + wantOK: true, + wantRepoSlug: "owner/repo", + wantVersion: "feature/github-agentic-workflows", + }, { name: "nested package path", spec: "owner/repo/packages/repo-assist", @@ -584,6 +675,7 @@ func TestParseRepositoryPackageSpec(t *testing.T) { require.NotNil(t, repoSpec) assert.Equal(t, tt.wantRepoSlug, repoSpec.RepoSlug) assert.Equal(t, tt.wantPackagePath, repoSpec.PackagePath) + assert.Equal(t, tt.wantVersion, repoSpec.Version) }) } } From 0b8459e3ee2434143d7148746e35b5beefdae377 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 11:00:19 +0000 Subject: [PATCH 5/5] test(cli): tighten diagnostics in spec regression stubs Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/cli/add_package_manifest_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cli/add_package_manifest_test.go b/pkg/cli/add_package_manifest_test.go index 1bd4e362b7a..966c0ba6d22 100644 --- a/pkg/cli/add_package_manifest_test.go +++ b/pkg/cli/add_package_manifest_test.go @@ -429,7 +429,7 @@ func TestResolveWorkflows_RepositoryPackageWithRef(t *testing.T) { getRepositoryPackageDefaultBranch = originalDefaultBranch }) getRepositoryPackageDefaultBranch = func(repoSlug, host string) (string, error) { - t.Fatalf("default branch lookup should not be used when ref is explicitly provided") + t.Fatalf("default branch lookup should not be used when ref is explicitly provided (repoSlug=%q host=%q)", repoSlug, host) return "", nil } @@ -448,7 +448,7 @@ files: return nil, createRepositoryPackageNotFoundError(path) } listPackageWorkflowFilesForHost = func(owner, repo, ref, workflowPath, host string) ([]string, error) { - t.Fatalf("unexpected scan of %s", workflowPath) + t.Fatalf("unexpected scan of %q (owner=%q repo=%q ref=%q host=%q)", workflowPath, owner, repo, ref, host) return nil, nil } fetchWorkflowFromSourceWithContextFn = func(_ context.Context, spec *WorkflowSpec, _ bool) (*FetchedWorkflow, error) {