<?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: Daijiro Wachi</title>
    <description>The latest articles on DEV Community by Daijiro Wachi (@watilde).</description>
    <link>https://dev.to/watilde</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%2F436794%2F4e6fea39-8103-4bd7-8b50-6cbbdde0d87a.png</url>
      <title>DEV Community: Daijiro Wachi</title>
      <link>https://dev.to/watilde</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/watilde"/>
    <language>en</language>
    <item>
      <title>CAPE - Collaborative Agents Prompt Engineering</title>
      <dc:creator>Daijiro Wachi</dc:creator>
      <pubDate>Mon, 29 Jun 2026 12:12:27 +0000</pubDate>
      <link>https://dev.to/watilde/cape-collaborative-agents-prompt-engineering-8hi</link>
      <guid>https://dev.to/watilde/cape-collaborative-agents-prompt-engineering-8hi</guid>
      <description>&lt;p&gt;&lt;strong&gt;A Role-Based Multi-Agent Framework with Human Team Dynamics&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;Large language models are increasingly capable of producing high-quality outputs in isolation, yet single-agent systems lack the specialization, accountability, and self-correction that human teams develop naturally over time. CAPE (Collaborative Agents Prompt Engineering) proposes a structured multi-agent framework that mirrors the dynamics of a real software product team. Four specialized agents — Product Owner, Designer, Developer, and a Cape Master facilitator — collaborate within a defined session protocol, produce structured artifacts, and improve their collaboration across sessions through a KPT-based retrospective system. This paper describes the design of the framework, its measurement model, and the architectural decisions behind its open-source CLI implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Problem
&lt;/h3&gt;

&lt;p&gt;When a user prompts a general-purpose AI with a complex product task — "add dark mode to the app" — the model must simultaneously reason about business value, user experience, technical feasibility, and implementation specifics. This conflation of concerns degrades output quality in each dimension and leaves no mechanism for specialization, cross-checking, or learning between runs.&lt;/p&gt;

&lt;p&gt;Human teams solve this through role specialization and structured collaboration: a product owner defines value, a designer specifies experience, a developer implements, and a facilitator keeps the process honest. The question CAPE addresses is: &lt;em&gt;can these dynamics be faithfully modeled in a multi-agent system, and does the structure yield better outcomes than a single capable agent?&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Approach
&lt;/h3&gt;

&lt;p&gt;CAPE introduces four agent roles with strict role fidelity — agents are explicitly prohibited from drifting into each other's domains. A session follows a linear handoff protocol: CM (Opening) → POA → DA → DevA → CM (Retrospective). Each agent receives only the outputs it needs from upstream agents, reducing context noise while enforcing cross-referencing. After each session, the Cape Master facilitates a structured retrospective that produces KPT (Keep / Problem / Try) items, which are accumulated in a merged history file read at the opening of subsequent sessions. This creates a feedback loop across sessions that progressively informs the team's behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Framework Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Agent Roles
&lt;/h3&gt;

&lt;p&gt;CAPE defines four agent roles, each with a strict scope boundary:&lt;/p&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;Role&lt;/th&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cape Master&lt;/td&gt;
&lt;td&gt;Process facilitation, DoR checking, KPT retrospective&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Product Owner Agent&lt;/td&gt;
&lt;td&gt;Business value, acceptance criteria, prioritization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Designer Agent&lt;/td&gt;
&lt;td&gt;UX rationale, component specifications, brand adherence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DevA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developer Agent&lt;/td&gt;
&lt;td&gt;Technical architecture, implementation, file generation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Role fidelity is enforced at the prompt level: each agent's instructions explicitly state what it must not do. POA does not propose technical solutions; DA does not override business requirements; DevA does not reprioritize the backlog; CM does not produce domain outputs of any kind.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The Cape Master
&lt;/h3&gt;

