nitinjain999/platform-skills/composite-actions
Claude Code and agent skill by nitinjain999/platform-skills
- community
Checking that the SKILL.md file is still in the repository.
Generate, review, secure, and test composite GitHub Actions following best practices — full repo scaffold, interview-driven generation, PR creation on existing repos, SHA pinning, secrets-as-inputs, job summaries, and actionlint validation.
Install
npx vskill@latest install nitinjain999/platform-skills/composite-actionsSKILL.md
Composite Actions Command
Generate production-ready composite GitHub Actions or audit existing ones against best practices.
Activation
Mode: generate
Triggers: generate, create, new action, scaffold, write action, build action
Run a guided interview, then generate a complete, production-ready composite action with all supporting files. If the target repo already exists, open a PR.
Interview — ask these questions in order
Step 1 — Purpose
What does this action do? Describe it in one or two sentences.(e.g. "Build a Docker image and push it to GHCR using OIDC", "Send a Slack notification with build status and PR link")
Derive the action name from the description (kebab-case, under 30 chars). Confirm with the user.
Step 2 — Repo destination
Where should this action live?1. New dedicated repo — best for shared/public actions (Marketplace-publishable)2. Existing repo — internal action, placed under.github/actions/<name>/oractions/<name>/
If existing repo: ask for owner/repo. Verify it exists with gh repo view owner/repo. Then ask:
Which subdirectory? (default:.github/actions/<action-name>)
If the repo exists and is accessible, the action will be created on a branch and a PR will be opened automatically.
Step 3 — Pinning strategy
How should external actions be pinned?1. SHA pinning (recommended — supply chain secure, immutable)2. Semver floating tag (e.g. `@v4` — easier to maintain, lower security)
Resolve SHAs for all external actions used via gh api repos/{owner}/{repo}/git/refs/tags/{tag} if SHA pinning is chosen.
Step 4 — Inputs
What inputs does this action need? For each input, collect:- Name (snake_case)- Type:string/boolean/choice- Required or optional?- If optional: default value- Is it a secret? (webhook URL, kubeconfig, token, password, API key)
List all inputs in a table and confirm before proceeding.
Step 5 — Outputs
What values should this action expose as outputs? For each:- Name (snake_case)- Description (one sentence)
Step 6 — Cloud credentials
Does this action need cloud credentials?1. AWS via OIDC (no long-lived keys —id-token: writerequired)2. Azure via OIDC3. Both4. Neither
Step 7 — Notifications and PR comments
Should this action send notifications or post PR comments?1. Slack webhook notification2. GitHub PR comment (requirespull-requests: write)3. Both4. Neither
Step 8 — Job summary
Should this action write a job summary visible in the Actions UI?(Recommended: yes — adds a Markdown summary table with inputs, outputs, and status)
Step 9 — Confirm and generate
Show the user a summary of what will be generated:
Ask for confirmation before generating.
Generated file contents
action.yml
Generate with:
name,description,authorfilled from the interview- All inputs from Step 4, with
description:noting which are secrets - All outputs from Step 5
- A validation step as the first step — validates all required inputs and enum constraints
- Log grouping (
::group::/::endgroup::) around each logical phase - All secrets passed through
env:blocks — never${{ inputs.secret }}inrun: ::add-mask::on every secret value immediately after it is read${{ github.action_path }}for all file referencesshell: bashon everyrun:step- All external
uses:pinned per the chosen strategy $GITHUB_STEP_SUMMARYwritten in a finalif: always()steptimeout-minutes:on every network-bound stepbranding:block with an appropriate icon and color
README.md
Generate an awesome-docs-compatible README with:
.github/dependabot.yml
.github/workflows/test-action.yml
A test workflow that:
- Triggers on
pushandpull_requestpaths matching the action directory - Calls the action using a local path reference (
./or./.github/actions/<name>) - Runs a matrix covering all optional inputs
- Verifies all outputs with assertions
- Uses
actinstructions in a comment header
.github/workflows/release.yml
- Triggers on
pushto tags matchingv[0-9]+.[0-9]+.[0-9]+ - Validates
action.ymlwithyq(preinstalled on the runner, nothing downloaded):runs.usingiscomposite, every step key is one a composite step accepts, and everyrun:step hasshell:. Notactionlint: it lints workflows, and onaction.ymlit fails every release with"jobs" section is missing - Fails the release when an external
uses:is not pinned to a 40-character SHA - Updates the floating major version tag
- Creates a GitHub release with auto-generated notes
PR creation (existing repo)
After generating all files:
After PR creation, output:
PR opened:<PR URL>Run/platform-skills:awesome-docs generateon the README to add architecture flow, lifecycle loop, and field carousel diagrams.
Mode: review
Triggers: review, audit, check, lint my action, is this action safe
Audit an existing action.yml against the production checklist. Ask the user to paste or provide the path to the file.
Evaluate and report findings in three tiers:
CRITICAL (must fix before use)
- External
uses:with mutable tag (@v4,@main,@latest) — supply chain risk run:step missingshell:— error on many runners${{ inputs.* }}interpolated directly inrun:commands — injection risk
Input injection — safe vs unsafe:
Pass a secret input the same way, through env:, and send it in a request header. A token in a URL query string ends up in server and proxy logs.
This applies to ALL run: steps. Never interpolate ${{ inputs.* }}, ${{ github.event.* }}, or ${{ steps.*.outputs.* }} directly into shell commands.
- Secrets accessed via
${{ secrets.* }}inside the action — always empty, silent failure
WARNING (should fix)
- No input validation step
- Secret inputs not masked with
::add-mask::after reading - File references using
./instead of${{ github.action_path }} - Boolean inputs compared with
== trueinstead of== 'true' - No
$GITHUB_STEP_SUMMARYwritten - No
timeout-minuteson network-bound steps - No
id:on steps that produce outputs
INFORMATIONAL
- No
branding:block - Missing
description:on inputs or outputs - No
dependabot.ymlfor the actions ecosystem - No test workflow present
Report format:
Mode: secure
Triggers: secure, harden, fix, pin actions, add shell
Fix an existing action.yml in place. Apply all CRITICAL and WARNING fixes automatically:
- Resolve SHA pins — for each
uses:with a mutable tag, callgh apito resolve to the current SHA and add the version as a comment - Add `shell: bash` — to every
run:step missing it - Move inputs to `env:` blocks — replace
${{ inputs.* }}inrun:with env variable references - Add `::add-mask::` — on every step that reads a secret input
- Add input validation step — inject a validation step as the first step if none exists
- Add job summary — inject a
$GITHUB_STEP_SUMMARYstep if none exists
Report what was changed:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/composite-actions/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/nitinjain999/platform-skills/composite-actions)