Skip to content

[Bug] gh aw add writes short-form source: path that breaks gh aw update for cross-repo workflows #28308

@edgeq

Description

@edgeq

Summary

When using gh aw add to install a workflow from another repository, the generated source: field uses a short-form path that omits the .github/workflows/ prefix. This causes gh aw update to fail with a 404 when it tries to fetch the file from the source repo.

Steps to reproduce

  1. Create a shared workflow repo with a workflow at .github/workflows/my-workflow.md
  2. From a consuming repo, run:
    gh aw add my-org/shared-workflows/my-workflow@main
  3. Observe the generated source: field in the consuming repo's .github/workflows/my-workflow.md:
    source: my-org/shared-workflows/my-workflow.md@abc123def456
  4. Make a change in the shared repo and push
  5. From the consuming repo, run:
    gh aw update

Expected behavior

gh aw update fetches the latest version and merges changes.

Actual behavior

✗ Failed to update 1 workflow(s):
  my-workflow: failed to download workflow: failed to fetch file content: exit status 1

The update fails because the source: path resolves to my-org/shared-workflows/my-workflow.md at the API level, but the actual file is at .github/workflows/my-workflow.md in the repo.

Workaround

Manually update the source: field to include the full path:

# Before (generated by gh aw add)
source: my-org/shared-workflows/my-workflow.md@abc123def456

# After (fixes gh aw update)
source: my-org/shared-workflows/.github/workflows/my-workflow.md@main

Related: local vs remote import path resolution

The same short-form vs full-path issue affects {{#import}} directives in workflow bodies. When a shared workflow uses relative imports like:

{{#import shared/doc-sync/phases.md}}

This compiles fine locally because gh aw compile resolves paths relative to .github/workflows/. However, when a consuming repo adds the workflow via gh aw add, the import is expanded to a remote reference:

{{#import my-org/shared-workflows/shared/doc-sync/phases.md@abc123}}

This 404s because the GitHub API resolves from the repo root, where the actual path is .github/workflows/shared/doc-sync/phases.md.

The workaround is to use full repo-root-relative paths in the source workflow:

{{#import .github/workflows/shared/doc-sync/phases.md}}

This works for both local compile and remote resolution, but it means workflow authors need to know that gh aw add doesn't translate the short-form paths the way gh aw compile does locally.

Additional notes

  • gh aw compile and workflow execution are not affected by the source: issue — only gh aw update breaks
  • The {{#import}} lines in the body are correctly expanded to full paths when using the full-path workaround; only source: uses the short form regardless
  • It would also be useful to have a flag (e.g. --ref main) to pin source: to a branch instead of a commit SHA, so consuming repos can track the latest version without manual edits

Metadata

Metadata

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions