diff --git a/crates/adapters/d2/src/d2_renderer.rs b/crates/adapters/d2/src/d2_renderer.rs index f07ad60..032b300 100644 --- a/crates/adapters/d2/src/d2_renderer.rs +++ b/crates/adapters/d2/src/d2_renderer.rs @@ -117,6 +117,14 @@ fn render_module(graph: &CodeGraph) -> String { if rel.kind() == RelationshipKind::Import { continue; } + // Direct module-to-module edge (from merged project deps) + if modules.contains(rel.source()) + && modules.contains(rel.target()) + && rel.source() != rel.target() + { + edges.insert((rel.source().to_string(), rel.target().to_string())); + continue; + } let src_mod = name_to_module.get(rel.source()); let tgt_mod = name_to_module.get(rel.target()); if let (Some(s), Some(t)) = (src_mod, tgt_mod) diff --git a/docs/arch/d2/module.d2 b/docs/arch/d2/module.d2 index a594a87..df293a3 100644 --- a/docs/arch/d2/module.d2 +++ b/docs/arch/d2/module.d2 @@ -1,6 +1,9 @@ +Presentation: Presentation +Application: Application Adapters: Adapters Domain: Domain -Application: Application -Presentation: Presentation +Adapters -> Domain Application -> Domain -Adapters -> Domain \ No newline at end of file +Presentation -> Adapters +Presentation -> Domain +Presentation -> Application \ No newline at end of file diff --git a/docs/arch/d2/module.svg b/docs/arch/d2/module.svg new file mode 100644 index 0000000..d116c64 --- /dev/null +++ b/docs/arch/d2/module.svg @@ -0,0 +1,95 @@ +AdaptersDomainApplicationPresentation + + + diff --git a/docs/arch/d2/project.d2 b/docs/arch/d2/project.d2 index c80e659..840013f 100644 --- a/docs/arch/d2/project.d2 +++ b/docs/arch/d2/project.d2 @@ -15,19 +15,19 @@ archlens_domain: archlens-domain archlens_application: archlens-application archlens: archlens archlens_application -> archlens_domain -archlens -> archlens_domain -archlens -> archlens_file_writer +archlens -> archlens_walkdir archlens -> archlens_mermaid archlens -> archlens_html -archlens -> archlens_python_project -archlens -> archlens_walkdir -archlens -> archlens_ascii -archlens -> archlens_toml_config -archlens -> archlens_stdout_writer -archlens -> archlens_application +archlens -> archlens_domain archlens -> archlens_d2 +archlens -> archlens_file_writer +archlens -> archlens_toml_config +archlens -> archlens_application archlens -> archlens_tree_sitter +archlens -> archlens_python_project archlens -> archlens_cargo_workspace +archlens -> archlens_stdout_writer +archlens -> archlens_ascii archlens_tree_sitter -> archlens_domain archlens_walkdir -> archlens_domain archlens_mermaid -> archlens_domain diff --git a/docs/arch/d2/project.svg b/docs/arch/d2/project.svg new file mode 100644 index 0000000..f29cae4 --- /dev/null +++ b/docs/arch/d2/project.svg @@ -0,0 +1,102 @@ +Adaptersarchlens-domainarchlens-applicationarchlensarchlens_file_writerarchlens_mermaidarchlens_htmlarchlens_python_projectarchlens_walkdirarchlens_asciiarchlens_toml_configarchlens_stdout_writerarchlens_d2archlens_tree_sitterarchlens_cargo_workspacearchlens-tree-sitterarchlens-walkdirarchlens-mermaidarchlens-asciiarchlens-file-writerarchlens-stdout-writerarchlens-toml-configarchlens-cargo-workspacearchlens-python-projectarchlens-d2archlens-html + + + diff --git a/docs/arch/d2/type.svg b/docs/arch/d2/type.svg new file mode 100644 index 0000000..197f394 --- /dev/null +++ b/docs/arch/d2/type.svg @@ -0,0 +1,109 @@ +DomainAdaptersApplicationPresentationAdapters_AsciiRendererDomain_DiagramRendererAdapters_D2RendererDomain_DiagramLevelAdapters_CargoWorkspaceAnalyzerDomain_ProjectAnalyzerAdapters_ToolSectionAdapters_PoetrySectionAdapters_PyprojectTomlAdapters_PythonProjectAnalyzerAdapters_StdoutOutputWriterDomain_OutputWriterAdapters_FileOutputWriterAdapters_OutputPathAdapters_MermaidRendererAdapters_TreeSitterAnalyzerAdapters_RustExtractorAdapters_PythonExtractorDomain_SourceAnalyzerAdapters_LanguageExtractorAdapters_WalkdirDiscoveryDomain_FileDiscoveryAdapters_HtmlRendererAdapters_RawConfigAdapters_RawAnalysisAdapters_RawOutputAdapters_RawRulesAdapters_TomlConfigLoaderDomain_ConfigLoaderApplication_AnalyzeCodebaseResultDomain_CodeGraphDomain_RelationshipDomain_RelationshipKindDomain_CodeElementDomain_CodeElementKindDomain_FilePathDomain_VisibilityDomain_AnalysisConfigDomain_AnalysisWarningDomain_SourceFileDomain_LanguageDomain_RuleViolationDomain_RuleKindRelationship+sourceString+targetString+kindRelationshipKind+source_fileOption+new()void+with_source_file()void+source()void+target()void+kind()void+source_file()voidCodeElement+nameString+qualified_nameOption+kindCodeElementKind+file_pathFilePath+lineusize+visibilityVisibility+moduleOption+genericsVec+attributesVec+fieldsVec+methodsVec+new()void+with_visibility()void+with_module()void+with_generics()void+with_attributes()void+with_qualified_name()void+name()void+qualified_name()void+kind()void+file_path()void+line()void+visibility()void+module()void+generics()void+attributes()void+with_fields()void+with_methods()void+fields()void+methods()voidDomainErrorDiagramRendererSourceAnalyzerConfigLoaderFileDiscoveryProjectAnalyzerOutputWriterAnalysisResult+elementsVec+relationshipsVec+warningsVec+new()void+empty()void+elements()void+relationships()void+warnings()voidAnalysisConfig+excludesVec+levelDiagramLevel+module_mappingsHashMap+scopeOption+include_testsbool+changed_filesOption+with_excludes()void+with_level()void+with_module_mappings()void+excludes()void+level()void+with_scope()void+module_mappings()void+scope()void+with_include_tests()void+include_tests()void+with_changed_files()void+changed_files()voidAnalysisWarning+file_pathFilePath+lineusize+messageString+new()void+file_path()void+line()void+message()voidCodeElementKindRelationshipKindVisibilityDiagramLevelOutputConfig+split_by_modulebool+output_pathOption+with_split_by_module()void+with_output_path()void+split_by_module()void+output_path()voidRenderedFile+nameString+contentString+new()void+name()void+content()voidRenderOutput+filesVec+new()void+single()void+files()voidModuleName+new()void+from_path()void+from_directory_group()void+capitalize()void+as_str()voidLanguage+name()voidSourceFile+pathFilePath+languageLanguage+new()void+path()void+language()voidFilePath+new()void+as_str()voidRuleKindRuleViolation+source_moduleString+target_moduleString+kindRuleKind+new()void+source_module()void+target_module()void+kind()void+message()voidBoundaryRule+sourceString+targetString+parse()void+source()void+target()void+matches()voidCodeGraph+elementsVec+relationshipsVec+new()void+add_element()void+add_relationship()void+elements()void+relationships()void+modules()void+elements_by_module()void+resolve_relationships()void+filter_external_imports()void+qualify()void+cross_module_deps_for()void+subgraph_by_module()voidAsciiRenderer+new()void+format_kind()voidD2Renderer+levelDiagramLevel+new()void+with_level()voidCargoWorkspaceAnalyzer+new()voidWorkspaceToml+workspaceOptionWorkspaceSection+membersVecMemberToml+packageOption+dependenciesHashMapPackageSection+nameStringPythonProjectAnalyzer+new()voidProjectSection+nameOption+dependenciesVecPoetrySection+nameOption+dependenciesHashMapToolSection+poetryPoetrySectionPyprojectToml+projectOption+toolToolSectionStdoutOutputWriter+new()voidFileOutputWriter+output_pathOutputPath+new()void+single_file()voidOutputPathMermaidRenderer+levelDiagramLevel+show_weightsbool+new()void+with_level()void+with_weights()void+display_name()void+format_element_name()void+format_visibility()void+render_class_diagram()void+push_class_lines()void+render_module_flowchart()void+render_project_flowchart()void+sanitize_id()voidLanguageExtractorTreeSitterAnalyzer+rustRustExtractor+pythonPythonExtractor+new()void+extractor_for()voidRustExtractorPythonExtractorWalkdirDiscovery+new()void+detect_language()void+is_test_file()void+is_excluded()voidHtmlRenderer+new()voidGraphData+nodesVec+edgesVecString+idString+moduleString+kindString+fieldsVec+methodsVecEdgeData+sourceString+targetString+kindStringRawRules+allowVec+denyVecRawConfig+analysisRawAnalysis+outputRawOutput+modulesHashMap+rulesRawRulesRawAnalysis+excludeVec+levelOptionRawOutput+formatOption+pathOption+split_by_moduleboolTomlConfigLoader+rawRawConfig+from_path()void+parse_level()voidAnalyzeCodebase+file_discoveryF+source_analyzerS+new()void+execute()voidAnalyzeCodebaseResult+graphCodeGraph+warningsVec+graph()void+warnings()voidCli+commandOption+pathPathBuf+levelString+formatString+outputOption+configOption+scopeOption+excludeVec+include_testsbool+no_weightsbool+watchbool+sinceOption+split_by_modulebool+strictbool+checkbool+verboseu8Command + + +