&lt;p&gt;The Cape Master (CM) is the Scrum Master analog of the system. It appears twice in each session:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opening&lt;/strong&gt; — CM reads the objective, checks it against Definition of Ready criteria, identifies session-specific risks, and gives each agent a tailored coaching note. If historical KPT data exists from prior sessions, CM explicitly references recurring Problems and unresolved Tries in its coaching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrospective&lt;/strong&gt; — After all domain agents have produced their outputs, CM facilitates a structured conversation among the full team. Each agent reflects on their contribution, surfaces friction, and proposes improvements. CM derives a KPT from the conversation and computes satisfaction metrics.&lt;/p&gt;

&lt;p&gt;This dual-appearance structure mirrors how a skilled Scrum Master sets context before a sprint and extracts learning after it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Session Protocol
&lt;/h3&gt;

&lt;p&gt;Every agent message conforms to a structured JSON envelope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AgentName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RoleDescription"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unique_task_identifier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"voice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Casual first-person reflection in session language"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Domain-specific content"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"references"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"AgentName"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ass"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"positive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What worked well"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"improvement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What to improve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"context_adequate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;voice&lt;/code&gt; field is a deliberate design choice: it produces a casual, first-person reflection that is surfaced in the terminal during streaming, making the session feel like a team conversation rather than a pipeline of API calls. The &lt;code&gt;references&lt;/code&gt; field enforces explicit acknowledgment of upstream outputs rather than implicit consumption.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Prompt Asset System
&lt;/h3&gt;

&lt;p&gt;Each project using CAPE maintains a &lt;code&gt;cape/&lt;/code&gt; directory that serves as the context repository for agents. Files are organized by domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cape/
├── 0_team/          # Shared protocol, culture, DoR, DoD
├── 1_product/       # MVV, personas, milestones, backlog
├── 2_design/        # Design principles, brand guidelines
├── 3_development/   # Architecture, coding standards, playbook
├── 4_orchestration/ # Process definitions, metrics
└── 5_sessions/
    ├── pair/        # Per-session raw artifacts (JSON)
    └── retrospective/  # Per-session KPT markdown + kpt_merged.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Files carry a &lt;code&gt;type&lt;/code&gt; frontmatter field: &lt;code&gt;generic&lt;/code&gt; files define the CAPE framework itself and should not be modified; &lt;code&gt;input&lt;/code&gt; files are project-specific and must be filled in before sessions. The &lt;code&gt;cape init&lt;/code&gt; command generates all files interactively by asking the user questions in natural language and calling an LLM to translate answers into structured project context.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Continuous Learning via KPT
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Per-Session Retrospective
&lt;/h3&gt;

&lt;p&gt;Each session closes with a KPT structured as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep&lt;/strong&gt; — what worked and should be repeated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt; — what caused friction, confusion, or rework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try&lt;/strong&gt; — concrete action to attempt in the next session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are persisted as a dated markdown file: &lt;code&gt;cape/5_sessions/retrospective/YYYY-MM-DD_HH-MM_&amp;lt;task-id&amp;gt;.md&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 The Merged KPT File
&lt;/h3&gt;

&lt;p&gt;A single accumulated file, &lt;code&gt;kpt_merged.md&lt;/code&gt;, grows across sessions. Each item is tagged with its originating session ID:&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="gu"&gt;## Keep&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [task-001] Clear Given-When-Then acceptance criteria enabled DevA to implement confidently
&lt;span class="p"&gt;-&lt;/span&gt; [task-002] DA component list produced before DevA started reduced rework

&lt;span class="gu"&gt;## Problem&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [task-001] Package dependencies written by DevA not installed automatically
&lt;span class="p"&gt;-&lt;/span&gt; [task-002] DA specifications arrived after DevA had already begun

&lt;span class="gu"&gt;## Try&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [task-001] Auto-run npm install when package.json is modified by DevA
&lt;span class="p"&gt;-&lt;/span&gt; [task-002] DA to finalize component list before DevA's planning step begins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At every session opening, CM reads this file and injects it into its prompt. It is instructed to flag recurring Problems that persist across sessions and acknowledge Tries that were adopted. This creates a lightweight long-term memory without requiring a vector database or external storage — the compression happens through the KPT structure itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Why KPT as the Compression Format
&lt;/h3&gt;

