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.
- {deepdoc-2.3.6 → deepdoc-3.1.0}/PKG-INFO +46 -46
- {deepdoc-2.3.6 → deepdoc-3.1.0}/README.md +40 -45
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/__init__.py +1 -1
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/changelog_writer.py +6 -8
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/answer_mixin.py +3 -3
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/deep_research.py +33 -3
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/retrieval_mixin.py +3 -1
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/routes.py +13 -86
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/scaffold.py +4 -8
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/service.py +39 -98
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/settings.py +5 -6
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/cli.py +54 -99
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/config.py +5 -6
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/__init__.py +0 -2
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/consistency.py +4 -2
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/generation.py +21 -47
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/post_processors.py +30 -194
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/__init__.py +2 -1
- deepdoc-3.1.0/deepdoc/llm/retry.py +100 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/openapi.py +0 -22
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/persistence_v2.py +0 -6
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/pipeline_v2.py +14 -41
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/bucket_types.py +14 -14
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/page_types.py +6 -5
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/system.py +42 -52
- deepdoc-3.1.0/deepdoc/site/builder/__init__.py +3 -0
- deepdoc-3.1.0/deepdoc/site/builder/mkdocs_builder.py +1936 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/smart_update_v2.py +3 -3
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/updater_v2.py +4 -4
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/PKG-INFO +46 -46
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/SOURCES.txt +4 -5
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/requires.txt +6 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/pyproject.toml +7 -1
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_changelog.py +3 -3
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_config.py +6 -6
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_query.py +20 -18
- deepdoc-3.1.0/tests/test_chatbot_scaffold.py +40 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_cli_serve.py +17 -36
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_consistency_pass.py +3 -3
- deepdoc-3.1.0/tests/test_llm_retry.py +90 -0
- deepdoc-2.3.6/tests/test_fumadocs_builder.py → deepdoc-3.1.0/tests/test_mkdocs_builder.py +152 -209
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_planner_granularity.py +7 -9
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_smart_update.py +0 -2
- deepdoc-2.3.6/deepdoc/site/builder/__init__.py +0 -4
- deepdoc-2.3.6/deepdoc/site/builder/chatbot_components.py +0 -1318
- deepdoc-2.3.6/deepdoc/site/builder/engine.py +0 -572
- deepdoc-2.3.6/deepdoc/site/builder/scaffold_files.py +0 -1960
- deepdoc-2.3.6/deepdoc/site/builder/templates.py +0 -32
- deepdoc-2.3.6/tests/test_chatbot_scaffold.py +0 -190
- {deepdoc-2.3.6 → deepdoc-3.1.0}/LICENSE +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/__main__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/benchmark_v2.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/call_graph.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/__init__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/chunker.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/constants.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/docs_summary.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/embeddings.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/indexer.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/linking.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/live_fallback_mixin.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/persistence.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/providers.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/source_archive.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/symbol_index.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/chatbot/types.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/evidence.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/generator/validation.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/client.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/json_utils.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/llm/litellm_compat.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/manifest.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/__init__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/api_detector.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/base.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/go_parser.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/js_ts_parser.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/php_parser.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/python_parser.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/registry.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/__init__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/base.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/common.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/detector.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/django.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/express.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/falcon.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/fastify.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/go.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/js_shared.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/laravel.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/nestjs.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/python_shared.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/registry.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/routes/repo_resolver.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/parser/vue_parser.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/__init__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/bucket_injection.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/bucket_refinement.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/common.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/endpoint_refs.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/engine.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/flow_candidates.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/heuristics.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/nav_shaping.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/specializations.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/topology.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/planner/utils.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/__init__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/selectors.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/prompts/update.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/py.typed +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/__init__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/artifacts.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/clustering.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/common.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/database.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/endpoints.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/integrations.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/runtime.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/scanner/utils.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/site/__init__.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/site/builder/common.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/site/builder/mdx_utils.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/source_metadata.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc/v2_models.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/dependency_links.txt +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/entry_points.txt +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/deepdoc.egg-info/top_level.txt +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/setup.cfg +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_benchmark_scorecard.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_call_graph.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_embeddings.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_eval.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_index.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_persistence.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_providers.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_relationship.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_chatbot_source_archive.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_classify.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_cli_generate.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_cli_update.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_flow_candidates.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_framework_fixtures.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_framework_support.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_generation_evidence.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_internal_docs_metadata.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_litellm_compat.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_llm_json_utils.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_parallel_pipeline.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_parser_ranges.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_planner_consolidation.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_route_registry.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_runtime_scan.py +0 -0
- {deepdoc-2.3.6 → deepdoc-3.1.0}/tests/test_stale.py +0 -0
- {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:
|
|
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
|
|
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
|
-
- **
|
|
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
|
|
89
|
-
- **Local-first
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
350
|
-
4. **Phase 4: API Ref** — Stage OpenAPI
|
|
351
|
-
5. **Phase 5: Build** — Write the generated `site
|
|
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
|
|
387
|
-
6. Appends an entry to `.deepdoc/changelog.json` and regenerates `docs/whats-changed.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1142
|
-
| **Doc full chunks** | Generated documentation pages | Section-level chunks from the full generated
|
|
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
|
|
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
|
|
1348
|
-
│ ├── index.
|
|
1349
|
-
│ ├── architecture.
|
|
1350
|
-
│ ├── setup-and-configuration.
|
|
1351
|
-
│ ├──
|
|
1352
|
-
│ ├──
|
|
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
|
|
1355
|
-
├──
|
|
1356
|
-
├──
|
|
1357
|
-
|
|
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
|
-
- **
|
|
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
|
|
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
|
-
- **
|
|
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
|
|
50
|
-
- **Local-first
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
311
|
-
4. **Phase 4: API Ref** — Stage OpenAPI
|
|
312
|
-
5. **Phase 5: Build** — Write the generated `site
|
|
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
|
|
348
|
-
6. Appends an entry to `.deepdoc/changelog.json` and regenerates `docs/whats-changed.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1103
|
-
| **Doc full chunks** | Generated documentation pages | Section-level chunks from the full generated
|
|
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
|
|
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
|
|
1309
|
-
│ ├── index.
|
|
1310
|
-
│ ├── architecture.
|
|
1311
|
-
│ ├── setup-and-configuration.
|
|
1312
|
-
│ ├──
|
|
1313
|
-
│ ├──
|
|
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
|
|
1316
|
-
├──
|
|
1317
|
-
├──
|
|
1318
|
-
|
|
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
|
-
- **
|
|
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
|
|
|
@@ -72,11 +72,10 @@ def _build_md(entries: list[dict]) -> str:
|
|
|
72
72
|
|
|
73
73
|
if not entries:
|
|
74
74
|
lines.append(
|
|
75
|
-
"
|
|
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
|
|
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)}](
|
|
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)}](
|
|
118
|
+
lines.append(f"- [{_slug_to_title(s)}]({s}.md)")
|
|
120
119
|
else:
|
|
121
120
|
lines.append(
|
|
122
|
-
"
|
|
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 == "
|
|
672
|
-
diagnostics.warnings.append("No source/config evidence was available for
|
|
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 == "
|
|
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 =
|
|
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.
|
|
472
|
-
'2.
|
|
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", "
|
|
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
|
|