deepdoc 2.1.0__tar.gz → 2.2.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 (155) hide show
  1. {deepdoc-2.1.0 → deepdoc-2.2.0}/PKG-INFO +147 -245
  2. {deepdoc-2.1.0 → deepdoc-2.2.0}/README.md +146 -244
  3. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/changelog_writer.py +10 -2
  4. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/indexer.py +36 -2
  5. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/persistence.py +53 -17
  6. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/service.py +14 -0
  7. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/source_archive.py +72 -1
  8. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/cli.py +68 -3
  9. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/config.py +12 -0
  10. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/generator/__init__.py +8 -0
  11. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/generator/generation.py +97 -0
  12. deepdoc-2.2.0/deepdoc/generator/mdx_compile_gate.py +383 -0
  13. deepdoc-2.2.0/deepdoc/generator/mdx_validator/__init__.py +182 -0
  14. deepdoc-2.2.0/deepdoc/generator/mdx_validator/package.json +12 -0
  15. deepdoc-2.2.0/deepdoc/generator/mdx_validator/validate.mjs +53 -0
  16. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/generator/post_processors.py +11 -0
  17. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/llm/client.py +13 -0
  18. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/persistence_v2.py +124 -17
  19. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/pipeline_v2.py +69 -21
  20. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/bucket_injection.py +20 -0
  21. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/common.py +181 -0
  22. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/endpoint_refs.py +4 -142
  23. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/engine.py +68 -0
  24. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/heuristics.py +4 -142
  25. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/nav_shaping.py +9 -0
  26. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/builder/engine.py +1 -1
  27. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/builder/scaffold_files.py +45 -2
  28. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/smart_update_v2.py +114 -25
  29. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/v2_models.py +33 -0
  30. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc.egg-info/PKG-INFO +147 -245
  31. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc.egg-info/SOURCES.txt +5 -0
  32. {deepdoc-2.1.0 → deepdoc-2.2.0}/pyproject.toml +4 -1
  33. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_index.py +81 -1
  34. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_source_archive.py +78 -1
  35. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_cli_serve.py +92 -0
  36. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_fumadocs_builder.py +45 -0
  37. deepdoc-2.2.0/tests/test_mdx_compile_gate.py +285 -0
  38. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_smart_update.py +149 -0
  39. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_stale.py +28 -0
  40. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_state.py +16 -1
  41. {deepdoc-2.1.0 → deepdoc-2.2.0}/LICENSE +0 -0
  42. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/__init__.py +0 -0
  43. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/__main__.py +0 -0
  44. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/_legacy_types.py +0 -0
  45. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/benchmark_v2.py +0 -0
  46. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/call_graph.py +0 -0
  47. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/__init__.py +0 -0
  48. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/answer_mixin.py +0 -0
  49. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/chunker.py +0 -0
  50. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/deep_research.py +0 -0
  51. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/docs_summary.py +0 -0
  52. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/embeddings.py +0 -0
  53. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/linking.py +0 -0
  54. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/live_fallback_mixin.py +0 -0
  55. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/providers.py +0 -0
  56. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/retrieval_mixin.py +0 -0
  57. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/routes.py +0 -0
  58. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/scaffold.py +0 -0
  59. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/settings.py +0 -0
  60. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/symbol_index.py +0 -0
  61. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/chatbot/types.py +0 -0
  62. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/generator/evidence.py +0 -0
  63. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/generator/validation.py +0 -0
  64. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/llm/__init__.py +0 -0
  65. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/llm/json_utils.py +0 -0
  66. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/llm/litellm_compat.py +0 -0
  67. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/manifest.py +0 -0
  68. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/openapi.py +0 -0
  69. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/__init__.py +0 -0
  70. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/api_detector.py +0 -0
  71. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/base.py +0 -0
  72. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/go_parser.py +0 -0
  73. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/js_ts_parser.py +0 -0
  74. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/php_parser.py +0 -0
  75. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/python_parser.py +0 -0
  76. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/registry.py +0 -0
  77. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/__init__.py +0 -0
  78. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/base.py +0 -0
  79. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/common.py +0 -0
  80. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/detector.py +0 -0
  81. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/django.py +0 -0
  82. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/express.py +0 -0
  83. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/falcon.py +0 -0
  84. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/fastify.py +0 -0
  85. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/go.py +0 -0
  86. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/js_shared.py +0 -0
  87. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/laravel.py +0 -0
  88. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/nestjs.py +0 -0
  89. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/python_shared.py +0 -0
  90. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/registry.py +0 -0
  91. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/routes/repo_resolver.py +0 -0
  92. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/parser/vue_parser.py +0 -0
  93. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/__init__.py +0 -0
  94. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/bucket_refinement.py +0 -0
  95. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/flow_candidates.py +0 -0
  96. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/specializations.py +0 -0
  97. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/topology.py +0 -0
  98. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/planner/utils.py +0 -0
  99. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/prompts/__init__.py +0 -0
  100. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/prompts/bucket_types.py +0 -0
  101. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/prompts/page_types.py +0 -0
  102. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/prompts/selectors.py +0 -0
  103. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/prompts/system.py +0 -0
  104. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/prompts/update.py +0 -0
  105. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/prompts_v2.py +0 -0
  106. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/py.typed +0 -0
  107. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/__init__.py +0 -0
  108. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/artifacts.py +0 -0
  109. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/clustering.py +0 -0
  110. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/common.py +0 -0
  111. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/database.py +0 -0
  112. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/endpoints.py +0 -0
  113. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/integrations.py +0 -0
  114. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/runtime.py +0 -0
  115. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/scanner/utils.py +0 -0
  116. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/__init__.py +0 -0
  117. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/builder/__init__.py +0 -0
  118. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/builder/chatbot_components.py +0 -0
  119. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/builder/common.py +0 -0
  120. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/builder/mdx_utils.py +0 -0
  121. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/site/builder/templates.py +0 -0
  122. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/source_metadata.py +0 -0
  123. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc/updater_v2.py +0 -0
  124. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc.egg-info/dependency_links.txt +0 -0
  125. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc.egg-info/entry_points.txt +0 -0
  126. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc.egg-info/requires.txt +0 -0
  127. {deepdoc-2.1.0 → deepdoc-2.2.0}/deepdoc.egg-info/top_level.txt +0 -0
  128. {deepdoc-2.1.0 → deepdoc-2.2.0}/setup.cfg +0 -0
  129. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_benchmark_scorecard.py +0 -0
  130. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_call_graph.py +0 -0
  131. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_changelog.py +0 -0
  132. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_config.py +0 -0
  133. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_embeddings.py +0 -0
  134. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_eval.py +0 -0
  135. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_persistence.py +0 -0
  136. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_providers.py +0 -0
  137. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_query.py +0 -0
  138. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_relationship.py +0 -0
  139. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_chatbot_scaffold.py +0 -0
  140. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_classify.py +0 -0
  141. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_cli_generate.py +0 -0
  142. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_cli_update.py +0 -0
  143. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_flow_candidates.py +0 -0
  144. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_framework_fixtures.py +0 -0
  145. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_framework_support.py +0 -0
  146. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_generation_evidence.py +0 -0
  147. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_internal_docs_metadata.py +0 -0
  148. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_litellm_compat.py +0 -0
  149. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_llm_json_utils.py +0 -0
  150. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_parallel_pipeline.py +0 -0
  151. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_parser_ranges.py +0 -0
  152. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_planner_consolidation.py +0 -0
  153. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_planner_granularity.py +0 -0
  154. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_route_registry.py +0 -0
  155. {deepdoc-2.1.0 → deepdoc-2.2.0}/tests/test_runtime_scan.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepdoc
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: Auto-generate beautiful docs from any codebase
5
5
  Author: Pranav Kumar