&lt;p&gt;KPT is semantically dense: three categories cover the full space of retrospective insight in a format that remains actionable. Unlike a full conversation transcript, a KPT list accumulates linearly without growing stale — a Problem from session 1 that still appears in session 5 is a signal, not noise. The tagging system makes recurrence visible without requiring summarization.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Measurement Framework
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Primary Metric: Agent Satisfaction Score (ASS)
&lt;/h3&gt;

&lt;p&gt;The Agent Satisfaction Score is a self-reported Likert scale (1–5) that each agent assigns to its own contribution after every task. It is the primary quality signal in CAPE because it is role-relative: a DevA score of 4 means "I had the context and specs I needed to implement well," not "the feature is good." This makes it a leading indicator of collaboration quality rather than a lagging indicator of output correctness.&lt;/p&gt;

&lt;p&gt;Derived metrics:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-agent satisfaction score&lt;/td&gt;
&lt;td&gt;≥4.0 average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SV&lt;/strong&gt; (Satisfaction Variance)&lt;/td&gt;
&lt;td&gt;Variability across agents — indicates role imbalance&lt;/td&gt;
&lt;td&gt;Decreasing over iterations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ST&lt;/strong&gt; (Satisfaction Trend)&lt;/td&gt;
&lt;td&gt;Trajectory of ASS across successive tasks&lt;/td&gt;
&lt;td&gt;Positive slope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  4.2 Secondary Metrics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;XRF&lt;/strong&gt; (Cross-Reference Frequency)&lt;/td&gt;
&lt;td&gt;Count of explicit &lt;code&gt;references&lt;/code&gt; fields — measures inter-agent awareness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CI&lt;/strong&gt; (Consensus Iterations)&lt;/td&gt;
&lt;td&gt;Dialogue turns needed before CM closes the retrospective&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;TSR&lt;/strong&gt; (Task Success Rate)&lt;/td&gt;
&lt;td&gt;Acceptance criteria fulfillment rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;RR&lt;/strong&gt; (Reproducibility Rate)&lt;/td&gt;
&lt;td&gt;Output consistency across repeated runs with identical input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ETT&lt;/strong&gt; (Execution Time per Task)&lt;/td&gt;
&lt;td&gt;Wall-clock time from session start to retrospective save&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CR&lt;/strong&gt; (Compression Ratio)&lt;/td&gt;
&lt;td&gt;Input token length ÷ context passed to each agent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  4.3 Success Thresholds
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Threshold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average ASS&lt;/td&gt;
&lt;td&gt;≥4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SV&lt;/td&gt;
&lt;td&gt;Decreasing across iterations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TSR&lt;/td&gt;
&lt;td&gt;≥80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RR&lt;/td&gt;
&lt;td&gt;≥90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token reduction vs. single-agent&lt;/td&gt;
&lt;td&gt;≥30%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Technology Stack
&lt;/h3&gt;

&lt;p&gt;CAPE is implemented as an open-source Node.js CLI package:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runtime&lt;/strong&gt;: Node.js 20+ / TypeScript / ES Modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent orchestration&lt;/strong&gt;: &lt;a href="https://mastra.ai" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt; (&lt;code&gt;@mastra/core&lt;/code&gt;) — provides &lt;code&gt;createStep&lt;/code&gt;, &lt;code&gt;createWorkflow&lt;/code&gt;, and streaming agent primitives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM provider&lt;/strong&gt;: Anthropic Claude via &lt;code&gt;@ai-sdk/anthropic&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Session agents: &lt;code&gt;claude-sonnet-4-6&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Init generation: &lt;code&gt;claude-haiku-4-5&lt;/code&gt; (parallel calls for speed)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt;: Custom built (&lt;code&gt;bin/cape.js&lt;/code&gt;), no framework dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 Workflow Architecture
&lt;/h3&gt;

