diff --git a/docforge.nav.yml b/docforge.nav.yml index a22b7f7..d83af04 100644 --- a/docforge.nav.yml +++ b/docforge.nav.yml @@ -21,4 +21,8 @@ groups: CLI: - docforge/cli/index.md - docforge/cli/main.md - - docforge/cli/mkdocs.md + - docforge/cli/commands.md + - docforge/cli/mcp/index.md + - docforge/cli/mcp/logic.md + - docforge/cli/mkdocs/index.md + - docforge/cli/mkdocs/logic.md diff --git a/docforge/cli/commands.py b/docforge/cli/commands.py new file mode 100644 index 0000000..34585e3 --- /dev/null +++ b/docforge/cli/commands.py @@ -0,0 +1,129 @@ +import click +from pathlib import Path +from typing import Sequence, Optional +from docforge.loaders import GriffeLoader +from docforge.cli.mkdocs import logic as mkdocs_logic +from docforge.cli.mcp import logic as mcp_logic + +@click.group() +def cli() -> None: + """ + doc-forge CLI: A tool for introspecting Python projects and generating + documentation. + """ + pass + +@cli.command() +@click.option("--mcp", is_flag=True, help="Build MCP resources") +@click.option("--mkdocs", is_flag=True, help="Build MkDocs site") +@click.option("--module", help="Python module to document") +@click.option("--project-name", help="Project name override") +# MkDocs specific +@click.option("--site-name", help="MkDocs site name") +@click.option("--docs-dir", type=click.Path(path_type=Path), default=Path("docs"), help="Directory for MD sources") +@click.option("--nav", "nav_file", type=click.Path(path_type=Path), default=Path("docforge.nav.yml"), help="Nav spec path") +@click.option("--template", type=click.Path(path_type=Path), help="MkDocs template path") +@click.option("--mkdocs-yml", type=click.Path(path_type=Path), default=Path("mkdocs.yml"), help="Output config path") +# MCP specific +@click.option("--out-dir", type=click.Path(path_type=Path), default=Path("mcp_docs"), help="MCP output directory") +def build( + mcp: bool, + mkdocs: bool, + module: Optional[str], + project_name: Optional[str], + site_name: Optional[str], + docs_dir: Path, + nav_file: Path, + template: Optional[Path], + mkdocs_yml: Path, + out_dir: Path, +) -> None: + """ + Build documentation (MkDocs site or MCP resources). + """ + if not mcp and not mkdocs: + raise click.UsageError("Must specify either --mcp or --mkdocs") + + if mkdocs: + if not module: + raise click.UsageError("--module is required for MkDocs build") + if not site_name: + site_name = module + + click.echo(f"Generating MkDocs sources in {docs_dir}...") + mkdocs_logic.generate_sources(module, project_name, docs_dir) + + click.echo(f"Generating MkDocs config {mkdocs_yml}...") + mkdocs_logic.generate_config(docs_dir, nav_file, template, mkdocs_yml, site_name) + + click.echo("Running MkDocs build...") + mkdocs_logic.build(mkdocs_yml) + click.echo("MkDocs build completed.") + + if mcp: + if not module: + raise click.UsageError("--module is required for MCP build") + + click.echo(f"Generating MCP resources in {out_dir}...") + mcp_logic.generate_resources(module, project_name, out_dir) + click.echo("MCP build completed.") + +@cli.command() +@click.option("--mcp", is_flag=True, help="Serve MCP documentation") +@click.option("--mkdocs", is_flag=True, help="Serve MkDocs site") +@click.option("--mkdocs-yml", type=click.Path(path_type=Path), default=Path("mkdocs.yml"), help="MkDocs config path") +@click.option("--out-dir", type=click.Path(path_type=Path), default=Path("mcp_docs"), help="MCP root directory") +def serve( + mcp: bool, + mkdocs: bool, + mkdocs_yml: Path, + out_dir: Path, +) -> None: + """ + Serve documentation. + """ + if mcp and mkdocs: + raise click.UsageError("Cannot specify both --mcp and --mkdocs") + if not mcp and not mkdocs: + raise click.UsageError("Must specify either --mcp or --mkdocs") + + if mkdocs: + mkdocs_logic.serve(mkdocs_yml) + elif mcp: + mcp_logic.serve(out_dir) + +@cli.command() +@click.option( + "--modules", + multiple=True, + required=True, + help="Python module import paths to introspect", +) +@click.option( + "--project-name", + help="Project name (defaults to first module)", +) +def tree( + modules: Sequence[str], + project_name: Optional[str], +) -> None: + """ + Visualize the project structure. + """ + loader = GriffeLoader() + project = loader.load_project(list(modules), project_name) + + click.echo(project.name) + + for module in project.get_all_modules(): + click.echo(f"├── {module.path}") + for obj in module.get_all_objects(): + _print_object(obj, indent="│ ") + +def _print_object(obj, indent: str) -> None: + """ + Recursive helper to print doc objects and their members to the console. + """ + click.echo(f"{indent}├── {obj.name}") + for member in obj.get_all_members(): + _print_object(member, indent + "│ ") diff --git a/docforge/cli/main.py b/docforge/cli/main.py index 09bf0a4..b6f7d78 100644 --- a/docforge/cli/main.py +++ b/docforge/cli/main.py @@ -1,268 +1,7 @@ """ -Main entry point for the doc-forge CLI. This module defines the core command -group and the 'tree', 'generate', 'build', and 'serve' commands. +Main entry point for the doc-forge CLI. """ - -from pathlib import Path -from typing import Sequence, Optional - -import click - -from docforge.loaders import GriffeLoader, discover_module_paths -from docforge.renderers import MkDocsRenderer, MCPRenderer -from docforge.cli.mkdocs import mkdocs_cmd - - -@click.group() -def cli() -> None: - """ - doc-forge CLI: A tool for introspecting Python projects and generating - documentation. - """ - pass - - -cli.add_command(mkdocs_cmd) - -# --------------------------------------------------------------------- -# tree -# --------------------------------------------------------------------- - -@cli.command() -@click.option( - "--modules", - multiple=True, - required=True, - help="Python module import paths to introspect", -) -@click.option( - "--project-name", - help="Project name (defaults to first module)", -) -def tree( - modules: Sequence[str], - project_name: Optional[str], -) -> None: - """ - Visualize the project structure including modules and their members. - - Args: - modules: List of module paths to introspect. - project_name: Optional project name override. - """ - loader = GriffeLoader() - project = loader.load_project(list(modules), project_name) - - click.echo(project.name) - - for module in project.get_all_modules(): - click.echo(f"├── {module.path}") - - for obj in module.get_all_objects(): - _print_object(obj, indent="│ ") - - -def _print_object(obj, indent: str) -> None: - """ - Recursive helper to print doc objects and their members to the console. - - Args: - obj: The DocObject to print. - indent: The current line indentation string. - """ - click.echo(f"{indent}├── {obj.name}") - for member in obj.get_all_members(): - _print_object(member, indent + "│ ") - - -# --------------------------------------------------------------------- -# generate -# --------------------------------------------------------------------- - -@cli.command() -@click.option( - "--module", - required=True, - help="Python module import paths to document", -) -@click.option( - "--project-name", - help="Project name (defaults to first module)", -) -@click.option( - "--docs-dir", - type=click.Path(path_type=Path), - default=Path("docs"), -) -def generate( - module: str, - project_name: Optional[str], - docs_dir: Path, -) -> None: - """ - Generate Markdown source files for the specified module. - - Args: - module: The primary module path to document. - project_name: Optional project name override. - docs_dir: Directory where documentation sources will be written. - """ - loader = GriffeLoader() - discovered_paths = discover_module_paths( - module, - ) - project = loader.load_project( - discovered_paths, - project_name - ) - - renderer = MkDocsRenderer() - renderer.generate_sources(project, docs_dir) - - click.echo(f"Documentation sources generated in {docs_dir}") - - -# --------------------------------------------------------------------- -# mcp-build -# --------------------------------------------------------------------- - -@cli.command(name="generate-mcp") -@click.option( - "--module", - required=True, - help="Python module import path to document", -) -@click.option( - "--project-name", - help="Project name (defaults to first module)", -) -@click.option( - "--out-dir", - type=click.Path(path_type=Path), - default=Path("mcp_docs"), -) -def generate_mcp( - module: str, - project_name: str | None, - out_dir: Path, -) -> None: - """ - Generate MCP-compatible documentation resources for the specified module. - - Args: - module: The primary module path to document. - project_name: Optional project name override. - out_dir: Directory where MCP resources will be written. - """ - loader = GriffeLoader() - discovered_paths = discover_module_paths(module) - - project = loader.load_project( - discovered_paths, - project_name, - ) - - renderer = MCPRenderer() - renderer.generate_sources(project, out_dir) - - click.echo(f"MCP documentation resources generated in {out_dir}") - - -# --------------------------------------------------------------------- -# build -# --------------------------------------------------------------------- - -@cli.command() -@click.option( - "--mkdocs-yml", - type=click.Path(path_type=Path), - default=Path("mkdocs.yml"), -) -def build(mkdocs_yml: Path) -> None: - """ - Build the documentation site using MkDocs. - - Args: - mkdocs_yml: Path to the mkdocs.yml configuration file. - """ - if not mkdocs_yml.exists(): - raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}") - - from mkdocs.config import load_config - from mkdocs.commands.build import build as mkdocs_build - - mkdocs_build(load_config(str(mkdocs_yml))) - - click.echo("MkDocs build completed") - - -# --------------------------------------------------------------------- -# serve-mcp -# --------------------------------------------------------------------- - -@cli.command(name="serve-mcp") -def serve_mcp() -> None: - """ - Serve MCP documentation from the local mcp_docs directory. - """ - from docforge.servers import MCPServer - - mcp_root = Path.cwd() / "mcp_docs" - - if not mcp_root.exists(): - raise click.ClickException("mcp_docs directory not found") - - required = [ - mcp_root / "index.json", - mcp_root / "nav.json", - mcp_root / "modules", - ] - - for path in required: - if not path.exists(): - raise click.ClickException(f"Invalid MCP bundle, missing: {path.name}") - - server = MCPServer( - mcp_root=mcp_root, - name="doc-forge-mcp", - ) - - server.run() - - -# --------------------------------------------------------------------- -# serve -# --------------------------------------------------------------------- - -@cli.command() -@click.option( - "--mkdocs-yml", - type=click.Path(path_type=Path), - default=Path("mkdocs.yml"), -) -def serve(mkdocs_yml: Path) -> None: - """ - Serve the documentation site with live-reload using MkDocs. - - Args: - mkdocs_yml: Path to the mkdocs.yml configuration file. - """ - if not mkdocs_yml.exists(): - raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}") - - from mkdocs.commands.serve import serve as mkdocs_serve - - host = "127.0.0.1" - port = 8000 - url = f"http://{host}:{port}/" - - click.echo(f"Serving documentation at {url}") - mkdocs_serve(config_file=str(mkdocs_yml)) - - -# --------------------------------------------------------------------- -# entry point -# --------------------------------------------------------------------- +from docforge.cli.commands import cli def main() -> None: """ @@ -270,6 +9,5 @@ def main() -> None: """ cli() - if __name__ == "__main__": main() diff --git a/docforge/cli/main.pyi b/docforge/cli/main.pyi deleted file mode 100644 index 1acfbf3..0000000 --- a/docforge/cli/main.pyi +++ /dev/null @@ -1,109 +0,0 @@ -from typing import Sequence -from pathlib import Path - -import click - - -@click.group() -def cli() -> None: - """doc-forge command-line interface.""" - - -@cli.command() -@click.option( - "--modules", - multiple=True, - help="Python module import paths to introspect", -) -@click.option( - "--project-name", - help="Project name (defaults to first module)", -) -def tree( - modules: Sequence[str], - project_name: str | None, -) -> None: - """Show introspection tree.""" - - -@cli.command() -@click.option( - "--module", - help="Python module import paths to document", -) -@click.option( - "--project-name", - help="Project name (defaults to first module)", -) -@click.option( - "--docs-dir", - type=click.Path(path_type=Path), - default=Path("docs"), -) -def generate( - module: str, - project_name: str | None, - docs_dir: Path, -) -> None: - """Generate documentation source files using MkDocs renderer.""" - -@cli.command(name="generate-mcp") -@click.option( - "--module", - required=True, - help="Python module import path to document", -) -@click.option( - "--project-name", - help="Project name (defaults to first module)", -) -@click.option( - "--out-dir", - type=click.Path(path_type=Path), - default=Path("mcp_docs"), -) -def generate_mcp( - module: str, - project_name: str | None, - out_dir: Path, -) -> None: - """ - Generate MCP-compatible documentation resources for the specified module. - - Args: - module: The primary module path to document. - project_name: Optional project name override. - out_dir: Directory where MCP resources will be written. - """ - -@cli.command() -@click.option( - "--mkdocs-yml", - type=click.Path(path_type=Path), - default=Path("mkdocs.yml"), -) -def build( - mkdocs_yml: Path, -) -> None: - """Build documentation using MkDocs.""" - - -@cli.command() -@click.option( - "--mkdocs-yml", - type=click.Path(path_type=Path), - default=Path("mkdocs.yml"), -) -def serve( - mkdocs_yml: Path, -) -> None: - """Serve documentation using MkDocs.""" - - -@cli.command(name="serve-mcp") -def serve_mcp() -> None: - """Serve MCP documentation.""" - - -def main() -> None: - """CLI entry point.""" diff --git a/docforge/cli/mcp/__init__.py b/docforge/cli/mcp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/docforge/cli/mcp/logic.py b/docforge/cli/mcp/logic.py new file mode 100644 index 0000000..09c2477 --- /dev/null +++ b/docforge/cli/mcp/logic.py @@ -0,0 +1,39 @@ +from pathlib import Path +import click +from docforge.loaders import GriffeLoader, discover_module_paths +from docforge.renderers import MCPRenderer +from docforge.servers import MCPServer + +def generate_resources(module: str, project_name: str | None, out_dir: Path) -> None: + """ + Generate MCP-compatible documentation resources. + """ + loader = GriffeLoader() + discovered_paths = discover_module_paths(module) + project = loader.load_project(discovered_paths, project_name) + + renderer = MCPRenderer() + renderer.generate_sources(project, out_dir) + +def serve(mcp_root: Path) -> None: + """ + Serve MCP documentation. + """ + if not mcp_root.exists(): + raise click.ClickException(f"mcp_docs directory not found: {mcp_root}") + + required = [ + mcp_root / "index.json", + mcp_root / "nav.json", + mcp_root / "modules", + ] + + for path in required: + if not path.exists(): + raise click.ClickException(f"Invalid MCP bundle, missing: {path.name}") + + server = MCPServer( + mcp_root=mcp_root, + name="doc-forge-mcp", + ) + server.run() diff --git a/docforge/cli/mkdocs.py b/docforge/cli/mkdocs.py deleted file mode 100644 index df9210f..0000000 --- a/docforge/cli/mkdocs.py +++ /dev/null @@ -1,116 +0,0 @@ -""" -This module contains the 'mkdocs' CLI command, which orchestrates the generation -of the main mkdocs.yml configuration file. -""" - -from pathlib import Path -from importlib import resources - -import click -import yaml - -from docforge.nav import load_nav_spec -from docforge.nav import resolve_nav -from docforge.nav import MkDocsNavEmitter - - -def _load_template(template: Path | None) -> dict: - """ - Load a YAML template for mkdocs.yml. If no template is provided, - loads the built-in sample template. - - Args: - template: Path to the template file, or None. - - Returns: - The loaded template data as a dictionary. - """ - if template is not None: - if not template.exists(): - raise click.FileError(str(template), hint="Template not found") - return yaml.safe_load(template.read_text(encoding="utf-8")) - - # Load built-in default - text = ( - resources.files("docforge.templates") - .joinpath("mkdocs.sample.yml") - .read_text(encoding="utf-8") - ) - return yaml.safe_load(text) - - -@click.command("mkdocs") -@click.option( - "--site-name", - required=True, - help="MkDocs site_name (required)", -) -@click.option( - "--docs-dir", - type=click.Path(path_type=Path), - default=Path("docs"), -) -@click.option( - "--nav", - "nav_file", - type=click.Path(path_type=Path), - default=Path("docforge.nav.yml"), -) -@click.option( - "--template", - type=click.Path(path_type=Path), - default=None, - help="Override the built-in mkdocs template", -) -@click.option( - "--out", - type=click.Path(path_type=Path), - default=Path("mkdocs.yml"), -) -def mkdocs_cmd( - docs_dir: Path, - nav_file: Path, - template: Path | None, - out: Path, - site_name: str, -) -> None: - """ - Generate an mkdocs.yml configuration file by combining a template with - the navigation structure resolved from a docforge.nav.yml file. - - Args: - docs_dir: Path to the directory containing documentation Markdown files. - nav_file: Path to the docforge.nav.yml specification. - template: Optional path to an mkdocs.yml template. - out: Path where the final mkdocs.yml will be written. - site_name: The name of the documentation site. - """ - - if not nav_file.exists(): - raise click.FileError(str(nav_file), hint="Nav spec not found") - - # Load nav spec - spec = load_nav_spec(nav_file) - - # Resolve nav - resolved = resolve_nav(spec, docs_dir) - - # Emit mkdocs nav - nav_block = MkDocsNavEmitter().emit(resolved) - - # Load template (user or built-in) - data = _load_template(template) - - # Inject site_name - data["site_name"] = site_name - - # Inject nav - data["nav"] = nav_block - - # Write output - out.write_text( - yaml.safe_dump(data, sort_keys=False), - encoding="utf-8", - ) - - click.echo(f"mkdocs.yml written to {out}") diff --git a/docforge/cli/mkdocs.pyi b/docforge/cli/mkdocs.pyi deleted file mode 100644 index 3121f5d..0000000 --- a/docforge/cli/mkdocs.pyi +++ /dev/null @@ -1,45 +0,0 @@ -from pathlib import Path -from typing import Any, Dict, Optional - -import click - - -def _load_template(template: Optional[Path]) -> Dict[str, Any]: - ... - - -@click.command("mkdocs") -@click.option( - "--site-name", - required=True, - help="MkDocs site_name (required)", -) -@click.option( - "--docs-dir", - type=click.Path(path_type=Path), - default=Path("docs"), -) -@click.option( - "--nav", - "nav_file", - type=click.Path(path_type=Path), - default=Path("docforge.nav.yml"), -) -@click.option( - "--template", - type=click.Path(path_type=Path), - default=None, -) -@click.option( - "--out", - type=click.Path(path_type=Path), - default=Path("mkdocs.yml"), -) -def mkdocs_cmd( - docs_dir: Path, - nav_file: Path, - template: Optional[Path], - out: Path, - site_name: str, -) -> None: - ... diff --git a/docforge/cli/mkdocs/__init__.py b/docforge/cli/mkdocs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/docforge/cli/mkdocs/logic.py b/docforge/cli/mkdocs/logic.py new file mode 100644 index 0000000..2fcc636 --- /dev/null +++ b/docforge/cli/mkdocs/logic.py @@ -0,0 +1,69 @@ +from pathlib import Path +from importlib import resources +import click +import yaml +from docforge.loaders import GriffeLoader, discover_module_paths +from docforge.renderers import MkDocsRenderer +from docforge.nav import load_nav_spec, resolve_nav, MkDocsNavEmitter + +def generate_sources(module: str, project_name: str | None, docs_dir: Path) -> None: + """ + Generate Markdown source files for the specified module. + """ + loader = GriffeLoader() + discovered_paths = discover_module_paths(module) + project = loader.load_project(discovered_paths, project_name) + + renderer = MkDocsRenderer() + renderer.generate_sources(project, docs_dir) + +def generate_config(docs_dir: Path, nav_file: Path, template: Path | None, out: Path, site_name: str) -> None: + """ + Generate an mkdocs.yml configuration file. + """ + if not nav_file.exists(): + raise click.FileError(str(nav_file), hint="Nav spec not found") + + spec = load_nav_spec(nav_file) + resolved = resolve_nav(spec, docs_dir) + nav_block = MkDocsNavEmitter().emit(resolved) + + # Load template + if template is not None: + if not template.exists(): + raise click.FileError(str(template), hint="Template not found") + data = yaml.safe_load(template.read_text(encoding="utf-8")) + else: + text = ( + resources.files("docforge.templates") + .joinpath("mkdocs.sample.yml") + .read_text(encoding="utf-8") + ) + data = yaml.safe_load(text) + + data["site_name"] = site_name + data["nav"] = nav_block + + out.write_text(yaml.safe_dump(data, sort_keys=False), encoding="utf-8") + +def build(mkdocs_yml: Path) -> None: + """ + Build the documentation site using MkDocs. + """ + if not mkdocs_yml.exists(): + raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}") + + from mkdocs.config import load_config + from mkdocs.commands.build import build as mkdocs_build + + mkdocs_build(load_config(str(mkdocs_yml))) + +def serve(mkdocs_yml: Path) -> None: + """ + Serve the documentation site with live-reload using MkDocs. + """ + if not mkdocs_yml.exists(): + raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}") + + from mkdocs.commands.serve import serve as mkdocs_serve + mkdocs_serve(config_file=str(mkdocs_yml)) diff --git a/docs/docforge/cli/commands.md b/docs/docforge/cli/commands.md new file mode 100644 index 0000000..75f0d75 --- /dev/null +++ b/docs/docforge/cli/commands.md @@ -0,0 +1,3 @@ +# Commands + +::: docforge.cli.commands diff --git a/docs/docforge/cli/mcp/index.md b/docs/docforge/cli/mcp/index.md new file mode 100644 index 0000000..52ffe01 --- /dev/null +++ b/docs/docforge/cli/mcp/index.md @@ -0,0 +1,3 @@ +# Mcp + +::: docforge.cli.mcp diff --git a/docs/docforge/cli/mcp/logic.md b/docs/docforge/cli/mcp/logic.md new file mode 100644 index 0000000..92d9364 --- /dev/null +++ b/docs/docforge/cli/mcp/logic.md @@ -0,0 +1,3 @@ +# Logic + +::: docforge.cli.mcp.logic diff --git a/docs/docforge/cli/mkdocs.md b/docs/docforge/cli/mkdocs/index.md similarity index 100% rename from docs/docforge/cli/mkdocs.md rename to docs/docforge/cli/mkdocs/index.md diff --git a/docs/docforge/cli/mkdocs/logic.md b/docs/docforge/cli/mkdocs/logic.md new file mode 100644 index 0000000..94909a7 --- /dev/null +++ b/docs/docforge/cli/mkdocs/logic.md @@ -0,0 +1,3 @@ +# Logic + +::: docforge.cli.mkdocs.logic diff --git a/docs/docforge/servers/index.md b/docs/docforge/servers/index.md new file mode 100644 index 0000000..6297158 --- /dev/null +++ b/docs/docforge/servers/index.md @@ -0,0 +1,3 @@ +# Servers + +::: docforge.servers diff --git a/docs/docforge/servers/mcp_server.md b/docs/docforge/servers/mcp_server.md new file mode 100644 index 0000000..0f20e6b --- /dev/null +++ b/docs/docforge/servers/mcp_server.md @@ -0,0 +1,3 @@ +# Mcp Server + +::: docforge.servers.mcp_server diff --git a/mcp_docs/index.json b/mcp_docs/index.json index 259744b..6ce9145 100644 --- a/mcp_docs/index.json +++ b/mcp_docs/index.json @@ -1,6 +1,6 @@ { "project": "docforge", "type": "docforge-model", - "modules_count": 20, + "modules_count": 24, "source": "docforge" } \ No newline at end of file diff --git a/mcp_docs/modules/docforge.cli.commands.json b/mcp_docs/modules/docforge.cli.commands.json new file mode 100644 index 0000000..701f8ad --- /dev/null +++ b/mcp_docs/modules/docforge.cli.commands.json @@ -0,0 +1,356 @@ +{ + "module": "docforge.cli.commands", + "content": { + "path": "docforge.cli.commands", + "docstring": null, + "objects": { + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.click", + "signature": "", + "docstring": null + }, + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.commands.Path", + "signature": "", + "docstring": null + }, + "Sequence": { + "name": "Sequence", + "kind": "alias", + "path": "docforge.cli.commands.Sequence", + "signature": "", + "docstring": null + }, + "Optional": { + "name": "Optional", + "kind": "alias", + "path": "docforge.cli.commands.Optional", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.commands.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.commands.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.commands.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "mkdocs_logic": { + "name": "mkdocs_logic", + "kind": "module", + "path": "docforge.cli.commands.mkdocs_logic", + "signature": "", + "docstring": null, + "members": { + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.Path", + "signature": "", + "docstring": null + }, + "resources": { + "name": "resources", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.resources", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.click", + "signature": "", + "docstring": null + }, + "yaml": { + "name": "yaml", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.yaml", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MkDocsRenderer": { + "name": "MkDocsRenderer", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer", + "signature": "", + "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer.generate_sources", + "signature": "", + "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + } + } + }, + "load_nav_spec": { + "name": "load_nav_spec", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.load_nav_spec", + "signature": "", + "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." + }, + "resolve_nav": { + "name": "resolve_nav", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.resolve_nav", + "signature": "", + "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." + }, + "MkDocsNavEmitter": { + "name": "MkDocsNavEmitter", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsNavEmitter", + "signature": "", + "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "members": { + "emit": { + "name": "emit", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsNavEmitter.emit", + "signature": "", + "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + } + } + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.generate_sources", + "signature": "", + "docstring": "Generate Markdown source files for the specified module." + }, + "generate_config": { + "name": "generate_config", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.generate_config", + "signature": "", + "docstring": "Generate an mkdocs.yml configuration file." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.build", + "signature": "", + "docstring": "Build the documentation site using MkDocs." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.serve", + "signature": "", + "docstring": "Serve the documentation site with live-reload using MkDocs." + } + } + }, + "mcp_logic": { + "name": "mcp_logic", + "kind": "module", + "path": "docforge.cli.commands.mcp_logic", + "signature": "", + "docstring": null, + "members": { + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.commands.mcp_logic.Path", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.mcp_logic.click", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MCPRenderer": { + "name": "MCPRenderer", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer", + "signature": "", + "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer.generate_sources", + "signature": "", + "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + } + } + }, + "MCPServer": { + "name": "MCPServer", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.MCPServer", + "signature": "", + "docstring": "MCP server for serving a pre-built MCP documentation bundle.", + "members": { + "mcp_root": { + "name": "mcp_root", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPServer.mcp_root", + "signature": "", + "docstring": null + }, + "app": { + "name": "app", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPServer.app", + "signature": "", + "docstring": null + }, + "run": { + "name": "run", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.MCPServer.run", + "signature": "", + "docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)" + } + } + }, + "generate_resources": { + "name": "generate_resources", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.generate_resources", + "signature": "", + "docstring": "Generate MCP-compatible documentation resources." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.serve", + "signature": "", + "docstring": "Serve MCP documentation." + } + } + }, + "cli": { + "name": "cli", + "kind": "function", + "path": "docforge.cli.commands.cli", + "signature": "", + "docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.commands.build", + "signature": "", + "docstring": "Build documentation (MkDocs site or MCP resources)." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.commands.serve", + "signature": "", + "docstring": "Serve documentation." + }, + "tree": { + "name": "tree", + "kind": "function", + "path": "docforge.cli.commands.tree", + "signature": "", + "docstring": "Visualize the project structure." + } + } + } +} \ No newline at end of file diff --git a/mcp_docs/modules/docforge.cli.json b/mcp_docs/modules/docforge.cli.json index bb68c75..f51e344 100644 --- a/mcp_docs/modules/docforge.cli.json +++ b/mcp_docs/modules/docforge.cli.json @@ -9,174 +9,506 @@ "kind": "module", "path": "docforge.cli.main", "signature": null, - "docstring": "Main entry point for the doc-forge CLI. This module defines the core command\ngroup and the 'tree', 'generate', 'build', and 'serve' commands.", + "docstring": "Main entry point for the doc-forge CLI.", "members": { + "cli": { + "name": "cli", + "kind": "function", + "path": "docforge.cli.main.cli", + "signature": "", + "docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation." + }, + "main": { + "name": "main", + "kind": "function", + "path": "docforge.cli.main.main", + "signature": "", + "docstring": "CLI Entry point. Boots the click application." + } + } + }, + "commands": { + "name": "commands", + "kind": "module", + "path": "docforge.cli.commands", + "signature": null, + "docstring": null, + "members": { + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.click", + "signature": "", + "docstring": null + }, "Path": { "name": "Path", "kind": "alias", - "path": "docforge.cli.main.Path", + "path": "docforge.cli.commands.Path", "signature": "", "docstring": null }, "Sequence": { "name": "Sequence", "kind": "alias", - "path": "docforge.cli.main.Sequence", + "path": "docforge.cli.commands.Sequence", "signature": "", "docstring": null }, "Optional": { "name": "Optional", "kind": "alias", - "path": "docforge.cli.main.Optional", + "path": "docforge.cli.commands.Optional", "signature": "", "docstring": null }, - "click": { - "name": "click", - "kind": "alias", - "path": "docforge.cli.main.click", - "signature": "", - "docstring": null - }, "GriffeLoader": { "name": "GriffeLoader", "kind": "class", - "path": "docforge.cli.main.GriffeLoader", + "path": "docforge.cli.commands.GriffeLoader", "signature": "", "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", "members": { "load_project": { "name": "load_project", "kind": "function", - "path": "docforge.cli.main.GriffeLoader.load_project", + "path": "docforge.cli.commands.GriffeLoader.load_project", "signature": "", "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." }, "load_module": { "name": "load_module", "kind": "function", - "path": "docforge.cli.main.GriffeLoader.load_module", + "path": "docforge.cli.commands.GriffeLoader.load_module", "signature": "", "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." } } }, - "discover_module_paths": { - "name": "discover_module_paths", - "kind": "function", - "path": "docforge.cli.main.discover_module_paths", - "signature": "", - "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." - }, - "MkDocsRenderer": { - "name": "MkDocsRenderer", - "kind": "class", - "path": "docforge.cli.main.MkDocsRenderer", - "signature": "", - "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "mkdocs_logic": { + "name": "mkdocs_logic", + "kind": "module", + "path": "docforge.cli.commands.mkdocs_logic", + "signature": "", + "docstring": null, "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.cli.main.MkDocsRenderer.name", - "signature": "", + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.Path", + "signature": "", "docstring": null }, + "resources": { + "name": "resources", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.resources", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.click", + "signature": "", + "docstring": null + }, + "yaml": { + "name": "yaml", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.yaml", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MkDocsRenderer": { + "name": "MkDocsRenderer", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer", + "signature": "", + "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer.generate_sources", + "signature": "", + "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + } + } + }, + "load_nav_spec": { + "name": "load_nav_spec", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.load_nav_spec", + "signature": "", + "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." + }, + "resolve_nav": { + "name": "resolve_nav", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.resolve_nav", + "signature": "", + "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." + }, + "MkDocsNavEmitter": { + "name": "MkDocsNavEmitter", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsNavEmitter", + "signature": "", + "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "members": { + "emit": { + "name": "emit", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsNavEmitter.emit", + "signature": "", + "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + } + } + }, "generate_sources": { "name": "generate_sources", "kind": "function", - "path": "docforge.cli.main.MkDocsRenderer.generate_sources", - "signature": "", - "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + "path": "docforge.cli.commands.mkdocs_logic.generate_sources", + "signature": "", + "docstring": "Generate Markdown source files for the specified module." + }, + "generate_config": { + "name": "generate_config", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.generate_config", + "signature": "", + "docstring": "Generate an mkdocs.yml configuration file." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.build", + "signature": "", + "docstring": "Build the documentation site using MkDocs." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.serve", + "signature": "", + "docstring": "Serve the documentation site with live-reload using MkDocs." } } }, - "MCPRenderer": { - "name": "MCPRenderer", - "kind": "class", - "path": "docforge.cli.main.MCPRenderer", - "signature": "", - "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "mcp_logic": { + "name": "mcp_logic", + "kind": "module", + "path": "docforge.cli.commands.mcp_logic", + "signature": "", + "docstring": null, "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.cli.main.MCPRenderer.name", - "signature": "", + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.commands.mcp_logic.Path", + "signature": "", "docstring": null }, - "generate_sources": { - "name": "generate_sources", + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.mcp_logic.click", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", "kind": "function", - "path": "docforge.cli.main.MCPRenderer.generate_sources", - "signature": "", - "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + "path": "docforge.cli.commands.mcp_logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MCPRenderer": { + "name": "MCPRenderer", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer", + "signature": "", + "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer.generate_sources", + "signature": "", + "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + } + } + }, + "MCPServer": { + "name": "MCPServer", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.MCPServer", + "signature": "", + "docstring": "MCP server for serving a pre-built MCP documentation bundle.", + "members": { + "mcp_root": { + "name": "mcp_root", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPServer.mcp_root", + "signature": "", + "docstring": null + }, + "app": { + "name": "app", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPServer.app", + "signature": "", + "docstring": null + }, + "run": { + "name": "run", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.MCPServer.run", + "signature": "", + "docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)" + } + } + }, + "generate_resources": { + "name": "generate_resources", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.generate_resources", + "signature": "", + "docstring": "Generate MCP-compatible documentation resources." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.serve", + "signature": "", + "docstring": "Serve MCP documentation." } } }, - "mkdocs_cmd": { - "name": "mkdocs_cmd", - "kind": "function", - "path": "docforge.cli.main.mkdocs_cmd", - "signature": "", - "docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site." - }, "cli": { "name": "cli", "kind": "function", - "path": "docforge.cli.main.cli", - "signature": "", + "path": "docforge.cli.commands.cli", + "signature": "", "docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation." }, - "tree": { - "name": "tree", - "kind": "function", - "path": "docforge.cli.main.tree", - "signature": "", - "docstring": "Visualize the project structure including modules and their members.\n\nArgs:\n modules: List of module paths to introspect.\n project_name: Optional project name override." - }, - "generate": { - "name": "generate", - "kind": "function", - "path": "docforge.cli.main.generate", - "signature": "", - "docstring": "Generate Markdown source files for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n docs_dir: Directory where documentation sources will be written." - }, - "generate_mcp": { - "name": "generate_mcp", - "kind": "function", - "path": "docforge.cli.main.generate_mcp", - "signature": "", - "docstring": "Generate MCP-compatible documentation resources for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n out_dir: Directory where MCP resources will be written." - }, "build": { "name": "build", "kind": "function", - "path": "docforge.cli.main.build", - "signature": "", - "docstring": "Build the documentation site using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." - }, - "serve_mcp": { - "name": "serve_mcp", - "kind": "function", - "path": "docforge.cli.main.serve_mcp", - "signature": "", - "docstring": "Serve MCP documentation from the local mcp_docs directory." + "path": "docforge.cli.commands.build", + "signature": "", + "docstring": "Build documentation (MkDocs site or MCP resources)." }, "serve": { "name": "serve", "kind": "function", - "path": "docforge.cli.main.serve", - "signature": "", - "docstring": "Serve the documentation site with live-reload using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." + "path": "docforge.cli.commands.serve", + "signature": "", + "docstring": "Serve documentation." }, - "main": { - "name": "main", + "tree": { + "name": "tree", "kind": "function", - "path": "docforge.cli.main.main", - "signature": "", - "docstring": "CLI Entry point. Boots the click application." + "path": "docforge.cli.commands.tree", + "signature": "", + "docstring": "Visualize the project structure." + } + } + }, + "mcp": { + "name": "mcp", + "kind": "module", + "path": "docforge.cli.mcp", + "signature": null, + "docstring": null, + "members": { + "logic": { + "name": "logic", + "kind": "module", + "path": "docforge.cli.mcp.logic", + "signature": null, + "docstring": null, + "members": { + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mcp.logic.Path", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mcp.logic.click", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mcp.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.mcp.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MCPRenderer": { + "name": "MCPRenderer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPRenderer", + "signature": "", + "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPRenderer.generate_sources", + "signature": "", + "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + } + } + }, + "MCPServer": { + "name": "MCPServer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPServer", + "signature": "", + "docstring": "MCP server for serving a pre-built MCP documentation bundle.", + "members": { + "mcp_root": { + "name": "mcp_root", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.mcp_root", + "signature": "", + "docstring": null + }, + "app": { + "name": "app", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.app", + "signature": "", + "docstring": null + }, + "run": { + "name": "run", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPServer.run", + "signature": "", + "docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)" + } + } + }, + "generate_resources": { + "name": "generate_resources", + "kind": "function", + "path": "docforge.cli.mcp.logic.generate_resources", + "signature": "", + "docstring": "Generate MCP-compatible documentation resources." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mcp.logic.serve", + "signature": "", + "docstring": "Serve MCP documentation." + } + } } } }, @@ -185,93 +517,155 @@ "kind": "module", "path": "docforge.cli.mkdocs", "signature": null, - "docstring": "This module contains the 'mkdocs' CLI command, which orchestrates the generation\nof the main mkdocs.yml configuration file.", + "docstring": null, "members": { - "Path": { - "name": "Path", - "kind": "alias", - "path": "docforge.cli.mkdocs.Path", - "signature": "", - "docstring": null - }, - "resources": { - "name": "resources", - "kind": "alias", - "path": "docforge.cli.mkdocs.resources", - "signature": "", - "docstring": null - }, - "click": { - "name": "click", - "kind": "alias", - "path": "docforge.cli.mkdocs.click", - "signature": "", - "docstring": null - }, - "yaml": { - "name": "yaml", - "kind": "alias", - "path": "docforge.cli.mkdocs.yaml", - "signature": "", - "docstring": null - }, - "load_nav_spec": { - "name": "load_nav_spec", - "kind": "function", - "path": "docforge.cli.mkdocs.load_nav_spec", - "signature": "", - "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." - }, - "resolve_nav": { - "name": "resolve_nav", - "kind": "function", - "path": "docforge.cli.mkdocs.resolve_nav", - "signature": "", - "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." - }, - "MkDocsNavEmitter": { - "name": "MkDocsNavEmitter", - "kind": "class", - "path": "docforge.cli.mkdocs.MkDocsNavEmitter", - "signature": "", - "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "logic": { + "name": "logic", + "kind": "module", + "path": "docforge.cli.mkdocs.logic", + "signature": null, + "docstring": null, "members": { - "emit": { - "name": "emit", + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.Path", + "signature": "", + "docstring": null + }, + "resources": { + "name": "resources", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.resources", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.click", + "signature": "", + "docstring": null + }, + "yaml": { + "name": "yaml", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.yaml", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", "kind": "function", - "path": "docforge.cli.mkdocs.MkDocsNavEmitter.emit", - "signature": "", - "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + "path": "docforge.cli.mkdocs.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MkDocsRenderer": { + "name": "MkDocsRenderer", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer", + "signature": "", + "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.generate_sources", + "signature": "", + "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + } + } + }, + "load_nav_spec": { + "name": "load_nav_spec", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.load_nav_spec", + "signature": "", + "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." + }, + "resolve_nav": { + "name": "resolve_nav", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.resolve_nav", + "signature": "", + "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." + }, + "MkDocsNavEmitter": { + "name": "MkDocsNavEmitter", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter", + "signature": "", + "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "members": { + "emit": { + "name": "emit", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter.emit", + "signature": "", + "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + } + } + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_sources", + "signature": "", + "docstring": "Generate Markdown source files for the specified module." + }, + "generate_config": { + "name": "generate_config", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_config", + "signature": "", + "docstring": "Generate an mkdocs.yml configuration file." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.build", + "signature": "", + "docstring": "Build the documentation site using MkDocs." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.serve", + "signature": "", + "docstring": "Serve the documentation site with live-reload using MkDocs." } } - }, - "mkdocs_cmd": { - "name": "mkdocs_cmd", - "kind": "function", - "path": "docforge.cli.mkdocs.mkdocs_cmd", - "signature": "", - "docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site." - }, - "Any": { - "name": "Any", - "kind": "alias", - "path": "docforge.cli.mkdocs.Any", - "signature": "", - "docstring": null - }, - "Dict": { - "name": "Dict", - "kind": "alias", - "path": "docforge.cli.mkdocs.Dict", - "signature": "", - "docstring": null - }, - "Optional": { - "name": "Optional", - "kind": "alias", - "path": "docforge.cli.mkdocs.Optional", - "signature": "", - "docstring": null } } } diff --git a/mcp_docs/modules/docforge.cli.main.json b/mcp_docs/modules/docforge.cli.main.json index 16965a2..3536e12 100644 --- a/mcp_docs/modules/docforge.cli.main.json +++ b/mcp_docs/modules/docforge.cli.main.json @@ -2,173 +2,20 @@ "module": "docforge.cli.main", "content": { "path": "docforge.cli.main", - "docstring": "Main entry point for the doc-forge CLI. This module defines the core command\ngroup and the 'tree', 'generate', 'build', and 'serve' commands.", + "docstring": "Main entry point for the doc-forge CLI.", "objects": { - "Path": { - "name": "Path", - "kind": "alias", - "path": "docforge.cli.main.Path", - "signature": "", - "docstring": null - }, - "Sequence": { - "name": "Sequence", - "kind": "alias", - "path": "docforge.cli.main.Sequence", - "signature": "", - "docstring": null - }, - "Optional": { - "name": "Optional", - "kind": "alias", - "path": "docforge.cli.main.Optional", - "signature": "", - "docstring": null - }, - "click": { - "name": "click", - "kind": "alias", - "path": "docforge.cli.main.click", - "signature": "", - "docstring": null - }, - "GriffeLoader": { - "name": "GriffeLoader", - "kind": "class", - "path": "docforge.cli.main.GriffeLoader", - "signature": "", - "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", - "members": { - "load_project": { - "name": "load_project", - "kind": "function", - "path": "docforge.cli.main.GriffeLoader.load_project", - "signature": "", - "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." - }, - "load_module": { - "name": "load_module", - "kind": "function", - "path": "docforge.cli.main.GriffeLoader.load_module", - "signature": "", - "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." - } - } - }, - "discover_module_paths": { - "name": "discover_module_paths", - "kind": "function", - "path": "docforge.cli.main.discover_module_paths", - "signature": "", - "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." - }, - "MkDocsRenderer": { - "name": "MkDocsRenderer", - "kind": "class", - "path": "docforge.cli.main.MkDocsRenderer", - "signature": "", - "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", - "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.cli.main.MkDocsRenderer.name", - "signature": "", - "docstring": null - }, - "generate_sources": { - "name": "generate_sources", - "kind": "function", - "path": "docforge.cli.main.MkDocsRenderer.generate_sources", - "signature": "", - "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." - } - } - }, - "MCPRenderer": { - "name": "MCPRenderer", - "kind": "class", - "path": "docforge.cli.main.MCPRenderer", - "signature": "", - "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", - "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.cli.main.MCPRenderer.name", - "signature": "", - "docstring": null - }, - "generate_sources": { - "name": "generate_sources", - "kind": "function", - "path": "docforge.cli.main.MCPRenderer.generate_sources", - "signature": "", - "docstring": "Generate MCP-compatible JSON resources and navigation for the project." - } - } - }, - "mkdocs_cmd": { - "name": "mkdocs_cmd", - "kind": "function", - "path": "docforge.cli.main.mkdocs_cmd", - "signature": "", - "docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site." - }, "cli": { "name": "cli", "kind": "function", "path": "docforge.cli.main.cli", - "signature": "", + "signature": "", "docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation." }, - "tree": { - "name": "tree", - "kind": "function", - "path": "docforge.cli.main.tree", - "signature": "", - "docstring": "Visualize the project structure including modules and their members.\n\nArgs:\n modules: List of module paths to introspect.\n project_name: Optional project name override." - }, - "generate": { - "name": "generate", - "kind": "function", - "path": "docforge.cli.main.generate", - "signature": "", - "docstring": "Generate Markdown source files for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n docs_dir: Directory where documentation sources will be written." - }, - "generate_mcp": { - "name": "generate_mcp", - "kind": "function", - "path": "docforge.cli.main.generate_mcp", - "signature": "", - "docstring": "Generate MCP-compatible documentation resources for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n out_dir: Directory where MCP resources will be written." - }, - "build": { - "name": "build", - "kind": "function", - "path": "docforge.cli.main.build", - "signature": "", - "docstring": "Build the documentation site using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." - }, - "serve_mcp": { - "name": "serve_mcp", - "kind": "function", - "path": "docforge.cli.main.serve_mcp", - "signature": "", - "docstring": "Serve MCP documentation from the local mcp_docs directory." - }, - "serve": { - "name": "serve", - "kind": "function", - "path": "docforge.cli.main.serve", - "signature": "", - "docstring": "Serve the documentation site with live-reload using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." - }, "main": { "name": "main", "kind": "function", "path": "docforge.cli.main.main", - "signature": "", + "signature": "", "docstring": "CLI Entry point. Boots the click application." } } diff --git a/mcp_docs/modules/docforge.cli.mcp.json b/mcp_docs/modules/docforge.cli.mcp.json new file mode 100644 index 0000000..abc1b8e --- /dev/null +++ b/mcp_docs/modules/docforge.cli.mcp.json @@ -0,0 +1,129 @@ +{ + "module": "docforge.cli.mcp", + "content": { + "path": "docforge.cli.mcp", + "docstring": null, + "objects": { + "logic": { + "name": "logic", + "kind": "module", + "path": "docforge.cli.mcp.logic", + "signature": null, + "docstring": null, + "members": { + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mcp.logic.Path", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mcp.logic.click", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mcp.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.mcp.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MCPRenderer": { + "name": "MCPRenderer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPRenderer", + "signature": "", + "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPRenderer.generate_sources", + "signature": "", + "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + } + } + }, + "MCPServer": { + "name": "MCPServer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPServer", + "signature": "", + "docstring": "MCP server for serving a pre-built MCP documentation bundle.", + "members": { + "mcp_root": { + "name": "mcp_root", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.mcp_root", + "signature": "", + "docstring": null + }, + "app": { + "name": "app", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.app", + "signature": "", + "docstring": null + }, + "run": { + "name": "run", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPServer.run", + "signature": "", + "docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)" + } + } + }, + "generate_resources": { + "name": "generate_resources", + "kind": "function", + "path": "docforge.cli.mcp.logic.generate_resources", + "signature": "", + "docstring": "Generate MCP-compatible documentation resources." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mcp.logic.serve", + "signature": "", + "docstring": "Serve MCP documentation." + } + } + } + } + } +} \ No newline at end of file diff --git a/mcp_docs/modules/docforge.cli.mcp.logic.json b/mcp_docs/modules/docforge.cli.mcp.logic.json new file mode 100644 index 0000000..94f4006 --- /dev/null +++ b/mcp_docs/modules/docforge.cli.mcp.logic.json @@ -0,0 +1,120 @@ +{ + "module": "docforge.cli.mcp.logic", + "content": { + "path": "docforge.cli.mcp.logic", + "docstring": null, + "objects": { + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mcp.logic.Path", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mcp.logic.click", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mcp.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.mcp.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MCPRenderer": { + "name": "MCPRenderer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPRenderer", + "signature": "", + "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPRenderer.generate_sources", + "signature": "", + "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + } + } + }, + "MCPServer": { + "name": "MCPServer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPServer", + "signature": "", + "docstring": "MCP server for serving a pre-built MCP documentation bundle.", + "members": { + "mcp_root": { + "name": "mcp_root", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.mcp_root", + "signature": "", + "docstring": null + }, + "app": { + "name": "app", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.app", + "signature": "", + "docstring": null + }, + "run": { + "name": "run", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPServer.run", + "signature": "", + "docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)" + } + } + }, + "generate_resources": { + "name": "generate_resources", + "kind": "function", + "path": "docforge.cli.mcp.logic.generate_resources", + "signature": "", + "docstring": "Generate MCP-compatible documentation resources." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mcp.logic.serve", + "signature": "", + "docstring": "Serve MCP documentation." + } + } + } +} \ No newline at end of file diff --git a/mcp_docs/modules/docforge.cli.mkdocs.json b/mcp_docs/modules/docforge.cli.mkdocs.json index 0d1b09f..266b836 100644 --- a/mcp_docs/modules/docforge.cli.mkdocs.json +++ b/mcp_docs/modules/docforge.cli.mkdocs.json @@ -2,93 +2,155 @@ "module": "docforge.cli.mkdocs", "content": { "path": "docforge.cli.mkdocs", - "docstring": "This module contains the 'mkdocs' CLI command, which orchestrates the generation\nof the main mkdocs.yml configuration file.", + "docstring": null, "objects": { - "Path": { - "name": "Path", - "kind": "alias", - "path": "docforge.cli.mkdocs.Path", - "signature": "", - "docstring": null - }, - "resources": { - "name": "resources", - "kind": "alias", - "path": "docforge.cli.mkdocs.resources", - "signature": "", - "docstring": null - }, - "click": { - "name": "click", - "kind": "alias", - "path": "docforge.cli.mkdocs.click", - "signature": "", - "docstring": null - }, - "yaml": { - "name": "yaml", - "kind": "alias", - "path": "docforge.cli.mkdocs.yaml", - "signature": "", - "docstring": null - }, - "load_nav_spec": { - "name": "load_nav_spec", - "kind": "function", - "path": "docforge.cli.mkdocs.load_nav_spec", - "signature": "", - "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." - }, - "resolve_nav": { - "name": "resolve_nav", - "kind": "function", - "path": "docforge.cli.mkdocs.resolve_nav", - "signature": "", - "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." - }, - "MkDocsNavEmitter": { - "name": "MkDocsNavEmitter", - "kind": "class", - "path": "docforge.cli.mkdocs.MkDocsNavEmitter", - "signature": "", - "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "logic": { + "name": "logic", + "kind": "module", + "path": "docforge.cli.mkdocs.logic", + "signature": null, + "docstring": null, "members": { - "emit": { - "name": "emit", + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.Path", + "signature": "", + "docstring": null + }, + "resources": { + "name": "resources", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.resources", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.click", + "signature": "", + "docstring": null + }, + "yaml": { + "name": "yaml", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.yaml", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", "kind": "function", - "path": "docforge.cli.mkdocs.MkDocsNavEmitter.emit", - "signature": "", - "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + "path": "docforge.cli.mkdocs.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MkDocsRenderer": { + "name": "MkDocsRenderer", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer", + "signature": "", + "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.generate_sources", + "signature": "", + "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + } + } + }, + "load_nav_spec": { + "name": "load_nav_spec", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.load_nav_spec", + "signature": "", + "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." + }, + "resolve_nav": { + "name": "resolve_nav", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.resolve_nav", + "signature": "", + "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." + }, + "MkDocsNavEmitter": { + "name": "MkDocsNavEmitter", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter", + "signature": "", + "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "members": { + "emit": { + "name": "emit", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter.emit", + "signature": "", + "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + } + } + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_sources", + "signature": "", + "docstring": "Generate Markdown source files for the specified module." + }, + "generate_config": { + "name": "generate_config", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_config", + "signature": "", + "docstring": "Generate an mkdocs.yml configuration file." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.build", + "signature": "", + "docstring": "Build the documentation site using MkDocs." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.serve", + "signature": "", + "docstring": "Serve the documentation site with live-reload using MkDocs." } } - }, - "mkdocs_cmd": { - "name": "mkdocs_cmd", - "kind": "function", - "path": "docforge.cli.mkdocs.mkdocs_cmd", - "signature": "", - "docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site." - }, - "Any": { - "name": "Any", - "kind": "alias", - "path": "docforge.cli.mkdocs.Any", - "signature": "", - "docstring": null - }, - "Dict": { - "name": "Dict", - "kind": "alias", - "path": "docforge.cli.mkdocs.Dict", - "signature": "", - "docstring": null - }, - "Optional": { - "name": "Optional", - "kind": "alias", - "path": "docforge.cli.mkdocs.Optional", - "signature": "", - "docstring": null } } } diff --git a/mcp_docs/modules/docforge.cli.mkdocs.logic.json b/mcp_docs/modules/docforge.cli.mkdocs.logic.json new file mode 100644 index 0000000..e40f422 --- /dev/null +++ b/mcp_docs/modules/docforge.cli.mkdocs.logic.json @@ -0,0 +1,148 @@ +{ + "module": "docforge.cli.mkdocs.logic", + "content": { + "path": "docforge.cli.mkdocs.logic", + "docstring": null, + "objects": { + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.Path", + "signature": "", + "docstring": null + }, + "resources": { + "name": "resources", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.resources", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.click", + "signature": "", + "docstring": null + }, + "yaml": { + "name": "yaml", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.yaml", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MkDocsRenderer": { + "name": "MkDocsRenderer", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer", + "signature": "", + "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.generate_sources", + "signature": "", + "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + } + } + }, + "load_nav_spec": { + "name": "load_nav_spec", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.load_nav_spec", + "signature": "", + "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." + }, + "resolve_nav": { + "name": "resolve_nav", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.resolve_nav", + "signature": "", + "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." + }, + "MkDocsNavEmitter": { + "name": "MkDocsNavEmitter", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter", + "signature": "", + "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "members": { + "emit": { + "name": "emit", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter.emit", + "signature": "", + "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + } + } + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_sources", + "signature": "", + "docstring": "Generate Markdown source files for the specified module." + }, + "generate_config": { + "name": "generate_config", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_config", + "signature": "", + "docstring": "Generate an mkdocs.yml configuration file." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.build", + "signature": "", + "docstring": "Build the documentation site using MkDocs." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.serve", + "signature": "", + "docstring": "Serve the documentation site with live-reload using MkDocs." + } + } + } +} \ No newline at end of file diff --git a/mcp_docs/modules/docforge.json b/mcp_docs/modules/docforge.json index df5969d..f166173 100644 --- a/mcp_docs/modules/docforge.json +++ b/mcp_docs/modules/docforge.json @@ -85,119 +85,8 @@ "kind": "module", "path": "docforge.main", "signature": "", - "docstring": "Main entry point for the doc-forge CLI. This module defines the core command\ngroup and the 'tree', 'generate', 'build', and 'serve' commands.", + "docstring": "Main entry point for the doc-forge CLI.", "members": { - "Path": { - "name": "Path", - "kind": "alias", - "path": "docforge.main.Path", - "signature": "", - "docstring": null - }, - "Sequence": { - "name": "Sequence", - "kind": "alias", - "path": "docforge.main.Sequence", - "signature": "", - "docstring": null - }, - "Optional": { - "name": "Optional", - "kind": "alias", - "path": "docforge.main.Optional", - "signature": "", - "docstring": null - }, - "click": { - "name": "click", - "kind": "alias", - "path": "docforge.main.click", - "signature": "", - "docstring": null - }, - "GriffeLoader": { - "name": "GriffeLoader", - "kind": "class", - "path": "docforge.main.GriffeLoader", - "signature": "", - "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", - "members": { - "load_project": { - "name": "load_project", - "kind": "function", - "path": "docforge.main.GriffeLoader.load_project", - "signature": "", - "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." - }, - "load_module": { - "name": "load_module", - "kind": "function", - "path": "docforge.main.GriffeLoader.load_module", - "signature": "", - "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." - } - } - }, - "discover_module_paths": { - "name": "discover_module_paths", - "kind": "function", - "path": "docforge.main.discover_module_paths", - "signature": "", - "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." - }, - "MkDocsRenderer": { - "name": "MkDocsRenderer", - "kind": "class", - "path": "docforge.main.MkDocsRenderer", - "signature": "", - "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", - "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.main.MkDocsRenderer.name", - "signature": "", - "docstring": null - }, - "generate_sources": { - "name": "generate_sources", - "kind": "function", - "path": "docforge.main.MkDocsRenderer.generate_sources", - "signature": "", - "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." - } - } - }, - "MCPRenderer": { - "name": "MCPRenderer", - "kind": "class", - "path": "docforge.main.MCPRenderer", - "signature": "", - "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", - "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.main.MCPRenderer.name", - "signature": "", - "docstring": null - }, - "generate_sources": { - "name": "generate_sources", - "kind": "function", - "path": "docforge.main.MCPRenderer.generate_sources", - "signature": "", - "docstring": "Generate MCP-compatible JSON resources and navigation for the project." - } - } - }, - "mkdocs_cmd": { - "name": "mkdocs_cmd", - "kind": "function", - "path": "docforge.main.mkdocs_cmd", - "signature": "", - "docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site." - }, "cli": { "name": "cli", "kind": "function", @@ -205,48 +94,6 @@ "signature": "", "docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation." }, - "tree": { - "name": "tree", - "kind": "function", - "path": "docforge.main.tree", - "signature": "", - "docstring": "Visualize the project structure including modules and their members.\n\nArgs:\n modules: List of module paths to introspect.\n project_name: Optional project name override." - }, - "generate": { - "name": "generate", - "kind": "function", - "path": "docforge.main.generate", - "signature": "", - "docstring": "Generate Markdown source files for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n docs_dir: Directory where documentation sources will be written." - }, - "generate_mcp": { - "name": "generate_mcp", - "kind": "function", - "path": "docforge.main.generate_mcp", - "signature": "", - "docstring": "Generate MCP-compatible documentation resources for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n out_dir: Directory where MCP resources will be written." - }, - "build": { - "name": "build", - "kind": "function", - "path": "docforge.main.build", - "signature": "", - "docstring": "Build the documentation site using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." - }, - "serve_mcp": { - "name": "serve_mcp", - "kind": "function", - "path": "docforge.main.serve_mcp", - "signature": "", - "docstring": "Serve MCP documentation from the local mcp_docs directory." - }, - "serve": { - "name": "serve", - "kind": "function", - "path": "docforge.main.serve", - "signature": "", - "docstring": "Serve the documentation site with live-reload using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." - }, "main": { "name": "main", "kind": "function", @@ -268,174 +115,506 @@ "kind": "module", "path": "docforge.cli.main", "signature": null, - "docstring": "Main entry point for the doc-forge CLI. This module defines the core command\ngroup and the 'tree', 'generate', 'build', and 'serve' commands.", + "docstring": "Main entry point for the doc-forge CLI.", "members": { + "cli": { + "name": "cli", + "kind": "function", + "path": "docforge.cli.main.cli", + "signature": "", + "docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation." + }, + "main": { + "name": "main", + "kind": "function", + "path": "docforge.cli.main.main", + "signature": "", + "docstring": "CLI Entry point. Boots the click application." + } + } + }, + "commands": { + "name": "commands", + "kind": "module", + "path": "docforge.cli.commands", + "signature": null, + "docstring": null, + "members": { + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.click", + "signature": "", + "docstring": null + }, "Path": { "name": "Path", "kind": "alias", - "path": "docforge.cli.main.Path", + "path": "docforge.cli.commands.Path", "signature": "", "docstring": null }, "Sequence": { "name": "Sequence", "kind": "alias", - "path": "docforge.cli.main.Sequence", + "path": "docforge.cli.commands.Sequence", "signature": "", "docstring": null }, "Optional": { "name": "Optional", "kind": "alias", - "path": "docforge.cli.main.Optional", + "path": "docforge.cli.commands.Optional", "signature": "", "docstring": null }, - "click": { - "name": "click", - "kind": "alias", - "path": "docforge.cli.main.click", - "signature": "", - "docstring": null - }, "GriffeLoader": { "name": "GriffeLoader", "kind": "class", - "path": "docforge.cli.main.GriffeLoader", + "path": "docforge.cli.commands.GriffeLoader", "signature": "", "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", "members": { "load_project": { "name": "load_project", "kind": "function", - "path": "docforge.cli.main.GriffeLoader.load_project", + "path": "docforge.cli.commands.GriffeLoader.load_project", "signature": "", "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." }, "load_module": { "name": "load_module", "kind": "function", - "path": "docforge.cli.main.GriffeLoader.load_module", + "path": "docforge.cli.commands.GriffeLoader.load_module", "signature": "", "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." } } }, - "discover_module_paths": { - "name": "discover_module_paths", - "kind": "function", - "path": "docforge.cli.main.discover_module_paths", - "signature": "", - "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." - }, - "MkDocsRenderer": { - "name": "MkDocsRenderer", - "kind": "class", - "path": "docforge.cli.main.MkDocsRenderer", - "signature": "", - "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "mkdocs_logic": { + "name": "mkdocs_logic", + "kind": "module", + "path": "docforge.cli.commands.mkdocs_logic", + "signature": "", + "docstring": null, "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.cli.main.MkDocsRenderer.name", - "signature": "", + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.Path", + "signature": "", "docstring": null }, + "resources": { + "name": "resources", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.resources", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.click", + "signature": "", + "docstring": null + }, + "yaml": { + "name": "yaml", + "kind": "alias", + "path": "docforge.cli.commands.mkdocs_logic.yaml", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MkDocsRenderer": { + "name": "MkDocsRenderer", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer", + "signature": "", + "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsRenderer.generate_sources", + "signature": "", + "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + } + } + }, + "load_nav_spec": { + "name": "load_nav_spec", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.load_nav_spec", + "signature": "", + "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." + }, + "resolve_nav": { + "name": "resolve_nav", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.resolve_nav", + "signature": "", + "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." + }, + "MkDocsNavEmitter": { + "name": "MkDocsNavEmitter", + "kind": "class", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsNavEmitter", + "signature": "", + "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "members": { + "emit": { + "name": "emit", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.MkDocsNavEmitter.emit", + "signature": "", + "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + } + } + }, "generate_sources": { "name": "generate_sources", "kind": "function", - "path": "docforge.cli.main.MkDocsRenderer.generate_sources", - "signature": "", - "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + "path": "docforge.cli.commands.mkdocs_logic.generate_sources", + "signature": "", + "docstring": "Generate Markdown source files for the specified module." + }, + "generate_config": { + "name": "generate_config", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.generate_config", + "signature": "", + "docstring": "Generate an mkdocs.yml configuration file." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.build", + "signature": "", + "docstring": "Build the documentation site using MkDocs." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.commands.mkdocs_logic.serve", + "signature": "", + "docstring": "Serve the documentation site with live-reload using MkDocs." } } }, - "MCPRenderer": { - "name": "MCPRenderer", - "kind": "class", - "path": "docforge.cli.main.MCPRenderer", - "signature": "", - "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "mcp_logic": { + "name": "mcp_logic", + "kind": "module", + "path": "docforge.cli.commands.mcp_logic", + "signature": "", + "docstring": null, "members": { - "name": { - "name": "name", - "kind": "attribute", - "path": "docforge.cli.main.MCPRenderer.name", - "signature": "", + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.commands.mcp_logic.Path", + "signature": "", "docstring": null }, - "generate_sources": { - "name": "generate_sources", + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.commands.mcp_logic.click", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", "kind": "function", - "path": "docforge.cli.main.MCPRenderer.generate_sources", - "signature": "", - "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + "path": "docforge.cli.commands.mcp_logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MCPRenderer": { + "name": "MCPRenderer", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer", + "signature": "", + "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.MCPRenderer.generate_sources", + "signature": "", + "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + } + } + }, + "MCPServer": { + "name": "MCPServer", + "kind": "class", + "path": "docforge.cli.commands.mcp_logic.MCPServer", + "signature": "", + "docstring": "MCP server for serving a pre-built MCP documentation bundle.", + "members": { + "mcp_root": { + "name": "mcp_root", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPServer.mcp_root", + "signature": "", + "docstring": null + }, + "app": { + "name": "app", + "kind": "attribute", + "path": "docforge.cli.commands.mcp_logic.MCPServer.app", + "signature": "", + "docstring": null + }, + "run": { + "name": "run", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.MCPServer.run", + "signature": "", + "docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)" + } + } + }, + "generate_resources": { + "name": "generate_resources", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.generate_resources", + "signature": "", + "docstring": "Generate MCP-compatible documentation resources." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.commands.mcp_logic.serve", + "signature": "", + "docstring": "Serve MCP documentation." } } }, - "mkdocs_cmd": { - "name": "mkdocs_cmd", - "kind": "function", - "path": "docforge.cli.main.mkdocs_cmd", - "signature": "", - "docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site." - }, "cli": { "name": "cli", "kind": "function", - "path": "docforge.cli.main.cli", - "signature": "", + "path": "docforge.cli.commands.cli", + "signature": "", "docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation." }, - "tree": { - "name": "tree", - "kind": "function", - "path": "docforge.cli.main.tree", - "signature": "", - "docstring": "Visualize the project structure including modules and their members.\n\nArgs:\n modules: List of module paths to introspect.\n project_name: Optional project name override." - }, - "generate": { - "name": "generate", - "kind": "function", - "path": "docforge.cli.main.generate", - "signature": "", - "docstring": "Generate Markdown source files for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n docs_dir: Directory where documentation sources will be written." - }, - "generate_mcp": { - "name": "generate_mcp", - "kind": "function", - "path": "docforge.cli.main.generate_mcp", - "signature": "", - "docstring": "Generate MCP-compatible documentation resources for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n out_dir: Directory where MCP resources will be written." - }, "build": { "name": "build", "kind": "function", - "path": "docforge.cli.main.build", - "signature": "", - "docstring": "Build the documentation site using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." - }, - "serve_mcp": { - "name": "serve_mcp", - "kind": "function", - "path": "docforge.cli.main.serve_mcp", - "signature": "", - "docstring": "Serve MCP documentation from the local mcp_docs directory." + "path": "docforge.cli.commands.build", + "signature": "", + "docstring": "Build documentation (MkDocs site or MCP resources)." }, "serve": { "name": "serve", "kind": "function", - "path": "docforge.cli.main.serve", - "signature": "", - "docstring": "Serve the documentation site with live-reload using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file." + "path": "docforge.cli.commands.serve", + "signature": "", + "docstring": "Serve documentation." }, - "main": { - "name": "main", + "tree": { + "name": "tree", "kind": "function", - "path": "docforge.cli.main.main", - "signature": "", - "docstring": "CLI Entry point. Boots the click application." + "path": "docforge.cli.commands.tree", + "signature": "", + "docstring": "Visualize the project structure." + } + } + }, + "mcp": { + "name": "mcp", + "kind": "module", + "path": "docforge.cli.mcp", + "signature": null, + "docstring": null, + "members": { + "logic": { + "name": "logic", + "kind": "module", + "path": "docforge.cli.mcp.logic", + "signature": null, + "docstring": null, + "members": { + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mcp.logic.Path", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mcp.logic.click", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mcp.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mcp.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", + "kind": "function", + "path": "docforge.cli.mcp.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MCPRenderer": { + "name": "MCPRenderer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPRenderer", + "signature": "", + "docstring": "Renderer that emits MCP-native JSON resources from docforge models.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPRenderer.generate_sources", + "signature": "", + "docstring": "Generate MCP-compatible JSON resources and navigation for the project." + } + } + }, + "MCPServer": { + "name": "MCPServer", + "kind": "class", + "path": "docforge.cli.mcp.logic.MCPServer", + "signature": "", + "docstring": "MCP server for serving a pre-built MCP documentation bundle.", + "members": { + "mcp_root": { + "name": "mcp_root", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.mcp_root", + "signature": "", + "docstring": null + }, + "app": { + "name": "app", + "kind": "attribute", + "path": "docforge.cli.mcp.logic.MCPServer.app", + "signature": "", + "docstring": null + }, + "run": { + "name": "run", + "kind": "function", + "path": "docforge.cli.mcp.logic.MCPServer.run", + "signature": "", + "docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)" + } + } + }, + "generate_resources": { + "name": "generate_resources", + "kind": "function", + "path": "docforge.cli.mcp.logic.generate_resources", + "signature": "", + "docstring": "Generate MCP-compatible documentation resources." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mcp.logic.serve", + "signature": "", + "docstring": "Serve MCP documentation." + } + } } } }, @@ -444,93 +623,155 @@ "kind": "module", "path": "docforge.cli.mkdocs", "signature": null, - "docstring": "This module contains the 'mkdocs' CLI command, which orchestrates the generation\nof the main mkdocs.yml configuration file.", + "docstring": null, "members": { - "Path": { - "name": "Path", - "kind": "alias", - "path": "docforge.cli.mkdocs.Path", - "signature": "", - "docstring": null - }, - "resources": { - "name": "resources", - "kind": "alias", - "path": "docforge.cli.mkdocs.resources", - "signature": "", - "docstring": null - }, - "click": { - "name": "click", - "kind": "alias", - "path": "docforge.cli.mkdocs.click", - "signature": "", - "docstring": null - }, - "yaml": { - "name": "yaml", - "kind": "alias", - "path": "docforge.cli.mkdocs.yaml", - "signature": "", - "docstring": null - }, - "load_nav_spec": { - "name": "load_nav_spec", - "kind": "function", - "path": "docforge.cli.mkdocs.load_nav_spec", - "signature": "", - "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." - }, - "resolve_nav": { - "name": "resolve_nav", - "kind": "function", - "path": "docforge.cli.mkdocs.resolve_nav", - "signature": "", - "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." - }, - "MkDocsNavEmitter": { - "name": "MkDocsNavEmitter", - "kind": "class", - "path": "docforge.cli.mkdocs.MkDocsNavEmitter", - "signature": "", - "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "logic": { + "name": "logic", + "kind": "module", + "path": "docforge.cli.mkdocs.logic", + "signature": null, + "docstring": null, "members": { - "emit": { - "name": "emit", + "Path": { + "name": "Path", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.Path", + "signature": "", + "docstring": null + }, + "resources": { + "name": "resources", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.resources", + "signature": "", + "docstring": null + }, + "click": { + "name": "click", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.click", + "signature": "", + "docstring": null + }, + "yaml": { + "name": "yaml", + "kind": "alias", + "path": "docforge.cli.mkdocs.logic.yaml", + "signature": "", + "docstring": null + }, + "GriffeLoader": { + "name": "GriffeLoader", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.GriffeLoader", + "signature": "", + "docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.", + "members": { + "load_project": { + "name": "load_project", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_project", + "signature": "", + "docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules." + }, + "load_module": { + "name": "load_module", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.GriffeLoader.load_module", + "signature": "", + "docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance." + } + } + }, + "discover_module_paths": { + "name": "discover_module_paths", "kind": "function", - "path": "docforge.cli.mkdocs.MkDocsNavEmitter.emit", - "signature": "", - "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + "path": "docforge.cli.mkdocs.logic.discover_module_paths", + "signature": "", + "docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths." + }, + "MkDocsRenderer": { + "name": "MkDocsRenderer", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer", + "signature": "", + "docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.", + "members": { + "name": { + "name": "name", + "kind": "attribute", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.name", + "signature": "", + "docstring": null + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsRenderer.generate_sources", + "signature": "", + "docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files." + } + } + }, + "load_nav_spec": { + "name": "load_nav_spec", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.load_nav_spec", + "signature": "", + "docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance." + }, + "resolve_nav": { + "name": "resolve_nav", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.resolve_nav", + "signature": "", + "docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist." + }, + "MkDocsNavEmitter": { + "name": "MkDocsNavEmitter", + "kind": "class", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter", + "signature": "", + "docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.", + "members": { + "emit": { + "name": "emit", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.MkDocsNavEmitter.emit", + "signature": "", + "docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation." + } + } + }, + "generate_sources": { + "name": "generate_sources", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_sources", + "signature": "", + "docstring": "Generate Markdown source files for the specified module." + }, + "generate_config": { + "name": "generate_config", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.generate_config", + "signature": "", + "docstring": "Generate an mkdocs.yml configuration file." + }, + "build": { + "name": "build", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.build", + "signature": "", + "docstring": "Build the documentation site using MkDocs." + }, + "serve": { + "name": "serve", + "kind": "function", + "path": "docforge.cli.mkdocs.logic.serve", + "signature": "", + "docstring": "Serve the documentation site with live-reload using MkDocs." } } - }, - "mkdocs_cmd": { - "name": "mkdocs_cmd", - "kind": "function", - "path": "docforge.cli.mkdocs.mkdocs_cmd", - "signature": "", - "docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site." - }, - "Any": { - "name": "Any", - "kind": "alias", - "path": "docforge.cli.mkdocs.Any", - "signature": "", - "docstring": null - }, - "Dict": { - "name": "Dict", - "kind": "alias", - "path": "docforge.cli.mkdocs.Dict", - "signature": "", - "docstring": null - }, - "Optional": { - "name": "Optional", - "kind": "alias", - "path": "docforge.cli.mkdocs.Optional", - "signature": "", - "docstring": null } } } diff --git a/mcp_docs/nav.json b/mcp_docs/nav.json index c64d959..597961a 100644 --- a/mcp_docs/nav.json +++ b/mcp_docs/nav.json @@ -7,14 +7,30 @@ "module": "docforge.cli", "resource": "doc://modules/docforge.cli" }, + { + "module": "docforge.cli.commands", + "resource": "doc://modules/docforge.cli.commands" + }, { "module": "docforge.cli.main", "resource": "doc://modules/docforge.cli.main" }, + { + "module": "docforge.cli.mcp", + "resource": "doc://modules/docforge.cli.mcp" + }, + { + "module": "docforge.cli.mcp.logic", + "resource": "doc://modules/docforge.cli.mcp.logic" + }, { "module": "docforge.cli.mkdocs", "resource": "doc://modules/docforge.cli.mkdocs" }, + { + "module": "docforge.cli.mkdocs.logic", + "resource": "doc://modules/docforge.cli.mkdocs.logic" + }, { "module": "docforge.loaders", "resource": "doc://modules/docforge.loaders" diff --git a/mkdocs.yml b/mkdocs.yml index 36df731..46de294 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,3 @@ -site_name: DocForge - theme: name: material palette: @@ -33,7 +31,7 @@ plugins: annotations_path: brief show_root_heading: true group_by_category: true - +site_name: docforge nav: - Home: docforge/index.md - Loaders: @@ -57,4 +55,8 @@ nav: - CLI: - docforge/cli/index.md - docforge/cli/main.md - - docforge/cli/mkdocs.md + - docforge/cli/commands.md + - docforge/cli/mcp/index.md + - docforge/cli/mcp/logic.md + - docforge/cli/mkdocs/index.md + - docforge/cli/mkdocs/logic.md diff --git a/tests/cli/conftest.py b/tests/cli/conftest.py deleted file mode 100644 index bcfc154..0000000 --- a/tests/cli/conftest.py +++ /dev/null @@ -1,111 +0,0 @@ -import json -import pytest -from pathlib import Path - -from click.testing import CliRunner - - -@pytest.fixture -def cli_runner() -> CliRunner: - """Click CLI runner.""" - return CliRunner() - - -@pytest.fixture -def fake_mkdocs_yml(tmp_path: Path) -> Path: - """Create a minimal mkdocs.yml file.""" - yml = tmp_path / "mkdocs.yml" - yml.write_text( - """ -site_name: Test Docs -nav: [] -plugins: - - mkdocstrings -""", - encoding="utf-8", - ) - return yml - - -@pytest.fixture -def mock_mkdocs_load_config(monkeypatch): - """Mock mkdocs.config.load_config.""" - def fake_load_config(path): - return object() # dummy config object - - monkeypatch.setattr( - "mkdocs.config.load_config", - fake_load_config, - ) - - -@pytest.fixture -def mock_mkdocs_build(monkeypatch): - called = {"value": False} - - def fake_build(config): - called["value"] = True - - monkeypatch.setattr( - "mkdocs.commands.build.build", - fake_build, - ) - return lambda: called["value"] - - -@pytest.fixture -def mock_mkdocs_serve(monkeypatch): - called = {"value": False} - - def fake_serve(*args, **kwargs): - called["value"] = True - - monkeypatch.setattr( - "mkdocs.commands.serve.serve", - fake_serve, - ) - return lambda: called["value"] - -@pytest.fixture -def fake_mcp_docs(tmp_path: Path) -> Path: - """ - Create a minimal valid MCP bundle in mcp_docs/. - """ - mcp_root = tmp_path / "mcp_docs" - modules_dir = mcp_root / "modules" - modules_dir.mkdir(parents=True) - - (mcp_root / "index.json").write_text( - json.dumps({"project": "test", "type": "docforge-model"}), - encoding="utf-8", - ) - - (mcp_root / "nav.json").write_text( - json.dumps([]), - encoding="utf-8", - ) - - (modules_dir / "test.mod.json").write_text( - json.dumps({"module": "test.mod", "content": {}}), - encoding="utf-8", - ) - - return mcp_root - - -@pytest.fixture -def mock_mcp_server_run(monkeypatch): - """ - Mock MCPServer.run so no real server is started. - """ - called = {"value": False} - - def fake_run(self, transport="streamable-http"): - called["value"] = True - - monkeypatch.setattr( - "docforge.servers.MCPServer.run", - fake_run, - ) - - return lambda: called["value"] diff --git a/tests/cli/test_build.py b/tests/cli/test_build.py deleted file mode 100644 index 2494141..0000000 --- a/tests/cli/test_build.py +++ /dev/null @@ -1,20 +0,0 @@ -from docforge.cli.main import cli - - -def test_build_command( - cli_runner, - fake_mkdocs_yml, - mock_mkdocs_load_config, - mock_mkdocs_build, -): - result = cli_runner.invoke( - cli, - [ - "build", - "--mkdocs-yml", - str(fake_mkdocs_yml), - ], - ) - - assert result.exit_code == 0 - assert mock_mkdocs_build() is True diff --git a/tests/cli/test_generate.py b/tests/cli/test_build_mcp.py similarity index 54% rename from tests/cli/test_generate.py rename to tests/cli/test_build_mcp.py index c00b5ba..61e820a 100644 --- a/tests/cli/test_generate.py +++ b/tests/cli/test_build_mcp.py @@ -1,35 +1,31 @@ +import json from pathlib import Path - +from click.testing import CliRunner from docforge.cli.main import cli - -def test_generate_command(cli_runner): +def test_mcp_build(cli_runner): with cli_runner.isolated_filesystem(): cwd = Path.cwd() - - # Create package structure pkg = cwd / "testpkg" pkg.mkdir() (pkg / "__init__.py").write_text("") (pkg / "mod.py").write_text("def f(): ...\n") - docs_dir = cwd / "docs" + out_dir = cwd / "mcp_docs" result = cli_runner.invoke( cli, [ - "generate", + "build", + "--mcp", "--module", "testpkg", - "--docs-dir", - str(docs_dir), + "--out-dir", + str(out_dir), ], ) assert result.exit_code == 0 - - md = docs_dir / "testpkg" / "mod.md" - assert md.exists() - - content = md.read_text() - assert "::: testpkg.mod" in content + assert (out_dir / "index.json").exists() + assert (out_dir / "nav.json").exists() + assert (out_dir / "modules" / "testpkg.mod.json").exists() diff --git a/tests/cli/test_build_mkdocs.py b/tests/cli/test_build_mkdocs.py new file mode 100644 index 0000000..c0f6bdf --- /dev/null +++ b/tests/cli/test_build_mkdocs.py @@ -0,0 +1,54 @@ +from pathlib import Path +from docforge.cli.main import cli + +def test_mkdocs_build_full_flow( + cli_runner, + mock_mkdocs_build, + mock_mkdocs_load_config, + tmp_path, +): + # This test covers what used to be generate + mkdocs + build + with cli_runner.isolated_filesystem(): + cwd = Path.cwd() + pkg = cwd / "testpkg" + pkg.mkdir() + (pkg / "__init__.py").write_text("") + (pkg / "mod.py").write_text("def f(): ...\n") + + nav_file = cwd / "docforge.nav.yml" + nav_file.write_text("home: testpkg/index.md\ngroups: {}\n") + + # We need to create a dummy testpkg/index.md for nav resolution if it's there + # But generate_sources will create it. + # Wait, the current logic runs generate_sources first, THEN generate_config. + + result = cli_runner.invoke( + cli, + [ + "build", + "--mkdocs", + "--module", + "testpkg", + "--site-name", + "Test Site", + "--docs-dir", + "docs", + "--mkdocs-yml", + "mkdocs.yml", + ], + ) + + assert result.exit_code == 0 + assert mock_mkdocs_build() is True + assert (cwd / "mkdocs.yml").exists() + assert (cwd / "docs" / "testpkg" / "mod.md").exists() + +def test_mkdocs_build_missing_module_fails(cli_runner): + result = cli_runner.invoke(cli, ["build", "--mkdocs", "--site-name", "Test"]) + assert result.exit_code != 0 + assert "--module is required" in result.output + +def test_mkdocs_build_missing_site_name_fails(cli_runner): + result = cli_runner.invoke(cli, ["build", "--mkdocs", "--module", "testpkg"]) + assert result.exit_code != 0 + assert "--site-name is required" in result.output diff --git a/tests/cli/test_mkdocs.py b/tests/cli/test_mkdocs.py deleted file mode 100644 index 733eae7..0000000 --- a/tests/cli/test_mkdocs.py +++ /dev/null @@ -1,123 +0,0 @@ -from pathlib import Path - -import yaml -from click.testing import CliRunner - -from docforge.cli.main import cli - - -def _write_nav_spec(path: Path) -> None: - path.write_text( - """ -home: openapi_first/index.md -groups: - Core: - - openapi_first/app.md - - openapi_first/client.md -""".strip(), - encoding="utf-8", - ) - - -def _write_docs(docs: Path) -> None: - files = [ - "openapi_first/index.md", - "openapi_first/app.md", - "openapi_first/client.md", - ] - for rel in files: - p = docs / rel - p.parent.mkdir(parents=True, exist_ok=True) - p.write_text(f"# {rel}", encoding="utf-8") - - -def test_mkdocs_uses_builtin_template(tmp_path: Path) -> None: - docs = tmp_path / "docs" - docs.mkdir() - - nav_file = tmp_path / "docforge.nav.yml" - out_file = tmp_path / "mkdocs.yml" - - _write_docs(docs) - _write_nav_spec(nav_file) - - runner = CliRunner() - result = runner.invoke( - cli, - [ - "mkdocs", - "--site-name", - "DocForge", - "--docs-dir", - str(docs), - "--nav", - str(nav_file), - "--out", - str(out_file), - ], - ) - - assert result.exit_code == 0 - assert out_file.exists() - - -def test_mkdocs_overrides_template(tmp_path: Path) -> None: - docs = tmp_path / "docs" - docs.mkdir() - - nav_file = tmp_path / "docforge.nav.yml" - template = tmp_path / "custom.yml" - out_file = tmp_path / "mkdocs.yml" - - _write_docs(docs) - _write_nav_spec(nav_file) - - template.write_text( - """ -site_name: Custom Site -theme: - name: readthedocs -""".strip(), - encoding="utf-8", - ) - - runner = CliRunner() - result = runner.invoke( - cli, - [ - "mkdocs", - "--site-name", - "Override Site", - "--docs-dir", - str(docs), - "--nav", - str(nav_file), - "--template", - str(template), - "--out", - str(out_file), - ], - ) - - assert result.exit_code == 0 - assert out_file.exists() - - -def test_mkdocs_missing_nav_fails(tmp_path: Path) -> None: - docs = tmp_path / "docs" - docs.mkdir() - - runner = CliRunner() - result = runner.invoke( - cli, - [ - "mkdocs", - "--site-name", - "DocForge", - "--docs-dir", - str(docs), - ], - ) - - assert result.exit_code != 0 - assert "Nav spec not found" in result.output diff --git a/tests/cli/test_mcp_serve.py b/tests/cli/test_serve_mcp.py similarity index 77% rename from tests/cli/test_mcp_serve.py rename to tests/cli/test_serve_mcp.py index 1f9b4d4..27e6f6f 100644 --- a/tests/cli/test_mcp_serve.py +++ b/tests/cli/test_serve_mcp.py @@ -1,7 +1,6 @@ from docforge.cli.main import cli - -def test_serve_mcp( +def test_mcp_serve( cli_runner, fake_mcp_docs, mock_mcp_server_run, @@ -11,7 +10,7 @@ def test_serve_mcp( result = cli_runner.invoke( cli, - ["serve-mcp"], + ["serve", "--mcp", "--out-dir", str(fake_mcp_docs)], ) assert result.exit_code == 0 diff --git a/tests/cli/test_serve.py b/tests/cli/test_serve_mkdocs.py similarity index 87% rename from tests/cli/test_serve.py rename to tests/cli/test_serve_mkdocs.py index 5c30edd..7ac9261 100644 --- a/tests/cli/test_serve.py +++ b/tests/cli/test_serve_mkdocs.py @@ -1,7 +1,6 @@ from docforge.cli.main import cli - -def test_serve_command( +def test_mkdocs_serve( cli_runner, fake_mkdocs_yml, mock_mkdocs_serve, @@ -10,6 +9,7 @@ def test_serve_command( cli, [ "serve", + "--mkdocs", "--mkdocs-yml", str(fake_mkdocs_yml), ], diff --git a/tests/cli/test_tree.py b/tests/cli/test_tree.py deleted file mode 100644 index c26205c..0000000 --- a/tests/cli/test_tree.py +++ /dev/null @@ -1,24 +0,0 @@ -from docforge.cli.main import cli - - -def test_tree_command(cli_runner, temp_package): - (temp_package / "mod.py").write_text( - ''' -class A: - def f(self): ... -''' - ) - - result = cli_runner.invoke( - cli, - [ - "tree", - "--modules", - "testpkg.mod", - ], - ) - - assert result.exit_code == 0 - assert "testpkg" in result.output - assert "mod" in result.output - assert "A" in result.output diff --git a/tests/conftest.py b/tests/conftest.py index ab2c7fb..e3973b7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,9 @@ import sys +import json +import pytest from pathlib import Path -import pytest +from click.testing import CliRunner @pytest.fixture @@ -16,3 +18,109 @@ def temp_package(tmp_path: Path): sys.path.insert(0, str(tmp_path)) yield pkg sys.path.remove(str(tmp_path)) + + +@pytest.fixture +def cli_runner() -> CliRunner: + """Click CLI runner.""" + return CliRunner() + + +@pytest.fixture +def fake_mkdocs_yml(tmp_path: Path) -> Path: + """Create a minimal mkdocs.yml file.""" + yml = tmp_path / "mkdocs.yml" + yml.write_text( + """ +site_name: Test Docs +nav: [] +plugins: + - mkdocstrings +""", + encoding="utf-8", + ) + return yml + + +@pytest.fixture +def mock_mkdocs_load_config(monkeypatch): + """Mock mkdocs.config.load_config.""" + def fake_load_config(path): + return object() # dummy config object + + monkeypatch.setattr( + "mkdocs.config.load_config", + fake_load_config, + ) + + +@pytest.fixture +def mock_mkdocs_build(monkeypatch): + called = {"value": False} + + def fake_build(config): + called["value"] = True + + monkeypatch.setattr( + "mkdocs.commands.build.build", + fake_build, + ) + return lambda: called["value"] + + +@pytest.fixture +def mock_mkdocs_serve(monkeypatch): + called = {"value": False} + + def fake_serve(*args, **kwargs): + called["value"] = True + + monkeypatch.setattr( + "mkdocs.commands.serve.serve", + fake_serve, + ) + return lambda: called["value"] + +@pytest.fixture +def fake_mcp_docs(tmp_path: Path) -> Path: + """ + Create a minimal valid MCP bundle in mcp_docs/. + """ + mcp_root = tmp_path / "mcp_docs" + modules_dir = mcp_root / "modules" + modules_dir.mkdir(parents=True) + + (mcp_root / "index.json").write_text( + json.dumps({"project": "test", "type": "docforge-model"}), + encoding="utf-8", + ) + + (mcp_root / "nav.json").write_text( + json.dumps([]), + encoding="utf-8", + ) + + (modules_dir / "test.mod.json").write_text( + json.dumps({"module": "test.mod", "content": {}}), + encoding="utf-8", + ) + + return mcp_root + + +@pytest.fixture +def mock_mcp_server_run(monkeypatch): + """ + Mock MCPServer.run so no real server is started. + """ + called = {"value": False} + + def fake_run(self, transport="streamable-http"): + called["value"] = True + + monkeypatch.setattr( + "docforge.servers.MCPServer.run", + fake_run, + ) + + return lambda: called["value"]