python-delphi-lsp 2.3.3__tar.gz → 3.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/MANIFEST.in +1 -0
  2. {python_delphi_lsp-2.3.3/python_delphi_lsp.egg-info → python_delphi_lsp-3.1.0}/PKG-INFO +98 -19
  3. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/README.md +97 -18
  4. python_delphi_lsp-3.1.0/delphi_lsp/_version.py +1 -0
  5. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_cache.py +159 -43
  6. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_cli.py +74 -6
  7. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_context.py +205 -1
  8. python_delphi_lsp-3.1.0/delphi_lsp/agent_cpg.py +350 -0
  9. python_delphi_lsp-3.1.0/delphi_lsp/agent_cpg_builder.py +667 -0
  10. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_layers.py +1 -1
  11. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_metrics.py +110 -1
  12. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_protocol.py +57 -3
  13. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_templates.py +20 -13
  14. python_delphi_lsp-3.1.0/delphi_lsp/agent_wiki.py +1084 -0
  15. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/pyproject.toml +1 -1
  16. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0/python_delphi_lsp.egg-info}/PKG-INFO +98 -19
  17. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/SOURCES.txt +6 -0
  18. python_delphi_lsp-3.1.0/scripts/benchmark_cpg.py +376 -0
  19. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/benchmark_github_corpus.py +1 -1
  20. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/run_openrouter_github_e2e.py +1 -1
  21. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_cache.py +65 -6
  22. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_codebase.py +40 -4
  23. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_context.py +132 -0
  24. python_delphi_lsp-3.1.0/tests/test_agent_cpg.py +581 -0
  25. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_metrics.py +32 -0
  26. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_protocol.py +22 -5
  27. python_delphi_lsp-3.1.0/tests/test_agent_wiki.py +347 -0
  28. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_worker.py +93 -22
  29. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_github_performance_corpus.py +34 -0
  30. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_lsp_support.py +1 -1
  31. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_openrouter_github_e2e.py +5 -5
  32. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_package_metadata.py +42 -5
  33. python_delphi_lsp-2.3.3/delphi_lsp/_version.py +0 -1
  34. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/.github/workflows/ci.yml +0 -0
  35. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/LICENSE +0 -0
  36. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/__init__.py +0 -0
  37. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_relations.py +0 -0
  38. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_workspace.py +0 -0
  39. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/binary.py +0 -0
  40. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/comment_builder.py +0 -0
  41. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/consts.py +0 -0
  42. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/delphiast_lexer.py +0 -0
  43. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/delphiast_parser.py +0 -0
  44. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/delphiast_tokens.py +0 -0
  45. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/grammar.py +0 -0
  46. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/lark_builder.py +0 -0
  47. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/lark_tokens.py +0 -0
  48. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/lsp_server.py +0 -0
  49. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/metrics.py +0 -0
  50. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/navigation_cache.py +0 -0
  51. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/nodes.py +0 -0
  52. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/parallel_outline.py +0 -0
  53. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/parser.py +0 -0
  54. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/parser_backend.py +0 -0
  55. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/preprocessor.py +0 -0
  56. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/progress.py +0 -0
  57. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/project_discovery.py +0 -0
  58. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/project_indexer.py +0 -0
  59. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/semantic.py +0 -0
  60. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/semantic_builder.py +0 -0
  61. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/source_reader.py +0 -0
  62. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/workspace.py +0 -0
  63. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/writer.py +0 -0
  64. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/opencode.json +0 -0
  65. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  66. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  67. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
  68. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  69. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/audit_delphi_language_features.py +0 -0
  70. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/benchmark_parallel_cache.py +0 -0
  71. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  72. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  73. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  74. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  75. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/build_github_performance_corpus.py +0 -0
  76. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/check_ornith_cache.py +0 -0
  77. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/generate_progress_pdf.py +0 -0
  78. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/generate_release_evidence.py +0 -0
  79. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  80. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/prepare_ornith_cache.py +0 -0
  81. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/run_opencode_lsp_probe.py +0 -0
  82. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/start_ornith_vllm.sh +0 -0
  83. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/summarize_opencode_request_payloads.py +0 -0
  84. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/setup.cfg +0 -0
  85. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/corpora.performance.lock.json +0 -0
  86. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  87. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  88. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  89. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  90. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  91. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  92. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  93. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  94. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  95. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  96. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  97. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  98. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  99. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  100. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  101. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  102. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  103. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  104. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  105. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  106. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  107. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  108. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  109. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  110. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  111. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  112. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  113. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  114. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  115. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/library_demo.dpr +0 -0
  116. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/package_demo.dpk +0 -0
  117. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/program_demo.dpr +0 -0
  118. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_advanced.pas +0 -0
  119. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_attributes.pas +0 -0
  120. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_basic.pas +0 -0
  121. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_consumer.pas +0 -0
  122. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_generics.pas +0 -0
  123. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_inheritance.pas +0 -0
  124. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_math.pas +0 -0
  125. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_properties.pas +0 -0
  126. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_sections.pas +0 -0
  127. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_statements.pas +0 -0
  128. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_types.pas +0 -0
  129. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_unresolved.pas +0 -0
  130. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_with.pas +0 -0
  131. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_cli_errors.py +0 -0
  132. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_relations.py +0 -0
  133. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_workspace.py +0 -0
  134. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
  135. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
  136. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_lexer.py +0 -0
  137. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_native_compatibility.py +0 -0
  138. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_parser.py +0 -0
  139. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
  140. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_diagnostics.py +0 -0
  141. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_language_feature_matrix.py +0 -0
  142. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_legacy_snippets.py +0 -0
  143. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_lsp_features.py +0 -0
  144. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_metrics.py +0 -0
  145. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_navigation_cache.py +0 -0
  146. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_opencode_config.py +0 -0
  147. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_opencode_probe.py +0 -0
  148. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_opencode_request_payloads.py +0 -0
  149. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_ornith_cache_prepare.py +0 -0
  150. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_parallel_outline.py +0 -0
  151. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_parser.py +0 -0
  152. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_parser_backends.py +0 -0
  153. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_preprocessor.py +0 -0
  154. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_progress.py +0 -0
  155. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_project_discovery.py +0 -0
  156. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_project_indexer.py +0 -0
  157. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_release_evidence.py +0 -0
  158. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_semantic.py +0 -0
  159. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_vllm_start_script.py +0 -0
  160. {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_workspace.py +0 -0
@@ -6,6 +6,7 @@ include scripts/check_ornith_cache.py
6
6
  include scripts/audit_delphi_language_features.py
7
7
  include scripts/build_github_performance_corpus.py
8
8
  include scripts/benchmark_github_corpus.py
9
+ include scripts/benchmark_cpg.py
9
10
  include scripts/benchmark_parallel_cache.py
10
11
  include scripts/bootstrap_vllm_opencode_test.py
11
12
  include scripts/bootstrap_vllm_codebase_skill_test.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-delphi-lsp
3
- Version: 2.3.3
3
+ Version: 3.1.0
4
4
  Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -42,7 +42,7 @@ Dynamic: license-file
42
42
 
43
43
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
44
44
  indexes, serves LSP, and provides bounded codebase navigation for agents.
45
- Version 2.3.3 is authored by Dark Light and supports Windows, macOS, and Linux.
45
+ Version 3.1.0 is authored by Dark Light and supports Windows, macOS, and Linux.
46
46
 
47
47
  ## Install and quick start
48
48
 
@@ -184,7 +184,7 @@ directories such as `build`, `dist`, environments, VCS folders, `node_modules`,
184
184
  and tool caches. Missing paths and invalid metadata become problems; paths are
185
185
  not guessed.
186
186
 
187
- ## Agent CLI and Interface/Protocol v2
187
+ ## Agent CLI and Interface/Protocol v3
188
188
 
189
189
  `delphi-lsp-agent` has these subcommands and options:
190
190
 
@@ -199,9 +199,13 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
199
199
  [--workers auto|N]
200
200
  delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
201
201
  [--workers auto|N]
202
+ delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
203
+ [--workers auto|N] [--force]
202
204
  delphi-lsp-agent query --root PATH ACTION [VALUE]
203
205
  [--project-id ID] [--detail summary|declaration|members|context|body|implementations]
204
206
  [--relation references|callers|callees|uses|used_by|inherits|implements]
207
+ [--graph ast|cfg|dfg|call|full] [--direction out|in|both]
208
+ [--depth 1..16]
205
209
  [--cursor TEXT] [--max-items INT] [--max-chars INT]
206
210
  delphi-lsp-agent skill install [--target PATH] [--force]
207
211
  delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
@@ -220,13 +224,48 @@ delphi-lsp-agent cache stop --root PATH
220
224
  `cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
221
225
  `cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
222
226
  `cache stop` outputs stop status JSON and may include warnings on stderr.
223
- `query` outputs Protocol v2 JSON responses and writes warnings to stderr.
227
+ `query` outputs Protocol v3 JSON responses and writes warnings to stderr.
228
+
229
+ ### Open Knowledge Format wiki export
230
+
231
+ Export the complete unique knowledge represented by the layered codebase views
232
+ as a portable Markdown wiki:
233
+
234
+ ```bash
235
+ delphi-lsp-agent wiki export --root PATH --out codebase-wiki
236
+ ```
237
+
238
+ When `--out` is relative, it is resolved below `--root`; the default is
239
+ `.delphi-lsp/wiki`. The command builds the semantic index once, deep-indexes
240
+ discovered projects, calculates workspace and unit metrics, and writes:
241
+
242
+ - an OKF 0.2 root `index.md`;
243
+ - linked project, unit, and symbol concepts;
244
+ - declaration and implementation source fragments;
245
+ - resolved and unresolved semantic references;
246
+ - discovery/project problems and complete metric records;
247
+ - Protocol v3, relation, CPG, cache, and layer-mapping reference concepts.
248
+
249
+ Every non-index concept is UTF-8 Markdown with YAML frontmatter and a non-empty
250
+ `type`. Readable filenames include a stable digest, so overloads and equal names
251
+ from different units remain distinct even on case-insensitive filesystems.
252
+ Output order and content are deterministic. The finished bundle replaces the
253
+ destination only after generation succeeds; an existing non-empty destination
254
+ requires `--force`, and unsafe root/ancestor/symlink targets are rejected.
255
+
256
+ Pages are streamed to disk, decoded source retention is bounded, and metrics
257
+ process source paths without materializing the entire source corpus. Lazy CPG
258
+ subgraphs are documented rather than eagerly multiplied across all possible
259
+ targets; a focused live `cpg` query remains the bounded way to obtain one graph.
260
+ The bundle structure follows the
261
+ [Open Knowledge Format 0.2 specification](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md).
224
262
 
225
263
  ```bash
226
264
  delphi-lsp-agent query --root PATH find TCustomer
227
265
  delphi-lsp-agent query --root PATH focus TARGET_ID
228
266
  delphi-lsp-agent query --root PATH inspect
229
267
  delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
268
+ delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
230
269
  delphi-lsp-agent query --root PATH metrics
231
270
  delphi-lsp-agent query --root PATH metrics UNIT_QUERY
232
271
  delphi-lsp-agent cache status --root PATH --format json
@@ -298,10 +337,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
298
337
  recent ranked queries are retained in a small LRU so alternating CLI and
299
338
  OpenCode searches remain warm.
300
339
 
301
- `cache start` waits up to `--startup-timeout 120` seconds by default for a large
302
- workspace to prewarm. The timeout belongs to the starting client and does not
303
- change daemon compatibility or idle shutdown. Starting a live root with a
304
- different worker configuration reports a configuration conflict.
340
+ `cache start` waits up to `--startup-timeout 120` seconds for the child process
341
+ to bind and publish readiness metadata, not for the large workspace to finish
342
+ prewarming. Workspace discovery and prewarming continue in the daemon while
343
+ status reports `warming`. If bootstrap fails, the CLI reports whether it timed
344
+ out or exited, the exit code, Python executable, workspace, and a sanitized
345
+ tail of child stderr. Starting a live root with a different worker
346
+ configuration reports a configuration conflict.
305
347
 
306
348
  Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
307
349
  If compaction removes navigable data, the daemon rebuilds the navigation state on demand
@@ -324,14 +366,15 @@ outside the root workspace.
324
366
  `metrics`. For example, `delphi-lsp-agent view --layer metrics --format json`
325
367
  returns a project summary and detailed unit metric objects; `--query` filters
326
368
  units by name or path.
327
- `index` materializes overview, projects, and problems JSON. `skill install`
369
+ `index` materializes overview, projects, and problems JSON. `wiki export`
370
+ materializes the same navigational knowledge as a linked OKF Markdown bundle. `skill install`
328
371
  writes the skill; `opencode install` writes the package-named skill, Markdown
329
372
  agent, and plugin. The two deprecated write flags are harmless aliases and do
330
373
  not change user configuration.
331
374
  `worker` serves NDJSON over standard input/output.
332
375
 
333
- Protocol v2 actions are `open`, `find`, `inspect`, `trace`, `focus`,
334
- `problems`, and `metrics`. A `metrics` request without a query returns the
376
+ Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
377
+ `problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
335
378
  project summary followed by unit cards. A query filters units, while a unit
336
379
  `target_id` from `open` selects one unit; `detail: "members"` adds routine,
337
380
  Halstead, dependency, and symbol-count detail without returning source text.
@@ -341,12 +384,15 @@ Detail values are `summary`, `declaration`, `members`,
341
384
  `implements`.
342
385
 
343
386
  A request requires `action` and can include `query`, `target_id`,
344
- `project_id`, `detail`, `relation`, `cursor`, `max_items`, and
345
- `max_chars`. Defaults are empty text fields, `detail: "summary"`, no
346
- relation, `max_items: 12`, and `max_chars: 12000`. Ranges are 1–50 items
347
- and 256–40000 characters. A successful envelope has `schema: 2`,
387
+ `project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
388
+ `max_items`, and `max_chars`. Defaults are empty text fields,
389
+ `detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
390
+ `depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
391
+ response ranges are 1–50 items and 256–40000 characters. A successful envelope
392
+ has `schema: 3`,
348
393
  `workspace_revision`, `focus` (project, unit, and target IDs), `result`,
349
- `page`, and `context`; errors have `schema: 2` and a code/message.
394
+ `page`, and `context`; errors have `schema: 3` and a code/message. Existing
395
+ target IDs remain unchanged across the protocol upgrade.
350
396
 
351
397
  Focus preserves the selected project, unit, or target. Cursors bind a workspace
352
398
  revision and request fingerprint, so source changes and cross-target or
@@ -354,6 +400,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
354
400
  response. A `sound_partial` relation is sound but incomplete: unresolved and
355
401
  ambiguous relations are never fabricated. Unsupported relations are rejected.
356
402
 
403
+ ### Lazy code property graph
404
+
405
+ The `cpg` action translates one selected unit, type, or routine into a bounded
406
+ code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
407
+ `direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
408
+ from the selected target. Together, `graph`, `direction`, and `depth` select
409
+ the returned subgraph. Results contain stable CPG node and edge IDs,
410
+ location and symbol properties, graph metadata, and explicit problems.
411
+
412
+ AST edges preserve syntax containment. CFG edges include routine entry/exit,
413
+ sequence, conditional branches, loop back-edges, and conservative structured
414
+ control flow. Local DFG edges distinguish definitions, uses, and reaching
415
+ definitions. CALL edges are emitted only for a uniquely resolved explicit
416
+ callee. Ambiguous or unsupported semantics increase the unresolved count and
417
+ are reported as `sound_partial`; the navigator does not fabricate certainty.
418
+
419
+ CPG construction is lazy: navigation prewarming creates no graph. The first
420
+ request parses only the selected source, and identical requests reuse an
421
+ in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
422
+ `depth`. The CPG LRU receives 20 percent of the configured retained-cache
423
+ budget, capped at 128 MiB. Source text and full parser trees are not retained
424
+ inside graph records, and normal navigation keeps its existing cache path.
425
+
426
+ The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
427
+ lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
428
+ prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
429
+ the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
430
+ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
431
+ in-run control throughput, above the 95-percent release floor. Reproduce it
432
+ with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
433
+
357
434
  For every source size the navigator builds an outline first, loads source detail
358
435
  lazily for a selected target, and returns only selected fragments. Typed source
359
436
  chunks are at most 6000 characters and also respect the response budget. This
@@ -383,14 +460,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
383
460
  file remains entirely user-owned. The deprecated `--write-config` and
384
461
  `--write-agent` options are accepted harmlessly for compatibility.
385
462
 
386
- The plugin maintains one worker per session/root, reusing focus and indexes.
463
+ The plugin maintains one worker per session/root, reusing focus, indexes, and
464
+ lazy CPG subgraphs.
387
465
  During compaction it restores the focus and summary into the new context.
388
466
  Transport failure, session deletion, and plugin disposal clean up the worker.
389
467
 
390
468
  OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
391
469
  Persistent session/root worker support first shipped in 2.0.0.
392
470
  This is the same persistent session/root worker boundary.
393
- The OpenCode worker stays separate from CLI daemon, and current plugin behavior is unchanged.
471
+ The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
472
+ arguments without changing the persistent session/root boundary.
394
473
 
395
474
  A generated OpenCode agent starts with this Markdown frontmatter:
396
475
 
@@ -426,7 +505,7 @@ permission:
426
505
 
427
506
  Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
428
507
  use `delphi_codebase` actions such as
429
- `open`, `find`, `focus`, and `inspect`. Use semantic tool calls, not raw
508
+ `open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
430
509
  source tools.
431
510
 
432
511
  For architecture questions, call `metrics` without a query to compare unit
@@ -2,7 +2,7 @@
2
2
 
3
3
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
4
4
  indexes, serves LSP, and provides bounded codebase navigation for agents.
5
- Version 2.3.3 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 3.1.0 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -144,7 +144,7 @@ directories such as `build`, `dist`, environments, VCS folders, `node_modules`,
144
144
  and tool caches. Missing paths and invalid metadata become problems; paths are
145
145
  not guessed.
146
146
 
147
- ## Agent CLI and Interface/Protocol v2
147
+ ## Agent CLI and Interface/Protocol v3
148
148
 
149
149
  `delphi-lsp-agent` has these subcommands and options:
150
150
 
@@ -159,9 +159,13 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
159
159
  [--workers auto|N]
160
160
  delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
161
161
  [--workers auto|N]
162
+ delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
163
+ [--workers auto|N] [--force]
162
164
  delphi-lsp-agent query --root PATH ACTION [VALUE]
163
165
  [--project-id ID] [--detail summary|declaration|members|context|body|implementations]
164
166
  [--relation references|callers|callees|uses|used_by|inherits|implements]
167
+ [--graph ast|cfg|dfg|call|full] [--direction out|in|both]
168
+ [--depth 1..16]
165
169
  [--cursor TEXT] [--max-items INT] [--max-chars INT]
166
170
  delphi-lsp-agent skill install [--target PATH] [--force]
167
171
  delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
@@ -180,13 +184,48 @@ delphi-lsp-agent cache stop --root PATH
180
184
  `cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
181
185
  `cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
182
186
  `cache stop` outputs stop status JSON and may include warnings on stderr.
183
- `query` outputs Protocol v2 JSON responses and writes warnings to stderr.
187
+ `query` outputs Protocol v3 JSON responses and writes warnings to stderr.
188
+
189
+ ### Open Knowledge Format wiki export
190
+
191
+ Export the complete unique knowledge represented by the layered codebase views
192
+ as a portable Markdown wiki:
193
+
194
+ ```bash
195
+ delphi-lsp-agent wiki export --root PATH --out codebase-wiki
196
+ ```
197
+
198
+ When `--out` is relative, it is resolved below `--root`; the default is
199
+ `.delphi-lsp/wiki`. The command builds the semantic index once, deep-indexes
200
+ discovered projects, calculates workspace and unit metrics, and writes:
201
+
202
+ - an OKF 0.2 root `index.md`;
203
+ - linked project, unit, and symbol concepts;
204
+ - declaration and implementation source fragments;
205
+ - resolved and unresolved semantic references;
206
+ - discovery/project problems and complete metric records;
207
+ - Protocol v3, relation, CPG, cache, and layer-mapping reference concepts.
208
+
209
+ Every non-index concept is UTF-8 Markdown with YAML frontmatter and a non-empty
210
+ `type`. Readable filenames include a stable digest, so overloads and equal names
211
+ from different units remain distinct even on case-insensitive filesystems.
212
+ Output order and content are deterministic. The finished bundle replaces the
213
+ destination only after generation succeeds; an existing non-empty destination
214
+ requires `--force`, and unsafe root/ancestor/symlink targets are rejected.
215
+
216
+ Pages are streamed to disk, decoded source retention is bounded, and metrics
217
+ process source paths without materializing the entire source corpus. Lazy CPG
218
+ subgraphs are documented rather than eagerly multiplied across all possible
219
+ targets; a focused live `cpg` query remains the bounded way to obtain one graph.
220
+ The bundle structure follows the
221
+ [Open Knowledge Format 0.2 specification](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md).
184
222
 
185
223
  ```bash
186
224
  delphi-lsp-agent query --root PATH find TCustomer
187
225
  delphi-lsp-agent query --root PATH focus TARGET_ID
188
226
  delphi-lsp-agent query --root PATH inspect
189
227
  delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
228
+ delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
190
229
  delphi-lsp-agent query --root PATH metrics
191
230
  delphi-lsp-agent query --root PATH metrics UNIT_QUERY
192
231
  delphi-lsp-agent cache status --root PATH --format json
@@ -258,10 +297,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
258
297
  recent ranked queries are retained in a small LRU so alternating CLI and
259
298
  OpenCode searches remain warm.
260
299
 
261
- `cache start` waits up to `--startup-timeout 120` seconds by default for a large
262
- workspace to prewarm. The timeout belongs to the starting client and does not
263
- change daemon compatibility or idle shutdown. Starting a live root with a
264
- different worker configuration reports a configuration conflict.
300
+ `cache start` waits up to `--startup-timeout 120` seconds for the child process
301
+ to bind and publish readiness metadata, not for the large workspace to finish
302
+ prewarming. Workspace discovery and prewarming continue in the daemon while
303
+ status reports `warming`. If bootstrap fails, the CLI reports whether it timed
304
+ out or exited, the exit code, Python executable, workspace, and a sanitized
305
+ tail of child stderr. Starting a live root with a different worker
306
+ configuration reports a configuration conflict.
265
307
 
266
308
  Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
267
309
  If compaction removes navigable data, the daemon rebuilds the navigation state on demand
@@ -284,14 +326,15 @@ outside the root workspace.
284
326
  `metrics`. For example, `delphi-lsp-agent view --layer metrics --format json`
285
327
  returns a project summary and detailed unit metric objects; `--query` filters
286
328
  units by name or path.
287
- `index` materializes overview, projects, and problems JSON. `skill install`
329
+ `index` materializes overview, projects, and problems JSON. `wiki export`
330
+ materializes the same navigational knowledge as a linked OKF Markdown bundle. `skill install`
288
331
  writes the skill; `opencode install` writes the package-named skill, Markdown
289
332
  agent, and plugin. The two deprecated write flags are harmless aliases and do
290
333
  not change user configuration.
291
334
  `worker` serves NDJSON over standard input/output.
292
335
 
293
- Protocol v2 actions are `open`, `find`, `inspect`, `trace`, `focus`,
294
- `problems`, and `metrics`. A `metrics` request without a query returns the
336
+ Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
337
+ `problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
295
338
  project summary followed by unit cards. A query filters units, while a unit
296
339
  `target_id` from `open` selects one unit; `detail: "members"` adds routine,
297
340
  Halstead, dependency, and symbol-count detail without returning source text.
@@ -301,12 +344,15 @@ Detail values are `summary`, `declaration`, `members`,
301
344
  `implements`.
302
345
 
303
346
  A request requires `action` and can include `query`, `target_id`,
304
- `project_id`, `detail`, `relation`, `cursor`, `max_items`, and
305
- `max_chars`. Defaults are empty text fields, `detail: "summary"`, no
306
- relation, `max_items: 12`, and `max_chars: 12000`. Ranges are 1–50 items
307
- and 256–40000 characters. A successful envelope has `schema: 2`,
347
+ `project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
348
+ `max_items`, and `max_chars`. Defaults are empty text fields,
349
+ `detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
350
+ `depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
351
+ response ranges are 1–50 items and 256–40000 characters. A successful envelope
352
+ has `schema: 3`,
308
353
  `workspace_revision`, `focus` (project, unit, and target IDs), `result`,
309
- `page`, and `context`; errors have `schema: 2` and a code/message.
354
+ `page`, and `context`; errors have `schema: 3` and a code/message. Existing
355
+ target IDs remain unchanged across the protocol upgrade.
310
356
 
311
357
  Focus preserves the selected project, unit, or target. Cursors bind a workspace
312
358
  revision and request fingerprint, so source changes and cross-target or
@@ -314,6 +360,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
314
360
  response. A `sound_partial` relation is sound but incomplete: unresolved and
315
361
  ambiguous relations are never fabricated. Unsupported relations are rejected.
316
362
 
363
+ ### Lazy code property graph
364
+
365
+ The `cpg` action translates one selected unit, type, or routine into a bounded
366
+ code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
367
+ `direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
368
+ from the selected target. Together, `graph`, `direction`, and `depth` select
369
+ the returned subgraph. Results contain stable CPG node and edge IDs,
370
+ location and symbol properties, graph metadata, and explicit problems.
371
+
372
+ AST edges preserve syntax containment. CFG edges include routine entry/exit,
373
+ sequence, conditional branches, loop back-edges, and conservative structured
374
+ control flow. Local DFG edges distinguish definitions, uses, and reaching
375
+ definitions. CALL edges are emitted only for a uniquely resolved explicit
376
+ callee. Ambiguous or unsupported semantics increase the unresolved count and
377
+ are reported as `sound_partial`; the navigator does not fabricate certainty.
378
+
379
+ CPG construction is lazy: navigation prewarming creates no graph. The first
380
+ request parses only the selected source, and identical requests reuse an
381
+ in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
382
+ `depth`. The CPG LRU receives 20 percent of the configured retained-cache
383
+ budget, capped at 128 MiB. Source text and full parser trees are not retained
384
+ inside graph records, and normal navigation keeps its existing cache path.
385
+
386
+ The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
387
+ lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
388
+ prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
389
+ the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
390
+ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
391
+ in-run control throughput, above the 95-percent release floor. Reproduce it
392
+ with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
393
+
317
394
  For every source size the navigator builds an outline first, loads source detail
318
395
  lazily for a selected target, and returns only selected fragments. Typed source
319
396
  chunks are at most 6000 characters and also respect the response budget. This
@@ -343,14 +420,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
343
420
  file remains entirely user-owned. The deprecated `--write-config` and
344
421
  `--write-agent` options are accepted harmlessly for compatibility.
345
422
 
346
- The plugin maintains one worker per session/root, reusing focus and indexes.
423
+ The plugin maintains one worker per session/root, reusing focus, indexes, and
424
+ lazy CPG subgraphs.
347
425
  During compaction it restores the focus and summary into the new context.
348
426
  Transport failure, session deletion, and plugin disposal clean up the worker.
349
427
 
350
428
  OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
351
429
  Persistent session/root worker support first shipped in 2.0.0.
352
430
  This is the same persistent session/root worker boundary.
353
- The OpenCode worker stays separate from CLI daemon, and current plugin behavior is unchanged.
431
+ The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
432
+ arguments without changing the persistent session/root boundary.
354
433
 
355
434
  A generated OpenCode agent starts with this Markdown frontmatter:
356
435
 
@@ -386,7 +465,7 @@ permission:
386
465
 
387
466
  Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
388
467
  use `delphi_codebase` actions such as
389
- `open`, `find`, `focus`, and `inspect`. Use semantic tool calls, not raw
468
+ `open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
390
469
  source tools.
391
470
 
392
471
  For architecture questions, call `metrics` without a query to compare unit
@@ -0,0 +1 @@
1
+ __version__ = "3.1.0"