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 @@
+
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
+
+
+