python-delphi-lsp 2.3.2__tar.gz → 3.0.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.
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/MANIFEST.in +1 -0
- {python_delphi_lsp-2.3.2/python_delphi_lsp.egg-info → python_delphi_lsp-3.0.0}/PKG-INFO +60 -18
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/README.md +59 -17
- python_delphi_lsp-3.0.0/delphi_lsp/_version.py +1 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_cache.py +200 -48
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_cli.py +42 -6
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_context.py +205 -1
- python_delphi_lsp-3.0.0/delphi_lsp/agent_cpg.py +350 -0
- python_delphi_lsp-3.0.0/delphi_lsp/agent_cpg_builder.py +667 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_protocol.py +57 -3
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_templates.py +20 -13
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/pyproject.toml +1 -1
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0/python_delphi_lsp.egg-info}/PKG-INFO +60 -18
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/SOURCES.txt +4 -0
- python_delphi_lsp-3.0.0/scripts/benchmark_cpg.py +376 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/benchmark_github_corpus.py +1 -1
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/run_openrouter_github_e2e.py +1 -1
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_cache.py +163 -6
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_codebase.py +9 -4
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_context.py +132 -0
- python_delphi_lsp-3.0.0/tests/test_agent_cpg.py +581 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_protocol.py +22 -5
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_worker.py +93 -22
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_github_performance_corpus.py +34 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_lsp_support.py +1 -1
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_openrouter_github_e2e.py +5 -5
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_package_metadata.py +30 -5
- python_delphi_lsp-2.3.2/delphi_lsp/_version.py +0 -1
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/.github/workflows/ci.yml +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/LICENSE +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/__init__.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_layers.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_metrics.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_relations.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_workspace.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/binary.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/comment_builder.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/consts.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/delphiast_lexer.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/delphiast_parser.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/delphiast_tokens.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/grammar.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/lark_builder.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/lark_tokens.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/lsp_server.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/metrics.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/navigation_cache.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/nodes.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/parallel_outline.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/parser.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/parser_backend.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/preprocessor.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/progress.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/project_discovery.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/project_indexer.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/semantic.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/semantic_builder.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/source_reader.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/workspace.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/writer.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/opencode.json +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/audit_delphi_language_features.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/benchmark_parallel_cache.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/build_github_performance_corpus.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/check_ornith_cache.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/generate_progress_pdf.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/generate_release_evidence.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/prepare_ornith_cache.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/run_opencode_lsp_probe.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/start_ornith_vllm.sh +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/summarize_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/setup.cfg +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/corpora.performance.lock.json +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/library_demo.dpr +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/package_demo.dpk +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/program_demo.dpr +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_advanced.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_attributes.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_basic.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_consumer.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_generics.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_inheritance.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_math.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_properties.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_sections.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_statements.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_types.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_unresolved.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_with.pas +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_cli_errors.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_metrics.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_relations.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_workspace.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_lexer.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_native_compatibility.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_parser.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_diagnostics.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_language_feature_matrix.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_legacy_snippets.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_lsp_features.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_metrics.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_navigation_cache.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_opencode_config.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_opencode_probe.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_ornith_cache_prepare.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_parallel_outline.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_parser.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_parser_backends.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_preprocessor.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_progress.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_project_discovery.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_project_indexer.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_release_evidence.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_semantic.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_vllm_start_script.py +0 -0
- {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.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:
|
|
3
|
+
Version: 3.0.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
|
|
45
|
+
Version 3.0.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
|
|
187
|
+
## Agent CLI and Interface/Protocol v3
|
|
188
188
|
|
|
189
189
|
`delphi-lsp-agent` has these subcommands and options:
|
|
190
190
|
|
|
@@ -202,6 +202,8 @@ delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
|
|
|
202
202
|
delphi-lsp-agent query --root PATH ACTION [VALUE]
|
|
203
203
|
[--project-id ID] [--detail summary|declaration|members|context|body|implementations]
|
|
204
204
|
[--relation references|callers|callees|uses|used_by|inherits|implements]
|
|
205
|
+
[--graph ast|cfg|dfg|call|full] [--direction out|in|both]
|
|
206
|
+
[--depth 1..16]
|
|
205
207
|
[--cursor TEXT] [--max-items INT] [--max-chars INT]
|
|
206
208
|
delphi-lsp-agent skill install [--target PATH] [--force]
|
|
207
209
|
delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
|
|
@@ -220,13 +222,14 @@ delphi-lsp-agent cache stop --root PATH
|
|
|
220
222
|
`cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
|
|
221
223
|
`cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
|
|
222
224
|
`cache stop` outputs stop status JSON and may include warnings on stderr.
|
|
223
|
-
`query` outputs Protocol
|
|
225
|
+
`query` outputs Protocol v3 JSON responses and writes warnings to stderr.
|
|
224
226
|
|
|
225
227
|
```bash
|
|
226
228
|
delphi-lsp-agent query --root PATH find TCustomer
|
|
227
229
|
delphi-lsp-agent query --root PATH focus TARGET_ID
|
|
228
230
|
delphi-lsp-agent query --root PATH inspect
|
|
229
231
|
delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
|
|
232
|
+
delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
|
|
230
233
|
delphi-lsp-agent query --root PATH metrics
|
|
231
234
|
delphi-lsp-agent query --root PATH metrics UNIT_QUERY
|
|
232
235
|
delphi-lsp-agent cache status --root PATH --format json
|
|
@@ -298,10 +301,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
|
|
|
298
301
|
recent ranked queries are retained in a small LRU so alternating CLI and
|
|
299
302
|
OpenCode searches remain warm.
|
|
300
303
|
|
|
301
|
-
`cache start` waits up to `--startup-timeout 120` seconds
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
304
|
+
`cache start` waits up to `--startup-timeout 120` seconds for the child process
|
|
305
|
+
to bind and publish readiness metadata, not for the large workspace to finish
|
|
306
|
+
prewarming. Workspace discovery and prewarming continue in the daemon while
|
|
307
|
+
status reports `warming`. If bootstrap fails, the CLI reports whether it timed
|
|
308
|
+
out or exited, the exit code, Python executable, workspace, and a sanitized
|
|
309
|
+
tail of child stderr. Starting a live root with a different worker
|
|
310
|
+
configuration reports a configuration conflict.
|
|
305
311
|
|
|
306
312
|
Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
|
|
307
313
|
If compaction removes navigable data, the daemon rebuilds the navigation state on demand
|
|
@@ -330,8 +336,8 @@ agent, and plugin. The two deprecated write flags are harmless aliases and do
|
|
|
330
336
|
not change user configuration.
|
|
331
337
|
`worker` serves NDJSON over standard input/output.
|
|
332
338
|
|
|
333
|
-
Protocol
|
|
334
|
-
`problems`, and `
|
|
339
|
+
Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
|
|
340
|
+
`problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
|
|
335
341
|
project summary followed by unit cards. A query filters units, while a unit
|
|
336
342
|
`target_id` from `open` selects one unit; `detail: "members"` adds routine,
|
|
337
343
|
Halstead, dependency, and symbol-count detail without returning source text.
|
|
@@ -341,12 +347,15 @@ Detail values are `summary`, `declaration`, `members`,
|
|
|
341
347
|
`implements`.
|
|
342
348
|
|
|
343
349
|
A request requires `action` and can include `query`, `target_id`,
|
|
344
|
-
`project_id`, `detail`, `relation`, `
|
|
345
|
-
`max_chars`. Defaults are empty text fields,
|
|
346
|
-
relation, `
|
|
347
|
-
|
|
350
|
+
`project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
|
|
351
|
+
`max_items`, and `max_chars`. Defaults are empty text fields,
|
|
352
|
+
`detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
|
|
353
|
+
`depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
|
|
354
|
+
response ranges are 1–50 items and 256–40000 characters. A successful envelope
|
|
355
|
+
has `schema: 3`,
|
|
348
356
|
`workspace_revision`, `focus` (project, unit, and target IDs), `result`,
|
|
349
|
-
`page`, and `context`; errors have `schema:
|
|
357
|
+
`page`, and `context`; errors have `schema: 3` and a code/message. Existing
|
|
358
|
+
target IDs remain unchanged across the protocol upgrade.
|
|
350
359
|
|
|
351
360
|
Focus preserves the selected project, unit, or target. Cursors bind a workspace
|
|
352
361
|
revision and request fingerprint, so source changes and cross-target or
|
|
@@ -354,6 +363,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
|
|
|
354
363
|
response. A `sound_partial` relation is sound but incomplete: unresolved and
|
|
355
364
|
ambiguous relations are never fabricated. Unsupported relations are rejected.
|
|
356
365
|
|
|
366
|
+
### Lazy code property graph
|
|
367
|
+
|
|
368
|
+
The `cpg` action translates one selected unit, type, or routine into a bounded
|
|
369
|
+
code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
|
|
370
|
+
`direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
|
|
371
|
+
from the selected target. Together, `graph`, `direction`, and `depth` select
|
|
372
|
+
the returned subgraph. Results contain stable CPG node and edge IDs,
|
|
373
|
+
location and symbol properties, graph metadata, and explicit problems.
|
|
374
|
+
|
|
375
|
+
AST edges preserve syntax containment. CFG edges include routine entry/exit,
|
|
376
|
+
sequence, conditional branches, loop back-edges, and conservative structured
|
|
377
|
+
control flow. Local DFG edges distinguish definitions, uses, and reaching
|
|
378
|
+
definitions. CALL edges are emitted only for a uniquely resolved explicit
|
|
379
|
+
callee. Ambiguous or unsupported semantics increase the unresolved count and
|
|
380
|
+
are reported as `sound_partial`; the navigator does not fabricate certainty.
|
|
381
|
+
|
|
382
|
+
CPG construction is lazy: navigation prewarming creates no graph. The first
|
|
383
|
+
request parses only the selected source, and identical requests reuse an
|
|
384
|
+
in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
|
|
385
|
+
`depth`. The CPG LRU receives 20 percent of the configured retained-cache
|
|
386
|
+
budget, capped at 128 MiB. Source text and full parser trees are not retained
|
|
387
|
+
inside graph records, and normal navigation keeps its existing cache path.
|
|
388
|
+
|
|
389
|
+
The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
|
|
390
|
+
lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
|
|
391
|
+
prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
|
|
392
|
+
the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
|
|
393
|
+
source was parsed for CPG. Legacy navigation retained 98.43 percent of its
|
|
394
|
+
in-run control throughput, above the 95-percent release floor. Reproduce it
|
|
395
|
+
with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
|
|
396
|
+
|
|
357
397
|
For every source size the navigator builds an outline first, loads source detail
|
|
358
398
|
lazily for a selected target, and returns only selected fragments. Typed source
|
|
359
399
|
chunks are at most 6000 characters and also respect the response budget. This
|
|
@@ -383,14 +423,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
|
|
|
383
423
|
file remains entirely user-owned. The deprecated `--write-config` and
|
|
384
424
|
`--write-agent` options are accepted harmlessly for compatibility.
|
|
385
425
|
|
|
386
|
-
The plugin maintains one worker per session/root, reusing focus and
|
|
426
|
+
The plugin maintains one worker per session/root, reusing focus, indexes, and
|
|
427
|
+
lazy CPG subgraphs.
|
|
387
428
|
During compaction it restores the focus and summary into the new context.
|
|
388
429
|
Transport failure, session deletion, and plugin disposal clean up the worker.
|
|
389
430
|
|
|
390
431
|
OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
|
|
391
432
|
Persistent session/root worker support first shipped in 2.0.0.
|
|
392
433
|
This is the same persistent session/root worker boundary.
|
|
393
|
-
The OpenCode worker stays separate from CLI daemon
|
|
434
|
+
The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
|
|
435
|
+
arguments without changing the persistent session/root boundary.
|
|
394
436
|
|
|
395
437
|
A generated OpenCode agent starts with this Markdown frontmatter:
|
|
396
438
|
|
|
@@ -426,7 +468,7 @@ permission:
|
|
|
426
468
|
|
|
427
469
|
Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
|
|
428
470
|
use `delphi_codebase` actions such as
|
|
429
|
-
`open`, `find`, `focus`, and `
|
|
471
|
+
`open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
|
|
430
472
|
source tools.
|
|
431
473
|
|
|
432
474
|
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
|
|
5
|
+
Version 3.0.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
|
|
147
|
+
## Agent CLI and Interface/Protocol v3
|
|
148
148
|
|
|
149
149
|
`delphi-lsp-agent` has these subcommands and options:
|
|
150
150
|
|
|
@@ -162,6 +162,8 @@ delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
|
|
|
162
162
|
delphi-lsp-agent query --root PATH ACTION [VALUE]
|
|
163
163
|
[--project-id ID] [--detail summary|declaration|members|context|body|implementations]
|
|
164
164
|
[--relation references|callers|callees|uses|used_by|inherits|implements]
|
|
165
|
+
[--graph ast|cfg|dfg|call|full] [--direction out|in|both]
|
|
166
|
+
[--depth 1..16]
|
|
165
167
|
[--cursor TEXT] [--max-items INT] [--max-chars INT]
|
|
166
168
|
delphi-lsp-agent skill install [--target PATH] [--force]
|
|
167
169
|
delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
|
|
@@ -180,13 +182,14 @@ delphi-lsp-agent cache stop --root PATH
|
|
|
180
182
|
`cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
|
|
181
183
|
`cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
|
|
182
184
|
`cache stop` outputs stop status JSON and may include warnings on stderr.
|
|
183
|
-
`query` outputs Protocol
|
|
185
|
+
`query` outputs Protocol v3 JSON responses and writes warnings to stderr.
|
|
184
186
|
|
|
185
187
|
```bash
|
|
186
188
|
delphi-lsp-agent query --root PATH find TCustomer
|
|
187
189
|
delphi-lsp-agent query --root PATH focus TARGET_ID
|
|
188
190
|
delphi-lsp-agent query --root PATH inspect
|
|
189
191
|
delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
|
|
192
|
+
delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
|
|
190
193
|
delphi-lsp-agent query --root PATH metrics
|
|
191
194
|
delphi-lsp-agent query --root PATH metrics UNIT_QUERY
|
|
192
195
|
delphi-lsp-agent cache status --root PATH --format json
|
|
@@ -258,10 +261,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
|
|
|
258
261
|
recent ranked queries are retained in a small LRU so alternating CLI and
|
|
259
262
|
OpenCode searches remain warm.
|
|
260
263
|
|
|
261
|
-
`cache start` waits up to `--startup-timeout 120` seconds
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
264
|
+
`cache start` waits up to `--startup-timeout 120` seconds for the child process
|
|
265
|
+
to bind and publish readiness metadata, not for the large workspace to finish
|
|
266
|
+
prewarming. Workspace discovery and prewarming continue in the daemon while
|
|
267
|
+
status reports `warming`. If bootstrap fails, the CLI reports whether it timed
|
|
268
|
+
out or exited, the exit code, Python executable, workspace, and a sanitized
|
|
269
|
+
tail of child stderr. Starting a live root with a different worker
|
|
270
|
+
configuration reports a configuration conflict.
|
|
265
271
|
|
|
266
272
|
Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
|
|
267
273
|
If compaction removes navigable data, the daemon rebuilds the navigation state on demand
|
|
@@ -290,8 +296,8 @@ agent, and plugin. The two deprecated write flags are harmless aliases and do
|
|
|
290
296
|
not change user configuration.
|
|
291
297
|
`worker` serves NDJSON over standard input/output.
|
|
292
298
|
|
|
293
|
-
Protocol
|
|
294
|
-
`problems`, and `
|
|
299
|
+
Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
|
|
300
|
+
`problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
|
|
295
301
|
project summary followed by unit cards. A query filters units, while a unit
|
|
296
302
|
`target_id` from `open` selects one unit; `detail: "members"` adds routine,
|
|
297
303
|
Halstead, dependency, and symbol-count detail without returning source text.
|
|
@@ -301,12 +307,15 @@ Detail values are `summary`, `declaration`, `members`,
|
|
|
301
307
|
`implements`.
|
|
302
308
|
|
|
303
309
|
A request requires `action` and can include `query`, `target_id`,
|
|
304
|
-
`project_id`, `detail`, `relation`, `
|
|
305
|
-
`max_chars`. Defaults are empty text fields,
|
|
306
|
-
relation, `
|
|
307
|
-
|
|
310
|
+
`project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
|
|
311
|
+
`max_items`, and `max_chars`. Defaults are empty text fields,
|
|
312
|
+
`detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
|
|
313
|
+
`depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
|
|
314
|
+
response ranges are 1–50 items and 256–40000 characters. A successful envelope
|
|
315
|
+
has `schema: 3`,
|
|
308
316
|
`workspace_revision`, `focus` (project, unit, and target IDs), `result`,
|
|
309
|
-
`page`, and `context`; errors have `schema:
|
|
317
|
+
`page`, and `context`; errors have `schema: 3` and a code/message. Existing
|
|
318
|
+
target IDs remain unchanged across the protocol upgrade.
|
|
310
319
|
|
|
311
320
|
Focus preserves the selected project, unit, or target. Cursors bind a workspace
|
|
312
321
|
revision and request fingerprint, so source changes and cross-target or
|
|
@@ -314,6 +323,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
|
|
|
314
323
|
response. A `sound_partial` relation is sound but incomplete: unresolved and
|
|
315
324
|
ambiguous relations are never fabricated. Unsupported relations are rejected.
|
|
316
325
|
|
|
326
|
+
### Lazy code property graph
|
|
327
|
+
|
|
328
|
+
The `cpg` action translates one selected unit, type, or routine into a bounded
|
|
329
|
+
code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
|
|
330
|
+
`direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
|
|
331
|
+
from the selected target. Together, `graph`, `direction`, and `depth` select
|
|
332
|
+
the returned subgraph. Results contain stable CPG node and edge IDs,
|
|
333
|
+
location and symbol properties, graph metadata, and explicit problems.
|
|
334
|
+
|
|
335
|
+
AST edges preserve syntax containment. CFG edges include routine entry/exit,
|
|
336
|
+
sequence, conditional branches, loop back-edges, and conservative structured
|
|
337
|
+
control flow. Local DFG edges distinguish definitions, uses, and reaching
|
|
338
|
+
definitions. CALL edges are emitted only for a uniquely resolved explicit
|
|
339
|
+
callee. Ambiguous or unsupported semantics increase the unresolved count and
|
|
340
|
+
are reported as `sound_partial`; the navigator does not fabricate certainty.
|
|
341
|
+
|
|
342
|
+
CPG construction is lazy: navigation prewarming creates no graph. The first
|
|
343
|
+
request parses only the selected source, and identical requests reuse an
|
|
344
|
+
in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
|
|
345
|
+
`depth`. The CPG LRU receives 20 percent of the configured retained-cache
|
|
346
|
+
budget, capped at 128 MiB. Source text and full parser trees are not retained
|
|
347
|
+
inside graph records, and normal navigation keeps its existing cache path.
|
|
348
|
+
|
|
349
|
+
The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
|
|
350
|
+
lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
|
|
351
|
+
prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
|
|
352
|
+
the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
|
|
353
|
+
source was parsed for CPG. Legacy navigation retained 98.43 percent of its
|
|
354
|
+
in-run control throughput, above the 95-percent release floor. Reproduce it
|
|
355
|
+
with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
|
|
356
|
+
|
|
317
357
|
For every source size the navigator builds an outline first, loads source detail
|
|
318
358
|
lazily for a selected target, and returns only selected fragments. Typed source
|
|
319
359
|
chunks are at most 6000 characters and also respect the response budget. This
|
|
@@ -343,14 +383,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
|
|
|
343
383
|
file remains entirely user-owned. The deprecated `--write-config` and
|
|
344
384
|
`--write-agent` options are accepted harmlessly for compatibility.
|
|
345
385
|
|
|
346
|
-
The plugin maintains one worker per session/root, reusing focus and
|
|
386
|
+
The plugin maintains one worker per session/root, reusing focus, indexes, and
|
|
387
|
+
lazy CPG subgraphs.
|
|
347
388
|
During compaction it restores the focus and summary into the new context.
|
|
348
389
|
Transport failure, session deletion, and plugin disposal clean up the worker.
|
|
349
390
|
|
|
350
391
|
OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
|
|
351
392
|
Persistent session/root worker support first shipped in 2.0.0.
|
|
352
393
|
This is the same persistent session/root worker boundary.
|
|
353
|
-
The OpenCode worker stays separate from CLI daemon
|
|
394
|
+
The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
|
|
395
|
+
arguments without changing the persistent session/root boundary.
|
|
354
396
|
|
|
355
397
|
A generated OpenCode agent starts with this Markdown frontmatter:
|
|
356
398
|
|
|
@@ -386,7 +428,7 @@ permission:
|
|
|
386
428
|
|
|
387
429
|
Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
|
|
388
430
|
use `delphi_codebase` actions such as
|
|
389
|
-
`open`, `find`, `focus`, and `
|
|
431
|
+
`open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
|
|
390
432
|
source tools.
|
|
391
433
|
|
|
392
434
|
For architecture questions, call `metrics` without a query to compare unit
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.0.0"
|