From 22fceef020abb9e93c2d2b8e0d23eb9ae2f833d5 Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Sat, 21 Feb 2026 16:16:36 +0000 Subject: [PATCH] Flatten MkDocs Structure + `--module-is-source` Support (#4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Merge Request: Flatten MkDocs Structure + `--module-is-source` Support ## Summary This MR introduces structural improvements to the MkDocs generation pipeline to: 1. Ensure a root `docs/index.md` always exists 2. Flatten documentation structure (remove `docs//` nesting by default) 3. Add support for `--module-is-source` to treat the module as the documentation root 4. Align navigation (`docforge.nav.yml`) with the new flat layout 5. Regenerate MCP artifacts to reflect updated signatures and docstrings This resolves static hosting issues (e.g., Nginx 403 due to missing `site/index.html`) and makes each generated MkDocs site deployable as a standalone static website. --- ## Motivation Previously, documentation was generated under: ``` docs//... ``` Which resulted in: ``` site//index.html ``` When deployed at `/libs//`, this caused: * Missing `site/index.html` * Nginx returning 403 for root access * Inconsistent static hosting behavior This MR corrects the architecture so each MkDocs build is a valid static site with a root entry point. --- ## Key Changes ### 1️⃣ Flattened Docs Structure **Before** ``` docs/docforge/index.md ``` **After** ``` docs/index.md ``` All documentation paths were updated accordingly: * `docs/docforge/cli/...` → `docs/cli/...` * `docs/docforge/models/...` → `docs/models/...` * `docs/docforge/renderers/...` → `docs/renderers/...` Navigation updated to match the flat layout. --- ### 2️⃣ Root Index Enforcement `MkDocsRenderer` now guarantees: * `docs/index.md` is always created * Parent `index.md` files are auto-generated if missing * Parent indexes link to child modules (idempotent behavior) This ensures: ``` site/index.html ``` Always exists after `mkdocs build`. --- ### 3️⃣ New CLI Flag: `--module-is-source` Added option: ``` --module-is-source ``` Behavior: * Treats the provided module as the documentation root * Removes the top-level module folder from generated paths * Prevents redundant nesting when the module corresponds to the source root Updated components: * `cli.commands.build` * `mkdocs_utils.generate_sources` * `MkDocsRenderer.generate_sources` * Stub files (`.pyi`) * MCP JSON artifacts --- ### 4️⃣ Navigation Spec Update `docforge.nav.yml` updated: **Before** ```yaml home: docforge/index.md ``` **After** ```yaml home: index.md ``` All group paths adjusted to remove `docforge/` prefix. --- ### 5️⃣ MkDocs Config Update `mkdocs.yml` updated to: * Move `site_name` below theme/plugins * Use flat navigation paths * Point Home to `index.md` --- ### 6️⃣ MCP Artifact Regeneration Updated: * Function signatures (new parameter) * Docstrings (reflect `module_is_source`) * Renderer metadata * Line numbers Ensures MCP output matches updated API. --- ## Architectural Outcome Each project now produces a **valid standalone static site**: ``` site/ index.html assets/ search/ ``` Safe for deployment under: ``` /libs// ``` No Nginx rewrites required. No directory-index issues. No nested-site ambiguity. --- ## Backward Compatibility * Existing CLI usage remains valid * `--module-is-source` is optional * Navigation spec format unchanged (only paths adjusted) --- ## Deployment Impact After merge: * Each library can be deployed independently * Sites can be merged under a shared root without internal conflicts * Static hosting is predictable and production-safe --- ## Testing * Verified MkDocs build produces `site/index.html` * Verified navigation renders correctly * Verified parent index generation is idempotent * Regenerated MCP docs and validated schema consistency --- ## Result The documentation compiler now: * Produces structurally correct static sites * Supports flat and source-root modes * Eliminates 403 root issues * Scales cleanly across multiple repositories This aligns doc-forge with proper static-site architectural invariants. Reviewed-on: https://git.aetoskia.com/aetos/doc-forge/pulls/4 Co-authored-by: Vishesh 'ironeagle' Bangotra Co-committed-by: Vishesh 'ironeagle' Bangotra --- .run/{pytest.run.xml => pytests.run.xml} | 2 +- docforge.nav.yml | 40 +++---- docforge/cli/commands.py | 12 +- docforge/cli/commands.pyi | 1 + docforge/cli/mkdocs_utils.py | 14 ++- docforge/cli/mkdocs_utils.pyi | 7 +- docforge/renderers/mkdocs_renderer.py | 109 +++++++++++++++--- docforge/renderers/mkdocs_renderer.pyi | 18 ++- docs/{docforge => }/cli/commands.md | 0 docs/{docforge => }/cli/index.md | 0 docs/{docforge => }/cli/main.md | 0 docs/{docforge => }/cli/mcp_utils.md | 0 docs/{docforge => }/cli/mkdocs_utils.md | 0 docs/{docforge => }/index.md | 2 +- docs/{docforge => }/loaders/griffe_loader.md | 0 docs/{docforge => }/loaders/index.md | 0 docs/{docforge => }/models/index.md | 0 docs/{docforge => }/models/module.md | 0 docs/{docforge => }/models/object.md | 0 docs/{docforge => }/models/project.md | 0 docs/{docforge => }/nav/index.md | 0 docs/{docforge => }/nav/mkdocs.md | 0 docs/{docforge => }/nav/resolver.md | 0 docs/{docforge => }/nav/spec.md | 0 docs/{docforge => }/renderers/base.md | 0 docs/{docforge => }/renderers/index.md | 0 docs/{docforge => }/renderers/mcp_renderer.md | 0 .../renderers/mkdocs_renderer.md | 0 docs/{docforge => }/servers/index.md | 0 docs/{docforge => }/servers/mcp_server.md | 0 mcp_docs/modules/docforge.cli.commands.json | 18 +-- mcp_docs/modules/docforge.cli.json | 34 +++--- mcp_docs/modules/docforge.cli.mcp_utils.json | 4 +- .../modules/docforge.cli.mkdocs_utils.json | 12 +- mcp_docs/modules/docforge.json | 95 +++++++-------- mcp_docs/modules/docforge.renderers.json | 57 ++++----- .../docforge.renderers.mkdocs_renderer.json | 55 ++++----- mkdocs.yml | 44 ++++--- 38 files changed, 306 insertions(+), 218 deletions(-) rename .run/{pytest.run.xml => pytests.run.xml} (94%) rename docs/{docforge => }/cli/commands.md (100%) rename docs/{docforge => }/cli/index.md (100%) rename docs/{docforge => }/cli/main.md (100%) rename docs/{docforge => }/cli/mcp_utils.md (100%) rename docs/{docforge => }/cli/mkdocs_utils.md (100%) rename docs/{docforge => }/index.md (56%) rename docs/{docforge => }/loaders/griffe_loader.md (100%) rename docs/{docforge => }/loaders/index.md (100%) rename docs/{docforge => }/models/index.md (100%) rename docs/{docforge => }/models/module.md (100%) rename docs/{docforge => }/models/object.md (100%) rename docs/{docforge => }/models/project.md (100%) rename docs/{docforge => }/nav/index.md (100%) rename docs/{docforge => }/nav/mkdocs.md (100%) rename docs/{docforge => }/nav/resolver.md (100%) rename docs/{docforge => }/nav/spec.md (100%) rename docs/{docforge => }/renderers/base.md (100%) rename docs/{docforge => }/renderers/index.md (100%) rename docs/{docforge => }/renderers/mcp_renderer.md (100%) rename docs/{docforge => }/renderers/mkdocs_renderer.md (100%) rename docs/{docforge => }/servers/index.md (100%) rename docs/{docforge => }/servers/mcp_server.md (100%) diff --git a/.run/pytest.run.xml b/.run/pytests.run.xml similarity index 94% rename from .run/pytest.run.xml rename to .run/pytests.run.xml index b923b9b..07542e6 100644 --- a/.run/pytest.run.xml +++ b/.run/pytests.run.xml @@ -1,5 +1,5 @@ - +