[{"data":1,"prerenderedAt":60},["Reactive",2],{"blog-post-markdown-version-control-git-integration-complete-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":34,"related":35},"markdown-version-control-git-integration-complete-guide","Markdown Version Control and Git Integration: Complete Guide for Documentation Workflows and Collaborative Content Management","Master Markdown version control with Git integration for collaborative documentation workflows, automated content management, and efficient technical writing processes. Learn Git hooks, merge strategies, and workflow optimization.","Advanced Markdown version control and Git integration enables sophisticated collaborative documentation workflows that maintain content quality, track changes systematically, and automate content…","2025-09-29","Tutorial","Matthew Rathbone","markdown version control, git markdown integration, documentation git workflows, markdown collaboration, git hooks markdown, version control documentation, markdown git best practices, collaborative writing git",22,"\u003Cp>Advanced Markdown version control and Git integration enables sophisticated collaborative documentation workflows that maintain content quality, track changes systematically, and automate content management processes across distributed teams. By implementing comprehensive Git strategies, automated validation systems, and intelligent merge conflict resolution, technical teams can build robust documentation ecosystems that scale effectively while preserving editorial quality and maintaining seamless collaboration across complex content repositories.\u003C/p>\n\u003Ch2 id=\"why-master-markdown-version-control-integration\">Why Master Markdown Version Control Integration?\u003C/h2>\n\u003Cp>Professional version control integration provides essential benefits for collaborative documentation:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Change Tracking\u003C/strong>: Maintain comprehensive history of content evolution with granular diff visualization\u003C/li>\n\u003Cli>\u003Cstrong>Collaborative Workflows\u003C/strong>: Enable distributed teams to work simultaneously without content conflicts\u003C/li>\n\u003Cli>\u003Cstrong>Quality Assurance\u003C/strong>: Implement automated validation and review processes through Git hooks and CI/CD\u003C/li>\n\u003Cli>\u003Cstrong>Content Governance\u003C/strong>: Establish approval workflows and maintain editorial standards through branch protection\u003C/li>\n\u003Cli>\u003Cstrong>Release Management\u003C/strong>: Coordinate documentation releases with software releases through tagging and branching strategies\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-git-workflows-for-markdown\">Foundation Git Workflows for Markdown\u003C/h2>\n\u003Ch3 id=\"basic-repository-structure-for-documentation\">Basic Repository Structure for Documentation\u003C/h3>\n\u003Cp>Implementing structured repository organization for scalable Markdown content management:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Recommended documentation repository structure\u003C/span>\ndocs-repository/\n├── .gitignore                    \u003Cspan class=\"hljs-comment\"># Git ignore patterns for documentation\u003C/span>\n├── .gitattributes               \u003Cspan class=\"hljs-comment\"># Git attributes for Markdown files\u003C/span>\n├── README.md                    \u003Cspan class=\"hljs-comment\"># Repository documentation\u003C/span>\n├── CONTRIBUTING.md              \u003Cspan class=\"hljs-comment\"># Contribution guidelines\u003C/span>\n├── .github/                     \u003Cspan class=\"hljs-comment\"># GitHub workflow configurations\u003C/span>\n│   ├── workflows/\n│   │   ├── content-validation.yml\n│   │   ├── link-checker.yml\n│   │   └── deploy-docs.yml\n│   ├── PULL_REQUEST_TEMPLATE.md\n│   └── ISSUE_TEMPLATE/\n│       ├── content-request.md\n│       └── bug-report.md\n├── content/                     \u003Cspan class=\"hljs-comment\"># Main content directory\u003C/span>\n│   ├── guides/                  \u003Cspan class=\"hljs-comment\"># User guides\u003C/span>\n│   ├── tutorials/               \u003Cspan class=\"hljs-comment\"># Step-by-step tutorials\u003C/span>\n│   ├── reference/               \u003Cspan class=\"hljs-comment\"># API and technical reference\u003C/span>\n│   └── blog/                    \u003Cspan class=\"hljs-comment\"># Blog posts and announcements\u003C/span>\n├── assets/                      \u003Cspan class=\"hljs-comment\"># Media and static assets\u003C/span>\n│   ├── images/\n│   ├── videos/\n│   └── downloads/\n├── templates/                   \u003Cspan class=\"hljs-comment\"># Content templates\u003C/span>\n│   ├── guide-template.md\n│   ├── tutorial-template.md\n│   └── reference-template.md\n├── scripts/                     \u003Cspan class=\"hljs-comment\"># Automation scripts\u003C/span>\n│   ├── validate-content.py\n│   ├── generate-toc.js\n│   └── check-links.sh\n└── config/                      \u003Cspan class=\"hljs-comment\"># Configuration files\u003C/span>\n    ├── markdownlint.json\n    ├── vale.ini\n    └── content-rules.yml\n\u003C/code>\u003C/pre>\u003Ch3 id=\"git-configuration-for-markdown-documentation\">Git Configuration for Markdown Documentation\u003C/h3>\n\u003Cp>Optimizing Git configuration for Markdown content workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># .gitconfig settings for Markdown documentation\u003C/span>\ngit config core.autocrlf input           \u003Cspan class=\"hljs-comment\"># Handle line endings consistently\u003C/span>\ngit config merge.ours.driver \u003Cspan class=\"hljs-literal\">true\u003C/span>        \u003Cspan class=\"hljs-comment\"># Custom merge driver for generated files\u003C/span>\ngit config diff.markdown.textconv \u003Cspan class=\"hljs-string\">&quot;pandoc --to=plain&quot;\u003C/span>  \u003Cspan class=\"hljs-comment\"># Better diffs for Markdown\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Set up custom diff driver for Markdown\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;*.md diff=markdown&quot;\u003C/span> &gt;&gt; .gitattributes\n\n\u003Cspan class=\"hljs-comment\"># Configure merge strategies for specific file types\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;package-lock.json merge=ours&quot;\u003C/span> &gt;&gt; .gitattributes\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;*.generated.md merge=ours&quot;\u003C/span> &gt;&gt; .gitattributes\n\n\u003Cspan class=\"hljs-comment\"># Set up LFS for large assets if needed\u003C/span>\ngit lfs track \u003Cspan class=\"hljs-string\">&quot;*.mp4&quot;\u003C/span>\ngit lfs track \u003Cspan class=\"hljs-string\">&quot;*.zip&quot;\u003C/span>\ngit lfs track \u003Cspan class=\"hljs-string\">&quot;assets/images/*.png&quot;\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-git-hooks-for-content-validation\">Advanced Git Hooks for Content Validation\u003C/h3>\n\u003Cp>Creating comprehensive validation systems using Git hooks:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-meta\">#!/bin/bash\u003C/span>\n\u003Cspan class=\"hljs-comment\"># .git/hooks/pre-commit - Content validation before commits\u003C/span>\n\n\u003Cspan class=\"hljs-built_in\">set\u003C/span> -e\n\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🔍 Running pre-commit content validation...&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Function to check if command exists\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">command_exists\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span> &gt;/dev/null 2&gt;&amp;1\n}\n\n\u003Cspan class=\"hljs-comment\"># Colors for output\u003C/span>\nRED=\u003Cspan class=\"hljs-string\">&#x27;\\033[0;31m&#x27;\u003C/span>\nGREEN=\u003Cspan class=\"hljs-string\">&#x27;\\033[0;32m&#x27;\u003C/span>\nYELLOW=\u003Cspan class=\"hljs-string\">&#x27;\\033[1;33m&#x27;\u003C/span>\nNC=\u003Cspan class=\"hljs-string\">&#x27;\\033[0m&#x27;\u003C/span> \u003Cspan class=\"hljs-comment\"># No Color\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Track validation results\u003C/span>\nVALIDATION_FAILED=\u003Cspan class=\"hljs-literal\">false\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># 1. Check for Markdown syntax errors\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;📝 Checking Markdown syntax...&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> command_exists markdownlint; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! markdownlint --config config/markdownlint.json content/**/*.md; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Markdown syntax validation failed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n        VALIDATION_FAILED=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Markdown syntax validation passed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${YELLOW}\u003C/span>⚠️  markdownlint not found, skipping syntax check\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># 2. Check for spelling and grammar\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;📖 Checking spelling and grammar...&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> command_exists vale; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! vale content/; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Spelling and grammar validation failed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n        VALIDATION_FAILED=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Spelling and grammar validation passed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${YELLOW}\u003C/span>⚠️  Vale not found, skipping prose check\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># 3. Validate internal links\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🔗 Checking internal links...&quot;\u003C/span>\npython3 scripts/validate-links.py --internal-only\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ $? -ne 0 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Internal link validation failed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    VALIDATION_FAILED=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Internal link validation passed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># 4. Check for required frontmatter\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;📋 Validating frontmatter...&quot;\u003C/span>\npython3 scripts/validate-frontmatter.py\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ $? -ne 0 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Frontmatter validation failed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    VALIDATION_FAILED=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Frontmatter validation passed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># 5. Check for large files\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;📦 Checking file sizes...&quot;\u003C/span>\nlarge_files=$(find content/ -name \u003Cspan class=\"hljs-string\">&quot;*.md&quot;\u003C/span> -size +1M)\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ -n \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$large_files\u003C/span>&quot;\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${YELLOW}\u003C/span>⚠️  Large Markdown files detected:\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$large_files\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Consider breaking these into smaller files or moving large content to separate assets.&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># 6. Validate image references\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🖼️  Checking image references...&quot;\u003C/span>\npython3 scripts/validate-images.py\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ $? -ne 0 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Image validation failed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    VALIDATION_FAILED=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Image validation passed\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># 7. Check for sensitive content\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🔒 Scanning for sensitive content...&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> grep -r -i \u003Cspan class=\"hljs-string\">&quot;password\\|secret\\|token\\|key&quot;\u003C/span> content/ --exclude-dir=.git; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Potential sensitive content detected\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Please review and remove any sensitive information before committing.&quot;\u003C/span>\n    VALIDATION_FAILED=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ No sensitive content detected\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Final result\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$VALIDATION_FAILED\u003C/span>&quot;\u003C/span> = \u003Cspan class=\"hljs-literal\">true\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Pre-commit validation failed. Please fix the issues above.\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ All pre-commit validations passed!\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"collaborative-workflow-implementation\">Collaborative Workflow Implementation\u003C/h3>\n\u003Cp>Setting up branching strategies and collaboration workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// scripts/workflow-helper.js - Git workflow automation\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> { execSync } = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;child_process&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> fs = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fs&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> path = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;path&#x27;\u003C/span>);\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">DocumentationWorkflow\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">config = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">mainBranch\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;main&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">developBranch\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;develop&#x27;\u003C/span>, \n            \u003Cspan class=\"hljs-attr\">featureBranchPrefix\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;feature/&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">hotfixBranchPrefix\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;hotfix/&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">releaseBranchPrefix\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;release/&#x27;\u003C/span>,\n            ...config\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">currentBranch\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getCurrentBranch\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getCurrentBranch\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;git rev-parse --abbrev-ref HEAD&#x27;\u003C/span>, { \u003Cspan class=\"hljs-attr\">encoding\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span> }).\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Not in a Git repository or Git not available&#x27;\u003C/span>);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">createFeatureBranch\u003C/span>(\u003Cspan class=\"hljs-params\">featureName\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> branchName = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.featureBranchPrefix}\u003C/span>\u003Cspan class=\"hljs-subst\">${featureName}\u003C/span>`\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Creating feature branch: \u003Cspan class=\"hljs-subst\">${branchName}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Ensure we&#x27;re on the develop branch\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">ensureBranch\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">developBranch\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Pull latest changes\u003C/span>\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git pull origin \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.developBranch}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Create and checkout new feature branch\u003C/span>\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git checkout -b \u003Cspan class=\"hljs-subst\">${branchName}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Create initial commit with branch info\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> branchInfo = {\n            branchName,\n            \u003Cspan class=\"hljs-attr\">createdAt\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">createdBy\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getGitUser\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">baseBranch\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">developBranch\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`Feature branch for \u003Cspan class=\"hljs-subst\">${featureName}\u003C/span>`\u003C/span>\n        };\n        \n        fs.\u003Cspan class=\"hljs-title function_\">writeFileSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.branch-info.json&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(branchInfo, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>));\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;git add .branch-info.json&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git commit -m &quot;Initialize feature branch: \u003Cspan class=\"hljs-subst\">${featureName}\u003C/span>&quot;`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`✅ Feature branch &#x27;\u003Cspan class=\"hljs-subst\">${branchName}\u003C/span>&#x27; created successfully`\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> branchName;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">createContentTemplate\u003C/span>(\u003Cspan class=\"hljs-params\">templateType, fileName\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> templatePath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;templates&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${templateType}\u003C/span>-template.md`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!fs.\u003Cspan class=\"hljs-title function_\">existsSync\u003C/span>(templatePath)) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">`Template not found: \u003Cspan class=\"hljs-subst\">${templatePath}\u003C/span>`\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> template = fs.\u003Cspan class=\"hljs-title function_\">readFileSync\u003C/span>(templatePath, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> contentPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>, fileName);\n        \n        \u003Cspan class=\"hljs-comment\">// Replace template variables\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> processedTemplate = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processTemplate\u003C/span>(template, {\n            fileName,\n            \u003Cspan class=\"hljs-attr\">author\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getGitUser\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">date\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>().\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;T&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">0\u003C/span>],\n            \u003Cspan class=\"hljs-attr\">branch\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">currentBranch\u003C/span>\n        });\n        \n        fs.\u003Cspan class=\"hljs-title function_\">writeFileSync\u003C/span>(contentPath, processedTemplate);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`✅ Created content file: \u003Cspan class=\"hljs-subst\">${contentPath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> contentPath;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">processTemplate\u003C/span>(\u003Cspan class=\"hljs-params\">template, variables\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> processed = template;\n        \n        \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(variables).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[key, value]\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> placeholder = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RegExp\u003C/span>(\u003Cspan class=\"hljs-string\">`\\\\{\\\\{\\\\s*\u003Cspan class=\"hljs-subst\">${key}\u003C/span>\\\\s*\\\\}\\\\}`\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;g&#x27;\u003C/span>);\n            processed = processed.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(placeholder, value);\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> processed;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateContentChanges\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;🔍 Validating content changes...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Get list of changed files\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> changedFiles = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getChangedFiles\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> markdownFiles = changedFiles.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> file.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>));\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (markdownFiles.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;No Markdown files changed&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Validating \u003Cspan class=\"hljs-subst\">${markdownFiles.length}\u003C/span> changed Markdown files`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validationResults = {\n            \u003Cspan class=\"hljs-attr\">syntax\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateSyntax\u003C/span>(markdownFiles),\n            \u003Cspan class=\"hljs-attr\">links\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateLinks\u003C/span>(markdownFiles),\n            \u003Cspan class=\"hljs-attr\">frontmatter\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFrontmatter\u003C/span>(markdownFiles),\n            \u003Cspan class=\"hljs-attr\">images\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateImages\u003C/span>(markdownFiles)\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> allPassed = \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>(validationResults).\u003Cspan class=\"hljs-title function_\">every\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">result\u003C/span> =&gt;\u003C/span> result.\u003Cspan class=\"hljs-property\">passed\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (allPassed) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;✅ All validations passed&#x27;\u003C/span>);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;❌ Some validations failed:&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(validationResults).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[type, result]\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!result.\u003Cspan class=\"hljs-property\">passed\u003C/span>) {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`  - \u003Cspan class=\"hljs-subst\">${type}\u003C/span>: \u003Cspan class=\"hljs-subst\">${result.errors.join(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)}\u003C/span>`\u003C/span>);\n                }\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> allPassed;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getChangedFiles\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> output = \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;git diff --name-only HEAD&#x27;\u003C/span>, { \u003Cspan class=\"hljs-attr\">encoding\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span> });\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> output.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">line\u003C/span> =&gt;\u003C/span> line.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>);\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> [];\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateSyntax\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`markdownlint \u003Cspan class=\"hljs-subst\">${files.join(\u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>)}\u003C/span>`\u003C/span>, { \u003Cspan class=\"hljs-attr\">encoding\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span> });\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">passed\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>, \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [] };\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \n                \u003Cspan class=\"hljs-attr\">passed\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \n                \u003Cspan class=\"hljs-attr\">errors\u003C/span>: error.\u003Cspan class=\"hljs-property\">stdout\u003C/span> ? error.\u003Cspan class=\"hljs-property\">stdout\u003C/span>.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">line\u003C/span> =&gt;\u003C/span> line.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) : [\u003Cspan class=\"hljs-string\">&#x27;Syntax validation failed&#x27;\u003C/span>]\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateLinks\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Implementation would check internal and external links\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// For brevity, returning mock result\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">passed\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>, \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [] };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateFrontmatter\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> errors = [];\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> file \u003Cspan class=\"hljs-keyword\">of\u003C/span> files) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> content = fs.\u003Cspan class=\"hljs-title function_\">readFileSync\u003C/span>(file, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> frontmatterMatch = content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^---\\n([\\s\\S]*?)\\n---/\u003C/span>);\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!frontmatterMatch) {\n                    errors.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Missing frontmatter: \u003Cspan class=\"hljs-subst\">${file}\u003C/span>`\u003C/span>);\n                    \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n                }\n                \n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> frontmatter = frontmatterMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n                \n                \u003Cspan class=\"hljs-comment\">// Check required fields\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> requiredFields = [\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> field \u003Cspan class=\"hljs-keyword\">of\u003C/span> requiredFields) {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!frontmatter.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${field}\u003C/span>:`\u003C/span>)) {\n                        errors.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Missing required field &#x27;\u003Cspan class=\"hljs-subst\">${field}\u003C/span>&#x27; in \u003Cspan class=\"hljs-subst\">${file}\u003C/span>`\u003C/span>);\n                    }\n                }\n                \n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                errors.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Error reading \u003Cspan class=\"hljs-subst\">${file}\u003C/span>: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">passed\u003C/span>: errors.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>, errors };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateImages\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> errors = [];\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> file \u003Cspan class=\"hljs-keyword\">of\u003C/span> files) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> content = fs.\u003Cspan class=\"hljs-title function_\">readFileSync\u003C/span>(file, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> imageRefs = content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/!\\[.*?\\]\\((.*?)\\)/g\u003C/span>) || [];\n                \n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> ref \u003Cspan class=\"hljs-keyword\">of\u003C/span> imageRefs) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = ref.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/!\\[.*?\\]\\((.*?)\\)/\u003C/span>);\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match) {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> imagePath = match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!imagePath.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http&#x27;\u003C/span>) &amp;&amp; !fs.\u003Cspan class=\"hljs-title function_\">existsSync\u003C/span>(imagePath)) {\n                            errors.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Missing image: \u003Cspan class=\"hljs-subst\">${imagePath}\u003C/span> in \u003Cspan class=\"hljs-subst\">${file}\u003C/span>`\u003C/span>);\n                        }\n                    }\n                }\n                \n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                errors.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Error reading \u003Cspan class=\"hljs-subst\">${file}\u003C/span>: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">passed\u003C/span>: errors.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>, errors };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">createPullRequest\u003C/span>(\u003Cspan class=\"hljs-params\">title, description = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;🔄 Creating pull request...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Validate changes before creating PR\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> isValid = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateContentChanges\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!isValid) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Content validation failed. Please fix issues before creating PR.&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Push current branch to remote\u003C/span>\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git push -u origin \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.currentBranch}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> prData = {\n            title,\n            description,\n            \u003Cspan class=\"hljs-attr\">head\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">currentBranch\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">base\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">developBranch\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">createdAt\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">author\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getGitUser\u003C/span>()\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// If GitHub CLI is available, use it\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> ghCommand = \u003Cspan class=\"hljs-string\">`gh pr create --title &quot;\u003Cspan class=\"hljs-subst\">${title}\u003C/span>&quot; --body &quot;\u003Cspan class=\"hljs-subst\">${description}\u003C/span>&quot; --base \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.developBranch}\u003C/span>`\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> output = \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(ghCommand, { \u003Cspan class=\"hljs-attr\">encoding\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span> });\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;✅ Pull request created:&#x27;\u003C/span>, output.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> output.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;GitHub CLI not available, please create PR manually&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;PR Details:&#x27;\u003C/span>, prData);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">deployToStaging\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;🚀 Deploying to staging...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Ensure we&#x27;re on develop branch\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">ensureBranch\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">developBranch\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Pull latest changes\u003C/span>\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git pull origin \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.developBranch}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Run content validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> isValid = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateContentChanges\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!isValid) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Content validation failed. Cannot deploy to staging.&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Trigger staging deployment (implementation depends on your deployment system)\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;npm run deploy:staging&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;✅ Staging deployment completed&#x27;\u003C/span>);\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;❌ Staging deployment failed:&#x27;\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> error;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">createRelease\u003C/span>(\u003Cspan class=\"hljs-params\">version\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📦 Creating release: \u003Cspan class=\"hljs-subst\">${version}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> releaseBranch = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.releaseBranchPrefix}\u003C/span>\u003Cspan class=\"hljs-subst\">${version}\u003C/span>`\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Create release branch from develop\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">ensureBranch\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">developBranch\u003C/span>);\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git pull origin \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.developBranch}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git checkout -b \u003Cspan class=\"hljs-subst\">${releaseBranch}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Update version in relevant files\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">updateVersionFiles\u003C/span>(version);\n        \n        \u003Cspan class=\"hljs-comment\">// Commit version bump\u003C/span>\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;git add -A&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git commit -m &quot;Bump version to \u003Cspan class=\"hljs-subst\">${version}\u003C/span>&quot;`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Push release branch\u003C/span>\n        \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git push -u origin \u003Cspan class=\"hljs-subst\">${releaseBranch}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`✅ Release branch &#x27;\u003Cspan class=\"hljs-subst\">${releaseBranch}\u003C/span>&#x27; created`\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> releaseBranch;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">updateVersionFiles\u003C/span>(\u003Cspan class=\"hljs-params\">version\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Update package.json if it exists\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> packagePath = \u003Cspan class=\"hljs-string\">&#x27;package.json&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fs.\u003Cspan class=\"hljs-title function_\">existsSync\u003C/span>(packagePath)) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> pkg = \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">parse\u003C/span>(fs.\u003Cspan class=\"hljs-title function_\">readFileSync\u003C/span>(packagePath, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>));\n            pkg.\u003Cspan class=\"hljs-property\">version\u003C/span> = version;\n            fs.\u003Cspan class=\"hljs-title function_\">writeFileSync\u003C/span>(packagePath, \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(pkg, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>));\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Update other version files as needed\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> versionFile = \u003Cspan class=\"hljs-string\">&#x27;VERSION&#x27;\u003C/span>;\n        fs.\u003Cspan class=\"hljs-title function_\">writeFileSync\u003C/span>(versionFile, version);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">ensureBranch\u003C/span>(\u003Cspan class=\"hljs-params\">branchName\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">currentBranch\u003C/span> !== branchName) {\n            \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">`git checkout \u003Cspan class=\"hljs-subst\">${branchName}\u003C/span>`\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">currentBranch\u003C/span> = branchName;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getGitUser\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> name = \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;git config user.name&#x27;\u003C/span>, { \u003Cspan class=\"hljs-attr\">encoding\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span> }).\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> email = \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;git config user.email&#x27;\u003C/span>, { \u003Cspan class=\"hljs-attr\">encoding\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span> }).\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${name}\u003C/span> &lt;\u003Cspan class=\"hljs-subst\">${email}\u003C/span>&gt;`\u003C/span>;\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;Unknown User&#x27;\u003C/span>;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">generateChangeLog\u003C/span>(\u003Cspan class=\"hljs-params\">fromTag, toTag = \u003Cspan class=\"hljs-string\">&#x27;HEAD&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📝 Generating changelog from \u003Cspan class=\"hljs-subst\">${fromTag}\u003C/span> to \u003Cspan class=\"hljs-subst\">${toTag}\u003C/span>...`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> gitLog = \u003Cspan class=\"hljs-title function_\">execSync\u003C/span>(\n                \u003Cspan class=\"hljs-string\">`git log \u003Cspan class=\"hljs-subst\">${fromTag}\u003C/span>..\u003Cspan class=\"hljs-subst\">${toTag}\u003C/span> --pretty=format:&quot;%h - %s (%an, %ad)&quot; --date=short`\u003C/span>,\n                { \u003Cspan class=\"hljs-attr\">encoding\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span> }\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> changes = gitLog.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">line\u003C/span> =&gt;\u003C/span> line.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> changeLog = {\n                \u003Cspan class=\"hljs-attr\">version\u003C/span>: toTag,\n                \u003Cspan class=\"hljs-attr\">date\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>().\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;T&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">0\u003C/span>],\n                \u003Cspan class=\"hljs-attr\">changes\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">categorizeChanges\u003C/span>(changes)\n            };\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> changeLog;\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Failed to generate changelog:&#x27;\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">categorizeChanges\u003C/span>(\u003Cspan class=\"hljs-params\">changes\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> categories = {\n            \u003Cspan class=\"hljs-attr\">features\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">fixes\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">docs\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">other\u003C/span>: []\n        };\n        \n        changes.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">change\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lower = change.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (lower.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;feat:&#x27;\u003C/span>) || lower.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;add:&#x27;\u003C/span>)) {\n                categories.\u003Cspan class=\"hljs-property\">features\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(change);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (lower.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fix:&#x27;\u003C/span>) || lower.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;bug:&#x27;\u003C/span>)) {\n                categories.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(change);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (lower.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;docs:&#x27;\u003C/span>) || lower.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;doc:&#x27;\u003C/span>)) {\n                categories.\u003Cspan class=\"hljs-property\">docs\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(change);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                categories.\u003Cspan class=\"hljs-property\">other\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(change);\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> categories;\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">DocumentationWorkflow\u003C/span>;\n\n\u003Cspan class=\"hljs-comment\">// CLI interface\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">require\u003C/span>.\u003Cspan class=\"hljs-property\">main\u003C/span> === \u003Cspan class=\"hljs-variable language_\">module\u003C/span>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> workflow = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">DocumentationWorkflow\u003C/span>();\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> command = process.\u003Cspan class=\"hljs-property\">argv\u003C/span>[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> args = process.\u003Cspan class=\"hljs-property\">argv\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">3\u003C/span>);\n    \n    \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (command) {\n        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;feature&#x27;\u003C/span>:\n            workflow.\u003Cspan class=\"hljs-title function_\">createFeatureBranch\u003C/span>(args[\u003Cspan class=\"hljs-number\">0\u003C/span>]);\n            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;validate&#x27;\u003C/span>:\n            workflow.\u003Cspan class=\"hljs-title function_\">validateContentChanges\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pr&#x27;\u003C/span>:\n            workflow.\u003Cspan class=\"hljs-title function_\">createPullRequest\u003C/span>(args[\u003Cspan class=\"hljs-number\">0\u003C/span>], args[\u003Cspan class=\"hljs-number\">1\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;release&#x27;\u003C/span>:\n            workflow.\u003Cspan class=\"hljs-title function_\">createRelease\u003C/span>(args[\u003Cspan class=\"hljs-number\">0\u003C/span>]);\n            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;changelog&#x27;\u003C/span>:\n            workflow.\u003Cspan class=\"hljs-title function_\">generateChangeLog\u003C/span>(args[\u003Cspan class=\"hljs-number\">0\u003C/span>], args[\u003Cspan class=\"hljs-number\">1\u003C/span>]);\n            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n        \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Available commands: feature, validate, pr, release, changelog&#x27;\u003C/span>);\n    }\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"advanced-merge-conflict-resolution\">Advanced Merge Conflict Resolution\u003C/h2>\n\u003Ch3 id=\"intelligent-merge-strategies-for-markdown-content\">Intelligent Merge Strategies for Markdown Content\u003C/h3>\n\u003Cp>Implementing sophisticated merge conflict resolution for collaborative content editing:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># scripts/resolve-markdown-conflicts.py - Advanced merge conflict resolution\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> difflib\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> subprocess\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> sys\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> pathlib \u003Cspan class=\"hljs-keyword\">import\u003C/span> Path\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> typing \u003Cspan class=\"hljs-keyword\">import\u003C/span> \u003Cspan class=\"hljs-type\">List\u003C/span>, \u003Cspan class=\"hljs-type\">Dict\u003C/span>, \u003Cspan class=\"hljs-type\">Tuple\u003C/span>, \u003Cspan class=\"hljs-type\">Optional\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownConflictResolver\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        self.conflict_markers = {\n            \u003Cspan class=\"hljs-string\">&#x27;start&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^&lt;{7} (.+)$&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;middle&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^={7}$&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^&gt;{7} (.+)$&#x27;\u003C/span>)\n        }\n        \n        self.resolution_strategies = {\n            \u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>: self.resolve_frontmatter_conflict,\n            \u003Cspan class=\"hljs-string\">&#x27;heading&#x27;\u003C/span>: self.resolve_heading_conflict,\n            \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>: self.resolve_content_conflict,\n            \u003Cspan class=\"hljs-string\">&#x27;list&#x27;\u003C/span>: self.resolve_list_conflict,\n            \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>: self.resolve_table_conflict,\n            \u003Cspan class=\"hljs-string\">&#x27;code_block&#x27;\u003C/span>: self.resolve_code_block_conflict\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">find_conflicted_files\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Find all files with merge conflicts&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            result = subprocess.run([\u003Cspan class=\"hljs-string\">&#x27;git&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;diff&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;--name-only&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;--diff-filter=U&#x27;\u003C/span>], \n                                 capture_output=\u003Cspan class=\"hljs-literal\">True\u003C/span>, text=\u003Cspan class=\"hljs-literal\">True\u003C/span>, check=\u003Cspan class=\"hljs-literal\">True\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> [f.strip() \u003Cspan class=\"hljs-keyword\">for\u003C/span> f \u003Cspan class=\"hljs-keyword\">in\u003C/span> result.stdout.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> f.strip()]\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> subprocess.CalledProcessError:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> []\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_conflict\u003C/span>(\u003Cspan class=\"hljs-params\">self, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-type\">Dict\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze merge conflicts in a file&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(file_path, \u003Cspan class=\"hljs-string\">&#x27;r&#x27;\u003C/span>, encoding=\u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            content = f.read()\n        \n        conflicts = []\n        lines = content.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n        i = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> i &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(lines):\n            line = lines[i]\n            start_match = self.conflict_markers[\u003Cspan class=\"hljs-string\">&#x27;start&#x27;\u003C/span>].\u003Cspan class=\"hljs-keyword\">match\u003C/span>(line)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> start_match:\n                conflict = self.extract_conflict_block(lines, i)\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> conflict:\n                    conflict[\u003Cspan class=\"hljs-string\">&#x27;context&#x27;\u003C/span>] = self.get_context(lines, conflict[\u003Cspan class=\"hljs-string\">&#x27;start&#x27;\u003C/span>], conflict[\u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>])\n                    conflict[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>] = self.identify_conflict_type(conflict)\n                    conflicts.append(conflict)\n                    i = conflict[\u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>] + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                    i += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                i += \u003Cspan class=\"hljs-number\">1\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> conflicts\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_conflict_block\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>], start: \u003Cspan class=\"hljs-built_in\">int\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Optional\u003C/span>[\u003Cspan class=\"hljs-type\">Dict\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Extract a complete conflict block&quot;&quot;&quot;\u003C/span>\n        i = start + \u003Cspan class=\"hljs-number\">1\u003C/span>\n        middle = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        end = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> i &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(lines):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.conflict_markers[\u003Cspan class=\"hljs-string\">&#x27;middle&#x27;\u003C/span>].\u003Cspan class=\"hljs-keyword\">match\u003C/span>(lines[i]):\n                middle = i\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> self.conflict_markers[\u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>].\u003Cspan class=\"hljs-keyword\">match\u003C/span>(lines[i]):\n                end = i\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>\n            i += \u003Cspan class=\"hljs-number\">1\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> middle \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span> \u003Cspan class=\"hljs-keyword\">or\u003C/span> end \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;start&#x27;\u003C/span>: start,\n            \u003Cspan class=\"hljs-string\">&#x27;middle&#x27;\u003C/span>: middle,\n            \u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>: end,\n            \u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>: lines[start + \u003Cspan class=\"hljs-number\">1\u003C/span>:middle],\n            \u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>: lines[middle + \u003Cspan class=\"hljs-number\">1\u003C/span>:end],\n            \u003Cspan class=\"hljs-string\">&#x27;markers&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;start_branch&#x27;\u003C/span>: self.conflict_markers[\u003Cspan class=\"hljs-string\">&#x27;start&#x27;\u003C/span>].\u003Cspan class=\"hljs-keyword\">match\u003C/span>(lines[start]).group(\u003Cspan class=\"hljs-number\">1\u003C/span>),\n                \u003Cspan class=\"hljs-string\">&#x27;end_branch&#x27;\u003C/span>: self.conflict_markers[\u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>].\u003Cspan class=\"hljs-keyword\">match\u003C/span>(lines[end]).group(\u003Cspan class=\"hljs-number\">1\u003C/span>)\n            }\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_context\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>], start: \u003Cspan class=\"hljs-built_in\">int\u003C/span>, end: \u003Cspan class=\"hljs-built_in\">int\u003C/span>, context_size: \u003Cspan class=\"hljs-built_in\">int\u003C/span> = \u003Cspan class=\"hljs-number\">3\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Get surrounding context for a conflict&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;before&#x27;\u003C/span>: lines[\u003Cspan class=\"hljs-built_in\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, start - context_size):start],\n            \u003Cspan class=\"hljs-string\">&#x27;after&#x27;\u003C/span>: lines[end + \u003Cspan class=\"hljs-number\">1\u003C/span>:\u003Cspan class=\"hljs-built_in\">min\u003C/span>(\u003Cspan class=\"hljs-built_in\">len\u003C/span>(lines), end + \u003Cspan class=\"hljs-number\">1\u003C/span> + context_size)]\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">identify_conflict_type\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Identify the type of conflict&quot;&quot;&quot;\u003C/span>\n        ours_text = \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        theirs_text = \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-comment\"># Check for frontmatter conflict\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> ours_text.startswith(\u003Cspan class=\"hljs-string\">&#x27;---&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> theirs_text.startswith(\u003Cspan class=\"hljs-string\">&#x27;---&#x27;\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Check for heading conflict\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(line.startswith(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>] + conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>]):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;heading&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Check for list conflict\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^[\\s]*[-*+]\\s&#x27;\u003C/span>, line) \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>] + conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>]):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;list&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Check for table conflict\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> line \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>] + conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>]):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Check for code block conflict\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(line.startswith(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>] + conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>]):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;code_block&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_frontmatter_conflict\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Intelligently resolve frontmatter conflicts&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">import\u003C/span> yaml\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Parse both versions\u003C/span>\n            ours_yaml = yaml.safe_load(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>]))\n            theirs_yaml = yaml.safe_load(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>]))\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(ours_yaml, \u003Cspan class=\"hljs-built_in\">dict\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(theirs_yaml, \u003Cspan class=\"hljs-built_in\">dict\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.manual_resolution_needed(conflict, \u003Cspan class=\"hljs-string\">&quot;Invalid YAML frontmatter&quot;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Merge strategy for different field types\u003C/span>\n            merged = {}\n            all_keys = \u003Cspan class=\"hljs-built_in\">set\u003C/span>(ours_yaml.keys()) | \u003Cspan class=\"hljs-built_in\">set\u003C/span>(theirs_yaml.keys())\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> key \u003Cspan class=\"hljs-keyword\">in\u003C/span> all_keys:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> key \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> ours_yaml:\n                    merged[key] = theirs_yaml[key]\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> key \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> theirs_yaml:\n                    merged[key] = ours_yaml[key]\n                \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                    \u003Cspan class=\"hljs-comment\"># Both have the key, apply resolution strategy\u003C/span>\n                    merged[key] = self.resolve_frontmatter_field(\n                        key, ours_yaml[key], theirs_yaml[key]\n                    )\n            \n            \u003Cspan class=\"hljs-comment\"># Convert back to YAML\u003C/span>\n            result = yaml.dump(merged, default_flow_style=\u003Cspan class=\"hljs-literal\">False\u003C/span>, allow_unicode=\u003Cspan class=\"hljs-literal\">True\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">f&quot;---\\n\u003Cspan class=\"hljs-subst\">{result}\u003C/span>---&quot;\u003C/span>\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> yaml.YAMLError:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.manual_resolution_needed(conflict, \u003Cspan class=\"hljs-string\">&quot;YAML parsing error&quot;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_frontmatter_field\u003C/span>(\u003Cspan class=\"hljs-params\">self, key: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, ours_value, theirs_value\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve individual frontmatter field conflicts&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Special handling for different field types\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> key == \u003Cspan class=\"hljs-string\">&#x27;keywords&#x27;\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Merge keyword lists\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(ours_value, \u003Cspan class=\"hljs-built_in\">list\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(theirs_value, \u003Cspan class=\"hljs-built_in\">list\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-built_in\">list\u003C/span>(\u003Cspan class=\"hljs-built_in\">set\u003C/span>(ours_value + theirs_value))\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(ours_value, \u003Cspan class=\"hljs-built_in\">str\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(theirs_value, \u003Cspan class=\"hljs-built_in\">str\u003C/span>):\n                ours_keywords = [k.strip() \u003Cspan class=\"hljs-keyword\">for\u003C/span> k \u003Cspan class=\"hljs-keyword\">in\u003C/span> ours_value.split(\u003Cspan class=\"hljs-string\">&#x27;,&#x27;\u003C/span>)]\n                theirs_keywords = [k.strip() \u003Cspan class=\"hljs-keyword\">for\u003C/span> k \u003Cspan class=\"hljs-keyword\">in\u003C/span> theirs_value.split(\u003Cspan class=\"hljs-string\">&#x27;,&#x27;\u003C/span>)]\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>.join(\u003Cspan class=\"hljs-built_in\">set\u003C/span>(ours_keywords + theirs_keywords))\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> key == \u003Cspan class=\"hljs-string\">&#x27;tags&#x27;\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Merge tag lists\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(ours_value, \u003Cspan class=\"hljs-built_in\">list\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(theirs_value, \u003Cspan class=\"hljs-built_in\">list\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-built_in\">list\u003C/span>(\u003Cspan class=\"hljs-built_in\">set\u003C/span>(ours_value + theirs_value))\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> key == \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Use the more recent date\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">from\u003C/span> datetime \u003Cspan class=\"hljs-keyword\">import\u003C/span> datetime\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                ours_date = datetime.fromisoformat(\u003Cspan class=\"hljs-built_in\">str\u003C/span>(ours_value))\n                theirs_date = datetime.fromisoformat(\u003Cspan class=\"hljs-built_in\">str\u003C/span>(theirs_value))\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-built_in\">str\u003C/span>(\u003Cspan class=\"hljs-built_in\">max\u003C/span>(ours_date, theirs_date).date())\n            \u003Cspan class=\"hljs-keyword\">except\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">pass\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> key == \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Keep the longer, more descriptive title\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(\u003Cspan class=\"hljs-built_in\">str\u003C/span>(ours_value)) &gt;= \u003Cspan class=\"hljs-built_in\">len\u003C/span>(\u003Cspan class=\"hljs-built_in\">str\u003C/span>(theirs_value)):\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> ours_value\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> theirs_value\n        \n        \u003Cspan class=\"hljs-comment\"># Default: prefer theirs (assuming it&#x27;s the incoming change)\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> theirs_value\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_heading_conflict\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve heading conflicts by analyzing structure&quot;&quot;&quot;\u003C/span>\n        ours_headings = self.extract_headings(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        theirs_headings = self.extract_headings(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-comment\"># If both are the same heading level, choose based on content\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(ours_headings) == \u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(theirs_headings) == \u003Cspan class=\"hljs-number\">1\u003C/span>:\n            ours_h = ours_headings[\u003Cspan class=\"hljs-number\">0\u003C/span>]\n            theirs_h = theirs_headings[\u003Cspan class=\"hljs-number\">0\u003C/span>]\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> ours_h[\u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>] == theirs_h[\u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>]:\n                \u003Cspan class=\"hljs-comment\"># Choose the longer, more descriptive heading\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(ours_h[\u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>]) &gt;= \u003Cspan class=\"hljs-built_in\">len\u003C/span>(theirs_h[\u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>]):\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n                \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-comment\"># For complex heading conflicts, merge both\u003C/span>\n        all_lines = []\n        all_lines.extend(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        all_lines.extend(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(all_lines)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_headings\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-type\">Dict\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Extract heading information from lines&quot;&quot;&quot;\u003C/span>\n        headings = []\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> lines:\n            \u003Cspan class=\"hljs-keyword\">match\u003C/span> = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(#{1,6})\\s+(.+)$&#x27;\u003C/span>, line.strip())\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span>:\n                headings.append({\n                    \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(\u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">1\u003C/span>)),\n                    \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">2\u003C/span>),\n                    \u003Cspan class=\"hljs-string\">&#x27;line&#x27;\u003C/span>: line\n                })\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> headings\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_content_conflict\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve general content conflicts using diff analysis&quot;&quot;&quot;\u003C/span>\n        ours_text = \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        theirs_text = \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-comment\"># Calculate similarity\u003C/span>\n        similarity = difflib.SequenceMatcher(\u003Cspan class=\"hljs-literal\">None\u003C/span>, ours_text, theirs_text).ratio()\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> similarity &gt; \u003Cspan class=\"hljs-number\">0.8\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># High similarity - try to merge\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.merge_similar_content(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>], conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Low similarity - include both with clear separation\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.include_both_variants(conflict)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">merge_similar_content\u003C/span>(\u003Cspan class=\"hljs-params\">self, ours: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>], theirs: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Merge similar content using line-by-line diff&quot;&quot;&quot;\u003C/span>\n        differ = difflib.unified_diff(ours, theirs, lineterm=\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n        merged_lines = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> differ:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> line.startswith(\u003Cspan class=\"hljs-string\">&#x27;@@&#x27;\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> line.startswith(\u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>):\n                \u003Cspan class=\"hljs-comment\"># Line removed - skip for now\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> line.startswith(\u003Cspan class=\"hljs-string\">&#x27;+&#x27;\u003C/span>):\n                \u003Cspan class=\"hljs-comment\"># Line added - include it\u003C/span>\n                merged_lines.append(line[\u003Cspan class=\"hljs-number\">1\u003C/span>:])\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                \u003Cspan class=\"hljs-comment\"># Unchanged line\u003C/span>\n                merged_lines.append(line[\u003Cspan class=\"hljs-number\">1\u003C/span>:] \u003Cspan class=\"hljs-keyword\">if\u003C/span> line.startswith(\u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">else\u003C/span> line)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(merged_lines)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">include_both_variants\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Include both variants with clear labeling&quot;&quot;&quot;\u003C/span>\n        result = []\n        result.append(\u003Cspan class=\"hljs-string\">f&quot;&lt;!-- Version from \u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;markers&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;start_branch&#x27;\u003C/span>]}\u003C/span> --&gt;&quot;\u003C/span>)\n        result.extend(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        result.append(\u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>)\n        result.append(\u003Cspan class=\"hljs-string\">f&quot;&lt;!-- Version from \u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;markers&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;end_branch&#x27;\u003C/span>]}\u003C/span> --&gt;&quot;\u003C/span>)\n        result.extend(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        result.append(\u003Cspan class=\"hljs-string\">&quot;&lt;!-- End of conflict resolution - please review and edit --&gt;&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(result)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_list_conflict\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve list conflicts by merging items&quot;&quot;&quot;\u003C/span>\n        ours_items = self.extract_list_items(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        theirs_items = self.extract_list_items(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-comment\"># Merge unique items\u003C/span>\n        all_items = ours_items + [item \u003Cspan class=\"hljs-keyword\">for\u003C/span> item \u003Cspan class=\"hljs-keyword\">in\u003C/span> theirs_items \u003Cspan class=\"hljs-keyword\">if\u003C/span> item \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> ours_items]\n        \n        \u003Cspan class=\"hljs-comment\"># Sort items if they appear to be ordered\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.should_sort_list(all_items):\n            all_items.sort()\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(\u003Cspan class=\"hljs-string\">f&quot;- \u003Cspan class=\"hljs-subst\">{item}\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> item \u003Cspan class=\"hljs-keyword\">in\u003C/span> all_items)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_list_items\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Extract list items from lines&quot;&quot;&quot;\u003C/span>\n        items = []\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> lines:\n            \u003Cspan class=\"hljs-keyword\">match\u003C/span> = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^[\\s]*[-*+]\\s+(.+)$&#x27;\u003C/span>, line)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span>:\n                items.append(\u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">1\u003C/span>).strip())\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> items\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">should_sort_list\u003C/span>(\u003Cspan class=\"hljs-params\">self, items: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">bool\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Determine if a list should be sorted&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Simple heuristic: if items look like they could be alphabetical\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(items) &lt; \u003Cspan class=\"hljs-number\">3\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Check if items are already mostly sorted\u003C/span>\n        sorted_items = \u003Cspan class=\"hljs-built_in\">sorted\u003C/span>(items)\n        matches = \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> a, b \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">zip\u003C/span>(items, sorted_items) \u003Cspan class=\"hljs-keyword\">if\u003C/span> a == b)\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> matches / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(items) &gt; \u003Cspan class=\"hljs-number\">0.7\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_table_conflict\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve table conflicts by merging rows and columns&quot;&quot;&quot;\u003C/span>\n        ours_table = self.parse_markdown_table(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        theirs_table = self.parse_markdown_table(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> ours_table \u003Cspan class=\"hljs-keyword\">or\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> theirs_table:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.manual_resolution_needed(conflict, \u003Cspan class=\"hljs-string\">&quot;Invalid table format&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Merge tables\u003C/span>\n        merged_table = self.merge_tables(ours_table, theirs_table)\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.format_markdown_table(merged_table)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">parse_markdown_table\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Optional\u003C/span>[\u003Cspan class=\"hljs-type\">Dict\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Parse markdown table into structured format&quot;&quot;&quot;\u003C/span>\n        table_lines = [line \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> lines \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> line]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table_lines) &lt; \u003Cspan class=\"hljs-number\">2\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Extract headers\u003C/span>\n        headers = [cell.strip() \u003Cspan class=\"hljs-keyword\">for\u003C/span> cell \u003Cspan class=\"hljs-keyword\">in\u003C/span> table_lines[\u003Cspan class=\"hljs-number\">0\u003C/span>].split(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> cell.strip()]\n        \n        \u003Cspan class=\"hljs-comment\"># Skip separator line\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^[\\s\\|:\\-]+$&#x27;\u003C/span>, table_lines[\u003Cspan class=\"hljs-number\">1\u003C/span>]):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Extract rows\u003C/span>\n        rows = []\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> table_lines[\u003Cspan class=\"hljs-number\">2\u003C/span>:]:\n            cells = [cell.strip() \u003Cspan class=\"hljs-keyword\">for\u003C/span> cell \u003Cspan class=\"hljs-keyword\">in\u003C/span> line.split(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> cell.strip()]\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(cells) == \u003Cspan class=\"hljs-built_in\">len\u003C/span>(headers):\n                rows.append(\u003Cspan class=\"hljs-built_in\">dict\u003C/span>(\u003Cspan class=\"hljs-built_in\">zip\u003C/span>(headers, cells)))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>: headers, \u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>: rows}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">merge_tables\u003C/span>(\u003Cspan class=\"hljs-params\">self, table1: \u003Cspan class=\"hljs-type\">Dict\u003C/span>, table2: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Merge two parsed tables&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Combine headers\u003C/span>\n        all_headers = table1[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>][:]\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> header \u003Cspan class=\"hljs-keyword\">in\u003C/span> table2[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> header \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> all_headers:\n                all_headers.append(header)\n        \n        \u003Cspan class=\"hljs-comment\"># Merge rows\u003C/span>\n        merged_rows = []\n        \n        \u003Cspan class=\"hljs-comment\"># Add rows from table1\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table1[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n            merged_row = {header: row.get(header, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">for\u003C/span> header \u003Cspan class=\"hljs-keyword\">in\u003C/span> all_headers}\n            merged_rows.append(merged_row)\n        \n        \u003Cspan class=\"hljs-comment\"># Add unique rows from table2\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table2[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> row \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> table1[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n                merged_row = {header: row.get(header, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">for\u003C/span> header \u003Cspan class=\"hljs-keyword\">in\u003C/span> all_headers}\n                merged_rows.append(merged_row)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>: all_headers, \u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>: merged_rows}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">format_markdown_table\u003C/span>(\u003Cspan class=\"hljs-params\">self, table: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Format structured table back to markdown&quot;&quot;&quot;\u003C/span>\n        lines = []\n        \n        \u003Cspan class=\"hljs-comment\"># Header row\u003C/span>\n        header_line = \u003Cspan class=\"hljs-string\">&#x27;| &#x27;\u003C/span> + \u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>.join(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]) + \u003Cspan class=\"hljs-string\">&#x27; |&#x27;\u003C/span>\n        lines.append(header_line)\n        \n        \u003Cspan class=\"hljs-comment\"># Separator line\u003C/span>\n        separator_line = \u003Cspan class=\"hljs-string\">&#x27;| &#x27;\u003C/span> + \u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>.join([\u003Cspan class=\"hljs-string\">&#x27;---&#x27;\u003C/span>] * \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>])) + \u003Cspan class=\"hljs-string\">&#x27; |&#x27;\u003C/span>\n        lines.append(separator_line)\n        \n        \u003Cspan class=\"hljs-comment\"># Data rows\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n            row_line = \u003Cspan class=\"hljs-string\">&#x27;| &#x27;\u003C/span> + \u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>.join(row.get(header, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">for\u003C/span> header \u003Cspan class=\"hljs-keyword\">in\u003C/span> table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]) + \u003Cspan class=\"hljs-string\">&#x27; |&#x27;\u003C/span>\n            lines.append(row_line)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(lines)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_code_block_conflict\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve code block conflicts&quot;&quot;&quot;\u003C/span>\n        ours_code = self.extract_code_blocks(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        theirs_code = self.extract_code_blocks(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> ours_code \u003Cspan class=\"hljs-keyword\">and\u003C/span> theirs_code:\n            \u003Cspan class=\"hljs-comment\"># If languages match, try to merge\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> ours_code[\u003Cspan class=\"hljs-string\">&#x27;language&#x27;\u003C/span>] == theirs_code[\u003Cspan class=\"hljs-string\">&#x27;language&#x27;\u003C/span>]:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.merge_code_blocks(ours_code, theirs_code)\n        \n        \u003Cspan class=\"hljs-comment\"># Otherwise, include both\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.include_both_variants(conflict)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_code_blocks\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Optional\u003C/span>[\u003Cspan class=\"hljs-type\">Dict\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Extract code block information&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> lines:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        start_line = lines[\u003Cspan class=\"hljs-number\">0\u003C/span>]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> start_line.startswith(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        language = start_line[\u003Cspan class=\"hljs-number\">3\u003C/span>:].strip()\n        code_lines = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> lines[\u003Cspan class=\"hljs-number\">1\u003C/span>:]:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> line.startswith(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>\n            code_lines.append(line)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;language&#x27;\u003C/span>: language,\n            \u003Cspan class=\"hljs-string\">&#x27;code&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(code_lines)\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">merge_code_blocks\u003C/span>(\u003Cspan class=\"hljs-params\">self, code1: \u003Cspan class=\"hljs-type\">Dict\u003C/span>, code2: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Merge two code blocks of the same language&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Simple strategy: include both with comments\u003C/span>\n        merged_code = \u003Cspan class=\"hljs-string\">f&quot;&quot;&quot;```\u003Cspan class=\"hljs-subst\">{code1[\u003Cspan class=\"hljs-string\">&#x27;language&#x27;\u003C/span>]}\u003C/span>\n\u003Cspan class=\"hljs-subst\">{code1[\u003Cspan class=\"hljs-string\">&#x27;code&#x27;\u003C/span>]}\u003C/span>\n\n# Merged changes:\n\u003Cspan class=\"hljs-subst\">{code2[\u003Cspan class=\"hljs-string\">&#x27;code&#x27;\u003C/span>]}\u003C/span>\n```&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> merged_code\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">manual_resolution_needed\u003C/span>(\u003Cspan class=\"hljs-params\">self, conflict: \u003Cspan class=\"hljs-type\">Dict\u003C/span>, reason: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Mark conflict for manual resolution&quot;&quot;&quot;\u003C/span>\n        result = []\n        result.append(\u003Cspan class=\"hljs-string\">f&quot;&lt;!-- MANUAL RESOLUTION NEEDED: \u003Cspan class=\"hljs-subst\">{reason}\u003C/span> --&gt;&quot;\u003C/span>)\n        result.append(\u003Cspan class=\"hljs-string\">f&quot;&lt;&lt;&lt;&lt;&lt;&lt;&lt; \u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;markers&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;start_branch&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        result.extend(conflict[\u003Cspan class=\"hljs-string\">&#x27;ours&#x27;\u003C/span>])\n        result.append(\u003Cspan class=\"hljs-string\">&quot;=======&quot;\u003C/span>)\n        result.extend(conflict[\u003Cspan class=\"hljs-string\">&#x27;theirs&#x27;\u003C/span>])\n        result.append(\u003Cspan class=\"hljs-string\">f&quot;&gt;&gt;&gt;&gt;&gt;&gt;&gt; \u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;markers&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;end_branch&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        result.append(\u003Cspan class=\"hljs-string\">&quot;&lt;!-- Please resolve manually --&gt;&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(result)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_file_conflicts\u003C/span>(\u003Cspan class=\"hljs-params\">self, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">bool\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve all conflicts in a file&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;🔍 Analyzing conflicts in \u003Cspan class=\"hljs-subst\">{file_path}\u003C/span>...&quot;\u003C/span>)\n        \n        conflicts = self.analyze_conflict(file_path)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> conflicts:\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  No conflicts found in \u003Cspan class=\"hljs-subst\">{file_path}\u003C/span>&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">True\u003C/span>\n        \n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  Found \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(conflicts)}\u003C/span> conflicts&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Read original file\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(file_path, \u003Cspan class=\"hljs-string\">&#x27;r&#x27;\u003C/span>, encoding=\u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            original_lines = f.read().split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Resolve conflicts from bottom to top (to maintain line numbers)\u003C/span>\n        resolved_lines = original_lines[:]\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> conflict \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">reversed\u003C/span>(conflicts):\n            resolution_method = self.resolution_strategies.get(conflict[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>])\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> resolution_method:\n                resolved_content = resolution_method(conflict)\n                \n                \u003Cspan class=\"hljs-comment\"># Replace conflict block with resolution\u003C/span>\n                resolved_lines = (\n                    resolved_lines[:conflict[\u003Cspan class=\"hljs-string\">&#x27;start&#x27;\u003C/span>]] +\n                    resolved_content.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>) +\n                    resolved_lines[conflict[\u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>] + \u003Cspan class=\"hljs-number\">1\u003C/span>:]\n                )\n                \n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  ✅ Resolved \u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>]}\u003C/span> conflict at lines \u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;start&#x27;\u003C/span>]}\u003C/span>-\u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;end&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  ⚠️  No resolution strategy for \u003Cspan class=\"hljs-subst\">{conflict[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>]}\u003C/span> conflict&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Write resolved file\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(file_path, \u003Cspan class=\"hljs-string\">&#x27;w&#x27;\u003C/span>, encoding=\u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            f.write(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(resolved_lines))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">True\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">resolve_all_conflicts\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">bool\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Resolve conflicts in all conflicted files&quot;&quot;&quot;\u003C/span>\n        conflicted_files = self.find_conflicted_files()\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> conflicted_files:\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;✅ No merge conflicts found&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">True\u003C/span>\n        \n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;🔍 Found \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(conflicted_files)}\u003C/span> files with conflicts&quot;\u003C/span>)\n        \n        success = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> file_path \u003Cspan class=\"hljs-keyword\">in\u003C/span> conflicted_files:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> file_path.endswith(\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                    self.resolve_file_conflicts(file_path)\n                \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n                    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;❌ Failed to resolve conflicts in \u003Cspan class=\"hljs-subst\">{file_path}\u003C/span>: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>)\n                    success = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;⚠️  Skipping non-Markdown file: \u003Cspan class=\"hljs-subst\">{file_path}\u003C/span>&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> success:\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;✅ All Markdown conflicts resolved&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> success\n\n\u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">main\u003C/span>():\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(sys.argv) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n        file_path = sys.argv[\u003Cspan class=\"hljs-number\">1\u003C/span>]\n        resolver = MarkdownConflictResolver()\n        resolver.resolve_file_conflicts(file_path)\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n        resolver = MarkdownConflictResolver()\n        resolver.resolve_all_conflicts()\n\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> __name__ == \u003Cspan class=\"hljs-string\">&#x27;__main__&#x27;\u003C/span>:\n    main()\n\u003C/code>\u003C/pre>\u003Ch2 id=\"cicd-integration-for-documentation\">CI/CD Integration for Documentation\u003C/h2>\n\u003Cp>Version control systems integrate seamlessly with modern development workflows. When combined with \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">automated testing and validation systems\u003C/a>, Git workflows ensure that documentation quality remains high through continuous integration processes that validate content, check links, and maintain consistency across large documentation repositories.\u003C/p>\n\u003Cp>For comprehensive content management, Git integration works effectively with \u003Ca href=\"/blog/markdown-link-management-cross-referencing-complete-guide\">link management and cross-referencing systems\u003C/a> to maintain content relationships and ensure that internal links remain functional as content is moved, renamed, or restructured through version control operations.\u003C/p>\n\u003Cp>When building sophisticated documentation platforms, version control complements \u003Ca href=\"/blog/markdown-progressive-web-app-documentation-complete-guide\">Progressive Web App documentation systems\u003C/a> by enabling automated deployment pipelines that maintain service worker caches, update offline content, and coordinate releases between content updates and application functionality.\u003C/p>\n\u003Ch2 id=\"advanced-git-workflows-and-automation\">Advanced Git Workflows and Automation\u003C/h2>\n\u003Ch3 id=\"github-actions-for-documentation-workflows\">GitHub Actions for Documentation Workflows\u003C/h3>\n\u003Cp>Implementing comprehensive CI/CD pipelines for Markdown documentation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .github/workflows/documentation-ci.yml - Comprehensive documentation workflow\u003C/span>\n\u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Documentation\u003C/span> \u003Cspan class=\"hljs-string\">CI/CD\u003C/span> \u003Cspan class=\"hljs-string\">Pipeline\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">on:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">push:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [ \u003Cspan class=\"hljs-string\">main\u003C/span>, \u003Cspan class=\"hljs-string\">develop\u003C/span> ]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;content/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;assets/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;*.md&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [ \u003Cspan class=\"hljs-string\">main\u003C/span>, \u003Cspan class=\"hljs-string\">develop\u003C/span> ]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;content/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;assets/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;*.md&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">schedule:\u003C/span>\n    \u003Cspan class=\"hljs-comment\"># Run weekly link check\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">cron:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;0 2 * * 1&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">env:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">NODE_VERSION:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;18&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">PYTHON_VERSION:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;3.9&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-comment\"># Content validation and quality checks\u003C/span>\n  \u003Cspan class=\"hljs-attr\">validate-content:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">fetch-depth:\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Python\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-python@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">python-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.PYTHON_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pip&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm install\n        pip install -r requirements.txt\n        # Install additional validation tools\n        npm install -g markdownlint-cli\n        npm install -g markdown-link-check\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">syntax\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        markdownlint --config config/markdownlint.json content/**/*.md\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">spelling\u003C/span> \u003Cspan class=\"hljs-string\">and\u003C/span> \u003Cspan class=\"hljs-string\">grammar\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Install Vale if not cached\n        wget -O vale.tar.gz https://github.com/errata-ai/vale/releases/download/v2.25.0/vale_2.25.0_Linux_64-bit.tar.gz\n        tar -xzf vale.tar.gz\n        sudo mv vale /usr/local/bin/\n\u003C/span>        \n        \u003Cspan class=\"hljs-comment\"># Run Vale with custom configuration\u003C/span>\n        \u003Cspan class=\"hljs-string\">vale\u003C/span> \u003Cspan class=\"hljs-string\">--config\u003C/span> \u003Cspan class=\"hljs-string\">config/vale.ini\u003C/span> \u003Cspan class=\"hljs-string\">content/\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">frontmatter\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/validate-frontmatter.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">internal\u003C/span> \u003Cspan class=\"hljs-string\">links\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/validate-links.py --internal-only\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">image\u003C/span> \u003Cspan class=\"hljs-string\">references\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/validate-images.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Security\u003C/span> \u003Cspan class=\"hljs-string\">scan\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Scan for potential security issues in content\n        python scripts/security-scan.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/generate-validation-report.py \\\n          --output reports/validation-report.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Upload\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">validation-report\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">reports/validation-report.json\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Comment\u003C/span> \u003Cspan class=\"hljs-string\">PR\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pull_request&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&amp;&amp;\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/github-script@v6\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">script:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          const fs = require(&#x27;fs&#x27;);\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">try\u003C/span> {\n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">JSON.parse(fs.readFileSync(&#x27;reports/validation-report.json&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">));\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">`\u003C/span>\n            \u003Cspan class=\"hljs-comment\">## 📝 Content Validation Report\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">**Summary:**\u003C/span>\n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">✅\u003C/span> \u003Cspan class=\"hljs-attr\">Syntax validation:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.syntax.passed\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;PASSED&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;FAILED&#x27;\u003C/span>}\n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">✅\u003C/span> \u003Cspan class=\"hljs-attr\">Spelling/Grammar:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.spelling.passed\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;PASSED&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;FAILED&#x27;\u003C/span>}  \n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">✅\u003C/span> \u003Cspan class=\"hljs-attr\">Links validation:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.links.passed\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;PASSED&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;FAILED&#x27;\u003C/span>}\n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">✅\u003C/span> \u003Cspan class=\"hljs-attr\">Images validation:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.images.passed\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;PASSED&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;FAILED&#x27;\u003C/span>}\n            \n            \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.errors.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">`\u003C/span>\n            \u003Cspan class=\"hljs-string\">**Issues\u003C/span> \u003Cspan class=\"hljs-string\">found:**\u003C/span>\n            \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.errors.map(error\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">error\u003C/span>}\u003Cspan class=\"hljs-string\">`).join(&#x27;\\n&#x27;)\u003C/span>}\n            \u003Cspan class=\"hljs-string\">`\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;✅ No issues found!&#x27;\u003C/span>}\n            \n            \u003Cspan class=\"hljs-string\">&lt;details&gt;\u003C/span>\n            \u003Cspan class=\"hljs-string\">&lt;summary&gt;Full\u003C/span> \u003Cspan class=\"hljs-string\">Report&lt;/summary&gt;\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">\\`\\`\\`json\u003C/span>\n            \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">JSON.stringify(report\u003C/span>, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span>}\n            \u003Cspan class=\"hljs-string\">\\`\\`\\`\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">&lt;/details&gt;\u003C/span>\n            \u003Cspan class=\"hljs-string\">`;\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">github.rest.issues.createComment(\u003C/span>{\n              \u003Cspan class=\"hljs-attr\">issue_number:\u003C/span> \u003Cspan class=\"hljs-string\">context.issue.number\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">owner:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.owner\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">repo:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.repo\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">comment\u003C/span>\n            }\u003Cspan class=\"hljs-string\">);\u003C/span>\n          } \u003Cspan class=\"hljs-string\">catch\u003C/span> \u003Cspan class=\"hljs-string\">(error)\u003C/span> {\n            \u003Cspan class=\"hljs-string\">console.error(&#x27;Failed\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">post\u003C/span> \u003Cspan class=\"hljs-string\">comment:&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">error);\u003C/span>\n          }\n\n  \u003Cspan class=\"hljs-comment\"># External link checking (separate job due to potential timeouts)\u003C/span>\n  \u003Cspan class=\"hljs-attr\">check-external-links:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;schedule&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">contains(github.event.head_commit.message,\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;[check-links]&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">markdown-link-check\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">npm\u003C/span> \u003Cspan class=\"hljs-string\">install\u003C/span> \u003Cspan class=\"hljs-string\">-g\u003C/span> \u003Cspan class=\"hljs-string\">markdown-link-check\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">external\u003C/span> \u003Cspan class=\"hljs-string\">links\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        find content -name &quot;*.md&quot; -exec markdown-link-check {} \\; &gt; link-check-results.txt\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Process\u003C/span> \u003Cspan class=\"hljs-string\">link\u003C/span> \u003Cspan class=\"hljs-string\">check\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/process-link-results.py link-check-results.txt\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Create\u003C/span> \u003Cspan class=\"hljs-string\">issue\u003C/span> \u003Cspan class=\"hljs-string\">for\u003C/span> \u003Cspan class=\"hljs-string\">broken\u003C/span> \u003Cspan class=\"hljs-string\">links\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">failure()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/github-script@v6\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">script:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          const fs = require(&#x27;fs&#x27;);\n          const results = fs.readFileSync(&#x27;link-check-results.txt&#x27;, &#x27;utf8&#x27;);\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">github.rest.issues.create({\u003C/span>\n            \u003Cspan class=\"hljs-attr\">owner:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.owner,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">repo:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.repo,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">title:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;🔗 Broken External Links Detected&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">`\u003C/span>\n            \u003Cspan class=\"hljs-attr\">Automated link checking has detected broken external links:\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">\\`\\`\\`\u003C/span>\n            \u003Cspan class=\"hljs-string\">${results}\u003C/span>\n            \u003Cspan class=\"hljs-string\">\\`\\`\\`\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">Please\u003C/span> \u003Cspan class=\"hljs-string\">review\u003C/span> \u003Cspan class=\"hljs-string\">and\u003C/span> \u003Cspan class=\"hljs-string\">update\u003C/span> \u003Cspan class=\"hljs-string\">these\u003C/span> \u003Cspan class=\"hljs-string\">links.\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">_This\u003C/span> \u003Cspan class=\"hljs-string\">issue\u003C/span> \u003Cspan class=\"hljs-string\">was\u003C/span> \u003Cspan class=\"hljs-string\">created\u003C/span> \u003Cspan class=\"hljs-string\">automatically\u003C/span> \u003Cspan class=\"hljs-string\">by\u003C/span> \u003Cspan class=\"hljs-string\">the\u003C/span> \u003Cspan class=\"hljs-string\">link\u003C/span> \u003Cspan class=\"hljs-string\">checking\u003C/span> \u003Cspan class=\"hljs-string\">workflow._\u003C/span>\n            \u003Cspan class=\"hljs-string\">`,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">labels:\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;documentation&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;maintenance&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;automated&#x27;\u003C/span>]\n          \u003Cspan class=\"hljs-string\">});\u003C/span>\n\n  \u003Cspan class=\"hljs-comment\"># Build and deploy documentation\u003C/span>\n  \u003Cspan class=\"hljs-attr\">build-and-deploy:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> \u003Cspan class=\"hljs-string\">validate-content\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/main&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/develop&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">fetch-depth:\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">npm\u003C/span> \u003Cspan class=\"hljs-string\">ci\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">search\u003C/span> \u003Cspan class=\"hljs-string\">index\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/generate-search-index.py \\\n          --input content/ \\\n          --output public/search-index.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">table\u003C/span> \u003Cspan class=\"hljs-string\">of\u003C/span> \u003Cspan class=\"hljs-string\">contents\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/generate-toc.js\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">documentation\u003C/span> \u003Cspan class=\"hljs-string\">site\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm run build\n\u003C/span>      \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">NODE_ENV:\u003C/span> \u003Cspan class=\"hljs-string\">production\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Optimize\u003C/span> \u003Cspan class=\"hljs-string\">images\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/optimize-images.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">sitemap\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/generate-sitemap.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Deploy\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">staging\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/develop&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Deploy to staging environment\n        npm run deploy:staging\n\u003C/span>      \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">DEPLOY_TOKEN:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.STAGING_DEPLOY_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Deploy\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">production\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/main&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Deploy to production environment\n        npm run deploy:production\n\u003C/span>      \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">DEPLOY_TOKEN:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.PRODUCTION_DEPLOY_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Update\u003C/span> \u003Cspan class=\"hljs-string\">search\u003C/span> \u003Cspan class=\"hljs-string\">index\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/main&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Update external search service\n        curl -X POST \\\n          -H &quot;Authorization: Bearer ${{ secrets.SEARCH_API_TOKEN }}&quot; \\\n          -H &quot;Content-Type: application/json&quot; \\\n          -d @public/search-index.json \\\n          https://api.search-service.com/index/update\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Notify\u003C/span> \u003Cspan class=\"hljs-string\">deployment\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/notify-deployment.py \\\n          --status ${{ job.status }} \\\n          --environment ${{ github.ref == &#x27;refs/heads/main&#x27; &amp;&amp; &#x27;production&#x27; || &#x27;staging&#x27; }}\n\u003C/span>\n  \u003Cspan class=\"hljs-comment\"># Performance and accessibility testing\u003C/span>\n  \u003Cspan class=\"hljs-attr\">quality-assurance:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> \u003Cspan class=\"hljs-string\">build-and-deploy\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/main&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/develop&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">testing\u003C/span> \u003Cspan class=\"hljs-string\">tools\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm install -g @lhci/cli@0.12.x\n        npm install -g pa11y\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">Lighthouse\u003C/span> \u003Cspan class=\"hljs-string\">CI\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        lhci autorun\n\u003C/span>      \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">LHCI_GITHUB_APP_TOKEN:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.LHCI_GITHUB_APP_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">LHCI_TOKEN:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.LHCI_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">accessibility\u003C/span> \u003Cspan class=\"hljs-string\">tests\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Test key pages for accessibility\n        pa11y --standard WCAG2AA \\\n          --reporter json \\\n          --threshold 5 \\\n          https://docs-staging.example.com/ &gt; a11y-results.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Process\u003C/span> \u003Cspan class=\"hljs-string\">QA\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/process-qa-results.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Upload\u003C/span> \u003Cspan class=\"hljs-string\">QA\u003C/span> \u003Cspan class=\"hljs-string\">reports\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">qa-reports\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          lighthouse-reports/\n          a11y-results.json\n\u003C/span>\n  \u003Cspan class=\"hljs-comment\"># Content analytics and insights\u003C/span>\n  \u003Cspan class=\"hljs-attr\">analyze-content:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;schedule&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">fetch-depth:\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Python\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-python@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">python-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.PYTHON_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">analytics\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        pip install -r requirements-analytics.txt\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">content\u003C/span> \u003Cspan class=\"hljs-string\">analytics\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/analyze-content.py \\\n          --output reports/content-analytics.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">contributor\u003C/span> \u003Cspan class=\"hljs-string\">statistics\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/contributor-stats.py \\\n          --output reports/contributor-stats.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Update\u003C/span> \u003Cspan class=\"hljs-string\">documentation\u003C/span> \u003Cspan class=\"hljs-string\">metrics\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/update-metrics-dashboard.py\n\u003C/span>      \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">METRICS_API_TOKEN:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.METRICS_API_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Create\u003C/span> \u003Cspan class=\"hljs-string\">weekly\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/generate-weekly-report.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Post\u003C/span> \u003Cspan class=\"hljs-string\">weekly\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/github-script@v6\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">script:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          const fs = require(&#x27;fs&#x27;);\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">try\u003C/span> {\n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">fs.readFileSync(&#x27;reports/weekly-report.md&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">);\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">github.rest.issues.create(\u003C/span>{\n              \u003Cspan class=\"hljs-attr\">owner:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.owner\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">repo:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.repo\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">title:\u003C/span> \u003Cspan class=\"hljs-string\">`📊\u003C/span> \u003Cspan class=\"hljs-string\">Weekly\u003C/span> \u003Cspan class=\"hljs-string\">Documentation\u003C/span> \u003Cspan class=\"hljs-string\">Report\u003C/span> \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">new\u003C/span> \u003Cspan class=\"hljs-string\">Date().toISOString().split(&#x27;T&#x27;)\u003C/span>[\u003Cspan class=\"hljs-number\">0\u003C/span>]}\u003Cspan class=\"hljs-string\">`\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">labels:\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;documentation&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;analytics&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;weekly-report&#x27;\u003C/span>]\n            }\u003Cspan class=\"hljs-string\">);\u003C/span>\n          } \u003Cspan class=\"hljs-string\">catch\u003C/span> \u003Cspan class=\"hljs-string\">(error)\u003C/span> {\n            \u003Cspan class=\"hljs-string\">console.error(&#x27;Failed\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">create\u003C/span> \u003Cspan class=\"hljs-string\">weekly\u003C/span> \u003Cspan class=\"hljs-string\">report:&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">error);\u003C/span>\n          }\n\n  \u003Cspan class=\"hljs-comment\"># Auto-update dependencies and tools\u003C/span>\n  \u003Cspan class=\"hljs-attr\">update-dependencies:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;schedule&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">token:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.GITHUB_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Update\u003C/span> \u003Cspan class=\"hljs-string\">npm\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm update\n        npm audit fix\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Update\u003C/span> \u003Cspan class=\"hljs-string\">Python\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        pip install --upgrade pip\n        pip list --outdated --format=json | python scripts/update-python-deps.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Update\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">rules\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/update-validation-rules.py\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Create\u003C/span> \u003Cspan class=\"hljs-string\">pull\u003C/span> \u003Cspan class=\"hljs-string\">request\u003C/span> \u003Cspan class=\"hljs-string\">for\u003C/span> \u003Cspan class=\"hljs-string\">updates\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">peter-evans/create-pull-request@v5\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">token:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.GITHUB_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">commit-message:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;chore: update dependencies and validation rules&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">title:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;🔄 Automated dependency updates&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          Automated updates for documentation dependencies and validation rules.\n\u003C/span>          \n          \u003Cspan class=\"hljs-attr\">This PR includes:\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">Updated\u003C/span> \u003Cspan class=\"hljs-string\">npm\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">Updated\u003C/span> \u003Cspan class=\"hljs-string\">Python\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>  \n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">Latest\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">rule\u003C/span> \u003Cspan class=\"hljs-string\">configurations\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">Updated\u003C/span> \u003Cspan class=\"hljs-string\">documentation\u003C/span> \u003Cspan class=\"hljs-string\">tools\u003C/span>\n          \n          \u003Cspan class=\"hljs-string\">Please\u003C/span> \u003Cspan class=\"hljs-string\">review\u003C/span> \u003Cspan class=\"hljs-string\">and\u003C/span> \u003Cspan class=\"hljs-string\">merge\u003C/span> \u003Cspan class=\"hljs-string\">if\u003C/span> \u003Cspan class=\"hljs-string\">all\u003C/span> \u003Cspan class=\"hljs-string\">checks\u003C/span> \u003Cspan class=\"hljs-string\">pass.\u003C/span>\n        \u003Cspan class=\"hljs-attr\">branch:\u003C/span> \u003Cspan class=\"hljs-string\">automated-updates\u003C/span>\n        \u003Cspan class=\"hljs-attr\">labels:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          dependencies\n          automated\n          maintenance\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Advanced Markdown version control and Git integration represents a sophisticated approach to collaborative documentation that transforms simple content creation into robust, scalable workflows capable of supporting large teams and complex content ecosystems. Through intelligent conflict resolution, automated validation systems, and comprehensive CI/CD integration, teams can maintain high-quality documentation while enabling seamless collaboration and efficient content management processes.\u003C/p>\n\u003Cp>The key to successful version control implementation lies in balancing automation with human oversight, ensuring that technical efficiency serves content quality and team productivity. Whether you&#39;re building internal documentation systems, open-source project documentation, or comprehensive knowledge bases, the Git integration techniques covered in this guide provide the foundation for creating maintainable, collaborative documentation workflows that scale effectively with your organization&#39;s needs.\u003C/p>\n\u003Cp>Remember to implement validation early in the development process, establish clear branching strategies that match your team&#39;s workflow, and continuously monitor and optimize your automation systems based on real-world usage patterns. With proper implementation of advanced Git workflows, your Markdown documentation can achieve the same level of rigor, reliability, and collaborative efficiency that modern software development teams expect from their code repositories.\u003C/p>\n",[15,19,22,25,28,31],{"id":16,"text":17,"level":18},"why-master-markdown-version-control-integration","Why Master Markdown Version Control Integration?",2,{"id":20,"text":21,"level":18},"foundation-git-workflows-for-markdown","Foundation Git Workflows for Markdown",{"id":23,"text":24,"level":18},"advanced-merge-conflict-resolution","Advanced Merge Conflict Resolution",{"id":26,"text":27,"level":18},"cicd-integration-for-documentation","CI/CD Integration for Documentation",{"id":29,"text":30,"level":18},"advanced-git-workflows-and-automation","Advanced Git Workflows and Automation",{"id":32,"text":33,"level":18},"conclusion","Conclusion",[],[36,44,52],{"slug":37,"title":38,"description":39,"excerpt":40,"date":41,"category":9,"author":10,"keywords":42,"readingMinutes":43},"markdown-diff-and-patch-documentation-version-control-guide","Markdown Diff and Patch Documentation: Complete Guide for Version Control Integration and Change Tracking","Master Markdown diff tools, patch documentation, and version control integration for collaborative technical writing. Learn diff strategies, change tracking workflows, and automated documentation updates with Git integration.","Advanced Markdown diff and patch documentation techniques enable sophisticated version control workflows that track content changes, facilitate collaborative writing, and maintain comprehensive…","2025-12-07","markdown diff, markdown patch, version control markdown, git markdown diff, markdown change tracking, collaborative writing, technical documentation diff, markdown git workflow",16,{"slug":45,"title":46,"description":47,"excerpt":48,"date":49,"category":9,"author":10,"keywords":50,"readingMinutes":51},"markdown-internationalization-multilingual-documentation-complete-guide","Markdown Internationalization and Multilingual Documentation: Complete Guide for Global Content Management, Translation Workflows, and Localization Strategies","Master internationalization in Markdown with comprehensive multilingual documentation systems, automated translation workflows, locale-specific formatting, and global content management strategies for worldwide audiences.","Markdown internationalization and multilingual documentation systems enable technical writers to create, manage, and maintain documentation that serves global audiences across diverse languages,…","2025-12-24","markdown internationalization, multilingual markdown documentation, markdown translation workflows, markdown localization, global documentation markdown, i18n markdown, markdown language support, multilingual content management",14,{"slug":53,"title":54,"description":55,"excerpt":56,"date":57,"category":9,"author":10,"keywords":58,"readingMinutes":59},"markdown-dynamic-content-generation-automation-workflows-complete-guide","Markdown Dynamic Content Generation and Automation Workflows: Complete Guide for Automated Documentation, Template Systems, and Content Pipeline Management","Master dynamic content generation in Markdown with comprehensive automation workflows, template engines, data-driven documentation systems, and intelligent content pipeline management for scalable technical writing.","Advanced Markdown dynamic content generation and automation workflows enable systematic creation of data-driven documentation, template-based content systems, and intelligent content pipelines…","2025-12-22","markdown automation, dynamic content generation markdown, markdown templates, automated documentation markdown, content pipeline markdown, markdown workflows, data driven documentation, template engines markdown",37,1792184942475]