&lt;p&gt;The session workflow is a linear Mastra pipeline where each step receives the previous step's output as &lt;code&gt;inputSchema&lt;/code&gt; and can access all prior step outputs via &lt;code&gt;getStepResult&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmOpenStep → poaStep → daStep → devaStep → cmRetroStep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step streams the agent response to stdout in real time using a token-by-token reader with a state machine that handles JSON escape sequences (&lt;code&gt;\n&lt;/code&gt;, &lt;code&gt;\t&lt;/code&gt;, &lt;code&gt;\\&lt;/code&gt;) to produce readable terminal output from raw JSON strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 File Generation
&lt;/h3&gt;

&lt;p&gt;DevA produces implementation files inside &lt;code&gt;&amp;lt;file path="..."&amp;gt;&lt;/code&gt; XML blocks. The workflow extracts these with a regex and writes them to &lt;code&gt;CAPE_PROJECT_DIR&lt;/code&gt; (defaulting to &lt;code&gt;cwd&lt;/code&gt;). This makes CAPE able to modify the user's actual project codebase as part of a session — not just produce plans.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Interactive Session Loop
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;cape start&lt;/code&gt; enters an interactive loop: after each session completes, the user is prompted for the next objective. An empty line exits. This eliminates the startup cost of repeated CLI invocations and keeps the session context in a single process, which is particularly relevant as the merged KPT file grows.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.5 Language Support
&lt;/h3&gt;

&lt;p&gt;All agent voice and conversation outputs are language-configurable via &lt;code&gt;--lang&lt;/code&gt; (e.g., &lt;code&gt;--lang ja&lt;/code&gt; for Japanese). The &lt;code&gt;language&lt;/code&gt; field is injected into every agent prompt, ensuring consistent output language across the full session while keeping the prompt asset files themselves in English.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Key Design Decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Linear handoff over parallel execution.&lt;/strong&gt; Agents run sequentially, not in parallel. This is intentional: each agent's output is meant to inform the next. DA should react to POA's acceptance criteria; DevA should react to DA's component specs. Parallelizing would eliminate this cross-referencing, which is a core protocol requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON as the inter-agent format.&lt;/strong&gt; Structured JSON envelopes enforce completeness (every field must be present) and enable deterministic parsing for terminal rendering, artifact storage, and metric extraction. The &lt;code&gt;voice&lt;/code&gt; field within the envelope preserves a human-readable, informal register without sacrificing parsability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KPT over full transcript as long-term memory.&lt;/strong&gt; Injecting full retrospective transcripts into subsequent sessions would rapidly exhaust context budgets. KPT's three-category structure compresses an entire session's learning into ≤10 items, retaining the signal while discarding the noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cape Master as both opener and closer.&lt;/strong&gt; Using a single agent for both phases ensures continuity: CM's opening concerns are referenced explicitly in the retrospective, creating accountability within a session. A developer reading the retrospective can trace CM's prediction ("watch out for unclear data model requirements") against what actually happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role fidelity over generalism.&lt;/strong&gt; Each agent's instructions contain explicit prohibitions ("do not propose technical implementations," "do not override design rationale"). This is enforced through prompt design, not code. The cost is some rigidity; the benefit is that agents remain legible — their outputs are predictable given their role.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Limitations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 One-Way Pipeline and the Absence of Intra-Session Backtracking
&lt;/h3&gt;

&lt;p&gt;The current workflow is strictly linear: CM Open → POA → DA → DevA → CM Retro. When DevA encounters technically infeasible specifications from DA — mismatched data models, missing API contracts, incompatible constraints — the pipeline has no mechanism to route that feedback back upstream within the same session. The infeasibility is recorded as a Problem in the retrospective and surfaced to DA as a Try in the next session, but the current session's output is already degraded. This is an inherent tradeoff of the waterfall handoff model: predictability and legibility come at the cost of intra-session adaptability. A local feedback loop (DevA → DA → DevA) of one or two iterations would increase single-session Task Success Rate but introduces the risk of recursive stalls and role drift that the linear model avoids by design.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 DevA's Unrestricted Write Access
&lt;/h3&gt;

