#
tokens: 37005/50000 2/307 files (page 27/33)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 27 of 33. Use http://codebase.md/tosin2013/documcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .dockerignore
├── .eslintignore
├── .eslintrc.json
├── .github
│   ├── agents
│   │   ├── documcp-ast.md
│   │   ├── documcp-deploy.md
│   │   ├── documcp-memory.md
│   │   ├── documcp-test.md
│   │   └── documcp-tool.md
│   ├── copilot-instructions.md
│   ├── dependabot.yml
│   ├── ISSUE_TEMPLATE
│   │   ├── automated-changelog.md
│   │   ├── bug_report.md
│   │   ├── bug_report.yml
│   │   ├── documentation_issue.md
│   │   ├── feature_request.md
│   │   ├── feature_request.yml
│   │   ├── npm-publishing-fix.md
│   │   └── release_improvements.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── release-drafter.yml
│   └── workflows
│       ├── auto-merge.yml
│       ├── ci.yml
│       ├── codeql.yml
│       ├── dependency-review.yml
│       ├── deploy-docs.yml
│       ├── README.md
│       ├── release-drafter.yml
│       └── release.yml
├── .gitignore
├── .husky
│   ├── commit-msg
│   └── pre-commit
├── .linkcheck.config.json
├── .markdown-link-check.json
├── .nvmrc
├── .pre-commit-config.yaml
├── .versionrc.json
├── ARCHITECTURAL_CHANGES_SUMMARY.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── commitlint.config.js
├── CONTRIBUTING.md
├── docker-compose.docs.yml
├── Dockerfile.docs
├── docs
│   ├── .docusaurus
│   │   ├── docusaurus-plugin-content-docs
│   │   │   └── default
│   │   │       └── __mdx-loader-dependency.json
│   │   └── docusaurus-plugin-content-pages
│   │       └── default
│   │           └── __plugin.json
│   ├── adrs
│   │   ├── adr-0001-mcp-server-architecture.md
│   │   ├── adr-0002-repository-analysis-engine.md
│   │   ├── adr-0003-static-site-generator-recommendation-engine.md
│   │   ├── adr-0004-diataxis-framework-integration.md
│   │   ├── adr-0005-github-pages-deployment-automation.md
│   │   ├── adr-0006-mcp-tools-api-design.md
│   │   ├── adr-0007-mcp-prompts-and-resources-integration.md
│   │   ├── adr-0008-intelligent-content-population-engine.md
│   │   ├── adr-0009-content-accuracy-validation-framework.md
│   │   ├── adr-0010-mcp-resource-pattern-redesign.md
│   │   ├── adr-0011-ce-mcp-compatibility.md
│   │   ├── adr-0012-priority-scoring-system-for-documentation-drift.md
│   │   ├── adr-0013-release-pipeline-and-package-distribution.md
│   │   └── README.md
│   ├── api
│   │   ├── .nojekyll
│   │   ├── assets
│   │   │   ├── hierarchy.js
│   │   │   ├── highlight.css
│   │   │   ├── icons.js
│   │   │   ├── icons.svg
│   │   │   ├── main.js
│   │   │   ├── navigation.js
│   │   │   ├── search.js
│   │   │   └── style.css
│   │   ├── hierarchy.html
│   │   ├── index.html
│   │   ├── modules.html
│   │   └── variables
│   │       └── TOOLS.html
│   ├── assets
│   │   └── logo.svg
│   ├── CE-MCP-FINDINGS.md
│   ├── development
│   │   └── MCP_INSPECTOR_TESTING.md
│   ├── docusaurus.config.js
│   ├── explanation
│   │   ├── architecture.md
│   │   └── index.md
│   ├── guides
│   │   ├── link-validation.md
│   │   ├── playwright-integration.md
│   │   └── playwright-testing-workflow.md
│   ├── how-to
│   │   ├── analytics-setup.md
│   │   ├── change-watcher.md
│   │   ├── custom-domains.md
│   │   ├── documentation-freshness-tracking.md
│   │   ├── drift-priority-scoring.md
│   │   ├── github-pages-deployment.md
│   │   ├── index.md
│   │   ├── llm-integration.md
│   │   ├── local-testing.md
│   │   ├── performance-optimization.md
│   │   ├── prompting-guide.md
│   │   ├── repository-analysis.md
│   │   ├── seo-optimization.md
│   │   ├── site-monitoring.md
│   │   ├── troubleshooting.md
│   │   └── usage-examples.md
│   ├── index.md
│   ├── knowledge-graph.md
│   ├── package-lock.json
│   ├── package.json
│   ├── phase-2-intelligence.md
│   ├── reference
│   │   ├── api-overview.md
│   │   ├── cli.md
│   │   ├── configuration.md
│   │   ├── deploy-pages.md
│   │   ├── index.md
│   │   ├── mcp-tools.md
│   │   └── prompt-templates.md
│   ├── research
│   │   ├── cross-domain-integration
│   │   │   └── README.md
│   │   ├── domain-1-mcp-architecture
│   │   │   ├── index.md
│   │   │   └── mcp-performance-research.md
│   │   ├── domain-2-repository-analysis
│   │   │   └── README.md
│   │   ├── domain-3-ssg-recommendation
│   │   │   ├── index.md
│   │   │   └── ssg-performance-analysis.md
│   │   ├── domain-4-diataxis-integration
│   │   │   └── README.md
│   │   ├── domain-5-github-deployment
│   │   │   ├── github-pages-security-analysis.md
│   │   │   └── index.md
│   │   ├── domain-6-api-design
│   │   │   └── README.md
│   │   ├── README.md
│   │   ├── research-integration-summary-2025-01-14.md
│   │   ├── research-progress-template.md
│   │   └── research-questions-2025-01-14.md
│   ├── robots.txt
│   ├── sidebars.js
│   ├── sitemap.xml
│   ├── src
│   │   └── css
│   │       └── custom.css
│   └── tutorials
│       ├── development-setup.md
│       ├── environment-setup.md
│       ├── first-deployment.md
│       ├── getting-started.md
│       ├── index.md
│       ├── memory-workflows.md
│       └── user-onboarding.md
├── ISSUE_IMPLEMENTATION_SUMMARY.md
├── jest.config.js
├── LICENSE
├── Makefile
├── MCP_PHASE2_IMPLEMENTATION.md
├── mcp-config-example.json
├── mcp.json
├── package-lock.json
├── package.json
├── README.md
├── release.sh
├── scripts
│   └── check-package-structure.cjs
├── SECURITY.md
├── setup-precommit.sh
├── src
│   ├── benchmarks
│   │   └── performance.ts
│   ├── index.ts
│   ├── memory
│   │   ├── contextual-retrieval.ts
│   │   ├── deployment-analytics.ts
│   │   ├── enhanced-manager.ts
│   │   ├── export-import.ts
│   │   ├── freshness-kg-integration.ts
│   │   ├── index.ts
│   │   ├── integration.ts
│   │   ├── kg-code-integration.ts
│   │   ├── kg-health.ts
│   │   ├── kg-integration.ts
│   │   ├── kg-link-validator.ts
│   │   ├── kg-storage.ts
│   │   ├── knowledge-graph.ts
│   │   ├── learning.ts
│   │   ├── manager.ts
│   │   ├── multi-agent-sharing.ts
│   │   ├── pruning.ts
│   │   ├── schemas.ts
│   │   ├── storage.ts
│   │   ├── temporal-analysis.ts
│   │   ├── user-preferences.ts
│   │   └── visualization.ts
│   ├── prompts
│   │   └── technical-writer-prompts.ts
│   ├── scripts
│   │   └── benchmark.ts
│   ├── templates
│   │   └── playwright
│   │       ├── accessibility.spec.template.ts
│   │       ├── Dockerfile.template
│   │       ├── docs-e2e.workflow.template.yml
│   │       ├── link-validation.spec.template.ts
│   │       └── playwright.config.template.ts
│   ├── tools
│   │   ├── analyze-deployments.ts
│   │   ├── analyze-readme.ts
│   │   ├── analyze-repository.ts
│   │   ├── change-watcher.ts
│   │   ├── check-documentation-links.ts
│   │   ├── cleanup-agent-artifacts.ts
│   │   ├── deploy-pages.ts
│   │   ├── detect-gaps.ts
│   │   ├── evaluate-readme-health.ts
│   │   ├── generate-config.ts
│   │   ├── generate-contextual-content.ts
│   │   ├── generate-llm-context.ts
│   │   ├── generate-readme-template.ts
│   │   ├── generate-technical-writer-prompts.ts
│   │   ├── kg-health-check.ts
│   │   ├── manage-preferences.ts
│   │   ├── manage-sitemap.ts
│   │   ├── optimize-readme.ts
│   │   ├── populate-content.ts
│   │   ├── readme-best-practices.ts
│   │   ├── recommend-ssg.ts
│   │   ├── setup-playwright-tests.ts
│   │   ├── setup-structure.ts
│   │   ├── simulate-execution.ts
│   │   ├── sync-code-to-docs.ts
│   │   ├── test-local-deployment.ts
│   │   ├── track-documentation-freshness.ts
│   │   ├── update-existing-documentation.ts
│   │   ├── validate-content.ts
│   │   ├── validate-documentation-freshness.ts
│   │   ├── validate-readme-checklist.ts
│   │   └── verify-deployment.ts
│   ├── types
│   │   └── api.ts
│   ├── utils
│   │   ├── artifact-detector.ts
│   │   ├── ast-analyzer.ts
│   │   ├── change-watcher.ts
│   │   ├── code-scanner.ts
│   │   ├── content-extractor.ts
│   │   ├── drift-detector.ts
│   │   ├── execution-simulator.ts
│   │   ├── freshness-tracker.ts
│   │   ├── language-parsers-simple.ts
│   │   ├── llm-client.ts
│   │   ├── permission-checker.ts
│   │   ├── semantic-analyzer.ts
│   │   ├── sitemap-generator.ts
│   │   ├── usage-metadata.ts
│   │   └── user-feedback-integration.ts
│   └── workflows
│       └── documentation-workflow.ts
├── test-docs-local.sh
├── tests
│   ├── api
│   │   └── mcp-responses.test.ts
│   ├── benchmarks
│   │   └── performance.test.ts
│   ├── call-graph-builder.test.ts
│   ├── change-watcher-priority.integration.test.ts
│   ├── change-watcher.test.ts
│   ├── edge-cases
│   │   └── error-handling.test.ts
│   ├── execution-simulator.test.ts
│   ├── functional
│   │   └── tools.test.ts
│   ├── integration
│   │   ├── kg-documentation-workflow.test.ts
│   │   ├── knowledge-graph-workflow.test.ts
│   │   ├── mcp-readme-tools.test.ts
│   │   ├── memory-mcp-tools.test.ts
│   │   ├── readme-technical-writer.test.ts
│   │   └── workflow.test.ts
│   ├── memory
│   │   ├── contextual-retrieval.test.ts
│   │   ├── enhanced-manager.test.ts
│   │   ├── export-import.test.ts
│   │   ├── freshness-kg-integration.test.ts
│   │   ├── kg-code-integration.test.ts
│   │   ├── kg-health.test.ts
│   │   ├── kg-link-validator.test.ts
│   │   ├── kg-storage-validation.test.ts
│   │   ├── kg-storage.test.ts
│   │   ├── knowledge-graph-documentation-examples.test.ts
│   │   ├── knowledge-graph-enhanced.test.ts
│   │   ├── knowledge-graph.test.ts
│   │   ├── learning.test.ts
│   │   ├── manager-advanced.test.ts
│   │   ├── manager.test.ts
│   │   ├── mcp-resource-integration.test.ts
│   │   ├── mcp-tool-persistence.test.ts
│   │   ├── schemas-documentation-examples.test.ts
│   │   ├── schemas.test.ts
│   │   ├── storage.test.ts
│   │   ├── temporal-analysis.test.ts
│   │   └── user-preferences.test.ts
│   ├── performance
│   │   ├── memory-load-testing.test.ts
│   │   └── memory-stress-testing.test.ts
│   ├── prompts
│   │   ├── guided-workflow-prompts.test.ts
│   │   └── technical-writer-prompts.test.ts
│   ├── server.test.ts
│   ├── setup.ts
│   ├── tools
│   │   ├── all-tools.test.ts
│   │   ├── analyze-coverage.test.ts
│   │   ├── analyze-deployments.test.ts
│   │   ├── analyze-readme.test.ts
│   │   ├── analyze-repository.test.ts
│   │   ├── check-documentation-links.test.ts
│   │   ├── cleanup-agent-artifacts.test.ts
│   │   ├── deploy-pages-kg-retrieval.test.ts
│   │   ├── deploy-pages-tracking.test.ts
│   │   ├── deploy-pages.test.ts
│   │   ├── detect-gaps.test.ts
│   │   ├── evaluate-readme-health.test.ts
│   │   ├── generate-contextual-content.test.ts
│   │   ├── generate-llm-context.test.ts
│   │   ├── generate-readme-template.test.ts
│   │   ├── generate-technical-writer-prompts.test.ts
│   │   ├── kg-health-check.test.ts
│   │   ├── manage-sitemap.test.ts
│   │   ├── optimize-readme.test.ts
│   │   ├── readme-best-practices.test.ts
│   │   ├── recommend-ssg-historical.test.ts
│   │   ├── recommend-ssg-preferences.test.ts
│   │   ├── recommend-ssg.test.ts
│   │   ├── simple-coverage.test.ts
│   │   ├── sync-code-to-docs.test.ts
│   │   ├── test-local-deployment.test.ts
│   │   ├── tool-error-handling.test.ts
│   │   ├── track-documentation-freshness.test.ts
│   │   ├── validate-content.test.ts
│   │   ├── validate-documentation-freshness.test.ts
│   │   └── validate-readme-checklist.test.ts
│   ├── types
│   │   └── type-safety.test.ts
│   └── utils
│       ├── artifact-detector.test.ts
│       ├── ast-analyzer.test.ts
│       ├── content-extractor.test.ts
│       ├── drift-detector-diataxis.test.ts
│       ├── drift-detector-priority.test.ts
│       ├── drift-detector.test.ts
│       ├── freshness-tracker.test.ts
│       ├── llm-client.test.ts
│       ├── semantic-analyzer.test.ts
│       ├── sitemap-generator.test.ts
│       ├── usage-metadata.test.ts
│       └── user-feedback-integration.test.ts
├── tsconfig.json
└── typedoc.json
```

# Files

--------------------------------------------------------------------------------
/docs/api/assets/style.css:
--------------------------------------------------------------------------------

```css
   1 | @layer typedoc {
   2 |     :root {
   3 |         --dim-toolbar-contents-height: 2.5rem;
   4 |         --dim-toolbar-border-bottom-width: 1px;
   5 |         --dim-header-height: calc(
   6 |             var(--dim-toolbar-border-bottom-width) +
   7 |                 var(--dim-toolbar-contents-height)
   8 |         );
   9 | 
  10 |         /* 0rem For mobile; unit is required for calculation in `calc` */
  11 |         --dim-container-main-margin-y: 0rem;
  12 | 
  13 |         --dim-footer-height: 3.5rem;
  14 | 
  15 |         --modal-animation-duration: 0.2s;
  16 |     }
  17 | 
  18 |     :root {
  19 |         /* Light */
  20 |         --light-color-background: #f2f4f8;
  21 |         --light-color-background-secondary: #eff0f1;
  22 |         /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */
  23 |         --light-color-background-active: #d6d8da;
  24 |         --light-color-background-warning: #e6e600;
  25 |         --light-color-warning-text: #222;
  26 |         --light-color-accent: #c5c7c9;
  27 |         --light-color-active-menu-item: var(--light-color-background-active);
  28 |         --light-color-text: #222;
  29 |         --light-color-contrast-text: #000;
  30 |         --light-color-text-aside: #5e5e5e;
  31 | 
  32 |         --light-color-icon-background: var(--light-color-background);
  33 |         --light-color-icon-text: var(--light-color-text);
  34 | 
  35 |         --light-color-comment-tag-text: var(--light-color-text);
  36 |         --light-color-comment-tag: var(--light-color-background);
  37 | 
  38 |         --light-color-link: #1f70c2;
  39 |         --light-color-focus-outline: #3584e4;
  40 | 
  41 |         --light-color-ts-keyword: #056bd6;
  42 |         --light-color-ts-project: #b111c9;
  43 |         --light-color-ts-module: var(--light-color-ts-project);
  44 |         --light-color-ts-namespace: var(--light-color-ts-project);
  45 |         --light-color-ts-enum: #7e6f15;
  46 |         --light-color-ts-enum-member: var(--light-color-ts-enum);
  47 |         --light-color-ts-variable: #4760ec;
  48 |         --light-color-ts-function: #572be7;
  49 |         --light-color-ts-class: #1f70c2;
  50 |         --light-color-ts-interface: #108024;
  51 |         --light-color-ts-constructor: var(--light-color-ts-class);
  52 |         --light-color-ts-property: #9f5f30;
  53 |         --light-color-ts-method: #be3989;
  54 |         --light-color-ts-reference: #ff4d82;
  55 |         --light-color-ts-call-signature: var(--light-color-ts-method);
  56 |         --light-color-ts-index-signature: var(--light-color-ts-property);
  57 |         --light-color-ts-constructor-signature: var(
  58 |             --light-color-ts-constructor
  59 |         );
  60 |         --light-color-ts-parameter: var(--light-color-ts-variable);
  61 |         /* type literal not included as links will never be generated to it */
  62 |         --light-color-ts-type-parameter: #a55c0e;
  63 |         --light-color-ts-accessor: #c73c3c;
  64 |         --light-color-ts-get-signature: var(--light-color-ts-accessor);
  65 |         --light-color-ts-set-signature: var(--light-color-ts-accessor);
  66 |         --light-color-ts-type-alias: #d51270;
  67 |         /* reference not included as links will be colored with the kind that it points to */
  68 |         --light-color-document: #000000;
  69 | 
  70 |         --light-color-alert-note: #0969d9;
  71 |         --light-color-alert-tip: #1a7f37;
  72 |         --light-color-alert-important: #8250df;
  73 |         --light-color-alert-warning: #9a6700;
  74 |         --light-color-alert-caution: #cf222e;
  75 | 
  76 |         --light-external-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' width='10' height='10'><path fill-opacity='0' stroke='%23000' stroke-width='10' d='m43,35H5v60h60V57M45,5v10l10,10-30,30 20,20 30-30 10,10h10V5z'/></svg>");
  77 |         --light-color-scheme: light;
  78 |     }
  79 | 
  80 |     :root {
  81 |         /* Dark */
  82 |         --dark-color-background: #2b2e33;
  83 |         --dark-color-background-secondary: #1e2024;
  84 |         /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */
  85 |         --dark-color-background-active: #5d5d6a;
  86 |         --dark-color-background-warning: #bebe00;
  87 |         --dark-color-warning-text: #222;
  88 |         --dark-color-accent: #9096a2;
  89 |         --dark-color-active-menu-item: var(--dark-color-background-active);
  90 |         --dark-color-text: #f5f5f5;
  91 |         --dark-color-contrast-text: #ffffff;
  92 |         --dark-color-text-aside: #dddddd;
  93 | 
  94 |         --dark-color-icon-background: var(--dark-color-background-secondary);
  95 |         --dark-color-icon-text: var(--dark-color-text);
  96 | 
  97 |         --dark-color-comment-tag-text: var(--dark-color-text);
  98 |         --dark-color-comment-tag: var(--dark-color-background);
  99 | 
 100 |         --dark-color-link: #00aff4;
 101 |         --dark-color-focus-outline: #4c97f2;
 102 | 
 103 |         --dark-color-ts-keyword: #3399ff;
 104 |         --dark-color-ts-project: #e358ff;
 105 |         --dark-color-ts-module: var(--dark-color-ts-project);
 106 |         --dark-color-ts-namespace: var(--dark-color-ts-project);
 107 |         --dark-color-ts-enum: #f4d93e;
 108 |         --dark-color-ts-enum-member: var(--dark-color-ts-enum);
 109 |         --dark-color-ts-variable: #798dff;
 110 |         --dark-color-ts-function: #a280ff;
 111 |         --dark-color-ts-class: #8ac4ff;
 112 |         --dark-color-ts-interface: #6cff87;
 113 |         --dark-color-ts-constructor: var(--dark-color-ts-class);
 114 |         --dark-color-ts-property: #ff984d;
 115 |         --dark-color-ts-method: #ff4db8;
 116 |         --dark-color-ts-reference: #ff4d82;
 117 |         --dark-color-ts-call-signature: var(--dark-color-ts-method);
 118 |         --dark-color-ts-index-signature: var(--dark-color-ts-property);
 119 |         --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor);
 120 |         --dark-color-ts-parameter: var(--dark-color-ts-variable);
 121 |         /* type literal not included as links will never be generated to it */
 122 |         --dark-color-ts-type-parameter: #e07d13;
 123 |         --dark-color-ts-accessor: #ff6060;
 124 |         --dark-color-ts-get-signature: var(--dark-color-ts-accessor);
 125 |         --dark-color-ts-set-signature: var(--dark-color-ts-accessor);
 126 |         --dark-color-ts-type-alias: #ff6492;
 127 |         /* reference not included as links will be colored with the kind that it points to */
 128 |         --dark-color-document: #ffffff;
 129 | 
 130 |         --dark-color-alert-note: #0969d9;
 131 |         --dark-color-alert-tip: #1a7f37;
 132 |         --dark-color-alert-important: #8250df;
 133 |         --dark-color-alert-warning: #9a6700;
 134 |         --dark-color-alert-caution: #cf222e;
 135 | 
 136 |         --dark-external-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' width='10' height='10'><path fill-opacity='0' stroke='%23fff' stroke-width='10' d='m43,35H5v60h60V57M45,5v10l10,10-30,30 20,20 30-30 10,10h10V5z'/></svg>");
 137 |         --dark-color-scheme: dark;
 138 |     }
 139 | 
 140 |     @media (prefers-color-scheme: light) {
 141 |         :root {
 142 |             --color-background: var(--light-color-background);
 143 |             --color-background-secondary: var(
 144 |                 --light-color-background-secondary
 145 |             );
 146 |             --color-background-active: var(--light-color-background-active);
 147 |             --color-background-warning: var(--light-color-background-warning);
 148 |             --color-warning-text: var(--light-color-warning-text);
 149 |             --color-accent: var(--light-color-accent);
 150 |             --color-active-menu-item: var(--light-color-active-menu-item);
 151 |             --color-text: var(--light-color-text);
 152 |             --color-contrast-text: var(--light-color-contrast-text);
 153 |             --color-text-aside: var(--light-color-text-aside);
 154 | 
 155 |             --color-icon-background: var(--light-color-icon-background);
 156 |             --color-icon-text: var(--light-color-icon-text);
 157 | 
 158 |             --color-comment-tag-text: var(--light-color-text);
 159 |             --color-comment-tag: var(--light-color-background);
 160 | 
 161 |             --color-link: var(--light-color-link);
 162 |             --color-focus-outline: var(--light-color-focus-outline);
 163 | 
 164 |             --color-ts-keyword: var(--light-color-ts-keyword);
 165 |             --color-ts-project: var(--light-color-ts-project);
 166 |             --color-ts-module: var(--light-color-ts-module);
 167 |             --color-ts-namespace: var(--light-color-ts-namespace);
 168 |             --color-ts-enum: var(--light-color-ts-enum);
 169 |             --color-ts-enum-member: var(--light-color-ts-enum-member);
 170 |             --color-ts-variable: var(--light-color-ts-variable);
 171 |             --color-ts-function: var(--light-color-ts-function);
 172 |             --color-ts-class: var(--light-color-ts-class);
 173 |             --color-ts-interface: var(--light-color-ts-interface);
 174 |             --color-ts-constructor: var(--light-color-ts-constructor);
 175 |             --color-ts-property: var(--light-color-ts-property);
 176 |             --color-ts-method: var(--light-color-ts-method);
 177 |             --color-ts-reference: var(--light-color-ts-reference);
 178 |             --color-ts-call-signature: var(--light-color-ts-call-signature);
 179 |             --color-ts-index-signature: var(--light-color-ts-index-signature);
 180 |             --color-ts-constructor-signature: var(
 181 |                 --light-color-ts-constructor-signature
 182 |             );
 183 |             --color-ts-parameter: var(--light-color-ts-parameter);
 184 |             --color-ts-type-parameter: var(--light-color-ts-type-parameter);
 185 |             --color-ts-accessor: var(--light-color-ts-accessor);
 186 |             --color-ts-get-signature: var(--light-color-ts-get-signature);
 187 |             --color-ts-set-signature: var(--light-color-ts-set-signature);
 188 |             --color-ts-type-alias: var(--light-color-ts-type-alias);
 189 |             --color-document: var(--light-color-document);
 190 | 
 191 |             --color-alert-note: var(--light-color-alert-note);
 192 |             --color-alert-tip: var(--light-color-alert-tip);
 193 |             --color-alert-important: var(--light-color-alert-important);
 194 |             --color-alert-warning: var(--light-color-alert-warning);
 195 |             --color-alert-caution: var(--light-color-alert-caution);
 196 | 
 197 |             --external-icon: var(--light-external-icon);
 198 |             --color-scheme: var(--light-color-scheme);
 199 |         }
 200 |     }
 201 | 
 202 |     @media (prefers-color-scheme: dark) {
 203 |         :root {
 204 |             --color-background: var(--dark-color-background);
 205 |             --color-background-secondary: var(
 206 |                 --dark-color-background-secondary
 207 |             );
 208 |             --color-background-active: var(--dark-color-background-active);
 209 |             --color-background-warning: var(--dark-color-background-warning);
 210 |             --color-warning-text: var(--dark-color-warning-text);
 211 |             --color-accent: var(--dark-color-accent);
 212 |             --color-active-menu-item: var(--dark-color-active-menu-item);
 213 |             --color-text: var(--dark-color-text);
 214 |             --color-contrast-text: var(--dark-color-contrast-text);
 215 |             --color-text-aside: var(--dark-color-text-aside);
 216 | 
 217 |             --color-icon-background: var(--dark-color-icon-background);
 218 |             --color-icon-text: var(--dark-color-icon-text);
 219 | 
 220 |             --color-comment-tag-text: var(--dark-color-text);
 221 |             --color-comment-tag: var(--dark-color-background);
 222 | 
 223 |             --color-link: var(--dark-color-link);
 224 |             --color-focus-outline: var(--dark-color-focus-outline);
 225 | 
 226 |             --color-ts-keyword: var(--dark-color-ts-keyword);
 227 |             --color-ts-project: var(--dark-color-ts-project);
 228 |             --color-ts-module: var(--dark-color-ts-module);
 229 |             --color-ts-namespace: var(--dark-color-ts-namespace);
 230 |             --color-ts-enum: var(--dark-color-ts-enum);
 231 |             --color-ts-enum-member: var(--dark-color-ts-enum-member);
 232 |             --color-ts-variable: var(--dark-color-ts-variable);
 233 |             --color-ts-function: var(--dark-color-ts-function);
 234 |             --color-ts-class: var(--dark-color-ts-class);
 235 |             --color-ts-interface: var(--dark-color-ts-interface);
 236 |             --color-ts-constructor: var(--dark-color-ts-constructor);
 237 |             --color-ts-property: var(--dark-color-ts-property);
 238 |             --color-ts-method: var(--dark-color-ts-method);
 239 |             --color-ts-reference: var(--dark-color-ts-reference);
 240 |             --color-ts-call-signature: var(--dark-color-ts-call-signature);
 241 |             --color-ts-index-signature: var(--dark-color-ts-index-signature);
 242 |             --color-ts-constructor-signature: var(
 243 |                 --dark-color-ts-constructor-signature
 244 |             );
 245 |             --color-ts-parameter: var(--dark-color-ts-parameter);
 246 |             --color-ts-type-parameter: var(--dark-color-ts-type-parameter);
 247 |             --color-ts-accessor: var(--dark-color-ts-accessor);
 248 |             --color-ts-get-signature: var(--dark-color-ts-get-signature);
 249 |             --color-ts-set-signature: var(--dark-color-ts-set-signature);
 250 |             --color-ts-type-alias: var(--dark-color-ts-type-alias);
 251 |             --color-document: var(--dark-color-document);
 252 | 
 253 |             --color-alert-note: var(--dark-color-alert-note);
 254 |             --color-alert-tip: var(--dark-color-alert-tip);
 255 |             --color-alert-important: var(--dark-color-alert-important);
 256 |             --color-alert-warning: var(--dark-color-alert-warning);
 257 |             --color-alert-caution: var(--dark-color-alert-caution);
 258 | 
 259 |             --external-icon: var(--dark-external-icon);
 260 |             --color-scheme: var(--dark-color-scheme);
 261 |         }
 262 |     }
 263 | 
 264 |     :root[data-theme="light"] {
 265 |         --color-background: var(--light-color-background);
 266 |         --color-background-secondary: var(--light-color-background-secondary);
 267 |         --color-background-active: var(--light-color-background-active);
 268 |         --color-background-warning: var(--light-color-background-warning);
 269 |         --color-warning-text: var(--light-color-warning-text);
 270 |         --color-icon-background: var(--light-color-icon-background);
 271 |         --color-accent: var(--light-color-accent);
 272 |         --color-active-menu-item: var(--light-color-active-menu-item);
 273 |         --color-text: var(--light-color-text);
 274 |         --color-contrast-text: var(--light-color-contrast-text);
 275 |         --color-text-aside: var(--light-color-text-aside);
 276 |         --color-icon-text: var(--light-color-icon-text);
 277 | 
 278 |         --color-comment-tag-text: var(--light-color-text);
 279 |         --color-comment-tag: var(--light-color-background);
 280 | 
 281 |         --color-link: var(--light-color-link);
 282 |         --color-focus-outline: var(--light-color-focus-outline);
 283 | 
 284 |         --color-ts-keyword: var(--light-color-ts-keyword);
 285 |         --color-ts-project: var(--light-color-ts-project);
 286 |         --color-ts-module: var(--light-color-ts-module);
 287 |         --color-ts-namespace: var(--light-color-ts-namespace);
 288 |         --color-ts-enum: var(--light-color-ts-enum);
 289 |         --color-ts-enum-member: var(--light-color-ts-enum-member);
 290 |         --color-ts-variable: var(--light-color-ts-variable);
 291 |         --color-ts-function: var(--light-color-ts-function);
 292 |         --color-ts-class: var(--light-color-ts-class);
 293 |         --color-ts-interface: var(--light-color-ts-interface);
 294 |         --color-ts-constructor: var(--light-color-ts-constructor);
 295 |         --color-ts-property: var(--light-color-ts-property);
 296 |         --color-ts-method: var(--light-color-ts-method);
 297 |         --color-ts-reference: var(--light-color-ts-reference);
 298 |         --color-ts-call-signature: var(--light-color-ts-call-signature);
 299 |         --color-ts-index-signature: var(--light-color-ts-index-signature);
 300 |         --color-ts-constructor-signature: var(
 301 |             --light-color-ts-constructor-signature
 302 |         );
 303 |         --color-ts-parameter: var(--light-color-ts-parameter);
 304 |         --color-ts-type-parameter: var(--light-color-ts-type-parameter);
 305 |         --color-ts-accessor: var(--light-color-ts-accessor);
 306 |         --color-ts-get-signature: var(--light-color-ts-get-signature);
 307 |         --color-ts-set-signature: var(--light-color-ts-set-signature);
 308 |         --color-ts-type-alias: var(--light-color-ts-type-alias);
 309 |         --color-document: var(--light-color-document);
 310 | 
 311 |         --color-note: var(--light-color-note);
 312 |         --color-tip: var(--light-color-tip);
 313 |         --color-important: var(--light-color-important);
 314 |         --color-warning: var(--light-color-warning);
 315 |         --color-caution: var(--light-color-caution);
 316 | 
 317 |         --external-icon: var(--light-external-icon);
 318 |         --color-scheme: var(--light-color-scheme);
 319 |     }
 320 | 
 321 |     :root[data-theme="dark"] {
 322 |         --color-background: var(--dark-color-background);
 323 |         --color-background-secondary: var(--dark-color-background-secondary);
 324 |         --color-background-active: var(--dark-color-background-active);
 325 |         --color-background-warning: var(--dark-color-background-warning);
 326 |         --color-warning-text: var(--dark-color-warning-text);
 327 |         --color-icon-background: var(--dark-color-icon-background);
 328 |         --color-accent: var(--dark-color-accent);
 329 |         --color-active-menu-item: var(--dark-color-active-menu-item);
 330 |         --color-text: var(--dark-color-text);
 331 |         --color-contrast-text: var(--dark-color-contrast-text);
 332 |         --color-text-aside: var(--dark-color-text-aside);
 333 |         --color-icon-text: var(--dark-color-icon-text);
 334 | 
 335 |         --color-comment-tag-text: var(--dark-color-text);
 336 |         --color-comment-tag: var(--dark-color-background);
 337 | 
 338 |         --color-link: var(--dark-color-link);
 339 |         --color-focus-outline: var(--dark-color-focus-outline);
 340 | 
 341 |         --color-ts-keyword: var(--dark-color-ts-keyword);
 342 |         --color-ts-project: var(--dark-color-ts-project);
 343 |         --color-ts-module: var(--dark-color-ts-module);
 344 |         --color-ts-namespace: var(--dark-color-ts-namespace);
 345 |         --color-ts-enum: var(--dark-color-ts-enum);
 346 |         --color-ts-enum-member: var(--dark-color-ts-enum-member);
 347 |         --color-ts-variable: var(--dark-color-ts-variable);
 348 |         --color-ts-function: var(--dark-color-ts-function);
 349 |         --color-ts-class: var(--dark-color-ts-class);
 350 |         --color-ts-interface: var(--dark-color-ts-interface);
 351 |         --color-ts-constructor: var(--dark-color-ts-constructor);
 352 |         --color-ts-property: var(--dark-color-ts-property);
 353 |         --color-ts-method: var(--dark-color-ts-method);
 354 |         --color-ts-reference: var(--dark-color-ts-reference);
 355 |         --color-ts-call-signature: var(--dark-color-ts-call-signature);
 356 |         --color-ts-index-signature: var(--dark-color-ts-index-signature);
 357 |         --color-ts-constructor-signature: var(
 358 |             --dark-color-ts-constructor-signature
 359 |         );
 360 |         --color-ts-parameter: var(--dark-color-ts-parameter);
 361 |         --color-ts-type-parameter: var(--dark-color-ts-type-parameter);
 362 |         --color-ts-accessor: var(--dark-color-ts-accessor);
 363 |         --color-ts-get-signature: var(--dark-color-ts-get-signature);
 364 |         --color-ts-set-signature: var(--dark-color-ts-set-signature);
 365 |         --color-ts-type-alias: var(--dark-color-ts-type-alias);
 366 |         --color-document: var(--dark-color-document);
 367 | 
 368 |         --color-note: var(--dark-color-note);
 369 |         --color-tip: var(--dark-color-tip);
 370 |         --color-important: var(--dark-color-important);
 371 |         --color-warning: var(--dark-color-warning);
 372 |         --color-caution: var(--dark-color-caution);
 373 | 
 374 |         --external-icon: var(--dark-external-icon);
 375 |         --color-scheme: var(--dark-color-scheme);
 376 |     }
 377 | 
 378 |     html {
 379 |         color-scheme: var(--color-scheme);
 380 |         @media (prefers-reduced-motion: no-preference) {
 381 |             scroll-behavior: smooth;
 382 |         }
 383 |     }
 384 | 
 385 |     *:focus-visible,
 386 |     .tsd-accordion-summary:focus-visible svg {
 387 |         outline: 2px solid var(--color-focus-outline);
 388 |     }
 389 | 
 390 |     .always-visible,
 391 |     .always-visible .tsd-signatures {
 392 |         display: inherit !important;
 393 |     }
 394 | 
 395 |     h1,
 396 |     h2,
 397 |     h3,
 398 |     h4,
 399 |     h5,
 400 |     h6 {
 401 |         line-height: 1.2;
 402 |     }
 403 | 
 404 |     h1 {
 405 |         font-size: 1.875rem;
 406 |         margin: 0.67rem 0;
 407 |     }
 408 | 
 409 |     h2 {
 410 |         font-size: 1.5rem;
 411 |         margin: 0.83rem 0;
 412 |     }
 413 | 
 414 |     h3 {
 415 |         font-size: 1.25rem;
 416 |         margin: 1rem 0;
 417 |     }
 418 | 
 419 |     h4 {
 420 |         font-size: 1.05rem;
 421 |         margin: 1.33rem 0;
 422 |     }
 423 | 
 424 |     h5 {
 425 |         font-size: 1rem;
 426 |         margin: 1.5rem 0;
 427 |     }
 428 | 
 429 |     h6 {
 430 |         font-size: 0.875rem;
 431 |         margin: 2.33rem 0;
 432 |     }
 433 | 
 434 |     dl,
 435 |     menu,
 436 |     ol,
 437 |     ul {
 438 |         margin: 1em 0;
 439 |     }
 440 | 
 441 |     dd {
 442 |         margin: 0 0 0 34px;
 443 |     }
 444 | 
 445 |     .container {
 446 |         max-width: 1700px;
 447 |         padding: 0 2rem;
 448 |     }
 449 | 
 450 |     /* Footer */
 451 |     footer {
 452 |         border-top: 1px solid var(--color-accent);
 453 |         padding-top: 1rem;
 454 |         padding-bottom: 1rem;
 455 |         max-height: var(--dim-footer-height);
 456 |     }
 457 |     footer > p {
 458 |         margin: 0 1em;
 459 |     }
 460 | 
 461 |     .container-main {
 462 |         margin: var(--dim-container-main-margin-y) auto;
 463 |         /* toolbar, footer, margin */
 464 |         min-height: calc(
 465 |             100svh - var(--dim-header-height) - var(--dim-footer-height) -
 466 |                 2 * var(--dim-container-main-margin-y)
 467 |         );
 468 |     }
 469 | 
 470 |     @keyframes fade-in {
 471 |         from {
 472 |             opacity: 0;
 473 |         }
 474 |         to {
 475 |             opacity: 1;
 476 |         }
 477 |     }
 478 |     @keyframes fade-out {
 479 |         from {
 480 |             opacity: 1;
 481 |             visibility: visible;
 482 |         }
 483 |         to {
 484 |             opacity: 0;
 485 |         }
 486 |     }
 487 |     @keyframes pop-in-from-right {
 488 |         from {
 489 |             transform: translate(100%, 0);
 490 |         }
 491 |         to {
 492 |             transform: translate(0, 0);
 493 |         }
 494 |     }
 495 |     @keyframes pop-out-to-right {
 496 |         from {
 497 |             transform: translate(0, 0);
 498 |             visibility: visible;
 499 |         }
 500 |         to {
 501 |             transform: translate(100%, 0);
 502 |         }
 503 |     }
 504 |     body {
 505 |         background: var(--color-background);
 506 |         font-family:
 507 |             -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
 508 |             Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
 509 |         font-size: 16px;
 510 |         color: var(--color-text);
 511 |         margin: 0;
 512 |     }
 513 | 
 514 |     a {
 515 |         color: var(--color-link);
 516 |         text-decoration: none;
 517 |     }
 518 |     a:hover {
 519 |         text-decoration: underline;
 520 |     }
 521 |     a.external[target="_blank"] {
 522 |         background-image: var(--external-icon);
 523 |         background-position: top 3px right;
 524 |         background-repeat: no-repeat;
 525 |         padding-right: 13px;
 526 |     }
 527 |     a.tsd-anchor-link {
 528 |         color: var(--color-text);
 529 |     }
 530 |     :target {
 531 |         scroll-margin-block: calc(var(--dim-header-height) + 0.5rem);
 532 |     }
 533 | 
 534 |     code,
 535 |     pre {
 536 |         font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
 537 |         padding: 0.2em;
 538 |         margin: 0;
 539 |         font-size: 0.875rem;
 540 |         border-radius: 0.8em;
 541 |     }
 542 | 
 543 |     pre {
 544 |         position: relative;
 545 |         white-space: pre-wrap;
 546 |         word-wrap: break-word;
 547 |         padding: 10px;
 548 |         border: 1px solid var(--color-accent);
 549 |         margin-bottom: 8px;
 550 |     }
 551 |     pre code {
 552 |         padding: 0;
 553 |         font-size: 100%;
 554 |     }
 555 |     pre > button {
 556 |         position: absolute;
 557 |         top: 10px;
 558 |         right: 10px;
 559 |         opacity: 0;
 560 |         transition: opacity 0.1s;
 561 |         box-sizing: border-box;
 562 |     }
 563 |     pre:hover > button,
 564 |     pre > button.visible,
 565 |     pre > button:focus-visible {
 566 |         opacity: 1;
 567 |     }
 568 | 
 569 |     blockquote {
 570 |         margin: 1em 0;
 571 |         padding-left: 1em;
 572 |         border-left: 4px solid gray;
 573 |     }
 574 | 
 575 |     img {
 576 |         max-width: 100%;
 577 |     }
 578 | 
 579 |     * {
 580 |         scrollbar-width: thin;
 581 |         scrollbar-color: var(--color-accent) var(--color-icon-background);
 582 |     }
 583 | 
 584 |     *::-webkit-scrollbar {
 585 |         width: 0.75rem;
 586 |     }
 587 | 
 588 |     *::-webkit-scrollbar-track {
 589 |         background: var(--color-icon-background);
 590 |     }
 591 | 
 592 |     *::-webkit-scrollbar-thumb {
 593 |         background-color: var(--color-accent);
 594 |         border-radius: 999rem;
 595 |         border: 0.25rem solid var(--color-icon-background);
 596 |     }
 597 | 
 598 |     dialog {
 599 |         border: none;
 600 |         outline: none;
 601 |         padding: 0;
 602 |         background-color: var(--color-background);
 603 |     }
 604 |     dialog::backdrop {
 605 |         display: none;
 606 |     }
 607 |     #tsd-overlay {
 608 |         background-color: rgba(0, 0, 0, 0.5);
 609 |         position: fixed;
 610 |         z-index: 9999;
 611 |         top: 0;
 612 |         left: 0;
 613 |         right: 0;
 614 |         bottom: 0;
 615 |         animation: fade-in var(--modal-animation-duration) forwards;
 616 |     }
 617 |     #tsd-overlay.closing {
 618 |         animation-name: fade-out;
 619 |     }
 620 | 
 621 |     .tsd-typography {
 622 |         line-height: 1.333em;
 623 |     }
 624 |     .tsd-typography ul {
 625 |         list-style: square;
 626 |         padding: 0 0 0 20px;
 627 |         margin: 0;
 628 |     }
 629 |     .tsd-typography .tsd-index-panel h3,
 630 |     .tsd-index-panel .tsd-typography h3,
 631 |     .tsd-typography h4,
 632 |     .tsd-typography h5,
 633 |     .tsd-typography h6 {
 634 |         font-size: 1em;
 635 |     }
 636 |     .tsd-typography h5,
 637 |     .tsd-typography h6 {
 638 |         font-weight: normal;
 639 |     }
 640 |     .tsd-typography p,
 641 |     .tsd-typography ul,
 642 |     .tsd-typography ol {
 643 |         margin: 1em 0;
 644 |     }
 645 |     .tsd-typography table {
 646 |         border-collapse: collapse;
 647 |         border: none;
 648 |     }
 649 |     .tsd-typography td,
 650 |     .tsd-typography th {
 651 |         padding: 6px 13px;
 652 |         border: 1px solid var(--color-accent);
 653 |     }
 654 |     .tsd-typography thead,
 655 |     .tsd-typography tr:nth-child(even) {
 656 |         background-color: var(--color-background-secondary);
 657 |     }
 658 | 
 659 |     .tsd-alert {
 660 |         padding: 8px 16px;
 661 |         margin-bottom: 16px;
 662 |         border-left: 0.25em solid var(--alert-color);
 663 |     }
 664 |     .tsd-alert blockquote > :last-child,
 665 |     .tsd-alert > :last-child {
 666 |         margin-bottom: 0;
 667 |     }
 668 |     .tsd-alert-title {
 669 |         color: var(--alert-color);
 670 |         display: inline-flex;
 671 |         align-items: center;
 672 |     }
 673 |     .tsd-alert-title span {
 674 |         margin-left: 4px;
 675 |     }
 676 | 
 677 |     .tsd-alert-note {
 678 |         --alert-color: var(--color-alert-note);
 679 |     }
 680 |     .tsd-alert-tip {
 681 |         --alert-color: var(--color-alert-tip);
 682 |     }
 683 |     .tsd-alert-important {
 684 |         --alert-color: var(--color-alert-important);
 685 |     }
 686 |     .tsd-alert-warning {
 687 |         --alert-color: var(--color-alert-warning);
 688 |     }
 689 |     .tsd-alert-caution {
 690 |         --alert-color: var(--color-alert-caution);
 691 |     }
 692 | 
 693 |     .tsd-breadcrumb {
 694 |         margin: 0;
 695 |         margin-top: 1rem;
 696 |         padding: 0;
 697 |         color: var(--color-text-aside);
 698 |     }
 699 |     .tsd-breadcrumb a {
 700 |         color: var(--color-text-aside);
 701 |         text-decoration: none;
 702 |     }
 703 |     .tsd-breadcrumb a:hover {
 704 |         text-decoration: underline;
 705 |     }
 706 |     .tsd-breadcrumb li {
 707 |         display: inline;
 708 |     }
 709 |     .tsd-breadcrumb li:after {
 710 |         content: " / ";
 711 |     }
 712 | 
 713 |     .tsd-comment-tags {
 714 |         display: flex;
 715 |         flex-direction: column;
 716 |     }
 717 |     dl.tsd-comment-tag-group {
 718 |         display: flex;
 719 |         align-items: center;
 720 |         overflow: hidden;
 721 |         margin: 0.5em 0;
 722 |     }
 723 |     dl.tsd-comment-tag-group dt {
 724 |         display: flex;
 725 |         margin-right: 0.5em;
 726 |         font-size: 0.875em;
 727 |         font-weight: normal;
 728 |     }
 729 |     dl.tsd-comment-tag-group dd {
 730 |         margin: 0;
 731 |     }
 732 |     code.tsd-tag {
 733 |         padding: 0.25em 0.4em;
 734 |         border: 0.1em solid var(--color-accent);
 735 |         margin-right: 0.25em;
 736 |         font-size: 70%;
 737 |     }
 738 |     h1 code.tsd-tag:first-of-type {
 739 |         margin-left: 0.25em;
 740 |     }
 741 | 
 742 |     dl.tsd-comment-tag-group dd:before,
 743 |     dl.tsd-comment-tag-group dd:after {
 744 |         content: " ";
 745 |     }
 746 |     dl.tsd-comment-tag-group dd pre,
 747 |     dl.tsd-comment-tag-group dd:after {
 748 |         clear: both;
 749 |     }
 750 |     dl.tsd-comment-tag-group p {
 751 |         margin: 0;
 752 |     }
 753 | 
 754 |     .tsd-panel.tsd-comment .lead {
 755 |         font-size: 1.1em;
 756 |         line-height: 1.333em;
 757 |         margin-bottom: 2em;
 758 |     }
 759 |     .tsd-panel.tsd-comment .lead:last-child {
 760 |         margin-bottom: 0;
 761 |     }
 762 | 
 763 |     .tsd-filter-visibility h4 {
 764 |         font-size: 1rem;
 765 |         padding-top: 0.75rem;
 766 |         padding-bottom: 0.5rem;
 767 |         margin: 0;
 768 |     }
 769 |     .tsd-filter-item:not(:last-child) {
 770 |         margin-bottom: 0.5rem;
 771 |     }
 772 |     .tsd-filter-input {
 773 |         display: flex;
 774 |         width: -moz-fit-content;
 775 |         width: fit-content;
 776 |         align-items: center;
 777 |         -webkit-user-select: none;
 778 |         -moz-user-select: none;
 779 |         -ms-user-select: none;
 780 |         user-select: none;
 781 |         cursor: pointer;
 782 |     }
 783 |     .tsd-filter-input input[type="checkbox"] {
 784 |         cursor: pointer;
 785 |         position: absolute;
 786 |         width: 1.5em;
 787 |         height: 1.5em;
 788 |         opacity: 0;
 789 |     }
 790 |     .tsd-filter-input input[type="checkbox"]:disabled {
 791 |         pointer-events: none;
 792 |     }
 793 |     .tsd-filter-input svg {
 794 |         cursor: pointer;
 795 |         width: 1.5em;
 796 |         height: 1.5em;
 797 |         margin-right: 0.5em;
 798 |         border-radius: 0.33em;
 799 |         /* Leaving this at full opacity breaks event listeners on Firefox.
 800 |         Don't remove unless you know what you're doing. */
 801 |         opacity: 0.99;
 802 |     }
 803 |     .tsd-filter-input input[type="checkbox"]:focus-visible + svg {
 804 |         outline: 2px solid var(--color-focus-outline);
 805 |     }
 806 |     .tsd-checkbox-background {
 807 |         fill: var(--color-accent);
 808 |     }
 809 |     input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark {
 810 |         stroke: var(--color-text);
 811 |     }
 812 |     .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background {
 813 |         fill: var(--color-background);
 814 |         stroke: var(--color-accent);
 815 |         stroke-width: 0.25rem;
 816 |     }
 817 |     .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark {
 818 |         stroke: var(--color-accent);
 819 |     }
 820 | 
 821 |     .settings-label {
 822 |         font-weight: bold;
 823 |         text-transform: uppercase;
 824 |         display: inline-block;
 825 |     }
 826 | 
 827 |     .tsd-filter-visibility .settings-label {
 828 |         margin: 0.75rem 0 0.5rem 0;
 829 |     }
 830 | 
 831 |     .tsd-theme-toggle .settings-label {
 832 |         margin: 0.75rem 0.75rem 0 0;
 833 |     }
 834 | 
 835 |     .tsd-hierarchy h4 label:hover span {
 836 |         text-decoration: underline;
 837 |     }
 838 | 
 839 |     .tsd-hierarchy {
 840 |         list-style: square;
 841 |         margin: 0;
 842 |     }
 843 |     .tsd-hierarchy-target {
 844 |         font-weight: bold;
 845 |     }
 846 |     .tsd-hierarchy-toggle {
 847 |         color: var(--color-link);
 848 |         cursor: pointer;
 849 |     }
 850 | 
 851 |     .tsd-full-hierarchy:not(:last-child) {
 852 |         margin-bottom: 1em;
 853 |         padding-bottom: 1em;
 854 |         border-bottom: 1px solid var(--color-accent);
 855 |     }
 856 |     .tsd-full-hierarchy,
 857 |     .tsd-full-hierarchy ul {
 858 |         list-style: none;
 859 |         margin: 0;
 860 |         padding: 0;
 861 |     }
 862 |     .tsd-full-hierarchy ul {
 863 |         padding-left: 1.5rem;
 864 |     }
 865 |     .tsd-full-hierarchy a {
 866 |         padding: 0.25rem 0 !important;
 867 |         font-size: 1rem;
 868 |         display: inline-flex;
 869 |         align-items: center;
 870 |         color: var(--color-text);
 871 |     }
 872 |     .tsd-full-hierarchy svg[data-dropdown] {
 873 |         cursor: pointer;
 874 |     }
 875 |     .tsd-full-hierarchy svg[data-dropdown="false"] {
 876 |         transform: rotate(-90deg);
 877 |     }
 878 |     .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul {
 879 |         display: none;
 880 |     }
 881 | 
 882 |     .tsd-panel-group.tsd-index-group {
 883 |         margin-bottom: 0;
 884 |     }
 885 |     .tsd-index-panel .tsd-index-list {
 886 |         list-style: none;
 887 |         line-height: 1.333em;
 888 |         margin: 0;
 889 |         padding: 0.25rem 0 0 0;
 890 |         overflow: hidden;
 891 |         display: grid;
 892 |         grid-template-columns: repeat(3, 1fr);
 893 |         column-gap: 1rem;
 894 |         grid-template-rows: auto;
 895 |     }
 896 |     @media (max-width: 1024px) {
 897 |         .tsd-index-panel .tsd-index-list {
 898 |             grid-template-columns: repeat(2, 1fr);
 899 |         }
 900 |     }
 901 |     @media (max-width: 768px) {
 902 |         .tsd-index-panel .tsd-index-list {
 903 |             grid-template-columns: repeat(1, 1fr);
 904 |         }
 905 |     }
 906 |     .tsd-index-panel .tsd-index-list li {
 907 |         -webkit-page-break-inside: avoid;
 908 |         -moz-page-break-inside: avoid;
 909 |         -ms-page-break-inside: avoid;
 910 |         -o-page-break-inside: avoid;
 911 |         page-break-inside: avoid;
 912 |     }
 913 | 
 914 |     .tsd-flag {
 915 |         display: inline-block;
 916 |         padding: 0.25em 0.4em;
 917 |         border-radius: 4px;
 918 |         color: var(--color-comment-tag-text);
 919 |         background-color: var(--color-comment-tag);
 920 |         text-indent: 0;
 921 |         font-size: 75%;
 922 |         line-height: 1;
 923 |         font-weight: normal;
 924 |     }
 925 | 
 926 |     .tsd-anchor {
 927 |         position: relative;
 928 |         top: -100px;
 929 |     }
 930 | 
 931 |     .tsd-member {
 932 |         position: relative;
 933 |     }
 934 |     .tsd-member .tsd-anchor + h3 {
 935 |         display: flex;
 936 |         align-items: center;
 937 |         margin-top: 0;
 938 |         margin-bottom: 0;
 939 |         border-bottom: none;
 940 |     }
 941 | 
 942 |     .tsd-navigation.settings {
 943 |         margin: 0;
 944 |         margin-bottom: 1rem;
 945 |     }
 946 |     .tsd-navigation > a,
 947 |     .tsd-navigation .tsd-accordion-summary {
 948 |         width: calc(100% - 0.25rem);
 949 |         display: flex;
 950 |         align-items: center;
 951 |     }
 952 |     .tsd-navigation a,
 953 |     .tsd-navigation summary > span,
 954 |     .tsd-page-navigation a {
 955 |         display: flex;
 956 |         width: calc(100% - 0.25rem);
 957 |         align-items: center;
 958 |         padding: 0.25rem;
 959 |         color: var(--color-text);
 960 |         text-decoration: none;
 961 |         box-sizing: border-box;
 962 |     }
 963 |     .tsd-navigation a.current,
 964 |     .tsd-page-navigation a.current {
 965 |         background: var(--color-active-menu-item);
 966 |         color: var(--color-contrast-text);
 967 |     }
 968 |     .tsd-navigation a:hover,
 969 |     .tsd-page-navigation a:hover {
 970 |         text-decoration: underline;
 971 |     }
 972 |     .tsd-navigation ul,
 973 |     .tsd-page-navigation ul {
 974 |         margin-top: 0;
 975 |         margin-bottom: 0;
 976 |         padding: 0;
 977 |         list-style: none;
 978 |     }
 979 |     .tsd-navigation li,
 980 |     .tsd-page-navigation li {
 981 |         padding: 0;
 982 |         max-width: 100%;
 983 |     }
 984 |     .tsd-navigation .tsd-nav-link {
 985 |         display: none;
 986 |     }
 987 |     .tsd-nested-navigation {
 988 |         margin-left: 3rem;
 989 |     }
 990 |     .tsd-nested-navigation > li > details {
 991 |         margin-left: -1.5rem;
 992 |     }
 993 |     .tsd-small-nested-navigation {
 994 |         margin-left: 1.5rem;
 995 |     }
 996 |     .tsd-small-nested-navigation > li > details {
 997 |         margin-left: -1.5rem;
 998 |     }
 999 | 
