mdengine 0.7.0__tar.gz → 0.8.1__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 (467) hide show
  1. {mdengine-0.7.0/src/mdengine.egg-info → mdengine-0.8.1}/PKG-INFO +149 -5
  2. {mdengine-0.7.0 → mdengine-0.8.1}/README.md +137 -4
  3. {mdengine-0.7.0 → mdengine-0.8.1}/pyproject.toml +18 -1
  4. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/__init__.py +1 -1
  5. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/analyzers/flow_analyzer.py +28 -9
  6. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/job_manager.py +2 -19
  7. mdengine-0.8.1/src/md_generator/codeflow/api/schemas.py +364 -0
  8. mdengine-0.8.1/src/md_generator/codeflow/api/semantic_api.py +69 -0
  9. mdengine-0.8.1/src/md_generator/codeflow/cli/main.py +548 -0
  10. mdengine-0.8.1/src/md_generator/codeflow/config/__init__.py +13 -0
  11. mdengine-0.8.1/src/md_generator/codeflow/config/codeflow_yaml.py +45 -0
  12. mdengine-0.8.1/src/md_generator/codeflow/core/__init__.py +13 -0
  13. mdengine-0.8.1/src/md_generator/codeflow/core/extractor.py +683 -0
  14. mdengine-0.8.1/src/md_generator/codeflow/core/run_config.py +109 -0
  15. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/entry_detector.py +28 -1
  16. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/entry_rank.py +4 -4
  17. mdengine-0.8.1/src/md_generator/codeflow/detectors/event_detector.py +126 -0
  18. mdengine-0.8.1/src/md_generator/codeflow/detectors/liferay_portlet_detector.py +196 -0
  19. mdengine-0.8.1/src/md_generator/codeflow/generators/cfg_paths_markdown.py +114 -0
  20. mdengine-0.8.1/src/md_generator/codeflow/generators/cfg_paths_mermaid.py +30 -0
  21. mdengine-0.8.1/src/md_generator/codeflow/generators/cfg_render.py +121 -0
  22. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/cytoscape_enrich.py +6 -3
  23. mdengine-0.8.1/src/md_generator/codeflow/generators/entry_markdown.py +559 -0
  24. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/flow_summary.py +7 -8
  25. mdengine-0.8.1/src/md_generator/codeflow/generators/flow_tree.py +56 -0
  26. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/html.py +1 -0
  27. mdengine-0.8.1/src/md_generator/codeflow/generators/html_unified.py +285 -0
  28. mdengine-0.8.1/src/md_generator/codeflow/generators/markdown.py +133 -0
  29. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/mermaid.py +14 -2
  30. mdengine-0.8.1/src/md_generator/codeflow/graph/__init__.py +6 -0
  31. mdengine-0.8.1/src/md_generator/codeflow/graph/analysis.py +93 -0
  32. mdengine-0.8.1/src/md_generator/codeflow/graph/builder.py +478 -0
  33. mdengine-0.8.1/src/md_generator/codeflow/graph/call_expander.py +160 -0
  34. mdengine-0.8.1/src/md_generator/codeflow/graph/cfg_builder.py +435 -0
  35. mdengine-0.8.1/src/md_generator/codeflow/graph/cfg_copy.py +41 -0
  36. mdengine-0.8.1/src/md_generator/codeflow/graph/cfg_model.py +49 -0
  37. mdengine-0.8.1/src/md_generator/codeflow/graph/clustering.py +178 -0
  38. mdengine-0.8.1/src/md_generator/codeflow/graph/embeddings.py +193 -0
  39. mdengine-0.8.1/src/md_generator/codeflow/graph/enricher.py +74 -0
  40. mdengine-0.8.1/src/md_generator/codeflow/graph/event_graph.py +55 -0
  41. mdengine-0.8.1/src/md_generator/codeflow/graph/export_schema.py +278 -0
  42. mdengine-0.8.1/src/md_generator/codeflow/graph/multigraph_utils.py +106 -0
  43. mdengine-0.8.1/src/md_generator/codeflow/graph/path_enumerator.py +92 -0
  44. mdengine-0.8.1/src/md_generator/codeflow/graph/path_probability.py +64 -0
  45. mdengine-0.8.1/src/md_generator/codeflow/graph/query_engine.py +81 -0
  46. mdengine-0.8.1/src/md_generator/codeflow/graph/relations.py +35 -0
  47. mdengine-0.8.1/src/md_generator/codeflow/graph/runtime_integration.py +32 -0
  48. mdengine-0.8.1/src/md_generator/codeflow/graph/semantic_enricher.py +76 -0
  49. mdengine-0.8.1/src/md_generator/codeflow/graph/semantic_index.py +84 -0
  50. mdengine-0.8.1/src/md_generator/codeflow/graph/sqlite_export.py +56 -0
  51. mdengine-0.8.1/src/md_generator/codeflow/ingestion/git_loader.py +209 -0
  52. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/mcp/server.py +22 -5
  53. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/models/ir.py +30 -0
  54. mdengine-0.8.1/src/md_generator/codeflow/models/ir_cfg.py +42 -0
  55. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/__init__.py +16 -0
  56. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/cpp_adapter.py +229 -0
  57. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/go_adapter.py +15 -0
  58. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/ir_from_dump.py +75 -0
  59. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/java_adapter.py +186 -0
  60. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/php_adapter.py +15 -0
  61. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/python_adapter.py +185 -0
  62. mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/treesitter_adapter.py +218 -0
  63. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/cpp_parser.py +84 -3
  64. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/go_parser.py +26 -4
  65. mdengine-0.8.1/src/md_generator/codeflow/parsers/ir_enrich.py +41 -0
  66. mdengine-0.8.1/src/md_generator/codeflow/parsers/java_parser.py +371 -0
  67. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/php_parser.py +40 -4
  68. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/python_parser.py +31 -1
  69. mdengine-0.8.1/src/md_generator/codeflow/parsers/treesitter_js_ts_parser.py +339 -0
  70. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/rules/collector.py +17 -8
  71. mdengine-0.8.1/src/md_generator/codeflow/rules/cpp_rules.py +113 -0
  72. mdengine-0.8.1/src/md_generator/codeflow/rules/java_rules.py +188 -0
  73. mdengine-0.8.1/src/md_generator/codeflow/utils/tools_root.py +16 -0
  74. mdengine-0.8.1/src/md_generator/codeflow/worker/__init__.py +1 -0
  75. mdengine-0.8.1/src/md_generator/codeflow/worker/celery_optional.py +22 -0
  76. mdengine-0.8.1/src/md_generator/engine_cli.py +65 -0
  77. mdengine-0.8.1/src/md_generator/tools/__init__.py +1 -0
  78. mdengine-0.8.1/src/md_generator/tools/assistant/__init__.py +6 -0
  79. mdengine-0.8.1/src/md_generator/tools/assistant/adapters/__init__.py +5 -0
  80. mdengine-0.8.1/src/md_generator/tools/assistant/adapters/claude.py +30 -0
  81. mdengine-0.8.1/src/md_generator/tools/assistant/adapters/cursor.py +20 -0
  82. mdengine-0.8.1/src/md_generator/tools/assistant/adapters/openai.py +27 -0
  83. mdengine-0.8.1/src/md_generator/tools/assistant/agent.py +152 -0
  84. mdengine-0.8.1/src/md_generator/tools/assistant/bundle.py +12 -0
  85. mdengine-0.8.1/src/md_generator/tools/assistant/chunks.py +54 -0
  86. mdengine-0.8.1/src/md_generator/tools/assistant/cli.py +73 -0
  87. mdengine-0.8.1/src/md_generator/tools/assistant/data/dependency-graph.json +110 -0
  88. mdengine-0.8.1/src/md_generator/tools/assistant/data/registry.json +672 -0
  89. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/global-skill.md +66 -0
  90. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-archive/SKILL.md +71 -0
  91. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-archive/references/example.md +8 -0
  92. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-codeflow/SKILL.md +74 -0
  93. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-codeflow/references/example.md +8 -0
  94. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-db/SKILL.md +73 -0
  95. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-db/references/example.md +11 -0
  96. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-global/SKILL.md +78 -0
  97. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-global/references/example.md +21 -0
  98. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-graph/SKILL.md +73 -0
  99. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-graph/references/example.md +6 -0
  100. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-image/SKILL.md +73 -0
  101. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-image/references/example.md +6 -0
  102. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-media/SKILL.md +80 -0
  103. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-media/references/example.md +11 -0
  104. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-openapi/SKILL.md +73 -0
  105. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-openapi/references/example.md +6 -0
  106. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-pdf/SKILL.md +71 -0
  107. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-pdf/references/example.md +6 -0
  108. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-playwright/SKILL.md +74 -0
  109. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-playwright/references/example.md +7 -0
  110. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-ppt/SKILL.md +71 -0
  111. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-ppt/references/example.md +6 -0
  112. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-text/SKILL.md +71 -0
  113. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-text/references/example.md +6 -0
  114. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-url/SKILL.md +71 -0
  115. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-url/references/example.md +11 -0
  116. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-word/SKILL.md +71 -0
  117. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-word/references/example.md +6 -0
  118. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-xlsx/SKILL.md +71 -0
  119. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-xlsx/references/example.md +6 -0
  120. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/SKILL.md +46 -0
  121. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/references/entrypoints.md +46 -0
  122. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/references/example.md +24 -0
  123. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/references/http-api-mcp.md +156 -0
  124. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/archive.md +67 -0
  125. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/codeflow.md +70 -0
  126. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/db.md +69 -0
  127. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/graph.md +69 -0
  128. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/image.md +69 -0
  129. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/media.md +76 -0
  130. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/openapi.md +69 -0
  131. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/pdf.md +67 -0
  132. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/playwright.md +70 -0
  133. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/ppt.md +67 -0
  134. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/text.md +67 -0
  135. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/url.md +67 -0
  136. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/word.md +67 -0
  137. mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/xlsx.md +67 -0
  138. mdengine-0.8.1/src/md_generator/tools/assistant/rag.py +69 -0
  139. mdengine-0.8.1/src/md_generator/tools/assistant/registry.py +85 -0
  140. mdengine-0.8.1/src/md_generator/tools/skill_builder/__init__.py +6 -0
  141. mdengine-0.8.1/src/md_generator/tools/skill_builder/__main__.py +44 -0
  142. mdengine-0.8.1/src/md_generator/tools/skill_builder/dependency_graph.py +109 -0
  143. mdengine-0.8.1/src/md_generator/tools/skill_builder/generate.py +501 -0
  144. mdengine-0.8.1/src/md_generator/tools/skill_builder/pyproject_util.py +50 -0
  145. mdengine-0.8.1/src/md_generator/tools/skill_builder/routing.py +98 -0
  146. {mdengine-0.7.0 → mdengine-0.8.1/src/mdengine.egg-info}/PKG-INFO +149 -5
  147. {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/SOURCES.txt +113 -0
  148. {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/requires.txt +15 -0
  149. mdengine-0.7.0/src/md_generator/codeflow/api/schemas.py +0 -96
  150. mdengine-0.7.0/src/md_generator/codeflow/cli/main.py +0 -132
  151. mdengine-0.7.0/src/md_generator/codeflow/core/__init__.py +0 -6
  152. mdengine-0.7.0/src/md_generator/codeflow/core/extractor.py +0 -193
  153. mdengine-0.7.0/src/md_generator/codeflow/core/run_config.py +0 -31
  154. mdengine-0.7.0/src/md_generator/codeflow/generators/entry_markdown.py +0 -198
  155. mdengine-0.7.0/src/md_generator/codeflow/generators/markdown.py +0 -35
  156. mdengine-0.7.0/src/md_generator/codeflow/graph/__init__.py +0 -5
  157. mdengine-0.7.0/src/md_generator/codeflow/graph/builder.py +0 -181
  158. mdengine-0.7.0/src/md_generator/codeflow/parsers/java_parser.py +0 -116
  159. mdengine-0.7.0/src/md_generator/codeflow/parsers/treesitter_js_ts_parser.py +0 -119
  160. mdengine-0.7.0/src/md_generator/codeflow/utils/tools_root.py +0 -13
  161. mdengine-0.7.0/src/md_generator/engine_cli.py +0 -38
  162. {mdengine-0.7.0 → mdengine-0.8.1}/LICENSE +0 -0
  163. {mdengine-0.7.0 → mdengine-0.8.1}/setup.cfg +0 -0
  164. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/__init__.py +0 -0
  165. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/__init__.py +0 -0
  166. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/convert_runner.py +0 -0
  167. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/jobs.py +0 -0
  168. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/main.py +0 -0
  169. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/mcp_server.py +0 -0
  170. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/mcp_setup.py +0 -0
  171. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/query_options.py +0 -0
  172. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/settings.py +0 -0
  173. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/convert_impl.py +0 -0
  174. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/converter.py +0 -0
  175. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/options.py +0 -0
  176. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/__init__.py +0 -0
  177. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/analyzers/__init__.py +0 -0
  178. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/__init__.py +0 -0
  179. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/main.py +0 -0
  180. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/mcp_server.py +0 -0
  181. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/run.py +0 -0
  182. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/settings.py +0 -0
  183. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/sse.py +0 -0
  184. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/cli/__init__.py +0 -0
  185. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/__init__.py +0 -0
  186. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/api_detector.py +0 -0
  187. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/kafka_detector.py +0 -0
  188. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/__init__.py +0 -0
  189. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/business_rules_markdown.py +0 -0
  190. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/sequence.py +0 -0
  191. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/ingestion/__init__.py +0 -0
  192. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/ingestion/loader.py +0 -0
  193. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/lang_dispatch.py +0 -0
  194. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/mcp/__init__.py +0 -0
  195. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/models/__init__.py +0 -0
  196. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/__init__.py +0 -0
  197. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/base.py +0 -0
  198. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/rules/__init__.py +0 -0
  199. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/runtime/__init__.py +0 -0
  200. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/runtime/tracer.py +0 -0
  201. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/utils/__init__.py +0 -0
  202. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/__init__.py +0 -0
  203. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/__init__.py +0 -0
  204. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/factory.py +0 -0
  205. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/mongo_adapter.py +0 -0
  206. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/mysql_adapter.py +0 -0
  207. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/oracle_adapter.py +0 -0
  208. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/postgres_adapter.py +0 -0
  209. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/sql_common.py +0 -0
  210. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/sqlite_adapter.py +0 -0
  211. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/__init__.py +0 -0
  212. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/main.py +0 -0
  213. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/mcp_server.py +0 -0
  214. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/run.py +0 -0
  215. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/schemas.py +0 -0
  216. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/settings.py +0 -0
  217. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/sqlite_upload.py +0 -0
  218. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/cli/__init__.py +0 -0
  219. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/cli/main.py +0 -0
  220. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/config/__init__.py +0 -0
  221. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/config/default.yaml +0 -0
  222. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/__init__.py +0 -0
  223. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/base_adapter.py +0 -0
  224. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/__init__.py +0 -0
  225. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/dot_emitter.py +0 -0
  226. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/filter.py +0 -0
  227. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/mermaid_emitter.py +0 -0
  228. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/mermaid_render.py +0 -0
  229. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/model.py +0 -0
  230. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/pipeline.py +0 -0
  231. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/render.py +0 -0
  232. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/extractor.py +0 -0
  233. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/job_manager.py +0 -0
  234. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/markdown_writer.py +0 -0
  235. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/models.py +0 -0
  236. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/run_config.py +0 -0
  237. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/util.py +0 -0
  238. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/zip_export.py +0 -0
  239. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/__init__.py +0 -0
  240. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/server.py +0 -0
  241. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/sse.py +0 -0
  242. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/stream.py +0 -0
  243. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/__init__.py +0 -0
  244. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/__init__.py +0 -0
  245. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/factory.py +0 -0
  246. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/neo4j_adapter.py +0 -0
  247. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/networkx_adapter.py +0 -0
  248. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/__init__.py +0 -0
  249. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/main.py +0 -0
  250. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/mcp_server.py +0 -0
  251. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/run.py +0 -0
  252. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/schemas.py +0 -0
  253. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/settings.py +0 -0
  254. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/cli/__init__.py +0 -0
  255. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/cli/main.py +0 -0
  256. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/config/__init__.py +0 -0
  257. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/config/default.yaml +0 -0
  258. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/__init__.py +0 -0
  259. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/base_adapter.py +0 -0
  260. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/extractor.py +0 -0
  261. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/graph_builder.py +0 -0
  262. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/job_manager.py +0 -0
  263. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/markdown_writer.py +0 -0
  264. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/models.py +0 -0
  265. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/run_config.py +0 -0
  266. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/viz.py +0 -0
  267. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/zip_export.py +0 -0
  268. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/__init__.py +0 -0
  269. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/server.py +0 -0
  270. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/sse.py +0 -0
  271. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/stream.py +0 -0
  272. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/__init__.py +0 -0
  273. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/__init__.py +0 -0
  274. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/main.py +0 -0
  275. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/mcp_server.py +0 -0
  276. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/query_options.py +0 -0
  277. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/settings.py +0 -0
  278. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/staging.py +0 -0
  279. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/zip_bundle.py +0 -0
  280. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/__init__.py +0 -0
  281. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/base.py +0 -0
  282. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/easy.py +0 -0
  283. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/paddle.py +0 -0
  284. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/tesseract.py +0 -0
  285. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/convert_impl.py +0 -0
  286. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/converter.py +0 -0
  287. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/emit.py +0 -0
  288. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/io_util.py +0 -0
  289. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/utils.py +0 -0
  290. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/__init__.py +0 -0
  291. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/__init__.py +0 -0
  292. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/__init__.py +0 -0
  293. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/main.py +0 -0
  294. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/mcp_server.py +0 -0
  295. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/mcp_setup.py +0 -0
  296. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/run.py +0 -0
  297. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/settings.py +0 -0
  298. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/converter.py +0 -0
  299. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/formatter.py +0 -0
  300. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/service.py +0 -0
  301. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/document_converter.py +0 -0
  302. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/job_store.py +0 -0
  303. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/__init__.py +0 -0
  304. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/__init__.py +0 -0
  305. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/main.py +0 -0
  306. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/mcp_server.py +0 -0
  307. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/mcp_setup.py +0 -0
  308. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/run.py +0 -0
  309. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/settings.py +0 -0
  310. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/converter.py +0 -0
  311. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/formatter.py +0 -0
  312. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/service.py +0 -0
  313. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/whisper_language.py +0 -0
  314. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/__init__.py +0 -0
  315. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/__init__.py +0 -0
  316. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/main.py +0 -0
  317. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/mcp_server.py +0 -0
  318. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/mcp_setup.py +0 -0
  319. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/run.py +0 -0
  320. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/settings.py +0 -0
  321. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/converter.py +0 -0
  322. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/formatter.py +0 -0
  323. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/metadata.py +0 -0
  324. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/service.py +0 -0
  325. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/transcript.py +0 -0
  326. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/__init__.py +0 -0
  327. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/__init__.py +0 -0
  328. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/main.py +0 -0
  329. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/mcp_server.py +0 -0
  330. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/run.py +0 -0
  331. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/schemas.py +0 -0
  332. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/settings.py +0 -0
  333. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/cli/__init__.py +0 -0
  334. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/cli/main.py +0 -0
  335. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/config/__init__.py +0 -0
  336. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/config/default.yaml +0 -0
  337. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/converters/__init__.py +0 -0
  338. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/converters/swagger2_to_openapi3.py +0 -0
  339. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/__init__.py +0 -0
  340. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/extractor.py +0 -0
  341. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/run_config.py +0 -0
  342. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/zip_export.py +0 -0
  343. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/enrichers/__init__.py +0 -0
  344. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/enrichers/rules.py +0 -0
  345. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/enrichers/sample_body.py +0 -0
  346. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/generators/__init__.py +0 -0
  347. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/generators/dependency_graph.py +0 -0
  348. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/loaders/__init__.py +0 -0
  349. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/loaders/spec_loader.py +0 -0
  350. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/mcp/__init__.py +0 -0
  351. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/mcp/server.py +0 -0
  352. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/models/__init__.py +0 -0
  353. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/models/domain.py +0 -0
  354. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/normalizers/__init__.py +0 -0
  355. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/normalizers/operations.py +0 -0
  356. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/normalizers/schema_flatten.py +0 -0
  357. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/parsers/__init__.py +0 -0
  358. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/parsers/openapi_parser.py +0 -0
  359. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/resolvers/__init__.py +0 -0
  360. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/resolvers/ref_resolver.py +0 -0
  361. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/writers/__init__.py +0 -0
  362. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/writers/markdown_writer.py +0 -0
  363. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/__init__.py +0 -0
  364. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/__init__.py +0 -0
  365. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/main.py +0 -0
  366. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/mcp_server.py +0 -0
  367. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/settings.py +0 -0
  368. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/zip_bundle.py +0 -0
  369. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/converter.py +0 -0
  370. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/md_emit.py +0 -0
  371. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/pdf_extract.py +0 -0
  372. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/utils.py +0 -0
  373. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/__init__.py +0 -0
  374. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/__init__.py +0 -0
  375. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/convert_runner.py +0 -0
  376. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/jobs.py +0 -0
  377. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/main.py +0 -0
  378. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/mcp_server.py +0 -0
  379. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/mcp_setup.py +0 -0
  380. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/run.py +0 -0
  381. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/settings.py +0 -0
  382. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/assets.py +0 -0
  383. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/chunker.py +0 -0
  384. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/cli.py +0 -0
  385. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/extractor.py +0 -0
  386. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/html_to_md.py +0 -0
  387. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/options.py +0 -0
  388. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/pipeline.py +0 -0
  389. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/playwright_fetcher.py +0 -0
  390. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/__init__.py +0 -0
  391. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/__init__.py +0 -0
  392. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/convert_runner.py +0 -0
  393. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/jobs.py +0 -0
  394. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/main.py +0 -0
  395. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/mcp_server.py +0 -0
  396. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/mcp_setup.py +0 -0
  397. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/query_options.py +0 -0
  398. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/settings.py +0 -0
  399. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/convert_impl.py +0 -0
  400. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/converter.py +0 -0
  401. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/embedded_extract.py +0 -0
  402. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/ooxml_media.py +0 -0
  403. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/options.py +0 -0
  404. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/post_assets.py +0 -0
  405. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/text_formatting.py +0 -0
  406. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_pdf_md/__init__.py +0 -0
  407. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_pdf_md/convert.py +0 -0
  408. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_word_md/__init__.py +0 -0
  409. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_word_md/convert.py +0 -0
  410. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/zip_deep.py +0 -0
  411. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/__init__.py +0 -0
  412. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/__init__.py +0 -0
  413. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/convert_runner.py +0 -0
  414. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/jobs.py +0 -0
  415. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/main.py +0 -0
  416. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/mcp_server.py +0 -0
  417. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/mcp_setup.py +0 -0
  418. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/query_options.py +0 -0
  419. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/settings.py +0 -0
  420. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/convert_impl.py +0 -0
  421. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/converter.py +0 -0
  422. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/format_detect.py +0 -0
  423. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/md_emit_json.py +0 -0
  424. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/md_emit_txt.py +0 -0
  425. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/md_emit_xml.py +0 -0
  426. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/options.py +0 -0
  427. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/__init__.py +0 -0
  428. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/__init__.py +0 -0
  429. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/convert_runner.py +0 -0
  430. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/jobs.py +0 -0
  431. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/main.py +0 -0
  432. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/mcp_server.py +0 -0
  433. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/mcp_setup.py +0 -0
  434. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/query_options.py +0 -0
  435. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/settings.py +0 -0
  436. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/assets.py +0 -0
  437. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/convert_impl.py +0 -0
  438. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/converter.py +0 -0
  439. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/crawl.py +0 -0
  440. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/extract.py +0 -0
  441. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/fetch.py +0 -0
  442. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/html_to_md.py +0 -0
  443. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/options.py +0 -0
  444. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/page_convert.py +0 -0
  445. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/post_convert_assets.py +0 -0
  446. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/robots_util.py +0 -0
  447. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/__init__.py +0 -0
  448. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/__init__.py +0 -0
  449. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/convert_util.py +0 -0
  450. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/jobs.py +0 -0
  451. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/main.py +0 -0
  452. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/mcp_server.py +0 -0
  453. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/artifact.py +0 -0
  454. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/converter.py +0 -0
  455. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/settings.py +0 -0
  456. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/__init__.py +0 -0
  457. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/api/__init__.py +0 -0
  458. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/api/app.py +0 -0
  459. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/convert_config.py +0 -0
  460. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/converter.py +0 -0
  461. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/converter_core.py +0 -0
  462. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/excel_reader.py +0 -0
  463. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/markdown_emitter.py +0 -0
  464. {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/mcp_server.py +0 -0
  465. {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/dependency_links.txt +0 -0
  466. {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/entry_points.txt +0 -0
  467. {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mdengine
3
- Version: 0.7.0
3
+ Version: 0.8.1
4
4
  Summary: Convert PDF, Office, images, audio, video, text/JSON/XML, ZIP archives, web URLs, databases, graphs, and OpenAPI specs to Markdown.
5
5
  Author: mdengine contributors
6
6
  License-Expression: MIT
@@ -106,6 +106,9 @@ Requires-Dist: openapi-spec-validator>=0.7.0; extra == "openapi"
106
106
  Provides-Extra: codeflow
107
107
  Requires-Dist: networkx>=3.2.0; extra == "codeflow"
108
108
  Requires-Dist: javalang>=0.13.0; extra == "codeflow"
109
+ Provides-Extra: codeflow-worker
110
+ Requires-Dist: celery>=5.3.0; extra == "codeflow-worker"
111
+ Requires-Dist: redis>=5.0.0; extra == "codeflow-worker"
109
112
  Provides-Extra: codeflow-treesitter
110
113
  Requires-Dist: tree-sitter>=0.21.0; extra == "codeflow-treesitter"
111
114
  Requires-Dist: tree-sitter-javascript>=0.21.0; extra == "codeflow-treesitter"
@@ -113,6 +116,10 @@ Requires-Dist: tree-sitter-typescript>=0.23.0; extra == "codeflow-treesitter"
113
116
  Requires-Dist: tree-sitter-cpp>=0.23.0; extra == "codeflow-treesitter"
114
117
  Provides-Extra: codeflow-clang
115
118
  Requires-Dist: clang>=16.0.0; extra == "codeflow-clang"
119
+ Provides-Extra: codeflow-semantic
120
+ Requires-Dist: numpy>=1.24.0; extra == "codeflow-semantic"
121
+ Requires-Dist: scikit-learn>=1.3.0; extra == "codeflow-semantic"
122
+ Requires-Dist: sentence-transformers>=3.0.0; extra == "codeflow-semantic"
116
123
  Provides-Extra: api
117
124
  Requires-Dist: fastapi>=0.115.0; extra == "api"
118
125
  Requires-Dist: uvicorn[standard]>=0.32.0; extra == "api"
@@ -122,6 +129,10 @@ Requires-Dist: pydantic-settings>=2.0.0; extra == "api"
122
129
  Provides-Extra: mcp
123
130
  Requires-Dist: mcp>=1.2.0; extra == "mcp"
124
131
  Requires-Dist: fastmcp>=2.3.0; extra == "mcp"
132
+ Provides-Extra: skill-openai
133
+ Requires-Dist: openai>=1.30.0; extra == "skill-openai"
134
+ Provides-Extra: skill-rag-chroma
135
+ Requires-Dist: chromadb>=0.4.22; extra == "skill-rag-chroma"
125
136
  Provides-Extra: dev
126
137
  Requires-Dist: pytest>=8.0.0; extra == "dev"
127
138
  Requires-Dist: httpx>=0.27.0; extra == "dev"
@@ -167,14 +178,14 @@ Dynamic: license-file
167
178
 
168
179
  # mdengine
169
180
 
170
- Single Python distribution for converting **PDF**, **Word (.docx)**, **PowerPoint (.pptx)**, **Excel (.xlsx/.xlsm)**, **images** (OCR), **plain text / JSON / XML**, **ZIP archives**, **audio / video** (Whisper transcription → Markdown), **database metadata** (SQL + Mongo), and **graphs** (Neo4j / NetworkX → Markdown) into **Markdown** (and related assets). Install only the extras you need; everything imports under the **`md_generator`** package.
181
+ Single Python distribution for converting **PDF**, **Word (.docx)**, **PowerPoint (.pptx)**, **Excel (.xlsx/.xlsm)**, **images** (OCR), **plain text / JSON / XML**, **ZIP archives**, **audio / video** (Whisper transcription → Markdown), **database metadata** (SQL + Mongo), **graphs** (Neo4j / NetworkX → Markdown), **OpenAPI** specs, **Playwright**-captured web pages (including SPAs), and **source code** (codeflow → architecture Markdown) into **Markdown** (and related assets). Install only the extras you need; everything imports under the **`md_generator`** package.
171
182
 
172
183
  - **PyPI name:** `mdengine` (import package: `md_generator`)
173
184
  - **Source:** [github.com/vishal7090/md-generator](https://github.com/vishal7090/md-generator)
174
185
  - **Python:** 3.10+
175
186
  - **License:** [MIT](LICENSE)
176
187
 
177
- **Quick links:** [On a new computer](#on-a-new-computer) · [Command-line execution](#command-line-execution) · [Python library](#python-library) · [Audio and video](#audio-and-video-to-markdown) · [HTTP API](#http-api-fastapi) · [MCP](#mcp-model-context-protocol) · [Development](#development) · [Code of Conduct](CODE_OF_CONDUCT.md)
188
+ **Quick links:** [On a new computer](#on-a-new-computer) · [Command-line execution](#command-line-execution) · [Python library](#python-library) · [Audio and video](#audio-and-video-to-markdown) · [HTTP API](#http-api-fastapi) · [MCP](#mcp-model-context-protocol) · [AI assistant CLI](#ai-assistant-cli) · [Development](#development) · [Code of Conduct](CODE_OF_CONDUCT.md)
178
189
 
179
190
  ---
180
191
 
@@ -248,6 +259,8 @@ pip install "mdengine[all]"
248
259
  | `graph` | **Graph → Markdown** (Neo4j Bolt + NetworkX GraphML/GML): `networkx`, `neo4j`, `pyyaml` |
249
260
  | `dev` | pytest + API/MCP test helpers |
250
261
  | `all` | Large superset of dependencies (use only if you need everything) |
262
+ | `skill-openai` | Optional helpers for OpenAI-style calls with assembled skill context (`md_generator.tools.assistant`) |
263
+ | `skill-rag-chroma` | Optional Chroma-based RAG over skill markdown (`MasterAgent.ask(..., use_rag=True)`) |
251
264
 
252
265
  Nested ZIP and office files inside archives require the corresponding extras (e.g. `archive` plus `pdf` for PDFs inside a ZIP).
253
266
 
@@ -304,7 +317,7 @@ If the shell reports “command not found”, ensure the Python **Scripts** dire
304
317
  | `md-openapi` | `md_generator.openapi.cli.main:main` | `pip install "mdengine[openapi]"` then `md-openapi generate --file openapi.yaml --output ./docs` (or `mdengine openapi-to-md generate …`) |
305
318
  | `md-openapi-api` | `md_generator.openapi.api.run:main` | FastAPI on port **8015** (`OPENAPI_TO_MD_PORT`): `POST /openapi-to-md/generate` (OpenAPI upload → ZIP), `/health`, MCP at **`/mcp`** |
306
319
  | `md-openapi-mcp` | `md_generator.openapi.api.mcp_server:main` | Standalone MCP: `api_validate_openapi_yaml`, `api_generate_readme_markdown`, `api_run_sync_zip_base64` |
307
- | `mdengine` | `md_generator.engine_cli:main` | `mdengine db-to-md …` / `mdengine graph-to-md …` / `mdengine openapi-to-md generate …` |
320
+ | `mdengine` | `md_generator.engine_cli:main` | `mdengine ai assist …`, `mdengine ai export …`, `mdengine skill build …`, `mdengine db-to-md …`, `mdengine graph-to-md …`, `mdengine openapi-to-md generate …` |
308
321
 
309
322
  **openapi-to-md (`md-openapi`):** OpenAPI **3.x** is parsed directly; **Swagger 2.0** (`swagger: "2.0"`) documents are **converted in-process** to OpenAPI 3.0.3 (deterministic, in-repo converter) before `$ref` resolution. Edge-heavy specs (unusual OAuth2 flows, vendor extensions) may still need fixes after conversion.
310
323
 
@@ -757,6 +770,110 @@ Install **`mdengine[mcp]`** (and usually **`[api]`** when using HTTP) for MCP-re
757
770
 
758
771
  ---
759
772
 
773
+ ## AI assistant CLI
774
+
775
+ The repo ships **distributable AI skills** under [`ai/`](ai/) (Markdown skills, [`ai/registry.json`](ai/registry.json), routing, and [`ai/dependency-graph.json`](ai/dependency-graph.json)). A small SDK in [`src/md_generator/tools/assistant/`](src/md_generator/tools/assistant/) assembles **grounded context** from a natural-language query for Cursor, Claude, OpenAI-style hosts, or your own LLM pipeline.
776
+
777
+ **Further detail:** [ai/README.md](ai/README.md) (layout, registry schema, master agent).
778
+
779
+ **PyPI installs:** `mdengine ai assist` and `mdengine ai export` read the **bundled** skill data shipped with **`md_generator.tools.assistant`** unless **`MDENGINE_SKILL_AI_ROOT`** points at another directory (for example the repo’s [`ai/`](ai/) while developing). You do **not** need **`mdengine skill build`** unless you maintain this repository and want to regenerate that bundle.
780
+
781
+ Script index (all `project.scripts`): [`ai/skills/mdengine-reference/references/entrypoints.md`](ai/skills/mdengine-reference/references/entrypoints.md).
782
+
783
+ ### Regenerate skills, graph, and bundled data
784
+
785
+ **Maintainers / repo clones.** From the **repository root**, refresh generated files under [`ai/`](ai/) and copy the bundle into **`src/md_generator/tools/assistant/data/`** for packaging:
786
+
787
+ ```bash
788
+ # Windows PowerShell
789
+ $env:PYTHONPATH = "src"
790
+ python -m md_generator.tools.skill_builder
791
+ ```
792
+
793
+ ```bash
794
+ # macOS / Linux
795
+ PYTHONPATH=src python -m md_generator.tools.skill_builder
796
+ ```
797
+
798
+ After `pip install -e .`, you can run **`mdengine skill build`** from the repo root without setting `PYTHONPATH` (same as `python -m md_generator.tools.skill_builder` when `PYTHONPATH=src`).
799
+
800
+ - Refreshes `ai/skills/**/SKILL.md`, `ai/skills/global-skill.md`, `ai/skills/modules/*.md`, `ai/registry.json` (routing), and `ai/dependency-graph.json`.
801
+ - Copies the same bundle into **`src/md_generator/tools/assistant/data/`** for the installed wheel.
802
+
803
+ **Incremental** (only area skills touched under `src/md_generator/` since a git ref; global/graph/registry still refresh):
804
+
805
+ ```bash
806
+ mdengine skill build --since HEAD~1
807
+ ```
808
+
809
+ ```bash
810
+ PYTHONPATH=src python -m md_generator.tools.skill_builder --since HEAD~1
811
+ ```
812
+
813
+ **Custom repo root** (CI or non-default cwd):
814
+
815
+ ```bash
816
+ mdengine skill build --root /path/to/md-generator
817
+ ```
818
+
819
+ ### Use the live `ai/` tree from a clone (optional)
820
+
821
+ When developing skills, point the SDK at the repo’s `ai/` directory instead of the copy under `src/md_generator/tools/assistant/data/`:
822
+
823
+ ```powershell
824
+ # PowerShell
825
+ $env:MDENGINE_SKILL_AI_ROOT = (Resolve-Path ".\ai").Path
826
+ ```
827
+
828
+ ```bash
829
+ export MDENGINE_SKILL_AI_ROOT="$(pwd)/ai"
830
+ ```
831
+
832
+ ### Console: `mdengine ai assist` and `mdengine ai export`
833
+
834
+ After `pip install mdengine` (or `pip install -e .` from a clone), use the **`mdengine`** entry point (no separate AI script is installed).
835
+
836
+ - **`mdengine ai assist`** — prints a single **Markdown** context (selected skills + global architecture) to **stdout**, meant to paste into an LLM or pipe to a file.
837
+ - **`mdengine ai export`** — prints **host-shaped** output to stdout, or writes with **`-o` / `--output`**: OpenAI **`messages`** JSON (`--format openai`), a Claude-style project prompt (`claude`), or Cursor-style rules Markdown (`cursor`).
838
+
839
+ **Flags (both subcommands):** **`--rag`** — use optional Chroma RAG when **`mdengine[skill-rag-chroma]`** is installed (falls back to full skills if Chroma is unavailable). **`--ai-root PATH`** — same effect as **`MDENGINE_SKILL_AI_ROOT`** for that run only.
840
+
841
+ **Discover flags:** `mdengine ai assist --help` · `mdengine ai export --help`
842
+
843
+ **`ai export` arguments:** **`--format`** `openai` \| `claude` \| `cursor` (required) · **`--query`** `…` (required) · **`-o` / `--output`** `file` (optional; default stdout).
844
+
845
+ ```bash
846
+ mdengine ai assist "How do I run md-pdf on a file?"
847
+ mdengine ai assist "openapi mcp" --rag
848
+ mdengine ai export --format openai --query "md-db ERD" -o bundle.json
849
+ mdengine ai export --format claude --query "playwright"
850
+ mdengine ai export --format cursor --query "xlsx excel"
851
+ ```
852
+
853
+ One-off override without env var: `mdengine ai assist "…" --ai-root /path/to/ai`.
854
+
855
+ ### Python API
856
+
857
+ ```python
858
+ from md_generator.tools.assistant import MasterAgent, Registry
859
+
860
+ reg = Registry.load_default()
861
+ agent = MasterAgent(reg)
862
+ result = agent.ask("openapi mcp", use_rag=False)
863
+ print(result.resolved_skill_ids)
864
+ print(result.context_markdown[:2000])
865
+ ```
866
+
867
+ Optional RAG: install **`mdengine[skill-rag-chroma]`**, then `agent.ask(..., use_rag=True)` (falls back to full skills if Chroma is unavailable). The same optional stack is used by **`mdengine ai assist --rag`** and **`mdengine ai export … --rag`**.
868
+
869
+ ### Tests (skill SDK)
870
+
871
+ ```bash
872
+ PYTHONPATH=src python -m pytest tool-assistant/tests -q
873
+ ```
874
+
875
+ ---
876
+
760
877
  ## Development
761
878
 
762
879
  ```bash
@@ -764,7 +881,30 @@ pip install -e ".[dev,all]" # or a smaller subset of extras
764
881
  python -m pytest
765
882
  ```
766
883
 
767
- Tests live under each legacy folder’s `tests/` directory (e.g. `pdf-to-md/tests/`), **`graph-to-md/tests/`**, and **`openapi-to-md/tests/`**; `pyproject.toml` configures `pythonpath = ["src"]` so `md_generator` resolves without a separate `PYTHONPATH`.
884
+ Tests live under each legacy folder’s `tests/` directory (e.g. `pdf-to-md/tests/`), **`graph-to-md/tests/`**, **`openapi-to-md/tests/`**, and **[`tool-assistant/tests/`](tool-assistant/tests/)** for the skill SDK; `pyproject.toml` sets `pythonpath = ["src"]` so **`md_generator`** (including **`md_generator.tools.assistant`**) resolves without a manual `PYTHONPATH` when you use `pytest` from the config.
885
+
886
+ ### Codeflow (`md_generator.codeflow`)
887
+
888
+ Static call graphs and per-entry Markdown/Mermaid/JSON for **Python**, **Java** (Spring REST, Kafka listeners, **Liferay / JSR-286 portlets**), and other parsers. Output is **static only** (`graph-full.json` can include unresolved `unknown::*` callees).
889
+
890
+ More detail: **[`codeflow-to-md/docs/graph-and-outputs.md`](codeflow-to-md/docs/graph-and-outputs.md)** (node/edge model, `graph-schema.json`, `methods/` layout).
891
+
892
+ - **Formats:** pass **`--formats md,mermaid,json,html`** (comma-separated). **`--output`** is the **output directory**, not the format list.
893
+ - **Graph schema export:** optional **`--emit-graph-schema`** (with `json` in formats) writes **`graph-schema.json`** — stable Node/Edge view with derived File/Class nodes and `CONTAINS` edges. **`graph-full.json`** stays unchanged for existing consumers.
894
+ - **Markdown intelligence:** flow and entry Markdown include **Called By** and **Impact** lists (capped with **`--intelligence-list-cap`**, default 80).
895
+ - **IR / CFG (optional):** **`--emit-cfg`** builds a language-agnostic IR and writes **`cfg.json`**, **`cfg.mmd`**, and appends a CFG Mermaid block to **`flow.md`** (when `md` is in formats). Cap with **`--cfg-max-nodes`** (default 500).
896
+ - **Entries:** use `--entry` (comma-separated symbol ids), **`--entries-file`** (one id per line, `#` comments allowed), or rely on detectors. **`--emit-entry-per-method`** emits one output directory per method/entry symbol under **`methods/<slug>/`**; cap volume with **`--emit-entry-max`** (default cap **10000** when the flag is set and max is omitted). **`--entry-fallback`** `none` \| `roots` \| `first_n` controls behavior when nothing is detected (default **`roots`**, in-degree 0 symbols, limited by **`--entry-fallback-max`**).
897
+ - **Java flow:** edges can record **branch context** from enclosing `if`, `switch`, or ternary expressions (`condition` / `labels` on edges). **Business rules** Markdown picks up validation-style **`@NotNull`** / **`@Size`** / **`@Valid`** (name heuristics) and throws such as **`IllegalArgumentException`**.
898
+ - **JavaScript / TypeScript / TSX:** Tree-sitter adds **`condition_label`** from enclosing control flow, **`fr.branches`** for `if` / `switch`, and **`fr.rules`** for **`throw`** and common **`assert` / `console.assert`** calls (slice-scoped in the collector).
899
+ - **C++ (tree-sitter path):** **`condition_label`** on calls, **`fr.branches`** for `if` / `switch`, plus **`rules/cpp_rules.py`** for **`throw`** / **`assert`** when methods appear in the slice. (Clang-only parses still get throw/assert via the same extractor when tree-sitter is installed.)
900
+ - **Go:** the **`codeflow_go_dump`** helper emits **`condition`** on calls inside `if` / `switch` / `for` / `range`, and **`rules`** for **`panic`** / **`log.Fatal` / `Fatalf`**; **`fr.rules`** are merged slice-scoped.
901
+ - **PHP:** the **`codeflow_php_dump`** helper adds **`condition`** on calls (from enclosing **`if` / `case`**), **`rules`** for **`throw`**, and **`branches`** for documentation. Install PHP + Composer deps under `codeflow-to-md/examples/codeflow_php_dump` (or mirror under `tools/codeflow_php_dump`) for PHP scans.
902
+ - **Kinds / filters:** `--include` accepts aliases such as **`portlet`** / **`liferay`** for portlet entries.
903
+ - **Operators:** each run writes **`scan-summary.md`** at the output root (counts, warnings, fallback mode) unless **`--no-scan-summary`** is set.
904
+
905
+ ```bash
906
+ python -m md_generator.codeflow.cli.main scan path/to/src --output ./codeflow-out --lang java
907
+ ```
768
908
 
769
909
  ---
770
910
 
@@ -776,6 +916,10 @@ Tests live under each legacy folder’s `tests/` directory (e.g. `pdf-to-md/test
776
916
  | `CODE_OF_CONDUCT.md` | [Contributor Covenant](https://www.contributor-covenant.org/) 2.1 |
777
917
  | `src/md_generator/` | **Library source** (all formats + `api` subpackages); **audio/video** under [`media/audio/`](src/md_generator/media/audio/) and [`media/video/`](src/md_generator/media/video/); **graph-to-md** under [`graph/`](src/md_generator/graph/) |
778
918
  | `pyproject.toml` | Packaging, extras, CLI entry points, pytest |
919
+ | `ai/` | **Distributable AI skills** (`SKILL.md` trees, `registry.json`, `dependency-graph.json`); regenerate with `PYTHONPATH=src python -m md_generator.tools.skill_builder` or **`mdengine skill build`** (after `pip install -e .`) |
920
+ | `src/md_generator/tools/skill_builder/` | **Skill generator** — scans `src/md_generator` and `pyproject.toml` |
921
+ | `src/md_generator/tools/assistant/` | **Skill SDK** (`md_generator.tools.assistant`): `MasterAgent`, `Registry`, bundled `data/` copy of `ai/` |
922
+ | `tool-assistant/tests/` | **Pytests** for the assistant SDK (`md_generator.tools.assistant`) |
779
923
  | `*-to-md/` | **Docs, tests, fixtures**, thin `converter.py` shims, some `run.py` helpers |
780
924
  | `README.md` | This document |
781
925
 
@@ -1,13 +1,13 @@
1
1
  # mdengine
2
2
 
3
- Single Python distribution for converting **PDF**, **Word (.docx)**, **PowerPoint (.pptx)**, **Excel (.xlsx/.xlsm)**, **images** (OCR), **plain text / JSON / XML**, **ZIP archives**, **audio / video** (Whisper transcription → Markdown), **database metadata** (SQL + Mongo), and **graphs** (Neo4j / NetworkX → Markdown) into **Markdown** (and related assets). Install only the extras you need; everything imports under the **`md_generator`** package.
3
+ Single Python distribution for converting **PDF**, **Word (.docx)**, **PowerPoint (.pptx)**, **Excel (.xlsx/.xlsm)**, **images** (OCR), **plain text / JSON / XML**, **ZIP archives**, **audio / video** (Whisper transcription → Markdown), **database metadata** (SQL + Mongo), **graphs** (Neo4j / NetworkX → Markdown), **OpenAPI** specs, **Playwright**-captured web pages (including SPAs), and **source code** (codeflow → architecture Markdown) into **Markdown** (and related assets). Install only the extras you need; everything imports under the **`md_generator`** package.
4
4
 
5
5
  - **PyPI name:** `mdengine` (import package: `md_generator`)
6
6
  - **Source:** [github.com/vishal7090/md-generator](https://github.com/vishal7090/md-generator)
7
7
  - **Python:** 3.10+
8
8
  - **License:** [MIT](LICENSE)
9
9
 
10
- **Quick links:** [On a new computer](#on-a-new-computer) · [Command-line execution](#command-line-execution) · [Python library](#python-library) · [Audio and video](#audio-and-video-to-markdown) · [HTTP API](#http-api-fastapi) · [MCP](#mcp-model-context-protocol) · [Development](#development) · [Code of Conduct](CODE_OF_CONDUCT.md)
10
+ **Quick links:** [On a new computer](#on-a-new-computer) · [Command-line execution](#command-line-execution) · [Python library](#python-library) · [Audio and video](#audio-and-video-to-markdown) · [HTTP API](#http-api-fastapi) · [MCP](#mcp-model-context-protocol) · [AI assistant CLI](#ai-assistant-cli) · [Development](#development) · [Code of Conduct](CODE_OF_CONDUCT.md)
11
11
 
12
12
  ---
13
13
 
@@ -81,6 +81,8 @@ pip install "mdengine[all]"
81
81
  | `graph` | **Graph → Markdown** (Neo4j Bolt + NetworkX GraphML/GML): `networkx`, `neo4j`, `pyyaml` |
82
82
  | `dev` | pytest + API/MCP test helpers |
83
83
  | `all` | Large superset of dependencies (use only if you need everything) |
84
+ | `skill-openai` | Optional helpers for OpenAI-style calls with assembled skill context (`md_generator.tools.assistant`) |
85
+ | `skill-rag-chroma` | Optional Chroma-based RAG over skill markdown (`MasterAgent.ask(..., use_rag=True)`) |
84
86
 
85
87
  Nested ZIP and office files inside archives require the corresponding extras (e.g. `archive` plus `pdf` for PDFs inside a ZIP).
86
88
 
@@ -137,7 +139,7 @@ If the shell reports “command not found”, ensure the Python **Scripts** dire
137
139
  | `md-openapi` | `md_generator.openapi.cli.main:main` | `pip install "mdengine[openapi]"` then `md-openapi generate --file openapi.yaml --output ./docs` (or `mdengine openapi-to-md generate …`) |
138
140
  | `md-openapi-api` | `md_generator.openapi.api.run:main` | FastAPI on port **8015** (`OPENAPI_TO_MD_PORT`): `POST /openapi-to-md/generate` (OpenAPI upload → ZIP), `/health`, MCP at **`/mcp`** |
139
141
  | `md-openapi-mcp` | `md_generator.openapi.api.mcp_server:main` | Standalone MCP: `api_validate_openapi_yaml`, `api_generate_readme_markdown`, `api_run_sync_zip_base64` |
140
- | `mdengine` | `md_generator.engine_cli:main` | `mdengine db-to-md …` / `mdengine graph-to-md …` / `mdengine openapi-to-md generate …` |
142
+ | `mdengine` | `md_generator.engine_cli:main` | `mdengine ai assist …`, `mdengine ai export …`, `mdengine skill build …`, `mdengine db-to-md …`, `mdengine graph-to-md …`, `mdengine openapi-to-md generate …` |
141
143
 
142
144
  **openapi-to-md (`md-openapi`):** OpenAPI **3.x** is parsed directly; **Swagger 2.0** (`swagger: "2.0"`) documents are **converted in-process** to OpenAPI 3.0.3 (deterministic, in-repo converter) before `$ref` resolution. Edge-heavy specs (unusual OAuth2 flows, vendor extensions) may still need fixes after conversion.
143
145
 
@@ -590,6 +592,110 @@ Install **`mdengine[mcp]`** (and usually **`[api]`** when using HTTP) for MCP-re
590
592
 
591
593
  ---
592
594
 
595
+ ## AI assistant CLI
596
+
597
+ The repo ships **distributable AI skills** under [`ai/`](ai/) (Markdown skills, [`ai/registry.json`](ai/registry.json), routing, and [`ai/dependency-graph.json`](ai/dependency-graph.json)). A small SDK in [`src/md_generator/tools/assistant/`](src/md_generator/tools/assistant/) assembles **grounded context** from a natural-language query for Cursor, Claude, OpenAI-style hosts, or your own LLM pipeline.
598
+
599
+ **Further detail:** [ai/README.md](ai/README.md) (layout, registry schema, master agent).
600
+
601
+ **PyPI installs:** `mdengine ai assist` and `mdengine ai export` read the **bundled** skill data shipped with **`md_generator.tools.assistant`** unless **`MDENGINE_SKILL_AI_ROOT`** points at another directory (for example the repo’s [`ai/`](ai/) while developing). You do **not** need **`mdengine skill build`** unless you maintain this repository and want to regenerate that bundle.
602
+
603
+ Script index (all `project.scripts`): [`ai/skills/mdengine-reference/references/entrypoints.md`](ai/skills/mdengine-reference/references/entrypoints.md).
604
+
605
+ ### Regenerate skills, graph, and bundled data
606
+
607
+ **Maintainers / repo clones.** From the **repository root**, refresh generated files under [`ai/`](ai/) and copy the bundle into **`src/md_generator/tools/assistant/data/`** for packaging:
608
+
609
+ ```bash
610
+ # Windows PowerShell
611
+ $env:PYTHONPATH = "src"
612
+ python -m md_generator.tools.skill_builder
613
+ ```
614
+
615
+ ```bash
616
+ # macOS / Linux
617
+ PYTHONPATH=src python -m md_generator.tools.skill_builder
618
+ ```
619
+
620
+ After `pip install -e .`, you can run **`mdengine skill build`** from the repo root without setting `PYTHONPATH` (same as `python -m md_generator.tools.skill_builder` when `PYTHONPATH=src`).
621
+
622
+ - Refreshes `ai/skills/**/SKILL.md`, `ai/skills/global-skill.md`, `ai/skills/modules/*.md`, `ai/registry.json` (routing), and `ai/dependency-graph.json`.
623
+ - Copies the same bundle into **`src/md_generator/tools/assistant/data/`** for the installed wheel.
624
+
625
+ **Incremental** (only area skills touched under `src/md_generator/` since a git ref; global/graph/registry still refresh):
626
+
627
+ ```bash
628
+ mdengine skill build --since HEAD~1
629
+ ```
630
+
631
+ ```bash
632
+ PYTHONPATH=src python -m md_generator.tools.skill_builder --since HEAD~1
633
+ ```
634
+
635
+ **Custom repo root** (CI or non-default cwd):
636
+
637
+ ```bash
638
+ mdengine skill build --root /path/to/md-generator
639
+ ```
640
+
641
+ ### Use the live `ai/` tree from a clone (optional)
642
+
643
+ When developing skills, point the SDK at the repo’s `ai/` directory instead of the copy under `src/md_generator/tools/assistant/data/`:
644
+
645
+ ```powershell
646
+ # PowerShell
647
+ $env:MDENGINE_SKILL_AI_ROOT = (Resolve-Path ".\ai").Path
648
+ ```
649
+
650
+ ```bash
651
+ export MDENGINE_SKILL_AI_ROOT="$(pwd)/ai"
652
+ ```
653
+
654
+ ### Console: `mdengine ai assist` and `mdengine ai export`
655
+
656
+ After `pip install mdengine` (or `pip install -e .` from a clone), use the **`mdengine`** entry point (no separate AI script is installed).
657
+
658
+ - **`mdengine ai assist`** — prints a single **Markdown** context (selected skills + global architecture) to **stdout**, meant to paste into an LLM or pipe to a file.
659
+ - **`mdengine ai export`** — prints **host-shaped** output to stdout, or writes with **`-o` / `--output`**: OpenAI **`messages`** JSON (`--format openai`), a Claude-style project prompt (`claude`), or Cursor-style rules Markdown (`cursor`).
660
+
661
+ **Flags (both subcommands):** **`--rag`** — use optional Chroma RAG when **`mdengine[skill-rag-chroma]`** is installed (falls back to full skills if Chroma is unavailable). **`--ai-root PATH`** — same effect as **`MDENGINE_SKILL_AI_ROOT`** for that run only.
662
+
663
+ **Discover flags:** `mdengine ai assist --help` · `mdengine ai export --help`
664
+
665
+ **`ai export` arguments:** **`--format`** `openai` \| `claude` \| `cursor` (required) · **`--query`** `…` (required) · **`-o` / `--output`** `file` (optional; default stdout).
666
+
667
+ ```bash
668
+ mdengine ai assist "How do I run md-pdf on a file?"
669
+ mdengine ai assist "openapi mcp" --rag
670
+ mdengine ai export --format openai --query "md-db ERD" -o bundle.json
671
+ mdengine ai export --format claude --query "playwright"
672
+ mdengine ai export --format cursor --query "xlsx excel"
673
+ ```
674
+
675
+ One-off override without env var: `mdengine ai assist "…" --ai-root /path/to/ai`.
676
+
677
+ ### Python API
678
+
679
+ ```python
680
+ from md_generator.tools.assistant import MasterAgent, Registry
681
+
682
+ reg = Registry.load_default()
683
+ agent = MasterAgent(reg)
684
+ result = agent.ask("openapi mcp", use_rag=False)
685
+ print(result.resolved_skill_ids)
686
+ print(result.context_markdown[:2000])
687
+ ```
688
+
689
+ Optional RAG: install **`mdengine[skill-rag-chroma]`**, then `agent.ask(..., use_rag=True)` (falls back to full skills if Chroma is unavailable). The same optional stack is used by **`mdengine ai assist --rag`** and **`mdengine ai export … --rag`**.
690
+
691
+ ### Tests (skill SDK)
692
+
693
+ ```bash
694
+ PYTHONPATH=src python -m pytest tool-assistant/tests -q
695
+ ```
696
+
697
+ ---
698
+
593
699
  ## Development
594
700
 
595
701
  ```bash
@@ -597,7 +703,30 @@ pip install -e ".[dev,all]" # or a smaller subset of extras
597
703
  python -m pytest
598
704
  ```
599
705
 
600
- Tests live under each legacy folder’s `tests/` directory (e.g. `pdf-to-md/tests/`), **`graph-to-md/tests/`**, and **`openapi-to-md/tests/`**; `pyproject.toml` configures `pythonpath = ["src"]` so `md_generator` resolves without a separate `PYTHONPATH`.
706
+ Tests live under each legacy folder’s `tests/` directory (e.g. `pdf-to-md/tests/`), **`graph-to-md/tests/`**, **`openapi-to-md/tests/`**, and **[`tool-assistant/tests/`](tool-assistant/tests/)** for the skill SDK; `pyproject.toml` sets `pythonpath = ["src"]` so **`md_generator`** (including **`md_generator.tools.assistant`**) resolves without a manual `PYTHONPATH` when you use `pytest` from the config.
707
+
708
+ ### Codeflow (`md_generator.codeflow`)
709
+
710
+ Static call graphs and per-entry Markdown/Mermaid/JSON for **Python**, **Java** (Spring REST, Kafka listeners, **Liferay / JSR-286 portlets**), and other parsers. Output is **static only** (`graph-full.json` can include unresolved `unknown::*` callees).
711
+
712
+ More detail: **[`codeflow-to-md/docs/graph-and-outputs.md`](codeflow-to-md/docs/graph-and-outputs.md)** (node/edge model, `graph-schema.json`, `methods/` layout).
713
+
714
+ - **Formats:** pass **`--formats md,mermaid,json,html`** (comma-separated). **`--output`** is the **output directory**, not the format list.
715
+ - **Graph schema export:** optional **`--emit-graph-schema`** (with `json` in formats) writes **`graph-schema.json`** — stable Node/Edge view with derived File/Class nodes and `CONTAINS` edges. **`graph-full.json`** stays unchanged for existing consumers.
716
+ - **Markdown intelligence:** flow and entry Markdown include **Called By** and **Impact** lists (capped with **`--intelligence-list-cap`**, default 80).
717
+ - **IR / CFG (optional):** **`--emit-cfg`** builds a language-agnostic IR and writes **`cfg.json`**, **`cfg.mmd`**, and appends a CFG Mermaid block to **`flow.md`** (when `md` is in formats). Cap with **`--cfg-max-nodes`** (default 500).
718
+ - **Entries:** use `--entry` (comma-separated symbol ids), **`--entries-file`** (one id per line, `#` comments allowed), or rely on detectors. **`--emit-entry-per-method`** emits one output directory per method/entry symbol under **`methods/<slug>/`**; cap volume with **`--emit-entry-max`** (default cap **10000** when the flag is set and max is omitted). **`--entry-fallback`** `none` \| `roots` \| `first_n` controls behavior when nothing is detected (default **`roots`**, in-degree 0 symbols, limited by **`--entry-fallback-max`**).
719
+ - **Java flow:** edges can record **branch context** from enclosing `if`, `switch`, or ternary expressions (`condition` / `labels` on edges). **Business rules** Markdown picks up validation-style **`@NotNull`** / **`@Size`** / **`@Valid`** (name heuristics) and throws such as **`IllegalArgumentException`**.
720
+ - **JavaScript / TypeScript / TSX:** Tree-sitter adds **`condition_label`** from enclosing control flow, **`fr.branches`** for `if` / `switch`, and **`fr.rules`** for **`throw`** and common **`assert` / `console.assert`** calls (slice-scoped in the collector).
721
+ - **C++ (tree-sitter path):** **`condition_label`** on calls, **`fr.branches`** for `if` / `switch`, plus **`rules/cpp_rules.py`** for **`throw`** / **`assert`** when methods appear in the slice. (Clang-only parses still get throw/assert via the same extractor when tree-sitter is installed.)
722
+ - **Go:** the **`codeflow_go_dump`** helper emits **`condition`** on calls inside `if` / `switch` / `for` / `range`, and **`rules`** for **`panic`** / **`log.Fatal` / `Fatalf`**; **`fr.rules`** are merged slice-scoped.
723
+ - **PHP:** the **`codeflow_php_dump`** helper adds **`condition`** on calls (from enclosing **`if` / `case`**), **`rules`** for **`throw`**, and **`branches`** for documentation. Install PHP + Composer deps under `codeflow-to-md/examples/codeflow_php_dump` (or mirror under `tools/codeflow_php_dump`) for PHP scans.
724
+ - **Kinds / filters:** `--include` accepts aliases such as **`portlet`** / **`liferay`** for portlet entries.
725
+ - **Operators:** each run writes **`scan-summary.md`** at the output root (counts, warnings, fallback mode) unless **`--no-scan-summary`** is set.
726
+
727
+ ```bash
728
+ python -m md_generator.codeflow.cli.main scan path/to/src --output ./codeflow-out --lang java
729
+ ```
601
730
 
602
731
  ---
603
732
 
@@ -609,6 +738,10 @@ Tests live under each legacy folder’s `tests/` directory (e.g. `pdf-to-md/test
609
738
  | `CODE_OF_CONDUCT.md` | [Contributor Covenant](https://www.contributor-covenant.org/) 2.1 |
610
739
  | `src/md_generator/` | **Library source** (all formats + `api` subpackages); **audio/video** under [`media/audio/`](src/md_generator/media/audio/) and [`media/video/`](src/md_generator/media/video/); **graph-to-md** under [`graph/`](src/md_generator/graph/) |
611
740
  | `pyproject.toml` | Packaging, extras, CLI entry points, pytest |
741
+ | `ai/` | **Distributable AI skills** (`SKILL.md` trees, `registry.json`, `dependency-graph.json`); regenerate with `PYTHONPATH=src python -m md_generator.tools.skill_builder` or **`mdengine skill build`** (after `pip install -e .`) |
742
+ | `src/md_generator/tools/skill_builder/` | **Skill generator** — scans `src/md_generator` and `pyproject.toml` |
743
+ | `src/md_generator/tools/assistant/` | **Skill SDK** (`md_generator.tools.assistant`): `MasterAgent`, `Registry`, bundled `data/` copy of `ai/` |
744
+ | `tool-assistant/tests/` | **Pytests** for the assistant SDK (`md_generator.tools.assistant`) |
612
745
  | `*-to-md/` | **Docs, tests, fixtures**, thin `converter.py` shims, some `run.py` helpers |
613
746
  | `README.md` | This document |
614
747
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mdengine"
7
- version = "0.7.0"
7
+ version = "0.8.1"
8
8
  description = "Convert PDF, Office, images, audio, video, text/JSON/XML, ZIP archives, web URLs, databases, graphs, and OpenAPI specs to Markdown."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -115,6 +115,11 @@ codeflow = [
115
115
  "networkx>=3.2.0",
116
116
  "javalang>=0.13.0",
117
117
  ]
118
+ # Optional: horizontal workers for codeflow API (Celery + Redis). Default job path uses threads.
119
+ codeflow-worker = [
120
+ "celery>=5.3.0",
121
+ "redis>=5.0.0",
122
+ ]
118
123
  codeflow-treesitter = [
119
124
  "tree-sitter>=0.21.0",
120
125
  "tree-sitter-javascript>=0.21.0",
@@ -124,6 +129,12 @@ codeflow-treesitter = [
124
129
  codeflow-clang = [
125
130
  "clang>=16.0.0",
126
131
  ]
132
+ # Embeddings + semantic clustering (SentenceTransformers pulls torch; large install).
133
+ codeflow-semantic = [
134
+ "numpy>=1.24.0",
135
+ "scikit-learn>=1.3.0",
136
+ "sentence-transformers>=3.0.0",
137
+ ]
127
138
  api = [
128
139
  "fastapi>=0.115.0",
129
140
  "uvicorn[standard]>=0.32.0",
@@ -132,6 +143,9 @@ api = [
132
143
  "pydantic-settings>=2.0.0",
133
144
  ]
134
145
  mcp = ["mcp>=1.2.0", "fastmcp>=2.3.0"]
146
+ # Optional: AI skill bundle helpers (md_generator.tools.assistant)
147
+ skill-openai = ["openai>=1.30.0"]
148
+ skill-rag-chroma = ["chromadb>=0.4.22"]
135
149
  dev = [
136
150
  "pytest>=8.0.0",
137
151
  "httpx>=0.27.0",
@@ -219,15 +233,18 @@ mdengine = "md_generator.engine_cli:main"
219
233
 
220
234
  [tool.setuptools.packages.find]
221
235
  where = ["src"]
236
+ include = ["md_generator*"]
222
237
 
223
238
  [tool.setuptools.package-data]
224
239
  "md_generator.db.config" = ["*.yaml"]
225
240
  "md_generator.graph.config" = ["*.yaml"]
226
241
  "md_generator.openapi.config" = ["*.yaml"]
242
+ "md_generator.tools.assistant" = ["data/**/*"]
227
243
 
228
244
  [tool.pytest.ini_options]
229
245
  pythonpath = ["src"]
230
246
  testpaths = [
247
+ "tool-assistant/tests",
231
248
  "pdf-to-md/tests",
232
249
  "word-to-md/tests",
233
250
  "ppt-to-md/tests",
@@ -1,5 +1,5 @@
1
1
  """md_generator: PDF, Office, image, text, and ZIP to Markdown conversion."""
2
2
 
3
- __version__ = "0.7.0"
3
+ __version__ = "0.8.1"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -4,6 +4,9 @@ from dataclasses import dataclass, field
4
4
 
5
5
  import networkx as nx
6
6
 
7
+ from md_generator.codeflow.graph import relations as rel
8
+ from md_generator.codeflow.graph.multigraph_utils import CodeflowGraph, collapsed_digraph_for_relations
9
+
7
10
 
8
11
  @dataclass(slots=True)
9
12
  class FlowSlice:
@@ -15,16 +18,25 @@ class FlowSlice:
15
18
  truncated: bool = False
16
19
 
17
20
 
21
+ _DEFAULT_FLOW_RELATIONS = frozenset({rel.REL_CALLS})
22
+
23
+
18
24
  def walk_with_depth(
19
- g: nx.DiGraph,
25
+ g: CodeflowGraph,
20
26
  start: str,
21
27
  max_depth: int,
28
+ *,
29
+ relations: frozenset[str] | None = None,
22
30
  ) -> tuple[set[str], list[tuple[str, str, dict]], set[str], bool]:
23
- """Reachability from start within ``max_depth`` hops (shortest-path layering)."""
31
+ """Reachability from ``start`` within ``max_depth`` hops over selected relations (default: CALLS only)."""
24
32
  if start not in g:
25
33
  return {start}, [], set(), False
34
+ rels = relations if relations is not None else _DEFAULT_FLOW_RELATIONS
35
+ cg = collapsed_digraph_for_relations(g, rels)
36
+ if start not in cg:
37
+ return {start}, [], set(), False
26
38
  try:
27
- plen = nx.single_source_shortest_path_length(g, start, cutoff=max_depth)
39
+ plen = nx.single_source_shortest_path_length(cg, start, cutoff=max_depth)
28
40
  except nx.NetworkXError:
29
41
  plen = {start: 0}
30
42
 
@@ -36,13 +48,18 @@ def walk_with_depth(
36
48
  for u in nodes:
37
49
  du = plen[u]
38
50
  if du >= max_depth:
39
- succ = list(g.successors(u))
51
+ succ = list(cg.successors(u))
40
52
  if succ:
41
53
  truncated = True
42
54
  continue
43
- for v in g.successors(u):
44
- ed = dict(g.edges[u, v])
45
- edges_out.append((u, v, ed))
55
+ for v in cg.successors(u):
56
+ if not g.has_edge(u, v):
57
+ continue
58
+ for _k, ed in g[u][v].items():
59
+ er = ed.get("relation") or ed.get("kind") or rel.REL_CALLS
60
+ if er not in rels:
61
+ continue
62
+ edges_out.append((u, v, dict(ed)))
46
63
  dv = plen.get(v)
47
64
  if dv is not None and dv <= du:
48
65
  cycle_guess.add(v)
@@ -53,11 +70,13 @@ def walk_with_depth(
53
70
 
54
71
 
55
72
  def slice_from_entry(
56
- g: nx.DiGraph,
73
+ g: CodeflowGraph,
57
74
  entry_id: str,
58
75
  max_depth: int,
76
+ *,
77
+ relations: frozenset[str] | None = None,
59
78
  ) -> FlowSlice:
60
- nodes, edges, cycles, truncated = walk_with_depth(g, entry_id, max_depth)
79
+ nodes, edges, cycles, truncated = walk_with_depth(g, entry_id, max_depth, relations=relations)
61
80
  return FlowSlice(
62
81
  entry_id=entry_id,
63
82
  nodes=nodes,
@@ -7,7 +7,7 @@ import threading
7
7
  import time
8
8
  import uuid
9
9
  import zipfile
10
- from dataclasses import dataclass
10
+ from dataclasses import dataclass, replace
11
11
  from pathlib import Path
12
12
  from typing import Any
13
13
 
@@ -101,24 +101,7 @@ class CodeflowJobManager:
101
101
  zf.extractall(src)
102
102
 
103
103
  out = ws / "out"
104
- cfg = ScanConfig(
105
- project_root=src,
106
- output_path=out,
107
- formats=cfg_template.formats,
108
- depth=cfg_template.depth,
109
- languages=cfg_template.languages,
110
- entry=cfg_template.entry,
111
- include=cfg_template.include,
112
- exclude=cfg_template.exclude,
113
- include_internal=cfg_template.include_internal,
114
- async_mode=cfg_template.async_mode,
115
- jobs=True,
116
- runtime=cfg_template.runtime,
117
- paths_override=cfg_template.paths_override,
118
- business_rules=cfg_template.business_rules,
119
- business_rules_sql=cfg_template.business_rules_sql,
120
- business_rules_combined=cfg_template.business_rules_combined,
121
- )
104
+ cfg = replace(cfg_template, project_root=src, output_path=out, jobs=True)
122
105
  now = time.time()
123
106
  cfg_dump = json.dumps(scan_config_dump(cfg), sort_keys=True)
124
107
  assert self._conn is not None