deepdoc 2.3.6__tar.gz → 3.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {deepdoc-2.3.6 → deepdoc-3.1.0}/PKG-INFO +46 -46
  2. {deepdoc-2.3.6 → deepdoc-3.1.0}/README.md +40 -45
  3. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/__init__.py +1 -1
  4. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/changelog_writer.py +6 -8
  5. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/answer_mixin.py +3 -3
  6. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/deep_research.py +33 -3
  7. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/retrieval_mixin.py +3 -1
  8. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/routes.py +13 -86
  9. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/scaffold.py +4 -8
  10. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/service.py +39 -98
  11. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/settings.py +5 -6
  12. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/cli.py +54 -99
  13. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/config.py +5 -6
  14. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/__init__.py +0 -2
  15. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/consistency.py +4 -2
  16. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/generation.py +21 -47
  17. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/post_processors.py +30 -194
  18. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/__init__.py +2 -1
  19. deepdoc-3.1.0/deepdoc/llm/retry.py +100 -0
  20. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/openapi.py +0 -22
  21. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/persistence_v2.py +0 -6
  22. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/pipeline_v2.py +14 -41
  23. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/bucket_types.py +14 -14
  24. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/page_types.py +6 -5
  25. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/system.py +42 -52
  26. deepdoc-3.1.0/deepdoc/site/builder/__init__.py +3 -0
  27. deepdoc-3.1.0/deepdoc/site/builder/mkdocs_builder.py +1936 -0
  28. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/smart_update_v2.py +3 -3
  29. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/updater_v2.py +4 -4
  30. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/PKG-INFO +46 -46
  31. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/SOURCES.txt +4 -5
  32. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/requires.txt +6 -0
  33. {deepdoc-2.3.6 → deepdoc-3.1.0}/pyproject.toml +7 -1
  34. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_changelog.py +3 -3
  35. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_config.py +6 -6
  36. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_query.py +20 -18
  37. deepdoc-3.1.0/tests/test_chatbot_scaffold.py +40 -0
  38. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_cli_serve.py +17 -36
  39. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_consistency_pass.py +3 -3
  40. deepdoc-3.1.0/tests/test_llm_retry.py +90 -0
  41. deepdoc-2.3.6/tests/test_fumadocs_builder.py → deepdoc-3.1.0/tests/test_mkdocs_builder.py +152 -209
  42. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_planner_granularity.py +7 -9
  43. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_smart_update.py +0 -2
  44. deepdoc-2.3.6/deepdoc/site/builder/__init__.py +0 -4
  45. deepdoc-2.3.6/deepdoc/site/builder/chatbot_components.py +0 -1318
  46. deepdoc-2.3.6/deepdoc/site/builder/engine.py +0 -572
  47. deepdoc-2.3.6/deepdoc/site/builder/scaffold_files.py +0 -1960
  48. deepdoc-2.3.6/deepdoc/site/builder/templates.py +0 -32
  49. deepdoc-2.3.6/tests/test_chatbot_scaffold.py +0 -190
  50. {deepdoc-2.3.6 → deepdoc-3.1.0}/LICENSE +0 -0
  51. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/__main__.py +0 -0
  52. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/benchmark_v2.py +0 -0
  53. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/call_graph.py +0 -0
  54. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/__init__.py +0 -0
  55. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/chunker.py +0 -0
  56. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/constants.py +0 -0
  57. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/docs_summary.py +0 -0
  58. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/embeddings.py +0 -0
  59. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/indexer.py +0 -0
  60. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/linking.py +0 -0
  61. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/live_fallback_mixin.py +0 -0
  62. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/persistence.py +0 -0
  63. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/providers.py +0 -0
  64. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/source_archive.py +0 -0
  65. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/symbol_index.py +0 -0
  66. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/types.py +0 -0
  67. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/evidence.py +0 -0
  68. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/validation.py +0 -0
  69. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/client.py +0 -0
  70. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/json_utils.py +0 -0
  71. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/litellm_compat.py +0 -0
  72. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/manifest.py +0 -0
  73. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/__init__.py +0 -0
  74. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/api_detector.py +0 -0
  75. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/base.py +0 -0
  76. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/go_parser.py +0 -0
  77. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/js_ts_parser.py +0 -0
  78. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/php_parser.py +0 -0
  79. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/python_parser.py +0 -0
  80. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/registry.py +0 -0
  81. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/__init__.py +0 -0
  82. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/base.py +0 -0
  83. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/common.py +0 -0
  84. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/detector.py +0 -0
  85. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/django.py +0 -0
  86. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/express.py +0 -0
  87. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/falcon.py +0 -0
  88. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/fastify.py +0 -0
  89. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/go.py +0 -0
  90. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/js_shared.py +0 -0
  91. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/laravel.py +0 -0
  92. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/nestjs.py +0 -0
  93. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/python_shared.py +0 -0
  94. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/registry.py +0 -0
  95. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/repo_resolver.py +0 -0
  96. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/vue_parser.py +0 -0
  97. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/__init__.py +0 -0
  98. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/bucket_injection.py +0 -0
  99. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/bucket_refinement.py +0 -0
  100. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/common.py +0 -0
  101. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/endpoint_refs.py +0 -0
  102. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/engine.py +0 -0
  103. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/flow_candidates.py +0 -0
  104. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/heuristics.py +0 -0
  105. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/nav_shaping.py +0 -0
  106. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/specializations.py +0 -0
  107. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/topology.py +0 -0
  108. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/utils.py +0 -0
  109. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/__init__.py +0 -0
  110. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/selectors.py +0 -0
  111. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/update.py +0 -0
  112. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/py.typed +0 -0
  113. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/__init__.py +0 -0
  114. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/artifacts.py +0 -0
  115. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/clustering.py +0 -0
  116. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/common.py +0 -0
  117. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/database.py +0 -0
  118. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/endpoints.py +0 -0
  119. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/integrations.py +0 -0
  120. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/runtime.py +0 -0
  121. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/utils.py +0 -0
  122. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/site/__init__.py +0 -0
  123. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/site/builder/common.py +0 -0
  124. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/site/builder/mdx_utils.py +0 -0
  125. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/source_metadata.py +0 -0
  126. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/v2_models.py +0 -0
  127. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/dependency_links.txt +0 -0
  128. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/entry_points.txt +0 -0
  129. {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/top_level.txt +0 -0
  130. {deepdoc-2.3.6 → deepdoc-3.1.0}/setup.cfg +0 -0
  131. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_benchmark_scorecard.py +0 -0
  132. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_call_graph.py +0 -0
  133. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_embeddings.py +0 -0
  134. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_eval.py +0 -0
  135. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_index.py +0 -0
  136. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_persistence.py +0 -0
  137. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_providers.py +0 -0
  138. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_relationship.py +0 -0
  139. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_source_archive.py +0 -0
  140. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_classify.py +0 -0
  141. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_cli_generate.py +0 -0
  142. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_cli_update.py +0 -0
  143. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_flow_candidates.py +0 -0
  144. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_framework_fixtures.py +0 -0
  145. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_framework_support.py +0 -0
  146. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_generation_evidence.py +0 -0
  147. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_internal_docs_metadata.py +0 -0
  148. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_litellm_compat.py +0 -0
  149. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_llm_json_utils.py +0 -0
  150. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_parallel_pipeline.py +0 -0
  151. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_parser_ranges.py +0 -0
  152. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_planner_consolidation.py +0 -0
  153. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_route_registry.py +0 -0
  154. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_runtime_scan.py +0 -0
  155. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_stale.py +0 -0
  156. {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_state.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepdoc
3
- Version: 2.3.6
3
+ Version: 3.1.0
4
4
  Summary: Auto-generate beautiful docs from any codebase
5
5
  Author: Pranav Kumar
6
6
  License: MIT
@@ -35,6 +35,11 @@ Requires-Dist: fastapi>=0.115; extra == "chatbot"
35
35
  Requires-Dist: uvicorn>=0.30; extra == "chatbot"
36
36
  Requires-Dist: httpx>=0.27; extra == "chatbot"
37
37
  Requires-Dist: fastembed>=0.3.0; extra == "chatbot"
38
+ Provides-Extra: site
39
+ Requires-Dist: mkdocs>=1.6; extra == "site"
40
+ Requires-Dist: mkdocs-material>=9.5; extra == "site"
41
+ Requires-Dist: pymdown-extensions>=10.0; extra == "site"
42
+ Requires-Dist: mkdocs-swagger-ui-tag>=0.6; extra == "site"
38
43
  Dynamic: license-file
39
44
 
40
45
  # DeepDoc
@@ -57,7 +62,7 @@ Dynamic: license-file
57
62
 
58
63
  Auto-generate deep engineering documentation from real codebases using AI.
59
64
 
60
- DeepDoc scans your repo, builds a bucket-based documentation plan, generates rich MDX pages with Mermaid diagrams, and builds a local-first Fumadocs site with Orama search.
65
+ DeepDoc scans your repo, builds a bucket-based documentation plan, generates rich Markdown pages with Mermaid diagrams, and builds a local-first MkDocs Material site with built-in search.
61
66
 
62
67
  ## Contents
63
68
 
@@ -82,11 +87,11 @@ DeepDoc scans your repo, builds a bucket-based documentation plan, generates ric
82
87
  - **Bucket-based documentation architecture** — system, feature, endpoint, integration, and database buckets instead of one-file-per-page noise.
83
88
  - **Multi-step AI planner** — classifies the repo, proposes buckets, then assigns files, symbols, artifacts, and dependencies into a final reader-first plan.
84
89
  - **Giant-file handling** — large files are decomposed into feature-aligned clusters so a single controller can feed multiple doc pages.
85
- - **MDX-safe generation** — generated pages are repaired and validated in Python before being written; deploy-time quality gates block failed, invalid, or stub pages before the Fumadocs build.
90
+ - **Stable plain-Markdown generation** — generated pages are plain CommonMark (no MDX/JSX compile step, so a page can never fail to build); they are repaired and validated in Python before being written, and deploy-time quality gates block failed, invalid, or stub pages before the build.
86
91
  - **Evidence-first chatbot answers** — final code proof is hydrated from archived source snippets with exact file paths and line ranges, not just retrieval guesses.
87
92
  - **Incremental updates** — `deepdoc update` regenerates only stale or structurally affected docs against the last synced commit.
88
- - **OpenAPI-aware API docs** — auto-detects OpenAPI/Swagger specs and stages interactive `/api/*` pages in the generated site.
89
- - **Local-first Fumadocs site** — generates a `site/` Next.js app with Fumadocs UI, Mermaid rendering, and built-in search; `deepdoc deploy` exports a static site to any host.
93
+ - **OpenAPI-aware API docs** — auto-detects OpenAPI/Swagger specs and renders an interactive Swagger UI page (`mkdocs-swagger-ui-tag`) in the generated site.
94
+ - **Local-first MkDocs Material site** — generates a `site/mkdocs.yml` (Material theme, Mermaid, built-in search); `deepdoc deploy` runs `mkdocs build` and exports a static site to any host. Pure Python — no Node.js required.
90
95
 
91
96
  Works with Anthropic, OpenAI, Azure OpenAI, Google Gemini, Ollama, and any other LiteLLM-compatible provider. Parses Python, JavaScript/TypeScript, Go, PHP, and Vue.
92
97
 
@@ -129,7 +134,13 @@ pip install click litellm gitpython rich pyyaml jinja2
129
134
  pip install -e . --no-deps
130
135
  ```
131
136
 
132
- You will also need **Node 18+** on `PATH` when you run `deepdoc serve` or `deepdoc deploy`. DeepDoc generation itself uses Python-side repair and validation; Node is only needed for the generated Fumadocs site.
137
+ To preview or deploy the generated site you also need **MkDocs Material** (pure Python no Node.js). Install the `site` extra:
138
+
139
+ ```bash
140
+ pip install 'deepdoc[site]' # mkdocs-material + pymdown-extensions + mkdocs-swagger-ui-tag
141
+ ```
142
+
143
+ `deepdoc serve` / `deepdoc deploy` will tell you to run `pip install 'deepdoc[site]'` if MkDocs is missing.
133
144
 
134
145
  ### Verify installation
135
146
 
@@ -137,7 +148,7 @@ You will also need **Node 18+** on `PATH` when you run `deepdoc serve` or `deepd
137
148
  deepdoc --version
138
149
  deepdoc --help
139
150
  python -m deepdoc --help
140
- node --version # must report 18 or higher
151
+ pip show mkdocs-material # verify MkDocs Material is installed
141
152
  ```
142
153
 
143
154
  If you installed the chatbot extra, you can verify those dependencies with:
@@ -346,9 +357,9 @@ deepdoc generate --exclude "tests/**"
346
357
 
347
358
  1. **Phase 1: Scan** — Walk the repo, parse supported languages, detect endpoints, config/setup artifacts, runtime surfaces, integration signals, and OpenAPI specs.
348
359
  2. **Phase 2: Plan** — Run the multi-step bucket planner. It classifies the repo, proposes bucket candidates, and assigns files/symbols/artifacts to the final doc structure.
349
- 3. **Phase 3: Generate** — Generate bucket pages in batches with parallel workers. High-level buckets are AI-planned; scanned endpoints enrich grouped API-reference pages instead of creating one page per route. Each page passes through Python-side MDX repair, grounding validation, and bounded quality retries before being written to disk.
350
- 4. **Phase 4: API Ref** — Stage OpenAPI assets for the generated Fumadocs `/api/*` pages when a spec exists.
351
- 5. **Phase 5: Build** — Write the generated `site/` Fumadocs scaffold, page tree, search route, and static assets from the generated plan.
360
+ 3. **Phase 3: Generate** — Generate bucket pages in batches with parallel workers. High-level buckets are AI-planned; scanned endpoints enrich grouped API-reference pages instead of creating one page per route. Each page passes through Python-side Markdown repair, grounding validation, and bounded quality retries before being written to disk.
361
+ 4. **Phase 4: API Ref** — Stage OpenAPI specs and render them on a single interactive Swagger UI page (`mkdocs-swagger-ui-tag`) when a spec exists.
362
+ 5. **Phase 5: Build** — Write the generated `site/mkdocs.yml` scaffold (Material theme), nav, and brand stylesheet from the generated plan.
352
363
 
353
364
  **Options:**
354
365
 
@@ -383,8 +394,8 @@ deepdoc update --deploy # Update + deploy
383
394
  - **incremental** — regenerate only the stale bucket pages
384
395
  - **targeted replan** — new/deleted files or endpoint structure changes; re-plans affected buckets then regenerates them. Full replan is never triggered automatically for normal code changes.
385
396
  4. Compares the saved scan cache with the current scan so semantic endpoint changes can refresh impacted docs even when ownership files do not line up directly.
386
- 5. Regenerates only the affected bucket pages. Deleted files are cleaned up in-place: orphaned buckets and their MDX pages are removed, partially-emptied buckets are marked stale and regenerated.
387
- 6. Appends an entry to `.deepdoc/changelog.json` and regenerates `docs/whats-changed.mdx` so the docs site always shows a current commit-by-commit change log.
397
+ 5. Regenerates only the affected bucket pages. Deleted files are cleaned up in-place: orphaned buckets and their Markdown pages are removed, partially-emptied buckets are marked stale and regenerated.
398
+ 6. Appends an entry to `.deepdoc/changelog.json` and regenerates `docs/whats-changed.md` so the docs site always shows a current commit-by-commit change log.
388
399
  7. Incrementally refreshes the chatbot corpora from the same update run.
389
400
  8. Rebuilds site config and nav afterward.
390
401
 
@@ -396,7 +407,7 @@ Generation writes quality artifacts under `.deepdoc/`:
396
407
  - `.deepdoc/generation_quality.json` records invalid/degraded pages, coverage metrics, local setup warnings, and consistency summary data.
397
408
  - `.deepdoc/consistency_warnings.json` records warning-only cross-page identifier consistency findings.
398
409
 
399
- Generated MDX pages include provenance frontmatter such as `deepdoc_generated_commit`, `deepdoc_generated_at`, `deepdoc_generated_version`, `deepdoc_status`, `deepdoc_evidence_files`, and `deepdoc_prereqs` (prerequisite page slugs). The generated Fumadocs site renders a subtle "Last generated from commit ..." badge and wires prev/next navigation arrows automatically. Pages with prerequisites show a "Read first:" callout at the top.
410
+ Generated Markdown pages include provenance frontmatter such as `deepdoc_generated_commit`, `deepdoc_generated_at`, `deepdoc_generated_version`, `deepdoc_status`, `deepdoc_evidence_files`, and `deepdoc_prereqs` (prerequisite page slugs). The MkDocs Material theme renders these pages with built-in navigation, search, and table of contents.
400
411
 
401
412
  **Options:**
402
413
 
@@ -418,26 +429,26 @@ This is useful after `generate` or `update` when you want a quick health check w
418
429
 
419
430
  ### `deepdoc serve`
420
431
 
421
- Preview the generated docs locally with live reload using the generated Fumadocs app in `site/`.
432
+ Preview the generated docs locally with live reload using the generated MkDocs Material site in `site/`.
422
433
 
423
434
  ```bash
424
435
  deepdoc serve
425
436
  deepdoc serve --port 8001
426
437
  ```
427
438
 
428
- Requires Node.js >= 18 to be installed. Site dependencies are auto-installed into `site/node_modules/` on first run.
439
+ Runs `mkdocs serve` against `site/mkdocs.yml`. Requires `pip install mkdocs-material` (pure Python no Node.js).
429
440
 
430
441
  ### `deepdoc deploy`
431
442
 
432
- Build and export the generated Fumadocs site.
443
+ Build and export the generated MkDocs Material site.
433
444
 
434
445
  ```bash
435
446
  deepdoc deploy
436
447
  ```
437
448
 
438
- This runs `next build` inside `site/` and writes the static export to `site/out/`. You can deploy that directory to Vercel, Netlify, GitHub Pages, Cloudflare Pages, or any static host.
449
+ This runs `mkdocs build` against `site/mkdocs.yml` and writes the static HTML to `site/out/`. You can deploy that directory to Vercel, Netlify, GitHub Pages, Cloudflare Pages, or any static host.
439
450
 
440
- Before building, `deepdoc deploy` checks `.deepdoc/generation_quality.json` and generated MDX frontmatter. It refuses to deploy when the last generation has failed/invalid pages or when `docs/` still contains pages marked `deepdoc_status: "invalid"` or `stub: true`; rerun `deepdoc generate` after fixing those issues.
451
+ Before building, `deepdoc deploy` checks `.deepdoc/generation_quality.json` and generated page frontmatter. It refuses to deploy when the last generation has failed/invalid pages or when `docs/` still contains pages marked `deepdoc_status: "invalid"` or `stub: true`; rerun `deepdoc generate` after fixing those issues.
441
452
 
442
453
  If you want GitHub Pages specifically, this repo includes a workflow at `.github/workflows/github-pages.yml` that publishes the checked-in `site/out/` export through the official Pages Actions flow. That means you do not need to move the export into a branch `docs/` folder.
443
454
 
@@ -684,7 +695,7 @@ site:
684
695
  | `project_name` | directory name | Project name used in site title |
685
696
  | `description` | `""` | Short project description |
686
697
  | `output_dir` | `docs` | Where generated markdown pages are written |
687
- | `site_dir` | `site` | Where the generated Fumadocs site lives |
698
+ | `site_dir` | `site` | Where the generated MkDocs site config (`mkdocs.yml`) lives |
688
699
  | **LLM** | | |
689
700
  | `llm.provider` | `anthropic` | `anthropic`, `openai`, `azure`, `ollama`, or any LiteLLM alias |
690
701
  | `llm.model` | `claude-3-5-sonnet-20241022` | Model name (use provider prefix for non-Anthropic, e.g. `azure/gpt-4.1`) |
@@ -711,7 +722,7 @@ site:
711
722
  | `github_pages.branch` | `gh-pages` | Branch for GitHub Pages deploy |
712
723
  | `github_pages.remote` | `origin` | Git remote for deploy |
713
724
  | **Site** | | |
714
- | `site.repo_url` | `""` | Repo URL shown in the generated Fumadocs navigation |
725
+ | `site.repo_url` | `""` | Repo URL shown in the generated MkDocs Material navigation |
715
726
  | `site.favicon` | `""` | Path to favicon |
716
727
  | `site.logo` | `""` | Path to logo |
717
728
  | **Compatibility** | | |
@@ -739,7 +750,7 @@ The chatbot has three independent model surfaces that you can mix across provide
739
750
  | `chatbot.answer.*` | Chatbot answer generation | GPT-4o-mini, Claude, Gemini Flash |
740
751
  | `chatbot.embeddings.*` | Vector embeddings for retrieval | text-embedding-3-large, Gemini text-embedding-004 |
741
752
 
742
- `deepdoc serve` auto-starts the chatbot backend alongside the Fumadocs site. The backend port is deterministically assigned from your repo path (range 8100–8799) unless you set an explicit `base_url`.
753
+ `deepdoc serve` auto-starts the chatbot backend alongside the MkDocs site. The backend port is deterministically assigned from your repo path (range 8100–8799) unless you set an explicit `base_url`.
743
754
 
744
755
  ### Evidence-First Responses
745
756
 
@@ -1138,8 +1149,8 @@ During `deepdoc generate`, six corpora are built and stored in `.deepdoc/chatbot
1138
1149
  |--------|--------|-------------|
1139
1150
  | **Code chunks** | All parsed source files | Code split by line count with overlap, tagged with symbols and file paths |
1140
1151
  | **Artifact chunks** | Config files (Dockerfile, package.json, OpenAPI specs, etc.) | Non-code project files split similarly |
1141
- | **Doc summary chunks** | Generated documentation pages | First sections extracted from each generated MDX page |
1142
- | **Doc full chunks** | Generated documentation pages | Section-level chunks from the full generated MDX pages |
1152
+ | **Doc summary chunks** | Generated documentation pages | First sections extracted from each generated Markdown page |
1153
+ | **Doc full chunks** | Generated documentation pages | Section-level chunks from the full generated Markdown pages |
1143
1154
  | **Repo doc chunks** | Repo-authored docs such as `README.md`, `docs/`, design notes, and notebooks | Raw repo documentation kept separate from generated pages |
1144
1155
  | **Relationship chunks** | Imports, symbols, call graph, and graph-neighbor summaries | Lightweight graph-style retrieval context |
1145
1156
 
@@ -1228,7 +1239,7 @@ POST /query-context
1228
1239
 
1229
1240
  For local development, `deepdoc serve` handles everything automatically. For production:
1230
1241
 
1231
- 1. Deploy the Fumadocs static site (`site/out/`) to any static host.
1242
+ 1. Deploy the MkDocs static site (`site/out/`) to any static host.
1232
1243
  2. Deploy `chatbot_backend/` separately to a Python-capable host.
1233
1244
  3. Set `chatbot.backend.base_url` in `.deepdoc.yaml` to point at the deployed backend URL.
1234
1245
  4. Rebuild the site so the frontend picks up the new backend URL: `deepdoc deploy`.
@@ -1344,20 +1355,17 @@ your-repo/
1344
1355
  ├── .deepdoc_manifest.json # Legacy source hash manifest
1345
1356
  ├── .deepdoc_plan.json # Legacy compatibility plan file
1346
1357
  ├── .deepdoc_file_map.json # Legacy compatibility file map
1347
- ├── docs/ # Generated MDX pages
1348
- │ ├── index.mdx
1349
- │ ├── architecture.mdx
1350
- │ ├── setup-and-configuration.mdx
1351
- │ ├── orders-api.mdx
1352
- │ ├── get-api-v1-orders.mdx
1358
+ ├── docs/ # Generated Markdown pages
1359
+ │ ├── index.md
1360
+ │ ├── architecture.md
1361
+ │ ├── setup-and-configuration.md
1362
+ │ ├── api.md # Swagger UI page (when an OpenAPI spec exists)
1363
+ │ ├── openapi/ # Staged OpenAPI specs
1353
1364
  │ └── ...
1354
- └── site/ # Generated Fumadocs app
1355
- ├── app/
1356
- ├── components/
1357
- ├── lib/
1358
- ├── openapi/ # Staged OpenAPI assets (when a spec exists)
1359
- ├── public/
1360
- └── out/ # Static export after `deepdoc deploy`
1365
+ └── site/ # Generated MkDocs Material site
1366
+ ├── mkdocs.yml
1367
+ ├── docs/stylesheets/extra.css
1368
+ └── out/ # Static HTML after `deepdoc deploy`
1361
1369
  ```
1362
1370
 
1363
1371
  ---
@@ -1433,10 +1441,6 @@ jobs:
1433
1441
  with:
1434
1442
  python-version: "3.11"
1435
1443
 
1436
- - uses: actions/setup-node@v4
1437
- with:
1438
- node-version: "20"
1439
-
1440
1444
  - name: Install dependencies
1441
1445
  run: |
1442
1446
  pip install deepdoc # or: pip install "deepdoc[chatbot]" if you use chatbot features
@@ -1489,10 +1493,6 @@ jobs:
1489
1493
  with:
1490
1494
  python-version: "3.11"
1491
1495
 
1492
- - uses: actions/setup-node@v4
1493
- with:
1494
- node-version: "20"
1495
-
1496
1496
  - name: Install deepdoc
1497
1497
  run: pip install deepdoc
1498
1498
 
@@ -1562,7 +1562,7 @@ deepdoc generate --force # Full regen with new model
1562
1562
  ## Requirements
1563
1563
 
1564
1564
  - Python 3.10+
1565
- - **Node 18+** on `PATH` — used by `deepdoc serve` and `deepdoc deploy` for the generated Fumadocs site
1565
+ - **MkDocs Material** (`pip install mkdocs-material`) — used by `deepdoc serve` and `deepdoc deploy` for the generated site. Pure Python, no Node.js. Add `mkdocs-swagger-ui-tag` when your repo has an OpenAPI/Swagger spec.
1566
1566
  - Git (for `deepdoc update` and `deepdoc deploy`)
1567
1567
  - An LLM API key (or Ollama running locally)
1568
1568
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  Auto-generate deep engineering documentation from real codebases using AI.
20
20
 
21
- DeepDoc scans your repo, builds a bucket-based documentation plan, generates rich MDX pages with Mermaid diagrams, and builds a local-first Fumadocs site with Orama search.
21
+ DeepDoc scans your repo, builds a bucket-based documentation plan, generates rich Markdown pages with Mermaid diagrams, and builds a local-first MkDocs Material site with built-in search.
22
22
 
23
23
  ## Contents
24
24
 
@@ -43,11 +43,11 @@ DeepDoc scans your repo, builds a bucket-based documentation plan, generates ric
43
43
  - **Bucket-based documentation architecture** — system, feature, endpoint, integration, and database buckets instead of one-file-per-page noise.
44
44
  - **Multi-step AI planner** — classifies the repo, proposes buckets, then assigns files, symbols, artifacts, and dependencies into a final reader-first plan.
45
45
  - **Giant-file handling** — large files are decomposed into feature-aligned clusters so a single controller can feed multiple doc pages.
46
- - **MDX-safe generation** — generated pages are repaired and validated in Python before being written; deploy-time quality gates block failed, invalid, or stub pages before the Fumadocs build.
46
+ - **Stable plain-Markdown generation** — generated pages are plain CommonMark (no MDX/JSX compile step, so a page can never fail to build); they are repaired and validated in Python before being written, and deploy-time quality gates block failed, invalid, or stub pages before the build.
47
47
  - **Evidence-first chatbot answers** — final code proof is hydrated from archived source snippets with exact file paths and line ranges, not just retrieval guesses.
48
48
  - **Incremental updates** — `deepdoc update` regenerates only stale or structurally affected docs against the last synced commit.
49
- - **OpenAPI-aware API docs** — auto-detects OpenAPI/Swagger specs and stages interactive `/api/*` pages in the generated site.
50
- - **Local-first Fumadocs site** — generates a `site/` Next.js app with Fumadocs UI, Mermaid rendering, and built-in search; `deepdoc deploy` exports a static site to any host.
49
+ - **OpenAPI-aware API docs** — auto-detects OpenAPI/Swagger specs and renders an interactive Swagger UI page (`mkdocs-swagger-ui-tag`) in the generated site.
50
+ - **Local-first MkDocs Material site** — generates a `site/mkdocs.yml` (Material theme, Mermaid, built-in search); `deepdoc deploy` runs `mkdocs build` and exports a static site to any host. Pure Python — no Node.js required.
51
51
 
52
52
  Works with Anthropic, OpenAI, Azure OpenAI, Google Gemini, Ollama, and any other LiteLLM-compatible provider. Parses Python, JavaScript/TypeScript, Go, PHP, and Vue.
53
53
 
@@ -90,7 +90,13 @@ pip install click litellm gitpython rich pyyaml jinja2
90
90
  pip install -e . --no-deps
91
91
  ```
92
92
 
93
- You will also need **Node 18+** on `PATH` when you run `deepdoc serve` or `deepdoc deploy`. DeepDoc generation itself uses Python-side repair and validation; Node is only needed for the generated Fumadocs site.
93
+ To preview or deploy the generated site you also need **MkDocs Material** (pure Python no Node.js). Install the `site` extra:
94
+
95
+ ```bash
96
+ pip install 'deepdoc[site]' # mkdocs-material + pymdown-extensions + mkdocs-swagger-ui-tag
97
+ ```
98
+
99
+ `deepdoc serve` / `deepdoc deploy` will tell you to run `pip install 'deepdoc[site]'` if MkDocs is missing.
94
100
 
95
101
  ### Verify installation
96
102
 
@@ -98,7 +104,7 @@ You will also need **Node 18+** on `PATH` when you run `deepdoc serve` or `deepd
98
104
  deepdoc --version
99
105
  deepdoc --help
100
106
  python -m deepdoc --help
101
- node --version # must report 18 or higher
107
+ pip show mkdocs-material # verify MkDocs Material is installed
102
108
  ```
103
109
 
104
110
  If you installed the chatbot extra, you can verify those dependencies with:
@@ -307,9 +313,9 @@ deepdoc generate --exclude "tests/**"
307
313
 
308
314
  1. **Phase 1: Scan** — Walk the repo, parse supported languages, detect endpoints, config/setup artifacts, runtime surfaces, integration signals, and OpenAPI specs.
309
315
  2. **Phase 2: Plan** — Run the multi-step bucket planner. It classifies the repo, proposes bucket candidates, and assigns files/symbols/artifacts to the final doc structure.
310
- 3. **Phase 3: Generate** — Generate bucket pages in batches with parallel workers. High-level buckets are AI-planned; scanned endpoints enrich grouped API-reference pages instead of creating one page per route. Each page passes through Python-side MDX repair, grounding validation, and bounded quality retries before being written to disk.
311
- 4. **Phase 4: API Ref** — Stage OpenAPI assets for the generated Fumadocs `/api/*` pages when a spec exists.
312
- 5. **Phase 5: Build** — Write the generated `site/` Fumadocs scaffold, page tree, search route, and static assets from the generated plan.
316
+ 3. **Phase 3: Generate** — Generate bucket pages in batches with parallel workers. High-level buckets are AI-planned; scanned endpoints enrich grouped API-reference pages instead of creating one page per route. Each page passes through Python-side Markdown repair, grounding validation, and bounded quality retries before being written to disk.
317
+ 4. **Phase 4: API Ref** — Stage OpenAPI specs and render them on a single interactive Swagger UI page (`mkdocs-swagger-ui-tag`) when a spec exists.
318
+ 5. **Phase 5: Build** — Write the generated `site/mkdocs.yml` scaffold (Material theme), nav, and brand stylesheet from the generated plan.
313
319
 
314
320
  **Options:**
315
321
 
@@ -344,8 +350,8 @@ deepdoc update --deploy # Update + deploy
344
350
  - **incremental** — regenerate only the stale bucket pages
345
351
  - **targeted replan** — new/deleted files or endpoint structure changes; re-plans affected buckets then regenerates them. Full replan is never triggered automatically for normal code changes.
346
352
  4. Compares the saved scan cache with the current scan so semantic endpoint changes can refresh impacted docs even when ownership files do not line up directly.
347
- 5. Regenerates only the affected bucket pages. Deleted files are cleaned up in-place: orphaned buckets and their MDX pages are removed, partially-emptied buckets are marked stale and regenerated.
348
- 6. Appends an entry to `.deepdoc/changelog.json` and regenerates `docs/whats-changed.mdx` so the docs site always shows a current commit-by-commit change log.
353
+ 5. Regenerates only the affected bucket pages. Deleted files are cleaned up in-place: orphaned buckets and their Markdown pages are removed, partially-emptied buckets are marked stale and regenerated.
354
+ 6. Appends an entry to `.deepdoc/changelog.json` and regenerates `docs/whats-changed.md` so the docs site always shows a current commit-by-commit change log.
349
355
  7. Incrementally refreshes the chatbot corpora from the same update run.
350
356
  8. Rebuilds site config and nav afterward.
351
357
 
@@ -357,7 +363,7 @@ Generation writes quality artifacts under `.deepdoc/`:
357
363
  - `.deepdoc/generation_quality.json` records invalid/degraded pages, coverage metrics, local setup warnings, and consistency summary data.
358
364
  - `.deepdoc/consistency_warnings.json` records warning-only cross-page identifier consistency findings.
359
365
 
360
- Generated MDX pages include provenance frontmatter such as `deepdoc_generated_commit`, `deepdoc_generated_at`, `deepdoc_generated_version`, `deepdoc_status`, `deepdoc_evidence_files`, and `deepdoc_prereqs` (prerequisite page slugs). The generated Fumadocs site renders a subtle "Last generated from commit ..." badge and wires prev/next navigation arrows automatically. Pages with prerequisites show a "Read first:" callout at the top.
366
+ Generated Markdown pages include provenance frontmatter such as `deepdoc_generated_commit`, `deepdoc_generated_at`, `deepdoc_generated_version`, `deepdoc_status`, `deepdoc_evidence_files`, and `deepdoc_prereqs` (prerequisite page slugs). The MkDocs Material theme renders these pages with built-in navigation, search, and table of contents.
361
367
 
362
368
  **Options:**
363
369
 
@@ -379,26 +385,26 @@ This is useful after `generate` or `update` when you want a quick health check w
379
385
 
380
386
  ### `deepdoc serve`
381
387
 
382
- Preview the generated docs locally with live reload using the generated Fumadocs app in `site/`.
388
+ Preview the generated docs locally with live reload using the generated MkDocs Material site in `site/`.
383
389
 
384
390
  ```bash
385
391
  deepdoc serve
386
392
  deepdoc serve --port 8001
387
393
  ```
388
394
 
389
- Requires Node.js >= 18 to be installed. Site dependencies are auto-installed into `site/node_modules/` on first run.
395
+ Runs `mkdocs serve` against `site/mkdocs.yml`. Requires `pip install mkdocs-material` (pure Python no Node.js).
390
396
 
391
397
  ### `deepdoc deploy`
392
398
 
393
- Build and export the generated Fumadocs site.
399
+ Build and export the generated MkDocs Material site.
394
400
 
395
401
  ```bash
396
402
  deepdoc deploy
397
403
  ```
398
404
 
399
- This runs `next build` inside `site/` and writes the static export to `site/out/`. You can deploy that directory to Vercel, Netlify, GitHub Pages, Cloudflare Pages, or any static host.
405
+ This runs `mkdocs build` against `site/mkdocs.yml` and writes the static HTML to `site/out/`. You can deploy that directory to Vercel, Netlify, GitHub Pages, Cloudflare Pages, or any static host.
400
406
 
401
- Before building, `deepdoc deploy` checks `.deepdoc/generation_quality.json` and generated MDX frontmatter. It refuses to deploy when the last generation has failed/invalid pages or when `docs/` still contains pages marked `deepdoc_status: "invalid"` or `stub: true`; rerun `deepdoc generate` after fixing those issues.
407
+ Before building, `deepdoc deploy` checks `.deepdoc/generation_quality.json` and generated page frontmatter. It refuses to deploy when the last generation has failed/invalid pages or when `docs/` still contains pages marked `deepdoc_status: "invalid"` or `stub: true`; rerun `deepdoc generate` after fixing those issues.
402
408
 
403
409
  If you want GitHub Pages specifically, this repo includes a workflow at `.github/workflows/github-pages.yml` that publishes the checked-in `site/out/` export through the official Pages Actions flow. That means you do not need to move the export into a branch `docs/` folder.
404
410
 
@@ -645,7 +651,7 @@ site:
645
651
  | `project_name` | directory name | Project name used in site title |
646
652
  | `description` | `""` | Short project description |
647
653
  | `output_dir` | `docs` | Where generated markdown pages are written |
648
- | `site_dir` | `site` | Where the generated Fumadocs site lives |
654
+ | `site_dir` | `site` | Where the generated MkDocs site config (`mkdocs.yml`) lives |
649
655
  | **LLM** | | |
650
656
  | `llm.provider` | `anthropic` | `anthropic`, `openai`, `azure`, `ollama`, or any LiteLLM alias |
651
657
  | `llm.model` | `claude-3-5-sonnet-20241022` | Model name (use provider prefix for non-Anthropic, e.g. `azure/gpt-4.1`) |
@@ -672,7 +678,7 @@ site:
672
678
  | `github_pages.branch` | `gh-pages` | Branch for GitHub Pages deploy |
673
679
  | `github_pages.remote` | `origin` | Git remote for deploy |
674
680
  | **Site** | | |
675
- | `site.repo_url` | `""` | Repo URL shown in the generated Fumadocs navigation |
681
+ | `site.repo_url` | `""` | Repo URL shown in the generated MkDocs Material navigation |
676
682
  | `site.favicon` | `""` | Path to favicon |
677
683
  | `site.logo` | `""` | Path to logo |
678
684
  | **Compatibility** | | |
@@ -700,7 +706,7 @@ The chatbot has three independent model surfaces that you can mix across provide
700
706
  | `chatbot.answer.*` | Chatbot answer generation | GPT-4o-mini, Claude, Gemini Flash |
701
707
  | `chatbot.embeddings.*` | Vector embeddings for retrieval | text-embedding-3-large, Gemini text-embedding-004 |
702
708
 
703
- `deepdoc serve` auto-starts the chatbot backend alongside the Fumadocs site. The backend port is deterministically assigned from your repo path (range 8100–8799) unless you set an explicit `base_url`.
709
+ `deepdoc serve` auto-starts the chatbot backend alongside the MkDocs site. The backend port is deterministically assigned from your repo path (range 8100–8799) unless you set an explicit `base_url`.
704
710
 
705
711
  ### Evidence-First Responses
706
712
 
@@ -1099,8 +1105,8 @@ During `deepdoc generate`, six corpora are built and stored in `.deepdoc/chatbot
1099
1105
  |--------|--------|-------------|
1100
1106
  | **Code chunks** | All parsed source files | Code split by line count with overlap, tagged with symbols and file paths |
1101
1107
  | **Artifact chunks** | Config files (Dockerfile, package.json, OpenAPI specs, etc.) | Non-code project files split similarly |
1102
- | **Doc summary chunks** | Generated documentation pages | First sections extracted from each generated MDX page |
1103
- | **Doc full chunks** | Generated documentation pages | Section-level chunks from the full generated MDX pages |
1108
+ | **Doc summary chunks** | Generated documentation pages | First sections extracted from each generated Markdown page |
1109
+ | **Doc full chunks** | Generated documentation pages | Section-level chunks from the full generated Markdown pages |
1104
1110
  | **Repo doc chunks** | Repo-authored docs such as `README.md`, `docs/`, design notes, and notebooks | Raw repo documentation kept separate from generated pages |
1105
1111
  | **Relationship chunks** | Imports, symbols, call graph, and graph-neighbor summaries | Lightweight graph-style retrieval context |
1106
1112
 
@@ -1189,7 +1195,7 @@ POST /query-context
1189
1195
 
1190
1196
  For local development, `deepdoc serve` handles everything automatically. For production:
1191
1197
 
1192
- 1. Deploy the Fumadocs static site (`site/out/`) to any static host.
1198
+ 1. Deploy the MkDocs static site (`site/out/`) to any static host.
1193
1199
  2. Deploy `chatbot_backend/` separately to a Python-capable host.
1194
1200
  3. Set `chatbot.backend.base_url` in `.deepdoc.yaml` to point at the deployed backend URL.
1195
1201
  4. Rebuild the site so the frontend picks up the new backend URL: `deepdoc deploy`.
@@ -1305,20 +1311,17 @@ your-repo/
1305
1311
  ├── .deepdoc_manifest.json # Legacy source hash manifest
1306
1312
  ├── .deepdoc_plan.json # Legacy compatibility plan file
1307
1313
  ├── .deepdoc_file_map.json # Legacy compatibility file map
1308
- ├── docs/ # Generated MDX pages
1309
- │ ├── index.mdx
1310
- │ ├── architecture.mdx
1311
- │ ├── setup-and-configuration.mdx
1312
- │ ├── orders-api.mdx
1313
- │ ├── get-api-v1-orders.mdx
1314
+ ├── docs/ # Generated Markdown pages
1315
+ │ ├── index.md
1316
+ │ ├── architecture.md
1317
+ │ ├── setup-and-configuration.md
1318
+ │ ├── api.md # Swagger UI page (when an OpenAPI spec exists)
1319
+ │ ├── openapi/ # Staged OpenAPI specs
1314
1320
  │ └── ...
1315
- └── site/ # Generated Fumadocs app
1316
- ├── app/
1317
- ├── components/
1318
- ├── lib/
1319
- ├── openapi/ # Staged OpenAPI assets (when a spec exists)
1320
- ├── public/
1321
- └── out/ # Static export after `deepdoc deploy`
1321
+ └── site/ # Generated MkDocs Material site
1322
+ ├── mkdocs.yml
1323
+ ├── docs/stylesheets/extra.css
1324
+ └── out/ # Static HTML after `deepdoc deploy`
1322
1325
  ```
1323
1326
 
1324
1327
  ---
@@ -1394,10 +1397,6 @@ jobs:
1394
1397
  with:
1395
1398
  python-version: "3.11"
1396
1399
 
1397
- - uses: actions/setup-node@v4
1398
- with:
1399
- node-version: "20"
1400
-
1401
1400
  - name: Install dependencies
1402
1401
  run: |
1403
1402
  pip install deepdoc # or: pip install "deepdoc[chatbot]" if you use chatbot features
@@ -1450,10 +1449,6 @@ jobs:
1450
1449
  with:
1451
1450
  python-version: "3.11"
1452
1451
 
1453
- - uses: actions/setup-node@v4
1454
- with:
1455
- node-version: "20"
1456
-
1457
1452
  - name: Install deepdoc
1458
1453
  run: pip install deepdoc
1459
1454
 
@@ -1523,7 +1518,7 @@ deepdoc generate --force # Full regen with new model
1523
1518
  ## Requirements
1524
1519
 
1525
1520
  - Python 3.10+
1526
- - **Node 18+** on `PATH` — used by `deepdoc serve` and `deepdoc deploy` for the generated Fumadocs site
1521
+ - **MkDocs Material** (`pip install mkdocs-material`) — used by `deepdoc serve` and `deepdoc deploy` for the generated site. Pure Python, no Node.js. Add `mkdocs-swagger-ui-tag` when your repo has an OpenAPI/Swagger spec.
1527
1522
  - Git (for `deepdoc update` and `deepdoc deploy`)
1528
1523
  - An LLM API key (or Ollama running locally)
1529
1524
 
@@ -1,3 +1,3 @@
1
1
  """DeepDoc — Auto-generate beautiful docs from any codebase."""
2
2
 
3
- __version__ = "2.3.5"
3
+ __version__ = "3.1.0"
@@ -72,11 +72,10 @@ def _build_md(entries: list[dict]) -> str:
72
72
 
73
73
  if not entries:
74
74
  lines.append(
75
- ":::note\nNo changelog entries yet. Run `deepdoc generate` to create the first entry.\n:::"
75
+ "/// note\nNo changelog entries yet. Run `deepdoc generate` to create the first entry.\n///"
76
76
  )
77
77
  return "\n".join(lines)
78
78
 
79
- lines.append(":::accordions")
80
79
  for entry in entries:
81
80
  date = entry.get("date", "")
82
81
  msg = entry.get("commit_message", "update")
@@ -88,7 +87,7 @@ def _build_md(entries: list[dict]) -> str:
88
87
  strategy_label = _STRATEGY_LABEL.get(strategy, strategy)
89
88
 
90
89
  title = f"{date} — {msg[:72]} ({sha})"
91
- lines.append(f'::accordion{{title="{title}"}}')
90
+ lines.append(f"/// details | {title}")
92
91
  lines.append("")
93
92
 
94
93
  # Commit metadata row
@@ -109,17 +108,17 @@ def _build_md(entries: list[dict]) -> str:
109
108
  lines.append("**Pages generated:**")
110
109
  lines.append("")
111
110
  for s in pages:
112
- lines.append(f"- [{_slug_to_title(s)}](/{s})")
111
+ lines.append(f"- [{_slug_to_title(s)}]({s}.md)")
113
112
  else:
114
113
  # Pages updated
115
114
  if pages:
116
115
  lines.append(f"**{len(pages)} page(s) updated:**")
117
116
  lines.append("")
118
117
  for s in pages:
119
- lines.append(f"- [{_slug_to_title(s)}](/{s})")
118
+ lines.append(f"- [{_slug_to_title(s)}]({s}.md)")
120
119
  else:
121
120
  lines.append(
122
- ":::info\nNo pages were regenerated — only metadata or chatbot corpora were refreshed.\n:::"
121
+ "/// info\nNo pages were regenerated — only metadata or chatbot corpora were refreshed.\n///"
123
122
  )
124
123
 
125
124
  # Source files that changed
@@ -148,9 +147,8 @@ def _build_md(entries: list[dict]) -> str:
148
147
  )
149
148
 
150
149
  lines.append("")
151
- lines.append("::")
150
+ lines.append("///")
152
151
 
153
- lines.append(":::")
154
152
  return "\n".join(lines)
155
153
 
156
154
 
@@ -668,15 +668,15 @@ class AnswerMixin:
668
668
  reason=str(row.get("reason", "") or ""),
669
669
  )
670
670
  )
671
- if mode == "code_deep" and not evidence:
672
- diagnostics.warnings.append("No source/config evidence was available for Code Deep.")
671
+ if mode == "deep" and not evidence:
672
+ diagnostics.warnings.append("No source/config evidence was available for deep mode.")
673
673
  return evidence, diagnostics
674
674
 
675
675
  def _evidence_role(self, row: dict[str, Any], *, source_kind: str, mode: str) -> str:
676
676
  reason = str(row.get("reason", "") or "")
677
677
  if source_kind == "config" or row.get("artifact_type"):
678
678
  return "config"
679
- if reason in {"investigation_step", "research_step"} or mode == "code_deep":
679
+ if reason in {"investigation_step", "research_step"} or mode == "deep":
680
680
  return "implementation"
681
681
  if reason == "mentioned_source":
682
682
  return "supporting"
@@ -426,7 +426,7 @@ class DeepResearcher:
426
426
  step: int,
427
427
  ) -> ResearchStep:
428
428
  """Run a Tool-Using ReAct loop for a single sub-question."""
429
- max_iterations = 3
429
+ max_iterations = 5
430
430
  chunks = self._retrieve_for_question(
431
431
  question,
432
432
  history,
@@ -468,8 +468,9 @@ class DeepResearcher:
468
468
  "You have access to the following initial evidence chunks from the codebase.\n\n"
469
469
  "If the evidence is sufficient, provide your final answer in plain text.\n"
470
470
  "If you need to explore the codebase further, you can use the following tools by outputting a JSON object and NOTHING else:\n"
471
- '1. read_file: `{"action": "read_file", "path": "file/path.py", "start": 10, "end": 50}`\n'
472
- '2. grep: `{"action": "grep", "pattern": "def main"}`\n\n'
471
+ '1. search: `{"action": "search", "query": "what you want to find"}` — semantic search over the code index\n'
472
+ '2. read_file: `{"action": "read_file", "path": "file/path.py", "start": 10, "end": 50}`\n'
473
+ '3. grep: `{"action": "grep", "pattern": "def main"}`\n\n'
473
474
  "Answer ONLY based on evidence. Prefer a detailed, implementation-level walkthrough.\n\n"
474
475
  "## STRICT GROUNDING RULES\n"
475
476
  "- Do NOT invent, fabricate, or hallucinate any code, function names, class names, "
@@ -632,6 +633,35 @@ class DeepResearcher:
632
633
  results.append("... [truncated due to length]")
633
634
  return "\n".join(results)
634
635
 
636
+ elif action == "search":
637
+ query = str(tool_call.get("query", "")).strip()
638
+ if not query or len(query) < 3:
639
+ return "Error: search requires a non-empty 'query' (min 3 characters)."
640
+ try:
641
+ retrieve_context = getattr(self.service, "retrieve_context", None)
642
+ if not callable(retrieve_context):
643
+ return "Error: search tool unavailable."
644
+ context = retrieve_context(query, [], mode="fast")
645
+ code_hits = context.get("code_hits", [])[:8]
646
+ if not code_hits:
647
+ return f"No code matches found for '{query}'."
648
+ parts = []
649
+ for i, hit in enumerate(code_hits, 1):
650
+ record = getattr(hit, "record", hit)
651
+ source = (
652
+ getattr(record, "file_path", None)
653
+ or getattr(record, "doc_path", None)
654
+ or "unknown"
655
+ )
656
+ text = getattr(record, "text", "")[:1600]
657
+ score = round(float(getattr(hit, "score", 0.0)), 3)
658
+ parts.append(f"[{i}] {source} (score={score}):\n{text}")
659
+ if source not in sources_used:
660
+ sources_used.append(source)
661
+ return "\n\n".join(parts)
662
+ except Exception as e:
663
+ return f"Error: Search failed - {e}"
664
+
635
665
  return f"Error: Unknown action '{action}'"
636
666
 
637
667
  def _synthesise(
@@ -780,8 +780,10 @@ class RetrievalMixin:
780
780
  source_kind = record.source_kind or ""
781
781
  if source_kind == "product":
782
782
  priority += 0.8 if supporting_requested else 2.5
783
- elif source_kind in {"config", "docs", "ops", "tooling"}:
783
+ elif source_kind in {"config", "ops", "tooling"}:
784
784
  priority += 1.2
785
+ elif source_kind == "docs":
786
+ priority += 0.2
785
787
  elif source_kind in {"test", "fixture", "example", "generated"}:
786
788
  priority += 4.5 if supporting_requested else -1.0
787
789