/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.
$ npx -y skills add prowler-cloud/prowler --skill gh-aw --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/gh-aw
Context preview
The summary Claude sees to decide when to auto-load this skill.
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.
SKILL.md
gh-aw.SKILL.mdname: 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.0"
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, WebFetchWhen 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 thisSee [references/](references/) for existing workflow and agent examples in this repo.
---
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:
${{ needs.activation.outputs.text }}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: writeStrict 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-only permissions** | Only `read` in `permissions:` | Agent never gets write access | | **Safe outputs** | Declare writes in `safe-outputs:` | Writes happen in separate jobs with scoped permissions | | **Sanitized context** | `${{ needs.activation.outputs.text }}` | Prevents prompt injection from raw issue/PR body | | **Explicit network** | List domains in `network.allowed:` | AWF firewall blocks all other egress | | **Tool allowlisting** | `allowed:` in each `mcp-servers:` entry | Restricts which MCP tools the agent can call | | **Concurrency** | `concurrency:` with `cancel-in-progress: true` | Prevents race conditions on same trigger | | **Rate limiting** | `rate-limit:` with `max` and `window` | Prevents abuse via rapid re-triggering | | **Threat detection** | Custom `prompt` under `safe-outputs.threat-detection:` | AI scans agent output before
Read more
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.0"
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, WebFetchWhen 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 thisSee [references/](references/) for existing workflow and agent examples in this repo.
---
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:
${{ needs.activation.outputs.text }}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: writeStrict 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-only permissions** | Only `read` in `permissions:` | Agent never gets write access | | **Safe outputs** | Declare writes in `safe-outputs:` | Writes happen in separate jobs with scoped permissions | | **Sanitized context** | `${{ needs.activation.outputs.text }}` | Prevents prompt injection from raw issue/PR body | | **Explicit network** | List domains in `network.allowed:` | AWF firewall blocks all other egress | | **Tool allowlisting** | `allowed:` in each `mcp-servers:` entry | Restricts which MCP tools the agent can call | | **Concurrency** | `concurrency:` with `cancel-in-progress: true` | Prevents race conditions on same trigger | | **Rate limiting** | `rate-limit:` with `max` and `window` | Prevents abuse via rapid re-triggering | | **Threat detection** | Custom `prompt` under `safe-outputs.threat-detection:` | AI scans agent output before
Prowler is the world’s most widely used Open-Source Cloud Security Platform that automates security and compliance across any cloud environment.
Repo: prowler-cloud/prowler
Other skills on prowler.
- /framework-compliance-triage
Make a cloud account compliant with a security or industry framework using Prowler Cloud.
Open skill - /ai-sdk-5
Vercel AI SDK 5 patterns. Trigger: When building AI features with AI SDK v5 (chat, streaming, tools/function calling, UIMessage parts), including migration from v4.
Open skill - /django-drf
Django REST Framework patterns. Trigger: When implementing generic DRF APIs (ViewSets, serializers, routers, permissions, filtersets). For Prowler API specifics (RLS/RBAC/Providers), also use prowler-api.
Open skill - /django-migration-psql
Reviews Django migration files for PostgreSQL best practices specific to Prowler. Trigger: When creating migrations, running makemigrations/pgmakemigrations, reviewing migration PRs, adding indexes or constraints to database tables, modifying existing migration files, or writing
Open skill - /jsonapi
Strict JSON:API v1.1 specification compliance. Trigger: When creating or modifying API endpoints, reviewing API responses, or validating JSON:API compliance.
Open skill - /nextjs-16
Next.js 16 App Router patterns. Trigger: When working in Next.js App Router (app/), Server Components vs Client Components, Server Actions, Route Handlers, proxy.ts, caching/revalidation, Cache Components, and streaming/Suspense.
Open skill

