ralph-workflow 0.7.18

PROMPT-driven multi-agent orchestrator for git repos
Documentation
<?xml version="1.0" encoding="UTF-8"?>
<!--
  Plan XSD Schema v2.0 - Structured XML with Rich Content Elements
  
  This schema enforces comprehensive, detailed implementation plans by:
  - Requiring quantified scope items (minimum 3)
  - Requiring explicit step numbers and file targets
  - Supporting rich content (tables, code blocks, lists)
  - Requiring risk/mitigation pairs
  - Requiring verification strategies
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  <!-- RICH CONTENT TYPES - Used for structured content in steps                   -->
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  
  <!-- Inline text with optional emphasis and code -->
  <xs:complexType name="InlineTextType" mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="emphasis" type="xs:string"/>
      <xs:element name="code" type="xs:string"/>
      <xs:element name="link">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="href" type="xs:string" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
  
  <!-- Paragraph element -->
  <xs:complexType name="ParagraphType" mixed="true">
    <xs:complexContent>
      <xs:extension base="InlineTextType"/>
    </xs:complexContent>
  </xs:complexType>
  
  <!-- Code block with language and optional filename -->
  <xs:complexType name="CodeBlockType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="language" type="xs:string"/>
        <xs:attribute name="filename" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Table cell -->
  <xs:complexType name="CellType" mixed="true">
    <xs:complexContent>
      <xs:extension base="InlineTextType"/>
    </xs:complexContent>
  </xs:complexType>
  
  <!-- Table row -->
  <xs:complexType name="RowType">
    <xs:sequence>
      <xs:element name="cell" type="CellType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- Table with optional caption, columns header, and rows -->
  <xs:complexType name="TableType">
    <xs:sequence>
      <xs:element name="caption" type="xs:string" minOccurs="0"/>
      <xs:element name="columns" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="column" type="xs:string" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="row" type="RowType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- List item (can contain nested content including code blocks, paragraphs, and lists) -->
  <xs:complexType name="ListItemType" mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="emphasis" type="xs:string"/>
      <xs:element name="code" type="xs:string"/>
      <xs:element name="code-block" type="CodeBlockType"/>
      <xs:element name="paragraph" type="ParagraphType"/>
      <xs:element name="list" type="ListType"/>
    </xs:choice>
  </xs:complexType>
  
  <!-- List (ordered or unordered) -->
  <xs:complexType name="ListType">
    <xs:sequence>
      <xs:element name="item" type="ListItemType" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="type" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="ordered"/>
          <xs:enumeration value="unordered"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  
  <!-- Heading -->
  <xs:complexType name="HeadingType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="level" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="2"/>
              <xs:maxInclusive value="4"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Rich content container - can contain mix of content elements -->
  <xs:complexType name="RichContentType">
    <xs:choice minOccurs="1" maxOccurs="unbounded">
      <xs:element name="paragraph" type="ParagraphType"/>
      <xs:element name="code-block" type="CodeBlockType"/>
      <xs:element name="table" type="TableType"/>
      <xs:element name="list" type="ListType"/>
      <xs:element name="heading" type="HeadingType"/>
    </xs:choice>
  </xs:complexType>
  
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  <!-- SCOPE AND SUMMARY TYPES                                                      -->
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  
  <!-- Scope item with count and category for quantification -->
  <xs:complexType name="ScopeItemType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="count" type="xs:string"/>
        <xs:attribute name="category" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Scope items container (minimum 3 required) -->
  <xs:complexType name="ScopeItemsType">
    <xs:sequence>
      <xs:element name="scope-item" type="ScopeItemType" minOccurs="3" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- Summary with required context and scope -->
  <xs:complexType name="SummaryType">
    <xs:sequence>
      <xs:element name="context" type="xs:string"/>
      <xs:element name="scope-items" type="ScopeItemsType"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  <!-- STEP AND FILE TYPES                                                          -->
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  
  <!-- File action enumeration -->
  <xs:simpleType name="FileActionType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="create"/>
      <xs:enumeration value="modify"/>
      <xs:enumeration value="delete"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Step type enumeration -->
  <xs:simpleType name="StepTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="file-change"/>
      <xs:enumeration value="action"/>
      <xs:enumeration value="research"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Priority enumeration -->
  <xs:simpleType name="PriorityType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="critical"/>
      <xs:enumeration value="high"/>
      <xs:enumeration value="medium"/>
      <xs:enumeration value="low"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Target file in a step -->
  <xs:complexType name="TargetFileType">
    <xs:attribute name="path" type="xs:string" use="required"/>
    <xs:attribute name="action" type="FileActionType" use="required"/>
  </xs:complexType>
  
  <!-- Target files container -->
  <xs:complexType name="TargetFilesType">
    <xs:sequence>
      <xs:element name="file" type="TargetFileType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- Step dependency reference -->
  <xs:complexType name="DependsOnType">
    <xs:attribute name="step" type="xs:positiveInteger" use="required"/>
  </xs:complexType>
  
  <!-- Implementation step -->
  <xs:complexType name="StepType">
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="target-files" type="TargetFilesType" minOccurs="0"/>
      <xs:element name="location" type="xs:string" minOccurs="0"/>
      <xs:element name="rationale" type="xs:string" minOccurs="0"/>
      <xs:element name="content" type="RichContentType"/>
      <xs:element name="depends-on" type="DependsOnType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="number" type="xs:positiveInteger" use="required"/>
    <xs:attribute name="type" type="StepTypeEnum" default="file-change"/>
    <xs:attribute name="priority" type="PriorityType"/>
  </xs:complexType>
  
  <!-- Implementation steps container -->
  <xs:complexType name="ImplementationStepsType">
    <xs:sequence>
      <xs:element name="step" type="StepType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  <!-- CRITICAL FILES TYPES                                                         -->
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  
  <!-- Primary file entry -->
  <xs:complexType name="PrimaryFileType">
    <xs:attribute name="path" type="xs:string" use="required"/>
    <xs:attribute name="action" type="FileActionType" use="required"/>
    <xs:attribute name="estimated-changes" type="xs:string"/>
  </xs:complexType>
  
  <!-- Reference file entry -->
  <xs:complexType name="ReferenceFileType">
    <xs:attribute name="path" type="xs:string" use="required"/>
    <xs:attribute name="purpose" type="xs:string" use="required"/>
  </xs:complexType>
  
  <!-- Primary files container -->
  <xs:complexType name="PrimaryFilesType">
    <xs:sequence>
      <xs:element name="file" type="PrimaryFileType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- Reference files container -->
  <xs:complexType name="ReferenceFilesType">
    <xs:sequence>
      <xs:element name="file" type="ReferenceFileType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- Critical files section -->
  <xs:complexType name="CriticalFilesType">
    <xs:sequence>
      <xs:element name="primary-files" type="PrimaryFilesType"/>
      <xs:element name="reference-files" type="ReferenceFilesType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  <!-- RISKS AND VERIFICATION TYPES                                                 -->
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  
  <!-- Severity enumeration -->
  <xs:simpleType name="SeverityType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="low"/>
      <xs:enumeration value="medium"/>
      <xs:enumeration value="high"/>
      <xs:enumeration value="critical"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Risk-mitigation pair -->
  <xs:complexType name="RiskPairType">
    <xs:sequence>
      <xs:element name="risk" type="xs:string"/>
      <xs:element name="mitigation" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="severity" type="SeverityType"/>
  </xs:complexType>
  
  <!-- Risks and mitigations container -->
  <xs:complexType name="RisksMitigationsType">
    <xs:sequence>
      <xs:element name="risk-pair" type="RiskPairType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- Verification item -->
  <xs:complexType name="VerificationType">
    <xs:sequence>
      <xs:element name="method" type="xs:string"/>
      <xs:element name="expected-outcome" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- Verification strategy container -->
  <xs:complexType name="VerificationStrategyType">
    <xs:sequence>
      <xs:element name="verification" type="VerificationType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  <!-- SKILLS AND MCP RECOMMENDATION TYPES                                          -->
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->

  <!-- Skills and MCP recommendations container -->
  <xs:complexType name="SkillsMcpType" mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="skill">
        <xs:complexType mixed="true">
          <xs:attribute name="reason" type="xs:string"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="mcp">
        <xs:complexType mixed="true">
          <xs:attribute name="reason" type="xs:string"/>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>

  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  <!-- ROOT ELEMENT                                                                 -->
  <!-- ═══════════════════════════════════════════════════════════════════════════ -->
  
  <xs:element name="ralph-plan">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ralph-summary" type="SummaryType"/>
        <xs:element name="skills-mcp" type="SkillsMcpType" minOccurs="0"/>
        <xs:element name="ralph-implementation-steps" type="ImplementationStepsType"/>
        <xs:element name="ralph-critical-files" type="CriticalFilesType"/>
        <xs:element name="ralph-risks-mitigations" type="RisksMitigationsType"/>
        <xs:element name="ralph-verification-strategy" type="VerificationStrategyType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
</xs:schema>