&lt;p&gt;DevA writes files directly to the project root using paths it generates from context. There are no guardrails against overwriting existing logic, injecting broken imports, or adding conflicting dependencies to &lt;code&gt;package.json&lt;/code&gt;. The framework trusts the LLM to scope its changes correctly, which is a reasonable assumption for greenfield tasks but unreliable for sessions modifying mature codebases. Practical mitigations — running &lt;code&gt;tsc --noEmit&lt;/code&gt; or &lt;code&gt;npm test&lt;/code&gt; after file generation and feeding errors back to DevA for self-correction, or staging writes as a dry-run diff before applying — are not yet implemented. Until they are, DevA's file output should be treated as a draft requiring human review rather than a safe auto-apply.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3 Long-Term Growth of kpt_merged.md
&lt;/h3&gt;

&lt;p&gt;The merged KPT file grows monotonically: each session appends its Keep, Problem, and Try items without pruning. This is acceptable for tens of sessions, but over hundreds of sessions the file will grow to a size that meaningfully consumes context budget and introduces noise — resolved Tries and dormant Problems from early sessions carry the same visual weight as recent actionable items. A consolidation mechanism (&lt;code&gt;cape housekeeping&lt;/code&gt;) that periodically archives items older than N sessions or marks Tries as adopted/dropped would prevent degradation. Without it, the long-term memory advantage of the KPT format eventually inverts into a liability.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Future Work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Branching workflows&lt;/strong&gt;: Allow CM to detect low-DoR objectives and route to a clarification step before engaging domain agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent-driven prompt evolution&lt;/strong&gt;: Enable agents to propose edits to their own role files in &lt;code&gt;cape/&lt;/code&gt; as a Try action, with CM reviewing before applying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark suite&lt;/strong&gt;: Establish a reproducible task set to measure TSR and RR across framework versions and model upgrades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel DA/DevA tracks&lt;/strong&gt;: For tasks where design and development are independent (e.g., a backend-only feature), allow DA to be skipped or run concurrently with DevA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web UI&lt;/strong&gt;: A session viewer that renders the conversation, KPT, and metrics in a browser alongside the generated files.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;p&gt;CAPE demonstrates that imposing role structure, turn-taking protocol, and retrospective learning on a multi-agent system produces a qualitatively different interaction from both a single-agent prompt and an unstructured multi-agent conversation. The Cape Master role — absent from most multi-agent frameworks — is the mechanism through which process quality is maintained and learning is carried forward. The KPT-based memory system provides longitudinal continuity without architectural complexity. Whether this structure improves measurable task outcomes relative to a single capable model is an empirical question that the framework's metric system is designed to answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appendix — Glossary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent Satisfaction Score — self-reported 1–5 Likert score per agent per task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Satisfaction Variance — variability of ASS across agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Satisfaction Trend — ASS trajectory across successive sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XRF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-Reference Frequency — count of explicit inter-agent references&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KPT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keep / Problem / Try — retrospective format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DoR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Definition of Ready — criteria a task must meet before a session begins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DoD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Definition of Done — criteria that must be met for a session to be considered complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role fidelity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Constraint that each agent operates strictly within its domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cape Master&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The session facilitator agent; the Scrum Master analog in CAPE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Building a Tiny, npm-Compatible Package Installer with Zero Dependencies</title>
      <dc:creator>Daijiro Wachi</dc:creator>
      <pubDate>Sun, 21 Jun 2026 12:13:21 +0000</pubDate>
      <link>https://dev.to/watilde/building-a-tiny-npm-compatible-package-installer-with-zero-dependencies-1if6</link>
      <guid>https://dev.to/watilde/building-a-tiny-npm-compatible-package-installer-with-zero-dependencies-1if6</guid>
      <description>&lt;p&gt;I have been working on &lt;strong&gt;dep&lt;/strong&gt;, a tiny dependency installer for Node.js.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhalrhgsga4oozvo49mmb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhalrhgsga4oozvo49mmb.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is not meant to replace npm, pnpm, or Yarn. Those tools are mature, powerful, and solve many real-world problems. &lt;strong&gt;dep&lt;/strong&gt; is intentionally much smaller.&lt;/p&gt;

