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.
- {mdengine-0.7.0/src/mdengine.egg-info → mdengine-0.8.1}/PKG-INFO +149 -5
- {mdengine-0.7.0 → mdengine-0.8.1}/README.md +137 -4
- {mdengine-0.7.0 → mdengine-0.8.1}/pyproject.toml +18 -1
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/__init__.py +1 -1
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/analyzers/flow_analyzer.py +28 -9
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/job_manager.py +2 -19
- mdengine-0.8.1/src/md_generator/codeflow/api/schemas.py +364 -0
- mdengine-0.8.1/src/md_generator/codeflow/api/semantic_api.py +69 -0
- mdengine-0.8.1/src/md_generator/codeflow/cli/main.py +548 -0
- mdengine-0.8.1/src/md_generator/codeflow/config/__init__.py +13 -0
- mdengine-0.8.1/src/md_generator/codeflow/config/codeflow_yaml.py +45 -0
- mdengine-0.8.1/src/md_generator/codeflow/core/__init__.py +13 -0
- mdengine-0.8.1/src/md_generator/codeflow/core/extractor.py +683 -0
- mdengine-0.8.1/src/md_generator/codeflow/core/run_config.py +109 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/entry_detector.py +28 -1
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/entry_rank.py +4 -4
- mdengine-0.8.1/src/md_generator/codeflow/detectors/event_detector.py +126 -0
- mdengine-0.8.1/src/md_generator/codeflow/detectors/liferay_portlet_detector.py +196 -0
- mdengine-0.8.1/src/md_generator/codeflow/generators/cfg_paths_markdown.py +114 -0
- mdengine-0.8.1/src/md_generator/codeflow/generators/cfg_paths_mermaid.py +30 -0
- mdengine-0.8.1/src/md_generator/codeflow/generators/cfg_render.py +121 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/cytoscape_enrich.py +6 -3
- mdengine-0.8.1/src/md_generator/codeflow/generators/entry_markdown.py +559 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/flow_summary.py +7 -8
- mdengine-0.8.1/src/md_generator/codeflow/generators/flow_tree.py +56 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/html.py +1 -0
- mdengine-0.8.1/src/md_generator/codeflow/generators/html_unified.py +285 -0
- mdengine-0.8.1/src/md_generator/codeflow/generators/markdown.py +133 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/mermaid.py +14 -2
- mdengine-0.8.1/src/md_generator/codeflow/graph/__init__.py +6 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/analysis.py +93 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/builder.py +478 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/call_expander.py +160 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/cfg_builder.py +435 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/cfg_copy.py +41 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/cfg_model.py +49 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/clustering.py +178 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/embeddings.py +193 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/enricher.py +74 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/event_graph.py +55 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/export_schema.py +278 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/multigraph_utils.py +106 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/path_enumerator.py +92 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/path_probability.py +64 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/query_engine.py +81 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/relations.py +35 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/runtime_integration.py +32 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/semantic_enricher.py +76 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/semantic_index.py +84 -0
- mdengine-0.8.1/src/md_generator/codeflow/graph/sqlite_export.py +56 -0
- mdengine-0.8.1/src/md_generator/codeflow/ingestion/git_loader.py +209 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/mcp/server.py +22 -5
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/models/ir.py +30 -0
- mdengine-0.8.1/src/md_generator/codeflow/models/ir_cfg.py +42 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/__init__.py +16 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/cpp_adapter.py +229 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/go_adapter.py +15 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/ir_from_dump.py +75 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/java_adapter.py +186 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/php_adapter.py +15 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/python_adapter.py +185 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/adapters/treesitter_adapter.py +218 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/cpp_parser.py +84 -3
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/go_parser.py +26 -4
- mdengine-0.8.1/src/md_generator/codeflow/parsers/ir_enrich.py +41 -0
- mdengine-0.8.1/src/md_generator/codeflow/parsers/java_parser.py +371 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/php_parser.py +40 -4
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/python_parser.py +31 -1
- mdengine-0.8.1/src/md_generator/codeflow/parsers/treesitter_js_ts_parser.py +339 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/rules/collector.py +17 -8
- mdengine-0.8.1/src/md_generator/codeflow/rules/cpp_rules.py +113 -0
- mdengine-0.8.1/src/md_generator/codeflow/rules/java_rules.py +188 -0
- mdengine-0.8.1/src/md_generator/codeflow/utils/tools_root.py +16 -0
- mdengine-0.8.1/src/md_generator/codeflow/worker/__init__.py +1 -0
- mdengine-0.8.1/src/md_generator/codeflow/worker/celery_optional.py +22 -0
- mdengine-0.8.1/src/md_generator/engine_cli.py +65 -0
- mdengine-0.8.1/src/md_generator/tools/__init__.py +1 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/__init__.py +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/adapters/__init__.py +5 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/adapters/claude.py +30 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/adapters/cursor.py +20 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/adapters/openai.py +27 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/agent.py +152 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/bundle.py +12 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/chunks.py +54 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/cli.py +73 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/dependency-graph.json +110 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/registry.json +672 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/global-skill.md +66 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-archive/SKILL.md +71 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-archive/references/example.md +8 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-codeflow/SKILL.md +74 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-codeflow/references/example.md +8 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-db/SKILL.md +73 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-db/references/example.md +11 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-global/SKILL.md +78 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-global/references/example.md +21 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-graph/SKILL.md +73 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-graph/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-image/SKILL.md +73 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-image/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-media/SKILL.md +80 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-media/references/example.md +11 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-openapi/SKILL.md +73 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-openapi/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-pdf/SKILL.md +71 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-pdf/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-playwright/SKILL.md +74 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-playwright/references/example.md +7 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-ppt/SKILL.md +71 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-ppt/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-text/SKILL.md +71 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-text/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-url/SKILL.md +71 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-url/references/example.md +11 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-word/SKILL.md +71 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-word/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-xlsx/SKILL.md +71 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-ai-xlsx/references/example.md +6 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/SKILL.md +46 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/references/entrypoints.md +46 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/references/example.md +24 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/mdengine-reference/references/http-api-mcp.md +156 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/archive.md +67 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/codeflow.md +70 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/db.md +69 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/graph.md +69 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/image.md +69 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/media.md +76 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/openapi.md +69 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/pdf.md +67 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/playwright.md +70 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/ppt.md +67 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/text.md +67 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/url.md +67 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/word.md +67 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/data/skills/modules/xlsx.md +67 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/rag.py +69 -0
- mdengine-0.8.1/src/md_generator/tools/assistant/registry.py +85 -0
- mdengine-0.8.1/src/md_generator/tools/skill_builder/__init__.py +6 -0
- mdengine-0.8.1/src/md_generator/tools/skill_builder/__main__.py +44 -0
- mdengine-0.8.1/src/md_generator/tools/skill_builder/dependency_graph.py +109 -0
- mdengine-0.8.1/src/md_generator/tools/skill_builder/generate.py +501 -0
- mdengine-0.8.1/src/md_generator/tools/skill_builder/pyproject_util.py +50 -0
- mdengine-0.8.1/src/md_generator/tools/skill_builder/routing.py +98 -0
- {mdengine-0.7.0 → mdengine-0.8.1/src/mdengine.egg-info}/PKG-INFO +149 -5
- {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/SOURCES.txt +113 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/requires.txt +15 -0
- mdengine-0.7.0/src/md_generator/codeflow/api/schemas.py +0 -96
- mdengine-0.7.0/src/md_generator/codeflow/cli/main.py +0 -132
- mdengine-0.7.0/src/md_generator/codeflow/core/__init__.py +0 -6
- mdengine-0.7.0/src/md_generator/codeflow/core/extractor.py +0 -193
- mdengine-0.7.0/src/md_generator/codeflow/core/run_config.py +0 -31
- mdengine-0.7.0/src/md_generator/codeflow/generators/entry_markdown.py +0 -198
- mdengine-0.7.0/src/md_generator/codeflow/generators/markdown.py +0 -35
- mdengine-0.7.0/src/md_generator/codeflow/graph/__init__.py +0 -5
- mdengine-0.7.0/src/md_generator/codeflow/graph/builder.py +0 -181
- mdengine-0.7.0/src/md_generator/codeflow/parsers/java_parser.py +0 -116
- mdengine-0.7.0/src/md_generator/codeflow/parsers/treesitter_js_ts_parser.py +0 -119
- mdengine-0.7.0/src/md_generator/codeflow/utils/tools_root.py +0 -13
- mdengine-0.7.0/src/md_generator/engine_cli.py +0 -38
- {mdengine-0.7.0 → mdengine-0.8.1}/LICENSE +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/setup.cfg +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/convert_runner.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/jobs.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/query_options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/convert_impl.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/archive/options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/analyzers/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/api/sse.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/cli/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/api_detector.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/detectors/kafka_detector.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/business_rules_markdown.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/generators/sequence.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/ingestion/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/ingestion/loader.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/lang_dispatch.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/mcp/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/models/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/parsers/base.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/rules/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/runtime/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/runtime/tracer.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/codeflow/utils/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/factory.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/mongo_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/mysql_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/oracle_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/postgres_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/sql_common.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/adapters/sqlite_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/schemas.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/api/sqlite_upload.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/cli/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/cli/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/config/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/config/default.yaml +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/base_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/dot_emitter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/filter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/mermaid_emitter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/mermaid_render.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/model.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/pipeline.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/erd/render.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/extractor.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/job_manager.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/markdown_writer.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/models.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/run_config.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/util.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/core/zip_export.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/sse.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/db/mcp/stream.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/factory.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/neo4j_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/adapters/networkx_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/schemas.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/cli/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/cli/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/config/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/config/default.yaml +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/base_adapter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/extractor.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/graph_builder.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/job_manager.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/markdown_writer.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/models.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/run_config.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/viz.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/core/zip_export.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/sse.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/graph/mcp/stream.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/query_options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/staging.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/api/zip_bundle.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/base.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/easy.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/paddle.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/backends/tesseract.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/convert_impl.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/emit.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/io_util.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/image/utils.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/formatter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/audio/service.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/document_converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/job_store.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/formatter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/video/service.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/whisper_language.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/formatter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/metadata.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/service.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/media/youtube/transcript.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/schemas.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/cli/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/cli/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/config/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/config/default.yaml +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/converters/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/converters/swagger2_to_openapi3.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/extractor.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/run_config.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/core/zip_export.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/enrichers/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/enrichers/rules.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/enrichers/sample_body.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/generators/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/generators/dependency_graph.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/loaders/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/loaders/spec_loader.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/mcp/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/mcp/server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/models/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/models/domain.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/normalizers/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/normalizers/operations.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/normalizers/schema_flatten.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/parsers/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/parsers/openapi_parser.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/resolvers/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/resolvers/ref_resolver.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/writers/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/openapi/writers/markdown_writer.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/api/zip_bundle.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/md_emit.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/pdf_extract.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/pdf/utils.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/convert_runner.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/jobs.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/run.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/assets.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/chunker.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/cli.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/extractor.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/html_to_md.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/pipeline.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/playwright/playwright_fetcher.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/convert_runner.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/jobs.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/query_options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/convert_impl.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/embedded_extract.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/ooxml_media.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/post_assets.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/text_formatting.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_pdf_md/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_pdf_md/convert.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_word_md/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/vendor_word_md/convert.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/ppt/zip_deep.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/convert_runner.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/jobs.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/query_options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/convert_impl.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/format_detect.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/md_emit_json.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/md_emit_txt.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/md_emit_xml.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/text/options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/convert_runner.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/jobs.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/mcp_setup.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/query_options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/api/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/assets.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/convert_impl.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/crawl.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/extract.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/fetch.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/html_to_md.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/options.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/page_convert.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/post_convert_assets.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/url/robots_util.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/convert_util.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/jobs.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/main.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/api/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/artifact.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/word/settings.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/api/__init__.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/api/app.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/convert_config.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/converter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/converter_core.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/excel_reader.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/markdown_emitter.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/md_generator/xlsx/mcp_server.py +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/dependency_links.txt +0 -0
- {mdengine-0.7.0 → mdengine-0.8.1}/src/mdengine.egg-info/entry_points.txt +0 -0
- {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.
|
|
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),
|
|
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
|
|
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/`**,
|
|
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),
|
|
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
|
|
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/`**,
|
|
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
|
+
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",
|
|
@@ -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:
|
|
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 (
|
|
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(
|
|
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(
|
|
51
|
+
succ = list(cg.successors(u))
|
|
40
52
|
if succ:
|
|
41
53
|
truncated = True
|
|
42
54
|
continue
|
|
43
|
-
for v in
|
|
44
|
-
|
|
45
|
-
|
|
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:
|
|
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 =
|
|
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
|