Skip to content
Security
Skill

/gh-aw

Create and maintain GitHub Agentic Workflows (gh-aw) for Prowler. Trigger: When creating agentic workflows, modifying gh-aw frontmatter, configuring safe-outputs, setting up MCP servers in workflows, importing Copilot Custom Agents, or debugging gh-aw compilation.

From plugin
prowler
15k39 skills1 MCP

Claude Code

$ npx -y skills add prowler-cloud/prowler --skill gh-aw --agent claude-code

SKILL.md

gh-aw.SKILL.md
name: gh-aw
description: >
  Create and maintain GitHub Agentic Workflows (gh-aw) for Prowler.
  Trigger: When creating agentic workflows, modifying gh-aw frontmatter, configuring safe-outputs,
  setting up MCP servers in workflows, importing Copilot Custom Agents, or debugging gh-aw compilation.
license: Apache-2.0
metadata:
  author: prowler-cloud
  version: "1.1"
  scope: [root]
  auto_invoke:
    - "Creating GitHub Agentic Workflows"
    - "Modifying gh-aw workflow frontmatter or safe-outputs"
    - "Configuring MCP servers in agentic workflows"
    - "Importing Copilot Custom Agents into workflows"
    - "Debugging gh-aw compilation errors"
allowed-tools: Read, Edit, Write, Glob, Grep, Bash, WebFetch

When to Use

  • Creating new `.github/workflows/*.md` agentic workflows
  • Modifying frontmatter (triggers, permissions, safe-outputs, tools, MCP servers)
  • Creating or importing `.github/agents/*.md` Copilot Custom Agents
  • Debugging `gh aw compile` errors or warnings
  • Configuring network access, rate limits, or footer templates

---

File Layout

.github/
├── workflows/
│   ├── {name}.md              # Frontmatter + thin context dispatcher
│   └── {name}.lock.yml        # Auto-generated — NEVER edit manually
├── agents/
│   └── {name}.md              # Full agent persona (reusable)
└── aw/
    └── actions-lock.json      # Action SHA pinning — commit this

See [references/](references/) for existing workflow and agent examples in this repo.

Prowler's Workflow (reference implementation)

| Item | Value in `.github/workflows/issue-triage.md` | |------|----------------------------------------------| | Trigger | `issues: labeled` with `names: [ai-issue-review]`, gated by `status/needs-triage` | | Engine / strict | `engine: copilot`, `strict: false` (custom MCP domains) | | Agent | `imports: [../agents/issue-triage.md]` | | MCP servers | `prowler` (`https://mcp.prowler.com/mcp`, Hub + docs tools only), `context7` | | Writes | `safe-outputs.add-comment` only (label automation commented out) | | Compiled by | gh-aw v0.81.6 (header of `issue-triage.lock.yml`) |

---

Critical Patterns

AGENTS.md Is the Source of Truth

Agent personas MUST NOT hardcode codebase layout, file paths, skill names, tech stack versions, or project conventions. All of this lives in the repo's `AGENTS.md` files and WILL go stale if duplicated.

**Instead**: Instruct the agent to READ `AGENTS.md` at runtime:

# In the agent persona:
Read `AGENTS.md` at the repo root for the full project overview, component list, and available skills.

For monorepos with component-specific `AGENTS.md` files, include a routing table that tells the agent WHICH file to read based on context — but never copy the contents of those files into the agent:

| Component | AGENTS.md | When to read |
|-----------|-----------|-------------|
| Backend   | `api/AGENTS.md`    | API errors, endpoint bugs |
| Frontend  | `ui/AGENTS.md`     | UI crashes, rendering bugs |
| Root      | `AGENTS.md`        | Cross-component, CI/CD |

**Why this matters**: Agent personas are deployed as workflow files. When `AGENTS.md` updates (new skills, renamed paths, version bumps), agents that READ it at runtime get the update automatically. Agents that HARDCODE it require a separate PR to stay current — and they won't.

Two-File Architecture

Workflow file = **config + context only**. Agent file = **all reasoning logic**.