&lt;p&gt;The goal is to explore a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How small can a useful Node.js package installer be?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This question is not new for &lt;strong&gt;dep&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Back in 2017, I wrote about the original philosophy behind the project in &lt;a href="https://watilde.medium.com/dep-a-little-node-js-dependency-installer-b8fead7596d3" rel="noopener noreferrer"&gt;dep: a little Node.js dependency installer&lt;/a&gt;. At the time, I described the idea of a “module end-user”: someone who builds software with packages, but does not necessarily publish packages themselves.&lt;/p&gt;

&lt;p&gt;For that user, the minimum useful feature set was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install dependencies defined in &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Lock dependencies for repeatable installs&lt;/li&gt;
&lt;li&gt;Run scripts defined in &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: &lt;strong&gt;install, lock, and run&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That philosophy has not really changed. What has changed is the implementation around it.&lt;/p&gt;

&lt;p&gt;The current answer is a tool that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install packages and resolve nested dependencies&lt;/li&gt;
&lt;li&gt;Write an npm-compatible &lt;code&gt;package-lock.json&lt;/code&gt; v3&lt;/li&gt;
&lt;li&gt;Run package scripts with &lt;code&gt;dep run &amp;lt;script&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Support npm-style workspaces&lt;/li&gt;
&lt;li&gt;Use zero runtime dependencies, built purely on the Node.js standard library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/depjs/dep" rel="noopener noreferrer"&gt;github.com/depjs/dep&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why build another installer?
&lt;/h2&gt;

&lt;p&gt;The interesting part of &lt;strong&gt;dep&lt;/strong&gt; is not that it is another package manager.&lt;/p&gt;

&lt;p&gt;Package installation is usually treated as something magical, huge, and difficult to understand. But at its core, a useful installer only needs to do a few things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Resolve dependency versions&lt;/li&gt;
&lt;li&gt;Download package tarballs from the registry&lt;/li&gt;
&lt;li&gt;Extract them into &lt;code&gt;node_modules&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Write a deterministic lockfile&lt;/li&gt;
&lt;li&gt;Run package scripts&lt;/li&gt;
&lt;li&gt;Link workspace packages&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is still not trivial, but it is small enough to reason about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;dep&lt;/strong&gt; is an attempt to make that process readable and educational.&lt;/p&gt;




&lt;h2&gt;
  
  
  What dep supports today
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;dep&lt;/strong&gt; currently focuses on a small, predictable subset of package-manager behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dep &lt;span class="nb"&gt;install
&lt;/span&gt;dep lock
dep run &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also supports npm-style workspaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workspaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"packages/*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lockfile format is compatible with npm's &lt;code&gt;package-lock.json&lt;/code&gt; v3.&lt;/p&gt;

&lt;p&gt;This means &lt;strong&gt;dep&lt;/strong&gt; does not invent a new ecosystem format. It stays close to the existing npm ecosystem while keeping the implementation minimal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing packages under the hood
&lt;/h2&gt;

&lt;p&gt;At a high level, &lt;code&gt;dep install&lt;/code&gt; orchestrates the following flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package.json
    ↓
Dependency metadata fetching
    ↓
Version resolution
    ↓
Tarball download and verification
    ↓
node_modules layout
    ↓
package-lock.json v3 generation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The challenge is not that each individual step is impossible.&lt;/p&gt;

