<?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: Daniel Montes</title>
    <description>The latest articles on DEV Community by Daniel Montes (@danielmontes9).</description>
    <link>https://dev.to/danielmontes9</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1022150%2Fe446c3b0-d601-4b57-89d6-910effb2fb3c.png</url>
      <title>DEV Community: Daniel Montes</title>
      <link>https://dev.to/danielmontes9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielmontes9"/>
    <language>en</language>
    <item>
      <title>Layer 3 of the Agentic OS: Taming AI with Deterministic Hooks and Workflows</title>
      <dc:creator>Daniel Montes</dc:creator>
      <pubDate>Sat, 02 May 2026 17:26:18 +0000</pubDate>
      <link>https://dev.to/danielmontes9/layer-3-of-the-agentic-os-taming-ai-with-deterministic-hooks-and-workflows-4hd</link>
      <guid>https://dev.to/danielmontes9/layer-3-of-the-agentic-os-taming-ai-with-deterministic-hooks-and-workflows-4hd</guid>
      <description>&lt;p&gt;In our previous article, we explored &lt;strong&gt;Layer 2 (On-Demand Capabilities)&lt;/strong&gt;, which scales an AI assistant's intelligence by providing specialized Prompts and Custom Agents precisely when a developer needs them. &lt;/p&gt;

&lt;p&gt;But as you scale AI agents across an enterprise organization, a fundamental problem emerges: &lt;strong&gt;LLMs are inherently probabilistic.&lt;/strong&gt; They guess the next best string of tokens based on vast parameter networks. &lt;/p&gt;

&lt;p&gt;Enterprise platform engineering, however, absolutely demands &lt;strong&gt;determinism&lt;/strong&gt;. You cannot rely on an AI's "best guess" when it decides to modify a critical infrastructure file, parse sensitive data, or interact with a deployment pipeline.&lt;/p&gt;

&lt;p&gt;This is exactly where &lt;strong&gt;Layer 3 — Enforcement &amp;amp; Automation&lt;/strong&gt; comes into play. It is the governance layer that wraps your probabilistic AI in strict, deterministic rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Achieving Determinism
&lt;/h2&gt;

&lt;p&gt;Layer 3 introduces structural controls through system hooks and automated, autonomous workflows. It proves that an true Agentic OS isn't just about generating code faster inside your IDE; it is about operating a repository securely at scale.&lt;/p&gt;

