<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 2B0748</title>
    <description>The latest articles on DEV Community by 2B0748 (@2b0748).</description>
    <link>https://dev.to/2b0748</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4044823%2Fbb67ec72-c2b3-49e0-a450-842ce29fa1e7.png</url>
      <title>DEV Community: 2B0748</title>
      <link>https://dev.to/2b0748</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/2b0748"/>
    <language>en</language>
    <item>
      <title>I Built an AI Skill That Writes GitHub Actions Workflows — With Zero Config Errors</title>
      <dc:creator>2B0748</dc:creator>
      <pubDate>Fri, 24 Jul 2026 04:55:59 +0000</pubDate>
      <link>https://dev.to/2b0748/i-built-an-ai-skill-that-writes-github-actions-workflows-with-zero-config-errors-2mh1</link>
      <guid>https://dev.to/2b0748/i-built-an-ai-skill-that-writes-github-actions-workflows-with-zero-config-errors-2mh1</guid>
      <description>&lt;h1&gt;
  
  
  I Built an AI Skill That Writes GitHub Actions Workflows — With Zero Config Errors
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop hand-crafting YAML. Let any AI agent generate production-ready workflows with 12 quality gates, 5 decision templates, and 3 mandatory security configs.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Hand-writing GitHub Actions YAML is error-prone. Did you remember &lt;code&gt;permissions&lt;/code&gt;? Did you pin action versions? Did you configure caching? Is concurrency set?&lt;/p&gt;

&lt;p&gt;Every omitted config is either slower builds, security holes, or wasted billable minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built an &lt;strong&gt;AI Skill&lt;/strong&gt; — an executable instruction set, not a vague prompt. It forces any AI agent to follow a strict pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Decision Tree → Mandatory Config Injection → Cache Matching → 12 Quality Gates → Production YAML
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  One sentence, instant result:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add CI for my Node.js project — run eslint and jest on PRs"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What the AI generates under the hood:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ Detects &lt;code&gt;package.json&lt;/code&gt; → Node.js&lt;/li&gt;
&lt;li&gt;✅ Template A (CI) selected&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;permissions: contents: read&lt;/code&gt; injected&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;concurrency&lt;/code&gt; with auto-cancel&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;cache: 'npm'&lt;/code&gt; → ~70% faster installs&lt;/li&gt;
&lt;li&gt;✅ All actions SHA-1 pinned (&lt;code&gt;@11bd71...&lt;/code&gt; not &lt;code&gt;@v4&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ 12-point checklist validated&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;5 seconds. Zero omissions.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sets It Apart
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Universal&lt;/th&gt;
&lt;th&gt;Security Check&lt;/th&gt;
&lt;th&gt;Caching&lt;/th&gt;
&lt;th&gt;Quality Gates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub templates&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual YAML&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw ChatGPT prompt&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;This Skill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ All agents&lt;/td&gt;
&lt;td&gt;✅ 5 red lines&lt;/td&gt;
&lt;td&gt;✅ 6 langs&lt;/td&gt;
&lt;td&gt;✅ 12 gates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Raw LLM chats miss configs every time. This Skill makes them &lt;strong&gt;mandatory&lt;/strong&gt;, not optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Decision Paths Cover 95% of Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"lint / test / PR" → CI Workflow&lt;/li&gt;
&lt;li&gt;"Tag / Release / publish" → Release Workflow
&lt;/li&gt;
&lt;li&gt;"cron / scheduled / Dependabot" → Scheduled Workflow&lt;/li&gt;
&lt;li&gt;"security / CodeQL / scan" → Security Workflow&lt;/li&gt;
&lt;li&gt;"Issue / triage / auto-label" → Automation Workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every template enforces &lt;strong&gt;least-privilege permissions, concurrency control, and SHA-1 pinned actions&lt;/strong&gt; — no exceptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Security Red Lines
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;❌ Hardcoded tokens → blocked&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;pull_request_target&lt;/code&gt; misuse → blocked&lt;/li&gt;
&lt;li&gt;❌ Overwriting workflows without confirmation → blocked&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;@main&lt;/code&gt; / &lt;code&gt;@master&lt;/code&gt; action refs → blocked&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;permissions: write-all&lt;/code&gt; → blocked&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Universal — Works With ANY AI Agent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SKILL.md&lt;/code&gt; → &lt;code&gt;.claude/skills/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;PROMPT.md&lt;/code&gt; → &lt;code&gt;.cursor/rules/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;PROMPT.md&lt;/code&gt; → &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windsurf / Aider / Cline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paste into System Prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;International users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;PROMPT.en.md&lt;/code&gt; (English)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Before/After
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ❌ Without Skill — typical raw LLM output&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;    &lt;span class="c1"&gt;# unpinned&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;              &lt;span class="c1"&gt;# no cache&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;                 &lt;span class="c1"&gt;# no permissions, no concurrency&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ With Skill — production-grade&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}&lt;/span&gt;
  &lt;span class="na"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683&lt;/span&gt; &lt;span class="c1"&gt;# v4.2.2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@cd063736c72066a58f36dd95fb0460484b220fb7&lt;/span&gt; &lt;span class="c1"&gt;# v4.3.0&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;npm'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx eslint .&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lint&lt;/span&gt;
    &lt;span class="c1"&gt;# ... full pipeline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/2B0748/github-actions-skill.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Star the repo if you find it useful. PRs welcome for new language templates and edge cases.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>devops</category>
      <category>github</category>
    </item>
  </channel>
</rss>