The workflow imports the agent via `imports:` and passes sanitized runtime context. The agent contains the persona, rules, steps, and output format. This separation makes agents reusable across workflows.

Import Path Resolution

Paths resolve **relative to the importing file**, NOT from repo root:

# From .github/workflows/my-workflow.md:
imports:
  - ../agents/my-agent.md        # CORRECT
  - .github/agents/my-agent.md   # WRONG — resolves to .github/workflows/.github/agents/

Sanitized Context (Security)

NEVER pass raw `github.event.issue.body` to the agent. Use the sanitized activation output, as `.github/workflows/issue-triage.md` does (compiler v0.81.6):

## Sanitized Issue Content

${{ steps.sanitized.outputs.text }}

Title and number (`${{ github.event.issue.title }}`, `#${{ github.event.issue.number }}`) are fine to pass as context.

Read-Only Permissions + Safe Outputs

Workflows run read-only. Writes go through `safe-outputs`:

# GOOD
permissions:
  issues: read
safe-outputs:
  add-comment:
    hide-older-comments: true

# BAD — never give the agent write access
permissions:
  issues: write

Strict Mode

`strict: true` (default) enforces: no write permissions, explicit network config, no wildcard domains, ecosystem identifiers required. **IMPORTANT**: `strict: true` rejects custom domains in `network.allowed` — only ecosystem identifiers (`defaults`, `python`, `node`, etc.) are permitted. Workflows using custom MCP server domains (e.g., `mcp.prowler.com`) MUST use `strict: false`. This is an intentional tradeoff, not a development shortcut.

Footer Control

Prevent double footers with `messages.footer`:

safe-outputs:
  messages:
    footer: "> 🤖 Generated by [{workflow_name}]({run_url}) [Experimental]"

Variables: `{workflow_name}`, `{run_url}`, `{triggering_number}`, `{event_type}`, `{status}`.

MCP Servers

Always use `allowed` to restrict tools. Add domains to `network.allowed`:

network:
  allowed:
    - "mcp.prowler.com"

mcp-servers:
  prowler:
    url: "https://mcp.prowler.com/mcp"
    allowed:
      - prowler_hub_get_check_details
      - prowler_hub_get_check_code
      - prowler_docs_search

---

Security Hardening

Defense-in-Depth Layers (Workflow Author's Responsibility)

gh-aw provides substrate-level and plan-level security automatically. The workflow author controls configuration-level security. Apply ALL of the following:

| Layer | How | Why | |-------|--

Read more
@prowler-cloud
Ships withprowler

Prowler is the world’s most widely used Open-Source Cloud Security Platform that automates security and compliance across any cloud environment.

15k39 skills1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
15.2k
Star history of prowler-cloud/prowler on GitHub, a chart by star-history.com

Other skills on prowler.

ai-sdk-5

ai-sdk-5

Vercel AI SDK patterns for the installed major (ui/package.json: `ai` 6.x, `@ai-sdk/react` 3.x). The skill name is historical;…

django-drf

django-drf

Django REST Framework patterns. Trigger: When implementing generic DRF APIs (ViewSets, serializers, routers, permissions,…

jsonapi

jsonapi

Strict JSON:API v1.1 specification compliance. Trigger: When creating or modifying API endpoints, reviewing API responses, or…

nextjs-16

nextjs-16

Next.js 16 App Router patterns. Trigger: When working in Next.js App Router (app/), Server Components vs Client Components,…

More skills from other plugins.

api-security

api-security

Use for authorized security assessment of REST, GraphQL, WebSocket, or SOAP APIs, including discovery, authentication,…

@zhaoxuya520@zhaoxuya520Install Skill
nemoclaw-user-guide

nemoclaw-user-guide

Find official NemoClaw documentation for installation, configuration, operation, or troubleshooting. Also handles requested docs…

nemoclaw10d23k
@nvidia@nvidiaInstall Skill

Questions about gh-aw.

Which coding agents can use gh-aw?
gh-aw installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.