6
6
  License: MIT
@@ -47,29 +47,36 @@ Auto-generate deep engineering documentation from real codebases using AI.
47
47
 
48
48
  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.
49
49
 
50
+ ## Contents
51
+
52
+ - [Quick Start](#quick-start)
53
+ - [Chatbot in 5 Minutes](#chatbot-in-5-minutes)
54
+ - [Installation](#installation)
55
+ - [Commands](#commands)
56
+ - [LLM Provider Setup](#llm-provider-setup)
57
+ - [Configuration](#configuration)
58
+ - [Chatbot](#chatbot)
59
+ - [Supported Languages & Frameworks](#supported-languages--frameworks)
60
+ - [Architecture](#architecture)
61
+ - [Generated Files](#generated-files)
62
+ - [GitHub Actions CI/CD](#github-actions-cicd)
63
+ - [Requirements](#requirements)
64
+ - [Contributing & Release Flow](./CONTRIBUTING.md)
65
+
50
66
  ---
51
67
 
52
68
  ## Features
53
69
 
54
- - **Bucket-Based Documentation Architecture** — Docs are planned as system, feature, endpoint, endpoint reference, integration, and database buckets instead of noisy one-file-per-page output.
55
- - **Five-Phase Pipeline** — Scan, plan, generate, playground, build. Planning and generation are separated so large repos and large files are handled more cleanly.
56
- - **Multi-Step AI Planner** — The planner classifies the repo, proposes buckets, then assigns files, symbols, artifacts, and dependencies into the final doc structure.
57
- - **Giant-File Handling** — Large files are decomposed into feature-aligned clusters so giant controllers or service files can feed multiple doc pages.
58
- - **Reader-First Repo-Agnostic Nav** — The planner normalizes bucket output into a natural onboarding flow (for backend repos: Start Here Core Workflows API Reference → Data Model → runtime/integrations/ops) while preserving full coverage.
59
- - **Large-Database Anti-Noise Grouping** — Sparse singleton model files are coalesced into stable aggregate groups (for example `core-models`) so huge schemas stay complete without one-file-per-page nav spam.
60
- - **Grouped API Reference Docs** — High-level endpoint family pages are AI-planned and enriched from scanned runtime endpoints, avoiding one-page-per-route navigation spam. OpenAPI specs still stage canonical interactive `/api/*` pages when present.
61
- - **Integration Discovery** — Third-party systems like payment gateways, delivery providers, warehouse systems, and webhook integrations can be grouped into integration docs.
62
- - **Trust Signals & Coverage Reporting** — Generated pages include DeepDoc provenance frontmatter and a site badge with the source commit; generation also reports endpoint, file, and symbol coverage plus consistency warnings.
63
- - **Evidence-First Chatbot Answers** Symbol chunks, lexical search, and semantic retrieval gather candidates, but final code proof is hydrated from archived source/config snippets with exact file paths, line ranges, evidence IDs, and validation.
64
- - **Incremental Updates** — `deepdoc update` uses persisted plan and ledger data to regenerate only stale or structurally affected docs.
65
- - **Full Refresh and Clean Rebuild Modes** — `generate --force` fully refreshes DeepDoc-managed docs and removes stale generated pages; `generate --clean --yes` wipes output and rebuilds from scratch.
66
- - **Safe Existing-Docs Behavior** — Plain `generate` refuses to run over an existing DeepDoc-managed docs set and will not silently mix into a non-DeepDoc `docs/` folder.
67
- - **Multi-Language Support** — JavaScript/TypeScript, Python, Go, PHP/Laravel with tree-sitter AST parsing and regex fallback.
68
- - **Configurable LLM** — Works with Anthropic, OpenAI, Azure OpenAI, Ollama, and other LiteLLM-compatible providers.
69
- - **Mermaid Diagrams** — Generated pages can include architecture, flow, and request-sequence diagrams.
70
- - **OpenAPI-Aware API Docs** — Auto-detects OpenAPI/Swagger specs and stages canonical interactive `/api/*` pages in the generated site.
71
- - **Local-First Fumadocs Site** — Generates a `site/` Next.js app with Fumadocs UI, Mermaid rendering, and built-in Orama search.
72
- - **Static Export** — `deepdoc deploy` exports a static site to `site/out/` for any static host.
70
+ - **Bucket-based documentation architecture** — system, feature, endpoint, integration, and database buckets instead of one-file-per-page noise.
71
+ - **Multi-step AI planner** — classifies the repo, proposes buckets, then assigns files, symbols, artifacts, and dependencies into a final reader-first plan.
72
+ - **Giant-file handling** — large files are decomposed into feature-aligned clusters so a single controller can feed multiple doc pages.
73
+ - **MDX compile gate** — every page is compile-checked before being written; broken MDX is auto-fixed via LLM retry or degraded to safe Markdown rather than shipped.
74
+ - **Evidence-first chatbot answers** — final code proof is hydrated from archived source snippets with exact file paths and line ranges, not just retrieval guesses.
75
+ - **Incremental updates** — `deepdoc update` regenerates only stale or structurally affected docs against the last synced commit.
76
+ - **OpenAPI-aware API docs** — auto-detects OpenAPI/Swagger specs and stages interactive `/api/*` pages in the generated site.
77
+ - **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.
78
+
79
+ Works with Anthropic, OpenAI, Azure OpenAI, Google Gemini, Ollama, and any other LiteLLM-compatible provider. Parses Python, JavaScript/TypeScript, Go, PHP, and Vue.
73
80
 
74
81
  ---
75
82
 
@@ -110,12 +117,15 @@ pip install click litellm gitpython rich pyyaml jinja2
110
117
  pip install -e . --no-deps
111
118
  ```
112
119
 
120
+ You will also need **Node 18+** on `PATH`. DeepDoc uses Node at generate time to compile-check each MDX page before writing it, and at `serve`/`deploy` time for the Fumadocs site. The small set of MDX validation dependencies installs into `deepdoc/generator/mdx_validator/node_modules/` automatically on first `deepdoc generate`.
121
+
113
122
  ### Verify installation
114
123
 
115
124
  ```bash
116
125
  deepdoc --version
117
126
  deepdoc --help
118
127
  python -m deepdoc --help
128
+ node --version # must report 18 or higher
119
129
  ```
120
130
 
121
131
  If you installed the chatbot extra, you can verify those dependencies with:
@@ -128,128 +138,85 @@ pip show faiss-cpu fastapi uvicorn
128
138
 
129
139
  ## Quick Start
130
140
 
131
- DeepDoc has two separate model surfaces:
132
-
133
- - `llm.*` powers planning and doc generation.
134
- - `chatbot.answer.*` and `chatbot.embeddings.*` power the optional chatbot.
135
-
136
- If you only want generated docs, configure `llm.*` and skip the chatbot sections.
137
- If you want docs plus chatbot, install `deepdoc[chatbot]` and configure both.
138
-
139
- When `chatbot.enabled` is `false`, DeepDoc now generates a docs-only site: no chatbot route, no chatbot UI components, and no `chatbot_backend/` scaffold.
140
-
141
- ### Docs Only
141
+ ### Docs only
142
142
 
143
143
  ```bash
144
- # 1. Go to your project
145
144
  cd /path/to/your-project
146
-
147
- # 2. Initialize DeepDoc
148
145
  deepdoc init --provider anthropic
149
-
150
- # 3. Set your API key
151
146
  export ANTHROPIC_API_KEY=sk-ant-...
152
-
153
- # 4. Generate docs
154
147
  deepdoc generate
148
+ deepdoc serve # → http://localhost:3000
149
+ ```
155
150
 
156
- # 5. Preview locally
157
- deepdoc serve
158
- # → Open http://localhost:3000
151
+ ### Docs + chatbot — one env var
152
+
153
+ ```bash
154
+ cd /path/to/your-project
155
+ pip install "deepdoc[chatbot]"
156
+ deepdoc init --with-chatbot --provider anthropic
157
+ export ANTHROPIC_API_KEY=sk-ant-...
158
+ deepdoc generate
159
+ deepdoc serve # → http://localhost:3000 • chatbot at /ask
159
160
  ```
160
161
 
161
- ### Docs + Chatbot
162
+ The chatbot reuses your doc-gen LLM and runs embeddings locally via `fastembed`. **No extra keys, no extra config.** Swap `--provider anthropic` for `openai`, `gemini`, `azure`, or `ollama` to use a different LLM.
162
163
 
163
- If you also want the AI chatbot, see **[Chatbot in 5 Minutes](#chatbot-in-5-minutes)** right below for complete copy-paste setup for every major provider.
164
+ When `chatbot.enabled` is `false`, DeepDoc generates a docs-only site: no chatbot route, no chatbot UI components, and no `chatbot_backend/` scaffold.
164
165
 
165
166
  ---
166
167
 
167
168
  ## Chatbot in 5 Minutes
168
169
 
169
- Pick your provider and copy-paste the entire block. Each recipe gets you from zero to a working chatbot at `localhost:3000/ask`.
170
-
171
- > **You do not need to tune anything.** The defaults for retrieval, chunking, and reranking all work out of the box. Advanced configuration is in the [Chatbot](#chatbot) section further down.
170
+ > **Defaults work out of the box.** The chatbot inherits your `llm.*` config and runs embeddings locally via `fastembed`. The recipes below only add config when you actually need to override the defaults (Azure endpoints, custom Ollama base URL, or mixing providers).
172
171
 
173
- ### OpenAIOne Key for Everything
172
+ ### Single provider one key for everything
174
173
 
175
- Simplest setup. One API key powers docs, answers, and embeddings.
174
+ This is the path 95% of users want. Anthropic shown; swap `--provider` for `openai`, `gemini`, etc.
176
175
 
177
176
  ```bash
178
177
  pip install "deepdoc[chatbot]"
179
178
  cd /path/to/your-project
180
179
 
181
- export OPENAI_API_KEY=sk-...
182
-
183
- deepdoc init --with-chatbot --provider openai --model gpt-4o
184
-
185
- # Wire chatbot to the same OpenAI key
186
- deepdoc config set chatbot.answer.provider openai
187
- deepdoc config set chatbot.answer.model gpt-4o-mini
188
- deepdoc config set chatbot.answer.api_key_env OPENAI_API_KEY
189
- deepdoc config set chatbot.embeddings.provider openai
190
- deepdoc config set chatbot.embeddings.model text-embedding-3-large
191
- deepdoc config set chatbot.embeddings.api_key_env OPENAI_API_KEY
180
+ deepdoc init --with-chatbot --provider anthropic
181
+ export ANTHROPIC_API_KEY=sk-ant-...
192
182
 
193
183
  deepdoc generate
194
184
  deepdoc serve
195
185
  # → Docs at http://localhost:3000 • Chatbot at http://localhost:3000/ask
196
186
  ```
197
187
 
198
- ### Claude + OpenAI Embeddings
188
+ ### Mix providers different LLM for chat than for docs
199
189
 
200
- Claude for docs and answers, OpenAI for embeddings (Anthropic doesn't offer embedding models).
190
+ Use Claude for docs (great long-form), GPT-4o-mini for chat answers (fast + cheap), local embeddings.
201
191
 
202
192
  ```bash
203
193
  pip install "deepdoc[chatbot]"
204
194
  cd /path/to/your-project
205
195
 
196
+ deepdoc init --with-chatbot --provider anthropic
206
197
  export ANTHROPIC_API_KEY=sk-ant-...
207
198
  export OPENAI_API_KEY=sk-...
208
199
 
209
- deepdoc init --with-chatbot --provider anthropic
210
-
211
- deepdoc config set chatbot.answer.provider anthropic
212
- deepdoc config set chatbot.answer.model claude-3-5-sonnet-20241022
213
- deepdoc config set chatbot.answer.api_key_env ANTHROPIC_API_KEY
214
- deepdoc config set chatbot.embeddings.provider openai
215
- deepdoc config set chatbot.embeddings.model text-embedding-3-large
216
- deepdoc config set chatbot.embeddings.api_key_env OPENAI_API_KEY
200
+ deepdoc config set chatbot.answer.provider openai
201
+ deepdoc config set chatbot.answer.model gpt-4o-mini
202
+ deepdoc config set chatbot.answer.api_key_env OPENAI_API_KEY
217
203
 
218
204
  deepdoc generate
219
205
  deepdoc serve
220
- # → Docs at http://localhost:3000 • Chatbot at http://localhost:3000/ask
221
206
  ```
222
207
 
223
- ### Google Gemini One Key for Everything
224
-
225
- One Gemini API key for docs, answers, and embeddings. Keep the `gemini/` prefix.
208
+ Want cloud embeddings instead of local? Add:
226
209
 
227
210
  ```bash
228
- pip install "deepdoc[chatbot]"
229
- cd /path/to/your-project
230
-
231
- export GEMINI_API_KEY=...
232
-
233
- deepdoc init --with-chatbot
234
- deepdoc config set llm.provider gemini
235
- deepdoc config set llm.model gemini/gemini-2.0-flash
236
- deepdoc config set llm.api_key_env GEMINI_API_KEY
237
-
238
- deepdoc config set chatbot.answer.provider gemini
239
- deepdoc config set chatbot.answer.model gemini/gemini-2.0-flash
240
- deepdoc config set chatbot.answer.api_key_env GEMINI_API_KEY
241
- deepdoc config set chatbot.embeddings.provider gemini
242
- deepdoc config set chatbot.embeddings.model gemini/text-embedding-004
243
- deepdoc config set chatbot.embeddings.api_key_env GEMINI_API_KEY
244
-
245
- deepdoc generate
246
- deepdoc serve
247
- # → Docs at http://localhost:3000 • Chatbot at http://localhost:3000/ask
211
+ deepdoc config set chatbot.embeddings.backend litellm
212
+ deepdoc config set chatbot.embeddings.provider openai
213
+ deepdoc config set chatbot.embeddings.model text-embedding-3-large
214
+ deepdoc config set chatbot.embeddings.api_key_env OPENAI_API_KEY
248
215
  ```
249
216
 
250
217
  ### Azure OpenAI
251
218
 
252
- Replace `YOUR-RESOURCE` and deployment names with your actual Azure values.
219
+ Azure deployments need explicit endpoint + API-version values. Replace `YOUR-RESOURCE` and deployment names with your actual values.
253
220
 
254
221
  ```bash
255
222
  pip install "deepdoc[chatbot]"
@@ -261,11 +228,8 @@ export AZURE_API_BASE=https://YOUR-RESOURCE.openai.azure.com
261
228
  deepdoc init --with-chatbot --provider azure --model azure/gpt-4o
262
229
  deepdoc config set llm.base_url $AZURE_API_BASE
263
230
 
264
- deepdoc config set chatbot.answer.provider azure
265
- deepdoc config set chatbot.answer.model azure/gpt-4o-mini
266
- deepdoc config set chatbot.answer.api_key_env AZURE_API_KEY
267
- deepdoc config set chatbot.answer.base_url $AZURE_API_BASE
268
- deepdoc config set chatbot.answer.api_version 2024-02-01
231
+ # Only embeddings need separate Azure config (different deployment)
232
+ deepdoc config set chatbot.embeddings.backend litellm
269
233
  deepdoc config set chatbot.embeddings.provider azure
270
234
  deepdoc config set chatbot.embeddings.model azure/text-embedding-3-large
271
235
  deepdoc config set chatbot.embeddings.api_key_env AZURE_API_KEY
@@ -274,10 +238,11 @@ deepdoc config set chatbot.embeddings.api_version 2024-02-01
274
238
 
275
239
  deepdoc generate
276
240
  deepdoc serve
277
- # → Docs at http://localhost:3000 • Chatbot at http://localhost:3000/ask
278
241
  ```
279
242
 
280
- ### Ollama Fully Local, No API Keys
243
+ The answer LLM inherits `llm.*` (Azure deployment + base URL + key) automatically.
244
+
245
+ ### Ollama — Fully local, no API keys
281
246
 
282
247
  Free and private. Runs everything on your machine.
283
248
 
@@ -289,11 +254,7 @@ cd /path/to/your-project
289
254
  ollama pull llama3.2
290
255
 
291
256
  deepdoc init --with-chatbot --provider ollama --model ollama/llama3.2
292
-
293
- deepdoc config set chatbot.answer.provider ollama
294
- deepdoc config set chatbot.answer.model ollama/llama3.2
295
- deepdoc config set chatbot.answer.base_url http://localhost:11434
296
- deepdoc config set chatbot.embeddings.backend fastembed
257
+ deepdoc config set llm.base_url http://localhost:11434
297
258
 
298
259
  deepdoc generate
299
260
  deepdoc serve
@@ -373,7 +334,7 @@ deepdoc generate --exclude "tests/**"
373
334
 
374
335
  1. **Phase 1: Scan** — Walk the repo, parse supported languages, detect endpoints, config/setup artifacts, runtime surfaces, integration signals, and OpenAPI specs.
375
336
  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.
376
- 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.
337
+ 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 an MDX compile-check (with bounded LLM-driven retry on failure) before being written to disk.
377
338
  4. **Phase 4: API Ref** — Stage OpenAPI assets for the generated Fumadocs `/api/*` pages when a spec exists.
378
339
  5. **Phase 5: Build** — Write the generated `site/` Fumadocs scaffold, page tree, search route, and static assets from the generated plan.
379
340
 
@@ -398,6 +359,7 @@ deepdoc update # Normal ongoing refresh
398
359
  deepdoc update --since HEAD~3 # Changes in last 3 commits
399
360
  deepdoc update --since main # All changes since branching from main
400
361
  deepdoc update --replan # Force a full replan
362
+ deepdoc update --strict-quality # Fail if generated docs are invalid/degraded
401
363
  deepdoc update --deploy # Update + deploy
402
364
  ```
403
365
 
@@ -415,6 +377,7 @@ deepdoc update --deploy # Update + deploy
415
377
  8. Rebuilds site config and nav afterward.
416
378
 
417
379
  If git is unavailable, it falls back to hash-based staleness detection for recovery.
380
+ When `--deploy` is used, DeepDoc deploys only after a fully successful update; failed page generation or chatbot sync blocks deployment.
418
381
 
419
382
  Generation writes quality artifacts under `.deepdoc/`:
420
383
 
@@ -429,7 +392,7 @@ Generated MDX pages include provenance frontmatter such as `deepdoc_generated_co
429
392
  |------|---------|-------------|
430
393
  | `--since` | last synced commit | Git ref to diff against |
431
394
  | `--replan` | off | Force a full replan even if the change set looks incremental |
432
- | `--deploy` | off | Deploy after updating |
395
+ | `--deploy` | off | Deploy after a fully successful update |
433
396
 
434
397
  ### `deepdoc status`
435
398
 
@@ -748,9 +711,11 @@ site:
748
711
 
749
712
  DeepDoc can generate an AI-powered chatbot that answers questions about your codebase using evidence-first RAG. Retrieval indexes find candidate files, but final code proof always comes from archived source/config snippets with exact file paths and line ranges. Generated docs and repo-authored docs can help explain concepts, but they are returned as references, not right-pane code evidence.
750
713
 
714
+ > **Defaults you should know.** The chatbot **inherits** `provider`, `model`, and `api_key_env` from your `llm.*` config when `chatbot.answer.*` is empty (the scaffolded default). Embeddings default to `fastembed` — fully local, no API key. You only need extra config if (a) you want a different LLM for chat than for docs, or (b) you want cloud embeddings.
715
+
751
716
  If chatbot is disabled, DeepDoc keeps the generated site docs-only: it does not generate the `/ask` route, chatbot frontend components, or `chatbot_backend/` scaffold.
752
717
 
753
- > **Already running?** If you followed the [Chatbot in 5 Minutes](#chatbot-in-5-minutes) guide above, your chatbot is already configured and working. Everything below is for advanced configuration, tuning, and production deployment. **The defaults work well out of the box** — most users never need to change the settings below.
718
+ > **Already running?** If you followed the [Chatbot in 5 Minutes](#chatbot-in-5-minutes) guide above, your chatbot is already configured and working. Everything below is for advanced configuration, tuning, and production deployment.
754
719
 
755
720
  ### How the Model Surfaces Work
756
721
 
@@ -787,99 +752,70 @@ Public endpoints remain stable:
787
752
 
788
753
  ### Provider Recipes
789
754
 
790
- #### Claude For Docs + Chatbot Answers
755
+ These are advanced recipes that override the inheritance defaults — e.g. mixing providers or using cloud embeddings. For the simple "one key for everything" path, see [Chatbot in 5 Minutes](#chatbot-in-5-minutes) above.
756
+
757
+ #### Claude for docs, OpenAI for embeddings
791
758
 
792
- Anthropic works well for doc generation and chatbot answers, but you still need a separate embeddings provider.
759
+ Claude doesn't offer embedding models, so cloud embeddings need a separate provider. (Or just keep the default `fastembed` and skip this entirely.)
793
760
 
794
761
  ```bash
795
762
  export ANTHROPIC_API_KEY=...
796
763
  export OPENAI_API_KEY=...
797
- export DEEPDOC_CHAT_API_KEY=$ANTHROPIC_API_KEY
798
- export DEEPDOC_EMBED_API_KEY=$OPENAI_API_KEY
799
764
 
800
765
  deepdoc config set llm.provider anthropic
801
766
  deepdoc config set llm.model claude-3-5-sonnet-20241022
802
767
  deepdoc config set llm.api_key_env ANTHROPIC_API_KEY
803
768
 
804
769
  deepdoc config set chatbot.enabled true
805
- deepdoc config set chatbot.answer.provider anthropic
806
- deepdoc config set chatbot.answer.model claude-3-5-sonnet-20241022
807
- deepdoc config set chatbot.answer.api_key_env DEEPDOC_CHAT_API_KEY
808
-
770
+ deepdoc config set chatbot.embeddings.backend litellm
809
771
  deepdoc config set chatbot.embeddings.provider openai
810
772
  deepdoc config set chatbot.embeddings.model text-embedding-3-large
811
- deepdoc config set chatbot.embeddings.api_key_env DEEPDOC_EMBED_API_KEY
773
+ deepdoc config set chatbot.embeddings.api_key_env OPENAI_API_KEY
812
774
  ```
813
775
 
814
- #### OpenAI For Docs + Chatbot
776
+ The chatbot answer LLM inherits `llm.*` (Claude) automatically.
777
+
778
+ #### Different model for chat than for docs
779
+
780
+ Claude for docs, GPT-4o-mini for cheaper/faster chat answers. Embeddings stay local.
815
781
 
816
782
  ```bash
783
+ export ANTHROPIC_API_KEY=...
817
784
  export OPENAI_API_KEY=...
818
- export DEEPDOC_CHAT_API_KEY=$OPENAI_API_KEY
819
- export DEEPDOC_EMBED_API_KEY=$OPENAI_API_KEY
820
785
 
821
- deepdoc config set llm.provider openai
822
- deepdoc config set llm.model gpt-4o
823
- deepdoc config set llm.api_key_env OPENAI_API_KEY
786
+ deepdoc config set llm.provider anthropic
787
+ deepdoc config set llm.model claude-3-5-sonnet-20241022
788
+ deepdoc config set llm.api_key_env ANTHROPIC_API_KEY
824
789
 
825
790
  deepdoc config set chatbot.enabled true
826
791
  deepdoc config set chatbot.answer.provider openai
827
792
  deepdoc config set chatbot.answer.model gpt-4o-mini
828
- deepdoc config set chatbot.answer.api_key_env DEEPDOC_CHAT_API_KEY
829
-
830
- deepdoc config set chatbot.embeddings.provider openai
831
- deepdoc config set chatbot.embeddings.model text-embedding-3-large
832
- deepdoc config set chatbot.embeddings.api_key_env DEEPDOC_EMBED_API_KEY
793
+ deepdoc config set chatbot.answer.api_key_env OPENAI_API_KEY
833
794
  ```
834
795
 
835
- #### Google Gemini For Docs + Chatbot
836
-
837
- With Google AI Studio, keep the `gemini/` prefix in model names and use `GEMINI_API_KEY`.
838
-
839
- ```bash
840
- export GEMINI_API_KEY=...
841
- export DEEPDOC_CHAT_API_KEY=$GEMINI_API_KEY
842
- export DEEPDOC_EMBED_API_KEY=$GEMINI_API_KEY
843
-
844
- deepdoc config set llm.provider gemini
845
- deepdoc config set llm.model gemini/gemini-2.0-flash
846
- deepdoc config set llm.api_key_env GEMINI_API_KEY
847
-
848
- deepdoc config set chatbot.enabled true
849
- deepdoc config set chatbot.answer.provider gemini
850
- deepdoc config set chatbot.answer.model gemini/gemini-2.0-flash
851
- deepdoc config set chatbot.answer.api_key_env DEEPDOC_CHAT_API_KEY
852
-
853
- deepdoc config set chatbot.embeddings.provider gemini
854
- deepdoc config set chatbot.embeddings.model gemini/text-embedding-004
855
- deepdoc config set chatbot.embeddings.api_key_env DEEPDOC_EMBED_API_KEY
856
- ```
796
+ #### Azure with separate embedding deployment
857
797
 
858
- #### Azure For Docs + Chatbot
798
+ Azure deployments need explicit `base_url` + `api_version`, and embeddings typically live on a different deployment.
859
799
 
860
800
  ```bash
861
- export AZURE_OPENAI_API_KEY=...
862
- export AZURE_EMBEDDING_API_KEY=...
801
+ export AZURE_API_KEY=...
863
802
 
864
803
  deepdoc config set llm.provider azure
865
804
  deepdoc config set llm.model azure/gpt-4.1
866
- deepdoc config set llm.api_key_env AZURE_OPENAI_API_KEY
805
+ deepdoc config set llm.api_key_env AZURE_API_KEY
867
806
  deepdoc config set llm.base_url https://YOUR-RESOURCE.openai.azure.com/
868
807
 
869
808
  deepdoc config set chatbot.enabled true
870
- deepdoc config set chatbot.answer.provider azure
871
- deepdoc config set chatbot.answer.model azure/gpt-4.1
872
- deepdoc config set chatbot.answer.api_key_env AZURE_OPENAI_API_KEY
873
- deepdoc config set chatbot.answer.base_url https://YOUR-RESOURCE.openai.azure.com/
874
- deepdoc config set chatbot.answer.api_version 2024-02-15-preview
875
-
809
+ deepdoc config set chatbot.embeddings.backend litellm
876
810
  deepdoc config set chatbot.embeddings.provider azure
877
811
  deepdoc config set chatbot.embeddings.model azure/text-embedding-3-small
878
- deepdoc config set chatbot.embeddings.api_key_env AZURE_EMBEDDING_API_KEY
812
+ deepdoc config set chatbot.embeddings.api_key_env AZURE_API_KEY
879
813
  deepdoc config set chatbot.embeddings.base_url https://YOUR-RESOURCE.openai.azure.com/
880
814
  deepdoc config set chatbot.embeddings.api_version 2024-02-15-preview
881
815
  ```
882
816
 
817
+ The answer LLM inherits `llm.*` (Azure deployment, base URL, version, key) automatically — no `chatbot.answer.*` config needed for Azure.
818
+
883
819
  ### Installation
884
820
 
885
821
  The chatbot requires extra dependencies not included in the base install:
@@ -1009,10 +945,15 @@ chatbot:
1009
945
 
1010
946
  ### Chatbot Configuration Reference
1011
947
 
948
+ The defaults work for almost every project. Expand below only when you need to tune a specific knob.
949
+
950
+ <details>
951
+ <summary><strong>Full chatbot configuration reference (60+ keys)</strong></summary>
952
+
1012
953
  | Key | Default | Description |
1013
954
  |-----|---------|-------------|
1014
955
  | **General** | | |
1015
- | `chatbot.enabled` | `false` | Enable chatbot indexing and backend |
956
+ | `chatbot.enabled` | `false` | Enable chatbot indexing and backend (set automatically by `deepdoc init --with-chatbot`) |
1016
957
  | `chatbot.index_dir` | `.deepdoc/chatbot` | Directory for source archive/catalog, SQLite lexical index, vector indexes, relationship artifacts, and chunk data |
1017
958
  | **Indexing** | | |
1018
959
  | `chatbot.indexing.include_repo_docs` | `true` | Index selected repo-authored docs such as README/design notes in a separate corpus |
@@ -1099,6 +1040,8 @@ chatbot:
1099
1040
  | `chatbot.chunking.max_doc_summary_chunks_per_page` | `4` | Doc summary chunks extracted per page |
1100
1041
  | `chatbot.chunking.max_doc_summary_chars` | `4000` | Max chars per doc summary chunk |
1101
1042
 
1043
+ </details>
1044
+
1102
1045
  ### Chatbot Provider Examples
1103
1046
 
1104
1047
  The chatbot's `answer` and `embeddings` sections are configured independently from the main `llm` section, so you can use different providers for doc generation vs. chatbot.
@@ -1490,7 +1433,7 @@ jobs:
1490
1433
  env:
1491
1434
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
1492
1435
  run: |
1493
- deepdoc update --deploy
1436
+ deepdoc update --strict-quality --deploy
1494
1437
 
1495
1438
  - name: Upload Pages artifact
1496
1439
  uses: actions/upload-pages-artifact@v3
@@ -1509,101 +1452,59 @@ jobs:
1509
1452
 
1510
1453
  Add your API key to repo Settings → Secrets → Actions → `ANTHROPIC_API_KEY`.
1511
1454
 
1512
- ---
1513
-
1514
- ## Releasing
1515
-
1516
- DeepDoc now supports automated releases through GitHub Actions.
1517
-
1518
- ### Release tracks
1519
-
1520
- This repository now has two independent release tracks:
1455
+ If you self-host and just want docs kept fresh without deploying to GitHub Pages, use this minimal variant instead — it commits the refreshed `docs/` and `.deepdoc/` state back to the branch:
1521
1456
 
1522
- - **Python package (`deepdoc`)**: controlled by `pyproject.toml`, root `CHANGELOG.md`, and `.github/workflows/release.yml`.
1523
- - **VS Code extension (`vscode-extension/`)**: controlled by `vscode-extension/package.json`, `vscode-extension/CHANGELOG.md`, and `.github/workflows/release-vscode-extension.yml`.
1524
-
1525
- Keep versions and changelog entries separated by track.
1526
-
1527
- ### What happens automatically
1528
-
1529
- When you push to `main`, the release workflow checks the version in `pyproject.toml`.
1530
- If that version does not already have a matching Git tag like `v0.1.1`, GitHub Actions will:
1531
-
1532
- - build the package
1533
- - publish it to PyPI
1534
- - create the Git tag
1535
- - create a GitHub Release and attach the built files
1536
- - use the matching section from `CHANGELOG.md` as the release notes when present
1537
-
1538
- ### Your release flow
1457
+ ```yaml
1458
+ # .github/workflows/deepdoc-refresh.yml
1459
+ name: Refresh Docs
1539
1460
 
1540
- 1. Update `version = "..."` in `pyproject.toml`
1541
- 2. Update `__version__ = "..."` in `deepdoc/__init__.py`
1542
- 3. Add a matching section to `CHANGELOG.md`
1543
- 4. Commit your changes
1544
- 5. Push to `main`
1461
+ on:
1462
+ push:
1463
+ branches: [main]
1545
1464
 
1546
- That is it. You do not need to manually create tags or GitHub Releases anymore.
1465
+ jobs:
1466
+ refresh:
1467
+ runs-on: ubuntu-latest
1468
+ permissions:
1469
+ contents: write
1547
1470
 
1548
- ### Changelog format
1471
+ steps:
1472
+ - uses: actions/checkout@v4
1473
+ with:
1474
+ fetch-depth: 0 # Full history needed for git diff
1549
1475
 
1550
- The release workflow looks for a section in `CHANGELOG.md` that matches the version in `pyproject.toml`.
1551
- These heading styles all work:
1476
+ - uses: actions/setup-python@v5
1477
+ with:
1478
+ python-version: "3.11"
1552
1479
 
1553
- - `## 0.1.2`
1554
- - `## [0.1.2]`
1555
- - `## v0.1.2`
1556
- - `## [0.1.2] - 2026-04-03`
1480
+ - uses: actions/setup-node@v4
1481
+ with:
1482
+ node-version: "20"
1557
1483
 
1558
- Example:
1484
+ - name: Install deepdoc
1485
+ run: pip install deepdoc
1559
1486
 
1560
- ```md
1561
- ## [0.1.2] - 2026-04-03
1487
+ - name: Refresh docs
1488
+ env:
1489
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
1490
+ run: deepdoc update --strict-quality
1562
1491
 
1563
- - Added automated GitHub releases
1564
- - Improved PyPI metadata
1565
- - Documented `deepdoc[chatbot]` installation
1492
+ - name: Commit updated docs
1493
+ run: |
1494
+ git config user.name "github-actions[bot]"
1495
+ git config user.email "github-actions[bot]@users.noreply.github.com"
1496
+ git add docs/ .deepdoc/
1497
+ git diff --cached --quiet || git commit -m "chore: refresh docs [skip ci]"
1498
+ git push
1566
1499
  ```
1567
1500
 
1568
- If the matching version section is missing, GitHub falls back to auto-generated release notes.
1569
-
1570
- ### One-time setup
1501
+ The `[skip ci]` tag on the commit message prevents the workflow from triggering itself again.
1571
1502
 
1572
- 1. On PyPI, open the `deepdoc` project
1573
- 2. Go to `Publishing`
1574
- 3. Add a Trusted Publisher for GitHub Actions with:
1575
- - owner: `tss-pranavkumar`
1576
- - repository: `deepdoc`
1577
- - workflow filename: `release.yml`
1578
- - environment name: `pypi`
1579
- 4. In GitHub, open Settings → Actions → General
1580
- 5. Set Workflow permissions to `Read and write permissions`
1581
-
1582
- After that, every new version pushed to `main` can publish without a PyPI token.
1583
-
1584
- ### VS Code extension release flow
1585
-
1586
- The VS Code extension release is automated from `main` when files under `vscode-extension/` change.
1587
-
1588
- What the extension workflow does:
1589
-
1590
- - reads `vscode-extension/package.json` version
1591
- - checks whether tag `vscode-extension-v<version>` already exists
1592
- - builds and packages the extension
1593
- - publishes to Marketplace using `VSCE_PAT`
1594
- - creates and pushes the matching git tag
1595
- - creates a GitHub release with notes from `vscode-extension/CHANGELOG.md` (fallback to generated notes)
1596
-
1597
- One-time setup for extension publishing:
1598
-
1599
- 1. Create a VS Code Marketplace PAT with Manage scope for publisher `Pranawww`
1600
- 2. Add repo secret `VSCE_PAT` in GitHub Actions secrets
1503
+ ---
1601
1504
 
1602
- Extension release flow on each version:
1505
+ ## Contributing & Releases
1603
1506
 
1604
- 1. Update `vscode-extension/package.json` version
1605
- 2. Add matching section to `vscode-extension/CHANGELOG.md`
1606
- 3. Commit and push to `main`
1507
+ Release flow for the Python package and the VS Code extension, plus repo layout and test-running notes, lives in [CONTRIBUTING.md](./CONTRIBUTING.md). Both tracks publish automatically when you push a version bump to `main`.
1607
1508
 
1608
1509
  ---
1609
1510
 
@@ -1649,6 +1550,7 @@ deepdoc generate --force # Full regen with new model
1649
1550
  ## Requirements
1650
1551
 
1651
1552
  - Python 3.10+
1553
+ - **Node 18+** on `PATH` — used at generate time for MDX compile validation, and at `serve`/`deploy` time for the Fumadocs site
1652
1554
  - Git (for `deepdoc update` and `deepdoc deploy`)
1653
1555
  - An LLM API key (or Ollama running locally)
1654
1556