&lt;p&gt;This layer consists of two powerful primitives:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Hooks (&lt;code&gt;.github/hooks/*.json&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Hooks are deterministic shell commands that fire automatically at specific moments during an agent's lifecycle. If you are familiar with Git hooks (like &lt;code&gt;pre-commit&lt;/code&gt; or &lt;code&gt;pre-push&lt;/code&gt;), agent hooks follow the exact same structural philosophy.&lt;/p&gt;

&lt;p&gt;They are incredibly powerful for establishing policy gates and file access controls—without relying on the LLM to "follow the rules" defined in a standard prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Lifecycle Events:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;preToolUse&lt;/code&gt;: Fires &lt;em&gt;before&lt;/em&gt; an agent is allowed to execute a tool. This is vital. A hook can run a shell script to verify if the AI has the organizational permission to modify a specific file or directory, and programmatically &lt;strong&gt;approve or deny&lt;/strong&gt; the execution &lt;em&gt;before&lt;/em&gt; any damage occurs.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;postToolUse&lt;/code&gt;: Fires immediately after a tool is used, making it perfect for writing detailed audit logs for compliance tracking.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;errorOccurred&lt;/code&gt;: Automatically triggers self-healing routines or alerts an engineering manager if an agent enters an infinite loop or fails catastrophically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Agentic Workflows (&lt;code&gt;.github/workflows/&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;While developers interact with Copilot actively in their editors, a true Agentic OS runs 24/7 in the background. &lt;/p&gt;

&lt;p&gt;Agentic Workflows allow platform teams to define natural language chore automations that compile down into functional YAML GitHub Actions (often via tools like the &lt;code&gt;gh aw&lt;/code&gt; CLI). Because they run unattended in the background, they operate with &lt;strong&gt;read-only permissions by default&lt;/strong&gt;, ensuring maximum safety.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Autonomous Issue Triage:&lt;/strong&gt; A background workflow wakes up, reads newly created GitHub issues, categorizes them, assigns appropriate technical tags, and attempts to flag duplicate bug reports.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CI/CD Failure Analysis:&lt;/strong&gt; When a pipeline breaks, a background workflow analyzes the convoluted error logs, identifies the offending commit, and leaves a detailed issue comment explaining the exact fix to the responsible developer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Layer 3 bridges the painful gap between an individual developer's productivity tool and a compliant, enterprise-grade development platform. By utilizing Hooks and Agentic Workflows, you ensure your AI assistants operate strictly and deterministically within the boundaries of your organizational policies.&lt;/p&gt;

&lt;p&gt;At this point, you have built a perfect Agentic OS tailored for a single repository. But what if your company has 500 repositories fragmented across 20 different engineering teams?&lt;/p&gt;

&lt;p&gt;In the fourth and final article of this series, we will explore &lt;strong&gt;Layer 4 — Distribution&lt;/strong&gt;, detailing how to cleanly package your context, agents, and hooks into Plugins to share and enforce intelligence across your entire enterprise.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: This article is part of the "GitHub Copilot Agentic OS" series.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>agentic</category>
      <category>security</category>
    </item>
    <item>
      <title>Layer 2 of the Agentic OS: On-Demand Capabilities for GitHub Copilot</title>
      <dc:creator>Daniel Montes</dc:creator>
      <pubDate>Sat, 25 Apr 2026 17:28:13 +0000</pubDate>
      <link>https://dev.to/danielmontes9/layer-2-of-the-agentic-os-on-demand-capabilities-for-github-copilot-poa</link>
      <guid>https://dev.to/danielmontes9/layer-2-of-the-agentic-os-on-demand-capabilities-for-github-copilot-poa</guid>
      <description>&lt;p&gt;In our previous article, we discussed how &lt;strong&gt;Layer 1 (Always-On Context)&lt;/strong&gt; forms the bedrock of your Agentic OS by silently injecting global coding standards into every prompt. It is incredibly powerful, but it introduces a new scaling problem: &lt;strong&gt;context exhaustion&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you stuff every architectural diagram, deployment runbook, and security protocol into your &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;, you will inevitably overwhelm the Large Language Model (LLM). This dilutes the AI's focus, increases latency, and triggers the dreaded "hallucinations."&lt;/p&gt;

&lt;p&gt;To keep the AI sharp, we need intentionality. Enter &lt;strong&gt;Layer 2 — On-Demand Capabilities&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy of Layer 2: Progressive Loading
&lt;/h2&gt;

&lt;p&gt;Layer 2 is all about providing context &lt;em&gt;only when it is hyper-relevant&lt;/em&gt; to the task at hand. Instead of a single massive set of rules, you break down complex operations into discrete, manually invoked tools.&lt;/p&gt;

&lt;p&gt;The Agentic OS defines three distinct primitives residing in Layer 2:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prompt Files (&lt;code&gt;.github/prompts/*.prompt.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Prompt files are essentially saved macros. They bundle up complex instructions and context into simple "slash commands" that a developer can invoke in the chat interface.&lt;/p&gt;

&lt;p&gt;Why ask the AI: &lt;em&gt;"Please review this code for security vulnerabilities, focusing specifically on SQL injection and XSS according to our internal security policy"&lt;/em&gt; when you can just type &lt;code&gt;/security-review&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/changelog&lt;/code&gt;: Automatically generate release notes from git history using a specific template.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/refactor-tests&lt;/code&gt;: Apply a specific mocking structure to legacy unit tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Custom Agents (&lt;code&gt;.github/agents/*.agent.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;While standard Copilot acts as a generalist, Custom Agents act as &lt;strong&gt;specialist personas&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;You can define agents equipped with their own specific tools and Model Context Protocol (MCP) servers. The true power of Custom Agents lies in &lt;strong&gt;hand-offs&lt;/strong&gt; (agent chaining). &lt;/p&gt;

&lt;p&gt;Instead of asking one monolithic AI to build an entire feature, you can chain highly focused agents together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Planning Agent:&lt;/strong&gt; Analyzes the GitHub issue and generates an architecture document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation Agent:&lt;/strong&gt; Reads the architecture document and writes the exact code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review Agent:&lt;/strong&gt; Critiques the generated code against specific enterprise security standards.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Skills (&lt;code&gt;.github/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Skills are self-contained folders that encapsulate instructions, scripts, and Markdown references for repeatable technical operations.&lt;/p&gt;

&lt;p&gt;They rely on &lt;strong&gt;progressive loading&lt;/strong&gt;. Copilot only reads the short description of the Skill at first. If it decides the specific Skill is needed to answer a developer's prompt (e.g., navigating a server outage), it will proactively load the &lt;em&gt;full&lt;/em&gt; set of instructions inside &lt;code&gt;SKILL.md&lt;/code&gt; into its active context window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Incident Triage:&lt;/strong&gt; A skill that knows how to parse production logs and cross-reference them with recent deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code (IaC) Risk Analysis:&lt;/strong&gt; A skill explicitly invoked to check Terraform Pull Requests against cloud compliance rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Layer 2 transforms Copilot from a single chat window into an arsenal of specialized tools. By segmenting your team's knowledge into distinct Prompts, Agents, and Skills, you maintain a lean, highly articulate AI assistant capable of scaling up for complex tasks without losing its mind.&lt;/p&gt;

&lt;p&gt;But what happens when things go wrong? What if you want to prevent an AI from executing a tool unless a human reviews it? Or what if you want a workflow to run autonomously in the background without a developer even opening their IDE?&lt;/p&gt;

&lt;p&gt;In the next article, we will explore &lt;strong&gt;Layer 3 — Enforcement &amp;amp; Automation&lt;/strong&gt;, where probabilistic AI finally meets enterprise-grade deterministic rules.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: This article is part of the "GitHub Copilot Agentic OS" series.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>agentic</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Layer 1 of the Agentic OS: Building Always-On Context for GitHub Copilot</title>
      <dc:creator>Daniel Montes</dc:creator>
      <pubDate>Sat, 18 Apr 2026 17:52:29 +0000</pubDate>
      <link>https://dev.to/danielmontes9/layer-1-of-the-agentic-os-building-always-on-context-for-github-copilot-2g7g</link>
      <guid>https://dev.to/danielmontes9/layer-1-of-the-agentic-os-building-always-on-context-for-github-copilot-2g7g</guid>
      <description>&lt;p&gt;In the previous article, we introduced the concept of the 4-Layer Agentic OS underlying modern AI assistants like GitHub Copilot. Today, we are diving deep into the absolute foundation of this stack: &lt;strong&gt;Layer 1 — Always-On Context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you have ever found yourself repeatedly telling an AI to "use TypeScript, avoid any use of &lt;code&gt;any&lt;/code&gt;, and follow our Clean Architecture directory structure," you are suffering from a lack of Layer 1 configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Repetitive Prompt Fatigue
&lt;/h2&gt;

&lt;p&gt;By default, an AI chat session is a blank slate. While it can scan your open tabs or the current repository, it doesn't inherently understand your team's &lt;em&gt;opinions&lt;/em&gt;—your specific testing methodologies, naming conventions, or architectural boundaries.&lt;/p&gt;

&lt;p&gt;Developers end up writing massive pre-ambles for every interaction just to ensure the generated code aligns with team standards. This is inefficient and leaves room for non-compliant code to slip through if a developer forgets to include the rules in their prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Passive Memory
&lt;/h2&gt;

&lt;p&gt;Layer 1 solves this through what we call &lt;strong&gt;Passive Memory&lt;/strong&gt;. In the GitHub Copilot ecosystem, this is primarily managed through Instruction files, the most critical being &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These files are automatically parsed by the assistant and silently applied as context to &lt;em&gt;every single prompt&lt;/em&gt; executed within the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics of Layer 1:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Friction:&lt;/strong&gt; Developers do not need to manually invoke these rules via slash commands or mentions; they are always active in the background.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Enforcement:&lt;/strong&gt; From junior developers to principal engineers, everyone gets the same baseline output aligned with the repository's rules.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code Walkthrough: A Robust Instruction File
&lt;/h2&gt;

&lt;p&gt;To implement Layer 1, you simply create a file at &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; in the root of your repository. &lt;/p&gt;

&lt;p&gt;Here is an example of what a highly effective instruction file looks like for a modern React/TypeScript repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Engineering Standards&lt;/span&gt;

You are an expert Frontend Engineer helping build our core platform. Always adhere to the following rules:

&lt;span class="gu"&gt;### 1. TypeScript Strictness&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Never use &lt;span class="sb"&gt;`any`&lt;/span&gt;. Prioritize explicit typing or use &lt;span class="sb"&gt;`unknown`&lt;/span&gt; if truly necessary.
&lt;span class="p"&gt;-&lt;/span&gt; Prefer &lt;span class="sb"&gt;`interface`&lt;/span&gt; over &lt;span class="sb"&gt;`type`&lt;/span&gt; for object shapes unless union types are required.

&lt;span class="gu"&gt;### 2. React Best Practices&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use functional components exclusively. Do not use class components.
&lt;span class="p"&gt;-&lt;/span&gt; State should be managed at the lowest sensible level. 
&lt;span class="p"&gt;-&lt;/span&gt; Avoid &lt;span class="sb"&gt;`useEffect`&lt;/span&gt; for data fetching; use React Query hooks instead.

&lt;span class="gu"&gt;### 3. Architecture &amp;amp; Styling&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; We use Tailwind CSS. Do not write inline styles or generic CSS files.
&lt;span class="p"&gt;-&lt;/span&gt; All new UI components must be placed in &lt;span class="sb"&gt;`src/components/ui/`&lt;/span&gt; and follow the Atomic Design pattern.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When this file is present, any developer simply asking "Create a button component" will automatically receive a functional React component, typed properly, styled using Tailwind CSS, and structured for the correct directory—without typing a single extra condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Layer 1 relies on simplicity to be effective. By outsourcing your non-negotiable project standards to an "Always-On" file, you free up your developers to use their cognitive load on solving complex business logic rather than babysitting the AI's syntax.&lt;/p&gt;

&lt;p&gt;However, there is a catch: loading &lt;em&gt;every&lt;/em&gt; imaginable tool, runbook, and standard into this single passive file can overwhelm the LLM's context window, degrading performance and causing "hallucinations."&lt;/p&gt;

&lt;p&gt;That is exactly where context segmentation comes in. In the next article, we will explore &lt;strong&gt;Layer 2 — On-Demand Capabilities&lt;/strong&gt;, showing you how to progressively load specific Prompts, Custom Agents, and Skills precisely when you need them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: This article is part of the "GitHub Copilot Agentic OS" series.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>agentic</category>
      <category>architecture</category>
    </item>
    <item>
      <title>GitHub Copilot's Hidden Agentic OS: The 4 Layers You Are Missing</title>
      <dc:creator>Daniel Montes</dc:creator>
      <pubDate>Sat, 11 Apr 2026 05:39:59 +0000</pubDate>
      <link>https://dev.to/danielmontes9/github-copilots-hidden-agentic-os-the-4-layers-you-are-missing-kfb</link>
      <guid>https://dev.to/danielmontes9/github-copilots-hidden-agentic-os-the-4-layers-you-are-missing-kfb</guid>
      <description>&lt;p&gt;If your team is treating artificial intelligence coding assistants merely as an "autocomplete on steroids," you are likely leaving 70% of their capabilities untouched. &lt;/p&gt;

&lt;p&gt;Recent evolutions in how developers interact with AI have transformed the humble &lt;code&gt;.github&lt;/code&gt; folder into a full-fledged &lt;strong&gt;Agentic Operating System (OS)&lt;/strong&gt;. It's no longer just a place for a single instruction file; it's a composable, multi-layered ecosystem designed to manage context, enforce security, and execute autonomous workflows.&lt;/p&gt;

&lt;p&gt;This introductory article explores the mental model of this Agentic OS and introduces its 4 distinct layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: "Stateless" AI Assistants
&lt;/h2&gt;

&lt;p&gt;The biggest challenge engineering teams face when adopting AI coding assistants is context loss. &lt;/p&gt;

&lt;p&gt;When an AI agent is stateless, every prompt requires developers to manually feed it coding standards, framework rules, and project conventions. This leads to inconsistent code, security vulnerabilities, and developer fatigue. Platform engineering teams need a way to ensure their AI agents operate within a governed, deterministic framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: The Agentic OS Architecture
&lt;/h2&gt;

&lt;p&gt;An "Agentic OS" solves this by acting as the business brain for your repository. It manages resources, context, memory, and automated tasks so the AI has continuity and reliability. &lt;/p&gt;

&lt;p&gt;Mapping out the &lt;code&gt;.github&lt;/code&gt; ecosystem reveals 7 composable primitives structured across 4 functional layers:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Layer 1 — Always-On Context
&lt;/h3&gt;

&lt;p&gt;This is the &lt;strong&gt;Passive Memory&lt;/strong&gt; of your assistant. Files like &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; apply to every single prompt automatically.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Use cases:&lt;/strong&gt; Enforcing universal coding standards, repository naming conventions, and foundational framework rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Layer 2 — On-Demand Capabilities
&lt;/h3&gt;

&lt;p&gt;This layer introduces specialized tools and memory loaded only when necessary (Progressive Loading). It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Prompt Files:&lt;/strong&gt; Pre-configured prompts invoked manually via slash commands (e.g., &lt;code&gt;/security-review&lt;/code&gt;, &lt;code&gt;/changelog&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Custom Agents:&lt;/strong&gt; Specialist personas (e.g., a Planning Agent chaining work to an Implementation Agent).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Skills:&lt;/strong&gt; Repeatable runbooks and incident triage scripts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Layer 3 — Enforcement &amp;amp; Automation
&lt;/h3&gt;

&lt;p&gt;This is where probabilistic LLMs meet deterministic guarantees. This layer introduces structural controls.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Hooks:&lt;/strong&gt; Deterministic shell commands that trigger at lifecycle events (e.g., &lt;code&gt;preToolUse&lt;/code&gt; to approve or deny an action before it executes).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Agentic Workflows:&lt;/strong&gt; Natural language automations compiled into GitHub Actions for CI failure analysis or issue triage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Layer 4 — Distribution
&lt;/h3&gt;

&lt;p&gt;Once you have built your perfect Agentic OS for a project, you need to scale it. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Plugins:&lt;/strong&gt; Decentralized packaging allows you to bundle agents, prompts, and skills to share team-specific configurations across the entire enterprise.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Understanding this 4-layer architecture shifts GitHub Copilot from a passive autocomplete tool into an active, governed participant in your software development lifecycle. &lt;/p&gt;

&lt;p&gt;In the upcoming articles of this series, we will dive deep into each layer, starting with how to properly configure your &lt;strong&gt;Always-On Context&lt;/strong&gt; to enforce coding standards without overloading the context window. Stay tuned!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>agentic</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Stop pasting broken Markdown into Jira: building md2jira</title>
      <dc:creator>Daniel Montes</dc:creator>
      <pubDate>Sun, 05 Apr 2026 05:31:26 +0000</pubDate>
      <link>https://dev.to/danielmontes9/stop-pasting-broken-markdown-into-jira-building-md2jira-4h12</link>
      <guid>https://dev.to/danielmontes9/stop-pasting-broken-markdown-into-jira-building-md2jira-4h12</guid>
      <description>&lt;p&gt;If you write Jira tickets in Markdown, you've probably hit the same problem I did: the moment you paste that text into Jira, the result is inconsistent.&lt;/p&gt;

&lt;p&gt;Sometimes you get raw &lt;code&gt;**bold**&lt;/code&gt;, &lt;code&gt;# headers&lt;/code&gt;, and pipe tables. Sometimes Jira partially formats things. Tables and code blocks usually need manual cleanup.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;md2jira&lt;/strong&gt; to make that workflow predictable.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is md2jira?
&lt;/h2&gt;

&lt;p&gt;md2jira is a monorepo with three independent pieces that share the same conversion engine:&lt;/p&gt;

&lt;h3&gt;
  
  
  Web previewer (&lt;code&gt;apps/web&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A live two-panel editor in the browser. Paste Markdown on the left, get Jira-ready output on the right — instantly, with no backend, no login, and no data sent anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use this if:&lt;/strong&gt; you want to convert Markdown to Jira format right now without installing anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core package (&lt;code&gt;md2jira-core&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A pure TypeScript library — zero browser or framework dependencies. It exports two functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;convert(md)&lt;/code&gt; → Jira Wiki Markup string (for Jira Server / Data Center)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;convertToAdf(md)&lt;/code&gt; → ADF JSON object (for Jira Cloud)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use this if:&lt;/strong&gt; you want to integrate Markdown-to-Jira conversion into your own Node.js app, script, or VS Code extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  CLI (&lt;code&gt;md2jira-cli&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A command-line tool that wraps &lt;code&gt;md2jira-core&lt;/code&gt;. Reads a Markdown file (or stdin) and writes Jira Wiki Markup to stdout or a file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use this if:&lt;/strong&gt; you want to convert files from the terminal or integrate the conversion into a shell script or CI pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;md2jira input.md                  &lt;span class="c"&gt;# stdout&lt;/span&gt;
md2jira input.md &lt;span class="nt"&gt;-o&lt;/span&gt; output.txt    &lt;span class="c"&gt;# write to file&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;input.md | md2jira            &lt;span class="c"&gt;# pipe from stdin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://danielmontes9.github.io/md2jira" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/danielmontes9/md2jira" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/md2jira-core" rel="noopener noreferrer"&gt;npm core&lt;/a&gt; / &lt;a href="https://www.npmjs.com/package/md2jira-cli" rel="noopener noreferrer"&gt;npm cli&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The problem in practice
&lt;/h2&gt;

&lt;p&gt;Here's the difference between pasting raw Markdown directly into Jira and running it through md2jira first:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg22hqruasqtcbpxgjfab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg22hqruasqtcbpxgjfab.png" alt="Before: raw markdown pasted into Jira — no formatting applied"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the left, Jira gets raw Markdown and leaves it as plain text. On the right, the same content is converted into properly formatted Jira content with headings, emphasis, tables, nested lists, blockquotes, and code blocks.&lt;/p&gt;




&lt;h2&gt;
  
  
  The web previewer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8wihnyo6utv64lvh90y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8wihnyo6utv64lvh90y.png" alt="md2jira-previewer — live two-panel converter in the browser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The web app is designed for people who don't want to install anything. Go to the URL, paste your Markdown, copy the output.&lt;/p&gt;

&lt;p&gt;The interface is a split panel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Left panel:&lt;/strong&gt; a Markdown editor with line numbers, keyboard shortcuts (Ctrl+B, Ctrl+I, Ctrl+Shift+K, Alt+↑↓…), import/export, and a "Copy MD" button&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right panel:&lt;/strong&gt; live output with two independent toggles — format (&lt;strong&gt;Jira Cloud&lt;/strong&gt; / &lt;strong&gt;Wiki Markup&lt;/strong&gt;) and view (&lt;strong&gt;Preview&lt;/strong&gt; / &lt;strong&gt;Code&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;"Copy for Jira"&lt;/strong&gt; button is worth highlighting: it writes rich HTML plus plain text to the clipboard at the same time. When you paste directly into Jira Cloud, it renders as formatted content immediately — no manual cleanup needed. This is the main quality-of-life improvement over copying raw text.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it converts
&lt;/h2&gt;

&lt;p&gt;The core package currently handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;# Heading&lt;/code&gt; → &lt;code&gt;h1. Heading&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;**bold**&lt;/code&gt; → &lt;code&gt;*bold*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_italic_&lt;/code&gt; → &lt;code&gt;_italic_&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~~strike~~&lt;/code&gt; → &lt;code&gt;-strike-&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;`inline code`&lt;/code&gt; → &lt;code&gt;{{inline code}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;fenced code blocks → &lt;code&gt;{code}&lt;/code&gt; / &lt;code&gt;{code:language=...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;unordered and ordered lists&lt;/li&gt;
&lt;li&gt;links, blockquotes, horizontal rules, and tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tables were the hardest part. They needed special handling for multiline cells, unequal column counts, escaping pipes inside cells, and inline formatting inside the table content itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What turned out to be harder than expected
&lt;/h2&gt;

&lt;p&gt;At first glance, Markdown-to-Jira sounds like a simple string replacement problem. It isn't.&lt;/p&gt;

&lt;p&gt;The hardest parts were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tables:&lt;/strong&gt; Jira table syntax is strict, and real Markdown tables are often messy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clipboard behavior:&lt;/strong&gt; Jira Cloud reacts differently depending on whether the clipboard contains plain text or rich HTML&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ADF vs Wiki Markup:&lt;/strong&gt; Jira Cloud prefers richer structured content, while Jira Server/Data Center workflows often still rely on Wiki Markup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keeping the core reusable:&lt;/strong&gt; &lt;code&gt;packages/core&lt;/code&gt; had to stay free of React and browser APIs so it can be reused in a future CLI and VS Code extension&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The npm packages
&lt;/h2&gt;

&lt;p&gt;Both packages are published to npm independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Core library — use in your own Node.js/TS projects&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;md2jira-core

&lt;span class="c"&gt;# CLI — convert files from the terminal&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; md2jira-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;md2jira-core&lt;/code&gt; is a pure TypeScript library with &lt;strong&gt;zero browser or framework dependencies&lt;/strong&gt; — it works in Node.js, Deno, Bun, and VS Code extensions. &lt;code&gt;md2jira-cli&lt;/code&gt; is a thin wrapper around it that adds file I/O and stdin/stdout support.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;convert&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;md2jira-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jira&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
# My Issue

Some **bold** text, _italic_, and ~~strikethrough~~.

| Field  | Value       |
|--------|-------------|
| Status | In Progress |
| Priority | **High**  |

- Item 1
- Item 2
  - Nested item

&lt;/span&gt;&lt;span class="se"&gt;\`\`\`&lt;/span&gt;&lt;span class="s2"&gt;js
console.log("hello")
&lt;/span&gt;&lt;span class="se"&gt;\`\`\`&lt;/span&gt;&lt;span class="s2"&gt;

&amp;gt; A blockquote

[Jira Docs](https://confluence.atlassian.com/jira)
`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jira&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h1. My Issue

Some *bold* text, _italic_, and -strikethrough-.

|| Field || Value ||
| Status | In Progress |
| Priority | *High* |

* Item 1
* Item 2
** Nested item

{code:language=js}
console.log("hello")
{code}

bq. A blockquote

[Jira Docs|https://confluence.atlassian.com/jira]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ADF (Atlassian Document Format)
&lt;/h3&gt;

&lt;p&gt;For Jira Cloud, you can also output &lt;strong&gt;ADF&lt;/strong&gt; — the native JSON format that Jira Cloud uses internally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;convertToAdf&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;md2jira-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;convertToAdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`# Hello **World**`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;adf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The web app uses this output to generate the preview and the rich clipboard content used by the "Copy for Jira" action, which is what makes paste into Jira Cloud behave much better than plain text.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;The conversion pipeline is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Markdown string
  → remark-parse (AST)
  → transforms/ (visit each node type)
  → Jira Wiki Markup string
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each node type (&lt;code&gt;heading&lt;/code&gt;, &lt;code&gt;paragraph&lt;/code&gt;, &lt;code&gt;table&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, etc.) has its own transform function in &lt;code&gt;packages/core/src/transforms/&lt;/code&gt;. The table transform handles the most edge cases — multiline cells joined with &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;, missing cells padded with empty values, and inline formatting (bold, italic, links, code) inside cells.&lt;/p&gt;

&lt;p&gt;The monorepo is structured so that &lt;code&gt;packages/core&lt;/code&gt; is 100% framework-agnostic — powering the web app, the CLI (&lt;code&gt;md2jira-cli&lt;/code&gt;), and a future VS Code extension.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MD Parser&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;remark-parse&lt;/code&gt; + &lt;code&gt;unified&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AST types&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@types/mdast&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;React 18 + Vite + Tailwind CSS v4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Vitest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Package manager&lt;/td&gt;
&lt;td&gt;pnpm workspaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;If you work with Jira regularly, give it a try — feedback and PRs are very welcome!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://danielmontes9.github.io/md2jira" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/danielmontes9/md2jira" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/md2jira-core" rel="noopener noreferrer"&gt;npm core&lt;/a&gt; / &lt;a href="https://www.npmjs.com/package/md2jira-cli" rel="noopener noreferrer"&gt;npm cli&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>markdown</category>
      <category>jira</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