&lt;p&gt;The challenge is ensuring that all of them work together predictably without hiding the process behind too many abstractions.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;dep&lt;/strong&gt;, the design goal is to keep each step explicit and understandable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing package-lock.json v3
&lt;/h2&gt;

&lt;p&gt;One of the most important decisions in &lt;strong&gt;dep&lt;/strong&gt; is to write an npm-compatible lockfile.&lt;/p&gt;

&lt;p&gt;A lockfile is not just an implementation detail. It is the contract between environments.&lt;/p&gt;

&lt;p&gt;If two installs produce different dependency trees, debugging becomes painful very quickly.&lt;/p&gt;

&lt;p&gt;By targeting &lt;code&gt;package-lock.json&lt;/code&gt; v3, &lt;strong&gt;dep&lt;/strong&gt; aims to provide repeatability and CI-friendliness without inventing a new format.&lt;/p&gt;

&lt;p&gt;This also makes it easier to try &lt;strong&gt;dep&lt;/strong&gt; in existing Node.js projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Zero runtime dependencies: the trade-offs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;dep&lt;/strong&gt; has zero runtime dependencies.&lt;/p&gt;

&lt;p&gt;It relies entirely on built-in Node.js APIs such as &lt;code&gt;fs&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;crypto&lt;/code&gt;, &lt;code&gt;child_process&lt;/code&gt;, and others.&lt;/p&gt;

&lt;p&gt;This is technically interesting for a few reasons.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fewer moving parts
&lt;/h3&gt;

&lt;p&gt;A dependency installer is the thing that installs dependencies.&lt;/p&gt;

&lt;p&gt;So depending on a large dependency tree to install another dependency tree can feel recursive and strange.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;dep&lt;/strong&gt;, there is no runtime dependency tree behind the installer itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auditability
&lt;/h3&gt;

&lt;p&gt;There is no hidden stack of packages behind the tool.&lt;/p&gt;

&lt;p&gt;If something behaves unexpectedly, the code path is easier to inspect.&lt;/p&gt;

&lt;p&gt;This matters especially for tooling that touches dependency installation, lockfiles, and project scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Educational value
&lt;/h3&gt;

&lt;p&gt;If you have ever wondered how package resolution, tarball extraction, lockfile generation, or workspace linking works, &lt;strong&gt;dep&lt;/strong&gt; is intended to be small enough to read and experiment with.&lt;/p&gt;

&lt;p&gt;Of course, zero dependencies does not mean zero complexity.&lt;/p&gt;

&lt;p&gt;It often means implementing things directly that external libraries usually abstract away.&lt;/p&gt;

&lt;p&gt;That is the core trade-off of the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  What dep is not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;dep&lt;/strong&gt; is not trying to be a universal replacement for npm, pnpm, or Yarn.&lt;/p&gt;

&lt;p&gt;You should keep using those tools for large production applications that depend on their full, optimized feature sets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;dep&lt;/strong&gt; is ideal when you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A minimal dependency installer&lt;/li&gt;
&lt;li&gt;An npm-compatible lockfile&lt;/li&gt;
&lt;li&gt;A readable codebase for learning how JavaScript tooling works&lt;/li&gt;
&lt;li&gt;A tool for small apps, experiments, or constrained environments&lt;/li&gt;
&lt;li&gt;A package installer that uses only the Node.js standard library at runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In that sense, &lt;strong&gt;dep&lt;/strong&gt; is closer to a tiny npm-compatible installer than a full package manager.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;You can check out the source, open issues, or contribute here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/depjs/dep" rel="noopener noreferrer"&gt;github.com/depjs/dep&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dep &lt;span class="nb"&gt;install
&lt;/span&gt;dep run &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are interested in Node.js tooling, lockfile internals, workspace behavior, or dependency resolution edge cases, I would love to hear your thoughts.&lt;/p&gt;

&lt;p&gt;What is your favorite or least favorite part of how modern package managers handle dependencies?&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