1000 |     .tsd-page-navigation-section > summary {
1001 |         padding: 0.25rem;
1002 |     }
1003 |     .tsd-page-navigation-section > summary > svg {
1004 |         margin-right: 0.25rem;
1005 |     }
1006 |     .tsd-page-navigation-section > div {
1007 |         margin-left: 30px;
1008 |     }
1009 |     .tsd-page-navigation ul {
1010 |         padding-left: 1.75rem;
1011 |     }
1012 | 
1013 |     #tsd-sidebar-links a {
1014 |         margin-top: 0;
1015 |         margin-bottom: 0.5rem;
1016 |         line-height: 1.25rem;
1017 |     }
1018 |     #tsd-sidebar-links a:last-of-type {
1019 |         margin-bottom: 0;
1020 |     }
1021 | 
1022 |     a.tsd-index-link {
1023 |         padding: 0.25rem 0 !important;
1024 |         font-size: 1rem;
1025 |         line-height: 1.25rem;
1026 |         display: inline-flex;
1027 |         align-items: center;
1028 |         color: var(--color-text);
1029 |     }
1030 |     .tsd-accordion-summary {
1031 |         list-style-type: none; /* hide marker on non-safari */
1032 |         outline: none; /* broken on safari, so just hide it */
1033 |         display: flex;
1034 |         align-items: center;
1035 |         gap: 0.25rem;
1036 |         box-sizing: border-box;
1037 |     }
1038 |     .tsd-accordion-summary::-webkit-details-marker {
1039 |         display: none; /* hide marker on safari */
1040 |     }
1041 |     .tsd-accordion-summary,
1042 |     .tsd-accordion-summary a {
1043 |         -moz-user-select: none;
1044 |         -webkit-user-select: none;
1045 |         -ms-user-select: none;
1046 |         user-select: none;
1047 | 
1048 |         cursor: pointer;
1049 |     }
1050 |     .tsd-accordion-summary a {
1051 |         width: calc(100% - 1.5rem);
1052 |     }
1053 |     .tsd-accordion-summary > * {
1054 |         margin-top: 0;
1055 |         margin-bottom: 0;
1056 |         padding-top: 0;
1057 |         padding-bottom: 0;
1058 |     }
1059 |     /*
1060 |      * We need to be careful to target the arrow indicating whether the accordion
1061 |      * is open, but not any other SVGs included in the details element.
1062 |      */
1063 |     .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child {
1064 |         transform: rotate(-90deg);
1065 |     }
1066 |     .tsd-index-content > :not(:first-child) {
1067 |         margin-top: 0.75rem;
1068 |     }
1069 |     .tsd-index-summary {
1070 |         margin-top: 1.5rem;
1071 |         margin-bottom: 0.75rem;
1072 |         display: flex;
1073 |         align-content: center;
1074 |     }
1075 | 
1076 |     .tsd-no-select {
1077 |         -webkit-user-select: none;
1078 |         -moz-user-select: none;
1079 |         -ms-user-select: none;
1080 |         user-select: none;
1081 |     }
1082 |     .tsd-kind-icon {
1083 |         margin-right: 0.5rem;
1084 |         width: 1.25rem;
1085 |         height: 1.25rem;
1086 |         min-width: 1.25rem;
1087 |         min-height: 1.25rem;
1088 |     }
1089 |     .tsd-signature > .tsd-kind-icon {
1090 |         margin-right: 0.8rem;
1091 |     }
1092 | 
1093 |     .tsd-panel {
1094 |         margin-bottom: 2.5rem;
1095 |     }
1096 |     .tsd-panel.tsd-member {
1097 |         margin-bottom: 4rem;
1098 |     }
1099 |     .tsd-panel:empty {
1100 |         display: none;
1101 |     }
1102 |     .tsd-panel > h1,
1103 |     .tsd-panel > h2,
1104 |     .tsd-panel > h3 {
1105 |         margin: 1.5rem -1.5rem 0.75rem -1.5rem;
1106 |         padding: 0 1.5rem 0.75rem 1.5rem;
1107 |     }
1108 |     .tsd-panel > h1.tsd-before-signature,
1109 |     .tsd-panel > h2.tsd-before-signature,
1110 |     .tsd-panel > h3.tsd-before-signature {
1111 |         margin-bottom: 0;
1112 |         border-bottom: none;
1113 |     }
1114 | 
1115 |     .tsd-panel-group {
1116 |         margin: 2rem 0;
1117 |     }
1118 |     .tsd-panel-group.tsd-index-group {
1119 |         margin: 2rem 0;
1120 |     }
1121 |     .tsd-panel-group.tsd-index-group details {
1122 |         margin: 2rem 0;
1123 |     }
1124 |     .tsd-panel-group > .tsd-accordion-summary {
1125 |         margin-bottom: 1rem;
1126 |     }
1127 | 
1128 |     #tsd-search[open] {
1129 |         animation: fade-in var(--modal-animation-duration) ease-out forwards;
1130 |     }
1131 |     #tsd-search[open].closing {
1132 |         animation-name: fade-out;
1133 |     }
1134 | 
1135 |     /* Avoid setting `display` on closed dialog */
1136 |     #tsd-search[open] {
1137 |         display: flex;
1138 |         flex-direction: column;
1139 |         padding: 1rem;
1140 |         width: 32rem;
1141 |         max-width: 90vw;
1142 |         max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh);
1143 |         /* Anchor dialog to top */
1144 |         margin-top: 10vh;
1145 |         border-radius: 6px;
1146 |         will-change: max-height;
1147 |     }
1148 |     #tsd-search-input {
1149 |         box-sizing: border-box;
1150 |         width: 100%;
1151 |         padding: 0 0.625rem; /* 10px */
1152 |         outline: 0;
1153 |         border: 2px solid var(--color-accent);
1154 |         background-color: transparent;
1155 |         color: var(--color-text);
1156 |         border-radius: 4px;
1157 |         height: 2.5rem;
1158 |         flex: 0 0 auto;
1159 |         font-size: 0.875rem;
1160 |         transition: border-color 0.2s, background-color 0.2s;
1161 |     }
1162 |     #tsd-search-input:focus-visible {
1163 |         background-color: var(--color-background-active);
1164 |         border-color: transparent;
1165 |         color: var(--color-contrast-text);
1166 |     }
1167 |     #tsd-search-input::placeholder {
1168 |         color: inherit;
1169 |         opacity: 0.8;
1170 |     }
1171 |     #tsd-search-results {
1172 |         margin: 0;
1173 |         padding: 0;
1174 |         list-style: none;
1175 |         flex: 1 1 auto;
1176 |         display: flex;
1177 |         flex-direction: column;
1178 |         overflow-y: auto;
1179 |     }
1180 |     #tsd-search-results:not(:empty) {
1181 |         margin-top: 0.5rem;
1182 |     }
1183 |     #tsd-search-results > li {
1184 |         background-color: var(--color-background);
1185 |         line-height: 1.5;
1186 |         box-sizing: border-box;
1187 |         border-radius: 4px;
1188 |     }
1189 |     #tsd-search-results > li:nth-child(even) {
1190 |         background-color: var(--color-background-secondary);
1191 |     }
1192 |     #tsd-search-results > li:is(:hover, [aria-selected="true"]) {
1193 |         background-color: var(--color-background-active);
1194 |         color: var(--color-contrast-text);
1195 |     }
1196 |     /* It's important that this takes full size of parent `li`, to capture a click on `li` */
1197 |     #tsd-search-results > li > a {
1198 |         display: flex;
1199 |         align-items: center;
1200 |         padding: 0.5rem 0.25rem;
1201 |         box-sizing: border-box;
1202 |         width: 100%;
1203 |     }
1204 |     #tsd-search-results > li > a > .text {
1205 |         flex: 1 1 auto;
1206 |         min-width: 0;
1207 |         overflow-wrap: anywhere;
1208 |     }
1209 |     #tsd-search-results > li > a .parent {
1210 |         color: var(--color-text-aside);
1211 |     }
1212 |     #tsd-search-results > li > a mark {
1213 |         color: inherit;
1214 |         background-color: inherit;
1215 |         font-weight: bold;
1216 |     }
1217 |     #tsd-search-status {
1218 |         flex: 1;
1219 |         display: grid;
1220 |         place-content: center;
1221 |         text-align: center;
1222 |         overflow-wrap: anywhere;
1223 |     }
1224 |     #tsd-search-status:not(:empty) {
1225 |         min-height: 6rem;
1226 |     }
1227 | 
1228 |     .tsd-signature {
1229 |         margin: 0 0 1rem 0;
1230 |         padding: 1rem 0.5rem;
1231 |         border: 1px solid var(--color-accent);
1232 |         font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
1233 |         font-size: 14px;
1234 |         overflow-x: auto;
1235 |     }
1236 | 
1237 |     .tsd-signature-keyword {
1238 |         color: var(--color-ts-keyword);
1239 |         font-weight: normal;
1240 |     }
1241 | 
1242 |     .tsd-signature-symbol {
1243 |         color: var(--color-text-aside);
1244 |         font-weight: normal;
1245 |     }
1246 | 
1247 |     .tsd-signature-type {
1248 |         font-style: italic;
1249 |         font-weight: normal;
1250 |     }
1251 | 
1252 |     .tsd-signatures {
1253 |         padding: 0;
1254 |         margin: 0 0 1em 0;
1255 |         list-style-type: none;
1256 |     }
1257 |     .tsd-signatures .tsd-signature {
1258 |         margin: 0;
1259 |         border-color: var(--color-accent);
1260 |         border-width: 1px 0;
1261 |         transition: background-color 0.1s;
1262 |     }
1263 |     .tsd-signatures .tsd-index-signature:not(:last-child) {
1264 |         margin-bottom: 1em;
1265 |     }
1266 |     .tsd-signatures .tsd-index-signature .tsd-signature {
1267 |         border-width: 1px;
1268 |     }
1269 |     .tsd-description .tsd-signatures .tsd-signature {
1270 |         border-width: 1px;
1271 |     }
1272 | 
1273 |     ul.tsd-parameter-list,
1274 |     ul.tsd-type-parameter-list {
1275 |         list-style: square;
1276 |         margin: 0;
1277 |         padding-left: 20px;
1278 |     }
1279 |     ul.tsd-parameter-list > li.tsd-parameter-signature,
1280 |     ul.tsd-type-parameter-list > li.tsd-parameter-signature {
1281 |         list-style: none;
1282 |         margin-left: -20px;
1283 |     }
1284 |     ul.tsd-parameter-list h5,
1285 |     ul.tsd-type-parameter-list h5 {
1286 |         font-size: 16px;
1287 |         margin: 1em 0 0.5em 0;
1288 |     }
1289 |     .tsd-sources {
1290 |         margin-top: 1rem;
1291 |         font-size: 0.875em;
1292 |     }
1293 |     .tsd-sources a {
1294 |         color: var(--color-text-aside);
1295 |         text-decoration: underline;
1296 |     }
1297 |     .tsd-sources ul {
1298 |         list-style: none;
1299 |         padding: 0;
1300 |     }
1301 | 
1302 |     .tsd-page-toolbar {
1303 |         position: sticky;
1304 |         z-index: 1;
1305 |         top: 0;
1306 |         left: 0;
1307 |         width: 100%;
1308 |         color: var(--color-text);
1309 |         background: var(--color-background-secondary);
1310 |         border-bottom: var(--dim-toolbar-border-bottom-width)
1311 |             var(--color-accent) solid;
1312 |         transition: transform 0.3s ease-in-out;
1313 |     }
1314 |     .tsd-page-toolbar a {
1315 |         color: var(--color-text);
1316 |     }
1317 |     .tsd-toolbar-contents {
1318 |         display: flex;
1319 |         align-items: center;
1320 |         height: var(--dim-toolbar-contents-height);
1321 |         margin: 0 auto;
1322 |     }
1323 |     .tsd-toolbar-contents > .title {
1324 |         font-weight: bold;
1325 |         margin-right: auto;
1326 |     }
1327 |     #tsd-toolbar-links {
1328 |         display: flex;
1329 |         align-items: center;
1330 |         gap: 1.5rem;
1331 |         margin-right: 1rem;
1332 |     }
1333 | 
1334 |     .tsd-widget {
1335 |         box-sizing: border-box;
1336 |         display: inline-block;
1337 |         opacity: 0.8;
1338 |         height: 2.5rem;
1339 |         width: 2.5rem;
1340 |         transition: opacity 0.1s, background-color 0.1s;
1341 |         text-align: center;
1342 |         cursor: pointer;
1343 |         border: none;
1344 |         background-color: transparent;
1345 |     }
1346 |     .tsd-widget:hover {
1347 |         opacity: 0.9;
1348 |     }
1349 |     .tsd-widget:active {
1350 |         opacity: 1;
1351 |         background-color: var(--color-accent);
1352 |     }
1353 |     #tsd-toolbar-menu-trigger {
1354 |         display: none;
1355 |     }
1356 | 
1357 |     .tsd-member-summary-name {
1358 |         display: inline-flex;
1359 |         align-items: center;
1360 |         padding: 0.25rem;
1361 |         text-decoration: none;
1362 |     }
1363 | 
1364 |     .tsd-anchor-icon {
1365 |         display: inline-flex;
1366 |         align-items: center;
1367 |         margin-left: 0.5rem;
1368 |         color: var(--color-text);
1369 |         vertical-align: middle;
1370 |     }
1371 | 
1372 |     .tsd-anchor-icon svg {
1373 |         width: 1em;
1374 |         height: 1em;
1375 |         visibility: hidden;
1376 |     }
1377 | 
1378 |     .tsd-member-summary-name:hover > .tsd-anchor-icon svg,
1379 |     .tsd-anchor-link:hover > .tsd-anchor-icon svg,
1380 |     .tsd-anchor-icon:focus-visible svg {
1381 |         visibility: visible;
1382 |     }
1383 | 
1384 |     .deprecated {
1385 |         text-decoration: line-through !important;
1386 |     }
1387 | 
1388 |     .warning {
1389 |         padding: 1rem;
1390 |         color: var(--color-warning-text);
1391 |         background: var(--color-background-warning);
1392 |     }
1393 | 
1394 |     .tsd-kind-project {
1395 |         color: var(--color-ts-project);
1396 |     }
1397 |     .tsd-kind-module {
1398 |         color: var(--color-ts-module);
1399 |     }
1400 |     .tsd-kind-namespace {
1401 |         color: var(--color-ts-namespace);
1402 |     }
1403 |     .tsd-kind-enum {
1404 |         color: var(--color-ts-enum);
1405 |     }
1406 |     .tsd-kind-enum-member {
1407 |         color: var(--color-ts-enum-member);
1408 |     }
1409 |     .tsd-kind-variable {
1410 |         color: var(--color-ts-variable);
1411 |     }
1412 |     .tsd-kind-function {
1413 |         color: var(--color-ts-function);
1414 |     }
1415 |     .tsd-kind-class {
1416 |         color: var(--color-ts-class);
1417 |     }
1418 |     .tsd-kind-interface {
1419 |         color: var(--color-ts-interface);
1420 |     }
1421 |     .tsd-kind-constructor {
1422 |         color: var(--color-ts-constructor);
1423 |     }
1424 |     .tsd-kind-property {
1425 |         color: var(--color-ts-property);
1426 |     }
1427 |     .tsd-kind-method {
1428 |         color: var(--color-ts-method);
1429 |     }
1430 |     .tsd-kind-reference {
1431 |         color: var(--color-ts-reference);
1432 |     }
1433 |     .tsd-kind-call-signature {
1434 |         color: var(--color-ts-call-signature);
1435 |     }
1436 |     .tsd-kind-index-signature {
1437 |         color: var(--color-ts-index-signature);
1438 |     }
1439 |     .tsd-kind-constructor-signature {
1440 |         color: var(--color-ts-constructor-signature);
1441 |     }
1442 |     .tsd-kind-parameter {
1443 |         color: var(--color-ts-parameter);
1444 |     }
1445 |     .tsd-kind-type-parameter {
1446 |         color: var(--color-ts-type-parameter);
1447 |     }
1448 |     .tsd-kind-accessor {
1449 |         color: var(--color-ts-accessor);
1450 |     }
1451 |     .tsd-kind-get-signature {
1452 |         color: var(--color-ts-get-signature);
1453 |     }
1454 |     .tsd-kind-set-signature {
1455 |         color: var(--color-ts-set-signature);
1456 |     }
1457 |     .tsd-kind-type-alias {
1458 |         color: var(--color-ts-type-alias);
1459 |     }
1460 | 
1461 |     /* if we have a kind icon, don't color the text by kind */
1462 |     .tsd-kind-icon ~ span {
1463 |         color: var(--color-text);
1464 |     }
1465 | 
1466 |     /* mobile */
1467 |     @media (max-width: 769px) {
1468 |         #tsd-toolbar-menu-trigger {
1469 |             display: inline-block;
1470 |             /* temporary fix to vertically align, for compatibility */
1471 |             line-height: 2.5;
1472 |         }
1473 |         #tsd-toolbar-links {
1474 |             display: none;
1475 |         }
1476 | 
1477 |         .container-main {
1478 |             display: flex;
1479 |         }
1480 |         .col-content {
1481 |             float: none;
1482 |             max-width: 100%;
1483 |             width: 100%;
1484 |         }
1485 |         .col-sidebar {
1486 |             position: fixed !important;
1487 |             overflow-y: auto;
1488 |             -webkit-overflow-scrolling: touch;
1489 |             z-index: 1024;
1490 |             top: 0 !important;
1491 |             bottom: 0 !important;
1492 |             left: auto !important;
1493 |             right: 0 !important;
1494 |             padding: 1.5rem 1.5rem 0 0;
1495 |             width: 75vw;
1496 |             visibility: hidden;
1497 |             background-color: var(--color-background);
1498 |             transform: translate(100%, 0);
1499 |         }
1500 |         .col-sidebar > *:last-child {
1501 |             padding-bottom: 20px;
1502 |         }
1503 |         .overlay {
1504 |             content: "";
1505 |             display: block;
1506 |             position: fixed;
1507 |             z-index: 1023;
1508 |             top: 0;
1509 |             left: 0;
1510 |             right: 0;
1511 |             bottom: 0;
1512 |             background-color: rgba(0, 0, 0, 0.75);
1513 |             visibility: hidden;
1514 |         }
1515 | 
1516 |         .to-has-menu .overlay {
1517 |             animation: fade-in 0.4s;
1518 |         }
1519 | 
1520 |         .to-has-menu .col-sidebar {
1521 |             animation: pop-in-from-right 0.4s;
1522 |         }
1523 | 
1524 |         .from-has-menu .overlay {
1525 |             animation: fade-out 0.4s;
1526 |         }
1527 | 
1528 |         .from-has-menu .col-sidebar {
1529 |             animation: pop-out-to-right 0.4s;
1530 |         }
1531 | 
1532 |         .has-menu body {
1533 |             overflow: hidden;
1534 |         }
1535 |         .has-menu .overlay {
1536 |             visibility: visible;
1537 |         }
1538 |         .has-menu .col-sidebar {
1539 |             visibility: visible;
1540 |             transform: translate(0, 0);
1541 |             display: flex;
1542 |             flex-direction: column;
1543 |             gap: 1.5rem;
1544 |             max-height: 100vh;
1545 |             padding: 1rem 2rem;
1546 |         }
1547 |         .has-menu .tsd-navigation {
1548 |             max-height: 100%;
1549 |         }
1550 |         .tsd-navigation .tsd-nav-link {
1551 |             display: flex;
1552 |         }
1553 |     }
1554 | 
1555 |     /* one sidebar */
1556 |     @media (min-width: 770px) {
1557 |         .container-main {
1558 |             display: grid;
1559 |             grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
1560 |             grid-template-areas: "sidebar content";
1561 |             --dim-container-main-margin-y: 2rem;
1562 |         }
1563 | 
1564 |         .tsd-breadcrumb {
1565 |             margin-top: 0;
1566 |         }
1567 | 
1568 |         .col-sidebar {
1569 |             grid-area: sidebar;
1570 |         }
1571 |         .col-content {
1572 |             grid-area: content;
1573 |             padding: 0 1rem;
1574 |         }
1575 |     }
1576 |     @media (min-width: 770px) and (max-width: 1399px) {
1577 |         .col-sidebar {
1578 |             max-height: calc(
1579 |                 100vh - var(--dim-header-height) - var(--dim-footer-height) -
1580 |                     2 * var(--dim-container-main-margin-y)
1581 |             );
1582 |             overflow: auto;
1583 |             position: sticky;
1584 |             top: calc(
1585 |                 var(--dim-header-height) + var(--dim-container-main-margin-y)
1586 |             );
1587 |         }
1588 |         .site-menu {
1589 |             margin-top: 1rem;
1590 |         }
1591 |     }
1592 | 
1593 |     /* two sidebars */
1594 |     @media (min-width: 1200px) {
1595 |         .container-main {
1596 |             grid-template-columns:
1597 |                 minmax(0, 1fr) minmax(0, 2.5fr) minmax(
1598 |                 0,
1599 |                 20rem
1600 |             );
1601 |             grid-template-areas: "sidebar content toc";
1602 |         }
1603 | 
1604 |         .col-sidebar {
1605 |             display: contents;
1606 |         }
1607 | 
1608 |         .page-menu {
1609 |             grid-area: toc;
1610 |             padding-left: 1rem;
1611 |         }
1612 |         .site-menu {
1613 |             grid-area: sidebar;
1614 |         }
1615 | 
1616 |         .site-menu {
1617 |             margin-top: 0rem;
1618 |         }
1619 | 
1620 |         .page-menu,
1621 |         .site-menu {
1622 |             max-height: calc(
1623 |                 100vh - var(--dim-header-height) - var(--dim-footer-height) -
1624 |                     2 * var(--dim-container-main-margin-y)
1625 |             );
1626 |             overflow: auto;
1627 |             position: sticky;
1628 |             top: calc(
1629 |                 var(--dim-header-height) + var(--dim-container-main-margin-y)
1630 |             );
1631 |         }
1632 |     }
1633 | }
1634 | 
```

--------------------------------------------------------------------------------
/docs/adrs/adr-0008-intelligent-content-population-engine.md:
--------------------------------------------------------------------------------

```markdown
   1 | ---
   2 | id: adr-8-intelligent-content-population-engine
   3 | title: "ADR-008: Intelligent Content Population Engine"
   4 | sidebar_label: "ADR-008: Intelligent Content Population Engine"
   5 | sidebar_position: 8
   6 | documcp:
   7 |   last_updated: "2025-11-20T00:46:21.942Z"
   8 |   last_validated: "2025-12-09T19:41:38.572Z"
   9 |   auto_updated: false
  10 |   update_frequency: monthly
  11 |   validated_against_commit: 306567b32114502c606244ad6c2930360bcd4201
  12 | ---
  13 | 
  14 | # ADR-008: Intelligent Content Population Engine for Diataxis Documentation
  15 | 
  16 | ## Status
  17 | 
  18 | Accepted
  19 | 
  20 | ## Context
  21 | 
  22 | DocuMCP currently creates excellent Diataxis-compliant documentation structures through ADR-004 and ADR-006, but produces only skeleton content with placeholder text. This creates a significant gap between the framework's potential and delivered value, requiring users to manually populate all documentation content despite having comprehensive repository analysis data available.
  23 | 
  24 | The current `setup-structure` tool (from ADR-006) provides:
  25 | 
  26 | - ✅ Professional Diataxis directory structure
  27 | - ✅ SSG-specific configuration and frontmatter
  28 | - ✅ Basic template content explaining Diataxis categories
  29 | - ❌ **Missing**: Project-specific content analysis and intelligent population
  30 | - ❌ **Missing**: Repository analysis integration for content suggestions
  31 | - ❌ **Missing**: Technology-specific documentation generation
  32 | 
  33 | **Current User Journey:**
  34 | 
  35 | 1. Repository analysis identifies TypeScript project with Express.js, PostgreSQL, Jest tests
  36 | 2. Diataxis structure created with generic placeholder content
  37 | 3. User must manually research and write all tutorials, how-to guides, reference docs, and explanations
  38 | 4. **Result**: 8-20 hours of manual documentation work despite intelligent analysis
  39 | 
  40 | **Target User Journey:**
  41 | 
  42 | 1. Repository analysis identifies project characteristics and technology stack
  43 | 2. Intelligent content population generates project-specific documentation
  44 | 3. User reviews and refines 60-80% pre-populated, contextually relevant content
  45 | 4. **Result**: 1-2 hours of refinement work with professional-quality starting point
  46 | 
  47 | Key gaps identified:
  48 | 
  49 | - Repository analysis data (125 files, TypeScript/JavaScript ecosystem, test infrastructure) not leveraged for content generation
  50 | - Extensive technology detection capabilities underutilized for creating relevant examples
  51 | - Diataxis framework implementation incomplete without intelligent content planning (ADR-004, lines 153-192)
  52 | - Competitive disadvantage: users get empty templates instead of intelligent assistance
  53 | 
  54 | ## Decision
  55 | 
  56 | We will implement an Intelligent Content Population Engine that bridges repository analysis with Diataxis content generation, creating the missing layer between structural generation and user-ready documentation.
  57 | 
  58 | ### Architecture Overview:
  59 | 
  60 | #### 1. Content Intelligence Engine
  61 | 
  62 | **Purpose**: Transform repository analysis into structured content plans
  63 | **Core Capabilities**:
  64 | 
  65 | - Project characteristic analysis (technology stack, architecture patterns, API surfaces)
  66 | - User journey mapping to appropriate Diataxis categories
  67 | - Content gap identification and priority assignment
  68 | - Technology-specific example and code snippet generation
  69 | 
  70 | #### 2. Project-Aware Content Generators
  71 | 
  72 | **Purpose**: Create contextually relevant content for each Diataxis category
  73 | **Scope**: Four specialized generators aligned with Diataxis framework:
  74 | 
  75 | ##### Tutorial Content Generator
  76 | 
  77 | - **Getting Started**: Framework-specific installation, setup, and first success
  78 | - **Feature Tutorials**: Based on detected APIs, key dependencies, and project complexity
  79 | - **Integration Tutorials**: For detected services, databases, and external dependencies
  80 | 
  81 | ##### How-To Guide Generator
  82 | 
  83 | - **Common Tasks**: Derived from project type and technology stack
  84 | - **Troubleshooting**: Based on detected tools, frameworks, and common pain points
  85 | - **Deployment Guides**: Technology-specific deployment patterns and best practices
  86 | 
  87 | ##### Reference Documentation Generator
  88 | 
  89 | - **API Documentation**: Auto-generate from detected API surfaces and endpoints
  90 | - **Configuration Reference**: Based on identified config files and environment variables
  91 | - **CLI Reference**: For detected command-line tools and scripts
  92 | 
  93 | ##### Explanation Content Generator
  94 | 
  95 | - **Architecture Overview**: Based on detected patterns, dependencies, and project structure
  96 | - **Design Decisions**: Technology choices and their implications
  97 | - **Concept Explanations**: Framework and domain-specific concepts
  98 | 
  99 | #### 3. Repository Analysis Integration Layer
 100 | 
 101 | **Purpose**: Bridge analysis data with content generation
 102 | **Integration Points**:
 103 | 
 104 | - Language ecosystem analysis → Technology-specific content
 105 | - Dependency analysis → Framework integration guides
 106 | - Project structure analysis → Architecture documentation
 107 | - Complexity assessment → Content depth and sophistication level
 108 | 
 109 | ### Implementation Architecture:
 110 | 
 111 | ```typescript
 112 | interface ContentPopulationEngine {
 113 |   // Core engine interface
 114 |   populateContent(
 115 |     analysisId: string,
 116 |     docsPath: string,
 117 |     options: PopulationOptions,
 118 |   ): Promise<PopulationResult>;
 119 | 
 120 |   // Content planning
 121 |   generateContentPlan(analysis: RepositoryAnalysis): ContentPlan;
 122 |   identifyContentGaps(
 123 |     existing: ExistingContent,
 124 |     plan: ContentPlan,
 125 |   ): ContentGap[];
 126 | 
 127 |   // Content generation
 128 |   generateTutorialContent(
 129 |     plan: TutorialPlan,
 130 |     context: ProjectContext,
 131 |   ): TutorialContent;
 132 |   generateHowToContent(plan: HowToPlan, context: ProjectContext): HowToContent;
 133 |   generateReferenceContent(
 134 |     plan: ReferencePlan,
 135 |     context: ProjectContext,
 136 |   ): ReferenceContent;
 137 |   generateExplanationContent(
 138 |     plan: ExplanationPlan,
 139 |     context: ProjectContext,
 140 |   ): ExplanationContent;
 141 | }
 142 | 
 143 | interface PopulationOptions {
 144 |   level: "basic" | "comprehensive" | "intelligent";
 145 |   includeCodeExamples: boolean;
 146 |   projectSpecific: boolean;
 147 |   preserveExisting: boolean;
 148 |   customizationProfile?: CustomizationProfile;
 149 | }
 150 | 
 151 | interface ContentPlan {
 152 |   tutorials: TutorialSuggestion[];
 153 |   howToGuides: HowToSuggestion[];
 154 |   reference: ReferenceSuggestion[];
 155 |   explanation: ExplanationSuggestion[];
 156 |   crossReferences: ContentRelationship[];
 157 |   estimatedEffort: EffortEstimate;
 158 | }
 159 | 
 160 | interface ProjectContext {
 161 |   primaryLanguage: string;
 162 |   frameworks: Framework[];
 163 |   architecture: ArchitecturePattern;
 164 |   apiSurfaces: APIAnalysis[];
 165 |   deploymentTargets: DeploymentTarget[];
 166 |   testingFrameworks: TestingFramework[];
 167 |   dependencies: DependencyAnalysis;
 168 | }
 169 | ```
 170 | 
 171 | ### Content Generation Algorithms:
 172 | 
 173 | #### Tutorial Generation Algorithm
 174 | 
 175 | ```typescript
 176 | function generateTutorials(analysis: RepositoryAnalysis): TutorialSuggestion[] {
 177 |   const suggestions: TutorialSuggestion[] = [];
 178 | 
 179 |   // Always include getting started
 180 |   suggestions.push({
 181 |     title: `Getting Started with ${analysis.metadata.projectName}`,
 182 |     description: `Learn ${analysis.recommendations.primaryLanguage} development with ${analysis.metadata.projectName}`,
 183 |     priority: "high",
 184 |     sections: generateGettingStartedSections(analysis),
 185 |     codeExamples: generateTechnologySpecificExamples(
 186 |       analysis.dependencies.ecosystem,
 187 |     ),
 188 |   });
 189 | 
 190 |   // Framework-specific tutorials
 191 |   if (analysis.dependencies.packages.includes("express")) {
 192 |     suggestions.push({
 193 |       title: "Building REST APIs with Express.js",
 194 |       description: "Complete guide to creating RESTful services",
 195 |       priority: "high",
 196 |       sections: generateExpressTutorialSections(analysis),
 197 |     });
 198 |   }
 199 | 
 200 |   // Database integration tutorials
 201 |   const dbDeps = detectDatabaseDependencies(analysis.dependencies.packages);
 202 |   dbDeps.forEach((db) => {
 203 |     suggestions.push({
 204 |       title: `Database Integration with ${db.name}`,
 205 |       description: `Connect and interact with ${db.name} databases`,
 206 |       priority: "medium",
 207 |       sections: generateDatabaseTutorialSections(db, analysis),
 208 |     });
 209 |   });
 210 | 
 211 |   return suggestions;
 212 | }
 213 | ```
 214 | 
 215 | #### Reference Generation Algorithm
 216 | 
 217 | ```typescript
 218 | function generateReference(
 219 |   analysis: RepositoryAnalysis,
 220 | ): ReferenceSuggestion[] {
 221 |   const suggestions: ReferenceSuggestion[] = [];
 222 | 
 223 |   // API documentation from detected endpoints
 224 |   const apiSurfaces = detectAPIEndpoints(analysis);
 225 |   if (apiSurfaces.length > 0) {
 226 |     suggestions.push({
 227 |       title: "API Reference",
 228 |       description: "Complete API endpoint documentation",
 229 |       content: generateAPIDocumentation(apiSurfaces),
 230 |       format: "openapi-spec",
 231 |     });
 232 |   }
 233 | 
 234 |   // Configuration reference from detected config files
 235 |   const configFiles = detectConfigurationFiles(analysis);
 236 |   configFiles.forEach((config) => {
 237 |     suggestions.push({
 238 |       title: `${config.type} Configuration`,
 239 |       description: `Configuration options for ${config.name}`,
 240 |       content: generateConfigurationReference(config),
 241 |       format: "configuration-table",
 242 |     });
 243 |   });
 244 | 
 245 |   // CLI reference from detected scripts
 246 |   const cliCommands = detectCLICommands(analysis);
 247 |   if (cliCommands.length > 0) {
 248 |     suggestions.push({
 249 |       title: "Command Line Interface",
 250 |       description: "Available commands and options",
 251 |       content: generateCLIReference(cliCommands),
 252 |       format: "cli-documentation",
 253 |     });
 254 |   }
 255 | 
 256 |   return suggestions;
 257 | }
 258 | ```
 259 | 
 260 | ### Technology-Specific Content Templates:
 261 | 
 262 | #### JavaScript/TypeScript Ecosystem
 263 | 
 264 | ```typescript
 265 | const JAVASCRIPT_TEMPLATES = {
 266 |   gettingStarted: {
 267 |     prerequisites: ["Node.js 20.0.0+", "npm or yarn", "Git"],
 268 |     installationSteps: [
 269 |       "Clone the repository",
 270 |       "Install dependencies with npm install",
 271 |       "Copy environment variables",
 272 |       "Run development server",
 273 |     ],
 274 |     verificationSteps: [
 275 |       "Check server starts successfully",
 276 |       "Access application in browser",
 277 |       "Run test suite to verify setup",
 278 |     ],
 279 |   },
 280 | 
 281 |   expressAPI: {
 282 |     sections: [
 283 |       "Project Structure Overview",
 284 |       "Creating Your First Route",
 285 |       "Middleware Configuration",
 286 |       "Database Integration",
 287 |       "Error Handling",
 288 |       "Testing Your API",
 289 |     ],
 290 |     codeExamples: generateExpressCodeExamples,
 291 |   },
 292 | 
 293 |   testingGuides: {
 294 |     jest: generateJestHowToGuides,
 295 |     cypress: generateCypressHowToGuides,
 296 |     playwright: generatePlaywrightHowToGuides,
 297 |   },
 298 | };
 299 | ```
 300 | 
 301 | #### Multi-Language Framework Support
 302 | 
 303 | ##### JavaScript/TypeScript Ecosystem
 304 | 
 305 | ```typescript
 306 | const JAVASCRIPT_TEMPLATES = {
 307 |   gettingStarted: {
 308 |     prerequisites: ["Node.js 20.0.0+", "npm or yarn", "Git"],
 309 |     installationSteps: [
 310 |       "Clone the repository",
 311 |       "Install dependencies with npm install",
 312 |       "Copy environment variables",
 313 |       "Run development server",
 314 |     ],
 315 |     verificationSteps: [
 316 |       "Check server starts successfully",
 317 |       "Access application in browser",
 318 |       "Run test suite to verify setup",
 319 |     ],
 320 |   },
 321 | 
 322 |   frameworks: {
 323 |     express: {
 324 |       tutorials: [
 325 |         "REST API Development",
 326 |         "Middleware Configuration",
 327 |         "Database Integration",
 328 |       ],
 329 |       howToGuides: [
 330 |         "Performance Optimization",
 331 |         "Error Handling",
 332 |         "Authentication Setup",
 333 |       ],
 334 |       reference: [
 335 |         "Route Configuration",
 336 |         "Middleware Reference",
 337 |         "Configuration Options",
 338 |       ],
 339 |       explanation: [
 340 |         "Express Architecture",
 341 |         "Middleware Pattern",
 342 |         "Async Handling",
 343 |       ],
 344 |     },
 345 |     react: {
 346 |       tutorials: ["Component Development", "State Management", "React Router"],
 347 |       howToGuides: [
 348 |         "Performance Optimization",
 349 |         "Testing Components",
 350 |         "Deployment",
 351 |       ],
 352 |       reference: ["Component API", "Hooks Reference", "Build Configuration"],
 353 |       explanation: [
 354 |         "Component Architecture",
 355 |         "State Flow",
 356 |         "Rendering Lifecycle",
 357 |       ],
 358 |     },
 359 |     nestjs: {
 360 |       tutorials: [
 361 |         "Dependency Injection",
 362 |         "Controllers and Services",
 363 |         "Database Integration",
 364 |       ],
 365 |       howToGuides: [
 366 |         "Custom Decorators",
 367 |         "Microservices",
 368 |         "GraphQL Integration",
 369 |       ],
 370 |       reference: ["Decorator Reference", "Module System", "Configuration"],
 371 |       explanation: ["DI Architecture", "Module Design", "Enterprise Patterns"],
 372 |     },
 373 |   },
 374 | };
 375 | ```
 376 | 
 377 | ##### Python Ecosystem Support
 378 | 
 379 | ```typescript
 380 | const PYTHON_TEMPLATES = {
 381 |   gettingStarted: {
 382 |     prerequisites: ["Python 3.8+", "pip or poetry", "Virtual environment"],
 383 |     installationSteps: [
 384 |       "Create virtual environment",
 385 |       "Activate virtual environment",
 386 |       "Install dependencies from requirements.txt/pyproject.toml",
 387 |       "Set up environment variables",
 388 |       "Run development server",
 389 |     ],
 390 |     verificationSteps: [
 391 |       "Check application starts successfully",
 392 |       "Run test suite with pytest",
 393 |       "Verify API endpoints respond correctly",
 394 |     ],
 395 |   },
 396 | 
 397 |   frameworks: {
 398 |     django: {
 399 |       tutorials: [
 400 |         "Django Project Setup and Configuration",
 401 |         "Models and Database Integration",
 402 |         "Views and URL Routing",
 403 |         "Django REST Framework APIs",
 404 |         "User Authentication and Permissions",
 405 |       ],
 406 |       howToGuides: [
 407 |         "Deploy Django to Production",
 408 |         "Optimize Database Queries",
 409 |         "Implement Caching Strategies",
 410 |         "Handle File Uploads",
 411 |         "Configure CORS and Security",
 412 |       ],
 413 |       reference: [
 414 |         "Django Settings Reference",
 415 |         "Model Field Types",
 416 |         "URL Configuration Patterns",
 417 |         "Middleware Reference",
 418 |         "Management Commands",
 419 |       ],
 420 |       explanation: [
 421 |         "Django MTV Architecture",
 422 |         "ORM Design Decisions",
 423 |         "Security Model",
 424 |         "Scalability Patterns",
 425 |       ],
 426 |     },
 427 |     fastapi: {
 428 |       tutorials: [
 429 |         "FastAPI Application Structure",
 430 |         "Pydantic Models and Validation",
 431 |         "Dependency Injection System",
 432 |         "Database Integration with SQLAlchemy",
 433 |         "Authentication and Security",
 434 |       ],
 435 |       howToGuides: [
 436 |         "Optimize FastAPI Performance",
 437 |         "Implement Background Tasks",
 438 |         "Handle File Processing",
 439 |         "Set up Monitoring and Logging",
 440 |         "Deploy with Docker and Kubernetes",
 441 |       ],
 442 |       reference: [
 443 |         "FastAPI Decorators Reference",
 444 |         "Pydantic Model Configuration",
 445 |         "Dependency System Reference",
 446 |         "Security Utilities",
 447 |         "Testing Utilities",
 448 |       ],
 449 |       explanation: [
 450 |         "ASGI vs WSGI Architecture",
 451 |         "Type Hints and Validation",
 452 |         "Dependency Injection Benefits",
 453 |         "Performance Characteristics",
 454 |       ],
 455 |     },
 456 |     flask: {
 457 |       tutorials: [
 458 |         "Flask Application Factory Pattern",
 459 |         "Blueprint Organization",
 460 |         "Database Integration with SQLAlchemy",
 461 |         "User Session Management",
 462 |         "RESTful API Development",
 463 |       ],
 464 |       howToGuides: [
 465 |         "Structure Large Flask Applications",
 466 |         "Implement Rate Limiting",
 467 |         "Handle Background Jobs",
 468 |         "Configure Production Deployment",
 469 |         "Debug Flask Applications",
 470 |       ],
 471 |       reference: [
 472 |         "Flask Configuration Reference",
 473 |         "Request and Response Objects",
 474 |         "Template Engine Reference",
 475 |         "Extension Integration",
 476 |         "CLI Commands",
 477 |       ],
 478 |       explanation: [
 479 |         "Flask Philosophy and Design",
 480 |         "WSGI Application Structure",
 481 |         "Extension Ecosystem",
 482 |         "Microframework Benefits",
 483 |       ],
 484 |     },
 485 |   },
 486 | };
 487 | 
 488 | class PythonContentGenerator implements FrameworkContentGenerator {
 489 |   detectFramework(analysis: RepositoryAnalysis): Framework[] {
 490 |     const frameworks: Framework[] = [];
 491 | 
 492 |     // Django detection
 493 |     if (
 494 |       this.hasDependency(analysis, "django") ||
 495 |       this.hasFile(analysis, "manage.py") ||
 496 |       this.hasFile(analysis, "settings.py")
 497 |     ) {
 498 |       frameworks.push({
 499 |         name: "django",
 500 |         version: this.extractVersion(analysis, "django"),
 501 |         configFiles: ["settings.py", "urls.py", "wsgi.py"],
 502 |         appStructure: this.analyzeDjangoApps(analysis),
 503 |       });
 504 |     }
 505 | 
 506 |     // FastAPI detection
 507 |     if (
 508 |       this.hasDependency(analysis, "fastapi") ||
 509 |       this.hasImport(analysis, "from fastapi import")
 510 |     ) {
 511 |       frameworks.push({
 512 |         name: "fastapi",
 513 |         version: this.extractVersion(analysis, "fastapi"),
 514 |         configFiles: this.getFastAPIConfigFiles(analysis),
 515 |         routerStructure: this.analyzeFastAPIRouters(analysis),
 516 |       });
 517 |     }
 518 | 
 519 |     // Flask detection
 520 |     if (
 521 |       this.hasDependency(analysis, "flask") ||
 522 |       this.hasImport(analysis, "from flask import")
 523 |     ) {
 524 |       frameworks.push({
 525 |         name: "flask",
 526 |         version: this.extractVersion(analysis, "flask"),
 527 |         configFiles: this.getFlaskConfigFiles(analysis),
 528 |         blueprintStructure: this.analyzeFlaskBlueprints(analysis),
 529 |       });
 530 |     }
 531 | 
 532 |     return frameworks;
 533 |   }
 534 | 
 535 |   generateFrameworkContent(
 536 |     framework: Framework,
 537 |     context: ProjectContext,
 538 |   ): FrameworkContent {
 539 |     const templates = PYTHON_TEMPLATES.frameworks[framework.name];
 540 | 
 541 |     return {
 542 |       tutorials: templates.tutorials.map((title) => ({
 543 |         title: `${title} for ${context.projectName}`,
 544 |         content: this.generatePythonTutorialContent(framework, title, context),
 545 |         codeExamples: this.generatePythonCodeExamples(
 546 |           framework,
 547 |           title,
 548 |           context,
 549 |         ),
 550 |       })),
 551 |       howToGuides: templates.howToGuides.map((title) => ({
 552 |         title,
 553 |         content: this.generatePythonHowToContent(framework, title, context),
 554 |         tasks: this.generatePythonTasks(framework, title, context),
 555 |       })),
 556 |       reference: templates.reference.map((title) => ({
 557 |         title,
 558 |         content: this.generatePythonReferenceContent(framework, title, context),
 559 |       })),
 560 |       explanation: templates.explanation.map((title) => ({
 561 |         title,
 562 |         content: this.generatePythonExplanationContent(
 563 |           framework,
 564 |           title,
 565 |           context,
 566 |         ),
 567 |       })),
 568 |     };
 569 |   }
 570 | }
 571 | ```
 572 | 
 573 | #### Framework-Specific Content Generation
 574 | 
 575 | ```typescript
 576 | interface FrameworkContentGenerator {
 577 |   detectFramework(dependencies: string[]): Framework | null;
 578 |   generateFrameworkContent(
 579 |     framework: Framework,
 580 |     context: ProjectContext,
 581 |   ): FrameworkContent;
 582 | }
 583 | 
 584 | const FRAMEWORK_GENERATORS: Record<string, FrameworkContentGenerator> = {
 585 |   // JavaScript/TypeScript frameworks
 586 |   express: new ExpressContentGenerator(),
 587 |   react: new ReactContentGenerator(),
 588 |   vue: new VueContentGenerator(),
 589 |   angular: new AngularContentGenerator(),
 590 |   nestjs: new NestJSContentGenerator(),
 591 |   fastify: new FastifyContentGenerator(),
 592 | 
 593 |   // Python frameworks
 594 |   django: new DjangoContentGenerator(),
 595 |   fastapi: new FastAPIContentGenerator(),
 596 |   flask: new FlaskContentGenerator(),
 597 |   pyramid: new PyramidContentGenerator(),
 598 | 
 599 |   // Future language support
 600 |   "spring-boot": new SpringBootContentGenerator(), // Java
 601 |   gin: new GinContentGenerator(), // Go
 602 |   "actix-web": new ActixContentGenerator(), // Rust
 603 | };
 604 | ```
 605 | 
 606 | ## Alternatives Considered
 607 | 
 608 | ### Manual Content Creation Only
 609 | 
 610 | - **Pros**: Simple implementation, full user control, no AI dependency
 611 | - **Cons**: Massive user effort, inconsistent quality, underutilizes analysis capabilities
 612 | - **Decision**: Rejected - provides minimal value over generic templates
 613 | 
 614 | ### AI-Generated Content via External APIs
 615 | 
 616 | - **Pros**: Advanced content generation, natural language processing
 617 | - **Cons**: External dependencies, costs, inconsistent quality, latency issues
 618 | - **Decision**: Rejected for initial version - adds complexity without guaranteed quality
 619 | 
 620 | ### Community-Contributed Content Templates
 621 | 
 622 | - **Pros**: Diverse perspectives, battle-tested content, community engagement
 623 | - **Cons**: Quality control challenges, maintenance overhead, incomplete coverage
 624 | - **Decision**: Considered for future enhancement - focus on algorithmic generation first
 625 | 
 626 | ### Generic Template Expansion
 627 | 
 628 | - **Pros**: Easier implementation, consistent structure
 629 | - **Cons**: Still requires significant manual work, doesn't leverage analysis intelligence
 630 | - **Decision**: Rejected - doesn't address core value proposition gap
 631 | 
 632 | ## Consequences
 633 | 
 634 | ### Positive
 635 | 
 636 | - **Dramatic User Value Increase**: 60-80% content pre-population vs. empty templates
 637 | - **Competitive Differentiation**: Only documentation tool with intelligent content generation
 638 | - **Analysis ROI**: Comprehensive repository analysis finally delivers proportional value
 639 | - **Framework Completion**: Fulfills ADR-004 vision for content planning intelligence
 640 | - **User Experience**: Transform from "structure generator" to "documentation assistant"
 641 | 
 642 | ### Negative
 643 | 
 644 | - **Implementation Complexity**: Significant engineering effort for content generation algorithms
 645 | - **Content Quality Risk**: Generated content may require refinement for accuracy
 646 | - **Technology Coverage**: Initial version limited to well-known frameworks and patterns
 647 | - **Maintenance Overhead**: Content templates require updates as technologies evolve
 648 | 
 649 | ### Risks and Mitigations
 650 | 
 651 | - **Quality Control**: Implement content validation and user review workflows
 652 | - **Technology Coverage**: Start with most common frameworks, expand based on usage
 653 | - **Algorithm Accuracy**: Validate generated content against project reality
 654 | - **User Expectations**: Clear communication about generated vs. curated content
 655 | 
 656 | ## Implementation Details
 657 | 
 658 | ### MCP Tool Interface
 659 | 
 660 | ```typescript
 661 | // New tool: populate_diataxis_content
 662 | interface PopulateDiataxisContentTool {
 663 |   name: "populate_diataxis_content";
 664 |   description: "Intelligently populate Diataxis documentation with project-specific content";
 665 |   inputSchema: {
 666 |     type: "object";
 667 |     properties: {
 668 |       analysisId: {
 669 |         type: "string";
 670 |         description: "Repository analysis ID from analyze_repository tool";
 671 |       };
 672 |       docsPath: {
 673 |         type: "string";
 674 |         description: "Path to documentation directory";
 675 |       };
 676 |       populationLevel: {
 677 |         type: "string";
 678 |         enum: ["basic", "comprehensive", "intelligent"];
 679 |         default: "comprehensive";
 680 |         description: "Level of content generation detail";
 681 |       };
 682 |       includeProjectSpecific: {
 683 |         type: "boolean";
 684 |         default: true;
 685 |         description: "Generate project-specific examples and code";
 686 |       };
 687 |       preserveExisting: {
 688 |         type: "boolean";
 689 |         default: true;
 690 |         description: "Preserve any existing content";
 691 |       };
 692 |       technologyFocus: {
 693 |         type: "array";
 694 |         items: { type: "string" };
 695 |         description: "Specific technologies to emphasize in content";
 696 |       };
 697 |     };
 698 |     required: ["analysisId", "docsPath"];
 699 |   };
 700 | }
 701 | ```
 702 | 
 703 | ### Content Generation Pipeline
 704 | 
 705 | ```typescript
 706 | class ContentPopulationEngine {
 707 |   async populateContent(args: PopulationArgs): Promise<PopulationResult> {
 708 |     try {
 709 |       // 1. Retrieve and validate repository analysis
 710 |       const analysis = await this.getRepositoryAnalysis(args.analysisId);
 711 |       this.validateAnalysis(analysis);
 712 | 
 713 |       // 2. Generate content plan based on project characteristics
 714 |       const contentPlan = await this.generateContentPlan(
 715 |         analysis,
 716 |         args.populationLevel,
 717 |       );
 718 | 
 719 |       // 3. Generate content for each Diataxis category
 720 |       const [tutorials, howTos, reference, explanation] = await Promise.all([
 721 |         this.generateTutorialContent(contentPlan.tutorials, analysis),
 722 |         this.generateHowToContent(contentPlan.howToGuides, analysis),
 723 |         this.generateReferenceContent(contentPlan.reference, analysis),
 724 |         this.generateExplanationContent(contentPlan.explanation, analysis),
 725 |       ]);
 726 | 
 727 |       // 4. Write content to documentation structure
 728 |       const filesCreated = await this.writeContentToStructure(
 729 |         args.docsPath,
 730 |         { tutorials, howTos, reference, explanation },
 731 |         args.preserveExisting,
 732 |       );
 733 | 
 734 |       // 5. Generate cross-references and navigation updates
 735 |       await this.updateNavigationAndCrossReferences(args.docsPath, contentPlan);
 736 | 
 737 |       return {
 738 |         success: true,
 739 |         filesCreated,
 740 |         contentPlan,
 741 |         populationMetrics: this.calculatePopulationMetrics(filesCreated),
 742 |         nextSteps: this.generateNextSteps(analysis, contentPlan),
 743 |       };
 744 |     } catch (error) {
 745 |       console.error("Content population failed:", error);
 746 |       return {
 747 |         success: false,
 748 |         error: {
 749 |           code: "CONTENT_POPULATION_FAILED",
 750 |           message: `Failed to populate content: ${
 751 |             error instanceof Error ? error.message : "Unknown error"
 752 |           }`,
 753 |           resolution:
 754 |             "Check repository analysis and documentation path accessibility",
 755 |         },
 756 |         filesCreated: [],
 757 |         populationMetrics: { totalFiles: 0, totalWords: 0, totalSections: 0 },
 758 |       };
 759 |     }
 760 |   }
 761 | }
 762 | ```
 763 | 
 764 | ### Technology Detection and Content Mapping
 765 | 
 766 | ```typescript
 767 | interface TechnologyMapper {
 768 |   detectTechnologies(analysis: RepositoryAnalysis): TechnologyProfile;
 769 |   mapToContentTemplates(technologies: TechnologyProfile): ContentTemplateSet;
 770 |   generateTechnologySpecificExamples(
 771 |     technology: Technology,
 772 |     context: ProjectContext,
 773 |   ): CodeExample[];
 774 | }
 775 | 
 776 | class JavaScriptTechnologyMapper implements TechnologyMapper {
 777 |   detectTechnologies(analysis: RepositoryAnalysis): TechnologyProfile {
 778 |     const profile: TechnologyProfile = {
 779 |       runtime: this.detectRuntime(analysis), // Node.js, Deno, Bun
 780 |       framework: this.detectFramework(analysis), // Express, Fastify, Koa
 781 |       frontend: this.detectFrontend(analysis), // React, Vue, Angular
 782 |       database: this.detectDatabase(analysis), // PostgreSQL, MongoDB, Redis
 783 |       testing: this.detectTesting(analysis), // Jest, Mocha, Playwright
 784 |       deployment: this.detectDeployment(analysis), // Docker, Kubernetes, Vercel
 785 |       devops: this.detectDevOpsTools(analysis), // Ansible, Tekton, OpenShift, Podman
 786 |     };
 787 | 
 788 |     return profile;
 789 |   }
 790 | 
 791 |   mapToContentTemplates(technologies: TechnologyProfile): ContentTemplateSet {
 792 |     return {
 793 |       tutorials: this.generateTutorialTemplates(technologies),
 794 |       howToGuides: this.generateHowToTemplates(technologies),
 795 |       reference: this.generateReferenceTemplates(technologies),
 796 |       explanation: this.generateExplanationTemplates(technologies),
 797 |     };
 798 |   }
 799 | }
 800 | ```
 801 | 
 802 | ### DevOps and Infrastructure Tooling Support
 803 | 
 804 | #### DevOps Tool Detection and Content Generation
 805 | 
 806 | ```typescript
 807 | interface DevOpsToolMapper {
 808 |   detectDevOpsTools(analysis: RepositoryAnalysis): DevOpsToolProfile;
 809 |   generateDevOpsContent(
 810 |     tools: DevOpsToolProfile,
 811 |     context: ProjectContext,
 812 |   ): DevOpsContent;
 813 |   createInfrastructureDocumentation(
 814 |     infrastructure: InfrastructureProfile,
 815 |     deploymentPattern: DeploymentPattern,
 816 |   ): InfrastructureDocumentation;
 817 | }
 818 | 
 819 | interface DevOpsToolProfile {
 820 |   containerization: ContainerTechnology[]; // Docker, Podman, Buildah
 821 |   orchestration: OrchestrationTechnology[]; // Kubernetes, OpenShift, Nomad
 822 |   cicd: CICDTechnology[]; // Tekton, GitHub Actions, Jenkins, GitLab CI
 823 |   configuration: ConfigManagementTechnology[]; // Ansible, Terraform, Helm
 824 |   monitoring: MonitoringTechnology[]; // Prometheus, Grafana, Jaeger
 825 |   security: SecurityTechnology[]; // Falco, OPA, Vault
 826 | }
 827 | 
 828 | class DevOpsContentGenerator implements DevOpsToolMapper {
 829 |   detectDevOpsTools(analysis: RepositoryAnalysis): DevOpsToolProfile {
 830 |     return {
 831 |       containerization: this.detectContainerization(analysis),
 832 |       orchestration: this.detectOrchestration(analysis),
 833 |       cicd: this.detectCICD(analysis),
 834 |       configuration: this.detectConfigManagement(analysis),
 835 |       monitoring: this.detectMonitoring(analysis),
 836 |       security: this.detectSecurity(analysis),
 837 |     };
 838 |   }
 839 | 
 840 |   private detectContainerization(
 841 |     analysis: RepositoryAnalysis,
 842 |   ): ContainerTechnology[] {
 843 |     const detected: ContainerTechnology[] = [];
 844 | 
 845 |     // Docker detection
 846 |     if (
 847 |       this.hasFile(analysis, "Dockerfile") ||
 848 |       this.hasFile(analysis, "docker-compose.yml") ||
 849 |       this.hasFile(analysis, "docker-compose.yaml")
 850 |     ) {
 851 |       detected.push({
 852 |         name: "docker",
 853 |         version: this.extractDockerVersion(analysis),
 854 |         configFiles: this.getDockerFiles(analysis),
 855 |         usage: this.analyzeDockerUsage(analysis),
 856 |       });
 857 |     }
 858 | 
 859 |     // Podman detection
 860 |     if (
 861 |       this.hasFile(analysis, "Containerfile") ||
 862 |       this.hasReference(analysis, "podman") ||
 863 |       this.hasFile(analysis, "podman-compose.yml")
 864 |     ) {
 865 |       detected.push({
 866 |         name: "podman",
 867 |         version: this.extractPodmanVersion(analysis),
 868 |         configFiles: this.getPodmanFiles(analysis),
 869 |         usage: this.analyzePodmanUsage(analysis),
 870 |       });
 871 |     }
 872 | 
 873 |     return detected;
 874 |   }
 875 | 
 876 |   private detectOrchestration(
 877 |     analysis: RepositoryAnalysis,
 878 |   ): OrchestrationTechnology[] {
 879 |     const detected: OrchestrationTechnology[] = [];
 880 | 
 881 |     // Kubernetes detection
 882 |     if (
 883 |       this.hasDirectory(analysis, "k8s/") ||
 884 |       this.hasDirectory(analysis, "kubernetes/") ||
 885 |       this.hasFilePattern(analysis, "*.yaml", "apiVersion: apps/v1") ||
 886 |       this.hasFilePattern(analysis, "*.yml", "kind: Deployment")
 887 |     ) {
 888 |       detected.push({
 889 |         name: "kubernetes",
 890 |         manifests: this.getKubernetesManifests(analysis),
 891 |         resources: this.analyzeKubernetesResources(analysis),
 892 |         namespaces: this.extractNamespaces(analysis),
 893 |       });
 894 |     }
 895 | 
 896 |     // OpenShift detection
 897 |     if (
 898 |       this.hasDirectory(analysis, ".s2i/") ||
 899 |       this.hasReference(analysis, "openshift") ||
 900 |       this.hasFileContent(analysis, "kind: DeploymentConfig") ||
 901 |       this.hasFileContent(analysis, "kind: Route")
 902 |     ) {
 903 |       detected.push({
 904 |         name: "openshift",
 905 |         templates: this.getOpenShiftTemplates(analysis),
 906 |         buildConfigs: this.getBuildConfigs(analysis),
 907 |         routes: this.getRoutes(analysis),
 908 |       });
 909 |     }
 910 | 
 911 |     return detected;
 912 |   }
 913 | 
 914 |   private detectCICD(analysis: RepositoryAnalysis): CICDTechnology[] {
 915 |     const detected: CICDTechnology[] = [];
 916 | 
 917 |     // Tekton detection
 918 |     if (
 919 |       this.hasDirectory(analysis, ".tekton/") ||
 920 |       this.hasFileContent(analysis, "apiVersion: tekton.dev") ||
 921 |       this.hasFilePattern(analysis, "*.yaml", "kind: Pipeline")
 922 |     ) {
 923 |       detected.push({
 924 |         name: "tekton",
 925 |         pipelines: this.getTektonPipelines(analysis),
 926 |         tasks: this.getTektonTasks(analysis),
 927 |         triggers: this.getTektonTriggers(analysis),
 928 |       });
 929 |     }
 930 | 
 931 |     return detected;
 932 |   }
 933 | 
 934 |   private detectConfigManagement(
 935 |     analysis: RepositoryAnalysis,
 936 |   ): ConfigManagementTechnology[] {
 937 |     const detected: ConfigManagementTechnology[] = [];
 938 | 
 939 |     // Ansible detection
 940 |     if (
 941 |       this.hasFile(analysis, "ansible.cfg") ||
 942 |       this.hasDirectory(analysis, "playbooks/") ||
 943 |       this.hasDirectory(analysis, "roles/") ||
 944 |       this.hasFile(analysis, "inventory") ||
 945 |       this.hasFilePattern(analysis, "*.yml", "hosts:") ||
 946 |       this.hasFilePattern(analysis, "*.yaml", "tasks:")
 947 |     ) {
 948 |       detected.push({
 949 |         name: "ansible",
 950 |         playbooks: this.getAnsiblePlaybooks(analysis),
 951 |         roles: this.getAnsibleRoles(analysis),
 952 |         inventory: this.getAnsibleInventory(analysis),
 953 |         vaultFiles: this.getAnsibleVault(analysis),
 954 |       });
 955 |     }
 956 | 
 957 |     return detected;
 958 |   }
 959 | }
 960 | ```
 961 | 
 962 | #### DevOps-Specific Content Templates and Generation
 963 | 
 964 | **Key DevOps Documentation Patterns**:
 965 | 
 966 | - **Container Tutorials**: Project-specific Dockerfile optimization, multi-stage builds
 967 | - **Orchestration Guides**: Kubernetes/OpenShift deployment strategies
 968 | - **Infrastructure as Code**: Ansible playbooks for application deployment
 969 | - **CI/CD Pipelines**: Tekton pipeline configuration and best practices
 970 | 
 971 | ```typescript
 972 | const DEVOPS_CONTENT_TEMPLATES = {
 973 |   docker: {
 974 |     tutorial: "Containerizing {projectName} with Docker",
 975 |     howto: ["Optimize Docker Images", "Debug Container Issues"],
 976 |     reference: "Dockerfile Configuration Reference",
 977 |     explanation: "Container Architecture Decisions",
 978 |   },
 979 |   kubernetes: {
 980 |     tutorial: "Deploying {projectName} to Kubernetes",
 981 |     howto: ["Scale Applications", "Troubleshoot Deployments"],
 982 |     reference: "Kubernetes Manifest Specifications",
 983 |     explanation: "Orchestration Strategy",
 984 |   },
 985 |   ansible: {
 986 |     tutorial: "Infrastructure as Code with Ansible",
 987 |     howto: ["Automate Deployment", "Manage Multi-Environment"],
 988 |     reference: "Playbook and Role Reference",
 989 |     explanation: "Configuration Management Strategy",
 990 |   },
 991 |   tekton: {
 992 |     tutorial: "CI/CD Pipeline with Tekton",
 993 |     howto: ["Build and Deploy", "Manage Secrets"],
 994 |     reference: "Pipeline Specifications",
 995 |     explanation: "Cloud Native CI/CD Architecture",
 996 |   },
 997 | };
 998 | 
 999 | function generateDevOpsContent(
1000 |   devopsProfile: DevOpsToolProfile,
1001 |   projectContext: ProjectContext,
1002 | ): DevOpsContentPlan {
1003 |   // Generate project-specific DevOps documentation
1004 |   // based on detected tools and project characteristics
1005 | }
1006 | ```
1007 | 
1008 | ### Community Contribution Framework for Language and Tool Support
1009 | 
1010 | #### Language Extension Architecture
1011 | 
1012 | ```typescript
1013 | interface LanguageExtension {
1014 |   name: string;
1015 |   ecosystem: string;
1016 |   packageManagers: string[];
1017 |   detectionPatterns: DetectionPattern[];
1018 |   frameworks: FrameworkDefinition[];
1019 |   contentTemplates: LanguageContentTemplates;
1020 |   validationRules: ValidationRule[];
1021 | }
1022 | 
1023 | interface DetectionPattern {
1024 |   type: "file" | "dependency" | "import" | "content";
1025 |   pattern: string | RegExp;
1026 |   weight: number; // 1-10, higher = more confident
1027 |   description: string;
1028 | }
1029 | 
1030 | interface FrameworkDefinition {
1031 |   name: string;
1032 |   detectionPatterns: DetectionPattern[];
1033 |   contentTemplates: FrameworkContentTemplates;
1034 |   codeExamples: CodeExampleGenerator;
1035 |   bestPractices: BestPractice[];
1036 | }
1037 | ```
1038 | 
1039 | #### Contribution Guidelines for New Language Support
1040 | 
1041 | ##### Step 1: Language Detection Implementation
1042 | 
1043 | ```typescript
1044 | // Example: Adding Go language support
1045 | const GO_LANGUAGE_EXTENSION: LanguageExtension = {
1046 |   name: "go",
1047 |   ecosystem: "go",
1048 |   packageManagers: ["go mod", "dep"],
1049 |   detectionPatterns: [
1050 |     {
1051 |       type: "file",
1052 |       pattern: "go.mod",
1053 |       weight: 10,
1054 |       description: "Go module definition file",
1055 |     },
1056 |     {
1057 |       type: "file",
1058 |       pattern: "go.sum",
1059 |       weight: 8,
1060 |       description: "Go module checksums",
1061 |     },
1062 |     {
1063 |       type: "file",
1064 |       pattern: /.*\.go$/,
1065 |       weight: 6,
1066 |       description: "Go source files",
1067 |     },
1068 |     {
1069 |       type: "content",
1070 |       pattern: /^package main$/m,
1071 |       weight: 7,
1072 |       description: "Go main package declaration",
1073 |     },
1074 |   ],
1075 |   frameworks: [
1076 |     // Framework definitions...
1077 |   ],
1078 |   contentTemplates: {
1079 |     // Content templates...
1080 |   },
1081 | };
1082 | ```
1083 | 
1084 | ##### Step 2: Framework-Specific Content Templates
1085 | 
1086 | ```typescript
1087 | // Example: Adding Gin framework support for Go
1088 | const GIN_FRAMEWORK: FrameworkDefinition = {
1089 |   name: "gin",
1090 |   detectionPatterns: [
1091 |     {
1092 |       type: "dependency",
1093 |       pattern: "github.com/gin-gonic/gin",
1094 |       weight: 10,
1095 |       description: "Gin framework dependency",
1096 |     },
1097 |     {
1098 |       type: "import",
1099 |       pattern: 'gin "github.com/gin-gonic/gin"',
1100 |       weight: 9,
1101 |       description: "Gin framework import",
1102 |     },
1103 |   ],
1104 |   contentTemplates: {
1105 |     tutorials: [
1106 |       {
1107 |         title: "Building REST APIs with Gin",
1108 |         diataxisType: "tutorial",
1109 |         sections: [
1110 |           "Setting up Gin Application",
1111 |           "Defining Routes and Handlers",
1112 |           "Middleware Configuration",
1113 |           "Database Integration",
1114 |           "Testing Gin Applications",
1115 |         ],
1116 |         prerequisites: [
1117 |           "Go installed (1.19+)",
1118 |           "Basic Go language knowledge",
1119 |           "Understanding of HTTP concepts",
1120 |         ],
1121 |         estimatedTime: "60 minutes",
1122 |         difficulty: "beginner",
1123 |       },
1124 |     ],
1125 |     howToGuides: [
1126 |       {
1127 |         title: "Optimize Gin Performance",
1128 |         diataxisType: "how-to",
1129 |         tasks: [
1130 |           "Configure connection pooling",
1131 |           "Implement caching strategies",
1132 |           "Set up rate limiting",
1133 |           "Profile and benchmark endpoints",
1134 |         ],
1135 |       },
1136 |     ],
1137 |     reference: [
1138 |       {
1139 |         title: "Gin Router Configuration",
1140 |         diataxisType: "reference",
1141 |         sections: [
1142 |           "Route definition patterns",
1143 |           "Middleware registration",
1144 |           "Context object methods",
1145 |           "Error handling patterns",
1146 |         ],
1147 |       },
1148 |     ],
1149 |     explanation: [
1150 |       {
1151 |         title: "Gin Architecture and Design Decisions",
1152 |         diataxisType: "explanation",
1153 |         topics: [
1154 |           "HTTP router performance characteristics",
1155 |           "Middleware pipeline design",
1156 |           "Context lifecycle management",
1157 |           "Comparison with other Go frameworks",
1158 |         ],
1159 |       },
1160 |     ],
1161 |   },
1162 |   codeExamples: {
1163 |     basicServer: `package main
1164 | 
1165 | import (
1166 |     "net/http"
1167 |     "github.com/gin-gonic/gin"
1168 | )
1169 | 
1170 | func main() {
1171 |     r := gin.Default()
1172 |     
1173 |     r.GET("/health", func(c *gin.Context) {
1174 |         c.JSON(http.StatusOK, gin.H{
1175 |             "status": "healthy",
1176 |         })
1177 |     })
1178 |     
1179 |     r.Run(":8080")
1180 | }`,
1181 |     middleware: `func LoggerMiddleware() gin.HandlerFunc {
1182 |     return func(c *gin.Context) {
1183 |         start := time.Now()
1184 |         c.Next()
1185 |         duration := time.Since(start)
1186 |         log.Printf("%s %s %v", c.Request.Method, c.Request.URL.Path, duration)
1187 |     }
1188 | }`,
1189 |   },
1190 | };
1191 | ```
1192 | 
1193 | ##### Step 3: Content Generation Logic
1194 | 
1195 | ```typescript
1196 | class GoContentGenerator implements FrameworkContentGenerator {
1197 |   detectFramework(analysis: RepositoryAnalysis): Framework[] {
1198 |     const frameworks: Framework[] = [];
1199 | 
1200 |     // Check for Gin framework
1201 |     if (this.hasGoModule(analysis, "github.com/gin-gonic/gin")) {
1202 |       frameworks.push({
1203 |         name: "gin",
1204 |         version: this.extractGoModuleVersion(
1205 |           analysis,
1206 |           "github.com/gin-gonic/gin",
1207 |         ),
1208 |         configFiles: this.getGinConfigFiles(analysis),
1209 |         routeStructure: this.analyzeGinRoutes(analysis),
1210 |       });
1211 |     }
1212 | 
1213 |     // Check for Echo framework
1214 |     if (this.hasGoModule(analysis, "github.com/labstack/echo")) {
1215 |       frameworks.push({
1216 |         name: "echo",
1217 |         version: this.extractGoModuleVersion(
1218 |           analysis,
1219 |           "github.com/labstack/echo",
1220 |         ),
1221 |         configFiles: this.getEchoConfigFiles(analysis),
1222 |         routeStructure: this.analyzeEchoRoutes(analysis),
1223 |       });
1224 |     }
1225 | 
1226 |     return frameworks;
1227 |   }
1228 | 
1229 |   generateFrameworkContent(
1230 |     framework: Framework,
1231 |     context: ProjectContext,
1232 |   ): FrameworkContent {
1233 |     const templates = GO_LANGUAGE_EXTENSION.frameworks.find(
1234 |       (f) => f.name === framework.name,
1235 |     )?.contentTemplates;
1236 | 
1237 |     if (!templates) return this.generateGenericGoContent(framework, context);
1238 | 
1239 |     return this.populateTemplatesWithProjectContext(
1240 |       templates,
1241 |       framework,
1242 |       context,
1243 |     );
1244 |   }
1245 | 
1246 |   private generateProjectSpecificGoDockerfile(context: ProjectContext): string {
1247 |     return `# Multi-stage build for ${context.projectName}
1248 | FROM golang:1.21-alpine AS builder
1249 | 
1250 | WORKDIR /app
1251 | COPY go.mod go.sum ./
1252 | RUN go mod download
1253 | 
1254 | COPY . .
1255 | RUN CGO_ENABLED=0 GOOS=linux go build -o main .
1256 | 
1257 | # Final stage
1258 | FROM alpine:latest
1259 | RUN apk --no-cache add ca-certificates
1260 | WORKDIR /root/
1261 | COPY --from=builder /app/main .
1262 | EXPOSE 8080
1263 | CMD ["./main"]`;
1264 |   }
1265 | }
1266 | ```
1267 | 
1268 | #### Contribution Process and Standards
1269 | 
1270 | ##### Community Contribution Workflow
1271 | 
1272 | 1. **Language Proposal**: Submit GitHub issue with language/framework proposal
1273 | 2. **Detection Patterns**: Define comprehensive detection patterns
1274 | 3. **Content Templates**: Create Diataxis-compliant content templates
1275 | 4. **Code Examples**: Provide working, project-specific code examples
1276 | 5. **Testing**: Include validation tests for detection and generation
1277 | 6. **Documentation**: Document contribution for future maintainers
1278 | 7. **Review Process**: Community and maintainer review
1279 | 8. **Integration**: Merge into main extension registry
1280 | 
1281 | ##### Quality Standards for Contributions
1282 | 
1283 | ```typescript
1284 | interface ContributionStandards {
1285 |   detection: {
1286 |     minimumPatterns: 3;
1287 |     requiredTypes: ["file", "dependency"];
1288 |     weightDistribution: "balanced"; // No single pattern > 70% weight
1289 |     falsePositiveRate: "&lt;5%";
1290 |   };
1291 | 
1292 |   content: {
1293 |     diataxisCompliance: "strict";
1294 |     tutorialCount: "minimum 2";
1295 |     howToGuideCount: "minimum 3";
1296 |     referenceCompleteness: "80%";
1297 |     explanationDepth: "architectural decisions covered";
1298 |   };
1299 | 
1300 |   codeExamples: {
1301 |     compilationSuccess: "100%";
1302 |     projectSpecific: "true";
1303 |     bestPractices: "current industry standards";
1304 |     securityConsiderations: "included";
1305 |   };
1306 | 
1307 |   testing: {
1308 |     detectionAccuracy: "&gt;90%";
1309 |     contentGeneration: "functional tests";
1310 |     integrationTests: "with existing systems";
1311 |     performanceImpact: "&lt;10% generation time increase";
1312 |   };
1313 | }
1314 | ```
1315 | 
1316 | ##### Template Contribution Format
1317 | 
1318 | ```typescript
1319 | // Required structure for new language contributions
1320 | interface LanguageContributionTemplate {
1321 |   metadata: {
1322 |     contributorName: string;
1323 |     contributorEmail: string;
1324 |     languageName: string;
1325 |     version: string;
1326 |     lastUpdated: string;
1327 |     maintenanceCommitment: "ongoing" | "initial-only";
1328 |   };
1329 | 
1330 |   detection: DetectionPatternSet;
1331 |   frameworks: FrameworkDefinition[];
1332 |   contentTemplates: ContentTemplateSet;
1333 |   validation: ValidationTestSuite;
1334 |   documentation: ContributionDocumentation;
1335 | }
1336 | 
1337 | // Example contribution file structure:
1338 | // src/languages/
1339 | //   ├── go/
1340 | //   │   ├── detection.ts
1341 | //   │   ├── frameworks/
1342 | //   │   │   ├── gin.ts
1343 | //   │   │   ├── echo.ts
1344 | //   │   │   └── fiber.ts
1345 | //   │   ├── templates/
1346 | //   │   │   ├── tutorials.ts
1347 | //   │   │   ├── howto.ts
1348 | //   │   │   ├── reference.ts
1349 | //   │   │   └── explanation.ts
1350 | //   │   ├── tests/
1351 | //   │   │   ├── detection.test.ts
1352 | //   │   │   └── generation.test.ts
1353 | //   │   └── README.md
1354 | ```
1355 | 
1356 | #### Community Validation and Review Process
1357 | 
1358 | ##### Automated Validation Pipeline
1359 | 
1360 | ```typescript
1361 | interface ContributionValidation {
1362 |   // Automated checks
1363 |   syntaxValidation: "TypeScript compilation success";
1364 |   patternTesting: "Detection accuracy against test repositories";
1365 |   contentValidation: "Diataxis compliance checking";
1366 |   performanceImpact: "Generation time benchmarking";
1367 | 
1368 |   // Community review
1369 |   peerReview: "Two community developer approvals";
1370 |   maintainerReview: "Core team architectural review";
1371 |   expertValidation: "Language expert accuracy verification";
1372 | 
1373 |   // Integration testing
1374 |   endToEndTesting: "Full workflow validation";
1375 |   regressionTesting: "No impact on existing languages";
1376 |   documentationReview: "Contribution documentation completeness";
1377 | }
1378 | ```
1379 | 
1380 | ##### Long-term Maintenance Framework
1381 | 
1382 | ```typescript
1383 | interface MaintenanceFramework {
1384 |   languageUpdates: {
1385 |     frameworkVersions: "automated dependency tracking";
1386 |     newFrameworks: "community contribution process";
1387 |     deprecatedPatterns: "automated detection and flagging";
1388 |   };
1389 | 
1390 |   communityGovernance: {
1391 |     languageMaintainers: "designated community experts";
1392 |     updateProcess: "structured enhancement proposals";
1393 |     qualityAssurance: "continuous validation and testing";
1394 |   };
1395 | 
1396 |   toolingSupport: {
1397 |     contributionCLI: "automated scaffolding for new languages";
1398 |     validationTools: "automated testing and verification";
1399 |     documentationGeneration: "automated API documentation";
1400 |   };
1401 | }
1402 | ```
1403 | 
1404 | ## Quality Assurance
1405 | 
1406 | ### Content Validation Framework
1407 | 
1408 | ```typescript
1409 | interface ContentValidator {
1410 |   validateAccuracy(
1411 |     content: GeneratedContent,
1412 |     analysis: RepositoryAnalysis,
1413 |   ): ValidationResult;
1414 |   checkDiataxisCompliance(content: GeneratedContent): ComplianceResult;
1415 |   verifyCodeExamples(
1416 |     examples: CodeExample[],
1417 |     projectContext: ProjectContext,
1418 |   ): ValidationResult;
1419 |   assessContentCompleteness(
1420 |     content: GeneratedContent,
1421 |     plan: ContentPlan,
1422 |   ): CompletenessResult;
1423 | }
1424 | 
1425 | interface ValidationResult {
1426 |   isValid: boolean;
1427 |   issues: ValidationIssue[];
1428 |   suggestions: ImprovementSuggestion[];
1429 |   confidence: number;
1430 | }
1431 | ```
1432 | 
1433 | ### Testing Strategy
1434 | 
1435 | ```typescript
1436 | describe("ContentPopulationEngine", () => {
1437 |   describe("Tutorial Generation", () => {
1438 |     it(
1439 |       "should generate appropriate getting started tutorial for Express.js project",
1440 |     );
1441 |     it("should include technology-specific setup steps");
1442 |     it("should provide working code examples");
1443 |     it("should maintain Diataxis tutorial principles");
1444 |   });
1445 | 
1446 |   describe("Technology Detection", () => {
1447 |     it("should correctly identify primary framework from package.json");
1448 |     it("should detect database dependencies and generate appropriate content");
1449 |     it("should handle multi-framework projects appropriately");
1450 |   });
1451 | 
1452 |   describe("Content Quality", () => {
1453 |     it("should generate accurate code examples that match project structure");
1454 |     it("should maintain consistent tone and style across content types");
1455 |     it("should create appropriate cross-references between content sections");
1456 |   });
1457 | });
1458 | ```
1459 | 
1460 | ### Performance Requirements
1461 | 
1462 | - **Content Generation Time**: < 30 seconds for comprehensive population
1463 | - **Memory Usage**: < 500MB for large repository analysis and content generation
1464 | - **Content Quality**: 80%+ accuracy for generated technical content
1465 | - **Coverage**: Support for 15+ major JavaScript/TypeScript frameworks initially
1466 | 
1467 | ## Integration Points
1468 | 
1469 | ### Repository Analysis Integration (ADR-002)
1470 | 
1471 | - Leverage multi-layered analysis results for informed content generation
1472 | - Use complexity assessment to determine content depth and sophistication
1473 | - Integrate dependency analysis for framework-specific content selection
1474 | 
1475 | ### Diataxis Framework Integration (ADR-004)
1476 | 
1477 | - Implement content planning intelligence outlined in ADR-004 lines 153-192
1478 | - Generate content that strictly adheres to Diataxis category principles
1479 | - Create appropriate cross-references and user journey flows
1480 | 
1481 | ### MCP Tools API Integration (ADR-006)
1482 | 
1483 | - Add populate_diataxis_content as seventh core MCP tool
1484 | - Maintain consistent error handling and response format patterns
1485 | - Integrate with existing setup_structure tool for seamless workflow
1486 | 
1487 | ### SSG Configuration Integration (ADR-006)
1488 | 
1489 | - Generate content with appropriate frontmatter for target SSG
1490 | - Adapt content format and structure to SSG capabilities
1491 | - Ensure generated content renders correctly across all supported SSGs
1492 | 
1493 | ## Future Enhancements
1494 | 
1495 | ### Advanced AI Integration
1496 | 
1497 | - **Large Language Model Integration**: Use specialized models for content refinement
1498 | - **Code Analysis AI**: Advanced analysis of project patterns for more accurate content
1499 | - **Natural Language Generation**: Improve content quality and readability
1500 | 
1501 | ### Extended Technology Support
1502 | 
1503 | #### Python Ecosystem (Priority Implementation)
1504 | 
1505 | - **Web Frameworks**: Django, Flask, FastAPI, Pyramid, Bottle
1506 | - **Data Science**: Jupyter, Pandas, NumPy, SciPy documentation patterns
1507 | - **ML/AI**: TensorFlow, PyTorch, Scikit-learn integration guides
1508 | - **API Development**: Django REST Framework, FastAPI advanced patterns
1509 | - **Testing**: pytest, unittest, behave testing documentation
1510 | - **Deployment**: Gunicorn, uWSGI, Celery configuration guides
1511 | 
1512 | #### Additional Language Ecosystems
1513 | 
1514 | - **Go Ecosystem**: Gin, Echo, Fiber, Buffalo framework support
1515 | - **Rust Ecosystem**: Actix-web, Warp, Rocket, Axum content generation
1516 | - **Java Ecosystem**: Spring Boot, Quarkus, Micronaut, Play Framework
1517 | - **C# Ecosystem**: ASP.NET Core, Entity Framework, Blazor
1518 | - **Ruby Ecosystem**: Rails, Sinatra, Hanami framework support
1519 | - **PHP Ecosystem**: Laravel, Symfony, CodeIgniter patterns
1520 | 
1521 | ### DevOps and Infrastructure Expansion
1522 | 
1523 | - **Extended Container Support**: Buildah, Skopeo, LXC/LXD integration
1524 | - **Advanced Orchestration**: Nomad, Docker Swarm, Cloud Foundry support
1525 | - **CI/CD Platforms**: Jenkins, GitLab CI, Azure DevOps, CircleCI integration
1526 | - **Infrastructure Tools**: Terraform, Pulumi, CloudFormation content generation
1527 | - **Service Mesh**: Istio, Linkerd, Consul Connect documentation patterns
1528 | - **Monitoring Stack**: Prometheus, Grafana, ELK Stack, Jaeger integration guides
1529 | 
1530 | ### Community and Learning Features
1531 | 
1532 | - **Content Quality Feedback**: User ratings and improvement suggestions
1533 | - **Template Sharing**: Community-contributed content templates
1534 | - **Usage Analytics**: Track which content types provide most value
1535 | - **Personalization**: Adapt content style to team preferences and expertise level
1536 | 
1537 | ### Community Ecosystem and Contributions
1538 | 
1539 | - **Language Extension Registry**: Centralized repository for community language support
1540 | - **Contribution Tooling**: CLI tools for scaffolding new language extensions
1541 | - **Validation Pipeline**: Automated testing and quality assurance for contributions
1542 | - **Community Governance**: Language maintainer program and review processes
1543 | - **Documentation Portal**: Comprehensive guides for extending DocuMCP capabilities
1544 | - **Template Marketplace**: Sharing and discovery of specialized content templates
1545 | 
1546 | ### Enterprise Features
1547 | 
1548 | - **Custom Content Standards**: Organization-specific content templates and style guides
1549 | - **Multi-language Support**: Generate content in multiple languages
1550 | - **Integration APIs**: Connect with existing documentation management systems
1551 | - **Approval Workflows**: Review and approval processes for generated content
1552 | 
1553 | ## Success Metrics
1554 | 
1555 | ### User Value Metrics
1556 | 
1557 | - **Time to Usable Documentation**: Target < 30 minutes (vs. 8-20 hours manually)
1558 | - **Content Completeness**: 60-80% populated content out of the box
1559 | - **User Satisfaction**: 85%+ positive feedback on generated content quality
1560 | - **Adoption Rate**: 90%+ of users use content population vs. structure-only
1561 | 
1562 | ### Technical Metrics
1563 | 
1564 | - **Content Accuracy**: 80%+ technical accuracy for generated code examples
1565 | - **Framework Coverage**: Support 95% of detected JavaScript/TypeScript frameworks
1566 | - **DevOps Tool Coverage**: Support 90% of detected containerization and orchestration tools
1567 | - **Performance**: Content generation completes within 30 seconds
1568 | - **Error Rate**: < 5% content generation failures
1569 | 
1570 | ### Business Metrics
1571 | 
1572 | - **Competitive Differentiation**: Only tool providing intelligent content population
1573 | - **Market Position**: Establish DocuMCP as "intelligent documentation assistant"
1574 | - **User Retention**: Increase from documentation structure to full workflow adoption
1575 | - **Community Growth**: Attract technical writers and documentation specialists
1576 | 
1577 | ## References
1578 | 
1579 | - [ADR-002: Multi-Layered Repository Analysis Engine Design](adr-0002-repository-analysis-engine.md)
1580 | - [ADR-004: Diataxis Framework Integration](adr-0004-diataxis-framework-integration.md)
1581 | - [ADR-006: MCP Tools API Design](adr-0006-mcp-tools-api-design.md)
1582 | - [Diataxis Framework Documentation](https://diataxis.fr/)
1583 | - [Technical Writing Best Practices](https://developers.google.com/tech-writing)
1584 | - [Documentation as Code Principles](https://www.writethedocs.org/guide/docs-as-code/)
1585 | 
```
Page 27/33FirstPrevNextLast