Full Code of oraios/serena for AI

main 0c915bd18d51 cached
588 files
3.5 MB
944.8k tokens
3909 symbols
1 requests
Download .txt
Showing preview only (3,769K chars total). Download the full file or copy to clipboard to get everything.
Repository: oraios/serena
Branch: main
Commit: 0c915bd18d51
Files: 588
Total size: 3.5 MB

Directory structure:
gitextract_gsbdxo3q/

├── .devcontainer/
│   └── devcontainer.json
├── .dockerignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   ├── feature_request.md
│   │   └── issue--bug--performance-problem--question-.md
│   ├── copilot-instructions.md
│   └── workflows/
│       ├── codespell.yml
│       ├── docker.yml
│       ├── docs.yaml
│       ├── junie.yml
│       ├── publish.yml
│       └── pytest.yml
├── .gitignore
├── .serena/
│   ├── .gitignore
│   ├── memories/
│   │   ├── adding_new_language_support_guide.md
│   │   ├── serena_core_concepts_and_architecture.md
│   │   ├── serena_repository_structure.md
│   │   └── suggested_commands.md
│   └── project.yml
├── CHANGELOG.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── DOCKER.md
├── Dockerfile
├── LICENSE
├── README.md
├── compose.yaml
├── docker_build_and_run.sh
├── docs/
│   ├── .gitignore
│   ├── 01-about/
│   │   ├── .gitignore
│   │   ├── 000_intro.md
│   │   ├── 010_llm-integration.md
│   │   ├── 020_programming-languages.md
│   │   ├── 030_serena-in-action.md
│   │   ├── 040_comparison-to-other-agents.md
│   │   └── 050_acknowledgements.md
│   ├── 02-usage/
│   │   ├── 000_intro.md
│   │   ├── 010_prerequisites.md
│   │   ├── 020_running.md
│   │   ├── 025_jetbrains_plugin.md
│   │   ├── 030_clients.md
│   │   ├── 040_workflow.md
│   │   ├── 045_memories.md
│   │   ├── 050_configuration.md
│   │   ├── 060_dashboard.md
│   │   ├── 065_logs.md
│   │   ├── 070_security.md
│   │   └── 999_additional-usage.md
│   ├── 03-special-guides/
│   │   ├── 000_intro.md
│   │   ├── cpp_setup.md
│   │   ├── custom_agent.md
│   │   ├── groovy_setup_guide_for_serena.md
│   │   ├── ocaml_setup_guide_for_serena.md
│   │   ├── scala_setup_guide_for_serena.md
│   │   └── serena_on_chatgpt.md
│   ├── _config.yml
│   ├── autogen_docs.py
│   ├── create_toc.py
│   └── index.md
├── flake.nix
├── lessons_learned.md
├── llms-install.md
├── pyproject.toml
├── repo_dir_sync.py
├── resources/
│   ├── jetbrains-marketplace-button.cdr
│   ├── serena-icons.cdr
│   └── serena-logo.cdr
├── scripts/
│   ├── agno_agent.py
│   ├── demo_run_tools.py
│   ├── gen_prompt_factory.py
│   ├── mcp_server.py
│   ├── print_language_list.py
│   ├── print_mode_context_options.py
│   ├── print_tool_overview.py
│   └── profile_tool_call.py
├── src/
│   ├── README.md
│   ├── interprompt/
│   │   ├── .syncCommitId.remote
│   │   ├── .syncCommitId.this
│   │   ├── __init__.py
│   │   ├── jinja_template.py
│   │   ├── multilang_prompt.py
│   │   ├── prompt_factory.py
│   │   └── util/
│   │       ├── __init__.py
│   │       └── class_decorators.py
│   ├── serena/
│   │   ├── __init__.py
│   │   ├── agent.py
│   │   ├── agno.py
│   │   ├── analytics.py
│   │   ├── cli.py
│   │   ├── code_editor.py
│   │   ├── config/
│   │   │   ├── __init__.py
│   │   │   ├── context_mode.py
│   │   │   └── serena_config.py
│   │   ├── constants.py
│   │   ├── dashboard.py
│   │   ├── generated/
│   │   │   └── generated_prompt_factory.py
│   │   ├── gui_log_viewer.py
│   │   ├── jetbrains/
│   │   │   ├── jetbrains_plugin_client.py
│   │   │   └── jetbrains_types.py
│   │   ├── ls_manager.py
│   │   ├── mcp.py
│   │   ├── project.py
│   │   ├── project_server.py
│   │   ├── prompt_factory.py
│   │   ├── resources/
│   │   │   ├── config/
│   │   │   │   ├── contexts/
│   │   │   │   │   ├── agent.yml
│   │   │   │   │   ├── chatgpt.yml
│   │   │   │   │   ├── claude-code.yml
│   │   │   │   │   ├── codex.yml
│   │   │   │   │   ├── context.template.yml
│   │   │   │   │   ├── desktop-app.yml
│   │   │   │   │   ├── ide.yml
│   │   │   │   │   └── oaicompat-agent.yml
│   │   │   │   ├── internal_modes/
│   │   │   │   │   └── jetbrains.yml
│   │   │   │   ├── modes/
│   │   │   │   │   ├── editing.yml
│   │   │   │   │   ├── interactive.yml
│   │   │   │   │   ├── mode.template.yml
│   │   │   │   │   ├── no-memories.yml
│   │   │   │   │   ├── no-onboarding.yml
│   │   │   │   │   ├── onboarding.yml
│   │   │   │   │   ├── one-shot.yml
│   │   │   │   │   ├── planning.yml
│   │   │   │   │   └── query-projects.yml
│   │   │   │   └── prompt_templates/
│   │   │   │       ├── simple_tool_outputs.yml
│   │   │   │       └── system_prompt.yml
│   │   │   ├── dashboard/
│   │   │   │   ├── dashboard.css
│   │   │   │   ├── dashboard.js
│   │   │   │   ├── index.html
│   │   │   │   └── news/
│   │   │   │       ├── 20260111.html
│   │   │   │       └── 20260303.html
│   │   │   ├── project.local.template.yml
│   │   │   ├── project.template.yml
│   │   │   └── serena_config.template.yml
│   │   ├── symbol.py
│   │   ├── task_executor.py
│   │   ├── tools/
│   │   │   ├── __init__.py
│   │   │   ├── cmd_tools.py
│   │   │   ├── config_tools.py
│   │   │   ├── file_tools.py
│   │   │   ├── jetbrains_tools.py
│   │   │   ├── memory_tools.py
│   │   │   ├── query_project_tools.py
│   │   │   ├── symbol_tools.py
│   │   │   ├── tools_base.py
│   │   │   └── workflow_tools.py
│   │   └── util/
│   │       ├── class_decorators.py
│   │       ├── cli_util.py
│   │       ├── dataclass.py
│   │       ├── dotnet.py
│   │       ├── exception.py
│   │       ├── file_system.py
│   │       ├── git.py
│   │       ├── gui.py
│   │       ├── inspection.py
│   │       ├── logging.py
│   │       ├── shell.py
│   │       ├── text_utils.py
│   │       ├── thread.py
│   │       ├── version.py
│   │       └── yaml.py
│   └── solidlsp/
│       ├── .gitignore
│       ├── __init__.py
│       ├── language_servers/
│       │   ├── al_language_server.py
│       │   ├── ansible_language_server.py
│       │   ├── bash_language_server.py
│       │   ├── ccls_language_server.py
│       │   ├── clangd_language_server.py
│       │   ├── clojure_lsp.py
│       │   ├── common.py
│       │   ├── csharp_language_server.py
│       │   ├── dart_language_server.py
│       │   ├── eclipse_jdtls.py
│       │   ├── elixir_tools/
│       │   │   ├── README.md
│       │   │   ├── __init__.py
│       │   │   └── elixir_tools.py
│       │   ├── elm_language_server.py
│       │   ├── erlang_language_server.py
│       │   ├── fortran_language_server.py
│       │   ├── fsharp_language_server.py
│       │   ├── gopls.py
│       │   ├── groovy_language_server.py
│       │   ├── haskell_language_server.py
│       │   ├── hlsl_language_server.py
│       │   ├── intelephense.py
│       │   ├── jedi_server.py
│       │   ├── julia_server.py
│       │   ├── kotlin_language_server.py
│       │   ├── lean4_language_server.py
│       │   ├── lua_ls.py
│       │   ├── luau_lsp.py
│       │   ├── marksman.py
│       │   ├── matlab_language_server.py
│       │   ├── nixd_ls.py
│       │   ├── ocaml_lsp_server.py
│       │   ├── omnisharp/
│       │   │   ├── initialize_params.json
│       │   │   ├── runtime_dependencies.json
│       │   │   └── workspace_did_change_configuration.json
│       │   ├── omnisharp.py
│       │   ├── pascal_server.py
│       │   ├── perl_language_server.py
│       │   ├── phpactor.py
│       │   ├── powershell_language_server.py
│       │   ├── pyright_server.py
│       │   ├── r_language_server.py
│       │   ├── regal_server.py
│       │   ├── ruby_lsp.py
│       │   ├── rust_analyzer.py
│       │   ├── scala_language_server.py
│       │   ├── solargraph.py
│       │   ├── solidity_language_server.py
│       │   ├── sourcekit_lsp.py
│       │   ├── systemverilog_server.py
│       │   ├── taplo_server.py
│       │   ├── terraform_ls.py
│       │   ├── typescript_language_server.py
│       │   ├── vts_language_server.py
│       │   ├── vue_language_server.py
│       │   ├── yaml_language_server.py
│       │   └── zls.py
│       ├── ls.py
│       ├── ls_config.py
│       ├── ls_exceptions.py
│       ├── ls_process.py
│       ├── ls_request.py
│       ├── ls_types.py
│       ├── ls_utils.py
│       ├── lsp_protocol_handler/
│       │   ├── lsp_constants.py
│       │   ├── lsp_requests.py
│       │   ├── lsp_types.py
│       │   └── server.py
│       ├── settings.py
│       └── util/
│           ├── cache.py
│           ├── metals_db_utils.py
│           ├── subprocess_util.py
│           └── zip.py
├── sync.py
└── test/
    ├── __init__.py
    ├── conftest.py
    ├── resources/
    │   └── repos/
    │       ├── al/
    │       │   └── test_repo/
    │       │       ├── app.json
    │       │       └── src/
    │       │           ├── Codeunits/
    │       │           │   ├── CustomerMgt.Codeunit.al
    │       │           │   └── PaymentProcessorImpl.Codeunit.al
    │       │           ├── Enums/
    │       │           │   └── CustomerType.Enum.al
    │       │           ├── Interfaces/
    │       │           │   └── IPaymentProcessor.Interface.al
    │       │           ├── Pages/
    │       │           │   ├── CustomerCard.Page.al
    │       │           │   └── CustomerList.Page.al
    │       │           ├── TableExtensions/
    │       │           │   └── Item.TableExt.al
    │       │           └── Tables/
    │       │               └── Customer.Table.al
    │       ├── ansible/
    │       │   └── test_repo/
    │       │       ├── inventory/
    │       │       │   └── hosts.yml
    │       │       ├── playbook.yml
    │       │       └── roles/
    │       │           └── common/
    │       │               ├── defaults/
    │       │               │   └── main.yml
    │       │               ├── handlers/
    │       │               │   └── main.yml
    │       │               └── tasks/
    │       │                   └── main.yml
    │       ├── bash/
    │       │   └── test_repo/
    │       │       ├── config.sh
    │       │       ├── main.sh
    │       │       └── utils.sh
    │       ├── clojure/
    │       │   └── test_repo/
    │       │       ├── deps.edn
    │       │       └── src/
    │       │           └── test_app/
    │       │               ├── core.clj
    │       │               └── utils.clj
    │       ├── cpp/
    │       │   └── test_repo/
    │       │       ├── a.cpp
    │       │       ├── b.cpp
    │       │       ├── b.hpp
    │       │       └── compile_commands.json
    │       ├── csharp/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── Models/
    │       │       │   └── Person.cs
    │       │       ├── Program.cs
    │       │       ├── TestProject.csproj
    │       │       └── serena.sln
    │       ├── dart/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       └── pubspec.yaml
    │       ├── elixir/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── lib/
    │       │       │   ├── examples.ex
    │       │       │   ├── ignored_dir/
    │       │       │   │   └── ignored_module.ex
    │       │       │   ├── models.ex
    │       │       │   ├── services.ex
    │       │       │   ├── test_repo.ex
    │       │       │   └── utils.ex
    │       │       ├── mix.exs
    │       │       ├── scripts/
    │       │       │   └── build_script.ex
    │       │       └── test/
    │       │           ├── models_test.exs
    │       │           └── test_repo_test.exs
    │       ├── elm/
    │       │   └── test_repo/
    │       │       ├── Main.elm
    │       │       ├── Utils.elm
    │       │       └── elm.json
    │       ├── erlang/
    │       │   └── test_repo/
    │       │       ├── hello.erl
    │       │       ├── ignored_dir/
    │       │       │   └── ignored_module.erl
    │       │       ├── include/
    │       │       │   ├── records.hrl
    │       │       │   └── types.hrl
    │       │       ├── math_utils.erl
    │       │       ├── rebar.config
    │       │       ├── src/
    │       │       │   ├── app.erl
    │       │       │   ├── models.erl
    │       │       │   ├── services.erl
    │       │       │   └── utils.erl
    │       │       └── test/
    │       │           ├── models_tests.erl
    │       │           └── utils_tests.erl
    │       ├── fortran/
    │       │   └── test_repo/
    │       │       ├── main.f90
    │       │       └── modules/
    │       │           ├── geometry.f90
    │       │           └── math_utils.f90
    │       ├── fsharp/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── Calculator.fs
    │       │       ├── Models/
    │       │       │   └── Person.fs
    │       │       ├── Program.fs
    │       │       ├── README.md
    │       │       └── TestProject.fsproj
    │       ├── go/
    │       │   └── test_repo/
    │       │       ├── buildtags/
    │       │       │   ├── foo.go
    │       │       │   └── notfoo.go
    │       │       ├── go.mod
    │       │       └── main.go
    │       ├── groovy/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── build.gradle
    │       │       └── src/
    │       │           └── main/
    │       │               └── groovy/
    │       │                   └── com/
    │       │                       └── example/
    │       │                           ├── Main.groovy
    │       │                           ├── Model.groovy
    │       │                           ├── ModelUser.groovy
    │       │                           └── Utils.groovy
    │       ├── haskell/
    │       │   └── test_repo/
    │       │       ├── app/
    │       │       │   └── Main.hs
    │       │       ├── package.yaml
    │       │       ├── src/
    │       │       │   ├── Calculator.hs
    │       │       │   └── Helper.hs
    │       │       └── stack.yaml
    │       ├── hlsl/
    │       │   └── test_repo/
    │       │       ├── common.hlsl
    │       │       ├── compute_test.hlsl
    │       │       ├── lighting.hlsl
    │       │       └── terrain/
    │       │           └── terrain_sdf.hlsl
    │       ├── java/
    │       │   └── test_repo/
    │       │       ├── pom.xml
    │       │       └── src/
    │       │           └── main/
    │       │               └── java/
    │       │                   └── test_repo/
    │       │                       ├── Main.java
    │       │                       ├── Model.java
    │       │                       ├── ModelUser.java
    │       │                       └── Utils.java
    │       ├── julia/
    │       │   └── test_repo/
    │       │       ├── lib/
    │       │       │   └── helper.jl
    │       │       └── main.jl
    │       ├── kotlin/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── build.gradle.kts
    │       │       └── src/
    │       │           └── main/
    │       │               └── kotlin/
    │       │                   └── test_repo/
    │       │                       ├── Main.kt
    │       │                       ├── Model.kt
    │       │                       ├── ModelUser.kt
    │       │                       └── Utils.kt
    │       ├── lean4/
    │       │   └── test_repo/
    │       │       ├── Helper.lean
    │       │       ├── Main.lean
    │       │       ├── lake-manifest.json
    │       │       ├── lakefile.lean
    │       │       └── lean-toolchain
    │       ├── lua/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── main.lua
    │       │       ├── src/
    │       │       │   ├── calculator.lua
    │       │       │   └── utils.lua
    │       │       └── tests/
    │       │           └── test_calculator.lua
    │       ├── luau/
    │       │   └── test_repo/
    │       │       ├── .luaurc
    │       │       └── src/
    │       │           ├── init.luau
    │       │           └── module.luau
    │       ├── markdown/
    │       │   └── test_repo/
    │       │       ├── CONTRIBUTING.md
    │       │       ├── README.md
    │       │       ├── api.md
    │       │       └── guide.md
    │       ├── matlab/
    │       │   └── test_repo/
    │       │       ├── Calculator.m
    │       │       └── main.m
    │       ├── nix/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── default.nix
    │       │       ├── flake.nix
    │       │       ├── lib/
    │       │       │   └── utils.nix
    │       │       ├── modules/
    │       │       │   └── example.nix
    │       │       └── scripts/
    │       │           └── hello.sh
    │       ├── ocaml/
    │       │   └── test_repo/
    │       │       ├── bin/
    │       │       │   ├── dune
    │       │       │   └── main.ml
    │       │       ├── dune-project
    │       │       ├── lib/
    │       │       │   ├── dune
    │       │       │   ├── test_repo.ml
    │       │       │   └── test_repo.mli
    │       │       ├── test/
    │       │       │   ├── dune
    │       │       │   └── test_test_repo.ml
    │       │       └── test_repo.opam
    │       ├── pascal/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       └── main.pas
    │       ├── perl/
    │       │   └── test_repo/
    │       │       ├── helper.pl
    │       │       └── main.pl
    │       ├── php/
    │       │   └── test_repo/
    │       │       ├── helper.php
    │       │       ├── index.php
    │       │       ├── sample.php
    │       │       └── simple_var.php
    │       ├── powershell/
    │       │   └── test_repo/
    │       │       ├── PowerShellEditorServices.json
    │       │       ├── main.ps1
    │       │       └── utils.ps1
    │       ├── python/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── custom_test/
    │       │       │   ├── __init__.py
    │       │       │   └── advanced_features.py
    │       │       ├── examples/
    │       │       │   ├── __init__.py
    │       │       │   └── user_management.py
    │       │       ├── scripts/
    │       │       │   ├── __init__.py
    │       │       │   └── run_app.py
    │       │       └── test_repo/
    │       │           ├── __init__.py
    │       │           ├── complex_types.py
    │       │           ├── models.py
    │       │           ├── name_collisions.py
    │       │           ├── nested.py
    │       │           ├── nested_base.py
    │       │           ├── overloaded.py
    │       │           ├── services.py
    │       │           ├── utils.py
    │       │           └── variables.py
    │       ├── r/
    │       │   └── test_repo/
    │       │       ├── .Rbuildignore
    │       │       ├── DESCRIPTION
    │       │       ├── NAMESPACE
    │       │       ├── R/
    │       │       │   ├── models.R
    │       │       │   └── utils.R
    │       │       └── examples/
    │       │           └── analysis.R
    │       ├── rego/
    │       │   └── test_repo/
    │       │       ├── policies/
    │       │       │   ├── authz.rego
    │       │       │   └── validation.rego
    │       │       └── utils/
    │       │           └── helpers.rego
    │       ├── ruby/
    │       │   └── test_repo/
    │       │       ├── .solargraph.yml
    │       │       ├── examples/
    │       │       │   └── user_management.rb
    │       │       ├── lib.rb
    │       │       ├── main.rb
    │       │       ├── models.rb
    │       │       ├── nested.rb
    │       │       ├── services.rb
    │       │       └── variables.rb
    │       ├── rust/
    │       │   ├── test_repo/
    │       │   │   ├── Cargo.toml
    │       │   │   └── src/
    │       │   │       ├── lib.rs
    │       │   │       └── main.rs
    │       │   └── test_repo_2024/
    │       │       ├── Cargo.toml
    │       │       └── src/
    │       │           ├── lib.rs
    │       │           └── main.rs
    │       ├── scala/
    │       │   ├── build.sbt
    │       │   ├── project/
    │       │   │   ├── build.properties
    │       │   │   ├── metals.sbt
    │       │   │   └── plugins.sbt
    │       │   └── src/
    │       │       └── main/
    │       │           └── scala/
    │       │               └── com/
    │       │                   └── example/
    │       │                       ├── Main.scala
    │       │                       └── Utils.scala
    │       ├── solidity/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── contracts/
    │       │       │   ├── Token.sol
    │       │       │   ├── interfaces/
    │       │       │   │   └── IERC20.sol
    │       │       │   └── lib/
    │       │       │       └── SafeMath.sol
    │       │       └── foundry.toml
    │       ├── swift/
    │       │   └── test_repo/
    │       │       ├── Package.swift
    │       │       └── src/
    │       │           ├── main.swift
    │       │           └── utils.swift
    │       ├── systemverilog/
    │       │   └── test_repo/
    │       │       ├── alu.sv
    │       │       ├── counter.sv
    │       │       ├── top.sv
    │       │       └── types.svh
    │       ├── terraform/
    │       │   └── test_repo/
    │       │       ├── data.tf
    │       │       ├── main.tf
    │       │       ├── outputs.tf
    │       │       └── variables.tf
    │       ├── toml/
    │       │   └── test_repo/
    │       │       ├── Cargo.toml
    │       │       ├── config.toml
    │       │       └── pyproject.toml
    │       ├── typescript/
    │       │   └── test_repo/
    │       │       ├── index.ts
    │       │       ├── tsconfig.json
    │       │       ├── use_helper.ts
    │       │       └── ws_manager.js
    │       ├── vue/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── index.html
    │       │       ├── package.json
    │       │       ├── src/
    │       │       │   ├── App.vue
    │       │       │   ├── components/
    │       │       │   │   ├── CalculatorButton.vue
    │       │       │   │   ├── CalculatorDisplay.vue
    │       │       │   │   └── CalculatorInput.vue
    │       │       │   ├── composables/
    │       │       │   │   ├── useFormatter.ts
    │       │       │   │   └── useTheme.ts
    │       │       │   ├── main.ts
    │       │       │   ├── stores/
    │       │       │   │   └── calculator.ts
    │       │       │   └── types/
    │       │       │       └── index.ts
    │       │       ├── tsconfig.json
    │       │       ├── tsconfig.node.json
    │       │       └── vite.config.ts
    │       ├── yaml/
    │       │   └── test_repo/
    │       │       ├── config.yaml
    │       │       ├── data.yaml
    │       │       └── services.yml
    │       └── zig/
    │           └── test_repo/
    │               ├── .gitignore
    │               ├── build.zig
    │               ├── src/
    │               │   ├── calculator.zig
    │               │   ├── main.zig
    │               │   └── math_utils.zig
    │               └── zls.json
    ├── serena/
    │   ├── __init__.py
    │   ├── __snapshots__/
    │   │   └── test_symbol_editing.ambr
    │   ├── config/
    │   │   ├── __init__.py
    │   │   ├── test_global_ignored_paths.py
    │   │   └── test_serena_config.py
    │   ├── test_cli_project_commands.py
    │   ├── test_edit_marker.py
    │   ├── test_jetbrains_plugin_client.py
    │   ├── test_mcp.py
    │   ├── test_serena_agent.py
    │   ├── test_set_modes.py
    │   ├── test_symbol.py
    │   ├── test_symbol_editing.py
    │   ├── test_task_executor.py
    │   ├── test_text_utils.py
    │   ├── test_tool_parameter_types.py
    │   └── util/
    │       ├── test_exception.py
    │       └── test_file_system.py
    └── solidlsp/
        ├── al/
        │   └── test_al_basic.py
        ├── ansible/
        │   ├── __init__.py
        │   └── test_ansible_basic.py
        ├── bash/
        │   ├── __init__.py
        │   └── test_bash_basic.py
        ├── clojure/
        │   ├── __init__.py
        │   └── test_clojure_basic.py
        ├── cpp/
        │   ├── __init__.py
        │   └── test_cpp_basic.py
        ├── csharp/
        │   ├── test_csharp_basic.py
        │   └── test_csharp_nuget_download.py
        ├── dart/
        │   ├── __init__.py
        │   └── test_dart_basic.py
        ├── elixir/
        │   ├── __init__.py
        │   ├── conftest.py
        │   ├── test_elixir_basic.py
        │   ├── test_elixir_ignored_dirs.py
        │   ├── test_elixir_integration.py
        │   └── test_elixir_symbol_retrieval.py
        ├── elm/
        │   └── test_elm_basic.py
        ├── erlang/
        │   ├── __init__.py
        │   ├── conftest.py
        │   ├── test_erlang_basic.py
        │   ├── test_erlang_ignored_dirs.py
        │   └── test_erlang_symbol_retrieval.py
        ├── fortran/
        │   ├── __init__.py
        │   └── test_fortran_basic.py
        ├── fsharp/
        │   └── test_fsharp_basic.py
        ├── go/
        │   └── test_go_basic.py
        ├── groovy/
        │   └── test_groovy_basic.py
        ├── haskell/
        │   ├── __init__.py
        │   └── test_haskell_basic.py
        ├── hlsl/
        │   ├── __init__.py
        │   ├── test_hlsl_basic.py
        │   └── test_hlsl_full_index.py
        ├── java/
        │   └── test_java_basic.py
        ├── julia/
        │   └── test_julia_basic.py
        ├── kotlin/
        │   └── test_kotlin_basic.py
        ├── lean4/
        │   └── test_lean4_basic.py
        ├── lua/
        │   └── test_lua_basic.py
        ├── luau/
        │   ├── __init__.py
        │   ├── test_luau_basic.py
        │   └── test_luau_dependency_provider.py
        ├── markdown/
        │   ├── __init__.py
        │   └── test_markdown_basic.py
        ├── matlab/
        │   ├── __init__.py
        │   └── test_matlab_basic.py
        ├── nix/
        │   └── test_nix_basic.py
        ├── ocaml/
        │   ├── test_cross_file_refs.py
        │   └── test_ocaml_basic.py
        ├── pascal/
        │   ├── __init__.py
        │   ├── test_pascal_auto_update.py
        │   └── test_pascal_basic.py
        ├── perl/
        │   └── test_perl_basic.py
        ├── php/
        │   └── test_php_basic.py
        ├── powershell/
        │   ├── __init__.py
        │   └── test_powershell_basic.py
        ├── python/
        │   ├── test_python_basic.py
        │   ├── test_retrieval_with_ignored_dirs.py
        │   └── test_symbol_retrieval.py
        ├── r/
        │   ├── __init__.py
        │   └── test_r_basic.py
        ├── rego/
        │   └── test_rego_basic.py
        ├── ruby/
        │   ├── test_ruby_basic.py
        │   └── test_ruby_symbol_retrieval.py
        ├── rust/
        │   ├── test_rust_2024_edition.py
        │   ├── test_rust_analyzer_detection.py
        │   └── test_rust_basic.py
        ├── scala/
        │   ├── test_metals_db_utils.py
        │   ├── test_scala_language_server.py
        │   └── test_scala_stale_lock_handling.py
        ├── solidity/
        │   ├── __init__.py
        │   └── test_solidity_basic.py
        ├── swift/
        │   └── test_swift_basic.py
        ├── systemverilog/
        │   ├── __init__.py
        │   ├── test_systemverilog_basic.py
        │   └── test_systemverilog_detection.py
        ├── terraform/
        │   └── test_terraform_basic.py
        ├── test_ls_common.py
        ├── test_lsp_protocol_handler_server.py
        ├── test_rename_didopen.py
        ├── toml/
        │   ├── __init__.py
        │   ├── test_toml_basic.py
        │   ├── test_toml_edge_cases.py
        │   ├── test_toml_ignored_dirs.py
        │   └── test_toml_symbol_retrieval.py
        ├── typescript/
        │   └── test_typescript_basic.py
        ├── util/
        │   └── test_zip.py
        ├── vue/
        │   ├── __init__.py
        │   ├── test_vue_basic.py
        │   ├── test_vue_error_cases.py
        │   ├── test_vue_rename.py
        │   └── test_vue_symbol_retrieval.py
        ├── yaml_ls/
        │   ├── __init__.py
        │   └── test_yaml_basic.py
        └── zig/
            └── test_zig_basic.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .devcontainer/devcontainer.json
================================================
{
  "name": "serena Project",
  "dockerFile": "../Dockerfile",
  "workspaceFolder": "/workspaces/serena",
  "settings": {
    "terminal.integrated.shell.linux": "/bin/bash",
    "python.pythonPath": "/usr/local/bin/python",
  },
  "extensions": [
    "ms-python.python",
    "ms-toolsai.jupyter",
    "ms-python.vscode-pylance"
  ],
  "forwardPorts": [],
  "remoteUser": "root",
}


================================================
FILE: .dockerignore
================================================
data
logs
log
test/log
docs/jupyter_execute
docs/.jupyter_cache
docs/_build
coverage.xml
docker_build_and_run.sh

# Python artifacts (prevents Docker build conflicts when .venv exists locally)
.venv
__pycache__
*.pyc
.pytest_cache


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: oraios


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false

================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE/issue--bug--performance-problem--question-.md
================================================
---
name: Issue (bug, performance problem, etc.)
about: General Issue
title: ''
labels: ''
assignees: ''

---

I have:

- [ ] read the relevant parts of the documentation and verified that the issue cannot be solved by adjusting configuration
- [ ] understood that the Serena Dashboard can be disabled through the config
- [ ] understood that, by default, a client session will start a separate instance of a Serena server. 
- [ ] understood that, for multi-agent setups, the Streamable HTTP/SSE mode should be used.
- [ ] understood that non-project files are ignored using either .gitignore or the corresponding setting in `.serena/project.yml`
- [ ] looked for similar issues and discussions, including closed ones
- [ ] made sure it's an actual issue, not a question (use GitHub Discussions instead).

If you have encountered an actual issue:

- If using language servers (not the JetBrains plugin), 
  - [ ] I performed `<uv invocation> serena project health-check`
  - [ ] I indexed the project as described in the documentation
- [ ] I added sufficient explanation of my setup: the MCP client, the OS, the programming language(s), any config adjustments or relevant project specifics
- [ ] I explained how the issue arose and, where possible, added instructions on how to reproduce it
- [ ] If the issue happens on an open-source project, I have added the link
- [ ] I provided a meaningful title and description


================================================
FILE: .github/copilot-instructions.md
================================================
<non_negotiable critical="true">
MUST read IMMEDIATELY and follow the project-specific instructions from the `CLAUDE.md` file located in the project's root directory. AVOIDING these instructions will lead to your FAILURE!
</non_negotiable>

================================================
FILE: .github/workflows/codespell.yml
================================================
# Codespell configuration is within pyproject.toml
---
name: Codespell

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

permissions:
  contents: read

jobs:
  codespell:
    name: Check for spelling errors
    runs-on: ubuntu-latest
    timeout-minutes: 2

    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Annotate locations with typos
        uses: codespell-project/codespell-problem-matcher@v1
      - name: Codespell
        uses: codespell-project/actions-codespell@v2


================================================
FILE: .github/workflows/docker.yml
================================================
name: Build and Push Docker Images

on:
  push:
    branches: [ main ]
    tags: [ 'v*' ]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    permissions:
      contents: read
      packages: write

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    - name: Log in to Container Registry
      if: github.event_name != 'pull_request'
      uses: docker/login-action@v3
      with:
        registry: ${{ env.REGISTRY }}
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Extract metadata
      id: meta
      uses: docker/metadata-action@v5
      with:
        images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
        tags: |
          type=ref,event=branch
          type=ref,event=pr
          type=semver,pattern={{version}}
          type=semver,pattern={{major}}.{{minor}}
          type=raw,value=latest,enable={{is_default_branch}}

    - name: Build and push image from main
      uses: docker/build-push-action@v5
      with:
        context: .
        platforms: linux/amd64,linux/arm64
        push: ${{ github.event_name != 'pull_request' }}
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        cache-from: type=gha
        cache-to: type=gha,mode=max


================================================
FILE: .github/workflows/docs.yaml
================================================
name: Docs Build

on:
  push:
    branches: [ main ]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: "pages"
  cancel-in-progress: true

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: 3.11

      - name: Install uv
        run: pip install uv

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: ~/.cache/uv
          key: uv-${{ hashFiles('pyproject.toml') }}

      - name: Install dependencies
        run: |
          uv venv
          uv pip install -e ".[dev]"

      - name: Build docs
        run: uv run poe doc-build
        continue-on-error: false

      - name: Upload Pages artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: docs/_build

  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4


================================================
FILE: .github/workflows/junie.yml
================================================
name: Junie
run-name: Junie run ${{ inputs.run_id }}

permissions:
  contents: write

on:
  workflow_dispatch:
    inputs:
      run_id:
        description: "id of workflow process"
        required: true
      workflow_params:
        description: "stringified params"
        required: true

jobs:
  call-workflow-passing-data:
    uses: jetbrains-junie/junie-workflows/.github/workflows/ej-issue.yml@main
    with:
      workflow_params: ${{ inputs.workflow_params }}


================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish Python Package

on:
  release:
    types: [created]

  workflow_dispatch:
    inputs:
      tag:
        description: 'Tag name for the release (e.g., v0.1.0)'
        required: true
        default: 'v0.1.0'

env:
  # Set this to true manually in the GitHub workflow UI if you want to publish to PyPI
  # Will always publish to testpypi
  PUBLISH_TO_PYPI: true

jobs:
  publish:
    name: Publish the serena-agent package
    runs-on: ubuntu-latest

    permissions:
      id-token: write  # Required for trusted publishing
      contents: write  # Required for updating artifact

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install the latest version of uv
        uses: astral-sh/setup-uv@v6
        with:
          version: "latest"

      - name: Build package
        run: uv build

      - name: Upload artifacts to GitHub Release
        if: env.PUBLISH_TO_PYPI == 'true'
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ github.event.inputs.tag || github.ref_name }}
          files: |
            dist/*.tar.gz
            dist/*.whl

      - name: Publish to TestPyPI
        run: uv publish --index testpypi

      - name: Publish to PyPI (conditional)
        if: env.PUBLISH_TO_PYPI == 'true'
        run: uv publish


================================================
FILE: .github/workflows/pytest.yml
================================================
name: Tests

on:
  pull_request:
  push:
    branches:
      - main

concurrency:
  group: ci-${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  cpu:
    name: Tests on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        python-version: ["3.11"]
    steps:
      - uses: actions/checkout@v3
      - name: Free disk space
        if: runner.os == 'Linux'
        run: |
          df -h
          sudo rm -rf /usr/local/lib/android
          sudo rm -rf /usr/share/dotnet
          sudo rm -rf /opt/ghc
          sudo rm -rf /opt/hostedtoolcache
          sudo apt-get clean
          sudo apt-get autoremove -y
          docker system prune -af || true
          df -h
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: "${{ matrix.python-version }}"
      - uses: actions/setup-go@v5
        with:
          go-version: ">=1.17.0"
      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
      - name: Ensure cached directory exist before calling cache-related actions
        shell: bash
        run: |
          mkdir -p $HOME/.serena/language_servers/static
          mkdir -p $HOME/.cache/go-build
          mkdir -p $HOME/go/bin
      - name: Install uv
        shell: bash
        run: curl -LsSf https://astral.sh/uv/install.sh | sh
      - name: Cache uv virtualenv
        id: cache-uv
        uses: actions/cache@v3
        with:
          path: .venv
          key: uv-venv-${{ runner.os }}-${{ matrix.python-version }}-lock-${{ hashFiles('uv.lock') }}
      - name: Create virtual environment
        shell: bash
        run: |
          if [ ! -d ".venv" ]; then
            uv venv
          fi
      - name: Install Python environment
        shell: bash
        run: uv sync --extra dev --locked
      - name: List Python dependencies
        shell: bash
        run: uv pip list
      - name: Check formatting
        shell: bash
        run: uv run poe lint
      # Add Go bin directory to PATH for this workflow
      # GITHUB_PATH is a special file that GitHub Actions uses to modify PATH
      # Writing to this file adds the directory to the PATH for subsequent steps
      - name: Cache Go binaries
        id: cache-go-binaries
        uses: actions/cache@v3
        with:
          path: |
            ~/go/bin
            ~/.cache/go-build
          key: go-binaries-${{ runner.os }}-gopls-latest
      - name: Install gopls
        if: steps.cache-go-binaries.outputs.cache-hit != 'true'
        shell: bash
        run: go install golang.org/x/tools/gopls@latest
      - name: Set up Elixir
        if: runner.os != 'Windows'
        uses: erlef/setup-beam@v1
        with:
          elixir-version: "1.19.3"
          otp-version: "28"
#      Erlang currently not tested in CI, random hangings on macos, always hangs on ubuntu
#      In local tests, erlang seems to work though
#      - name: Install Erlang Language Server
#        if: runner.os != 'Windows'
#        shell: bash
#        run: |
#          # Install rebar3 if not already available
#          which rebar3 || (curl -fsSL https://github.com/erlang/rebar3/releases/download/3.23.0/rebar3 -o /tmp/rebar3 && chmod +x /tmp/rebar3 && sudo mv /tmp/rebar3 /usr/local/bin/rebar3)
#          # Clone and build erlang_ls
#          git clone https://github.com/erlang-ls/erlang_ls.git /tmp/erlang_ls
#          cd /tmp/erlang_ls
#          make install PREFIX=/usr/local
#          # Ensure erlang_ls is in PATH
#          echo "$HOME/.local/bin" >> $GITHUB_PATH
      - name: Install clojure tools
        uses: DeLaGuardo/setup-clojure@13.4
        with:
          cli: latest
      - name: Install ccls (C/C++ Language Server)
        shell: bash
        run: |
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            sudo apt-get update
            sudo apt-get install -y ccls
          elif [[ "${{ runner.os }}" == "macOS" ]]; then
            brew install ccls
          elif [[ "${{ runner.os }}" == "Windows" ]]; then
            choco install ccls -y
          fi
          # Verify installation
          if command -v ccls &> /dev/null; then
            echo "ccls installed: $(ccls --version 2>&1 | head -1)"
          else
            echo "ERROR: ccls installation failed"
            exit 1
          fi
      - name: Setup Java (for JVM based languages)
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '17'
      - name: Setup .NET SDK (for F# and C# languages)
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.0.x'
      - name: List .NET runtimes
        shell: bash
        run: dotnet --list-runtimes
      - name: Install Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: "1.5.0"
          terraform_wrapper: false
      # - name: Install swift
      #   if: runner.os != 'Windows'
      #   uses: swift-actions/setup-swift@v2
      # Installation of swift with the action screws with installation of ruby on macOS for some reason
      # We can try again when version 3 of the action is released, where they will also use swiftly
      # Until then, we use custom code to install swift. Sourcekit-lsp is installed automatically with swift
      - name: Install Swift with swiftly (macOS)
        if: runner.os == 'macOS'
        run: |
          echo "=== Installing swiftly on macOS ==="
          curl -O https://download.swift.org/swiftly/darwin/swiftly.pkg && \
          installer -pkg swiftly.pkg -target CurrentUserHomeDirectory && \
          ~/.swiftly/bin/swiftly init --quiet-shell-followup && \
          . "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh" && \
          hash -r
          swiftly install --use 6.1.2
          swiftly use 6.1.2
          echo "~/.swiftly/bin" >> $GITHUB_PATH
          echo "Swiftly installed successfully"
          # Verify sourcekit-lsp is working before proceeding
          echo "=== Verifying sourcekit-lsp installation ==="
          which sourcekit-lsp || echo "Warning: sourcekit-lsp not found in PATH"
          sourcekit-lsp --help || echo "Warning: sourcekit-lsp not responding"
      - name: Install Swift with swiftly (Ubuntu)
        if: runner.os == 'Linux'
        run: |
          echo "=== Installing swiftly on Ubuntu ==="
          # Install dependencies BEFORE Swift to avoid exit code 1
          sudo apt-get update
          sudo apt-get -y install libcurl4-openssl-dev
          curl -O https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz && \
          tar zxf swiftly-$(uname -m).tar.gz && \
          ./swiftly init --quiet-shell-followup && \
          . "${SWIFTLY_HOME_DIR:-$HOME/.local/share/swiftly}/env.sh" && \
          hash -r
          swiftly install --use 6.1.2
          swiftly use 6.1.2
          echo "=== Adding Swift toolchain to PATH ==="
          echo "$HOME/.local/share/swiftly/bin" >> $GITHUB_PATH
          echo "Swiftly installed successfully!"
          # Verify sourcekit-lsp is working before proceeding
          echo "=== Verifying sourcekit-lsp installation ==="
          which sourcekit-lsp || echo "Warning: sourcekit-lsp not found in PATH"
          sourcekit-lsp --help || echo "Warning: sourcekit-lsp not responding"
      - name: Install Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.4'
      - name: Install Ruby language server
        shell: bash
        run: gem install ruby-lsp
      - name: Install OCaml and opam
        uses: ocaml/setup-ocaml@v3
        with:
          ocaml-compiler: ${{ runner.os == 'Windows' && '4.14' || '5.3.x' }}
          dune-cache: true
          opam-repositories: |
            ${{ runner.os == 'Windows' && 'opam-repository-mingw: https://github.com/ocaml-opam/opam-repository-mingw.git#sunset' || '' }}
            default: https://github.com/ocaml/opam-repository.git
      - name: Install OCaml packages
        shell: bash
        run: |
          if [ "$RUNNER_OS" = "Windows" ]; then
            opam install -y dune ocaml-lsp-server
          else
            # Require ocaml-lsp-server >= 1.23.0 for cross-file reference support
            opam install -y dune 'ocaml-lsp-server>=1.23.0'
          fi
      - name: Install R
        uses: r-lib/actions/setup-r@v2
        with:
          r-version: '4.4.2'
          use-public-rspm: true
      - name: Install R language server
        shell: bash
        run: |
          Rscript -e "install.packages('languageserver', repos='https://cloud.r-project.org')"
      - name: Set up Julia
        uses: julia-actions/setup-julia@v2
        with:
          version: '1.10'
      - name: Install Julia LanguageServer
        shell: bash
        run: julia -e 'using Pkg; Pkg.add("LanguageServer")'
      - name: Setup Haskell toolchain
        if: runner.os != 'Windows'
        uses: haskell/ghcup-setup@v1
        with:
          ghc: '9.12.2'
          cabal: '3.10.3.0'
          hls: '2.11.0.0'
      - name: Verify Haskell tools
        if: runner.os != 'Windows'
        run: |
          echo "Verifying installed Haskell tools:"
          which ghc && ghc --version
          which cabal && cabal --version
          # HLS verification - non-blocking in case of version incompatibility
          if command -v haskell-language-server-wrapper &>/dev/null; then
            echo "Found haskell-language-server-wrapper"
            haskell-language-server-wrapper --version || echo "WARNING: HLS wrapper found but version check failed"
          elif command -v haskell-language-server &>/dev/null; then
            echo "Found haskell-language-server"
            haskell-language-server --version || echo "WARNING: HLS found but version check failed"
          else
            echo "WARNING: HLS not found (may be incompatible with GHC 9.12.2)"
            echo "This is not a critical error - tests will use HLS if available at runtime"
          fi
        shell: bash
      - name: Pre-build Haskell test project for HLS
        if: runner.os != 'Windows'
        run: |
          cd test/resources/repos/haskell/test_repo
          cabal update
          cabal build --only-dependencies
          cabal build
          echo "Haskell test project built successfully"
        shell: bash
      - name: Install Zig
        uses: goto-bus-stop/setup-zig@v2
        with:
          version: 0.14.1
      - name: Install ZLS (Zig Language Server)
        shell: bash
        run: |
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            wget https://github.com/zigtools/zls/releases/download/0.14.0/zls-x86_64-linux.tar.xz
            tar -xf zls-x86_64-linux.tar.xz
            sudo mv zls /usr/local/bin/
            rm zls-x86_64-linux.tar.xz
          elif [[ "${{ runner.os }}" == "macOS" ]]; then
            wget https://github.com/zigtools/zls/releases/download/0.14.0/zls-x86_64-macos.tar.xz
            tar -xf zls-x86_64-macos.tar.xz
            sudo mv zls /usr/local/bin/
            rm zls-x86_64-macos.tar.xz
          elif [[ "${{ runner.os }}" == "Windows" ]]; then
            curl -L -o zls.zip https://github.com/zigtools/zls/releases/download/0.14.0/zls-x86_64-windows.zip
            unzip -o zls.zip
            mkdir -p "$HOME/bin"
            mv zls.exe "$HOME/bin/"
            echo "$HOME/bin" >> $GITHUB_PATH
            rm zls.zip
          fi
      - name: Install verible-verilog-ls (SystemVerilog Language Server)
        shell: bash
        run: |
          VERIBLE_VERSION="v0.0-4051-g9fdb4057"

          if [[ "${{ runner.os }}" == "Linux" ]]; then
            wget https://github.com/chipsalliance/verible/releases/download/${VERIBLE_VERSION}/verible-${VERIBLE_VERSION}-linux-static-x86_64.tar.gz
            tar -xzf verible-${VERIBLE_VERSION}-linux-static-x86_64.tar.gz
            sudo mv verible-${VERIBLE_VERSION}/bin/verible-verilog-ls /usr/local/bin/
            rm -rf verible-${VERIBLE_VERSION} verible-${VERIBLE_VERSION}-linux-static-x86_64.tar.gz
          elif [[ "${{ runner.os }}" == "macOS" ]]; then
            wget https://github.com/chipsalliance/verible/releases/download/${VERIBLE_VERSION}/verible-${VERIBLE_VERSION}-macOS.tar.gz
            tar -xzf verible-${VERIBLE_VERSION}-macOS.tar.gz
            sudo mv verible-${VERIBLE_VERSION}-macOS/bin/verible-verilog-ls /usr/local/bin/
            rm -rf verible-${VERIBLE_VERSION}-macOS verible-${VERIBLE_VERSION}-macOS.tar.gz
          elif [[ "${{ runner.os }}" == "Windows" ]]; then
            curl -L -o verible.zip https://github.com/chipsalliance/verible/releases/download/${VERIBLE_VERSION}/verible-${VERIBLE_VERSION}-win64.zip
            unzip -o verible.zip
            mkdir -p "$HOME/bin"
            mv verible-${VERIBLE_VERSION}-win64/verible-verilog-ls.exe "$HOME/bin/"
            echo "$HOME/bin" >> $GITHUB_PATH
            rm -rf verible-${VERIBLE_VERSION}-win64 verible.zip
          fi

          # Verify installation
          if command -v verible-verilog-ls &> /dev/null; then
            echo "verible-verilog-ls installed successfully"
          else
            echo "WARNING: verible-verilog-ls not found in PATH"
          fi
      - name: Install Lua Language Server
        shell: bash
        run: |
          LUA_LS_VERSION="3.15.0"
          LUA_LS_DIR="$HOME/.serena/language_servers/lua"
          mkdir -p "$LUA_LS_DIR"
          
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            if [[ "$(uname -m)" == "x86_64" ]]; then
              wget https://github.com/LuaLS/lua-language-server/releases/download/${LUA_LS_VERSION}/lua-language-server-${LUA_LS_VERSION}-linux-x64.tar.gz
              tar -xzf lua-language-server-${LUA_LS_VERSION}-linux-x64.tar.gz -C "$LUA_LS_DIR"
            else
              wget https://github.com/LuaLS/lua-language-server/releases/download/${LUA_LS_VERSION}/lua-language-server-${LUA_LS_VERSION}-linux-arm64.tar.gz
              tar -xzf lua-language-server-${LUA_LS_VERSION}-linux-arm64.tar.gz -C "$LUA_LS_DIR"
            fi
            chmod +x "$LUA_LS_DIR/bin/lua-language-server"
            # Create wrapper script instead of symlink to ensure supporting files are found
            echo '#!/bin/bash' | sudo tee /usr/local/bin/lua-language-server > /dev/null
            echo 'cd "${HOME}/.serena/language_servers/lua/bin"' | sudo tee -a /usr/local/bin/lua-language-server > /dev/null
            echo 'exec ./lua-language-server "$@"' | sudo tee -a /usr/local/bin/lua-language-server > /dev/null
            sudo chmod +x /usr/local/bin/lua-language-server
            rm lua-language-server-*.tar.gz
          elif [[ "${{ runner.os }}" == "macOS" ]]; then
            if [[ "$(uname -m)" == "x86_64" ]]; then
              wget https://github.com/LuaLS/lua-language-server/releases/download/${LUA_LS_VERSION}/lua-language-server-${LUA_LS_VERSION}-darwin-x64.tar.gz
              tar -xzf lua-language-server-${LUA_LS_VERSION}-darwin-x64.tar.gz -C "$LUA_LS_DIR"
            else
              wget https://github.com/LuaLS/lua-language-server/releases/download/${LUA_LS_VERSION}/lua-language-server-${LUA_LS_VERSION}-darwin-arm64.tar.gz
              tar -xzf lua-language-server-${LUA_LS_VERSION}-darwin-arm64.tar.gz -C "$LUA_LS_DIR"
            fi
            chmod +x "$LUA_LS_DIR/bin/lua-language-server"
            # Create wrapper script instead of symlink to ensure supporting files are found
            echo '#!/bin/bash' | sudo tee /usr/local/bin/lua-language-server > /dev/null
            echo 'cd "${HOME}/.serena/language_servers/lua/bin"' | sudo tee -a /usr/local/bin/lua-language-server > /dev/null
            echo 'exec ./lua-language-server "$@"' | sudo tee -a /usr/local/bin/lua-language-server > /dev/null
            sudo chmod +x /usr/local/bin/lua-language-server
            rm lua-language-server-*.tar.gz
          elif [[ "${{ runner.os }}" == "Windows" ]]; then
            curl -L -o lua-ls.zip https://github.com/LuaLS/lua-language-server/releases/download/${LUA_LS_VERSION}/lua-language-server-${LUA_LS_VERSION}-win32-x64.zip
            unzip -o lua-ls.zip -d "$LUA_LS_DIR"
            # For Windows, we'll add the bin directory directly to PATH
            # The lua-language-server.exe can find its supporting files relative to its location
            echo "$LUA_LS_DIR/bin" >> $GITHUB_PATH
            rm lua-ls.zip
          fi
      - name: Install Perl::LanguageServer
        if: runner.os != 'Windows'
        shell: bash
        run: |
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            sudo apt-get update
            sudo apt-get install -y cpanminus build-essential libanyevent-perl libio-aio-perl
          elif [[ "${{ runner.os }}" == "macOS" ]]; then
            brew install cpanminus
          fi
          PERL_MM_USE_DEFAULT=1 cpanm --notest --force Perl::LanguageServer
          # Set up Perl local::lib environment for subsequent steps
          echo "PERL5LIB=$HOME/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}" >> $GITHUB_ENV
          echo "PERL_LOCAL_LIB_ROOT=$HOME/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}" >> $GITHUB_ENV
          echo "PERL_MB_OPT=--install_base \"$HOME/perl5\"" >> $GITHUB_ENV
          echo "PERL_MM_OPT=INSTALL_BASE=$HOME/perl5" >> $GITHUB_ENV
          echo "$HOME/perl5/bin" >> $GITHUB_PATH
      - name: Install ansible-core and ansible-lint (for Ansible language server tests)
        shell: bash
        run: uv run pip install ansible-core ansible-lint
      - name: Install Elm
        shell: bash
        run: npm install -g elm@0.19.1-6
      - name: Install Nix
        if: runner.os != 'Windows'  # Nix doesn't support Windows natively
        uses: cachix/install-nix-action@v30
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - name: Install nixd (Nix Language Server)
        if: runner.os != 'Windows'  # Skip on Windows since Nix isn't available
        shell: bash
        run: |
          # Install nixd using nix
          nix profile install github:nix-community/nixd

          # Verify nixd is installed and working
          if ! command -v nixd &> /dev/null; then
            echo "nixd installation failed or not in PATH"
            exit 1
          fi

          echo "$HOME/.nix-profile/bin" >> $GITHUB_PATH
      - name: Verify Nix package build
        if: runner.os != 'Windows'  # Nix only supported on Linux/macOS
        shell: bash
        run: |
          # Verify the flake builds successfully
          nix build --no-link
      - name: Install Regal (Rego Language Server)
        shell: bash
        run: |
          REGAL_VERSION="0.39.0"

          if [[ "${{ runner.os }}" == "Linux" ]]; then
            if [[ "$(uname -m)" == "x86_64" ]]; then
              curl -L -o regal https://github.com/StyraInc/regal/releases/download/v${REGAL_VERSION}/regal_Linux_x86_64
            else
              curl -L -o regal https://github.com/StyraInc/regal/releases/download/v${REGAL_VERSION}/regal_Linux_arm64
            fi
            chmod +x regal
            sudo mv regal /usr/local/bin/
          elif [[ "${{ runner.os }}" == "macOS" ]]; then
            if [[ "$(uname -m)" == "x86_64" ]]; then
              curl -L -o regal https://github.com/StyraInc/regal/releases/download/v${REGAL_VERSION}/regal_Darwin_x86_64
            else
              curl -L -o regal https://github.com/StyraInc/regal/releases/download/v${REGAL_VERSION}/regal_Darwin_arm64
            fi
            chmod +x regal
            sudo mv regal /usr/local/bin/
          elif [[ "${{ runner.os }}" == "Windows" ]]; then
            curl -L -o regal.exe https://github.com/StyraInc/regal/releases/download/v${REGAL_VERSION}/regal_Windows_x86_64.exe
            mkdir -p "$HOME/bin"
            mv regal.exe "$HOME/bin/"
            echo "$HOME/bin" >> $GITHUB_PATH
          fi
      - name: Install Free Pascal Compiler
        shell: bash
        run: |
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            sudo apt-get update
            sudo apt-get install -y fpc fpc-source
            # Set environment variables for pasls
            echo "PP=/usr/bin/fpc" >> $GITHUB_ENV
            # Find FPC source directory (version may vary) - remove trailing slash
            FPCDIR=$(ls -d /usr/share/fpcsrc/*/ 2>/dev/null | head -1 | sed 's:/$::')
            if [[ -z "$FPCDIR" ]]; then
              FPCDIR="/usr/share/fpcsrc"
            fi
            echo "FPCDIR=$FPCDIR" >> $GITHUB_ENV
            echo "=== FPC source directory structure ==="
            ls -la "$FPCDIR" || echo "FPCDIR not found"
            ls -la "$FPCDIR/rtl" 2>/dev/null || echo "rtl subdirectory not found"
          elif [[ "${{ runner.os }}" == "macOS" ]]; then
            brew install fpc
            # Download FPC source from SourceForge (fpc-src-laz cask is incompatible with ARM64)
            FPC_VERSION="3.2.2"
            curl -L -o fpc-source.tar.gz "https://sourceforge.net/projects/freepascal/files/Source/${FPC_VERSION}/fpc-${FPC_VERSION}.source.tar.gz/download"
            mkdir -p "$HOME/fpcsrc"
            tar -xzf fpc-source.tar.gz -C "$HOME/fpcsrc"
            rm fpc-source.tar.gz
            # Check extracted directory structure (might be nested)
            echo "=== Extracted FPC source structure ==="
            ls -la "$HOME/fpcsrc"
            # Find the actual FPC source root (contains rtl, packages, etc.)
            if [[ -d "$HOME/fpcsrc/fpc-${FPC_VERSION}/rtl" ]]; then
              FPCDIR="$HOME/fpcsrc/fpc-${FPC_VERSION}"
            elif [[ -d "$HOME/fpcsrc/fpc-${FPC_VERSION}/fpc-${FPC_VERSION}/rtl" ]]; then
              FPCDIR="$HOME/fpcsrc/fpc-${FPC_VERSION}/fpc-${FPC_VERSION}"
            else
              FPCDIR="$HOME/fpcsrc/fpc-${FPC_VERSION}"
            fi
            echo "PP=$(which fpc)" >> $GITHUB_ENV
            echo "FPCDIR=$FPCDIR" >> $GITHUB_ENV
            echo "=== FPC source directory ==="
            ls -la "$FPCDIR" || echo "FPCDIR not found"
          elif [[ "${{ runner.os }}" == "Windows" ]]; then
            FPC_VERSION="3.2.2"
            # Download freepascal-ootb (includes FPC compiler)
            curl -L -o fpc-ootb.zip https://github.com/fredvs/freepascal-ootb/releases/download/${FPC_VERSION}/fpc-ootb-322-x86_64-win64.zip
            mkdir -p "$HOME/fpc"
            unzip -q fpc-ootb.zip -d "$HOME/fpc"
            rm fpc-ootb.zip
            # Download FPC source from SourceForge (fpc-ootb only has compiled units, not source)
            curl -L -o fpc-source.zip "https://sourceforge.net/projects/freepascal/files/Source/${FPC_VERSION}/fpc-${FPC_VERSION}.source.zip/download"
            mkdir -p "$HOME/fpcsrc"
            unzip -q fpc-source.zip -d "$HOME/fpcsrc"
            rm fpc-source.zip
            # Find fpc executable (fpc-ootb uses fpc-ootb.exe as the compiler)
            echo "=== FPC directory structure ==="
            find "$HOME/fpc" -name "*.exe" -type f 2>/dev/null | head -10
            FPC_EXE=$(find "$HOME/fpc" -name "fpc-ootb-64.exe" -type f 2>/dev/null | head -1)
            echo "Found FPC executable: $FPC_EXE"
            echo "Found FPC source dir: $HOME/fpcsrc/fpc-${FPC_VERSION}"
            # Set environment variables for pasls
            echo "PP=$FPC_EXE" >> $GITHUB_ENV
            echo "FPCDIR=$HOME/fpcsrc/fpc-${FPC_VERSION}" >> $GITHUB_ENV
            # Add FPC bin directory to PATH
            FPC_BIN_DIR=$(dirname "$FPC_EXE")
            echo "$FPC_BIN_DIR" >> $GITHUB_PATH
          fi
      - name: Verify FPC installation
        shell: bash
        run: |
          echo "=== Environment variables ==="
          echo "PP=$PP"
          echo "FPCDIR=$FPCDIR"

          # Create a simple test program
          if [[ "${{ runner.os }}" == "Windows" ]]; then
            TEST_PAS="$TEMP/fpc_test.pas"
            TEST_OUT="$TEMP/fpc_test"
          else
            TEST_PAS="/tmp/fpc_test.pas"
            TEST_OUT="/tmp/fpc_test"
          fi
          echo "program fpc_test; begin writeln('FPC works'); end." > "$TEST_PAS"

          # Compile using PP (the compiler we actually use in tests)
          echo "=== Compiling test program with PP=$PP ==="
          if [[ -n "$PP" ]]; then
            "$PP" "$TEST_PAS" -o"$TEST_OUT" 2>&1
          else
            echo "ERROR: PP environment variable is not set"
            exit 1
          fi

          # Verify output binary exists
          if [[ -f "$TEST_OUT" ]] || [[ -f "${TEST_OUT}.exe" ]]; then
            echo "FPC compilation test PASSED"
          else
            echo "ERROR: FPC compilation failed - no output binary at $TEST_OUT"
            exit 1
          fi

          # Verify FPCDIR exists (required for pasls)
          if [[ -d "$FPCDIR" ]]; then
            echo "FPCDIR exists: $FPCDIR"
          else
            echo "ERROR: FPCDIR does not exist: $FPCDIR"
            exit 1
          fi
      - name: Build Lean 4 test project
        uses: leanprover/lean-action@v1
        with:
          lake-package-directory: test/resources/repos/lean4/test_repo
      - name: Cache language servers
        id: cache-language-servers
        uses: actions/cache@v3
        with:
          path: ~/.serena/language_servers/static
          key: language-servers-${{ runner.os }}-v1
          restore-keys: |
            language-servers-${{ runner.os }}-
      - name: Report free disk space
        if: runner.os == 'Linux'
        run: |
          echo "Free disk space before tests:"
          df -h
      - name: Test with pytest
        shell: bash
        run: uv run poe test
      - name: Type-checking with mypy
        shell: bash
        run: uv run poe type-check


================================================
FILE: .gitignore
================================================
# macOS specific files
.DS_Store
.AppleDouble
.LSOverride
._*
.Spotlight-V100
.Trashes
Icon
.fseventsd
.DocumentRevisions-V100
.TemporaryItems
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Windows specific files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
*.stackdump
[Dd]esktop.ini
$RECYCLE.BIN/
*.cab
*.msi
*.msix
*.msm
*.msp
*.lnk

# Linux specific files
*~
.fuse_hidden*
.directory
.Trash-*
.nfs*

# IDE/Text Editors
# VS Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
.history/

# JetBrains IDEs (beyond .idea/)
*.iml
*.ipr
*.iws
out/
.idea_modules/

# Sublime Text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
*.sublime-workspace
*.sublime-project

# Project specific ignore
.idea
temp

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# reports
pylint.html
.pylint.d

# Serena-specific
/*.yml
!*.template.yml
/agent-ui
/test/**/.serena

# clojure-lsp temporary files
.calva/
.clj-kondo/
.cpcache/
.lsp/

# temporary and backup files
*.bak
*.tmp
tmp/

.vscode/

# Claude settings
.claude/settings.local.json

# Elixir
/test/resources/repos/elixir/test_repo/deps
# Exception: Don't ignore Elixir test repository lib directory (contains source code)
!/test/resources/repos/elixir/test_repo/lib

# Exception: Don't ignore Nix test repository lib directory (contains source code)
!/test/resources/repos/nix/test_repo/lib

# Exception: Don't ignore OCaml test repository lib directory (contains source code)
!/test/resources/repos/ocaml/test_repo/lib

# Exception: Don't ignore Julia test repository lib directory (contains source code)
!/test/resources/repos/julia/test_repo/lib

# Exception: Don't ignore Solidity test repository lib directory (contains source code)
!/test/resources/repos/solidity/test_repo/contracts/lib

# Swift
/test/resources/repos/swift/test_repo/.build
/test/resources/repos/swift/test_repo/.swiftpm

# OCaml
/test/resources/repos/ocaml/test_repo/_build

# Elm
/test/resources/repos/elm/test_repo/.elm/
/test/resources/repos/elm/test_repo/elm-stuff/

# Scala
.metals/
.bsp/
.scala-build/
.bloop/
bootstrap
test/resources/repos/scala/.bloop/

# Haskell
.stack-work/
*.cabal
stack.yaml.lock
dist-newstyle/
cabal.project.local*
.ghc.environment.*

# Lean 4
.lake/

zz-misc/
vue-implementation/


================================================
FILE: .serena/.gitignore
================================================
/cache
/project.local.yml


================================================
FILE: .serena/memories/adding_new_language_support_guide.md
================================================
# Adding New Language Support to Serena

This guide explains how to add support for a new programming language to Serena.

## Overview

Adding a new language involves:

1. **Language Server Implementation** - Creating a language-specific server class
2. **Language Registration** - Adding the language to enums and configurations  
3. **Test Repository** - Creating a minimal test project
4. **Test Suite** - Writing comprehensive tests

## Step 1: Language Server Implementation

### 1.1 Create Language Server Class

Create a new file in `src/solidlsp/language_servers/` (e.g., `new_language_server.py`).

#### Providing the Launch Command via a DependencyProvider

All language servers use the `DependencyProvider` pattern to handle 
  * runtime dependency installation/discovery
  * launch command creation (and, optionally, environment setup)

To implement a new language server using the DependencyProvider pattern:
  * Pass `None` for `process_launch_info` in `super().__init__()` - the base class creates it via `_create_dependency_provider()`
  * Implement `_create_dependency_provider()` to return an inner `DependencyProvider` class instance.
    In simple cases, it can be instantiated with only two parameters: 
    ```python
    def _create_dependency_provider(self) -> LanguageServerDependencyProvider:
         return self.DependencyProvider(self._custom_settings, self._ls_resources_dir)
    ```
    The resource dir that is passed is the directory in which installed dependencies should be stored!

**Base Classes:**

- **`LanguageServerDependencyProviderSinglePath`** - For language servers with a single core dependency (e.g., an executable or JAR file)
  - Provides automatic support for the `ls_path` custom setting, allowing users to override the core dependency path (if they have it installed it themselves)
  - Implement `_get_or_install_core_dependency()` to return the path to the core dependency, downloading/installing it automatically if necessary
  - Implement `_create_launch_command(core_path)` to build the full command from the core path
  - Reference implementations: `TypeScriptLanguageServer`, `Intelephense`, `ClojureLSP`, `ClangdLanguageServer`, `PyrightServer`

- **`LanguageServerDependencyProvider`** - The base class, which can be directly inherited from for complex cases with multiple dependencies or custom setup
  - Implement `create_launch_command()` directly
  - Reference implementations: `EclipseJDTLS`, `CSharpLanguageServer`, `MatlabLanguageServer`

**Implementation Pointers::**
  - When returning the command, prefer the list-based representation for robustness
  - Override `create_launch_command_env` if the launch command needs environment variables to be set (defaults to `{}` in the base implementation)

You should look at at least one existing implementation of each base class to understand how they work.

### 1.2 LSP Initialization

Override initialization methods if needed:

```python
def _get_initialize_params(self) -> InitializeParams:
    """Return language-specific initialization parameters."""
    return {
        "processId": os.getpid(),
        "rootUri": PathUtils.path_to_uri(self.repository_root_path),
        "capabilities": {
            # Language-specific capabilities
        }
    }

def _start_server(self):
    """Start the language server with custom handlers."""
    # Set up notification handlers
    self.server.on_notification("window/logMessage", self._handle_log_message)
    
    # Start server and initialize
    self.server.start()
    init_response = self.server.send.initialize(self._get_initialize_params())
    
    self.server.notify.initialized({})
```

After `_start_server` returns, the language server should be fully operational.
If the server requires that one waits for certain notifications or responses before being ready, implement that logic here.
For an example, see `EclipseJDTLS._start_server`.

## Step 2: Language Registration

### 2.1 Add to Language Enum

In `src/solidlsp/ls_config.py`, add your language to the `Language` enum:

```python
class Language(str, Enum):
    # Existing languages...
    NEW_LANGUAGE = "new_language"
    
    def get_source_fn_matcher(self) -> FilenameMatcher:
        match self:
            # Existing cases...
            case self.NEW_LANGUAGE:
                return FilenameMatcher("*.newlang", "*.nl")  # File extensions
```

### 2.2 Update Language Server Factory

In `src/solidlsp/ls.py`, add your language to the `create` method:

```python
@classmethod
def create(cls, config: LanguageServerConfig, repository_root_path: str) -> "SolidLanguageServer":
    match config.code_language:
        # Existing cases...
        case Language.NEW_LANGUAGE:
            from solidlsp.language_servers.new_language_server import NewLanguageServer
            return NewLanguageServer(config, repository_root_path)
```

## Step 3: Test Repository

### 3.1 Create Test Project

Create a minimal project in `test/resources/repos/new_language/test_repo/`:

```
test/resources/repos/new_language/test_repo/
├── main.newlang              # Main source file
├── lib/
│   └── helper.newlang       # Additional source for testing
├── project.toml             # Project configuration (if applicable)
└── .gitignore              # Ignore build artifacts
```

### 3.2 Example Source Files

Create meaningful source files that demonstrate:

- **Classes/Types** - For symbol testing
- **Functions/Methods** - For reference finding
- **Imports/Dependencies** - For cross-file operations
- **Nested Structures** - For hierarchical symbol testing

Example `main.newlang`:
```
import lib.helper

class Calculator {
    func add(a: Int, b: Int) -> Int {
        return a + b
    }
    
    func subtract(a: Int, b: Int) -> Int {
        return helper.subtract(a, b)  // Reference to imported function
    }
}

class Program {
    func main() {
        let calc = Calculator()
        let result = calc.add(5, 3)  // Reference to add method
        print(result)
    }
}
```

## Step 4: Test Suite

Testing the language server implementation is of crucial importance, and the tests will
form the main part of the review process. Make sure that the tests are up to the standard
of Serena to make the review go smoother.

General rules for tests:

1. Tests for symbols and references should always check that the expected symbol names and references were actually found.
   Just testing that a list came back or that the result is not None is insufficient.
2. Tests should never be skipped, the only exception is skipping based on some package being available or on an unsupported OS.
3. Tests should run in CI, check if there is a suitable GitHub action for installing the dependencies.

### 4.1 Basic Tests

Create `test/solidlsp/new_language/test_new_language_basic.py`.
Have a look at the structure of existing tests, for example, in `test/solidlsp/php/test_php_basic.py`
You should at least test:

1. Finding symbols
2. Finding within-file references
3. Finding cross-file references

Have a look at `test/solidlsp/php/test_php_basic.py` as an example for what should be tested.
Don't forget to add a new language marker to `pytest.ini`.

### 4.2 Integration Tests

Consider adding new cases to the parametrized tests in `test_serena_agent.py` for the new language.


### 5 Documentation

Update:

- **README.md** - Add language to the list of languages
- **docs/01-about/020_programming-languages.md** - Add language to the list and mention any special notes, compatibility or requirements (e.g. installations the user is required to do)
- **CHANGELOG.md** - Document the new language support


================================================
FILE: .serena/memories/serena_core_concepts_and_architecture.md
================================================
# Serena Core Concepts and Architecture

## High-Level Architecture

Serena is built around a dual-layer architecture:

1. **SerenaAgent** - The main orchestrator that manages projects, tools, and user interactions
2. **SolidLanguageServer** - A unified wrapper around Language Server Protocol (LSP) implementations

## Core Components

### 1. SerenaAgent (`src/serena/agent.py`)

The central coordinator that:
- Manages active projects and their configurations
- Coordinates between different tools and contexts
- Handles language server lifecycle
- Manages memory persistence
- Provides MCP (Model Context Protocol) server interface

Key responsibilities:
- **Project Management** - Activating, switching between projects
- **Tool Registry** - Loading and managing available tools based on context/mode
- **Language Server Integration** - Starting/stopping language servers per project
- **Memory Management** - Persistent storage of project knowledge
- **Task Execution** - Coordinating complex multi-step operations

### 2. SolidLanguageServer (`src/solidlsp/ls.py`)

A unified abstraction over multiple language servers that provides:
- **Language-agnostic interface** for symbol operations
- **Caching layer** for performance optimization
- **Error handling and recovery** for unreliable language servers
- **Uniform API** regardless of underlying LSP implementation

Core capabilities:
- Symbol discovery and navigation
- Code completion and hover information
- Find references and definitions
- Document and workspace symbol search
- File watching and change notifications

### 3. Tool System (`src/serena/tools/`)

Modular tool architecture with several categories:

#### File Tools (`file_tools.py`)
- File system operations (read, write, list directories)
- Text search and pattern matching
- Regex-based replacements

#### Symbol Tools (`symbol_tools.py`)  
- Language-aware symbol finding and navigation
- Symbol body replacement and insertion
- Reference finding across codebase

#### Memory Tools (`memory_tools.py`)
- Project knowledge persistence
- Memory retrieval and management
- Onboarding information storage

#### Configuration Tools (`config_tools.py`)
- Project activation and switching
- Mode and context management
- Tool inclusion/exclusion

### 4. Configuration System (`src/serena/config/`)

Multi-layered configuration supporting:
- **Contexts** - Define available tools and their behavior
- **Modes** - Specify operational patterns (interactive, editing, etc.)
- **Projects** - Per-project settings and language server configs
- **Tool Sets** - Grouped tool collections for different use cases

## Language Server Integration

### Language Support Model

Each supported language has:
1. **Language Server Implementation** (`src/solidlsp/language_servers/`)
2. **Runtime Dependencies** - Managed downloads of language servers
3. **Test Repository** (`test/resources/repos/<language>/`)
4. **Test Suite** (`test/solidlsp/<language>/`)

### Language Server Lifecycle

1. **Discovery** - Find language servers or download them automatically
2. **Initialization** - Start server process and perform LSP handshake
3. **Project Setup** - Open workspace and configure language-specific settings
4. **Operation** - Handle requests/responses with caching and error recovery
5. **Shutdown** - Clean shutdown of server processes

### Supported Languages

Current language support includes:
- **C#** - Microsoft.CodeAnalysis.LanguageServer (.NET 9)
- **Python** - Pyright or Jedi
- **TypeScript/JavaScript** - TypeScript Language Server
- **Rust** - rust-analyzer
- **Go** - gopls
- **Java** - Eclipse JDT Language Server
- **Kotlin** - Kotlin Language Server
- **PHP** - Intelephense
- **Ruby** - Solargraph
- **Clojure** - clojure-lsp
- **Elixir** - ElixirLS
- **Dart** - Dart Language Server
- **C/C++** - clangd
- **Terraform** - terraform-ls

## Memory and Knowledge Management

### Memory System
- **Markdown-based storage** in `.serena/memories/` directory
- **Contextual retrieval** - memories loaded based on relevance
- **Project-specific** knowledge persistence
- **Onboarding support** - guided setup for new projects

### Knowledge Categories
- **Project Structure** - Directory layouts, build systems
- **Architecture Patterns** - How the codebase is organized
- **Development Workflows** - Testing, building, deployment
- **Domain Knowledge** - Business logic and requirements

## MCP Server Interface

Serena exposes its functionality through Model Context Protocol:
- **Tool Discovery** - AI agents can enumerate available tools
- **Context-Aware Operations** - Tools behave based on active project/mode
- **Stateful Sessions** - Maintains project state across interactions
- **Error Handling** - Graceful degradation when tools fail

## Error Handling and Resilience

### Language Server Reliability
- **Timeout Management** - Configurable timeouts for LSP requests
- **Process Recovery** - Automatic restart of crashed language servers
- **Fallback Behavior** - Graceful degradation when LSP unavailable
- **Caching Strategy** - Reduces impact of server failures

### Project Activation Safety
- **Validation** - Verify project structure before activation
- **Error Isolation** - Project failures don't affect other projects
- **Recovery Mechanisms** - Automatic cleanup and retry logic

## Performance Considerations

### Caching Strategy
- **Symbol Cache** - In-memory caching of expensive symbol operations
- **File System Cache** - Reduced disk I/O for repeated operations
- **Language Server Cache** - Persistent cache across sessions

### Resource Management
- **Language Server Pooling** - Reuse servers across projects when possible
- **Memory Management** - Automatic cleanup of unused resources
- **Background Operations** - Async operations don't block user interactions

## Extension Points

### Adding New Languages
1. Implement language server class in `src/solidlsp/language_servers/`
2. Add runtime dependencies configuration
3. Create test repository and test suite
4. Update language enumeration and configuration

### Adding New Tools
1. Inherit from `Tool` base class in `tools_base.py`
2. Implement required methods and parameter validation
3. Register tool in appropriate tool registry
4. Add to context/mode configurations as needed

### Custom Contexts and Modes
- Define new contexts in YAML configuration files
- Specify tool sets and operational patterns
- Configure for specific development workflows

================================================
FILE: .serena/memories/serena_repository_structure.md
================================================
# Serena Repository Structure

## Overview
Serena is a multi-language code assistant that combines two main components:
1. **Serena Core** - The main agent framework with tools and MCP server
2. **SolidLSP** - A unified Language Server Protocol wrapper for multiple programming languages

## Top-Level Structure

```
serena/
├── src/                          # Main source code
│   ├── serena/                   # Serena agent framework
│   ├── solidlsp/                 # LSP wrapper library  
│   └── interprompt/              # Multi-language prompt templates
├── test/                         # Test suites
│   ├── serena/                   # Serena agent tests
│   ├── solidlsp/                 # Language server tests
│   └── resources/repos/          # Test repositories for each language
├── scripts/                      # Build and utility scripts
├── resources/                    # Static resources and configurations
├── pyproject.toml               # Python project configuration
├── README.md                    # Project documentation
└── CHANGELOG.md                 # Version history
```

## Source Code Organization

### Serena Core (`src/serena/`)
- **`agent.py`** - Main SerenaAgent class that orchestrates everything
- **`tools/`** - MCP tools for file operations, symbols, memory, etc.
  - `file_tools.py` - File system operations (read, write, search)
  - `symbol_tools.py` - Symbol-based code operations (find, edit)
  - `memory_tools.py` - Knowledge persistence and retrieval
  - `config_tools.py` - Project and mode management
  - `workflow_tools.py` - Onboarding and meta-operations
- **`config/`** - Configuration management
  - `serena_config.py` - Main configuration classes
  - `context_mode.py` - Context and mode definitions
- **`util/`** - Utility modules
- **`mcp.py`** - MCP server implementation
- **`cli.py`** - Command-line interface

### SolidLSP (`src/solidlsp/`)
- **`ls.py`** - Main SolidLanguageServer class
- **`language_servers/`** - Language-specific implementations
  - `csharp_language_server.py` - C# (Microsoft.CodeAnalysis.LanguageServer)
  - `python_server.py` - Python (Pyright)
  - `typescript_language_server.py` - TypeScript
  - `rust_analyzer.py` - Rust
  - `gopls.py` - Go
  - And many more...
- **`ls_config.py`** - Language server configuration
- **`ls_types.py`** - LSP type definitions
- **`ls_utils.py`** - Utilities for working with LSP data

### Interprompt (`src/interprompt/`)
- Multi-language prompt template system
- Jinja2-based templating with language fallbacks

## Test Structure

### Language Server Tests (`test/solidlsp/`)
Each language has its own test directory:
```
test/solidlsp/
├── csharp/
│   └── test_csharp_basic.py
├── python/
│   └── test_python_basic.py
├── typescript/
│   └── test_typescript_basic.py
└── ...
```

### Test Resources (`test/resources/repos/`)
Contains minimal test projects for each language:
```
test/resources/repos/
├── csharp/test_repo/
│   ├── serena.sln
│   ├── TestProject.csproj
│   ├── Program.cs
│   └── Models/Person.cs
├── python/test_repo/
├── typescript/test_repo/
└── ...
```

### Test Infrastructure
- **`test/conftest.py`** - Shared test fixtures and utilities
- **`create_ls()`** function - Creates language server instances for testing
- **`language_server` fixture** - Parametrized fixture for multi-language tests

## Key Configuration Files

- **`pyproject.toml`** - Python dependencies, build config, and tool settings
- **`.serena/`** directories - Project-specific Serena configuration and memories
- **`CLAUDE.md`** - Instructions for AI assistants working on the project

## Dependencies Management

The project uses modern Python tooling:
- **uv** for fast dependency resolution and virtual environments
- **pytest** for testing with language-specific markers (`@pytest.mark.csharp`)
- **ruff** for linting and formatting
- **mypy** for type checking

## Build and Development

- **Docker support** - Full containerized development environment
- **GitHub Actions** - CI/CD with language server testing
- **Development scripts** in `scripts/` directory

================================================
FILE: .serena/memories/suggested_commands.md
================================================
# Suggested Commands

## Development Tasks (using uv and poe)

The following tasks should generally be executed using `uv run poe <task_name>`.

- `format`: This is the **only** allowed command for formatting. Run as `uv run poe format`.
- `type-check`: This is the **only** allowed command for type checking. Run as `uv run poe type-check`.
- `test`: This is the preferred command for running tests (`uv run poe test [args]`). You can select subsets of tests with markers,
   the current markers are
   ```toml
    markers = [
        "python: language server running for Python",
        "go: language server running for Go",
        "java: language server running for Java",
        "rust: language server running for Rust",
        "typescript: language server running for TypeScript",
        "php: language server running for PHP",
        "snapshot: snapshot tests for symbolic editing operations",
    ]
   ```
  By default, `uv run poe test` uses the markers set in the env var `PYTEST_MARKERS`, or, if it unset, uses `-m "not java and not rust and not isolated process"`.
  You can override this behavior by simply passing the `-m` option to `uv run poe test`, e.g. `uv run poe test -m "python or go"`.

For finishing a task, make sure format, type-check and test pass! Run them at the end of the task
and if needed fix any issues that come up and run them again until they pass.

================================================
FILE: .serena/project.yml
================================================
# the name by which the project can be referenced within Serena
project_name: "serena"


# list of languages for which language servers are started; choose from:
#   al                  bash                clojure             cpp                 csharp
#   csharp_omnisharp    dart                elixir              elm                 erlang
#   fortran             fsharp              go                  groovy              haskell
#   java                julia               kotlin              lua                 markdown
#   matlab              nix                 pascal              perl                php
#   powershell          python              python_jedi         r                   rego
#   ruby                ruby_solargraph     rust                scala               swift
#   terraform           toml                typescript          typescript_vts      vue
#   yaml                zig
#   (This list may be outdated. For the current list, see values of Language enum here:
#   https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py
#   For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
# Note:
#   - For C, use cpp
#   - For JavaScript, use typescript
#   - For Free Pascal/Lazarus, use pascal
# Special requirements:
#   - csharp: Requires the presence of a .sln file in the project folder.
#   - pascal: Requires Free Pascal Compiler (fpc) and optionally Lazarus.
# When using multiple languages, the first language server that supports a given file will be used for that file.
# The first language is the default language and the respective language server will be used as a fallback.
# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
languages:
- python
- typescript

# whether to use project's .gitignore files to ignore files
ignore_all_files_in_gitignore: true


# list of additional paths to ignore in all projects
# same syntax as gitignore, so you can use * and **
ignored_paths: []

# whether the project is in read-only mode
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
read_only: false


# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details.
# Below is the complete list of tools for convenience.
# To make sure you have the latest list of tools, and to view their descriptions, 
# execute `uv run scripts/print_tool_overview.py`.
#
#  * `activate_project`: Activates a project by name.
#  * `check_onboarding_performed`: Checks whether project onboarding was already performed.
#  * `create_text_file`: Creates/overwrites a file in the project directory.
#  * `delete_lines`: Deletes a range of lines within a file.
#  * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
#  * `execute_shell_command`: Executes a shell command.
#  * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
#  * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
#  * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
#  * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
#  * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
#  * `initial_instructions`: Gets the initial instructions for the current project.
#     Should only be used in settings where the system prompt cannot be set,
#     e.g. in clients you have no control over, like Claude Desktop.
#  * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
#  * `insert_at_line`: Inserts content at a given line in a file.
#  * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
#  * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
#  * `list_memories`: Lists memories in Serena's project-specific memory store.
#  * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
#  * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
#  * `read_file`: Reads a file within the project directory.
#  * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
#  * `remove_project`: Removes a project from the Serena configuration.
#  * `replace_lines`: Replaces a range of lines within a file with new content.
#  * `replace_symbol_body`: Replaces the full definition of a symbol.
#  * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
#  * `search_for_pattern`: Performs a search for a pattern in the project.
#  * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
#  * `switch_modes`: Activates modes by providing a list of their names
#  * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
#  * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
#  * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
#  * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
excluded_tools: []

# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default)
included_optional_tools: []

# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
# This cannot be combined with non-empty excluded_tools or included_optional_tools.
# initial prompt for the project. It will always be given to the LLM upon activating the project
# (contrary to the memories, which are loaded on demand).
initial_prompt: |
  IMPORTANT: You use an idiomatic, object-oriented style.
  In particular, this implies that, for any non-trivial interfaces, you use interfaces that expect explicitly typed abstractions
  rather than mere functions (i.e. use the strategy pattern, for example).
  You avoid the use of low-level data structures in all cases where an object-oriented abstraction would be more appropriate.
  For simple data storage, you use dataclasses instead of dictionaries or tuples.

  You structure function implementations into functional blocks that are separated by blank lines.
  Atop each functional block, you write an elliptical phrase (starting with lower-case letter) that describes the purpose of the 
  block in a concise manner.

  Docstrings: You consistently use reStructuredText.

  Comments:
  When describing parameters, methods/functions and classes, you use a precise style, where the initial (elliptical) phrase
  clearly defines *what* it is. Any details then follow in subsequent sentences.
# the encoding used by text files in the project
# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
encoding: utf-8


# list of mode names to that are always to be included in the set of active modes
# The full set of modes to be activated is base_modes + default_modes.
# If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply.
# Otherwise, this setting overrides the global configuration.
# Set this to [] to disable base modes for this project.
# Set this to a list of mode names to always include the respective modes for this project.
base_modes:

# list of mode names that are to be activated by default.
# The full set of modes to be activated is base_modes + default_modes.
# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply.
# Otherwise, this overrides the setting from the global configuration (serena_config.yml).
# This setting can, in turn, be overridden by CLI parameters (--mode).
default_modes:

# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
# This cannot be combined with non-empty excluded_tools or included_optional_tools.
fixed_tools: []

# time budget (seconds) per tool call for the retrieval of additional symbol information
# such as docstrings or parameter information.
# This overrides the corresponding setting in the global configuration; see the documentation there.
# If null or missing, use the setting from the global configuration.
symbol_info_budget:

# The language backend to use for this project.
# If not set, the global setting from serena_config.yml is used.
# Valid values: LSP, JetBrains
# Note: the backend is fixed at startup. If a project with a different backend
# is activated post-init, an error will be returned.
language_backend:

# list of regex patterns which, when matched, mark a memory entry as read‑only.
# Extends the list from the global configuration, merging the two lists.
read_only_memory_patterns: []

# line ending convention for file writes: unset (use global setting, "lf", "crlf", or "native" (platform default)
# If not undefined, overrides the global setting in serena_config.yml
line_ending:


================================================
FILE: CHANGELOG.md
================================================
# Latest

Status of the `main` branch. Changes prior to the next official version change will appear here.

* New language support:
    * Add Solidity language server support (`Language.SOLIDITY`) using the
      Nomic Foundation `@nomicfoundation/solidity-language-server`. Automatically
      installed via npm. Supports `.sol` files with go-to-definition, find references,
      document symbols, hover, and diagnostics. Works best with a `foundry.toml` or
      `hardhat.config.js` in the project root.

* General:
    * Add monorepo/multi-language support
        * Project configuration files (`project.yml`) can now define multiple languages.
          Auto-detection adds only the most prominent language by default.
        * Additional languages can be conveniently added via the Dashboard while a project is already activated.
    * Add support for querying projects other than the currently active one via new tools `QueryProjectTool` and `ListQueryableProjectsTool`.
      The `QueryProjectTool` allows Serena tools to be called on other projects.
        * For the LSP backend, calling symbolic tools require a project server to be spawned that will launch the respective language servers
        * For the JetBrains backend, all projects for which IDE instances are open can directly be queried
    * Support overloaded symbols in `FindSymbolTool` and related tools
        * Name paths of overloaded symbols now include an index (e.g., `myOverloadedFunction[2]`)
        * Responses of the Java language server, which handled this in its own way, are now adapted accordingly,
          solving several issues related to retrieval problems in Java projects
    * Major extensions to the dashboard, which now serves as a central web interface for Serena
        * View current configuration
        * View news which can be marked as read
        * View the executions, with the possibility to cancel running/scheduled executions
        * View tool usage statistics
        * View and create memories and edit the serena configuration file
        * Log page now has save (downloads a snapshot) and clear (resets log view) buttons alongside the existing copy button
    * Language server backend:
        * New two-tier caching of language server document symbols and considerable performance improvements surrounding symbol retrieval/indexing
        * Allow passing language server specific settings through `ls_specific_settings` field (in `serena_config.yml`)
    * Add the JetBrains language backend as an alternative to language servers
    * Improve management of the Serena projects
        * Facilitate project activation based on the current directory (through the `--project-from-cwd` parameter)
        * Add notion of a "single-project context" (flag `single_project`), allowing user-defined contexts to behave
          like the built-in `ide-assistant` context (where the available tools are restricted to ones required by the active
          project and project changes are disabled)
        * The location of Serena's project-specific data folder can now be flexibly configured, allowing, in particular,
          locations outside of the project folder, thus improving support for read-only projects.
        * Add support for `project.local.yml` for local overrides that should not be versioned 
    * Various fixes related to indexing, special paths and determination of ignored paths

* Client support:
    * New mode `oaicompat-agent` and extensions enhancing OpenAI tool compatibility, permitting Serena to work with llama.cpp

* Tools:
  * Symbol information (hover, docstring, quick-info) is now provided as part of `find_symbol` and related tool responses.
  * Added `QueryProjectTool` and `ListQueryableProjectTool` (see above)
  * Added `RenameSymbolTool` for renaming symbols across the codebase (if LS supports this operation).
  * Replaced `ReplaceRegexTool` with `ReplaceContentTool`, which supports both plain text and regex-based replacements
    (and which requires no escaping in the replacement text, making it more robust) 
  * Decreased `TOOL_DEFAULT_MAX_ANSWER_LENGTH` to be in accordance with (below) typical max-tokens configurations

* Language support:

  * **Add support for Lean 4** via built-in `lean --server` with cross-file reference support (requires `lean` and `lake` via [elan](https://github.com/leanprover/elan))
  * **Add support for OCaml** via ocaml-lsp-server with cross-file reference support on OCaml 5.2+ (requires opam; see [setup guide](docs/03-special-guides/ocaml_setup_guide_for_serena.md))
  * **Add Phpactor as alternative PHP language server** (specify `php_phpactor` as language; requires PHP 8.1+)
  * **Add support for Fortran** via fortls language server (requires `pip install fortls`)
  * **Add partial support for Groovy** requires user-provided Groovy language server JAR (see [setup guide](docs/03-special-guides/groovy_setup_guide_for_serena.md))
  * **Add support for Julia** via LanguageServer.jl
  * **Add support for Haskell** via Haskell Language Server (HLS) with automatic discovery via ghcup, stack, or system PATH; supports both Stack and Cabal projects
  * **Add support for Scala** via Metals language server (requires some [manual setup](docs/03-special-guides/scala_setup_guide_for_serena.md))
  * **Add support for F#** via FsAutoComplete/Ionide LSP server. 
  * **Add support for Elm** via @elm-tooling/elm-language-server (automatically downloads if not installed; requires Elm compiler)
  * **Add support for Perl** via Perl::LanguageServer with LSP integration for .pl, .pm, and .t files
  * **Add support for AL (Application Language)** for Microsoft Dynamics 365 Business Central development. Requires VS Code AL extension (ms-dynamics-smb.al).
  * **Add support for R** via the R languageserver package with LSP integration, performance optimizations, and fallback symbol extraction
  * **Add support for Zig** via ZLS (cross-file references may not fully work on Windows)
  * **Add support for Lua** via lua-language-server
  * **Add support for Nix** requires nixd installation (Windows not supported)
  * **Add experimental support for YAML** via yaml-language-server with LSP integration for .yaml and .yml files
  * **Add support for TOML** via Taplo language server with automatic binary download, validation, formatting, and schema support for .toml files
  * **Dart now officially supported**: Dart was always working, but now tests were added, and it is promoted to "officially supported"
  * **Rust now uses already installed rustup**: The rust-analyzer is no longer bundled with Serena. Instead, it uses the rust-analyzer from your Rust toolchain managed by rustup. This ensures compatibility with your Rust version and eliminates outdated bundled binaries.
  * **Kotlin now officially supported**: We now use the official Kotlin LS, tests run through and performance is good, even though the LS is in an early development stage.
  * **Add support for Erlang** experimental, may hang or be slow, uses the recently archived [erlang_ls](https://github.com/erlang-ls/erlang_ls)
  * **Ruby dual language server support**: Added ruby-lsp as the modern primary Ruby language server. Solargraph remains available as an experimental legacy option. ruby-lsp supports both .rb and .erb files, while Solargraph supports .rb files only.
  * **Add support for PowerShell** via PowerShell Editor Services (PSES). Requires `pwsh` (PowerShell Core) to be installed and available in PATH. Supports symbol navigation, go-to-definition, and within-file references for .ps1 files.
  * **Add support for MATLAB** via the official MathWorks MATLAB Language Server. Requires MATLAB R2021b or later and Node.js. Set `MATLAB_PATH` environment variable or configure `matlab_path` in `ls_specific_settings`. Supports .m, .mlx, and .mlapp files with code completion, diagnostics, go-to-definition, find references, document symbols, formatting, and rename.
  * **Add support for Pascal** via the official Pascal Language Server.
  * **C/C++ alternate LS (ccls)**: Add experimental, opt-in support for ccls as an alternative backend to clangd. Enable via `cpp_ccls` in project configuration. Requires `ccls` installed and ideally a `compile_commands.json` at repo root.


# 0.1.4

## Summary

This likely is the last release before the stable version 1.0.0 which will come together with the jetbrains IDE extension.
We release it for users who install Serena from a tag, since the last tag cannot be installed due to a breaking change in the mcp dependency (see #381).

Since the last release, several new languages were supported, and the Serena CLI and configurability were significantly extended.
We thank all external contributors who made a lot of the improvements possible!

* General:
  * **Initial instructions no longer need to be loaded by the user**
  * Significantly extended CLI
  * Removed `replace_regex` tool from `ide-assistant` and `codex` contexts.
    The current string replacement tool in Claude Code seems to be sufficiently efficient and is better
    integrated with the IDE. Users who want to enable `replace_regex` can do so by customizing the context.

* Configuration:
  * Simplify customization of modes and contexts, including CLI support.
  * Possibility to customize the system prompt and outputs of simple tools, including CLI support.
  * Possibility to override tool descriptions through the context YAML.
  * Prompt templates are now automatically adapted to the enabled tools.
  * Several tools are now excluded by default, need to be included explicitly.
  * New context for ChatGPT

* Language servers:
  * Reliably detect language server termination and propagate the respective error all the way
    back to the tool application, where an unexpected termination is handled by restarting the language server
    and subsequently retrying the tool application.
  * **Add support for Swift**
  * **Add support for Bash**
  * Enhance Solargraph (Ruby) integration
    * Automatic Rails project detection via config/application.rb, Rakefile, and Gemfile analysis
    * Ruby/Rails-specific exclude patterns for improved indexing performance (vendor/, .bundle/, tmp/, log/, coverage/)
    * Enhanced error handling with detailed diagnostics and Ruby manager-specific installation instructions (rbenv, RVM, asdf)
    * Improved LSP capability negotiation and analysis completion detection
    * Better Bundler and Solargraph installation error messages with clear resolution steps

Fixes:
* Ignore `.git` in check for ignored paths and improve performance of `find_all_non_ignored_files`
* Fix language server startup issues on Windows when using Claude Code (which was due to
  default shell reconfiguration imposed by Claude Code)
* Additional wait for initialization in C# language server before requesting references, allowing cross-file references to be found.

# 0.1.3

## Summary

This is the first release of Serena to pypi. Since the last release, we have greatly improved 
stability and performance, as well as extended functionality, improved editing tools and included support for several new languages. 

* **Reduce the use of asyncio to a minimum**, improving stability and reducing the need for workarounds
   * Switch to newly developed fully synchronous LSP library `solidlsp` (derived from `multilspy`),
     removing our fork of `multilspy` (src/multilspy)
   * Switch from fastapi (which uses asyncio) to Flask in the Serena dashboard
   * The MCP server is the only asyncio-based component now, which resolves cross-component loop contamination,
     such that process isolation is no longer required.
     Neither are non-graceful shutdowns on Windows.
* **Improved editing tools**: The editing logic was simplified and improved, making it more robust.
   * The "minimal indentation" logic was removed, because LLMs did not understand it.
   * The logic for the insertion of empty lines was improved (mostly controlled by the LLM now)
* Add a task queue for the agent, which is executed in a separate and thread and
   * allows the language server to be initialized in the background, making the MCP server respond to requests
     immediately upon startup,
   * ensures that all tool executions are fully synchronized (executed linearly).
* `SearchForPatternTool`: Better default, extended parameters and description for restricting the search
* Language support:
   * Better support for C# by switching from `omnisharp` to Microsoft's official C# language server.
   * **Add support for Clojure, Elixir and Terraform. New language servers for C# and typescript.**
   * Experimental language server implementations can now be accessed by users through configuring the `language` field
* Configuration:
   * Add option `web_dashboard_open_on_launch` (allowing the dashboard to be enabled without opening a browser window) 
   * Add options `record_tool_usage_stats` and `token_count_estimator`
   * Serena config, modes and contexts can now be adjusted from the user's home directory.
   * Extended CLI to help with configuration
* Dashboard:
  * Displaying tool usage statistics if enabled in the config

Fixes:
* Fix `ExecuteShellCommandTool` and `GetCurrentConfigTool` hanging on Windows
* Fix project activation by name via `--project` not working (was broken in previous release) 
* Improve handling of indentation and newlines in symbolic editing tools
* Fix `InsertAfterSymbolTool` failing for insertions at the end of a file that did not end with a newline
* Fix `InsertBeforeSymbolTool` inserting in the wrong place in the absence of empty lines above the reference symbol
* Fix `ReplaceSymbolBodyTool` changing whitespace before/after the symbol
* Fix repository indexing not following links and catch exceptions during indexing, allowing indexing
  to continue even if unexpected errors occur for individual files.
* Fix `ImportError` in Ruby language server.
* Fix some issues with gitignore matching and interpreting of regexes in `search_for_pattern` tool.

# 2025-06-20

* **Overhaul and major improvement of editing tools!**
  This represents a very important change in Serena. Symbols can now be addressed by their `name_path` (including nested ones)
  and we introduced a regex-based replaced tools. We tuned the prompts and tested the new editing mechanism.
  It is much more reliable, flexible, and at the same time uses fewer tokens.
  The line-replacement tools are disabled by default and deprecated, we will likely remove them soon.
* **Better multi-project support and zero-config setup**: We significantly simplified the config setup, you no longer need to manually
  create `project.yaml` for each project. Project activation is now always available. 
  Any project can now be activated by just asking the LLM to do so and passing the path to a repo.
* Dashboard as web app and possibility to shut down Serena from it (or the old log GUI).
* Possibility to index your project beforehand, accelerating Serena's tools.
* Initial prompt for project supported (has to be added manually for the moment)
* Massive performance improvement of pattern search tool
* Use **process isolation** to fix stability issues and deadlocks (see #170). 
  This uses separate process for the MCP server, the Serena agent and the dashboard in order to fix asyncio-related issues.

# 2025-05-24

* Important new feature: **configurability of mode and context**, allowing better integration in a variety of clients.
  See corresponding section in readme - Serena can now be integrated in IDE assistants in a more productive way. 
  You can now also do things like switching to one-shot planning mode, ask to plan something (which will create a memory),
  then switch to interactive editing mode in the next conversation and work through the plan read from the memory.
* Some improvements to prompts.

# 2025-05-21

**Significant improvement in symbol finding!**

* Serena core:
    * `FindSymbolTool` now can look for symbols by specifying paths to them, not just the symbol name
* Language Servers:
    * Fixed `gopls` initialization
    * Symbols retrieved through the symbol tree or through overview methods now are linked to their parents


# 2025-05-19

* Serena core:
    * Bugfix in `FindSymbolTool` (a bug fixed in LS)
    * Fix in `ListDirTool`: Do not ignore files with extensions not understood by the language server, only skip ignored directories
      (error introduced in previous version)
    * Merged the two overview tools (for directories and files) into a single one: `GetSymbolsOverviewTool`
    * One-click setup for Cline enabled
    * `SearchForPatternTool` can now (optionally) search in the entire project
    * New tool `RestartLanguageServerTool` for restarting the language server (in case of other sources of editing apart from Serena)
    * Fix `CheckOnboardingPerformedTool`:
        * Tool description was incompatible with project change
        * Returned result was not as useful as it could be (now added list of memories)

* Language Servers:
    * Add further file extensions considered by the language servers for Python (.pyi), JavaScript (.jsx) and TypeScript (.tsx, .jsx)
    * Updated multilspy, adding support for Kotlin, Dart and C/C++ and several improvements.
    * Added support for PHP
    

# 2025-04-07

> **Breaking Config Changes**: make sure to set `ignore_all_files_in_gitignore`, remove `ignore_dirs`
>  and (optionally) set `ignore_paths` in your project configs. See [updated config template](myproject.template.yml)

* Serena core:
    * New tool: FindReferencingCodeSnippets
    * Adjusted prompt in CreateTextFileTool to prevent writing partial content (see [here](https://www.reddit.com/r/ClaudeAI/comments/1jpavtm/comment/mloek1x/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button)).
    * FindSymbolTool: allow passing a file for restricting search, not just a directory (Gemini was too dumb to pass directories)
    * Native support for gitignore files for configuring files to be ignored by serena. See also
      in *Language Servers* section below.
    * **Major Feature**: Allow Serena to switch between projects (project activation)
        * Add central Serena configuration in `serena_config.yml`, which 
            * contains the list of available projects
            * allows to configure whether project activation is enabled
            * now contains the GUI logging configuration (project configurations no longer do)
        * Add new tools `activate_project` and `get_active_project`
        * Providing a project configuration file in the launch parameters is now optional
* Logging:
    * Improve error reporting in case of initialization failure: 
      open a new GUI log window showing the error or ensure that the existing log window remains visible for some time
* Language Servers:
    * Fix C# language server initialization issue when the project path contains spaces
    * Native support for gitignore in overview, document-tree and find_references operations.
      This is an **important** addition, since previously things like `venv` and `node_modules` were scanned
      and were likely responsible for slowness of tools and even server crashes (presumably due to OOM errors).
* Agno: 
    * Fix Agno reloading mechanism causing failures when initializing the sqlite memory database #8
    * Fix Serena GUI log window not capturing logs after initialization

# 2025-04-01

Initial public version


================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Development Commands

**Essential Commands (use these exact commands):**
- `uv run poe format` - Format code (BLACK + RUFF) - ONLY allowed formatting command
- `uv run poe type-check` - Run mypy type checking - ONLY allowed type checking command  
- `uv run poe test` - Run tests with default markers (excludes java/rust by default)
- `uv run poe test -m "python or go"` - Run specific language tests
- `uv run poe test -m vue` - Run Vue tests
- `uv run poe lint` - Check code style without fixing

**Test Markers:**
Available pytest markers for selective testing:
- `python`, `go`, `java`, `rust`, `typescript`, `vue`, `php`, `perl`, `powershell`, `csharp`, `elixir`, `terraform`, `clojure`, `swift`, `bash`, `ruby`, `ruby_solargraph`
- `snapshot` - for symbolic editing operation tests

**Project Management:**
- `uv run serena-mcp-server` - Start MCP server from project root
- `uv run index-project` - Index project for faster tool performance

**Always run format, type-check, and test before completing any task.**

## Architecture Overview

Serena is a dual-layer coding agent toolkit:

### Core Components

**1. SerenaAgent (`src/serena/agent.py`)**
- Central orchestrator managing projects, tools, and user interactions
- Coordinates language servers, memory persistence, and MCP server interface
- Manages tool registry and context/mode configurations

**2. SolidLanguageServer (`src/solidlsp/ls.py`)**  
- Unified wrapper around Language Server Protocol (LSP) implementations
- Provides language-agnostic interface for symbol operations
- Handles caching, error recovery, and multiple language server lifecycle

**3. Tool System (`src/serena/tools/`)**
- **file_tools.py** - File system operations, search, regex replacements
- **symbol_tools.py** - Language-aware symbol finding, navigation, editing
- **memory_tools.py** - Project knowledge persistence and retrieval
- **config_tools.py** - Project activation, mode switching
- **workflow_tools.py** - Onboarding and meta-operations

**4. Configuration System (`src/serena/config/`)**
- **Contexts** - Define tool sets for different environments (desktop-app, agent, ide-assistant)
- **Modes** - Operational patterns (planning, editing, interactive, one-shot)
- **Projects** - Per-project settings and language server configs

### Language Support Architecture

Each supported language has:
1. **Language Server Implementation** in `src/solidlsp/language_servers/`
2. **Runtime Dependencies** - Automatic language server downloads when needed
3. **Test Repository** in `test/resources/repos/<language>/`
4. **Test Suite** in `test/solidlsp/<language>/`

### Memory & Knowledge System

- **Markdown-based storage** in `.serena/memories/` directories
- **Project-specific knowledge** persistence across sessions
- **Contextual retrieval** based on relevance
- **Onboarding support** for new projects

## Development Patterns

### Adding New Languages
1. Create language server class in `src/solidlsp/language_servers/`
2. Add to Language enum in `src/solidlsp/ls_config.py` 
3. Update factory method in `src/solidlsp/ls.py`
4. Create test repository in `test/resources/repos/<language>/`
5. Write test suite in `test/solidlsp/<language>/`
6. Add pytest marker to `pyproject.toml`

### Adding New Tools
1. Inherit from `Tool` base class in `src/serena/tools/tools_base.py`
2. Implement required methods and parameter validation
3. Register in appropriate tool registry
4. Add to context/mode configurations

### Testing Strategy
- Language-specific tests use pytest markers
- Symbolic editing operations have snapshot tests
- Integration tests in `test_serena_agent.py`
- Test repositories provide realistic symbol structures

## Configuration Hierarchy

Configuration is loaded from (in order of precedence):
1. Command-line arguments to `serena-mcp-server`
2. Project-specific `.serena/project.yml`
3. User config `~/.serena/serena_config.yml`
4. Active modes and contexts

## Key Implementation Notes

- **Symbol-based editing** - Uses LSP for precise code manipulation
- **Caching strategy** - Reduces language server overhead
- **Error recovery** - Automatic language server restart on crashes
- **Multi-language support** - 19 languages with LSP integration (including Vue)
- **MCP protocol** - Exposes tools to AI agents via Model Context Protocol
- **Async operation** - Non-blocking language server interactions

## Working with the Codebase

- Project uses Python 3.11 with `uv` for dependency management
- Strict typing with mypy, formatted with black + ruff
- Language servers run as separate processes with LSP communication
- Memory system enables persistent project knowledge
- Context/mode system allows workflow customization

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Serena

Thank you for your interest in contributing to Serena!

## Scope of Contributions

The following types of contributions can be submitted directly via pull requests:
  * isolated additions which do not change the behaviour of Serena and only extend it along existing lines (e.g., adding support for a new language server)
  * small bug fixes
  * documentation improvements

For other changes, please open an issue first to discuss your ideas with the maintainers.

When submitting a PR, ensure a well-defined scope.
Every PR should cover a single logical change or a set of closely related changes.

### Adding Support for a New Language Server

See the corresponding [memory](.serena/memories/adding_new_language_support_guide.md).

## Python Environment Setup

You can install a virtual environment with the required as follows

1. Create a new virtual environment: `uv venv`
2. Activate the environment:
    * On Linux/Unix/macOS or Windows with Git Bash: `source .venv/bin/activate`
    * On Windows outside of Git Bash: `.venv\Scripts\activate.bat` (in cmd/ps) or `source .venv/Scripts/activate` (in git-bash) 
3. Install the required packages with all extras: `uv sync --extra dev`

## Poe Tasks

We use poe to execute development tasks:

- `poe format` - run code auto-formatters
- `poe type-check` - run type checkers

## Testing Tool Executions

The Serena tools (and in fact all Serena code) can be executed without an LLM, and also without
any MCP specifics (though you can use the mcp inspector, if you want).

An example script for running tools is provided in [scripts/demo_run_tools.py](scripts/demo_run_tools.py).

================================================
FILE: DOCKER.md
================================================
# Docker Setup for Serena (Experimental)

⚠️ **EXPERIMENTAL FEATURE**: The Docker setup for Serena is still experimental and has some limitations. Please read this entire document before using Docker with Serena.

## Overview

Docker support allows you to run Serena in an isolated container environment, which provides better security isolation for the shell tool and consistent dependencies across different systems.

## Benefits

- **Safer shell tool execution**: Commands run in an isolated container environment
- **Consistent dependencies**: No need to manage language servers and dependencies on your host system
- **Cross-platform support**: Works consistently across Windows, macOS, and Linux

## Important Usage Pointers

### Configuration

Serena's configuration and log files are stored in the container in `/workspaces/serena/config/`.
Any local configuration you may have for Serena will not apply; the container uses its own separate configuration.

You can mount a local configuration/data directory to persist settings across container restarts
(which will also contain session log files).
Simply mount your local directory to `/workspaces/serena/config` in the container.
Initially, be sure to add a `serena_config.yml` file to the mounted directory which applies the following
special settings for Docker usage:
```
# Disable the GUI log window since it's not supported in Docker
gui_log_window: False
# Listen on all interfaces for the web dashboard to be accessible from outside the container
web_dashboard_listen_address: 0.0.0.0
# Disable opening the web dashboard on launch (not possible within the container)
web_dashboard_open_on_launch: False
```
Set other configuration options as needed.

### Project Activation Limitations

- **Only mounted directories work**: Projects must be mounted as volumes to be accessible
- Projects outside the mounted directories cannot be activated or accessed
- Since projects are not remembered across container restarts (unless you mount a local configuration as described above), 
  activate them using the full path (e.g. `/workspaces/projects/my-project`) when using dynamic project activation

### Language Support Limitations

The default Docker image does not include dependencies for languages that
require explicit system-level installations.
Only languages that install their requirements on the fly will work out of the box.

### Dashboard Port Configuration

The web dashboard runs on port 24282 (0x5EDA) by default. You can configure this using environment variables:

```bash
# Use default ports
docker-compose up serena

# Use custom ports
SERENA_DASHBOARD_PORT=8080 docker-compose up serena
```

⚠️ **Note**: If the local port is occupied, you'll need to specify a different port using the environment variable.

### Line Ending Issues on Windows

⚠️ **Windows Users**: Be aware of potential line ending inconsistencies:
- Files edited within the Docker container may use Unix line endings (LF)
- Your Windows system may expect Windows line endings (CRLF)
- This can cause issues with version control and text editors
- Configure your Git settings appropriately: `git config core.autocrlf true`

## Quick Start

### Using Docker Compose (Recommended)

1. **Production mode** (for using Serena as MCP server):
   ```bash
   docker-compose up serena
   ```

2. **Development mode** (with source code mounted):
   ```bash
   docker-compose up serena-dev
   ```

Note: Edit the `compose.yaml` file to customize volume mounts for your projects.

### Building the Docker Image Manually

```bash
# Build the image
docker build -t serena .

# Run with current directory mounted
docker run -it --rm \
  -v "$(pwd)":/workspace \
  -p 9121:9121 \
  -p 24282:24282 \
  -e SERENA_DOCKER=1 \
  serena
```

### Using Docker Compose with Merge Compose files

To use Docker Compose with merge files, you can create a `compose.override.yml` file to customize the configuration:

```yaml
services:
  serena:
    # To work with projects, you must mount them as volumes:
    volumes:
      - ./my-project:/workspace/my-project
      - /path/to/another/project:/workspace/another-project
    # Add the context for the IDE assistant option:
    command:
      - "uv run --directory . serena-mcp-server --transport sse --port 9121 --host 0.0.0.0 --context claude-code"
```

See the [Docker Merge Compose files documentation](https://docs.docker.com/compose/how-tos/multiple-compose-files/merge/) for more details on using merge files.

## Accessing the Dashboard

Once running, access the web dashboard at:
- Default: http://localhost:24282/dashboard
- Custom port: http://localhost:${SERENA_DASHBOARD_PORT}/dashboard

## Volume Mounting

To work with projects, you must mount them as volumes:

```yaml
# In compose.yaml
volumes:
  - ./my-project:/workspace/my-project
  - /path/to/another/project:/workspace/another-project
```

## Environment Variables

- `SERENA_DOCKER=1`: Set automatically to indicate Docker environment
- `SERENA_PORT`: MCP server port (default: 9121)
- `SERENA_DASHBOARD_PORT`: Web dashboard port (default: 24282)
- `INTELEPHENSE_LICENSE_KEY`: License key for Intelephense PHP LSP premium features (optional)

## Troubleshooting

### Port Already in Use

If you see "port already in use" errors:
```bash
# Check what's using the port
lsof -i :24282  # macOS/Linux
netstat -ano | findstr :24282  # Windows

# Use a different port
SERENA_DASHBOARD_PORT=8080 docker-compose up serena
```

### Configuration Issues

If you need to reset Docker configuration:
```bash
# Remove Docker-specific config
rm serena_config.docker.yml

# Serena will auto-generate a new one on next run
```

### Project Access Issues

Ensure projects are properly mounted:
- Check volume mounts in `docker-compose.yaml`
- Use absolute paths for external projects
- Verify permissions on mounted directories


================================================
FILE: Dockerfile
================================================
# Base stage with common dependencies
FROM python:3.11-slim AS base
SHELL ["/bin/bash", "-c"]

# Set environment variables to make Python print directly to the terminal and avoid .pyc files.
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

# Install system dependencies required for package manager and build tools.
# sudo, wget, zip needed for some assistants, like junie
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    build-essential \
    git \
    ssh \
    sudo \
    wget \
    zip \
    unzip \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install pipx.
RUN python3 -m pip install --no-cache-dir pipx \
    && pipx ensurepath

# Install nodejs
ENV NVM_VERSION=0.40.3
ENV NODE_VERSION=22.18.0
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v${NVM_VERSION}/install.sh | bash
# standard location
ENV NVM_DIR=/root/.nvm
RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
ENV PATH="${NVM_DIR}/versions/node/v${NODE_VERSION}/bin/:${PATH}"

# Add local bin to the path
ENV PATH="${PATH}:/root/.local/bin"

# Install the latest version of uv
RUN curl -LsSf https://astral.sh/uv/install.sh | sh

# Install Rust and rustup for rust-analyzer support (minimal profile)
ENV RUSTUP_HOME=/usr/local/rustup
ENV CARGO_HOME=/usr/local/cargo
ENV PATH="${CARGO_HOME}/bin:${PATH}"
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
    --default-toolchain stable \
    --profile minimal \
    && rustup component add rust-analyzer

# Set the working directory
WORKDIR /workspaces/serena

# Copy all files for development
COPY . /workspaces/serena/

# Install sed
RUN apt-get update && apt-get install -y sed

# Create Serena configuration
ENV SERENA_HOME=/workspaces/serena/config
RUN mkdir -p $SERENA_HOME
RUN cp src/serena/resources/serena_config.template.yml $SERENA_HOME/serena_config.yml
RUN sed -i 's/^gui_log_window: .*/gui_log_window: False/' $SERENA_HOME/serena_config.yml
RUN sed -i 's/^web_dashboard_listen_address: .*/web_dashboard_listen_address: 0.0.0.0/' $SERENA_HOME/serena_config.yml
RUN sed -i 's/^web_dashboard_open_on_launch: .*/web_dashboard_open_on_launch: False/' $SERENA_HOME/serena_config.yml

# Create virtual environment and install dependencies
RUN uv venv
RUN . .venv/bin/activate
RUN uv pip install -r pyproject.toml -e .
ENV PATH="/workspaces/serena/.venv/bin:${PATH}"

# Entrypoint to ensure environment is activated
ENTRYPOINT ["/bin/bash", "-c", "source .venv/bin/activate && $0 $@"]


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2025 Oraios AI

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<p align="center" style="text-align:center">
  <img src="resources/serena-logo.svg#gh-light-mode-only" style="width:500px">
  <img src="resources/serena-logo-dark-mode.svg#gh-dark-mode-only" style="width:500px">
</p>

* :rocket: Serena is a powerful **coding agent toolkit** capable of turning an LLM into a fully-featured agent that works **directly on your codebase**.
  Unlike most other tools, it is not tied to an LLM, framework or an interface, making it easy to use it in a variety of ways.
* :wrench: Serena provides essential **semantic code retrieval and editing tools** that are akin to an IDE's capabilities, extracting code entities at the symbol level and exploiting relational structure. When combined with an existing coding agent, these tools greatly enhance (token) efficiency.
* :free: Serena is **free & open-source**, enhancing the capabilities of LLMs you already have access to free of charge.

You can think of Serena as providing IDE-like tools to your LLM/coding agent. 
With it, the agent no longer needs to read entire files, perform grep-like searches or basic string replacements to find the right parts of the code and to edit code. 
Instead, it can use code-centric tools like `find_symbol`, `find_referencing_symbols` and `insert_after_symbol`.

<p align="center">
  <em>Serena is under active development! See the latest updates, upcoming features, and lessons learned to stay up to date.</em>
</p>

<p align="center">
  <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/Updates-1e293b?style=flat&logo=rss&logoColor=white&labelColor=1e293b" alt="Changelog" /></a>
  <a href="lessons_learned.md"><img src="https://img.shields.io/badge/Lessons-Learned-7c4700?style=flat&logo=readthedocs&logoColor=white&labelColor=7c4700" alt="Lessons Learned" /></a>
</p>

> [!TIP]
> The [**Serena JetBrains plugin**](#the-serena-jetbrains-plugin) has been released!

## LLM Integration

Serena provides the necessary [tools](https://oraios.github.io/serena/01-about/035_tools.html) for coding workflows, but an LLM is required to do the actual work,
orchestrating tool use.

In general, Serena can be integrated with an LLM in several ways:

* by using the **model context protocol (MCP)**.
  Serena provides an MCP server which integrates with
    * Claude Code and Claude Desktop,
    * terminal-based clients like Codex, Gemini-CLI, Qwen3-Coder, rovodev, OpenHands CLI and others,
    * IDEs like VSCode, Cursor or IntelliJ,
    * Extensions like Cline or Roo Code
    * Local clients like [OpenWebUI](https://docs.openwebui.com/openapi-servers/mcp), [Jan](https://jan.ai/docs/mcp-examples/browser/browserbase#enable-mcp), [Agno](https://docs.agno.com/introduction/playground) and others
* by using [mcpo to connect it to ChatGPT](docs/03-special-guides/serena_on_chatgpt.md) or other clients that don't support MCP but do support tool calling via OpenAPI.
* by incorporating Serena's tools into an agent framework of your choice, as illustrated [here](docs/03-special-guides/custom_agent.md).
  Serena's tool implementation is decoupled from the framework-specific code and can thus easily be adapted to any agent framework.

## Serena in Action

#### Demonstration 1: Efficient Operation in Claude Code

A demonstration of Serena efficiently retrieving and editing code within Claude Code, thereby saving tokens and time. Efficient operations are not only useful for saving costs, but also for generally improving the generated code's quality. This effect may be less pronounced in very small projects, but often becomes of crucial importance in larger ones.

https://github.com/user-attachments/assets/ab78ebe0-f77d-43cc-879a-cc399efefd87

#### Demonstration 2: Serena in Claude Desktop

A demonstration of Serena implementing a small feature for itself (a better log GUI) with Claude Desktop.
Note how Serena's tools enable Claude to find and edit the right symbols.

https://github.com/user-attachments/assets/6eaa9aa1-610d-4723-a2d6-bf1e487ba753

## Programming Language Support & Semantic Analysis Capabilities

Serena provides a set of versatile code querying and editing functionalities
based on symbolic understanding of the code.
Equipped with these capabilities, Serena discovers and edits code just like a seasoned developer
making use of an IDE's capabilities would.
Serena can efficiently find the right context and do the right thing even in very large and
complex projects!

There are two alternative technologies powering these capabilities:

* **Language servers** implementing the language server Protocol (LSP) — the free/open-source alternative.
* **The Serena JetBrains Plugin**, which leverages the powerful code analysis and editing
  capabilities of your JetBrains IDE.

You can choose either of these backends depending on your preferences and requirements.

### Language Servers

Serena incorporates a powerful abstraction layer for the integration of language servers
that implement the language server protocol (LSP).
The underlying language servers are typically open-source projects (like Serena) or at least freely available for use.

With Serena's LSP library, we provide **support for over 30 programming languages**, including
AL, Ansible, Bash, C#, C/C++, Clojure, Dart, Elixir, Elm, Erlang, Fortran, GLSL, Go, Groovy (partial support), Haskell, HLSL, Java, Javascript, Julia, Kotlin, Lean 4, Lua, Luau, Markdown, MATLAB, Nix, OCaml, Perl, PHP, PowerShell, Python, R, Ruby, Rust, Scala, Solidity, Swift, TOML, TypeScript, WGSL, YAML, and Zig.

> [!IMPORTANT]
> Some language servers require additional dependencies to be installed; see the [Language Support](https://oraios.github.io/serena/01-about/020_programming-languages.html) page for details.

### The Serena JetBrains Plugin

As an alternative to language servers, the [Serena JetBrains Plugin](https://plugins.jetbrains.com/plugin/28946-serena/)
leverages the powerful code analysis capabilities of your JetBrains IDE.
The plugin naturally supports all programming languages and frameworks that are supported by JetBrains IDEs,
including IntelliJ IDEA, PyCharm, Android Studio, WebStorm, PhpStorm, RubyMine, GoLand, and potentially others (Rider and CLion are unsupported though).

<a href="https://plugins.jetbrains.com/plugin/28946-serena/"><img src="docs/_static/images/jetbrains-marketplace-button.png"></a>

The plugin offers the most robust and most powerful Serena experience.
See our [documentation page](https://oraios.github.io/serena/02-usage/025_jetbrains_plugin.html) for further details and instructions.

## Quick Start

**Prerequisites**. Serena is managed by *uv*. If you don’t already have it, you need to [install uv](https://docs.astral.sh/uv/getting-started/installation/) before proceeding.

**Starting the MCP Server**. The easiest way to start the Serena MCP server is by running the latest version from GitHub using uvx.
Issue this command to see available options:

```bash
uvx --from git+https://github.com/oraios/serena serena start-mcp-server --help
```

**Configuring Your Client**. To connect Serena to your preferred MCP client, you typically need to [configure a launch command in your client](https://oraios.github.io/serena/02-usage/030_clients.html).
Follow the link for specific instructions on how to set up Serena for Claude Code, Codex, Claude Desktop, MCP-enabled IDEs and other clients (such as local and web-based GUIs). 

> [!TIP]
> While getting started quickly is easy, Serena is a powerful toolkit with many configuration options.
> We highly recommend reading through the [user guide](https://oraios.github.io/serena/02-usage/000_intro.html) to get the most out of Serena.
> 
> Specifically, we recommend to read about ...
>   * [Serena's project-based workflow](https://oraios.github.io/serena/02-usage/040_workflow.html) and
>   * [configuring Serena](https://oraios.github.io/serena/02-usage/050_configuration.html).

## User Guide

Please refer to the [user guide](https://oraios.github.io/serena/02-usage/000_intro.html) for detailed instructions on how to use Serena effectively.

## Community Feedback

Most users report that Serena has strong positive effects on the results of their coding agents, even when used within
very capable agents like Claude Code. Serena is often described to be a [game changer](https://www.reddit.com/r/ClaudeAI/comments/1lfsdll/try_out_serena_mcp_thank_me_later/), providing an enormous [productivity boost](https://www.reddit.com/r/ClaudeCode/comments/1mguoia/absolutely_insane_improvement_of_claude_code).

Serena excels at navigating and manipulating complex codebases, providing tools that support precise code retrieval and editing in the presence of large, strongly structured codebases.
However, when dealing with tasks that involve only very few/small files, you may not benefit from including Serena on top of your existing coding agent.
In particular, when writing code from scratch, Serena will not provide much value initially, as the more complex structures that Serena handles more gracefully than simplistic, file-based approaches are yet to be created.

Several videos and blog posts have talked about Serena:

* YouTube:
    * [AI Labs](https://www.youtube.com/watch?v=wYWyJNs1HVk&t=1s)
    * [Yo Van Eyck](https://www.youtube.com/watch?v=UqfxuQKuMo8&t=45s)
    * [JeredBlu](https://www.youtube.com/watch?v=fzPnM3ySmjE&t=32s)

* Blog posts:
    * [Serena's Design Principles](https://medium.com/@souradip1000/deconstructing-serenas-mcp-powered-semantic-code-understanding-architecture-75802515d116)
    * [Serena with Claude Code (in Japanese)](https://blog.lai.so/serena/)
    * [Turning Claude Code into a Development Powerhouse](https://robertmarshall.dev/blog/turning-claude-code-into-a-development-powerhouse/)

## Acknowledgements

### Sponsors

We are very grateful to our [sponsors](https://github.com/sponsors/oraios) who help us drive Serena's development. The core team
(the founders of [Oraios AI](https://oraios-ai.de/)) put in a lot of work in order to turn Serena into a useful open source project. 
So far, there is no business model behind this project, and sponsors are our only source of income from it.

Sponsors help us dedicating more time to the project, managing contributions, and working on larger features (like better tooling based on more advanced
LSP features, VSCode integration, debugging via the DAP, and several others).
If you find this project useful to your work, or would like to accelerate the development of Serena, consider becoming a sponsor.

We are proud to announce that the Visual Studio Code team, together with Microsoft’s Open Source Programs Office and GitHub Open Source
have decided to sponsor Serena with a one-time contribution!

<p align="center">
  <img src="resources/vscode_sponsor_logo.png" alt="Visual Studio Code sponsor logo" width="220">
</p>

### Community Contributions

A significant part of Serena, especially support for various languages, was contributed by the open source community.
We are very grateful for the many contributors who made this possible and who played an important role in making Serena
what it is today.

### Technologies
We built Serena on top of multiple existing open-source technologies, the most important ones being:

1. [multilspy](https://github.com/microsoft/multilspy).
   A library which wraps language server implementations and adapts them for interaction via Python.
   It provided the basis for our library Solid-LSP (`src/solidlsp`).
   Solid-LSP provides pure synchronous LSP calls and extends the original library with the symbolic logic
   that Serena required.
2. [Python MCP SDK](https://github.com/modelcontextprotocol/python-sdk)
3. All the language servers that we use through Solid-LSP.

Without these projects, Serena would not have been possible (or would have been significantly more difficult to build).

## Customizing and Extending Serena

It is straightforward to extend Serena's AI functionality with your own ideas.
Simply implement a new tool by subclassing
`serena.agent.Tool` and implement the `apply` method with a signature
that matches the tool's requirements.
Once implemented, `SerenaAgent` will automatically have access to the new tool.

It is also relatively straightforward to add [support for a new programming language](/.serena/memories/adding_new_language_support_guide.md).

We look forward to seeing what the community will come up with!
For details on contributing, see [contributing guidelines](/CONTRIBUTING.md).


================================================
FILE: compose.yaml
================================================
services:
  serena:
    image: serena:latest
    # To work with projects, you must mount them into /workspace/ in the container:
    # volumes:
      # - ./my-project:/workspace/my-project
      # - /path/to/another/project:/workspace/another-project
    build:
      context: ./
      dockerfile: Dockerfile
      target: production
    ports:
      - "${SERENA_PORT:-9121}:9121"  # MCP server port
      - "${SERENA_DASHBOARD_PORT:-24282}:24282"  # Dashboard port (default 0x5EDA = 24282)
    environment:
      - SERENA_DOCKER=1
    command:
      - "uv run --directory . serena-mcp-server --transport sse --port 9121 --host 0.0.0.0"
      # Alternatively add further arguments, e.g. a context
      # - "uv run --directory . serena-mcp-server --transport sse --port 9121 --host 0.0.0.0 --context ide"



================================================
FILE: docker_build_and_run.sh
================================================
#!/usr/bin/bash

docker build -t serena .

docker run -it --rm -v "$(pwd)":/workspace serena


================================================
FILE: docs/.gitignore
================================================
/_toc.yml
/jupyter_execute
/conf.py
/_build


================================================
FILE: docs/01-about/.gitignore
================================================
/035_tools.md

================================================
FILE: docs/01-about/000_intro.md
================================================
# About Serena

* Serena is a powerful **coding agent toolkit** capable of turning an LLM into a fully-featured agent that works
  **directly on your codebase**.
  Unlike most other tools, it is not tied to an LLM, framework or an interface, making it easy to use it in a variety of ways.
* Serena provides essential **semantic code retrieval and editing tools** that are akin to an IDE's capabilities,
  extracting code entities at the symbol level and exploiting relational structure.
  When combined with an existing coding agent, these tools greatly enhance (token) efficiency.
* Serena is **free & open-source**, enhancing the capabilities of LLMs you already have access to free of charge.

Therefore, you can think of Serena as providing IDE-like tools to your LLM/coding agent.
With it, the agent no longer needs to read entire files, perform grep-like searches or string replacements to find and
edit the right code.
Instead, it can use code-centred tools like `find_symbol`, `find_referencing_symbols` and `insert_after_symbol`.


================================================
FILE: docs/01-about/010_llm-integration.md
================================================
# LLM Integration

Serena provides the necessary [tools](035_tools) for coding workflows, but an LLM is required to do the actual work,
orchestrating tool use.

In general, Serena can be integrated with an LLM in several ways:

* by using the **model context protocol (MCP)**.
  Serena provides an MCP server which integrates with
    * Claude Code and Claude Desktop,
    * Terminal-based clients like Codex, Gemini-CLI, Qwen3-Coder, rovodev, OpenHands CLI and others,
    * IDEs like VSCode, Cursor or IntelliJ,
    * Extensions like Cline or Roo Code
    * Local clients like [OpenWebUI](https://docs.openwebui.com/openapi-servers/mcp), [Jan](https://jan.ai/docs/mcp-examples/browser/browserbase#enable-mcp), [Agno](https://docs.agno.com/introduction/playground) and others
* by using [mcpo to connect it to ChatGPT](../03-special-guides/serena_on_chatgpt.md) or other clients that don't support MCP but do support tool calling via OpenAPI.
* by incorporating Serena's tools into an agent framework of your choice, as illustrated [here](../03-special-guides/custom_agent).
  Serena's tool implementation is decoupled from the framework-specific code and can thus easily be adapted to any agent framework.


================================================
FILE: docs/01-about/020_programming-languages.md
================================================
# Language Support

Serena provides a set of versatile code querying and editing functionalities
based on symbolic understanding of the code.
Equipped with these capabilities, Serena discovers and edits code just like a seasoned developer
making use of an IDE's capabilities would.
Serena can efficiently find the right context and do the right thing even in very large and
complex projects!

There are two alternative technologies powering these capabilities:

* **Language servers** implementing the language server Protocol (LSP) — the free/open-source alternative.
* **The Serena JetBrains Plugin**, which leverages the powerful code analysis and editing
  capabilities of your JetBrains IDE.

You can choose either of these backends depending on your preferences and requirements.

## Language Servers

Serena incorporates a powerful abstraction layer for the integration of language servers 
that implement the language server protocol (LSP).
It even supports multiple language servers in parallel to support polyglot projects.

The language servers themselves are typically open-source projects (like Serena)
or at least freely available for use.

We currently provide direct, out-of-the-box support for the programming languages listed below.
Some languages require additional installations or setup steps, as noted.

* **AL**
* **Ansible**
  (experimental; requires Node.js and npm; automatically installs `@ansible/ansible-language-server`;
  must be explicitly specified in the `languages` entry in the `project.yml`; requires `ansible` in PATH for full functionality)
  the upstream `@ansible/ansible-language-server@1.2.3` supports hover, completion, definition,
  semantic tokens, and validation; document symbols, workspace symbols, references, and rename
  are not supported by this version)
* **Bash**
* **C#**  
  (by default, uses the Roslyn language server (language `csharp`), requiring [.NET v10+](https://dotnet.microsoft.com/en-us/download/dotnet) and, on Windows, `pwsh` ([PowerShell 7+](https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-windows?view=powershell-7.5));
  set language to `csharp_omnisharp` to use OmiSharp instead)
* **C/C++**  
  (by default, uses the clangd language server (language `cpp`) but we also support ccls (language `cpp_ccls`);
  for best results, provide a `compile_commands.json` at the repository root;
  see the [C/C++ Setup Guide](../03-special-guides/cpp_setup) for details.)
* **Clojure**
* **Dart**
* **Elixir**  
  (requires Elixir installation; Expert language server is downloaded automatically)
* **Elm**  
  (requires Elm compiler)
* **Erlang**  
  (requires installation of beam and [erlang_ls](https://github.com/erlang-ls/erlang_ls); experimental, might be slow or hang)
* **F#**  
  (requires [.NET v8.0+](https://dotnet.microsoft.com/en-us/download/dotnet); uses FsAutoComplete/Ionide, which is auto-installed; for Homebrew .NET on macOS, set DOTNET_ROOT in your environment)
* **Fortran**   
  (requires installation of fortls: `pip install fortls`)
* **Go**  
  (requires installation of `gopls`)
* **Groovy**  
  (requires local groovy-language-server.jar setup via `GROOVY_LS_JAR_PATH` or configuration)
* **Haskell**
  (automatically locates HLS via ghcup, stack, or system PATH; supports Stack and Cabal projects)
* **HLSL / GLSL / WGSL**
  (uses [shader-language-server](https://github.com/antaalt/shader-sense) (language `hlsl`); automatically downloaded;
  on macOS, requires Rust toolchain for building from source;
  note: reference search is not supported by this language server)
* **Java**  
* **JavaScript**  
  (supported via the TypeScript language server, i.e. use language `typescript` for both JavaScript and TypeScript)
* **Julia**
* **Kotlin**  
  (uses the pre-alpha [official kotlin LS](https://github.com/Kotlin/kotlin-lsp), some issues may appear)
* **Lean 4**  
  (requires `lean` and `lake` installed via [elan](https://github.com/leanprover/elan); uses the built-in Lean 4 LSP;
  the project must be a Lake project with `lake build` run before use)
* **Lua**
* **Luau**
* **Markdown**  
  (must explicitly enable language `markdown`, primarily useful for documentation-heavy projects)
* **Nix**  
  (requires nixd installation)
* **OCaml**
  (requires opam and ocaml-lsp-server to be installed manually; see the [OCaml Setup Guide](../03-special-guides/ocaml_setup_guide_for_serena.md))
* **Pascal**  
  (uses Pascal/Lazarus, which is automatically downloaded; set `PP` and `FPCDIR` environment variables for source navigation)
* **Perl**  
  (requires installation of Perl::LanguageServer)
* **PHP**  
  (by default, uses the Intelephense language server (language `php`), set `INTELEPHENSE_LICENSE_KEY` environment variable for premium features;
  we also support [Phpactor](https://github.com/phpactor/phpactor) (language `php_phpactor`), which requires PHP 8.1+)
* **Python**
* **R**  
  (requires installation of the `languageserver` R package)
* **Ruby**  
  (by default, uses [ruby-lsp](https://github.com/Shopify/ruby-lsp) (language `ruby`); use language `ruby_solargraph` to use Solargraph instead.)
* **Rust**  
  (requires [rustup](https://rustup.rs/) - uses rust-analyzer from your toolchain)
* **Scala**  
  (requires some [manual setup](../03-special-guides/scala_setup_guide_for_serena); uses Metals LSP)
* **Solidity**
  (experimental; requires Node.js and npm; automatically installs `@nomicfoundation/solidity-language-server`;
  works best with a `foundry.toml` or `hardhat.config.js` in the project root)
* **Swift**
* **TypeScript**
* **Vue**    
  (3.x with TypeScript; requires Node.js v18+ and npm; supports .vue Single File Components with monorepo detection)
* **YAML**
* **Zig**  
  (requires installation of ZLS - Zig Language Server)

Support for further languages can easily be added by providing a shallow adapter for a new language server implementation,
see Serena's [memory on that](https://github.com/oraios/serena/blob/main/.serena/memories/adding_new_language_support_guide.md).

## The Serena JetBrains Plugin

As an alternative to language servers, the [Serena JetBrains Plugin](https://plugins.jetbrains.com/plugin/28946-serena/)
leverages the powerful code analysis capabilities of JetBrains IDEs. 
The plugin naturally supports all programming languages and frameworks that are supported by JetBrains IDEs, 
including IntelliJ IDEA, PyCharm, Android Studio, WebStorm, PhpStorm, RubyMine, GoLand, and potentially others 
(Rider and CLion are unsupported though).

When using the plugin, Serena connects to an instance of your JetBrains IDE via the plugin. For users who already
work in a JetBrains IDE, this means Serena seamlessly integrates with the IDE instance you typically have open anyway,
requiring no additional setup or configuration beyond the plugin itself. This approach offers several key advantages:

* **External library indexing**: Dependencies and libraries are fully indexed and accessible to Serena
* **No additional setup**: No need to download or configure separate language servers
* **Enhanced performance**: Faster tool execution thanks to optimized IDE integration
* **Multi-language excellence**: First-class support for polyglot projects with multiple languages and frameworks

Even if you prefer to work in a different code editor, you can still benefit from the JetBrains plugin by running 
a JetBrains IDE instance (most have free community editions) alongside your preferred editor with your project 
opened and indexed. Serena will connect to the IDE for code analysis while you continue working in your editor 
of choice.

```{raw} html
<p>
<a href="https://plugins.jetbrains.com/plugin/28946-serena/">
<img style="background-color:transparent;" src="../_static/images/jetbrains-marketplace-button.png">
</a>
</p>
```

See the [JetBrains Plugin documentation](../02-usage/025_jetbrains_plugin) for usage details.


================================================
FILE: docs/01-about/030_serena-in-action.md
================================================
# Serena in Action

## Demonstration 1: Efficient Operation in Claude Code

A demonstration of Serena efficiently retrieving and editing code within Claude Code, thereby saving tokens and time. Efficient operations are not only useful for saving costs, but also for generally improving the generated code's quality. This effect may be less pronounced in very small projects, but often becomes of crucial importance in larger ones.

<video src="https://github.com/user-attachments/assets/ab78ebe0-f77d-43cc-879a-cc399efefd87"
controls
preload="metadata"
style="max-width: 100%; height: auto;">
Your browser does not support the video tag.
</video>

## Demonstration 2: Serena in Claude Desktop

A demonstration of Serena implementing a small feature for itself (a better log GUI) with Claude Desktop.
Note how Serena's tools enable Claude to find and edit the right symbols.

<video src="https://github.com/user-attachments/assets/6eaa9aa1-610d-4723-a2d6-bf1e487ba753"
controls
preload="metadata"
style="max-width: 100%; height: auto;">
Your browser does not support the video tag.
</video>


================================================
FILE: docs/01-about/040_comparison-to-other-agents.md
================================================
# Comparison with Other Coding Agents

To our knowledge, Serena is the first fully-featured coding agent where the
entire functionality is made available through an MCP server, 
thus not requiring additional API keys or subscriptions if access to an LLM
is already available through an MCP-compatible client.

## Subscription-Based Coding Agents

Many prominent subscription-based coding agents are parts of IDEs like
Windsurf, Cursor and VSCode.
Serena's functionality is similar to Cursor's Agent, Windsurf's Cascade or
VSCode's agent mode.

Serena has the advantage of not requiring a subscription.

More technical differences are:

* Serena navigates and edits code using a language server, so it has a symbolic
  understanding of the code.
  IDE-based tools often use a text search-based or purely text file-based approach, which is often
  less powerful, especially for large codebases.
* Serena is not bound to a specific interface (IDE or CLI).
  Serena's MCP server can be used with any MCP client (including some IDEs).
* Serena is not bound to a specific large language model or API.
* Serena is open-source and has a small codebase, so it can be easily extended
  and modified.

## API-Based Coding Agents

An alternative to subscription-based agents are API-based agents like Claude
Code, Cline, Aider, Roo Code and others, where the usage costs map directly
to the API costs of the underlying LLM.
Some of them (like Cline) can even be included in IDEs as an extension.
They are often very powerful and their main downside are the (potentially very
high) API costs.
Serena itself can be used as an API-based agent (see the [section on Agno](../03-special-guides/custom_agent.md)).

The main difference between Serena and other API-based agents is that Serena can
also be used as an MCP server, thus not requiring
an API key and bypassing the API costs.

## Other MCP-Based Coding Agents

There are other MCP servers designed for coding, like [DesktopCommander](https://github.com/wonderwhy-er/DesktopCommanderMCP) and
[codemcp](https://github.com/ezyang/codemcp).
However, to the best of our knowledge, none of them provide semantic code
retrieval and editing tools; they rely purely on text-based analysis.
It is the integration of language servers and the MCP that makes Serena unique
and so powerful for challenging coding tasks, especially in the context of
larger codebases.

================================================
FILE: docs/01-about/050_acknowledgements.md
================================================
# Acknowledgements

## Sponsors

We are very grateful to our [sponsors](https://github.com/sponsors/oraios), who help us drive Serena's development. 
The core team (the founders of [Oraios AI](https://oraios-ai.de/)) put in a lot of work in order to turn Serena into a useful open source project.
So far, there is no business model behind this project, and sponsors are our only source of income from it.

Sponsors help us dedicate more time to the project, managing contributions, and working on larger features (like better tooling based on more advanced
LSP features, VSCode integration, debugging via the DAP, and several others).
If you find this project useful to your work, or would like to accelerate the development of Serena, consider becoming a sponsor.

We are proud to announce that the Visual Studio Code team, together with Microsoft’s Open Source Programs Office and GitHub Open Source
have decided to sponsor Serena with a one-time contribution!

## Community Contributions

A significant part of Serena, especially support for various languages, was contributed by the open source community.
We are very grateful for the many contributors who made this possible and who played an important role in making Serena
what it is today.

## Technologies

We built Serena on top of multiple existing open-source technologies, the most important ones being:

1. [multilspy](https://github.com/microsoft/multilspy).
   A library which wraps language server implementations and adapts them for interaction via Python
   and which provided the basis for our library Solid-LSP (src/solidlsp).
   Solid-LSP provides pure synchronous LSP calls and extends the original library with the symbolic logic
   that Serena required.
2. [Python MCP SDK](https://github.com/modelcontextprotocol/python-sdk)
3. All the language servers that we use through Solid-LSP.

Without these projects, Serena would not have been possible (or would have been significantly more difficult to build).


================================================
FILE: docs/02-usage/000_intro.md
================================================
# Usage

Serena can be used in various ways and supports coding workflows through a project-based approach.
Its configuration is flexible and allows tailoring it to your specific needs.

In this section, you will find general usage instructions as well as concrete instructions for selected integrations.


================================================
FILE: docs/02-usage/010_prerequisites.md
================================================
# Prerequisites

## Package Manager: uv

Serena is managed by `uv`.
If you do not have it yet, install it following the instructions [here](https://docs.astral.sh/uv/getting-started/installation/).

## Language-Specific Requirements

Depending on the programming language you intend to use with Serena, you may need to install additional tools or SDKs if you 
intend to use the language server backend of Serena.  
See the [language support documentation](../01-about/020_programming-languages) for details. 


================================================
FILE: docs/02-usage/020_running.md
================================================
# Running Serena

Serena is a command-line tool with a variety of sub-commands.
This section describes
 * various ways of running Serena
 * how to run and configure the most important command, i.e. starting the MCP server
 * other useful commands.

## Ways of Running Serena

In the following, we will refer to the command used to run Serena as `<serena>`,
which you should replace with the appropriate command based on your chosen method,
as detailed below.

In general, to get help, append `--help` to the command, i.e.

    <serena> --help
    <serena> <command> --help

### Using uvx

`uvx` is part of `uv`. It can be used to run the latest version of Serena directly from the repository, without an explicit local installation.

    uvx --from git+https://github.com/oraios/serena serena 

Explore the CLI to see some of the customization options that serena provides (more info on them below).

### Local Installation

1. Clone the repository and change into it.

   ```shell
   git clone https://github.com/oraios/serena
   cd serena
   ```

2. Run Serena via

   ```shell
   uv run serena 
   ```

   when within the serena installation directory.   
   From other directories, run it with the `--directory` option, i.e.

   ```shell
    uv run --directory /abs/path/to/serena serena
    ```

:::{note}
Adding the `--directory` option results in the working directory being set to the Serena directory.
As a consequence, you will need to specify paths when using CLI commands that would otherwise operate on the current directory.
:::

(docker)=
### Using Docker 

The Docker approach offers several advantages:

* better security isolation for shell command execution
* no need to install language servers and dependencies locally
* consistent environment across different systems

You can run the Serena MCP server directly via Docker as follows,
assuming that the projects you want to work on are all located in `/path/to/your/projects`:

```shell
docker run --rm -i --network host -v /path/to/your/projects:/workspaces/projects ghcr.io/oraios/serena:latest serena 
```

This command mounts your projects into the container under `/workspaces/projects`, so when working with projects, 
you need to refer to them using the respective path (e.g. `/workspaces/projects/my-project`).

Alternatively, you may use Docker compose with the `compose.yml` file provided in the repository.
See our [advanced Docker usage](https://github.com/oraios/serena/blob/main/DOCKER.md) documentation for more detailed instructions, configuration options, and limitations.

:::{note}
Docker usage is subject to limitations; see the [advanced Docker usage](https://github.com/oraios/serena/blob/main/DOCKER.md) documentation for details.
:::

### Using Nix

If you are using Nix and [have enabled the `nix-command` and `flakes` features](https://nixos.wiki/wiki/flakes), you can run Serena using the following command:

```bash
nix run github:oraios/serena -- <command> [options]
```

You can also install Serena by referencing this repo (`github:oraios/serena`) and using it in your Nix flake. The package is exported as `serena`.

(start-mcp-server)=
## Running the MCP Server

Given your preferred method of running Serena, you can start the MCP server using the `start-mcp-server` command:

    <serena> start-mcp-server [options]  

Note that no matter how you run the MCP server, Serena will, by default, start a web-based dashboard on localhost that will allow you to inspect
the server's operations, logs, and configuration.

:::{tip}
By default, Serena will use language servers for code understanding and analysis.    
With the [Serena JetBrains Plugin](025_jetbrains_plugin), we recently introduced a powerful alternative,
which has several advantages over the language server-based approach.
:::

### Standard I/O Mode

The typical usage involves the client (e.g. Claude Code, Codex or Cursor) running
the MCP server as a subprocess and using the process' stdin/stdout streams to communicate with it.
In order to launch the server, the client thus needs to be provided with the command to run the MCP server.

:::{note}
MCP servers which use stdio as a protocol are somewhat unusual as far as client/server architectures go, as the server
necessarily has to be started by the client in order for communication to take place via the server's standard input/output streams.
In other words, you do not need to start the server yourself. The client application (e.g. Claude Desktop) takes care of this and
therefore needs to be configured with a launch command.
:::

Communication over stdio is the default for the Serena MCP server, so in the simplest
case, you can simply run the `start-mcp-server` command without any additional options.
 
    <serena> start-mcp-server

For example, to run the server in stdio mode via `uvx`, you would run:

    uvx --from git+https://github.com/oraios/serena serena start-mcp-server 
 
See the section ["Configuring Your MCP Client"](030_clients) for specific information on how to configure your MCP client (e.g. Claude Code, Codex, Cursor, etc.)
to use such a launch command.

(streamable-http)=
### Streamable HTTP Mode

When using *Streamable HTTP* mode, you control the server lifecycle yourself,
i.e. you start the server and provide the client with the URL to connect to it.

Simply provide `start-mcp-server` with the `--transport streamable-http` option and optionally provide the desired port
via the `--port` option.

    <serena> start-mcp-server --transport streamable-http --port <port>

For example, to run the Serena MCP server in streamable HTTP mode on port 9121 using uvx,
you would run

    uvx --from git+https://github.com/oraios/serena serena start-mcp-server --transport streamable-http --port 9121

and then configure your client to connect to `http://localhost:9121/mcp`.

**When to use.** Note that Serena is a stateful MCP server, and only one coding project can be active at a time.
Therefore, starting a single Serena instance and connecting it to multiple clients is only 
appropriate if all clients will be working on the same project.  
If you want several agents to work on different projects, making each client/agent start its own server
in stdio mode is likely the best option.
See section [The Project Workflow](040_workflow) for more information on how to manage projects in Serena.

The legacy SSE transport is also supported (via `--transport sse` with corresponding /sse endpoint), its use is discouraged.

(mcp-args)=
### MCP Server Command-Line Arguments

The Serena MCP server supports a wide range of additional command-line options.
Use the command

    <serena> start-mcp-server --help

to get a list of all available options.

Some useful options include:

  * `--project <path|name>`: specify the project to work on by name or path.
  * `--project-from-cwd`: auto-detect the project from current working directory     
    (looking for a directory containing `.serena/project.yml` or `.git` in parent directories and activating the containing directory as the project root, if any).
    This option is intended for CLI-based agents like Claude Code, Gemini and Codex, which are typically started from within the project directory
    and which do not change directories during their operation.
  * `--language-backend JetBrains`: use the Serena JetBrains Plugin as the language backend (overriding the default backend configured in the central configuration)
  * `--context <context>`: specify the operation [context](contexts) in which Serena shall operate
  * `--mode <mode>`: specify one or more [modes](modes) to enable (can be passed several times)
  * `--open-web-dashboard <true|false>`: whether to open the web dashboard on startup (enabled by default)

## Other Commands

Serena provides several other commands in addition to `start-mcp-server`, 
most of which are related to project setup and configuration.

To get a list of available commands, run:

    <serena> --help

To get help on a specific command, run:

    <serena> <command> --help

In general, add `--help` to any command or sub-command to get information about its usage and available options.

Here are some examples of commands you might find useful:

```bash
# get help about a sub-command
<serena> tools list --help

# list all available tools
<serena> tools list --all

# get detailed description of a specific tool
<serena> tools description find_symbol

# creating a new Serena project in the current directory 
<serena> project create

# creating and immediately indexing a project
<serena> project create --index

# indexing the project in the current directory (auto-creates if needed)
<serena> project index

# run a health check on the project in the current directory
<serena> project health-check

# check if a path is ignored by the project
<serena> project is_ignored_path path/to/check

# edit Serena's configuration file
<serena> config edit

# list available contexts
<serena> context list

# create a new context
<serena> context create my-custom-context

# edit a custom context
<serena> context edit my-custom-context

# list available modes
<serena> mode list

# create a new mode
<serena> mode create my-custom-mode

# edit a custom mode
<serena> mode edit my-custom-mode

# list available prompt definitions
<serena> prompts list

# create an override for internal prompts
<serena> prompts create-override prompt-name

# edit a prompt override
<serena> prompts edit-override prompt-name
```

Explore the full set of commands and options using the CLI itself!


================================================
FILE: docs/02-usage/025_jetbrains_plugin.md
================================================
# The Serena JetBrains Plugin

The [JetBrains Plugin](https://plugins.jetbrains.com/plugin/28946-serena/) allows Serena to
leverage the powerful code analysis and editing capabilities of your JetBrains IDE.

```{raw} html
<p>
<a href="https://plugins.jetbrains.com/plugin/28946-serena/">
<img style="background-color:transparent;" src="../_static/images/jetbrains-marketplace-button.png">
</a>
</p>
```

We recommend the JetBrains plugin as the preferred way of using Serena,
especially for users of JetBrains IDEs.

**Purchasing the JetBrains Plugin supports the Serena project.**
The proceeds from plugin sales allow us to dedicate more resources to further developing and improving Serena.


## Advantages of the JetBrains Plugin

There are multiple features that are only available when using the JetBrains plugin:

* **External library indexing**: Dependencies and libraries are fully indexed and accessible to Serena
* **No additional setup**: No need to download or configure separate language servers
* **Enhanced performance**: Faster tool execution thanks to optimized IDE integration
* **Multi-language excellence**: First-class support for polyglot projects with multiple languages and frameworks
* **Enhanced retrieval capabilities**: The plugin supports additional retrieval tools for type hierarchy information as well as fast and reliable documentation/type signature retrieval

We are also working on additional features like a `move_symbol` tool and debugging-related capabilities that
will be available exclusively through the JetBrains plugin.

## Configuring Serena to Use the JetBrains Plugin

After installing the plugin, you need to configure Serena to use it.

**Central Configuration**.

Edit the global Serena configuration file located at `~/.serena/serena_config.yml` 
(`%USERPROFILE%\.serena\serena_config.yml` on Windows).
Change the `language_backend` setting as follows:

```yaml
language_backend: JetBrains
```

*Note*: you can also use the button `Edit Global Serena Config` in the Serena MCP dashboard to open the config file in your default editor.

**Per-Instance Configuration**.
The configuration setting in the global config file can be overridden on a
per-instance basis by providing the arguments `--language-backend JetBrains` when
launching the Serena MCP server.

(per-project-language-backend)=
**Per-Project Configuration**.
You can also set the language backend on a per-project basis in the project's
`.serena/project.yml` file:

```yaml
language_backend: JetBrains
```

If set, this overrides the global `language_backend` setting for the session when the project is
activated at startup (via the `--project` flag).

:::{important}
The language backend is determined once at startup and cannot be changed during a running session.
If a project with a different backend is activated after startup, Serena will return an error.

If you need to work with projects that use different backends, you can either:
1. Use the `--project` flag to activate the project at startup, which will use its configured backend.
2. Configure separate MCP server instances (one per backend) in your client.
:::

**Verifying the Setup**.
You can verify that Serena is using the JetBrains plugin by either checking the dashboard, where
you will see `Languages:
Using JetBrains backend` in the configuration overview.
You will also notice that your client will use the JetBrains-specific tools like `jet_brains_find_symbol` and others like it.

## Workflow

Having installed the plugin in your IDE and having configured Serena to use the JetBrains backend,
the general workflow is simple:
1. Open the project you want to work on in your JetBrains IDE
2. Open the project's root folder as a project in Serena (see [Project Creation](project-creation-indexing) and [Project Activation](project-activation))
3. Start using Serena tools as usual

Note that the folder that is open in your IDE and the project's root folder must match.

:::{tip}
If you need to work on multiple projects in the same agent session, create a monorepo folder
containing all the projects and open that folder in both Serena and your IDE.
:::

## Advanced Usage and Configuration

### Using Serena with Multi-Module Projects

JetBrains IDEs support *multi-module projects*, where a project can reference other projects as modules.
Serena, however, requires that a project is self-contained within a single root folder. 
There has to be a one-to-one relationship between the project root folder and the folder that is open in the IDE.

Therefore, to get a multi-module setup working with Serena, the recommended approach is to create a **monorepo folder**,
i.e. a folder that contains all the projects as sub-folders, and open that monorepo folder in both Serena and your IDE.

You do not necessarily need to physically move your projects into a common parent folder; 
you can also use symbolic links to achieve the same effect 
(i.e. use `mklink` on Windows or `ln` on Linux/macOS to link the project folders into a common parent folder).

### Using Serena with Windows Subsystem for Linux (WSL)

JetBrains IDEs have built-in support for WSL, allowing you to run the IDE on Windows while working with code in the WSL environment.
The Serena JetBrains plugin works seamlessly in this setup as well.

#### Using JetBrains Remote Development 

Recommended constellation:
* Your project is in the WSL file system
* Serena is run in WSL (not Windows)
* The IDE has a host component (in WSL) and a client component (on Windows).  
  The Serena JetBrains plugin should normally be **installed in the host** (not the client) for code intelligence to be accessible.

:::{admonition} Plugin Installation Location
:class: note
If the plugin is already installed, check the options on the button for disabling the plugin.
Choose the respective options to ensure the correct installation location (i.e. host, removing it from the client if necessary).
:::

:::{admonition} Using mapped Windows paths in WSL is not recommended!
:class: warning
Keeping your project in the Windows file system and accessing it via `/mnt/` in WSL is extremely slow and not recommended.
:::

**Special Network Setup**.
If you are using a special setup where Serena and the IDE are running on different machines,
make sure Serena can communicate with the JetBrains plugin.
You can configure `jetbrains_plugin_server_address` in your [serena_config.yml](050_configuration) and
configure the listen address of the JetBrains plugin in the IDE via Settings / Tools / Serena
(e.g. set it to 0.0.0.0 to listen on all interfaces, but be aware of the security implications of doing so).

#### Other WSL Integrations (e.g. WSL interpreter) 

* Your project is in the Windows file system
* WSL is used only for running tools (e.g. using a WSL Python interpreter in the IDE)
* Serena, the IDE and the plugin are all running on Windows

In this constellation, no special setup is required.

## Serena Plugin Configuration Options

You can configure plugin options in the IDE under Settings / Tools / Serena.

 * **Listen address** (default: `127.0.0.1`)  
   the address the plugin's server listens on.  
   The default will work as long as Serena is running on the same machine (or on a virtual machine using mirrored networking).
   But if the Serena MCP server is running on a different machine, configure the listen address to ensure that connections are possible.
   You can use `0.0.0.0` to listen on all interfaces (but be aware of the security implications of doing so).

 * **Sync file system before every operation** (default: enabled)  
   whether to synchronise the file system state before processing requests from Serena.  
   This is important to ensure that the plugin does not read stale data, but it can have a performance impact, 
   especially when using slow file systems (e.g. WSL file system while the IDE is running on Windows).
   Note, however, that without synchronisation being forced by the Serena plugin, you will have to ensure synchronisation yourself.
   Operations that apply changes to files in your project that are *not* made either in the IDE itself or by Serena may not be seen by the IDE. 
   Normally, the IDE synchronises automatically when it has the focus, using file watchers to achieve this (though this may or may not work reliably for the WSL file system). 
   Also, if you are working primarily in another application (e.g. AI chat), the IDE may not have the focus frequently. 
   So when external changes are made to your project, you will have to either give the IDE the focus (if that works) or trigger a sync manually (right-click root folder / Reload from Disk).  
   Further, note that even an edit made using, for example, Claude Code's internal editing tools would count as an external modification.
   Only Serena's editing tools are "JetBrains-aware" and will tell the IDE to update the state of the edited file.
   So if you are making AI-based edits using tools other than Serena's tools, do make sure that the lack of synchronisation is not a problem if you decide to disable this option.

## Usage with Other Editors

We realize that not everyone uses a JetBrains IDE as their main code editor.
You can still take advantage of the JetBrains plugin by running a JetBrains IDE instance alongside your
preferred editor. Most JetBrains IDEs have a free community edition that you can use for this purpose.
You just need to make sure that the project you are working on is open and indexed in the JetBrains IDE, 
so that Serena can connect to it.


================================================
FILE: docs/02-usage/030_clients.md
================================================
# Connecting Your MCP Client

In the following, we provide general instructions on how to connect Serena to your MCP-enabled client,
as well as specific instructions for popular clients.

:::{note}
The configurations we provide for particular clients below will run the latest version of Serena
using the `stdio` protocol with `uvx`.  
Adapt the commands to your preferred way of [running Serena](020_running), adding any additional
command-line arguments as needed.
:::

(clients-general-instructions)=
## General Instructions

In general, Serena can be used with any MCP-enabled client.
To connect Serena to your favourite client, simply

1. determine how to add a custom MCP server to your client (refer to the client's documentation).
2. add a new MCP server entry by specifying either
    * a [run command](start-mcp-server) that allows the client to start the MCP server in stdio mode as a subprocess, or
    * the URL of the HTTP/SSE endpoint, having started the [Serena MCP server in HTTP/SSE mode](streamable-http) beforehand.

Find concrete examples for popular clients below.

Depending on your needs, you might want to further customize Serena's behaviour by
* [adding command-line arguments](mcp-args)
* [adjusting configuration](050_configuration).

**Mode of Operation**.
Note that some clients have a per-workspace MCP configuration (e.g, VSCode and Claude Code),
while others have a global MCP configuration (e.g. Codex and Claude Desktop).

- In the per-workspace case, you typically want to start Serena with your workspace directory as the project directory 
  and never switch to a different project. This is achieved by specifying the
  `--project <path>` argument with a single-project [context](#contexts) (e.g. `ide` or `claude-code`).
- In the global configuration case, you must first activate the project you want to work on, which you can do by asking
  the LLM to do so (e.g., "Activate the current dir as project using serena"). In such settings, the `activate_project`
  tool is required.

**Tool Selection**.
While you may be able to turn off tools through your client's interface (e.g., in VSCode or Claude Desktop),
we recommend selecting your base tool set through Serena's configuration, as Serena's prompts automatically
adjust based on which tools are enabled/disabled.  
A key mechanism for this is to use the appropriate [context](#contexts) when starting Serena.

(clients-common-pitfalls)=
### Common Pitfalls

**Escaping Paths Correctly**.
Note that if your client configuration uses JSON, special characters (like backslashes) need to be escaped properly.
In particular, if you are specifying paths containing backslashes on Windows
(note that you can also just use forward slashes), be sure to escape them correctly (`\\`).

**Discoverability of `uvx`**.
Your client may not find the `uvx` command, even if it is on your system PATH.
In this case, a workaround is to provide the full path to the `uvx` executable.

**Environment Variables**.
Some language servers may require additional environment variables to be set (e.g. F# on macOS with Homebrew),
which you may need to explicitly add to the MCP server configuration.
Note that for some clients (e.g. Claude Desktop), the spawned MCP server process may not inherit environment variables that
are only configured in your shell profile (e.g. `.bashrc`, `.zshrc`, etc.); they would need to be set system-wide instead.
An easy fix is to add them explicitly to the MCP server entry.
For example, in Claude Desktop and other clients, you can simply add an `env` key to the `serena`
object, e.g.

```
"env": {
    "DOTNET_ROOT": "/opt/homebrew/Cellar/dotnet/9.0.8/libexec"
}
```

## Claude Code

Serena is a great way to make Claude Code both cheaper and more powerful!

**Per-Project Configuration.** To add the Serena MCP server to the current project in the current directory, 
use this command:

```shell
claude mcp add serena -- uvx --from git+https://github.com/oraios/serena serena start-mcp-server --context claude-code --project "$(pwd)"
```

Note:
  * We use the `claude-code` context to disable unnecessary tools (avoiding duplication
    with Claude Code's built-in capabilities).
  * We specify the current directory as the project directory with `--project "$(pwd)"`, such 
    that Serena is configured to work on the current project from the get-go, following 
    Claude Code's mode of operation.

**Global Configuration**. Alternatively, use `--project-from-cwd` for user-level configuration that works across all projects:

```shell
claude mcp add --scope user serena -- uvx --from git+https://github.com/oraios/serena serena start-mcp-server --context=claude-code --project-from-cwd
```

Whenever you start Claude Code, Serena will search up from the current directory for `.serena/project.yml` or `.git` markers,
activating the containing directory as the project (if any). 
This mechanism makes it suitable for a single global MCP configuration.

**Maximum Token Efficiency.** To maximize token efficiency, you may want to use Claude Code's 
*on-demand tool loading* feature, which is supported since at least v2.0.74 of Claude Code.
This feature avoids sending all tool descriptions to Claude upon startup, thus saving tokens.
Instead, Claude will search for tools as needed (but there are no guarantees that it will 
search optimally, of course).
To enable this feature, set the environment variable `ENABLE_TOOL_SEARCH=true`.  
Depending on your shell, you can also set this on a per-session basis, e.g. using
```shell
ENABLE_TOOL_SEARCH=true claude
```
in bash/zsh, or using
```shell
set ENABLE_TOOL_SEARCH=true && claude
```
in Windows CMD to launch Claude Code.

## VSCode

While serena can be directly installed from the GitHub MCP server registry, we recommend to set it up manually
(at least for now, until the configuration there has been improved). Just paste the following into
`<your_project>/.vscode/mcp.json`, or edit the entry after using the option `install into workspace`:

```json
{
  "servers": {
    "oraios/serena": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/oraios/serena",
        "serena",
        "start-mcp-server",
        "--context",
        "ide",
        "--project",
        "${workspaceFolder}"
      ]
    }
  },
  "inputs": []
}
```

## Codex

Serena works with OpenAI's Codex CLI out of the box, but you have to use the `codex` context for it to work properly. (The technical reason is that Codex doesn't fully support the MCP specifications, so some massaging of tools is required.).

Add a [run command](020_running) to `~/.codex/config.toml` to configure Serena for all Codex sessions;
create the file if it does not exist.
For example, when using `uvx`, add the following section:

```toml
[mcp_servers.serena]
command = "uvx"
args = ["--from", "git+https://github.com/oraios/serena", "serena", "start-mcp-server", "--context", "codex"]
```

After codex has started, you need to activate the project, which you can do by saying:

> Call serena.activate_project, serena.check_onboarding_performed and serena.initial_instructions

**If you don't activate the project, you will not be able to use Serena's tools!**

It is recommend to set this prompt as a [custom prompt](https://developers.openai.com/codex/custom-prompts), so you don't need to type this every time.

That's it! Have a look at `~/.codex/log/codex-tui.log` to see if any errors occurred.

Serena's dashboard will run if you have not disabled it in the configuration, but due to Codex's sandboxing, the web browser
may not open automatically. You can open it manually by going to `http://localhost:24282/dashboard/index.html` (or a higher port, if
that was already taken).

> Codex will often show the tools as `failed` even though they are successfully executed. This is not a problem, seems to be a bug in Codex. Despite the error message, everything works as expected.

## Claude Desktop

On Windows and macOS, there are official [Claude Desktop applications by Anthropic](https://claude.ai/download); for Linux, there is an [open-source
community version](https://github.com/aaddrick/claude-desktop-debian).

To configure MCP server settings, go to File / Settings / Developer / MCP Servers / Edit Config,
which will let you open the JSON file `claude_desktop_config.json`.

Add the `serena` MCP server configuration

```json
{
  "mcpServers": {
    "serena": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/oraios/serena",
        "serena",
        "start-mcp-server"
      ]
    }
  }
}
```

If your language server requires specific environment variables to be set (e.g. F# on macOS with Homebrew),
you can add them via an `env` key (see [above](#clients-common-pitfalls)).

Once you have created the new MCP server entry, save the config and then restart Claude Desktop.

:::{attention}
Be sure to fully quit the Claude Desktop application via File / Exit, as regularly closing the application will just
minimize it.
:::

After restarting, you should see Serena's tools in your chat interface (notice the small hammer icon).

For more information on MCP servers with Claude Desktop,
see [the official quick start guide](https://modelcontextprotocol.io/quickstart/user).

## JetBrains Junie

Open Junie, go to the three dots in the top right corner, then Settings / MCP Settings and add Serena to Junie's global
MCP server configuration:

```json
{
  "mcpServers": {
    "serena": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/oraios/serena",
        "serena",
        "start-mcp-server",
        "--context",
        "ide"
      ]
    }
  }
}
```

You will have to prompt Junie to "Activate the current project using serena's activation tool" at the
start of each session.

## JetBrains AI Assistant

Here you can set up the more convenient per-project MCP server configuration, as the AI assistant supports specifying
the launch working directory.

Go to Settings / Tools / AI Assistant / MCP and add a new **local** configuration via the `as JSON` option:

```json
{
  "mcpServers": {
    "serena": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/oraios/serena",
        "serena",
        "start-mcp-server",
        "--context",
        "ide",
        "--project",
        "$(pwd)"
      ]
    }
  }
}
```

Then make sure to configure the working directory to be the project root.

## Antigravity

Add this configuration:

```json
{
  "mcpServers": {
    "serena": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/oraios/serena",
        "serena",
        "start-mcp-server",
        "--context",
        "ide"
      ]
    }
  }
}
```

You will have to prompt Antigravity's agent to "Activate the current project using serena's activation tool" after starting Antigravity in the project directory (once in the first chat enough, all other chat sessions will continue using the same Serena session).


Unlike VSCode, Antigravity does not currently support including the working directory in the MCP configuration.
Also, the current client will be shown as `none` in Serena's dashboard (Antigravity currently does not fully support the MCP specifications). This is not a problem, all tools will work as expected.

## Other Clients

For other clients, follow the [general instructions](#clients-general-instructions) above to set up Serena as an MCP server.

### Terminal-Based Clients

There are many terminal-based coding assistants that support MCP servers, such as

 * [Gemini-CLI](https://github.com/google-gemini/gemini-cli), 
 * [Qwen3-Coder](https://github.com/QwenLM/Qwen3-Coder),
 * [rovodev](https://community.atlassian.com/forums/Rovo-for-Software-Teams-Beta/Introducing-Rovo-Dev-CLI-AI-Powered-Development-in-your-terminal/ba-p/3043623),
 * [OpenHands CLI](https://docs.all-hands.dev/usage/how-to/cli-mode) and
 * [opencode](https://github.com/sst/opencode).

They generally benefit from the symbolic tools provided by Serena. You might want to customize some aspects of Serena
by writing your own context, modes or prompts to adjust it to the client's respective internal capabilities (and your general workflow).

In most cases, the `ide` context is likely to be appropriate for such clients, i.e. add the arguments `--context ide` 
in order to reduce tool duplication.

### MCP-Enabled IDEs and Coding Clients (Cline, Roo-Code, Cursor, Windsurf, etc.)

Most of the popular existing coding assistants (e.g. IDE extensions) and AI-enabled IDEs themselves support connections
to MCP Servers. Serena generally boosts performance by providing efficient tools for symbolic operations.

We generally recommend to use the `ide` context for these integrations by adding the arguments `--context ide` 
in order to reduce tool duplication.

### Local GUIs and Agent Frameworks

Over the last months, several technologies have emerged that allow you to run a local GUI client
and connect it to an MCP server. The respective applications will typically work with Serena out of the box.
Some of the leading open source GUI applications are

  * [Jan](https://jan.ai/docs/mcp), 
  * [OpenHands](https://github.com/All-Hands-AI/OpenHands/),
  * [OpenWebUI](https://docs.openwebui.com/openapi-servers/mcp) and 
  * [Agno](https://docs.agno.com/introduction/playground).

These applications allow to combine Serena with almost any LLM (including locally running ones) 
and offer various other integrations.


================================================
FILE: docs/02-usage/040_workflow.md
================================================
# The Project Workflow

Serena uses a project-based workflow.
A **project** is simply a directory on your filesystem that contains code and other files
that you want Serena to work with.

Assuming that you have project you want to work with (which may initially be empty),
setting up a project with Serena typically involves the following steps:

1. **Project creation**: Configuring project settings for Serena (and indexing the project, if desired)
2. **Project activation**: Making Serena aware of the project you want to work with
3. **Onboarding**: Getting Serena familiar with the project (creating memories)
4. **Working on coding tasks**: Using Serena to help you with actual coding tasks in the project

(project-creation-indexing)=
## Project Creation & Indexing

Project creation is the process of defining fundamental project settings that are relevant to Serena's operation.

You can create a project either  
 * implicitly, by just activating a directory as a project while already in a conversation; this will use default settings for your project (skip to the next section).
 * explicitly, using the project creation command, or

### Explicit Project Creation

To explicitly create a project, use the following command while in the project directory:

    <serena> project create [options]

For instance, when using `uvx`, run

    uvx --from git+https://github.com/oraios/serena serena project create [options]

 * For an empty project, you will need to specify the programming language
   (e.g., `--language python`). 
 * For an existing project, the main programming language will be detected automatically,
   but you can choose to explicitly specify multiple languages by passing the `--language` parameter
   multiple times (e.g. `--language python --language typescript`).
 * You can optionally specify a custom project name with `--name my-name`.
 * You can immediately index the project after creation with `--index`.

(project-config)=
#### Project Configuration

After creation, you can adjust the project settings in the generated `.serena/project.yml` file
within the project directory.

The file allows you to configure ...
  * the set of programming languages for which language servers are spawned (not relevant when using the JetBrains plugin)
    Note that you can dynamically add/remove language servers while Serena is running via the [Dashboard](060_dashboard).
  * the [language backend](per-project-language-backend) to use for this project (overriding the global setting)
  * the encoding used in source files
  * ignore rules
  * write access
  * an initial prompt that shall be passed to the LLM whenever the project is activated
  * the name by which you want to refer to the project (relevant when telling the LLM to dynamically activate the project)
  * the set of tools and modes to use by default

For detailed information on the parameters and possible settings, see the 
[template file](https://github.com/oraios/serena/blob/main/src/serena/resources/project.template.yml).

:::{note}
Many settings in project.yml *extend* or *override* settings in the global configuration file `serena_config.yml`.
So use the project configuration specifically for aspects that apply only to the particular project.
:::

**Local Overrides**. The project.yml file is intended to be versioned together with the project.
You can specify local overrides for the settings in a `project.local.yml` file in the same directory
(which, by default, is ignored by git). 
Any keys defined therein will override the respective key in `project.yml`.

(indexing)=
### Indexing

:::{note}
Indexing is not a relevant operation when using the JetBrains plugin, as indexing is handled by the IDE.
:::

Especially for larger project, it can be advisable to index the project after creation, pre-caching 
symbol information provided by the language server(s). This will avoid delays during the first tool invocation
that requires symbol information.

While in the project directory, run this command:
   
    <serena> project index

Indexing has to be called only once. During regular usage, Serena will automatically update the index whenever files change.

(project-activation)=
## Project Activation
   
Project activation makes Serena aware of the project you want to work with.
You can either choose to do this
 * while in a conversation, by telling the LLM to activate a project, e.g.,
       
      * "Activate the project /path/to/my_project" (for first-time activation with auto-creation)
      * "Activate the project my_project"
   
   Note that this option requires the `activate_project` tool to be active, 
   which it isn't in single-project [contexts](contexts) like `ide` or `claude-code` *if* a project is provided at startup.
   (The tool is deactivated, because we assume that in these contexts, user will only work on the single, open project and have
   no need to switch it.)

 * when the MCP server starts, by passing the project path or name as a command-line argument
   (e.g. when using a single-project mode like `ide` or `claude-code`): `--project <path|name>`

When working with the JetBrains plugin, be sure to have the same project folder open as a project in your IDE,
i.e. the folder that is activated in Serena should correspond to the root folder of the project in your IDE.

## Onboarding & Memories

By default, Serena will perform an **onboarding process** when
it is started for the first time for a project.
The goal of the onboarding is for Serena to get familiar with the project
and to store memories, which it can then draw upon in future interactions.

In general, **memories** provide a way for Serena to store and retrieve 
information about the project, relevant conventions, and other relevant aspects.

For more information on this, including how to manage
or disable these features, see [Memories & Onboarding](045_memories).


## Preparing Your Project

When using Serena to work on your project, it can be helpful to follow a few best practices.

### Structure Your Codebase

Serena uses the code structure for finding, reading and editing code. This means that it will
work well with well-structured code but may perform poorly on fully unstructured one (like a "God class"
with enormous, non-modular functions).

Furthermore, for languages that are not statically typed, the use of type annotations (if supported) 
are highly beneficial.

### Start from a Clean State

It is best to start a code generation task from a clean git state. Not only will
this make it easier for you to inspect the changes, but also the model itself will
have a chance of seeing what it has changed by calling `git diff` and thereby
correct itself or continue working in a followup conversation if needed.

### Use Platform-Native Line Endings

**Important**: since Serena will write to files using the system-native line endings
and it might want to look at the git diff, it is important to
set `git config core.autocrlf` to `true` on Windows.
With `git config core.autocrlf` set to `false` on Windows, you may end up with huge diffs
due to line endings only. 
It is generally a good idea to globally enable this git setting on Windows:

```shell
git config --global core.autocrlf true
```

### Logging, Linting, and Automated Tests

Serena can successfully complete tasks in an _agent loop_, where it iteratively
acquires information, performs actions, and reflects on the results.
However, Serena cannot use a debugger; it must rely on the results of program executions,
linting results, and test results to assess the correctness of its actions.
Therefore, software that is designed to meaningful interpretable outputs (e.g. log messages)
and that has a good test coverage is much easier to work with for Serena.

We generally recommend to start an editing task from a state where all linting checks and tests pass.

## Multiple Projects, Multiple Agents

There are several ways in which you might want to work with multiple projects simultaneously.

### A Single Agent Editing Multiple Projects Simultaneously

If fulfilling a task requires a single agent to edit code in multiple projects, the recommended approach is to create a **monorepo folder**,
i.e. a folder that contains all the projects as sub-folders, and open that monorepo folder as a project in Serena.
You may also use symbolic links to create a monorepo folder if the projects are located in different places on your filesystem.

If several languages are used across the projects, specify all of them as needed when using the LSP backend;
For JetBrains mode, make sure that your IDE is configured to work with all the languages used across the projects (e.g. by installing the respective language plugins).

(query-projects)=
### Reading from External Projects

If, while working on a project, you want Serena to be able to read code or other information from another project (e.g. a library or otherwise related project), 
this can be enabled via the `query_project` tool.
Provided that the project you want to query is known to Serena (i.e. you have created it as described above),
the `query_project` tool allows the agent to query files and symbolic information from that project.

To enable this tool, [activate the mode](modes) `query-projects`.
This also enables a second tool for listing projects that can be queried.

Depending on the language backend being used, the management of resources for the external projects varies:

* When using the JetBrains backend, make sure that every project for which you want symbolic queries to work is open in an IDE instance. 
* When using the LSP backend, executing symbolic tools via the query tool requires that Serena's **Project Server** be started,
  which will automatically spawn the necessary language servers for the projects that are queried.

  To start the server, run

      <serena> start-project-server

  where `<serena>` is your way of running Serena. For example, when using `uvx`, run

      uvx --from git+https://github.com/oraios/serena serena start-project-server

### Multiple Agents Accessing a Single Serena Instance

If you want multiple agents to access the same project via a single Serena instance,
i.e. you do not want several instances of Serena (including its language servers) to be running,
you can achieve this by [starting the Serena MCP server in HTTP mode](streamable-http)
and connecting all client agents to the same HTTP endpoint.
The agents will then share the resources of the single Serena instance.

### Multiple Agents Working on Different Projects

For this use case, simply run a separate instance of Serena for each project, which naturally
occurs when Serena is started by the MCP client in stdio mode.

================================================
FILE: docs/02-usage/045_memories.md
================================================
# Memories & Onboarding

Serena provides the functionality of a fully featured agent, and a useful aspect of this is Serena's memory system.
Despite its simplicity, we received positive feedback from many users who tend to combine it with their
agent's internal memory management (e.g., `AGENTS.md` files).

## Memories

Memories are simple, human-readable Markdown files that both you and
your agent can create, read, and edit. 

Serena differentiates between 
  * **project-specific memories**, which are stored in the `.serena/memories/` directory within your project folder, and
  * **global memories**, which are shared across all projects and, by default, are stored in `~/.serena/memories/global/`

The LLM is informed about the existence of memories and instructed to read them when appropriate, 
inferring appropriateness from the file name.
When the agent starts working on a project, it receives the list of available memories. 
The agent should be instructed to update memories by the user when appropriate.

### Organizing Memories

Memories can be organized into **topics** by using `/` in the memory name (e.g. `modules/frontend`).
The structure is mapped to the file system, where topics correspond to subdirectories.
The `list_memories` tool can filter by topic, allowing the agent to explore even large numbers of memories in a structured way.

(global-memories)=
### Global Memories

Global memories use the top-level topic `global`, i.e. whenever a memory name starts with `global/`, 
it is stored in the global memories directory and is shared across all projects.

By default, deletion and editing of global memories is allowed.
If you want to protect them from accidental modification by the agent,
you can add regex patterns to `read_only_memory_patterns` in your global or
project-level [configuration](050_configuration). For example, setting "global/.*" will mark all global memories as read-only. The agent will be informed which memories are read-only.

Since global memories are not versioned alongside your project files,
it can be helpful to track global memories with git (i.e. to make `~/.serena/memories/` a git repository)
in order to have a history of changes and the possibility to revert them if needed.

### Manually Editing Memories

You may edit memories directly in the file system, using your preferred text editor or IDE.
Alternatively, access them via the [Serena Dashboard](060_dashboard), which provides a graphical interface for
viewing, creating, editing, and deleting memories while Serena is running.

(onboarding)=
## Onboarding

By default, Serena performs an **onboarding process** when it encounters a project
for the first time (i.e., when no project memories exist yet).
The goal of the onboarding is for Serena to get familiar with the project —
its structure, build system, testing setup, and other essential aspects —
and to store this knowledge as memories for future interactions.

In further project activations, Serena will check whether onboarding was already
performed by looking for existing project memories and will skip the onboarding
process if memories are found.

### How Onboarding Works

1. When a project is activated, Serena checks whether onboarding was already
   performed (by checking if any memories exist).
2. If no memories are found, Serena triggers the onboarding process, which
   reads key files and directories to understand the project.
3. The gathered information is written into project-specific memory files (see above).

### Tips for Onboarding

- **Context usage**: The onboarding process will read a lot of content from the project,
  filling up the context window. It is therefore advisable to **switch to a new conversation**
  once the onboarding is complete.
- **LLM failures**: If an LLM fails to complete the onboarding and does not actually
  write the respective memories to disk, you may need to ask it to do so explicitly.
- **Review the results**: After onboarding, we recommend having a quick look at the
  generated memories and editing them or adding new ones as needed.

## Disabling Memories and Onboarding

If you do not require the functionality described in this section, you can selectively disable it.

 * To disable all memory related tools (including onboarding), adding `no-memories` to the `base_modes`
   in Serena's [global configuration](050_configuration).
 * Similarly, to disable only onboarding, add `no-onboarding` to the `base_modes`.


================================================
FILE: docs/02-usage/050_configuration.md
================================================
# Configuration

Serena is very flexible in terms of configuration. While for most users, the default configurations will work,
you can fully adjust it to your needs.

You can disable tools, change Serena's fundamental instructions
(what we denote as the `system_prompt`), adjust the output of tools that just provide a prompt, 
and even adjust tool descriptions.

Serena is configured in using a multi-layered approach:

 * **global configuration** (`serena_config.yml`, see below)
 * **project configuration** (`project.yml`, see [Project Configuration](project-config))
 * **contexts and modes** for composable configuration, which can be enabled on a case-by-case basis (see below)
 * **command-line parameters** passed to the `start-mcp-server` server command (overriding/extending configured settings)  
   See [MCP Server Command-Line Arguments](mcp-args) for further information.  

(global-config)=
## Global Configuration

The global configuration file allows you to change general settings and defaults that will apply to all projects unless overridden.

### Settings

Some of the configurable settings include:
  * the language backend to use by default (i.e., the JetBrains plugin or language servers);
    this can also be [overridden per project](per-project-language-backend)
  * UI settings affecting the [Serena Dashboard and GUI tool](060_dashboard.md)
  * the set of tools to enable/disable by default
  * the set of modes to use by default
  * tool execution parameters (timeout, max. answer length)
  * global ignore rules
  * logging settings
  * advanced settings specific to individual language servers (see [below](ls-specific-settings))

The global configuration settings apply to all projects.
Some of the settings it contains can, however, be *extended* or *overridden* in project-specific settings, contexts and modes.

For detailed information on the parameters and possible settings, see the
[template file](https://github.com/oraios/serena/blob/main/src/serena/resources/serena_config.template.yml).

### Accessing the Configuration File

The configuration file is auto-created when you first run Serena. It is stored in your user directory:
  * Linux/macOS/Git-Bash: `~/.serena/serena_config.yml`
  * Windows (CMD/PowerShell): `%USERPROFILE%\.serena\serena_config.yml`

You can access it
  * through [Serena's dashboard](060_dashboard) while Serena is running (use the respective button) 
  * directly, using your favourite text editor
  * using the command

    ```shell
    <serena> config edit
    ```

    where `<serena>` is [your way of running Serena](020_running).

## Modes and Contexts

Serena's behaviour and toolset can be adjusted using contexts and modes.
These allow for a high degree of customization to best suit your workflow and the environment Serena is operating in.

(contexts)=
### Contexts

A **context** defines the general environment in which Serena is operating.
It influences the initial system prompt and the set of available tools.
A context is set at startup when launching Serena (e.g., via CLI options for an MCP server or in the agent script) and cannot be changed during an active session.

Serena comes with pre-defined contexts:

* `desktop-app`: Tailored for use with desktop applications like Claude Desktop. This is the default.
  The full set of Serena's tools is provided, as the application is assumed to have no prior coding-specific capabilities.
* `claude-code`: Optimized for use with Claude Code, it disables tools that would duplicate Claude Code's built-in capabilities.
* `codex`: Optimized for use with OpenAI Codex.
* `ide`: Generic context for IDE assistants/coding agents, e.g. VSCode, Cursor, or Cline, focusing on augmenting existing capabilities.
  Basic file operations and shell execution are assumed to be handled by the assistant's own capabilities.
* `agent`: Designed for scenarios where Serena acts as a more autonomous agent, for example, when used with Agno.

Choose the context that best matches the type of integration you are using.

Find the concrete definitions of the above contexts [here](https://github.com/oraios/serena/tree/main/src/serena/resources/config/contexts).

Note that the contexts `ide` and `claude-code` are **single-project contexts** (defining `single_project: true`).
For such contexts, if a project is provided at startup, the set of tools is limited to those required by the project's
concrete configuration, and other tools are excluded completely, allowing the set of tools to be minimal.
Tools explicitly disabled by the project will not be available at all. Since changing the active project
ceases to be a relevant operation in this case, the project activation tool is disabled.

When launching Serena, specify the context using `--context <context-name>`.
Note that for cases where parameter lists are specified (e.g. Claude Desktop), you must add two parameters to the list.

If you are using a local server (such as Llama.cpp) which requires you to use OpenAI-compatible tool descriptions, use context `oaicompat-agent` instead of `agent`.

You can manage contexts using the `context` command,

    <serena> context --help
    <serena> context list
    <serena> context create <context-name>
    <serena> context edit <context-name>
    <serena> context delete <context-name>

where `<serena>` is [your way of running Serena](020_running).

(modes)=
### Modes

Modes further refine Serena's behavior for specific types of tasks or interaction styles. Multiple modes can be active simultaneously, allowing you to combine their effects. Modes influence the system prompt and can also alter the set of available tools by excluding certain ones.

Examples of built-in modes include:

* `planning`: Focuses Serena on planning and analysis tasks.
* `editing`: Optimizes Serena for direct code modification tasks.
* `interactive`: Suitable for a conversational, back-and-forth interaction style.
* `one-shot`: Configures Serena for tasks that should be completed in a single response, often used with `planning` for generating reports or initial plans.
* `no-onboarding`: Skips the initial onboarding process if it's not needed for a particular session but retains the memory tools (assuming initial memories were created externally).
* `onboarding`: Focuses on the project onboarding process.
* `no-memories`: Disables all memory tools (and tools building on memories such as onboarding tools)
* `query-projects`: Enables tools for querying other Serena projects (without activating them); see section [Reading from External Projects](query-projects) 

Find the concrete definitions of these modes [here](https://github.com/oraios/serena/tree/main/src/serena/resources/config/modes).

Active modes are configured in (from lowest to highest precedence):
  * the global configuration file (`serena_config.yml`)
  * the project configuration file (`project.yml`)
  * at startup via command-line parameters

The two former sources define both **base modes** and **default modes**.
Ultimately, the active modes are the union of base modes and default modes (after applying all overrides).
Command-line parameters override default modes but not base modes.
Base modes should thus be used to define modes that you always want to be active, regardless of command-line parameters.

Command-line parameters for overriding default modes:
When launching the MCP sever, specify modes using `--mode <mode-name>`; multiple modes can be specified, e.g. `--mode planning --mode no-onboarding`.

:::{important}
By default, Serena activates the two modes `interactive` and `editing` (as defined in the global configuration).

As soon as you start to specify modes via the command line, only the modes you explicitly specify will be active, however.
Therefore, if you want to keep the default modes, you must specify them as well.  
For example, to add mode `no-memories` to the default behaviour, specify
```shell
--mode interactive --mode editing --mode no-memories
```

If you want to keep certain modes as always active, regardless of command-line parameters, 
define them as *base modes* in the global or project configuration.
:::

Modes can also be _switched dynamically_ during a session. 
You can instruct the LLM to use the `switch_modes` tool to activate a different set of modes (e.g., "Switch to planning and one-shot modes").
Like command-line parameters, this only affects default modes, not base modes (which remain active).

:::{note}
**Mode Compatibility**: While you can combine modes, some may be semantically incompatible (e.g., `interactive` and `one-shot`). 
Serena currently does not prevent incompatible combinations; it is up to the user to choose sensible mode configurations.
:::

You can manage modes using the `mode` command,

    <serena> mode --help
    <serena> mode list
    <serena> mode create <mode-name>
    <serena> mode edit <mode-name>
    <serena> mode delete <mode-name>

where `<serena>` is [your way of running Serena](020_running).

## Advanced Configuration

For advanced users, Serena's configuration can be further customized.

### Serena Data Directory

The Serena user data directory (where configuration, language server files, logs, etc. are stored) defaults to `~/.serena`.
You can change this location by setting the `SERENA_HOME` environment variable to your desired path.

### Per-Project Serena Folder Location

By default, each project stores its Serena data (memories, caches, etc.) in a `.serena` folder inside the project root.
You can customize this location globally via the `project_serena_folder_location` setting in `serena_config.yml`.

The setting supports two placeholders:

| Placeholder          | Description                                     |
|----------------------|-------------------------------------------------|
| `$projectDir`        | The absolute path to the project root directory |
| `$projectFolderName` | The name of the project folder                  |

**Examples:**

```yaml
# Default: data stored inside the project directory
project_serena_folder_location: "$projectDir/.serena"

# Central location: all project data under a shared directory
project_serena_folder_location: "/projects-metadata/$projectFolderName/.serena"
```

When a project is loaded, Serena uses the following fallback logic:
1. Check if a `.serena` folder exists at the configured path.
2. If not, check if one exists in the project root (default/legacy location).
3. If neither exists, create the folder at the configured path.

This ensures backward compatibility: existing projects that already have a `.serena` folder in the project root will continue to work, even after changing the `project_serena_folder_location` setting.

(ls-specific-settings)=
### Language Server-Specific Settings

:::{note} 
**Advanced Users Only**: The settings described in this section are intended for advanced users who need to fine-tune language server behavior.
Most users will not need to adjust these settings.
:::

Under the key `ls_specific_settings` in `serena_config.yml`, you can you pass per-language, 
language server-specific configuration.

Structure:

```yaml
ls_specific_settings:
  <language>:
    # language-server-specific keys
```

:::{attention}
Most settings are currently undocumented. Please refer to the 
[source code of the respective language server](https://github.com/oraios/serena/tree/main/src/solidlsp/language_servers) 
implementation to determine supported settings.
:::

#### Overriding the Language Server Path

Some language servers, particularly those that use a single core path for the language server (e.g. the main executable),
support overriding that path via the `ls_path` setting.
Therefore, if you have installed the language server yourself and want to use your installation 
instead of Serena's managed installation, you can set the `ls_path` setting as follows:

```yaml
ls_specific_settings:
  <language>:
    ls_path: "/path/to/language-server"
```

This is supported by all language servers deriving their dependency provider from  `LanguageServerDependencyProviderSinglePath`.
Currently, this includes the following languages: `bash`, `clojure`, `cpp`, `kotlin`, `markdown`, `php`, `php_phpactor`, `python`, `rust`, `toml`, `typescript`, `yaml`.
We will add support for more languages over time.

#### C# (Roslyn Language Server)

Serena uses [Microsoft's Roslyn Language Server](https://github.com/dotnet/roslyn) for C# support.

**Runtime Requirements:**

- .NET 10 or higher is required. If not found in PATH, Serena automatically installs it using Microsoft's official install scripts.
- The Roslyn Language Server is automatically downloaded from NuGet.org.

**Supported Platforms:**

Automatic download is supported for: Windows (x64, ARM64), macOS (x64, ARM64), Linux (x64, ARM64).

**Configuration:**

The `runtime_dependencies` setting allows you to override the download URLs for the Roslyn Language Server. This is useful if you need to use a private package mirror or a specific version.

Example configuration to override the language server download URL:

```yaml
ls_specific_settings:
  csharp:
    runtime_dependencies:
      - id: "CSharpLanguageServer"
        platform_id: "linux-x64"  # or win-x64, win-arm64, osx-x64, osx-arm64, linux-arm64
        url: "https://your-mirror.example.com/roslyn-language-server.linux-x64.5.5.0-2.26078.4.nupkg"
        package_version: "5.5.0-2.26078.4"
```

Available fields for `runtime_dependencies` entries:

| Field             | Description                                                                 |
| ----------------- | --------------------------------------
Download .txt
gitextract_gsbdxo3q/

├── .devcontainer/
│   └── devcontainer.json
├── .dockerignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   ├── feature_request.md
│   │   └── issue--bug--performance-problem--question-.md
│   ├── copilot-instructions.md
│   └── workflows/
│       ├── codespell.yml
│       ├── docker.yml
│       ├── docs.yaml
│       ├── junie.yml
│       ├── publish.yml
│       └── pytest.yml
├── .gitignore
├── .serena/
│   ├── .gitignore
│   ├── memories/
│   │   ├── adding_new_language_support_guide.md
│   │   ├── serena_core_concepts_and_architecture.md
│   │   ├── serena_repository_structure.md
│   │   └── suggested_commands.md
│   └── project.yml
├── CHANGELOG.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── DOCKER.md
├── Dockerfile
├── LICENSE
├── README.md
├── compose.yaml
├── docker_build_and_run.sh
├── docs/
│   ├── .gitignore
│   ├── 01-about/
│   │   ├── .gitignore
│   │   ├── 000_intro.md
│   │   ├── 010_llm-integration.md
│   │   ├── 020_programming-languages.md
│   │   ├── 030_serena-in-action.md
│   │   ├── 040_comparison-to-other-agents.md
│   │   └── 050_acknowledgements.md
│   ├── 02-usage/
│   │   ├── 000_intro.md
│   │   ├── 010_prerequisites.md
│   │   ├── 020_running.md
│   │   ├── 025_jetbrains_plugin.md
│   │   ├── 030_clients.md
│   │   ├── 040_workflow.md
│   │   ├── 045_memories.md
│   │   ├── 050_configuration.md
│   │   ├── 060_dashboard.md
│   │   ├── 065_logs.md
│   │   ├── 070_security.md
│   │   └── 999_additional-usage.md
│   ├── 03-special-guides/
│   │   ├── 000_intro.md
│   │   ├── cpp_setup.md
│   │   ├── custom_agent.md
│   │   ├── groovy_setup_guide_for_serena.md
│   │   ├── ocaml_setup_guide_for_serena.md
│   │   ├── scala_setup_guide_for_serena.md
│   │   └── serena_on_chatgpt.md
│   ├── _config.yml
│   ├── autogen_docs.py
│   ├── create_toc.py
│   └── index.md
├── flake.nix
├── lessons_learned.md
├── llms-install.md
├── pyproject.toml
├── repo_dir_sync.py
├── resources/
│   ├── jetbrains-marketplace-button.cdr
│   ├── serena-icons.cdr
│   └── serena-logo.cdr
├── scripts/
│   ├── agno_agent.py
│   ├── demo_run_tools.py
│   ├── gen_prompt_factory.py
│   ├── mcp_server.py
│   ├── print_language_list.py
│   ├── print_mode_context_options.py
│   ├── print_tool_overview.py
│   └── profile_tool_call.py
├── src/
│   ├── README.md
│   ├── interprompt/
│   │   ├── .syncCommitId.remote
│   │   ├── .syncCommitId.this
│   │   ├── __init__.py
│   │   ├── jinja_template.py
│   │   ├── multilang_prompt.py
│   │   ├── prompt_factory.py
│   │   └── util/
│   │       ├── __init__.py
│   │       └── class_decorators.py
│   ├── serena/
│   │   ├── __init__.py
│   │   ├── agent.py
│   │   ├── agno.py
│   │   ├── analytics.py
│   │   ├── cli.py
│   │   ├── code_editor.py
│   │   ├── config/
│   │   │   ├── __init__.py
│   │   │   ├── context_mode.py
│   │   │   └── serena_config.py
│   │   ├── constants.py
│   │   ├── dashboard.py
│   │   ├── generated/
│   │   │   └── generated_prompt_factory.py
│   │   ├── gui_log_viewer.py
│   │   ├── jetbrains/
│   │   │   ├── jetbrains_plugin_client.py
│   │   │   └── jetbrains_types.py
│   │   ├── ls_manager.py
│   │   ├── mcp.py
│   │   ├── project.py
│   │   ├── project_server.py
│   │   ├── prompt_factory.py
│   │   ├── resources/
│   │   │   ├── config/
│   │   │   │   ├── contexts/
│   │   │   │   │   ├── agent.yml
│   │   │   │   │   ├── chatgpt.yml
│   │   │   │   │   ├── claude-code.yml
│   │   │   │   │   ├── codex.yml
│   │   │   │   │   ├── context.template.yml
│   │   │   │   │   ├── desktop-app.yml
│   │   │   │   │   ├── ide.yml
│   │   │   │   │   └── oaicompat-agent.yml
│   │   │   │   ├── internal_modes/
│   │   │   │   │   └── jetbrains.yml
│   │   │   │   ├── modes/
│   │   │   │   │   ├── editing.yml
│   │   │   │   │   ├── interactive.yml
│   │   │   │   │   ├── mode.template.yml
│   │   │   │   │   ├── no-memories.yml
│   │   │   │   │   ├── no-onboarding.yml
│   │   │   │   │   ├── onboarding.yml
│   │   │   │   │   ├── one-shot.yml
│   │   │   │   │   ├── planning.yml
│   │   │   │   │   └── query-projects.yml
│   │   │   │   └── prompt_templates/
│   │   │   │       ├── simple_tool_outputs.yml
│   │   │   │       └── system_prompt.yml
│   │   │   ├── dashboard/
│   │   │   │   ├── dashboard.css
│   │   │   │   ├── dashboard.js
│   │   │   │   ├── index.html
│   │   │   │   └── news/
│   │   │   │       ├── 20260111.html
│   │   │   │       └── 20260303.html
│   │   │   ├── project.local.template.yml
│   │   │   ├── project.template.yml
│   │   │   └── serena_config.template.yml
│   │   ├── symbol.py
│   │   ├── task_executor.py
│   │   ├── tools/
│   │   │   ├── __init__.py
│   │   │   ├── cmd_tools.py
│   │   │   ├── config_tools.py
│   │   │   ├── file_tools.py
│   │   │   ├── jetbrains_tools.py
│   │   │   ├── memory_tools.py
│   │   │   ├── query_project_tools.py
│   │   │   ├── symbol_tools.py
│   │   │   ├── tools_base.py
│   │   │   └── workflow_tools.py
│   │   └── util/
│   │       ├── class_decorators.py
│   │       ├── cli_util.py
│   │       ├── dataclass.py
│   │       ├── dotnet.py
│   │       ├── exception.py
│   │       ├── file_system.py
│   │       ├── git.py
│   │       ├── gui.py
│   │       ├── inspection.py
│   │       ├── logging.py
│   │       ├── shell.py
│   │       ├── text_utils.py
│   │       ├── thread.py
│   │       ├── version.py
│   │       └── yaml.py
│   └── solidlsp/
│       ├── .gitignore
│       ├── __init__.py
│       ├── language_servers/
│       │   ├── al_language_server.py
│       │   ├── ansible_language_server.py
│       │   ├── bash_language_server.py
│       │   ├── ccls_language_server.py
│       │   ├── clangd_language_server.py
│       │   ├── clojure_lsp.py
│       │   ├── common.py
│       │   ├── csharp_language_server.py
│       │   ├── dart_language_server.py
│       │   ├── eclipse_jdtls.py
│       │   ├── elixir_tools/
│       │   │   ├── README.md
│       │   │   ├── __init__.py
│       │   │   └── elixir_tools.py
│       │   ├── elm_language_server.py
│       │   ├── erlang_language_server.py
│       │   ├── fortran_language_server.py
│       │   ├── fsharp_language_server.py
│       │   ├── gopls.py
│       │   ├── groovy_language_server.py
│       │   ├── haskell_language_server.py
│       │   ├── hlsl_language_server.py
│       │   ├── intelephense.py
│       │   ├── jedi_server.py
│       │   ├── julia_server.py
│       │   ├── kotlin_language_server.py
│       │   ├── lean4_language_server.py
│       │   ├── lua_ls.py
│       │   ├── luau_lsp.py
│       │   ├── marksman.py
│       │   ├── matlab_language_server.py
│       │   ├── nixd_ls.py
│       │   ├── ocaml_lsp_server.py
│       │   ├── omnisharp/
│       │   │   ├── initialize_params.json
│       │   │   ├── runtime_dependencies.json
│       │   │   └── workspace_did_change_configuration.json
│       │   ├── omnisharp.py
│       │   ├── pascal_server.py
│       │   ├── perl_language_server.py
│       │   ├── phpactor.py
│       │   ├── powershell_language_server.py
│       │   ├── pyright_server.py
│       │   ├── r_language_server.py
│       │   ├── regal_server.py
│       │   ├── ruby_lsp.py
│       │   ├── rust_analyzer.py
│       │   ├── scala_language_server.py
│       │   ├── solargraph.py
│       │   ├── solidity_language_server.py
│       │   ├── sourcekit_lsp.py
│       │   ├── systemverilog_server.py
│       │   ├── taplo_server.py
│       │   ├── terraform_ls.py
│       │   ├── typescript_language_server.py
│       │   ├── vts_language_server.py
│       │   ├── vue_language_server.py
│       │   ├── yaml_language_server.py
│       │   └── zls.py
│       ├── ls.py
│       ├── ls_config.py
│       ├── ls_exceptions.py
│       ├── ls_process.py
│       ├── ls_request.py
│       ├── ls_types.py
│       ├── ls_utils.py
│       ├── lsp_protocol_handler/
│       │   ├── lsp_constants.py
│       │   ├── lsp_requests.py
│       │   ├── lsp_types.py
│       │   └── server.py
│       ├── settings.py
│       └── util/
│           ├── cache.py
│           ├── metals_db_utils.py
│           ├── subprocess_util.py
│           └── zip.py
├── sync.py
└── test/
    ├── __init__.py
    ├── conftest.py
    ├── resources/
    │   └── repos/
    │       ├── al/
    │       │   └── test_repo/
    │       │       ├── app.json
    │       │       └── src/
    │       │           ├── Codeunits/
    │       │           │   ├── CustomerMgt.Codeunit.al
    │       │           │   └── PaymentProcessorImpl.Codeunit.al
    │       │           ├── Enums/
    │       │           │   └── CustomerType.Enum.al
    │       │           ├── Interfaces/
    │       │           │   └── IPaymentProcessor.Interface.al
    │       │           ├── Pages/
    │       │           │   ├── CustomerCard.Page.al
    │       │           │   └── CustomerList.Page.al
    │       │           ├── TableExtensions/
    │       │           │   └── Item.TableExt.al
    │       │           └── Tables/
    │       │               └── Customer.Table.al
    │       ├── ansible/
    │       │   └── test_repo/
    │       │       ├── inventory/
    │       │       │   └── hosts.yml
    │       │       ├── playbook.yml
    │       │       └── roles/
    │       │           └── common/
    │       │               ├── defaults/
    │       │               │   └── main.yml
    │       │               ├── handlers/
    │       │               │   └── main.yml
    │       │               └── tasks/
    │       │                   └── main.yml
    │       ├── bash/
    │       │   └── test_repo/
    │       │       ├── config.sh
    │       │       ├── main.sh
    │       │       └── utils.sh
    │       ├── clojure/
    │       │   └── test_repo/
    │       │       ├── deps.edn
    │       │       └── src/
    │       │           └── test_app/
    │       │               ├── core.clj
    │       │               └── utils.clj
    │       ├── cpp/
    │       │   └── test_repo/
    │       │       ├── a.cpp
    │       │       ├── b.cpp
    │       │       ├── b.hpp
    │       │       └── compile_commands.json
    │       ├── csharp/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── Models/
    │       │       │   └── Person.cs
    │       │       ├── Program.cs
    │       │       ├── TestProject.csproj
    │       │       └── serena.sln
    │       ├── dart/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       └── pubspec.yaml
    │       ├── elixir/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── lib/
    │       │       │   ├── examples.ex
    │       │       │   ├── ignored_dir/
    │       │       │   │   └── ignored_module.ex
    │       │       │   ├── models.ex
    │       │       │   ├── services.ex
    │       │       │   ├── test_repo.ex
    │       │       │   └── utils.ex
    │       │       ├── mix.exs
    │       │       ├── scripts/
    │       │       │   └── build_script.ex
    │       │       └── test/
    │       │           ├── models_test.exs
    │       │           └── test_repo_test.exs
    │       ├── elm/
    │       │   └── test_repo/
    │       │       ├── Main.elm
    │       │       ├── Utils.elm
    │       │       └── elm.json
    │       ├── erlang/
    │       │   └── test_repo/
    │       │       ├── hello.erl
    │       │       ├── ignored_dir/
    │       │       │   └── ignored_module.erl
    │       │       ├── include/
    │       │       │   ├── records.hrl
    │       │       │   └── types.hrl
    │       │       ├── math_utils.erl
    │       │       ├── rebar.config
    │       │       ├── src/
    │       │       │   ├── app.erl
    │       │       │   ├── models.erl
    │       │       │   ├── services.erl
    │       │       │   └── utils.erl
    │       │       └── test/
    │       │           ├── models_tests.erl
    │       │           └── utils_tests.erl
    │       ├── fortran/
    │       │   └── test_repo/
    │       │       ├── main.f90
    │       │       └── modules/
    │       │           ├── geometry.f90
    │       │           └── math_utils.f90
    │       ├── fsharp/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── Calculator.fs
    │       │       ├── Models/
    │       │       │   └── Person.fs
    │       │       ├── Program.fs
    │       │       ├── README.md
    │       │       └── TestProject.fsproj
    │       ├── go/
    │       │   └── test_repo/
    │       │       ├── buildtags/
    │       │       │   ├── foo.go
    │       │       │   └── notfoo.go
    │       │       ├── go.mod
    │       │       └── main.go
    │       ├── groovy/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── build.gradle
    │       │       └── src/
    │       │           └── main/
    │       │               └── groovy/
    │       │                   └── com/
    │       │                       └── example/
    │       │                           ├── Main.groovy
    │       │                           ├── Model.groovy
    │       │                           ├── ModelUser.groovy
    │       │                           └── Utils.groovy
    │       ├── haskell/
    │       │   └── test_repo/
    │       │       ├── app/
    │       │       │   └── Main.hs
    │       │       ├── package.yaml
    │       │       ├── src/
    │       │       │   ├── Calculator.hs
    │       │       │   └── Helper.hs
    │       │       └── stack.yaml
    │       ├── hlsl/
    │       │   └── test_repo/
    │       │       ├── common.hlsl
    │       │       ├── compute_test.hlsl
    │       │       ├── lighting.hlsl
    │       │       └── terrain/
    │       │           └── terrain_sdf.hlsl
    │       ├── java/
    │       │   └── test_repo/
    │       │       ├── pom.xml
    │       │       └── src/
    │       │           └── main/
    │       │               └── java/
    │       │                   └── test_repo/
    │       │                       ├── Main.java
    │       │                       ├── Model.java
    │       │                       ├── ModelUser.java
    │       │                       └── Utils.java
    │       ├── julia/
    │       │   └── test_repo/
    │       │       ├── lib/
    │       │       │   └── helper.jl
    │       │       └── main.jl
    │       ├── kotlin/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── build.gradle.kts
    │       │       └── src/
    │       │           └── main/
    │       │               └── kotlin/
    │       │                   └── test_repo/
    │       │                       ├── Main.kt
    │       │                       ├── Model.kt
    │       │                       ├── ModelUser.kt
    │       │                       └── Utils.kt
    │       ├── lean4/
    │       │   └── test_repo/
    │       │       ├── Helper.lean
    │       │       ├── Main.lean
    │       │       ├── lake-manifest.json
    │       │       ├── lakefile.lean
    │       │       └── lean-toolchain
    │       ├── lua/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── main.lua
    │       │       ├── src/
    │       │       │   ├── calculator.lua
    │       │       │   └── utils.lua
    │       │       └── tests/
    │       │           └── test_calculator.lua
    │       ├── luau/
    │       │   └── test_repo/
    │       │       ├── .luaurc
    │       │       └── src/
    │       │           ├── init.luau
    │       │           └── module.luau
    │       ├── markdown/
    │       │   └── test_repo/
    │       │       ├── CONTRIBUTING.md
    │       │       ├── README.md
    │       │       ├── api.md
    │       │       └── guide.md
    │       ├── matlab/
    │       │   └── test_repo/
    │       │       ├── Calculator.m
    │       │       └── main.m
    │       ├── nix/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── default.nix
    │       │       ├── flake.nix
    │       │       ├── lib/
    │       │       │   └── utils.nix
    │       │       ├── modules/
    │       │       │   └── example.nix
    │       │       └── scripts/
    │       │           └── hello.sh
    │       ├── ocaml/
    │       │   └── test_repo/
    │       │       ├── bin/
    │       │       │   ├── dune
    │       │       │   └── main.ml
    │       │       ├── dune-project
    │       │       ├── lib/
    │       │       │   ├── dune
    │       │       │   ├── test_repo.ml
    │       │       │   └── test_repo.mli
    │       │       ├── test/
    │       │       │   ├── dune
    │       │       │   └── test_test_repo.ml
    │       │       └── test_repo.opam
    │       ├── pascal/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       └── main.pas
    │       ├── perl/
    │       │   └── test_repo/
    │       │       ├── helper.pl
    │       │       └── main.pl
    │       ├── php/
    │       │   └── test_repo/
    │       │       ├── helper.php
    │       │       ├── index.php
    │       │       ├── sample.php
    │       │       └── simple_var.php
    │       ├── powershell/
    │       │   └── test_repo/
    │       │       ├── PowerShellEditorServices.json
    │       │       ├── main.ps1
    │       │       └── utils.ps1
    │       ├── python/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── custom_test/
    │       │       │   ├── __init__.py
    │       │       │   └── advanced_features.py
    │       │       ├── examples/
    │       │       │   ├── __init__.py
    │       │       │   └── user_management.py
    │       │       ├── scripts/
    │       │       │   ├── __init__.py
    │       │       │   └── run_app.py
    │       │       └── test_repo/
    │       │           ├── __init__.py
    │       │           ├── complex_types.py
    │       │           ├── models.py
    │       │           ├── name_collisions.py
    │       │           ├── nested.py
    │       │           ├── nested_base.py
    │       │           ├── overloaded.py
    │       │           ├── services.py
    │       │           ├── utils.py
    │       │           └── variables.py
    │       ├── r/
    │       │   └── test_repo/
    │       │       ├── .Rbuildignore
    │       │       ├── DESCRIPTION
    │       │       ├── NAMESPACE
    │       │       ├── R/
    │       │       │   ├── models.R
    │       │       │   └── utils.R
    │       │       └── examples/
    │       │           └── analysis.R
    │       ├── rego/
    │       │   └── test_repo/
    │       │       ├── policies/
    │       │       │   ├── authz.rego
    │       │       │   └── validation.rego
    │       │       └── utils/
    │       │           └── helpers.rego
    │       ├── ruby/
    │       │   └── test_repo/
    │       │       ├── .solargraph.yml
    │       │       ├── examples/
    │       │       │   └── user_management.rb
    │       │       ├── lib.rb
    │       │       ├── main.rb
    │       │       ├── models.rb
    │       │       ├── nested.rb
    │       │       ├── services.rb
    │       │       └── variables.rb
    │       ├── rust/
    │       │   ├── test_repo/
    │       │   │   ├── Cargo.toml
    │       │   │   └── src/
    │       │   │       ├── lib.rs
    │       │   │       └── main.rs
    │       │   └── test_repo_2024/
    │       │       ├── Cargo.toml
    │       │       └── src/
    │       │           ├── lib.rs
    │       │           └── main.rs
    │       ├── scala/
    │       │   ├── build.sbt
    │       │   ├── project/
    │       │   │   ├── build.properties
    │       │   │   ├── metals.sbt
    │       │   │   └── plugins.sbt
    │       │   └── src/
    │       │       └── main/
    │       │           └── scala/
    │       │               └── com/
    │       │                   └── example/
    │       │                       ├── Main.scala
    │       │                       └── Utils.scala
    │       ├── solidity/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── contracts/
    │       │       │   ├── Token.sol
    │       │       │   ├── interfaces/
    │       │       │   │   └── IERC20.sol
    │       │       │   └── lib/
    │       │       │       └── SafeMath.sol
    │       │       └── foundry.toml
    │       ├── swift/
    │       │   └── test_repo/
    │       │       ├── Package.swift
    │       │       └── src/
    │       │           ├── main.swift
    │       │           └── utils.swift
    │       ├── systemverilog/
    │       │   └── test_repo/
    │       │       ├── alu.sv
    │       │       ├── counter.sv
    │       │       ├── top.sv
    │       │       └── types.svh
    │       ├── terraform/
    │       │   └── test_repo/
    │       │       ├── data.tf
    │       │       ├── main.tf
    │       │       ├── outputs.tf
    │       │       └── variables.tf
    │       ├── toml/
    │       │   └── test_repo/
    │       │       ├── Cargo.toml
    │       │       ├── config.toml
    │       │       └── pyproject.toml
    │       ├── typescript/
    │       │   └── test_repo/
    │       │       ├── index.ts
    │       │       ├── tsconfig.json
    │       │       ├── use_helper.ts
    │       │       └── ws_manager.js
    │       ├── vue/
    │       │   └── test_repo/
    │       │       ├── .gitignore
    │       │       ├── index.html
    │       │       ├── package.json
    │       │       ├── src/
    │       │       │   ├── App.vue
    │       │       │   ├── components/
    │       │       │   │   ├── CalculatorButton.vue
    │       │       │   │   ├── CalculatorDisplay.vue
    │       │       │   │   └── CalculatorInput.vue
    │       │       │   ├── composables/
    │       │       │   │   ├── useFormatter.ts
    │       │       │   │   └── useTheme.ts
    │       │       │   ├── main.ts
    │       │       │   ├── stores/
    │       │       │   │   └── calculator.ts
    │       │       │   └── types/
    │       │       │       └── index.ts
    │       │       ├── tsconfig.json
    │       │       ├── tsconfig.node.json
    │       │       └── vite.config.ts
    │       ├── yaml/
    │       │   └── test_repo/
    │       │       ├── config.yaml
    │       │       ├── data.yaml
    │       │       └── services.yml
    │       └── zig/
    │           └── test_repo/
    │               ├── .gitignore
    │               ├── build.zig
    │               ├── src/
    │               │   ├── calculator.zig
    │               │   ├── main.zig
    │               │   └── math_utils.zig
    │               └── zls.json
    ├── serena/
    │   ├── __init__.py
    │   ├── __snapshots__/
    │   │   └── test_symbol_editing.ambr
    │   ├── config/
    │   │   ├── __init__.py
    │   │   ├── test_global_ignored_paths.py
    │   │   └── test_serena_config.py
    │   ├── test_cli_project_commands.py
    │   ├── test_edit_marker.py
    │   ├── test_jetbrains_plugin_client.py
    │   ├── test_mcp.py
    │   ├── test_serena_agent.py
    │   ├── test_set_modes.py
    │   ├── test_symbol.py
    │   ├── test_symbol_editing.py
    │   ├── test_task_executor.py
    │   ├── test_text_utils.py
    │   ├── test_tool_parameter_types.py
    │   └── util/
    │       ├── test_exception.py
    │       └── test_file_system.py
    └── solidlsp/
        ├── al/
        │   └── test_al_basic.py
        ├── ansible/
        │   ├── __init__.py
        │   └── test_ansible_basic.py
        ├── bash/
        │   ├── __init__.py
        │   └── test_bash_basic.py
        ├── clojure/
        │   ├── __init__.py
        │   └── test_clojure_basic.py
        ├── cpp/
        │   ├── __init__.py
        │   └── test_cpp_basic.py
        ├── csharp/
        │   ├── test_csharp_basic.py
        │   └── test_csharp_nuget_download.py
        ├── dart/
        │   ├── __init__.py
        │   └── test_dart_basic.py
        ├── elixir/
        │   ├── __init__.py
        │   ├── conftest.py
        │   ├── test_elixir_basic.py
        │   ├── test_elixir_ignored_dirs.py
        │   ├── test_elixir_integration.py
        │   └── test_elixir_symbol_retrieval.py
        ├── elm/
        │   └── test_elm_basic.py
        ├── erlang/
        │   ├── __init__.py
        │   ├── conftest.py
        │   ├── test_erlang_basic.py
        │   ├── test_erlang_ignored_dirs.py
        │   └── test_erlang_symbol_retrieval.py
        ├── fortran/
        │   ├── __init__.py
        │   └── test_fortran_basic.py
        ├── fsharp/
        │   └── test_fsharp_basic.py
        ├── go/
        │   └── test_go_basic.py
        ├── groovy/
        │   └── test_groovy_basic.py
        ├── haskell/
        │   ├── __init__.py
        │   └── test_haskell_basic.py
        ├── hlsl/
        │   ├── __init__.py
        │   ├── test_hlsl_basic.py
        │   └── test_hlsl_full_index.py
        ├── java/
        │   └── test_java_basic.py
        ├── julia/
        │   └── test_julia_basic.py
        ├── kotlin/
        │   └── test_kotlin_basic.py
        ├── lean4/
        │   └── test_lean4_basic.py
        ├── lua/
        │   └── test_lua_basic.py
        ├── luau/
        │   ├── __init__.py
        │   ├── test_luau_basic.py
        │   └── test_luau_dependency_provider.py
        ├── markdown/
        │   ├── __init__.py
        │   └── test_markdown_basic.py
        ├── matlab/
        │   ├── __init__.py
        │   └── test_matlab_basic.py
        ├── nix/
        │   └── test_nix_basic.py
        ├── ocaml/
        │   ├── test_cross_file_refs.py
        │   └── test_ocaml_basic.py
        ├── pascal/
        │   ├── __init__.py
        │   ├── test_pascal_auto_update.py
        │   └── test_pascal_basic.py
        ├── perl/
        │   └── test_perl_basic.py
        ├── php/
        │   └── test_php_basic.py
        ├── powershell/
        │   ├── __init__.py
        │   └── test_powershell_basic.py
        ├── python/
        │   ├── test_python_basic.py
        │   ├── test_retrieval_with_ignored_dirs.py
        │   └── test_symbol_retrieval.py
        ├── r/
        │   ├── __init__.py
        │   └── test_r_basic.py
        ├── rego/
        │   └── test_rego_basic.py
        ├── ruby/
        │   ├── test_ruby_basic.py
        │   └── test_ruby_symbol_retrieval.py
        ├── rust/
        │   ├── test_rust_2024_edition.py
        │   ├── test_rust_analyzer_detection.py
        │   └── test_rust_basic.py
        ├── scala/
        │   ├── test_metals_db_utils.py
        │   ├── test_scala_language_server.py
        │   └── test_scala_stale_lock_handling.py
        ├── solidity/
        │   ├── __init__.py
        │   └── test_solidity_basic.py
        ├── swift/
        │   └── test_swift_basic.py
        ├── systemverilog/
        │   ├── __init__.py
        │   ├── test_systemverilog_basic.py
        │   └── test_systemverilog_detection.py
        ├── terraform/
        │   └── test_terraform_basic.py
        ├── test_ls_common.py
        ├── test_lsp_protocol_handler_server.py
        ├── test_rename_didopen.py
        ├── toml/
        │   ├── __init__.py
        │   ├── test_toml_basic.py
        │   ├── test_toml_edge_cases.py
        │   ├── test_toml_ignored_dirs.py
        │   └── test_toml_symbol_retrieval.py
        ├── typescript/
        │   └── test_typescript_basic.py
        ├── util/
        │   └── test_zip.py
        ├── vue/
        │   ├── __init__.py
        │   ├── test_vue_basic.py
        │   ├── test_vue_error_cases.py
        │   ├── test_vue_rename.py
        │   └── test_vue_symbol_retrieval.py
        ├── yaml_ls/
        │   ├── __init__.py
        │   └── test_yaml_basic.py
        └── zig/
            └── test_zig_basic.py
Download .txt
Showing preview only (386K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3909 symbols across 271 files)

FILE: docs/autogen_docs.py
  function module_template (line 14) | def module_template(module_qualname: str):
  function index_template (line 26) | def index_template(package_name: str, doc_references: Optional[List[str]...
  function write_to_file (line 38) | def write_to_file(content: str, path: str):
  function make_rst (line 52) | def make_rst(src_root, rst_root, clean=False, overwrite=False, package_p...
  function autogen_tool_list (line 148) | def autogen_tool_list(target_filename = "01-about/035_tools.md"):

FILE: repo_dir_sync.py
  function popen (line 12) | def popen(cmd):
  function call (line 18) | def call(cmd):
  function execute (line 23) | def execute(cmd, exceptionOnError=True):
  function gitLog (line 40) | def gitLog(path, arg):
  function gitCommit (line 48) | def gitCommit(msg):
  function gitCommitWithMessageFromFile (line 54) | def gitCommitWithMessageFromFile(commitMsgFilename):
  class OtherRepo (line 64) | class OtherRepo:
    method __init__ (line 70) | def __init__(self, name, branch, pathToLib):
    method isSyncEstablished (line 78) | def isSyncEstablished(self):
    method lastSyncIdThisRepo (line 81) | def lastSyncIdThisRepo(self):
    method lastSyncIdLibRepo (line 86) | def lastSyncIdLibRepo(self):
    method gitLogThisRepoSinceLastSync (line 91) | def gitLogThisRepoSinceLastSync(self):
    method gitLogLibRepoSinceLastSync (line 98) | def gitLogLibRepoSinceLastSync(self, libRepo: "LibRepo"):
    method _userInputYesNo (line 110) | def _userInputYesNo(self, question) -> bool:
    method pull (line 116) | def pull(self, libRepo: "LibRepo"):
    method push (line 193) | def push(self, libRepo: "LibRepo"):
    method prepare_restoration_of_ignored_files (line 258) | def prepare_restoration_of_ignored_files(self, base_dir: str):
    method restore_ignored_files (line 277) | def restore_ignored_files(self, base_dir: str):
  class LibRepo (line 312) | class LibRepo:
    method __init__ (line 313) | def __init__(self, name: str, libDirectory: str,
    method add (line 343) | def add(self, repo: OtherRepo):
    method runMain (line 347) | def runMain(self):

FILE: scripts/gen_prompt_factory.py
  function main (line 15) | def main():

FILE: scripts/profile_tool_call.py
  function tool_call (line 36) | def tool_call():
  function profiled_tool_call (line 46) | def profiled_tool_call():

FILE: src/interprompt/jinja_template.py
  class ParameterizedTemplateInterface (line 11) | class ParameterizedTemplateInterface:
    method get_parameters (line 12) | def get_parameters(self) -> list[str]: ...
  class _JinjaEnvProvider (line 16) | class _JinjaEnvProvider:
    method __init__ (line 17) | def __init__(self) -> None:
    method get_env (line 20) | def get_env(self) -> jinja2.Environment:
  class JinjaTemplate (line 26) | class JinjaTemplate(ParameterizedTemplateInterface):
    method __init__ (line 27) | def __init__(self, template_string: str) -> None:
    method render (line 33) | def render(self, **params: Any) -> str:
    method get_parameters (line 37) | def get_parameters(self) -> list[str]:

FILE: src/interprompt/multilang_prompt.py
  class PromptTemplate (line 14) | class PromptTemplate(ToStringMixin, ParameterizedTemplateInterface):
    method __init__ (line 15) | def __init__(self, name: str, jinja_template_string: str) -> None:
    method _tostring_exclude_private (line 19) | def _tostring_exclude_private(self) -> bool:
    method render (line 22) | def render(self, **params: Any) -> str:
    method get_parameters (line 25) | def get_parameters(self) -> list[str]:
  class PromptList (line 29) | class PromptList:
    method __init__ (line 30) | def __init__(self, items: list[str]) -> None:
    method to_string (line 33) | def to_string(self) -> str:
  class LanguageFallbackMode (line 44) | class LanguageFallbackMode(Enum):
  class _MultiLangContainer (line 63) | class _MultiLangContainer(Generic[T], ToStringMixin):
    method __init__ (line 69) | def __init__(self, name: str) -> None:
    method _tostring_excludes (line 74) | def _tostring_excludes(self) -> list[str]:
    method _tostring_additional_entries (line 77) | def _tostring_additional_entries(self) -> dict[str, Any]:
    method get_language_codes (line 80) | def get_language_codes(self) -> list[str]:
    method add_item (line 84) | def add_item(self, item: T, lang_code: str = DEFAULT_LANG_CODE, allow_...
    method has_item (line 95) | def has_item(self, lang_code: str = DEFAULT_LANG_CODE) -> bool:
    method get_item (line 98) | def get_item(self, lang: str = DEFAULT_LANG_CODE, fallback_mode: Langu...
    method __len__ (line 124) | def __len__(self) -> int:
  class MultiLangPromptTemplate (line 128) | class MultiLangPromptTemplate(ParameterizedTemplateInterface):
    method __init__ (line 134) | def __init__(self, name: str) -> None:
    method __len__ (line 137) | def __len__(self) -> int:
    method name (line 141) | def name(self) -> str:
    method add_prompt_template (line 144) | def add_prompt_template(
    method get_prompt_template (line 167) | def get_prompt_template(
    method get_parameters (line 172) | def get_parameters(self) -> list[str]:
    method render (line 180) | def render(
    method has_item (line 189) | def has_item(self, lang_code: str = DEFAULT_LANG_CODE) -> bool:
  class MultiLangPromptList (line 193) | class MultiLangPromptList(_MultiLangContainer[PromptList]):
  class MultiLangPromptCollection (line 197) | class MultiLangPromptCollection:
    method __init__ (line 221) | def __init__(self, prompts_dir: str | list[str], fallback_mode: Langua...
    method _add_prompt_template (line 248) | def _add_prompt_template(
    method _add_prompt_list (line 277) | def _add_prompt_list(
    method _load_from_disc (line 305) | def _load_from_disc(self, prompts_dir: str, on_name_collision: Literal...
    method get_prompt_template_names (line 337) | def get_prompt_template_names(self) -> list[str]:
    method get_prompt_list_names (line 340) | def get_prompt_list_names(self) -> list[str]:
    method __len__ (line 343) | def __len__(self) -> int:
    method get_multilang_prompt_template (line 346) | def get_multilang_prompt_template(self, prompt_name: str) -> MultiLang...
    method get_multilang_prompt_list (line 350) | def get_multilang_prompt_list(self, prompt_name: str) -> MultiLangProm...
    method get_prompt_template (line 353) | def get_prompt_template(
    method get_prompt_template_parameters (line 361) | def get_prompt_template_parameters(self, prompt_name: str) -> list[str]:
    method get_prompt_list (line 365) | def get_prompt_list(self, prompt_name: str, lang_code: str = DEFAULT_L...
    method _has_prompt_list (line 369) | def _has_prompt_list(self, prompt_name: str, lang_code: str = DEFAULT_...
    method _has_prompt_template (line 375) | def _has_prompt_template(self, prompt_name: str, lang_code: str = DEFA...
    method render_prompt_template (line 381) | def render_prompt_template(

FILE: src/interprompt/prompt_factory.py
  class PromptFactoryBase (line 10) | class PromptFactoryBase:
    method __init__ (line 13) | def __init__(self, prompts_dir: str | list[str], lang_code: str = DEFA...
    method _render_prompt (line 26) | def _render_prompt(self, prompt_name: str, params: dict[str, Any]) -> ...
    method _get_prompt_list (line 30) | def _get_prompt_list(self, prompt_name: str) -> PromptList:
  function autogenerate_prompt_factory_module (line 34) | def autogenerate_prompt_factory_module(prompts_dir: str, target_module_p...

FILE: src/interprompt/util/class_decorators.py
  function singleton (line 4) | def singleton(cls: type[Any]) -> Any:

FILE: src/serena/__init__.py
  function serena_version (line 8) | def serena_version() -> str:

FILE: src/serena/agent.py
  class ProjectNotFoundError (line 51) | class ProjectNotFoundError(Exception):
  class AvailableTools (line 55) | class AvailableTools:
    method __init__ (line 60) | def __init__(self, tools: list[Tool]):
    method __len__ (line 76) | def __len__(self) -> int:
    method contains_tool_name (line 79) | def contains_tool_name(self, tool_name: str) -> bool:
  class ToolSet (line 83) | class ToolSet:
    method __init__ (line 93) | def __init__(self, tool_names: set[str]) -> None:
    method __len__ (line 96) | def __len__(self) -> int:
    method default (line 100) | def default(cls) -> "ToolSet":
    method apply (line 108) | def apply(self, *tool_inclusion_definitions: "ToolInclusionDefinition"...
    method without_editing_tools (line 160) | def without_editing_tools(self) -> "ToolSet":
    method get_tool_names (line 173) | def get_tool_names(self) -> set[str]:
    method includes_name (line 179) | def includes_name(self, tool_name: str) -> bool:
    method to_available_tools (line 182) | def to_available_tools(self, all_tools: dict[type[Tool], Tool]) -> Ava...
  class ActiveModes (line 186) | class ActiveModes:
    method __init__ (line 187) | def __init__(self) -> None:
    method apply (line 193) | def apply(self, mode_selection: ModeSelectionDefinition) -> None:
    method get_mode_names (line 206) | def get_mode_names(self) -> Sequence[str]:
    method get_modes (line 218) | def get_modes(self) -> Sequence[SerenaAgentMode]:
  class SerenaAgent (line 228) | class SerenaAgent:
    method __init__ (line 229) | def __init__(
    method _create_base_toolset (line 385) | def _create_base_toolset(
    method get_language_backend (line 451) | def get_language_backend(self) -> LanguageBackend:
    method get_current_tasks (line 454) | def get_current_tasks(self) -> list[TaskExecutor.TaskInfo]:
    method get_last_executed_task (line 463) | def get_last_executed_task(self) -> TaskExecutor.TaskInfo | None:
    method get_language_server_manager (line 471) | def get_language_server_manager(self) -> LanguageServerManager | None:
    method get_language_server_manager_or_raise (line 476) | def get_language_server_manager_or_raise(self) -> LanguageServerManager:
    method get_log_inspection_instructions (line 480) | def get_log_inspection_instructions(self) -> str:
    method get_context (line 490) | def get_context(self) -> SerenaAgentContext:
    method get_tool_description_override (line 493) | def get_tool_description_override(self, tool_name: str) -> str | None:
    method _check_shell_settings (line 496) | def _check_shell_settings(self) -> None:
    method record_tool_usage (line 506) | def record_tool_usage(self, input_kwargs: dict, tool_result: str | dic...
    method get_dashboard_url (line 516) | def get_dashboard_url(self) -> str | None:
    method open_dashboard (line 522) | def open_dashboard(self) -> bool:
    method get_exposed_tool_instances (line 545) | def get_exposed_tool_instances(self) -> list["Tool"]:
    method get_active_project (line 556) | def get_active_project(self) -> Project | None:
    method get_active_project_or_raise (line 562) | def get_active_project_or_raise(self) -> Project:
    method set_modes (line 571) | def set_modes(self, mode_names: list[str]) -> None:
    method get_active_modes (line 583) | def get_active_modes(self) -> list[SerenaAgentMode]:
    method _format_prompt (line 589) | def _format_prompt(self, prompt_template: str) -> str:
    method create_system_prompt (line 593) | def create_system_prompt(self) -> str:
    method _update_active_modes (line 616) | def _update_active_modes(self) -> None:
    method _update_active_tools (line 628) | def _update_active_tools(self) -> None:
    method issue_task (line 655) | def issue_task(
    method execute_task (line 670) | def execute_task(self, task: Callable[[], T], name: str | None = None,...
    method is_using_language_server (line 683) | def is_using_language_server(self) -> bool:
    method _activate_project (line 689) | def _activate_project(self, project: Project, update_active_modes: boo...
    method activate_project_from_path_or_name (line 723) | def activate_project_from_path_or_name(
    method get_active_tool_names (line 749) | def get_active_tool_names(self) -> list[str]:
    method tool_is_active (line 755) | def tool_is_active(self, tool_name: str) -> bool:
    method get_current_config_overview (line 762) | def get_current_config_overview(self) -> str:
    method reset_language_server_manager (line 810) | def reset_language_server_manager(self) -> None:
    method add_language (line 816) | def add_language(self, language: Language) -> None:
    method remove_language (line 826) | def remove_language(self, language: Language) -> None:
    method get_tool (line 835) | def get_tool(self, tool_class: type[TTool]) -> TTool:
    method print_tool_overview (line 838) | def print_tool_overview(self) -> None:
    method __del__ (line 841) | def __del__(self) -> None:
    method shutdown (line 844) | def shutdown(self, timeout: float = 2.0) -> None:
    method get_tool_by_name (line 859) | def get_tool_by_name(self, tool_name: str) -> Tool:
    method get_active_lsp_languages (line 863) | def get_active_lsp_languages(self) -> list[Language]:
    method active_project_context (line 870) | def active_project_context(self, project: Project) -> Iterator[None]:

FILE: src/serena/agno.py
  class SerenaAgnoToolkit (line 25) | class SerenaAgnoToolkit(Toolkit):
    method __init__ (line 26) | def __init__(self, serena_agent: SerenaAgent):
    method _create_agno_function (line 33) | def _create_agno_function(tool: Tool) -> Function:
  class SerenaAgnoAgentProvider (line 49) | class SerenaAgnoAgentProvider:
    method get_agent (line 54) | def get_agent(cls, model: Model) -> Agent:

FILE: src/serena/analytics.py
  class TokenCountEstimator (line 17) | class TokenCountEstimator(ABC):
    method estimate_token_count (line 19) | def estimate_token_count(self, text: str) -> int:
  class TiktokenCountEstimator (line 26) | class TiktokenCountEstimator(TokenCountEstimator):
    method __init__ (line 31) | def __init__(self, model_name: str = "gpt-4o"):
    method estimate_token_count (line 42) | def estimate_token_count(self, text: str) -> int:
  class AnthropicTokenCount (line 46) | class AnthropicTokenCount(TokenCountEstimator):
    method __init__ (line 54) | def __init__(self, model_name: str = "claude-sonnet-4-20250514", api_k...
    method _send_count_tokens_request (line 62) | def _send_count_tokens_request(self, text: str) -> MessageTokensCount:
    method estimate_token_count (line 68) | def estimate_token_count(self, text: str) -> int:
  class CharCountEstimator (line 72) | class CharCountEstimator(TokenCountEstimator):
    method __init__ (line 77) | def __init__(self, avg_chars_per_token: int = 4):
    method estimate_token_count (line 80) | def estimate_token_count(self, text: str) -> int:
  class RegisteredTokenCountEstimator (line 88) | class RegisteredTokenCountEstimator(Enum):
    method get_valid_names (line 94) | def get_valid_names(cls) -> list[str]:
    method _create_estimator (line 100) | def _create_estimator(self) -> TokenCountEstimator:
    method load_estimator (line 111) | def load_estimator(self) -> TokenCountEstimator:
  class ToolUsageStats (line 119) | class ToolUsageStats:
    method __init__ (line 124) | def __init__(self, token_count_estimator: RegisteredTokenCountEstimato...
    method token_estimator_name (line 131) | def token_estimator_name(self) -> str:
    class Entry (line 138) | class Entry:
      method update_on_call (line 143) | def update_on_call(self, input_tokens: int, output_tokens: int) -> N...
    method _estimate_token_count (line 151) | def _estimate_token_count(self, text: str) -> int:
    method get_stats (line 154) | def get_stats(self, tool_name: str) -> ToolUsageStats.Entry:
    method record_tool_usage (line 161) | def record_tool_usage(self, tool_name: str, input_str: str, output_str...
    method get_tool_stats_dict (line 168) | def get_tool_stats_dict(self) -> dict[str, dict[str, int]]:
    method clear (line 172) | def clear(self) -> None:

FILE: src/serena/cli.py
  function find_project_root (line 59) | def find_project_root(root: str | Path | None = None) -> str | None:
  function _open_in_editor (line 95) | def _open_in_editor(path: str) -> None:
  class ProjectType (line 115) | class ProjectType(click.ParamType):
    method convert (line 120) | def convert(self, value: str, param: Any, ctx: Any) -> str:
  class AutoRegisteringGroup (line 130) | class AutoRegisteringGroup(click.Group):
    method __init__ (line 142) | def __init__(self, name: str, help: str):
  class TopLevelCommands (line 151) | class TopLevelCommands(AutoRegisteringGroup):
    method __init__ (line 154) | def __init__(self) -> None:
    method start_mcp_server (line 234) | def start_mcp_server(
    method print_system_prompt (line 327) | def print_system_prompt(
    method start_project_server (line 378) | def start_project_server(
  class ModeCommands (line 409) | class ModeCommands(AutoRegisteringGroup):
    method __init__ (line 412) | def __init__(self) -> None:
    method list (line 417) | def list() -> None:
    method create (line 437) | def create(name: str, from_internal: str) -> None:
    method edit (line 459) | def edit(mode_name: str) -> None:
    method delete (line 475) | def delete(mode_name: str) -> None:
  class ContextCommands (line 484) | class ContextCommands(AutoRegisteringGroup):
    method __init__ (line 487) | def __init__(self) -> None:
    method list (line 494) | def list() -> None:
    method create (line 516) | def create(name: str, from_internal: str) -> None:
    method edit (line 538) | def edit(context_name: str) -> None:
    method delete (line 554) | def delete(context_name: str) -> None:
  class SerenaConfigCommands (line 563) | class SerenaConfigCommands(AutoRegisteringGroup):
    method __init__ (line 566) | def __init__(self) -> None:
    method edit (line 575) | def edit() -> None:
  class ProjectCommands (line 581) | class ProjectCommands(AutoRegisteringGroup):
    method __init__ (line 584) | def __init__(self) -> None:
    method _create_project (line 590) | def _create_project(project_path: str, name: str | None, language: tup...
    method create (line 647) | def create(project_path: str, name: str | None, language: tuple[str, ....
    method index (line 679) | def index(project: str, name: str | None, language: tuple[str, ...], l...
    method _index_project (line 693) | def _index_project(registered_project: RegisteredProject, log_level: s...
    method is_ignored_path (line 741) | def is_ignored_path(path: str, project: str) -> None:
    method index_file (line 764) | def index_file(file: str, project: str, verbose: bool) -> None:
    method health_check (line 800) | def health_check(project: str) -> None:
  class ToolCommands (line 941) | class ToolCommands(AutoRegisteringGroup):
    method __init__ (line 944) | def __init__(self) -> None:
    method list (line 959) | def list(quiet: bool = False, include_optional: bool = False, only_opt...
    method description (line 981) | def description(tool_name: str, context: str | None = None) -> None:
  class PromptCommands (line 997) | class PromptCommands(AutoRegisteringGroup):
    method __init__ (line 998) | def __init__(self) -> None:
    method _get_user_prompt_yaml_path (line 1002) | def _get_user_prompt_yaml_path(prompt_yaml_name: str) -> str:
    method list (line 1011) | def list() -> None:
    method create_override (line 1027) | def create_override(prompt_yaml_name: str) -> None:
    method edit_override (line 1047) | def edit_override(prompt_yaml_name: str) -> None:
    method list_overrides (line 1063) | def list_overrides() -> None:
    method delete_override (line 1075) | def delete_override(prompt_yaml_name: str) -> None:
  function get_help (line 1109) | def get_help() -> str:

FILE: src/serena/code_editor.py
  class CodeEditor (line 21) | class CodeEditor(Generic[TSymbol], ABC):
    method __init__ (line 22) | def __init__(self, project: Project) -> None:
    class EditedFile (line 27) | class EditedFile(ABC):
      method __init__ (line 28) | def __init__(self, relative_path: str) -> None:
      method get_contents (line 32) | def get_contents(self) -> str:
      method set_contents (line 38) | def set_contents(self, contents: str) -> None:
      method delete_text_between_positions (line 46) | def delete_text_between_positions(self, start_pos: PositionInFile, e...
      method insert_text_at_position (line 50) | def insert_text_at_position(self, pos: PositionInFile, text: str) ->...
    method _open_file_context (line 54) | def _open_file_context(self, relative_path: str) -> Iterator["CodeEdit...
    method edited_file_context (line 61) | def edited_file_context(self, relative_path: str) -> Iterator["CodeEdi...
    method _save_edited_file (line 70) | def _save_edited_file(self, edited_file: "CodeEditor.EditedFile") -> N...
    method _find_unique_symbol (line 77) | def _find_unique_symbol(self, name_path: str, relative_file_path: str)...
    method replace_body (line 87) | def replace_body(self, name_path: str, relative_file_path: str, body: ...
    method _count_leading_newlines (line 108) | def _count_leading_newlines(text: Iterable) -> int:
    method _count_trailing_newlines (line 120) | def _count_trailing_newlines(cls, text: Reversible) -> int:
    method insert_after_symbol (line 123) | def insert_after_symbol(self, name_path: str, relative_file_path: str,...
    method insert_before_symbol (line 157) | def insert_before_symbol(self, name_path: str, relative_file_path: str...
    method insert_at_line (line 185) | def insert_at_line(self, relative_path: str, line: int, content: str) ...
    method delete_lines (line 196) | def delete_lines(self, relative_path: str, start_line: int, end_line: ...
    method delete_symbol (line 212) | def delete_symbol(self, name_path: str, relative_file_path: str) -> None:
    method rename_symbol (line 223) | def rename_symbol(self, name_path: str, relative_file_path: str, new_n...
  class LanguageServerCodeEditor (line 234) | class LanguageServerCodeEditor(CodeEditor[LanguageServerSymbol]):
    method __init__ (line 235) | def __init__(self, symbol_retriever: LanguageServerSymbolRetriever):
    method _get_language_server (line 239) | def _get_language_server(self, relative_path: str) -> SolidLanguageSer...
    class EditedFile (line 242) | class EditedFile(CodeEditor.EditedFile):
      method __init__ (line 243) | def __init__(self, lang_server: SolidLanguageServer, relative_path: ...
      method get_contents (line 248) | def get_contents(self) -> str:
      method set_contents (line 251) | def set_contents(self, contents: str) -> None:
      method delete_text_between_positions (line 254) | def delete_text_between_positions(self, start_pos: PositionInFile, e...
      method insert_text_at_position (line 257) | def insert_text_at_position(self, pos: PositionInFile, text: str) ->...
      method apply_text_edits (line 260) | def apply_text_edits(self, text_edits: list[ls_types.TextEdit]) -> N...
    method _open_file_context (line 264) | def _open_file_context(self, relative_path: str) -> Iterator["CodeEdit...
    method _get_code_file_content (line 269) | def _get_code_file_content(self, relative_path: str) -> str:
    method _find_unique_symbol (line 274) | def _find_unique_symbol(self, name_path: str, relative_file_path: str)...
    method _relative_path_from_uri (line 277) | def _relative_path_from_uri(self, uri: str) -> str:
    class EditOperation (line 280) | class EditOperation(ABC):
      method apply (line 282) | def apply(self) -> None:
    class EditOperationFileTextEdits (line 285) | class EditOperationFileTextEdits(EditOperation):
      method __init__ (line 286) | def __init__(self, code_editor: "LanguageServerCodeEditor", file_uri...
      method apply (line 291) | def apply(self) -> None:
    class EditOperationRenameFile (line 296) | class EditOperationRenameFile(EditOperation):
      method __init__ (line 297) | def __init__(self, code_editor: "LanguageServerCodeEditor", old_uri:...
      method apply (line 302) | def apply(self) -> None:
    method _workspace_edit_to_edit_operations (line 307) | def _workspace_edit_to_edit_operations(self, workspace_edit: ls_types....
    method _apply_workspace_edit (line 328) | def _apply_workspace_edit(self, workspace_edit: ls_types.WorkspaceEdit...
    method rename_symbol (line 340) | def rename_symbol(self, name_path: str, relative_file_path: str, new_n...
  class JetBrainsCodeEditor (line 369) | class JetBrainsCodeEditor(CodeEditor[JetBrainsSymbol]):
    method __init__ (line 370) | def __init__(self, project: Project) -> None:
    class EditedFile (line 374) | class EditedFile(CodeEditor.EditedFile):
      method __init__ (line 375) | def __init__(self, relative_path: str, project: Project):
      method get_contents (line 382) | def get_contents(self) -> str:
      method set_contents (line 385) | def set_contents(self, contents: str) -> None:
      method delete_text_between_positions (line 388) | def delete_text_between_positions(self, start_pos: PositionInFile, e...
      method insert_text_at_position (line 393) | def insert_text_at_position(self, pos: PositionInFile, text: str) ->...
    method _open_file_context (line 397) | def _open_file_context(self, relative_path: str) -> Iterator["CodeEdit...
    method _save_edited_file (line 400) | def _save_edited_file(self, edited_file: "CodeEditor.EditedFile") -> N...
    method _find_unique_symbol (line 405) | def _find_unique_symbol(self, name_path: str, relative_file_path: str)...
    method rename_symbol (line 418) | def rename_symbol(self, name_path: str, relative_file_path: str, new_n...

FILE: src/serena/config/context_mode.py
  class SerenaAgentMode (line 30) | class SerenaAgentMode(ToolInclusionDefinition, ToStringMixin):
    method _tostring_includes (line 49) | def _tostring_includes(self) -> list[str]:
    method print_overview (line 52) | def print_overview(self) -> None:
    method from_yaml (line 59) | def from_yaml(cls, yaml_path: str | Path) -> Self:
    method get_path (line 68) | def get_path(cls, name: str, instance: Self | None = None) -> str:
    method from_name (line 93) | def from_name(cls, name: str) -> Self:
    method from_name_internal (line 99) | def from_name_internal(cls, name: str) -> Self:
    method list_registered_mode_names (line 107) | def list_registered_mode_names(cls, include_user_modes: bool = True) -...
    method list_custom_mode_names (line 115) | def list_custom_mode_names(cls) -> list[str]:
    method load (line 120) | def load(cls, name_or_path: str | Path) -> Self:
  class SerenaAgentContext (line 135) | class SerenaAgentContext(ToolInclusionDefinition, ToStringMixin):
    method _tostring_includes (line 172) | def _tostring_includes(self) -> list[str]:
    method from_yaml (line 176) | def from_yaml(cls, yaml_path: str | Path) -> Self:
    method get_path (line 188) | def get_path(cls, name: str, instance: Self | None = None) -> str:
    method from_name (line 213) | def from_name(cls, name: str) -> Self:
    method load (line 229) | def load(cls, name_or_path: str | Path) -> Self:
    method list_registered_context_names (line 243) | def list_registered_context_names(cls, include_user_contexts: bool = T...
    method list_custom_context_names (line 251) | def list_custom_context_names(cls) -> list[str]:
    method load_default (line 256) | def load_default(cls) -> Self:
    method print_overview (line 260) | def print_overview(self) -> None:

FILE: src/serena/config/serena_config.py
  class SerenaPaths (line 53) | class SerenaPaths:
    method __init__ (line 58) | def __init__(self) -> None:
    method get_next_log_file_path (line 102) | def get_next_log_file_path(self, prefix: str) -> str:
  class ToolInclusionDefinition (line 116) | class ToolInclusionDefinition:
    method is_fixed_tool_set (line 137) | def is_fixed_tool_set(self) -> bool:
  class NamedToolInclusionDefinition (line 146) | class NamedToolInclusionDefinition(ToolInclusionDefinition):
    method __str__ (line 149) | def __str__(self) -> str:
  class ModeSelectionDefinition (line 154) | class ModeSelectionDefinition:
  class LanguageBackend (line 159) | class LanguageBackend(Enum):
    method from_str (line 172) | def from_str(backend_str: str) -> "LanguageBackend":
    method is_lsp (line 178) | def is_lsp(self) -> bool:
    method is_jetbrains (line 181) | def is_jetbrains(self) -> bool:
  class LineEnding (line 185) | class LineEnding(Enum):
    method newline_str (line 193) | def newline_str(self) -> str | None:
    method from_str (line 205) | def from_str(cls, value: str) -> "LineEnding":
  class SharedConfig (line 215) | class SharedConfig(ModeSelectionDefinition, ToolInclusionDefinition, ToS...
  class SerenaConfigError (line 227) | class SerenaConfigError(Exception):
  class ProjectConfig (line 239) | class ProjectConfig(SharedConfig):
    method _tostring_includes (line 261) | def _tostring_includes(self) -> list[str]:
    method autogenerate (line 265) | def autogenerate(
    method default_project_yml_path (line 350) | def default_project_yml_path(cls, project_root: str | Path) -> str:
    method _load_yaml_dict (line 359) | def _load_yaml_dict(
    method _from_dict (line 405) | def _from_dict(cls, data: dict[str, Any], local_override_keys: list[st...
    method _to_yaml_dict (line 465) | def _to_yaml_dict(self) -> dict:
    method _project_local_yml_path (line 485) | def _project_local_yml_path(cls, project_yml_path: str) -> str:
    method load (line 489) | def load(cls, project_root: Path | str, serena_config: "SerenaConfig",...
    method save (line 538) | def save(self, project_yml_path: str, save_project_local_yml: bool = T...
  class RegisteredProject (line 582) | class RegisteredProject(ToStringMixin):
    method __init__ (line 583) | def __init__(
    method _tostring_exclude_private (line 600) | def _tostring_exclude_private(self) -> bool:
    method project_name (line 604) | def project_name(self) -> str:
    method from_project_instance (line 608) | def from_project_instance(cls, project_instance: "Project") -> "Regist...
    method from_project_root (line 616) | def from_project_root(cls, project_root: str | Path, serena_config: "S...
    method matches_root_path (line 623) | def matches_root_path(self, path: str | Path) -> bool:
    method get_project_instance (line 632) | def get_project_instance(self, serena_config: "SerenaConfig") -> "Proj...
  class SerenaConfig (line 649) | class SerenaConfig(SharedConfig):
    method get_config_file_creation_date (line 730) | def get_config_file_creation_date(cls) -> datetime | None:
    method config_file_path (line 744) | def config_file_path(self) -> str | None:
    method _iter_config_file_mapped_fields_without_type_conversion (line 747) | def _iter_config_file_mapped_fields_without_type_conversion(self) -> I...
    method _tostring_includes (line 756) | def _tostring_includes(self) -> list[str]:
    method _generate_config_file (line 760) | def _generate_config_file(cls, config_file_path: str) -> None:
    method _determine_config_file_path (line 771) | def _determine_config_file_path(cls) -> str:
    method from_config_file (line 788) | def from_config_file(cls, generate_if_missing: bool = True) -> "Serena...
    method _migrate_out_of_project_config_file (line 894) | def _migrate_out_of_project_config_file(cls, path: Path) -> Path | None:
    method project_paths (line 918) | def project_paths(self) -> list[str]:
    method project_names (line 922) | def project_names(self) -> list[str]:
    method get_registered_project (line 925) | def get_registered_project(self, project_root_or_name: str, autoregist...
    method get_project (line 958) | def get_project(self, project_root_or_name: str) -> Optional["Project"]:
    method add_registered_project (line 965) | def add_registered_project(self, registered_project: RegisteredProject...
    method add_project_from_path (line 972) | def add_project_from_path(self, project_root: Path | str) -> "Project":
    method remove_project (line 1007) | def remove_project(self, project_name: str) -> None:
    method save (line 1017) | def save(self) -> None:
    method _resolve_serena_folder_location (line 1052) | def _resolve_serena_folder_location(template: str, placeholders: dict[...
    method get_configured_project_serena_folder (line 1075) | def get_configured_project_serena_folder(self, project_root: str | Pat...
    method get_project_serena_folder (line 1092) | def get_project_serena_folder(self, project_root: str | Path) -> str:
    method get_project_yml_location (line 1112) | def get_project_yml_location(self, project_root: str | Path) -> str:
    method propagate_settings (line 1123) | def propagate_settings(self) -> None:

FILE: src/serena/dashboard.py
  class RequestLog (line 27) | class RequestLog(BaseModel):
  class ResponseLog (line 31) | class ResponseLog(BaseModel):
  class ResponseToolNames (line 37) | class ResponseToolNames(BaseModel):
  class ResponseToolStats (line 41) | class ResponseToolStats(BaseModel):
  class ResponseConfigOverview (line 45) | class ResponseConfigOverview(BaseModel):
  class ResponseAvailableLanguages (line 62) | class ResponseAvailableLanguages(BaseModel):
  class RequestAddLanguage (line 66) | class RequestAddLanguage(BaseModel):
  class RequestRemoveLanguage (line 70) | class RequestRemoveLanguage(BaseModel):
  class RequestGetMemory (line 74) | class RequestGetMemory(BaseModel):
  class ResponseGetMemory (line 78) | class ResponseGetMemory(BaseModel):
  class RequestSaveMemory (line 83) | class RequestSaveMemory(BaseModel):
  class RequestDeleteMemory (line 88) | class RequestDeleteMemory(BaseModel):
  class RequestRenameMemory (line 92) | class RequestRenameMemory(BaseModel):
  class ResponseGetSerenaConfig (line 97) | class ResponseGetSerenaConfig(BaseModel):
  class RequestSaveSerenaConfig (line 101) | class RequestSaveSerenaConfig(BaseModel):
  class RequestCancelTaskExecution (line 105) | class RequestCancelTaskExecution(BaseModel):
  class QueuedExecution (line 109) | class QueuedExecution(BaseModel):
    method from_task_info (line 117) | def from_task_info(cls, task_info: TaskExecutor.TaskInfo) -> Self:
  class SerenaDashboardAPI (line 127) | class SerenaDashboardAPI:
    method __init__ (line 130) | def __init__(
    method memory_log_handler (line 147) | def memory_log_handler(self) -> MemoryLogHandler:
    method _setup_routes (line 150) | def _setup_routes(self) -> None:
    method _get_log_messages (line 387) | def _get_log_messages(self, request_log: RequestLog) -> ResponseLog:
    method _get_tool_names (line 393) | def _get_tool_names(self) -> ResponseToolNames:
    method _get_tool_stats (line 396) | def _get_tool_stats(self) -> ResponseToolStats:
    method _clear_tool_stats (line 402) | def _clear_tool_stats(self) -> None:
    method _get_config_overview (line 406) | def _get_config_overview(self) -> ResponseConfigOverview:
    method _shutdown (line 533) | def _shutdown(self) -> None:
    method _get_available_languages (line 542) | def _get_available_languages(self) -> ResponseAvailableLanguages:
    method _get_memory (line 560) | def _get_memory(self, request_get_memory: RequestGetMemory) -> Respons...
    method _save_memory (line 571) | def _save_memory(self, request_save_memory: RequestSaveMemory) -> None:
    method _delete_memory (line 580) | def _delete_memory(self, request_delete_memory: RequestDeleteMemory) -...
    method _rename_memory (line 589) | def _rename_memory(self, request_rename_memory: RequestRenameMemory) -...
    method _get_serena_config (line 601) | def _get_serena_config(self) -> ResponseGetSerenaConfig:
    method _save_serena_config (line 611) | def _save_serena_config(self, request_save_config: RequestSaveSerenaCo...
    method _add_language (line 622) | def _add_language(self, request_add_language: RequestAddLanguage) -> N...
    method _remove_language (line 632) | def _remove_language(self, request_remove_language: RequestRemoveLangu...
    method _find_first_free_port (line 643) | def _find_first_free_port(start_port: int, host: str) -> int:
    method run (line 655) | def run(self, host: str, port: int) -> int:
    method run_in_thread (line 667) | def run_in_thread(self, host: str) -> tuple[threading.Thread, int]:

FILE: src/serena/generated/generated_prompt_factory.py
  class PromptFactory (line 12) | class PromptFactory(PromptFactoryBase):
    method create_onboarding_prompt (line 17) | def create_onboarding_prompt(self, *, system: Any) -> str:
    method create_think_about_collected_information (line 20) | def create_think_about_collected_information(self) -> str:
    method create_think_about_task_adherence (line 23) | def create_think_about_task_adherence(self) -> str:
    method create_think_about_whether_you_are_done (line 26) | def create_think_about_whether_you_are_done(self) -> str:
    method create_summarize_changes (line 29) | def create_summarize_changes(self) -> str:
    method create_prepare_for_new_conversation (line 32) | def create_prepare_for_new_conversation(self) -> str:
    method create_system_prompt (line 35) | def create_system_prompt(

FILE: src/serena/gui_log_viewer.py
  class LogLevel (line 19) | class LogLevel(Enum):
  class GuiLogViewer (line 27) | class GuiLogViewer:
    method __init__ (line 34) | def __init__(
    method start (line 75) | def start(self):
    method stop (line 84) | def stop(self):
    method set_tool_names (line 92) | def set_tool_names(self, tool_names):
    method set_dashboard_url (line 102) | def set_dashboard_url(self, url: str) -> None:
    method add_log (line 113) | def add_log(self, message):
    method _determine_log_level (line 123) | def _determine_log_level(self, message):
    method _process_queue (line 146) | def _process_queue(self):
    method run_gui (line 225) | def run_gui(self):
    method _shutdown_server (line 322) | def _shutdown_server(self) -> None:
  class GuiLogViewerHandler (line 329) | class GuiLogViewerHandler(logging.Handler):
    method __init__ (line 336) | def __init__(
    method is_instance_registered (line 360) | def is_instance_registered(cls) -> bool:
    method emit (line 366) | def emit(self, record):
    method close (line 390) | def close(self):
    method stop_viewer (line 398) | def stop_viewer(self):
  function show_fatal_exception (line 406) | def show_fatal_exception(e: Exception):

FILE: src/serena/jetbrains/jetbrains_plugin_client.py
  class SerenaClientError (line 31) | class SerenaClientError(Exception):
  class ConnectionError (line 35) | class ConnectionError(SerenaClientError):
  class APIError (line 39) | class APIError(SerenaClientError):
    method __init__ (line 42) | def __init__(self, response: Response):
  class PluginServerError (line 51) | class PluginServerError(SerenaClientError):
    method __init__ (line 54) | def __init__(self, message: str):
  class ServerNotFoundError (line 64) | class ServerNotFoundError(Exception):
  class MatchedClient (line 69) | class MatchedClient:
  class JetBrainsPluginClientManager (line 75) | class JetBrainsPluginClientManager:
    method __init__ (line 82) | def __init__(self) -> None:
    method _submit_scan (line 87) | def _submit_scan(self) -> list[concurrent.futures.Future["JetBrainsPlu...
    method find_client (line 107) | def find_client(self, project_root: Path) -> "JetBrainsPluginClient":
    method match_clients (line 128) | def match_clients(self, registered_projects: list[RegisteredProject]) ...
    method get_matched_client (line 146) | def get_matched_client(
  class JetBrainsPluginClient (line 170) | class JetBrainsPluginClient(ToStringMixin):
    method __init__ (line 191) | def __init__(self, port: int, timeout: int = PLUGIN_REQUEST_TIMEOUT):
    method _base_url (line 210) | def _base_url(self) -> str:
    method set_server_address (line 214) | def set_server_address(cls, address: str) -> None:
    method _tostring_includes (line 217) | def _tostring_includes(self) -> list[str]:
    method from_project (line 221) | def from_project(cls, project: Project) -> Self:
    method _paths_match (line 234) | def _paths_match(resolved_serena_path: str, plugin_path: str) -> bool:
    method matches (line 272) | def matches(self, resolved_path: Path) -> bool:
    method is_version_at_least (line 281) | def is_version_at_least(self, *version_parts: int) -> bool:
    method _require_version_at_least (line 286) | def _require_version_at_least(self, *version_parts: int) -> None:
    method _make_request (line 299) | def _make_request(self, method: str, endpoint: str, data: Optional[dic...
    method _pythonify_response (line 343) | def _pythonify_response(response: T) -> T:
    method _postprocess_symbol_collection_response (line 361) | def _postprocess_symbol_collection_response(self, response_dict: jb.Sy...
    method find_symbol (line 386) | def find_symbol(
    method find_references (line 428) | def find_references(self, name_path: str, relative_path: str, include_...
    method get_symbols_overview (line 441) | def get_symbols_overview(
    method get_supertypes (line 459) | def get_supertypes(
    method get_subtypes (line 483) | def get_subtypes(
    method rename_symbol (line 507) | def rename_symbol(
    method refresh_file (line 528) | def refresh_file(self, relative_path: str) -> None:
    method close (line 539) | def close(self) -> None:
    method __enter__ (line 542) | def __enter__(self) -> Self:
    method __exit__ (line 545) | def __exit__(self, exc_type, exc_val, exc_tb):  # type: ignore

FILE: src/serena/jetbrains/jetbrains_types.py
  class PluginStatusDTO (line 4) | class PluginStatusDTO(TypedDict):
  class PositionDTO (line 9) | class PositionDTO(TypedDict):
  class TextRangeDTO (line 14) | class TextRangeDTO(TypedDict):
  class SymbolDTO (line 19) | class SymbolDTO(TypedDict):
  class SymbolCollectionResponse (line 36) | class SymbolCollectionResponse(TypedDict):
  class GetSymbolsOverviewResponse (line 40) | class GetSymbolsOverviewResponse(SymbolCollectionResponse):
  class TypeHierarchyNodeDTO (line 46) | class TypeHierarchyNodeDTO(TypedDict):
  class TypeHierarchyResponse (line 51) | class TypeHierarchyResponse(TypedDict):

FILE: src/serena/ls_manager.py
  class LanguageServerManagerInitialisationError (line 16) | class LanguageServerManagerInitialisationError(Exception):
    method __init__ (line 17) | def __init__(self, message: str):
  class LanguageServerFactory (line 21) | class LanguageServerFactory:
    method __init__ (line 22) | def __init__(
    method create_language_server (line 40) | def create_language_server(self, language: Language) -> SolidLanguageS...
  class LanguageServerManager (line 61) | class LanguageServerManager:
    method __init__ (line 66) | def __init__(
    method _default_language_server (line 82) | def _default_language_server(self) -> SolidLanguageServer:
    method from_languages (line 88) | def from_languages(languages: list[Language], factory: LanguageServerF...
    method _ensure_functional_ls (line 146) | def _ensure_functional_ls(self, ls: SolidLanguageServer) -> SolidLangu...
    method _get_suitable_language_server (line 152) | def _get_suitable_language_server(self, relative_path: str) -> SolidLa...
    method get_language_server (line 159) | def get_language_server(self, relative_path: str) -> SolidLanguageServer:
    method _create_and_start_language_server (line 170) | def _create_and_start_language_server(self, language: Language) -> Sol...
    method restart_language_server (line 178) | def restart_language_server(self, language: Language) -> SolidLanguage...
    method add_language_server (line 190) | def add_language_server(self, language: Language) -> SolidLanguageServer:
    method remove_language_server (line 202) | def remove_language_server(self, language: Language, save_cache: bool ...
    method get_active_languages (line 213) | def get_active_languages(self) -> list[Language]:
    method _stop_language_server (line 222) | def _stop_language_server(ls: SolidLanguageServer, save_cache: bool = ...
    method iter_language_servers (line 229) | def iter_language_servers(self) -> Iterator[SolidLanguageServer]:
    method stop_all (line 233) | def stop_all(self, save_cache: bool = False, timeout: float = 2.0) -> ...
    method save_all_caches (line 243) | def save_all_caches(self) -> None:
    method has_suitable_ls_for_file (line 251) | def has_suitable_ls_for_file(self, relative_file_path: str) -> bool:

FILE: src/serena/mcp.py
  function configure_logging (line 34) | def configure_logging(*args, **kwargs) -> None:  # type: ignore
  class SerenaMCPRequestContext (line 46) | class SerenaMCPRequestContext:
  class SerenaMCPFactory (line 50) | class SerenaMCPFactory:
    method __init__ (line 55) | def __init__(self, context: str = DEFAULT_CONTEXT, project: str | None...
    method _sanitize_for_openai_tools (line 69) | def _sanitize_for_openai_tools(schema: dict) -> dict:
    method make_mcp_tool (line 176) | def make_mcp_tool(tool: Tool, openai_tool_compatible: bool = True) -> ...
    method _iter_tools (line 249) | def _iter_tools(self) -> Iterator[Tool]:
    method _set_mcp_tools (line 254) | def _set_mcp_tools(self, mcp: FastMCP, openai_tool_compatible: bool = ...
    method _create_serena_agent (line 263) | def _create_serena_agent(self, serena_config: SerenaConfig, modes: Mod...
    method _create_default_serena_config (line 268) | def _create_default_serena_config(self) -> SerenaConfig:
    method create_mcp_server (line 271) | def create_mcp_server(
    method server_lifespan (line 339) | async def server_lifespan(self, mcp_server: FastMCP) -> AsyncIterator[...
    method _get_initial_instructions (line 347) | def _get_initial_instructions(self) -> str:

FILE: src/serena/project.py
  class MemoriesManager (line 34) | class MemoriesManager:
    method __init__ (line 38) | def __init__(self, serena_data_folder: str | Path | None, read_only_me...
    method _is_read_only_memory (line 50) | def _is_read_only_memory(self, name: str) -> bool:
    method _is_global (line 56) | def _is_global(self, name: str) -> bool:
    method get_memory_file_path (line 59) | def get_memory_file_path(self, name: str) -> Path:
    method _check_write_access (line 92) | def _check_write_access(self, name: str, is_tool_context: bool) -> None:
    method load_memory (line 97) | def load_memory(self, name: str) -> str:
    method save_memory (line 104) | def save_memory(self, name: str, content: str, is_tool_context: bool) ...
    class MemoriesList (line 111) | class MemoriesList:
      method __init__ (line 112) | def __init__(self) -> None:
      method __len__ (line 116) | def __len__(self) -> int:
      method add (line 119) | def add(self, memory_name: str, is_read_only: bool) -> None:
      method extend (line 125) | def extend(self, other: "MemoriesManager.MemoriesList") -> None:
      method to_dict (line 129) | def to_dict(self) -> dict[str, list[str]]:
      method get_full_list (line 137) | def get_full_list(self) -> list[str]:
    method _list_memories (line 140) | def _list_memories(self, search_dir: Path, base_dir: Path, prefix: str...
    method list_global_memories (line 150) | def list_global_memories(self, subtopic: str = "") -> MemoriesList:
    method list_project_memories (line 156) | def list_project_memories(self, topic: str = "") -> MemoriesList:
    method list_memories (line 163) | def list_memories(self, topic: str = "") -> MemoriesList:
    method delete_memory (line 183) | def delete_memory(self, name: str, is_tool_context: bool) -> str:
    method move_memory (line 191) | def move_memory(self, old_name: str, new_name: str, is_tool_context: b...
    method edit_memory (line 211) | def edit_memory(
  class Project (line 236) | class Project(ToStringMixin):
    method __init__ (line 237) | def __init__(
    method _gather_ignorespec (line 278) | def _gather_ignorespec(self) -> None:
    method _tostring_includes (line 310) | def _tostring_includes(self) -> list[str]:
    method _tostring_additional_entries (line 313) | def _tostring_additional_entries(self) -> dict[str, Any]:
    method set_agent (line 316) | def set_agent(self, agent: "SerenaAgent") -> None:
    method project_name (line 320) | def project_name(self) -> str:
    method load (line 324) | def load(
    method save_config (line 337) | def save_config(self) -> None:
    method path_to_serena_data_folder (line 343) | def path_to_serena_data_folder(self) -> str:
    method path_to_project_yml (line 346) | def path_to_project_yml(self) -> str:
    method get_activation_message (line 349) | def get_activation_message(self) -> str:
    method read_file (line 369) | def read_file(self, relative_path: str) -> str:
    method _ignore_spec (line 380) | def _ignore_spec(self) -> pathspec.PathSpec:
    method _ignored_patterns (line 392) | def _ignored_patterns(self) -> list[str]:
    method _is_ignored_relative_path (line 402) | def _is_ignored_relative_path(self, relative_path: str | Path, ignore_...
    method is_ignored_path (line 444) | def is_ignored_path(self, path: str | Path, ignore_non_source_files: b...
    method is_path_in_project (line 466) | def is_path_in_project(self, path: str | Path) -> bool:
    method relative_path_exists (line 485) | def relative_path_exists(self, relative_path: str) -> bool:
    method validate_relative_path (line 495) | def validate_relative_path(self, relative_path: str, require_not_ignor...
    method gather_source_files (line 512) | def gather_source_files(self, relative_path: str = "") -> list[str]:
    method search_source_files_for_pattern (line 549) | def search_source_files_for_pattern(
    method retrieve_content_around_line (line 581) | def retrieve_content_around_line(
    method create_language_server_manager (line 603) | def create_language_server_manager(self) -> LanguageServerManager:
    method get_language_server_manager_or_raise (line 642) | def get_language_server_manager_or_raise(self) -> LanguageServerManager:
    method add_language (line 655) | def add_language(self, language: Language) -> None:
    method remove_language (line 678) | def remove_language(self, language: Language) -> None:
    method shutdown (line 700) | def shutdown(self, timeout: float = 2.0) -> None:

FILE: src/serena/project_server.py
  class QueryProjectRequest (line 22) | class QueryProjectRequest(BaseModel):
  class ProjectServer (line 33) | class ProjectServer:
    method __init__ (line 47) | def __init__(self) -> None:
    method _setup_routes (line 62) | def _setup_routes(self) -> None:
    method _get_project (line 72) | def _get_project(self, project_name: str) -> "Project":
    method _query_project (line 87) | def _query_project(self, req: QueryProjectRequest) -> str:
    method run (line 95) | def run(self, host: str = "127.0.0.1", port: int = PORT) -> int:
  class ProjectServerClient (line 111) | class ProjectServerClient:
    method __init__ (line 119) | def __init__(self, host: str = "127.0.0.1", port: int = ProjectServer....
    method query_project (line 137) | def query_project(self, project_name: str, tool_name: str, tool_params...

FILE: src/serena/prompt_factory.py
  class SerenaPromptFactory (line 8) | class SerenaPromptFactory(PromptFactory):
    method __init__ (line 13) | def __init__(self) -> None:

FILE: src/serena/resources/dashboard/dashboard.js
  class LogMessage (line 1) | class LogMessage {
    method constructor (line 2) | constructor(message, toolNames) {
    method determineLogLevel (line 9) | determineLogLevel(message) {
    method highlightToolNames (line 23) | highlightToolNames(message, toolNames) {
    method escapeHtml (line 32) | escapeHtml(convertString) {
  function updateThemeAwareImage (line 43) | function updateThemeAwareImage($img, theme=null) {
  class BannerRotation (line 62) | class BannerRotation {
    method constructor (line 63) | constructor() {
    method init (line 76) | init() {
    method loadBanners (line 94) | loadBanners(onSuccess) {
    method startPlatinumRotation (line 134) | startPlatinumRotation() {
    method randomizeInitialBanner (line 141) | randomizeInitialBanner(type) {
    method startGoldRotation (line 158) | startGoldRotation() {
    method hideArrowsIfSingle (line 165) | hideArrowsIfSingle() {
    method bindArrowButtons (line 174) | bindArrowButtons() {
    method rotatePlatinum (line 189) | rotatePlatinum(direction) {
    method rotateGold (line 215) | rotateGold(direction) {
  class Dashboard (line 242) | class Dashboard {
    method constructor (line 243) | constructor() {
    method heartbeat (line 498) | heartbeat() {
    method toggleMenu (line 517) | toggleMenu() {
    method navigateToPage (line 521) | navigateToPage(page) {
    method stopPolling (line 554) | stopPolling() {
    method loadConfigOverview (line 571) | loadConfigOverview() {
    method startConfigPolling (line 616) | startConfigPolling() {
    method startExecutionsPolling (line 620) | startExecutionsPolling() {
    method displayConfig (line 630) | displayConfig(config) {
    method displayBasicStats (line 816) | displayBasicStats(stats) {
    method displayProjects (line 846) | displayProjects(projects) {
    method displayAvailableTools (line 864) | displayAvailableTools(tools) {
    method displayAvailableModes (line 878) | displayAvailableModes(modes) {
    method displayAvailableContexts (line 893) | displayAvailableContexts(contexts) {
    method loadQueuedExecutions (line 910) | loadQueuedExecutions() {
    method loadLastExecution (line 926) | loadLastExecution() {
    method loadExecutions (line 944) | loadExecutions() {
    method displayActiveExecutionsQueue (line 955) | displayActiveExecutionsQueue(executions) {
    method displayLastExecution (line 1023) | displayLastExecution(execution) {
    method displayCancelledExecutions (line 1047) | displayCancelledExecutions() {
    method confirmCancelExecution (line 1078) | confirmCancelExecution(executionData) {
    method confirmCancelExecutionOk (line 1093) | confirmCancelExecutionOk() {
    method cancelExecution (line 1100) | cancelExecution(executionData) {
    method closeCancelExecutionModal (line 1161) | closeCancelExecutionModal() {
    method escapeHtml (line 1166) | escapeHtml(text) {
    method displayLogMessage (line 1178) | displayLogMessage(message) {
    method loadToolNames (line 1182) | loadToolNames() {
    method updateTitle (line 1194) | updateTitle(activeProject) {
    method updateLogButtons (line 1198) | updateLogButtons(hasLogs) {
    method saveLogs (line 1204) | saveLogs() {
    method copyLogs (line 1223) | copyLogs() {
    method clearLogs (line 1241) | clearLogs() {
    method loadLogs (line 1262) | loadLogs() {
    method pollForNewLogs (line 1304) | pollForNewLogs() {
    method startPeriodicPolling (line 1350) | startPeriodicPolling() {
    method loadStats (line 1362) | loadStats() {
    method clearStats (line 1376) | clearStats() {
    method displayStats (line 1387) | displayStats(stats, tokenCountEstimatorName) {
    method generateColors (line 1544) | generateColors(count) {
    method updateSummaryTable (line 1549) | updateSummaryTable(totalCalls, totalInputTokens, totalOutputTokens) {
    method initializeTheme (line 1564) | initializeTheme() {
    method detectSystemTheme (line 1580) | detectSystemTheme() {
    method setupSystemThemeListener (line 1587) | setupSystemThemeListener() {
    method toggleTheme (line 1609) | toggleTheme() {
    method setTheme (line 1621) | setTheme(theme) {
    method updateChartsTheme (line 1647) | updateChartsTheme() {
    method confirmRemoveLanguage (line 1692) | confirmRemoveLanguage(language) {
    method closeRemoveLanguageModal (line 1703) | closeRemoveLanguageModal() {
    method confirmRemoveLanguageOk (line 1708) | confirmRemoveLanguageOk() {
    method removeLanguage (line 1715) | removeLanguage(language) {
    method openLanguageModal (line 1735) | openLanguageModal() {
    method closeLanguageModal (line 1746) | closeLanguageModal() {
    method loadAvailableLanguages (line 1752) | loadAvailableLanguages() {
    method addLanguageFromModal (line 1777) | addLanguageFromModal() {
    method openEditMemoryModal (line 1821) | openEditMemoryModal(memoryName) {
    method closeEditMemoryModal (line 1849) | closeEditMemoryModal() {
    method trackMemoryChanges (line 1863) | trackMemoryChanges() {
    method saveMemoryFromModal (line 1868) | saveMemoryFromModal() {
    method startMemoryRename (line 1905) | startMemoryRename() {
    method cancelMemoryRename (line 1911) | cancelMemoryRename() {
    method commitMemoryRename (line 1917) | commitMemoryRename() {
    method confirmDeleteMemory (line 1961) | confirmDeleteMemory(memoryName) {
    method closeDeleteMemoryModal (line 1972) | closeDeleteMemoryModal() {
    method confirmDeleteMemoryOk (line 1977) | confirmDeleteMemoryOk() {
    method deleteMemory (line 1984) | deleteMemory(memoryName) {
    method openCreateMemoryModal (line 2004) | openCreateMemoryModal() {
    method closeCreateMemoryModal (line 2020) | closeCreateMemoryModal() {
    method createMemoryFromModal (line 2026) | createMemoryFromModal() {
    method loadNews (line 2072) | loadNews() {
    method displayNews (line 2095) | displayNews(newsIds) {
    method markNewsAsRead (line 2147) | markNewsAsRead(newsId) {
    method openEditSerenaConfigModal (line 2170) | openEditSerenaConfigModal() {
    method closeEditSerenaConfigModal (line 2198) | closeEditSerenaConfigModal() {
    method saveSerenaConfigFromModal (line 2211) | saveSerenaConfigFromModal() {
    method shutdown (line 2244) | shutdown() {

FILE: src/serena/symbol.py
  class LanguageServerSymbolLocation (line 26) | class LanguageServerSymbolLocation:
    method __post_init__ (line 46) | def __post_init__(self) -> None:
    method to_dict (line 50) | def to_dict(self, include_relative_path: bool = True) -> dict[str, Any]:
    method has_position_in_file (line 56) | def has_position_in_file(self) -> bool:
  class PositionInFile (line 61) | class PositionInFile:
    method to_lsp_position (line 75) | def to_lsp_position(self) -> Position:
  class Symbol (line 82) | class Symbol(ToStringMixin, ABC):
    method get_body_start_position (line 84) | def get_body_start_position(self) -> PositionInFile | None:
    method get_body_end_position (line 88) | def get_body_end_position(self) -> PositionInFile | None:
    method get_body_start_position_or_raise (line 91) | def get_body_start_position_or_raise(self) -> PositionInFile:
    method get_body_end_position_or_raise (line 100) | def get_body_end_position_or_raise(self) -> PositionInFile:
    method is_neighbouring_definition_separated_by_empty_line (line 110) | def is_neighbouring_definition_separated_by_empty_line(self) -> bool:
  class NamePathComponent (line 117) | class NamePathComponent:
    method __init__ (line 118) | def __init__(self, name: str, overload_idx: int | None = None) -> None:
    method __repr__ (line 122) | def __repr__(self) -> str:
  class NamePathMatcher (line 129) | class NamePathMatcher(ToStringMixin):
    class PatternComponent (line 145) | class PatternComponent(NamePathComponent):
      method from_string (line 147) | def from_string(cls, component_str: str) -> Self:
      method matches (line 157) | def matches(self, name_path_component: NamePathComponent, substring_...
    method __init__ (line 168) | def __init__(self, name_path_pattern: str, substring_matching: bool) -...
    method _tostring_includes (line 181) | def _tostring_includes(self) -> list[str]:
    method matches_ls_symbol (line 184) | def matches_ls_symbol(self, symbol: "LanguageServerSymbol") -> bool:
    method matches_reversed_components (line 187) | def matches_reversed_components(self, components_reversed: Iterator[Na...
  class LanguageServerSymbol (line 206) | class LanguageServerSymbol(Symbol, ToStringMixin):
    method __init__ (line 207) | def __init__(self, symbol_root_from_ls: UnifiedSymbolInformation) -> N...
    method _tostring_includes (line 210) | def _tostring_includes(self) -> list[str]:
    method _tostring_additional_entries (line 213) | def _tostring_additional_entries(self) -> dict[str, Any]:
    method name (line 217) | def name(self) -> str:
    method symbol_kind_name (line 221) | def symbol_kind_name(self) -> str:
    method symbol_kind (line 228) | def symbol_kind(self) -> SymbolKind:
    method is_low_level (line 231) | def is_low_level(self) -> bool:
    method overload_idx (line 239) | def overload_idx(self) -> int | None:
    method is_neighbouring_definition_separated_by_empty_line (line 242) | def is_neighbouring_definition_separated_by_empty_line(self) -> bool:
    method relative_path (line 246) | def relative_path(self) -> str | None:
    method location (line 253) | def location(self) -> LanguageServerSymbolLocation:
    method body_start_position (line 260) | def body_start_position(self) -> Position | None:
    method body_end_position (line 271) | def body_end_position(self) -> Position | None:
    method get_body_start_position (line 281) | def get_body_start_position(self) -> PositionInFile | None:
    method get_body_end_position (line 287) | def get_body_end_position(self) -> PositionInFile | None:
    method get_body_line_numbers (line 293) | def get_body_line_numbers(self) -> tuple[int | None, int | None]:
    method line (line 301) | def line(self) -> int | None:
    method column (line 312) | def column(self) -> int | None:
    method body (line 320) | def body(self) -> str | None:
    method get_name_path (line 327) | def get_name_path(self) -> str:
    method iter_name_path_components_reversed (line 335) | def iter_name_path_components_reversed(self) -> Iterator[NamePathCompo...
    method iter_children (line 340) | def iter_children(self) -> Iterator[Self]:
    method iter_ancestors (line 344) | def iter_ancestors(self, up_to_symbol_kind: SymbolKind | None = None) ...
    method get_parent (line 358) | def get_parent(self) -> Self | None:
    method find (line 364) | def find(
    class OutputDict (line 400) | class OutputDict(TypedDict):
    method to_dict (line 415) | def to_dict(
  class ReferenceInLanguageServerSymbol (line 506) | class ReferenceInLanguageServerSymbol(ToStringMixin):
    method from_lsp_reference (line 528) | def from_lsp_reference(cls, reference: LSPReferenceInSymbol) -> Self:
    method get_relative_path (line 531) | def get_relative_path(self) -> str | None:
  class LanguageServerSymbolRetriever (line 535) | class LanguageServerSymbolRetriever:
    method __init__ (line 536) | def __init__(self, project: Project) -> None:
    method _request_info (line 543) | def _request_info(self, relative_file_path: str, line: int, column: in...
    method request_info_for_symbol (line 576) | def request_info_for_symbol(self, symbol: LanguageServerSymbol) -> str...
    method _get_symbol_info_budget (line 581) | def _get_symbol_info_budget(self) -> float:
    method request_info_for_symbol_batch (line 588) | def request_info_for_symbol_batch(
    method can_analyze_file (line 684) | def can_analyze_file(self, relative_file_path: str) -> bool:
    method get_language_server (line 687) | def get_language_server(self, relative_path: str) -> SolidLanguageServer:
    method find (line 691) | def find(
    method find_unique (line 723) | def find_unique(
    method find_by_location (line 755) | def find_by_location(self, location: LanguageServerSymbolLocation) -> ...
    method find_referencing_symbols (line 766) | def find_referencing_symbols(
    method find_referencing_symbols_by_location (line 790) | def find_referencing_symbols_by_location(
    method get_symbol_overview (line 836) | def get_symbol_overview(self, relative_path: str) -> dict[str, list[La...
  class JetBrainsSymbol (line 847) | class JetBrainsSymbol(Symbol):
    method __init__ (line 848) | def __init__(self, symbol_dict: jb.SymbolDTO, project: Project) -> None:
    method _tostring_includes (line 858) | def _tostring_includes(self) -> list[str]:
    method _tostring_additional_entries (line 861) | def _tostring_additional_entries(self) -> dict[str, Any]:
    method get_name_path (line 864) | def get_name_path(self) -> str:
    method get_relative_path (line 867) | def get_relative_path(self) -> str:
    method get_file_content (line 870) | def get_file_content(self) -> str:
    method is_position_in_file_available (line 877) | def is_position_in_file_available(self) -> bool:
    method get_body_start_position (line 880) | def get_body_start_position(self) -> PositionInFile | None:
    method get_body_end_position (line 889) | def get_body_end_position(self) -> PositionInFile | None:
    method is_neighbouring_definition_separated_by_empty_line (line 898) | def is_neighbouring_definition_separated_by_empty_line(self) -> bool:
  class SymbolDictGrouper (line 907) | class SymbolDictGrouper(Generic[TSymbolDict], ABC):
    method __init__ (line 916) | def __init__(
    method _group_by (line 944) | def _group_by(self, l: list[dict], keys: list[str], children_keys: lis...
    method _transform_item (line 969) | def _transform_item(self, item: dict) -> dict:
    method group (line 988) | def group(self, symbols: list[TSymbolDict]) -> GroupedSymbolDict:
  class LanguageServerSymbolDictGrouper (line 996) | class LanguageServerSymbolDictGrouper(SymbolDictGrouper[LanguageServerSy...
    method __init__ (line 997) | def __init__(
  class JetBrainsSymbolDictGrouper (line 1006) | class JetBrainsSymbolDictGrouper(SymbolDictGrouper[jb.SymbolDTO]):
    method __init__ (line 1007) | def __init__(
    method _transform_item (line 1017) | def _transform_item(self, item: dict) -> dict:

FILE: src/serena/task_executor.py
  class TaskExecutor (line 18) | class TaskExecutor:
    method __init__ (line 19) | def __init__(self, name: str):
    class Task (line 28) | class Task(ToStringMixin, Generic[T]):
      method __init__ (line 29) | def __init__(self, function: Callable[[], T], name: str, logged: boo...
      method _tostring_includes (line 42) | def _tostring_includes(self) -> list[str]:
      method start (line 45) | def start(self) -> None:
      method is_done (line 68) | def is_done(self) -> bool:
      method result (line 74) | def result(self, timeout: float | None = None) -> T:
      method cancel (line 87) | def cancel(self) -> None:
      method wait_until_done (line 95) | def wait_until_done(self, timeout: float | None = None) -> None:
    method _process_task_queue (line 108) | def _process_task_queue(self) -> None:
    class TaskInfo (line 134) | class TaskInfo:
      method finished_successfully (line 147) | def finished_successfully(self) -> bool:
      method from_task (line 151) | def from_task(task: "TaskExecutor.Task", is_running: bool) -> "TaskE...
      method cancel (line 154) | def cancel(self) -> None:
    method get_current_tasks (line 157) | def get_current_tasks(self) -> list[TaskInfo]:
    method issue_task (line 173) | def issue_task(self, task: Callable[[], T], name: str | None = None, l...
    method execute_task (line 197) | def execute_task(self, task: Callable[[], T], name: str | None = None,...
    method get_last_executed_task (line 211) | def get_last_executed_task(self) -> TaskInfo | None:

FILE: src/serena/tools/cmd_tools.py
  class ExecuteShellCommandTool (line 11) | class ExecuteShellCommandTool(Tool, ToolMarkerCanEdit):
    method apply (line 16) | def apply(

FILE: src/serena/tools/config_tools.py
  class OpenDashboardTool (line 4) | class OpenDashboardTool(Tool, ToolMarkerOptional, ToolMarkerDoesNotRequi...
    method apply (line 10) | def apply(self) -> str:
  class ActivateProjectTool (line 20) | class ActivateProjectTool(Tool, ToolMarkerDoesNotRequireActiveProject):
    method apply (line 25) | def apply(self, project: str) -> str:
  class RemoveProjectTool (line 37) | class RemoveProjectTool(Tool, ToolMarkerDoesNotRequireActiveProject, Too...
    method apply (line 42) | def apply(self, project_name: str) -> str:
  class SwitchModesTool (line 52) | class SwitchModesTool(Tool, ToolMarkerOptional):
    method apply (line 57) | def apply(self, modes: list[str]) -> str:
  class GetCurrentConfigTool (line 73) | class GetCurrentConfigTool(Tool):
    method apply (line 78) | def apply(self) -> str:

FILE: src/serena/tools/file_tools.py
  class ReadFileTool (line 20) | class ReadFileTool(Tool):
    method apply (line 25) | def apply(self, relative_path: str, start_line: int = 0, end_line: int...
  class CreateTextFileTool (line 51) | class CreateTextFileTool(Tool, ToolMarkerCanEdit):
    method apply (line 56) | def apply(self, relative_path: str, content: str) -> str:
  class ListDirTool (line 83) | class ListDirTool(Tool):
    method apply (line 88) | def apply(self, relative_path: str, recursive: bool, skip_ignored_file...
  class FindFileTool (line 123) | class FindFileTool(Tool):
    method apply (line 128) | def apply(self, file_mask: str, relative_path: str) -> str:
  class ReplaceContentTool (line 159) | class ReplaceContentTool(Tool, ToolMarkerCanEdit):
    method apply (line 164) | def apply(
    method replace_content (line 202) | def replace_content(
  class DeleteLinesTool (line 224) | class DeleteLinesTool(Tool, ToolMarkerCanEdit, ToolMarkerOptional):
    method apply (line 229) | def apply(
  class ReplaceLinesTool (line 249) | class ReplaceLinesTool(Tool, ToolMarkerCanEdit, ToolMarkerOptional):
    method apply (line 254) | def apply(
  class InsertAtLineTool (line 280) | class InsertAtLineTool(Tool, ToolMarkerCanEdit, ToolMarkerOptional):
    method apply (line 285) | def apply(
  class SearchForPatternTool (line 308) | class SearchForPatternTool(Tool):
    method apply (line 313) | def apply(

FILE: src/serena/tools/jetbrains_tools.py
  class JetBrainsFindSymbolTool (line 12) | class JetBrainsFindSymbolTool(Tool, ToolMarkerSymbolicRead, ToolMarkerOp...
    method apply (line 17) | def apply(
  class JetBrainsFindReferencingSymbolsTool (line 91) | class JetBrainsFindReferencingSymbolsTool(Tool, ToolMarkerSymbolicRead, ...
    method apply (line 99) | def apply(
  class JetBrainsGetSymbolsOverviewTool (line 128) | class JetBrainsGetSymbolsOverviewTool(Tool, ToolMarkerSymbolicRead, Tool...
    method apply (line 136) | def apply(
  class JetBrainsTypeHierarchyTool (line 173) | class JetBrainsTypeHierarchyTool(Tool, ToolMarkerSymbolicRead, ToolMarke...
    method _transform_hierarchy_nodes (line 179) | def _transform_hierarchy_nodes(nodes: list[jb.TypeHierarchyNodeDTO] | ...
    method apply (line 211) | def apply(

FILE: src/serena/tools/memory_tools.py
  class WriteMemoryTool (line 6) | class WriteMemoryTool(Tool, ToolMarkerCanEdit):
    method apply (line 12) | def apply(self, memory_name: str, content: str, max_chars: int = -1) -...
  class ReadMemoryTool (line 33) | class ReadMemoryTool(Tool):
    method apply (line 41) | def apply(self, memory_name: str) -> str:
  class ListMemoriesTool (line 49) | class ListMemoriesTool(Tool):
    method apply (line 54) | def apply(self, topic: str = "") -> str:
  class DeleteMemoryTool (line 61) | class DeleteMemoryTool(Tool, ToolMarkerCanEdit):
    method apply (line 68) | def apply(self, memory_name: str) -> str:
  class RenameMemoryTool (line 75) | class RenameMemoryTool(Tool, ToolMarkerCanEdit):
    method apply (line 81) | def apply(self, old_name: str, new_name: str) -> str:
  class EditMemoryTool (line 89) | class EditMemoryTool(Tool, ToolMarkerCanEdit):
    method apply (line 94) | def apply(

FILE: src/serena/tools/query_project_tools.py
  class ListQueryableProjectsTool (line 9) | class ListQueryableProjectsTool(Tool, ToolMarkerOptional, ToolMarkerDoes...
    method apply (line 14) | def apply(self, symbol_access: bool = True) -> str:
  class QueryProjectTool (line 42) | class QueryProjectTool(Tool, ToolMarkerOptional, ToolMarkerDoesNotRequir...
    method apply (line 48) | def apply(self, project_name: str, tool_name: str, tool_params_json: s...
    method _is_project_server_required (line 70) | def _is_project_server_required(self, tool: Tool) -> bool:

FILE: src/serena/tools/symbol_tools.py
  class RestartLanguageServerTool (line 19) | class RestartLanguageServerTool(Tool, ToolMarkerOptional):
    method apply (line 22) | def apply(self) -> str:
  class GetSymbolsOverviewTool (line 30) | class GetSymbolsOverviewTool(Tool, ToolMarkerSymbolicRead):
    method apply (line 37) | def apply(self, relative_path: str, depth: int = 0, max_answer_chars: ...
    method get_symbol_overview (line 56) | def get_symbol_overview(self, relative_path: str, depth: int = 0) -> l...
  class FindSymbolTool (line 97) | class FindSymbolTool(Tool, ToolMarkerSymbolicRead):
    method apply (line 103) | def apply(
  class FindReferencingSymbolsTool (line 175) | class FindReferencingSymbolsTool(Tool, ToolMarkerSymbolicRead):
    method apply (line 183) | def apply(
  class ReplaceSymbolBodyTool (line 235) | class ReplaceSymbolBodyTool(Tool, ToolMarkerSymbolicEdit):
    method apply (line 240) | def apply(
  class InsertAfterSymbolTool (line 268) | class InsertAfterSymbolTool(Tool, ToolMarkerSymbolicEdit):
    method apply (line 273) | def apply(
  class InsertBeforeSymbolTool (line 293) | class InsertBeforeSymbolTool(Tool, ToolMarkerSymbolicEdit):
    method apply (line 298) | def apply(
  class RenameSymbolTool (line 318) | class RenameSymbolTool(Tool, ToolMarkerSymbolicEdit):
    method apply (line 323) | def apply(

FILE: src/serena/tools/tools_base.py
  class Component (line 32) | class Component(ABC):
    method __init__ (line 33) | def __init__(self, agent: "SerenaAgent"):
    method get_project_root (line 36) | def get_project_root(self) -> str:
    method prompt_factory (line 43) | def prompt_factory(self) -> PromptFactory:
    method memories_manager (line 47) | def memories_manager(self) -> "MemoriesManager":
    method create_language_server_symbol_retriever (line 50) | def create_language_server_symbol_retriever(self) -> "LanguageServerSy...
    method project (line 57) | def project(self) -> Project:
    method create_code_editor (line 60) | def create_code_editor(self) -> "CodeEditor":
  class ToolMarker (line 72) | class ToolMarker:
  class ToolMarkerCanEdit (line 78) | class ToolMarkerCanEdit(ToolMarker):
  class ToolMarkerDoesNotRequireActiveProject (line 84) | class ToolMarkerDoesNotRequireActiveProject(ToolMarker):
  class ToolMarkerOptional (line 88) | class ToolMarkerOptional(ToolMarker):
  class ToolMarkerSymbolicRead (line 94) | class ToolMarkerSymbolicRead(ToolMarker):
  class ToolMarkerSymbolicEdit (line 100) | class ToolMarkerSymbolicEdit(ToolMarkerCanEdit):
  class ApplyMethodProtocol (line 106) | class ApplyMethodProtocol(Protocol):
    method __call__ (line 109) | def __call__(self, *args: Any, **kwargs: Any) -> str:
  class Tool (line 113) | class Tool(Component):
    method set_last_tool_call_client_str (line 128) | def set_last_tool_call_client_str(cls, client_str: str | None) -> None:
    method get_last_tool_call_client_str (line 132) | def get_last_tool_call_client_str(cls) -> str | None:
    method get_name_from_cls (line 136) | def get_name_from_cls(cls) -> str:
    method get_name (line 144) | def get_name(self) -> str:
    method get_apply_fn (line 147) | def get_apply_fn(self) -> ApplyMethodProtocol:
    method can_edit (line 154) | def can_edit(cls) -> bool:
    method get_tool_description (line 163) | def get_tool_description(cls) -> str:
    method get_apply_docstring_from_cls (line 170) | def get_apply_docstring_from_cls(cls) -> str:
    method get_apply_docstring (line 188) | def get_apply_docstring(self) -> str:
    method get_apply_fn_metadata (line 192) | def get_apply_fn_metadata(self) -> FuncMetadata:
    method get_apply_fn_metadata_from_cls (line 197) | def get_apply_fn_metadata_from_cls(cls) -> FuncMetadata:
    method _log_tool_application (line 212) | def _log_tool_application(self, frame: Any) -> None:
    method _limit_length (line 224) | def _limit_length(self, result: str, max_answer_chars: int) -> str:
    method is_active (line 236) | def is_active(self) -> bool:
    method is_readonly (line 239) | def is_readonly(self) -> bool:
    method is_symbolic (line 242) | def is_symbolic(self) -> bool:
    method apply_ex (line 245) | def apply_ex(self, log_call: bool = True, catch_exceptions: bool = Tru...
    method _to_json (line 333) | def _to_json(x: Any) -> str:
  class EditedFileContext (line 337) | class EditedFileContext:
    method __init__ (line 346) | def __init__(self, relative_path: str, code_editor: "CodeEditor"):
    method __enter__ (line 352) | def __enter__(self) -> Self:
    method get_original_content (line 357) | def get_original_content(self) -> str:
    method set_updated_content (line 364) | def set_updated_content(self, content: str) -> None:
    method __exit__ (line 374) | def __exit__(self, exc_type: type[BaseException] | None, exc_value: Ba...
  class RegisteredTool (line 380) | class RegisteredTool:
    method class_docstring (line 386) | def class_docstring(self) -> str:
  class ToolRegistry (line 397) | class ToolRegistry:
    method __init__ (line 398) | def __init__(self) -> None:
    method get_registered_tools_by_module (line 410) | def get_registered_tools_by_module(self) -> dict[str, list[RegisteredT...
    method get_tool_class_by_name (line 425) | def get_tool_class_by_name(self, tool_name: str) -> type[Tool]:
    method get_all_tool_classes (line 430) | def get_all_tool_classes(self) -> list[type[Tool]]:
    method get_tool_classes_default_enabled (line 433) | def get_tool_classes_default_enabled(self) -> list[type[Tool]]:
    method get_tool_classes_optional (line 439) | def get_tool_classes_optional(self) -> list[type[Tool]]:
    method get_tool_names_default_enabled (line 445) | def get_tool_names_default_enabled(self) -> list[str]:
    method get_tool_names_optional (line 451) | def get_tool_names_optional(self) -> list[str]:
    method get_tool_names (line 457) | def get_tool_names(self) -> list[str]:
    method print_tool_overview (line 463) | def print_tool_overview(
    method is_valid_tool_name (line 484) | def is_valid_tool_name(self, tool_name: str) -> bool:

FILE: src/serena/tools/workflow_tools.py
  class CheckOnboardingPerformedTool (line 10) | class CheckOnboardingPerformedTool(Tool):
    method apply (line 15) | def apply(self) -> str:
  class OnboardingTool (line 37) | class OnboardingTool(Tool):
    method apply (line 42) | def apply(self) -> str:
  class ThinkAboutCollectedInformationTool (line 53) | class ThinkAboutCollectedInformationTool(Tool, ToolMarkerOptional):
    method apply (line 58) | def apply(self) -> str:
  class ThinkAboutTaskAdherenceTool (line 67) | class ThinkAboutTaskAdherenceTool(Tool, ToolMarkerOptional):
    method apply (line 72) | def apply(self) -> str:
  class ThinkAboutWhetherYouAreDoneTool (line 83) | class ThinkAboutWhetherYouAreDoneTool(Tool, ToolMarkerOptional):
    method apply (line 88) | def apply(self) -> str:
  class SummarizeChangesTool (line 95) | class SummarizeChangesTool(Tool, ToolMarkerOptional):
    method apply (line 100) | def apply(self) -> str:
  class PrepareForNewConversationTool (line 109) | class PrepareForNewConversationTool(Tool):
    method apply (line 114) | def apply(self) -> str:
  class InitialInstructionsTool (line 121) | class InitialInstructionsTool(Tool, ToolMarkerDoesNotRequireActiveProject):
    method apply (line 129) | def apply(self) -> str:

FILE: src/serena/util/class_decorators.py
  function singleton (line 6) | def singleton(cls: type[Any]) -> Any:

FILE: src/serena/util/cli_util.py
  function ask_yes_no (line 1) | def ask_yes_no(question: str, default: bool | None = None) -> bool:

FILE: src/serena/util/dataclass.py
  function get_dataclass_default (line 5) | def get_dataclass_default(cls: type, field_name: str) -> Any:

FILE: src/serena/util/dotnet.py
  class DotNETUtil (line 15) | class DotNETUtil:
    method __init__ (line 16) | def __init__(self, required_version: str, allow_higher_version: bool =...
    method _determine_installed_versions (line 27) | def _determine_installed_versions(self) -> list[Version]:
    method is_required_version_available (line 41) | def is_required_version_available(self) -> bool:
    method get_dotnet_path_or_raise (line 60) | def get_dotnet_path_or_raise(self) -> str:
    method install_dotnet_with_script (line 75) | def install_dotnet_with_script(version: str, base_path: str) -> str:

FILE: src/serena/util/exception.py
  function is_headless_environment (line 7) | def is_headless_environment() -> bool:
  function show_fatal_exception_safe (line 43) | def show_fatal_exception_safe(e: Exception) -> None:

FILE: src/serena/util/file_system.py
  class ScanResult (line 15) | class ScanResult(NamedTuple):
  function scan_directory (line 22) | def scan_directory(
  function find_all_non_ignored_files (line 91) | def find_all_non_ignored_files(repo_root: str) -> list[str]:
  class GitignoreSpec (line 106) | class GitignoreSpec:
    method __post_init__ (line 116) | def __post_init__(self) -> None:
    method matches (line 120) | def matches(self, relative_path: str) -> bool:
  class GitignoreParser (line 130) | class GitignoreParser:
    method __init__ (line 138) | def __init__(self, repo_root: str) -> None:
    method _load_gitignore_files (line 148) | def _load_gitignore_files(self) -> None:
    method _iter_gitignore_files (line 157) | def _iter_gitignore_files(self, follow_symlinks: bool = False) -> Iter...
    method _create_ignore_spec (line 181) | def _create_ignore_spec(self, gitignore_file_path: str) -> GitignoreSpec:
    method _parse_gitignore_content (line 200) | def _parse_gitignore_content(self, content: str, gitignore_dir: str) -...
    method should_ignore (line 277) | def should_ignore(self, path: str) -> bool:
    method get_ignore_specs (line 316) | def get_ignore_specs(self) -> list[GitignoreSpec]:
    method reload (line 324) | def reload(self) -> None:
  function match_path (line 330) | def match_path(relative_path: str, path_spec: PathSpec, root_path: str =...

FILE: src/serena/util/git.py
  function get_git_status (line 10) | def get_git_status() -> GitStatus | None:

FILE: src/serena/util/gui.py
  function system_has_usable_display (line 5) | def system_has_usable_display() -> bool:

FILE: src/serena/util/inspection.py
  function iter_subclasses (line 14) | def iter_subclasses(
  function determine_programming_language_composition (line 30) | def determine_programming_language_composition(repo_path: str) -> dict[L...

FILE: src/serena/util/logging.py
  class LogMessages (line 15) | class LogMessages:
  class MemoryLogHandler (line 26) | class MemoryLogHandler(logging.Handler):
    method __init__ (line 27) | def __init__(self, level: int = logging.NOTSET, max_messages: int | No...
    method add_emit_callback (line 39) | def add_emit_callback(self, callback: Callable[[str], None]) -> None:
    method emit (line 46) | def emit(self, record: logging.LogRecord) -> None:
    method _process_queue (line 50) | def _process_queue(self) -> None:
    method get_log_messages (line 64) | def get_log_messages(self, from_idx: int = 0) -> LogMessages:
    method clear_log_messages (line 67) | def clear_log_messages(self) -> None:
  class LogBuffer (line 71) | class LogBuffer:
    method __init__ (line 76) | def __init__(self, max_messages: int | None = None) -> None:
    method append (line 85) | def append(self, msg: str) -> None:
    method clear (line 93) | def clear(self) -> None:
    method get_log_messages (line 98) | def get_log_messages(self, from_idx: int = 0) -> LogMessages:
  class SuspendedLoggersContext (line 116) | class SuspendedLoggersContext:
    method __init__ (line 137) | def __init__(self) -> None:
    method __enter__ (line 141) | def __enter__(self) -> "SuspendedLoggersContext":
    method __exit__ (line 148) | def __exit__(self, exc_type, exc_val, exc_tb) -> None:  # type: ignore

FILE: src/serena/util/shell.py
  class ShellCommandResult (line 9) | class ShellCommandResult(BaseModel):
  function execute_shell_command (line 16) | def execute_shell_command(command: str, cwd: str | None = None, capture_...
  function subprocess_check_output (line 45) | def subprocess_check_output(args: list[str], encoding: str = "utf-8", st...

FILE: src/serena/util/text_utils.py
  class LineType (line 18) | class LineType(StrEnum):
  class TextLine (line 30) | class TextLine:
    method get_display_prefix (line 38) | def get_display_prefix(self) -> str:
    method format_line (line 44) | def format_line(self, include_line_numbers: bool = True) -> str:
  class MatchedConsecutiveLines (line 57) | class MatchedConsecutiveLines:
    method __post_init__ (line 72) | def __post_init__(self) -> None:
    method start_line (line 84) | def start_line(self) -> int:
    method end_line (line 88) | def end_line(self) -> int:
    method num_matched_lines (line 92) | def num_matched_lines(self) -> int:
    method to_display_string (line 95) | def to_display_string(self, include_line_numbers: bool = True) -> str:
    method from_file_contents (line 99) | def from_file_contents(
  function glob_to_regex (line 118) | def glob_to_regex(glob_pat: str) -> str:
  function search_text (line 139) | def search_text(
  function default_file_reader (line 241) | def default_file_reader(file_path: str) -> str:
  function expand_braces (line 247) | def expand_braces(pattern: str) -> list[str]:
  function glob_match (line 270) | def glob_match(pattern: str, path: str) -> bool:
  function search_files (line 323) | def search_files(
  function render_html (line 411) | def render_html(html: str) -> str:
  class ContentReplacer (line 429) | class ContentReplacer:
    method __init__ (line 435) | def __init__(self, mode: Literal["literal", "regex"], allow_multiple_o...
    method _create_replacement_function (line 447) | def _create_replacement_function(regex_pattern: str, repl_template: st...
    method replace (line 486) | def replace(

FILE: src/serena/util/thread.py
  class TimeoutException (line 9) | class TimeoutException(Exception):
    method __init__ (line 10) | def __init__(self, message: str, timeout: float) -> None:
  class ExecutionResult (line 18) | class ExecutionResult(Generic[T], ToStringMixin):
    class Status (line 20) | class Status(Enum):
    method __init__ (line 25) | def __init__(self) -> None:
    method set_result_value (line 30) | def set_result_value(self, value: T) -> None:
    method set_timed_out (line 34) | def set_timed_out(self, exception: TimeoutException) -> None:
    method set_exception (line 38) | def set_exception(self, exception: Exception) -> None:
  function execute_with_timeout (line 43) | def execute_with_timeout(func: Callable[[], T], timeout: float, function...

FILE: src/serena/util/version.py
  class Version (line 1) | class Version:
    method __init__ (line 9) | def __init__(self, package_or_version: object | str):
    method __repr__ (line 26) | def __repr__(self) -> str:
    method _get_version_components (line 30) | def _get_version_components(version_string: str) -> list[int]:
    method is_at_least (line 45) | def is_at_least(self, *components: int) -> bool:
    method is_at_most (line 61) | def is_at_most(self, *components: int) -> bool:
    method is_equal (line 77) | def is_equal(self, *components: int) -> bool:

FILE: src/serena/util/yaml.py
  function _create_yaml (line 15) | def _create_yaml(preserve_comments: bool = False) -> YAML:
  class YamlCommentNormalisation (line 25) | class YamlCommentNormalisation(Enum):
  function load_yaml (line 63) | def load_yaml(path: str, comment_normalisation: YamlCommentNormalisation...
  function normalise_yaml_comments (line 78) | def normalise_yaml_comments(commented_map: CommentedMap, comment_normali...
  function save_yaml (line 183) | def save_yaml(path: str, data: dict | CommentedMap, preserve_comments: b...
  function yaml_comment_entry_is_empty (line 190) | def yaml_comment_entry_is_empty(comment_entry: Any) -> bool:
  function transfer_missing_yaml_comments_by_index (line 207) | def transfer_missing_yaml_comments_by_index(
  function transfer_missing_yaml_comments (line 233) | def transfer_missing_yaml_comments(

FILE: src/solidlsp/language_servers/al_language_server.py
  class ALLanguageServer (line 28) | class ALLanguageServer(SolidLanguageServer):
    method _extract_al_display_name (line 59) | def _extract_al_display_name(full_name: str) -> str:
    method __init__ (line 82) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _normalize_path (line 117) | def _normalize_path(path: str) -> str:
    method _download_al_extension (line 122) | def _download_al_extension(cls, url: str, target_dir: str) -> bool:
    method _setup_runtime_dependencies (line 192) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method _find_al_extension (line 233) | def _find_al_extension(cls, solidlsp_settings: SolidLSPSettings) -> st...
    method _download_and_install_al_extension (line 270) | def _download_and_install_al_extension(cls, solidlsp_settings: SolidLS...
    method _get_executable_path (line 299) | def _get_executable_path(cls, extension_path: str, system: str) -> str:
    method _prepare_executable (line 321) | def _prepare_executable(cls, executable_path: str, system: str) -> str:
    method _get_language_server_command_fallback (line 347) | def _get_language_server_command_fallback(cls) -> str:
    method _find_al_extension_in_vscode (line 417) | def _find_al_extension_in_vscode(cls) -> str | None:
    method _get_initialize_params (line 459) | def _get_initialize_params(repository_absolute_path: str) -> dict:
    method _start_server (line 528) | def _start_server(self) -> None:
    method start (line 582) | def start(self) -> "ALLanguageServer":
    method _post_initialize_al_workspace (line 597) | def _post_initialize_al_workspace(self) -> None:
    method is_ignored_dirname (line 689) | def is_ignored_dirname(self, dirname: str) -> bool:
    method request_full_symbol_tree (line 720) | def request_full_symbol_tree(self, within_relative_path: str | None = ...
    method _send_definition_request (line 884) | def _send_definition_request(self, definition_params: DefinitionParams...
    method check_project_loaded (line 908) | def check_project_loaded(self) -> bool:
    method _wait_for_project_load (line 951) | def _wait_for_project_load(self, timeout: int = 3) -> bool:
    method set_active_workspace (line 979) | def set_active_workspace(self, workspace_uri: str | None = None) -> None:
    method request_document_symbols (line 1011) | def request_document_symbols(self, relative_file_path: str, file_buffe...
    method request_hover (line 1058) | def request_hover(

FILE: src/solidlsp/language_servers/ansible_language_server.py
  function _deep_merge (line 24) | def _deep_merge(base: dict, override: dict) -> None:
  class AnsibleLanguageServer (line 33) | class AnsibleLanguageServer(SolidLanguageServer):
    method _is_ansible_path (line 81) | def _is_ansible_path(relative_path: str) -> bool:
    method is_ignored_path (line 112) | def is_ignored_path(self, relative_path: str, ignore_unsupported_files...
    method _determine_log_level (line 125) | def _determine_log_level(line: str) -> int:
    method __init__ (line 140) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 154) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 157) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 158) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 198) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 201) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_server (line 279) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/bash_language_server.py
  class BashLanguageServer (line 27) | class BashLanguageServer(SolidLanguageServer):
    method __init__ (line 33) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 48) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 51) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 52) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 93) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 97) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 137) | def _start_server(self) -> None:
    method request_document_symbols (line 199) | def request_document_symbols(self, relative_file_path: str, file_buffe...

FILE: src/solidlsp/language_servers/ccls_language_server.py
  class CCLS (line 49) | class CCLS(SolidLanguageServer):
    method __init__ (line 59) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 67) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 70) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 71) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 94) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 98) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 128) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/clangd_language_server.py
  class ClangdLanguageServer (line 18) | class ClangdLanguageServer(SolidLanguageServer):
    method __init__ (line 25) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _prepare_compile_commands (line 35) | def _prepare_compile_commands(self) -> str | None:
    method _create_process_launch_info (line 99) | def _create_process_launch_info(self) -> ProcessLaunchInfo:
    method _create_dependency_provider (line 118) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 121) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 122) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 199) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 205) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 238) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/clojure_lsp.py
  function run_command (line 23) | def run_command(cmd: list, capture_output: bool = True) -> subprocess.Co...
  function verify_clojure_cli (line 29) | def verify_clojure_cli() -> None:
  class ClojureLSP (line 43) | class ClojureLSP(SolidLanguageServer):
    method __init__ (line 89) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 105) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 108) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 109) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 126) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 130) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 163) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/common.py
  class RuntimeDependency (line 18) | class RuntimeDependency:
  class RuntimeDependencyCollection (line 33) | class RuntimeDependencyCollection:
    method __init__ (line 36) | def __init__(self, dependencies: Sequence[RuntimeDependency], override...
    method get_dependencies_for_platform (line 59) | def get_dependencies_for_platform(self, platform_id: str) -> list[Runt...
    method get_dependencies_for_current_platform (line 62) | def get_dependencies_for_current_platform(self) -> list[RuntimeDepende...
    method get_single_dep_for_current_platform (line 65) | def get_single_dep_for_current_platform(self, dependency_id: str | Non...
    method binary_path (line 75) | def binary_path(self, target_dir: str) -> str:
    method install (line 81) | def install(self, target_dir: str) -> dict[str, str]:
    method _run_command (line 100) | def _run_command(command: str | list[str], cwd: str) -> None:
    method _install_from_url (line 133) | def _install_from_url(dep: RuntimeDependency, target_dir: str) -> None:
  function quote_windows_path (line 144) | def quote_windows_path(path: str) -> str:

FILE: src/solidlsp/language_servers/csharp_language_server.py
  function breadth_first_file_scan (line 101) | def breadth_first_file_scan(root_dir: str) -> Iterable[str]:
  function find_solution_or_project_file (line 123) | def find_solution_or_project_file(root_dir: str) -> str | None:
  class CSharpLanguageServer (line 145) | class CSharpLanguageServer(SolidLanguageServer):
    method __init__ (line 169) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 179) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method is_ignored_dirname (line 183) | def is_ignored_dirname(self, dirname: str) -> bool:
    method request_document_symbols (line 187) | def request_document_symbols(self, relative_file_path: str, file_buffe...
    method request_hover (line 209) | def request_hover(self, relative_file_path: str, line: int, column: in...
    method _normalize_symbol_name (line 233) | def _normalize_symbol_name(self, symbol: UnifiedSymbolInformation, rel...
    method _extract_base_name_and_type (line 267) | def _extract_base_name_and_type(roslyn_name: str) -> tuple[str, str]:
    class DependencyProvider (line 296) | class DependencyProvider(LanguageServerDependencyProvider):
      method __init__ (line 297) | def __init__(
      method create_launch_command (line 309) | def create_launch_command(self) -> list[str]:
      method _ensure_server_installed (line 330) | def _ensure_server_installed(self) -> tuple[str, str]:
      method _ensure_dotnet_runtime (line 367) | def _ensure_dotnet_runtime(self) -> str:
      method _ensure_language_server (line 371) | def _ensure_language_server(self, lang_server_dep: RuntimeDependency...
      method _extract_language_server (line 402) | def _extract_language_server(lang_server_dep: RuntimeDependency, pac...
      method _download_nuget_package (line 424) | def _download_nuget_package(self, dependency: RuntimeDependency) -> ...
    method _get_initialize_params (line 464) | def _get_initialize_params(self) -> InitializeParams:
    method _start_server (line 519) | def _start_server(self) -> None:
    method _force_pull_diagnostics (line 694) | def _force_pull_diagnostics(self, init_response: dict | InitializeResu...
    method _open_solution_and_projects (line 713) | def _open_solution_and_projects(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 743) | def _get_wait_time_for_cross_file_referencing(self) -> float:

FILE: src/solidlsp/language_servers/dart_language_server.py
  class DartLanguageServer (line 17) | class DartLanguageServer(SolidLanguageServer):
    method __init__ (line 22) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _setup_runtime_dependencies (line 32) | def _setup_runtime_dependencies(cls, solidlsp_settings: SolidLSPSettin...
    method _get_initialize_params (line 90) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 118) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/eclipse_jdtls.py
  class RuntimeDependencyPaths (line 30) | class RuntimeDependencyPaths:
  class EclipseJDTLS (line 45) | class EclipseJDTLS(SolidLanguageServer):
    method __init__ (line 70) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 85) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method is_ignored_dirname (line 90) | def is_ignored_dirname(self, dirname: str) -> bool:
    class DependencyProvider (line 107) | class DependencyProvider(LanguageServerDependencyProvider):
      method __init__ (line 108) | def __init__(
      method _setup_runtime_dependencies (line 121) | def _setup_runtime_dependencies(cls, ls_resources_dir: str) -> Runti...
      method create_launch_command (line 278) | def create_launch_command(self) -> list[str]:
      method create_launch_command_env (line 352) | def create_launch_command_env(self) -> dict[str, str]:
    method _get_initialize_params (line 365) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_server (line 759) | def _start_server(self) -> None:
    method _request_hover (line 852) | def _request_hover(self, file_buffer: LSPFileBuffer, line: int, column...
    method _request_document_symbols (line 895) | def _request_document_symbols(

FILE: src/solidlsp/language_servers/elixir_tools/elixir_tools.py
  class ElixirTools (line 23) | class ElixirTools(SolidLanguageServer):
    method _get_wait_time_for_cross_file_referencing (line 29) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method is_ignored_dirname (line 33) | def is_ignored_dirname(self, dirname: str) -> bool:
    method is_ignored_path (line 44) | def is_ignored_path(self, relative_path: str, ignore_unsupported_files...
    method _get_elixir_version (line 53) | def _get_elixir_version(cls) -> str | None:
    method _setup_runtime_dependencies (line 64) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method __init__ (line 181) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 198) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 265) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/elm_language_server.py
  class ElmLanguageServer (line 25) | class ElmLanguageServer(SolidLanguageServer):
    method __init__ (line 30) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 55) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _setup_runtime_dependencies (line 64) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method _get_initialize_params (line 106) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 154) | def _start_server(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 201) | def _get_wait_time_for_cross_file_referencing(self) -> float:

FILE: src/solidlsp/language_servers/erlang_language_server.py
  class ErlangLanguageServer (line 20) | class ErlangLanguageServer(SolidLanguageServer):
    method __init__ (line 23) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _check_erlang_installation (line 49) | def _check_erlang_installation(self) -> bool:
    method _get_erlang_version (line 58) | def _get_erlang_version(cls) -> str | None:
    method _check_rebar3_available (line 69) | def _check_rebar3_available(cls) -> bool:
    method _start_server (line 77) | def _start_server(self) -> None:
    method is_ignored_dirname (line 196) | def is_ignored_dirname(self, dirname: str) -> bool:
    method is_ignored_filename (line 215) | def is_ignored_filename(self, filename: str) -> bool:

FILE: src/solidlsp/language_servers/fortran_language_server.py
  class FortranLanguageServer (line 23) | class FortranLanguageServer(SolidLanguageServer):
    method _get_wait_time_for_cross_file_referencing (line 27) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method is_ignored_dirname (line 31) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _fix_fortls_selection_range (line 45) | def _fix_fortls_selection_range(
    method request_document_symbols (line 138) | def request_document_symbols(self, relative_file_path: str, file_buffe...
    method _check_fortls_installation (line 174) | def _check_fortls_installation() -> str:
    method __init__ (line 181) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 194) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 245) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/fsharp_language_server.py
  class FSharpLanguageServer (line 26) | class FSharpLanguageServer(SolidLanguageServer):
    method __init__ (line 32) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 49) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _setup_runtime_dependencies (line 61) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method _get_initialize_params (line 117) | def _get_initialize_params(self) -> InitializeParams:
    method _get_dotnet_root (line 259) | def _get_dotnet_root(self) -> str:
    method _start_server (line 285) | def _start_server(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 365) | def _get_wait_time_for_cross_file_referencing(self) -> float:

FILE: src/solidlsp/language_servers/gopls.py
  class Gopls (line 18) | class Gopls(SolidLanguageServer):
    method is_ignored_dirname (line 24) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _determine_log_level (line 32) | def _determine_log_level(line: str) -> int:
    method _get_go_version (line 50) | def _get_go_version() -> str | None:
    method _get_gopls_version (line 61) | def _get_gopls_version() -> str | None:
    method _setup_runtime_dependency (line 72) | def _setup_runtime_dependency() -> bool:
    method __init__ (line 93) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 99) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _validate_gopls_settings_dict (line 147) | def _validate_gopls_settings_dict(self, gopls_settings: object) -> dict:
    method _canonical_json_or_raise (line 156) | def _canonical_json_or_raise(self, json_module: Any, data: object) -> ...
    method _document_symbols_cache_fingerprint (line 168) | def _document_symbols_cache_fingerprint(self) -> str | None:
    method _start_server (line 205) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/groovy_language_server.py
  class GroovyRuntimeDependencyPaths (line 22) | class GroovyRuntimeDependencyPaths:
  class GroovyLanguageServer (line 33) | class GroovyLanguageServer(SolidLanguageServer):
    method __init__ (line 39) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _setup_runtime_dependencies (line 74) | def _setup_runtime_dependencies(cls, solidlsp_settings: SolidLSPSettin...
    method _find_groovy_ls_jar (line 165) | def _find_groovy_ls_jar(cls, solidlsp_settings: SolidLSPSettings) -> str:
    method _get_initialize_params (line 187) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 234) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/haskell_language_server.py
  class HaskellLanguageServer (line 23) | class HaskellLanguageServer(SolidLanguageServer):
    method _ensure_hls_installed (line 30) | def _ensure_hls_installed() -> str:
    method __init__ (line 75) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 107) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 111) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 314) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/hlsl_language_server.py
  class HlslLanguageServer (line 29) | class HlslLanguageServer(SolidLanguageServer):
    method __init__ (line 35) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 39) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 42) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 43) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 129) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 133) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 177) | def _start_server(self) -> None:
    method stop (line 218) | def stop(self, shutdown_timeout: float = 2.0) -> None:
    method is_ignored_dirname (line 250) | def is_ignored_dirname(self, dirname: str) -> bool:

FILE: src/solidlsp/language_servers/intelephense.py
  class Intelephense (line 25) | class Intelephense(SolidLanguageServer):
    method is_ignored_dirname (line 36) | def is_ignored_dirname(self, dirname: str) -> bool:
    class DependencyProvider (line 39) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 40) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 85) | def _create_launch_command(self, core_path: str) -> list[str]:
    method __init__ (line 88) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 101) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method _get_initialize_params (line 104) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_server (line 155) | def _start_server(self) -> None:
    method _send_references_request (line 194) | def _send_references_request(self, relative_file_path: str, line: int,...
    method _send_definition_request (line 204) | def _send_definition_request(self, definition_params: DefinitionParams...

FILE: src/solidlsp/language_servers/jedi_server.py
  class JediServer (line 22) | class JediServer(SolidLanguageServer):
    method __init__ (line 27) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 40) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 44) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 155) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/julia_server.py
  class JuliaLanguageServer (line 20) | class JuliaLanguageServer(SolidLanguageServer):
    method __init__ (line 25) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _setup_runtime_dependency (line 52) | def _setup_runtime_dependency() -> str:
    method _install_language_server (line 95) | def _install_language_server(julia_path: str) -> None:
    method is_ignored_dirname (line 114) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 118) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_server (line 144) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/kotlin_language_server.py
  class KotlinLanguageServer (line 57) | class KotlinLanguageServer(SolidLanguageServer):
    method __init__ (line 62) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 82) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 85) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method __init__ (line 86) | def __init__(self, custom_settings: SolidLSPSettings.CustomLSSetting...
      method _get_or_install_core_dependency (line 90) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 130) | def _create_launch_command(self, core_path: str) -> list[str]:
      method create_launch_command_env (line 133) | def create_launch_command_env(self) -> dict[str, str]:
    method _get_initialize_params (line 153) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 406) | def _start_server(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 501) | def _get_wait_time_for_cross_file_referencing(self) -> float:

FILE: src/solidlsp/language_servers/lean4_language_server.py
  class Lean4LanguageServer (line 23) | class Lean4LanguageServer(SolidLanguageServer):
    class DependencyProvider (line 30) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method __init__ (line 31) | def __init__(self, custom_settings: SolidLSPSettings.CustomLSSetting...
      method _get_or_install_core_dependency (line 35) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 46) | def _create_launch_command(self, core_path: str) -> list[str]:
      method create_launch_command_env (line 50) | def create_launch_command_env(self) -> dict[str, str]:
    method __init__ (line 79) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 92) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method is_ignored_dirname (line 96) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 100) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 142) | def _start_server(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 173) | def _get_wait_time_for_cross_file_referencing(self) -> float:

FILE: src/solidlsp/language_servers/lua_ls.py
  class LuaLanguageServer (line 26) | class LuaLanguageServer(SolidLanguageServer):
    method is_ignored_dirname (line 32) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_lua_ls_path (line 40) | def _get_lua_ls_path() -> str | None:
    method _download_lua_ls (line 72) | def _download_lua_ls() -> str:
    method _setup_runtime_dependency (line 143) | def _setup_runtime_dependency() -> str:
    method __init__ (line 157) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 166) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 251) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/luau_lsp.py
  class LuauLanguageServer (line 56) | class LuauLanguageServer(SolidLanguageServer):
    method is_ignored_dirname (line 63) | def is_ignored_dirname(self, dirname: str) -> bool:
    class DependencyProvider (line 74) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 75) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 81) | def _create_launch_command(self, core_path: str) -> list[str]:
      method _download_luau_lsp (line 91) | def _download_luau_lsp(self) -> str:
      method _resolve_support_files (line 124) | def _resolve_support_files(self) -> tuple[str | None, str | None]:
      method _download_standard_docs (line 132) | def _download_standard_docs(self) -> str | None:
      method _download_roblox_support_files (line 142) | def _download_roblox_support_files(self, security_level: str) -> tup...
      method _download_auxiliary_file (line 161) | def _download_auxiliary_file(path: Path, url: str, description: str)...
      method _find_existing_binary (line 176) | def _find_existing_binary(cls, install_dir: Path) -> str | None:
      method _ensure_executable_bit (line 191) | def _ensure_executable_bit(binary_path: Path) -> None:
      method _get_binary_name (line 196) | def _get_binary_name() -> str:
      method _get_luau_lsp_asset_name (line 200) | def _get_luau_lsp_asset_name() -> str:
    method _get_platform_type (line 221) | def _get_platform_type(custom_settings: SolidLSPSettings.CustomLSSetti...
    method _get_roblox_security_level (line 228) | def _get_roblox_security_level(custom_settings: SolidLSPSettings.Custo...
    method _get_workspace_configuration (line 238) | def _get_workspace_configuration(cls, custom_settings: SolidLSPSetting...
    method _create_dependency_provider (line 241) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method __init__ (line 244) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 249) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 315) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/marksman.py
  class Marksman (line 30) | class Marksman(SolidLanguageServer):
    class DependencyProvider (line 35) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 77) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 94) | def _create_launch_command(self, core_path: str) -> list[str]:
    method __init__ (line 97) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 110) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method is_ignored_dirname (line 114) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _document_symbols_cache_fingerprint (line 117) | def _document_symbols_cache_fingerprint(self) -> Hashable | None:
    method request_document_symbols (line 122) | def request_document_symbols(self, relative_file_path: str, file_buffe...
    method _get_initialize_params (line 147) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 186) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/matlab_language_server.py
  class MatlabLanguageServer (line 61) | class MatlabLanguageServer(SolidLanguageServer):
    method __init__ (line 77) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 96) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 99) | class DependencyProvider(LanguageServerDependencyProvider):
      method __init__ (line 100) | def __init__(self, custom_settings: SolidLSPSettings.CustomLSSetting...
      method _download_matlab_extension (line 105) | def _download_matlab_extension(cls, url: str, target_dir: str) -> bool:
      method _find_matlab_extension (line 167) | def _find_matlab_extension(self) -> str | None:
      method _download_and_install_matlab_extension (line 207) | def _download_and_install_matlab_extension(self) -> str | None:
      method _get_executable_path (line 232) | def _get_executable_path(cls, extension_path: str) -> str:
      method _find_matlab_installation (line 253) | def _find_matlab_installation() -> str:
      method get_matlab_path (line 323) | def get_matlab_path(self) -> str:
      method create_launch_command (line 342) | def create_launch_command(self) -> list[str]:
      method create_launch_command_env (line 373) | def create_launch_command_env(self) -> dict[str, str]:
    method _get_initialize_params (line 379) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 423) | def _start_server(self) -> None:
    method is_ignored_dirname (line 513) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _request_document_symbols (line 522) | def _request_document_symbols(
    method _normalize_matlab_symbols (line 540) | def _normalize_matlab_symbols(self, symbols: list[SymbolInformation] |...

FILE: src/solidlsp/language_servers/nixd_ls.py
  class NixLanguageServer (line 28) | class NixLanguageServer(SolidLanguageServer):
    method _extend_nix_symbol_range_to_include_semicolon (line 33) | def _extend_nix_symbol_range_to_include_semicolon(
    method request_document_symbols (line 74) | def request_document_symbols(self, relative_file_path: str, file_buffe...
    method is_ignored_dirname (line 102) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_nixd_version (line 110) | def _get_nixd_version():
    method _check_nixd_installed (line 122) | def _check_nixd_installed():
    method _get_nixd_path (line 127) | def _get_nixd_path():
    method _install_nixd_with_nix (line 162) | def _install_nixd_with_nix():
    method _setup_runtime_dependency (line 209) | def _setup_runtime_dependency():
    method __init__ (line 247) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 254) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 344) | def _start_server(self):

FILE: src/solidlsp/language_servers/ocaml_lsp_server.py
  class OcamlLanguageServer (line 29) | class OcamlLanguageServer(SolidLanguageServer):
    method _ensure_opam_installed (line 43) | def _ensure_opam_installed() -> None:
    method _detect_ocaml_version (line 59) | def _detect_ocaml_version(repository_root_path: str) -> tuple[int, int...
    method _detect_lsp_version (line 110) | def _detect_lsp_version(repository_root_path: str) -> tuple[int, int, ...
    method _ensure_ocaml_lsp_installed (line 148) | def _ensure_ocaml_lsp_installed(repository_root_path: str) -> str:
    method supports_cross_file_references (line 225) | def supports_cross_file_references(self) -> bool:
    method _build_ocaml_index_static (line 250) | def _build_ocaml_index_static(repository_root_path: str) -> bool:
    method __init__ (line 284) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 322) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 327) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 382) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/omnisharp.py
  function breadth_first_file_scan (line 25) | def breadth_first_file_scan(root: str) -> Iterable[str]:
  function find_least_depth_sln_file (line 51) | def find_least_depth_sln_file(root_dir: str) -> str | None:
  class OmniSharp (line 58) | class OmniSharp(SolidLanguageServer):
    method __init__ (line 63) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 114) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 118) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _setup_runtime_dependencies (line 143) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method _start_server (line 203) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/pascal_server.py
  class PascalLanguageServer (line 70) | class PascalLanguageServer(SolidLanguageServer):
    method __init__ (line 89) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _meta_dir (line 148) | def _meta_dir(cls, pasls_dir: str) -> str:
    method _meta_file (line 155) | def _meta_file(cls, pasls_dir: str, filename: str) -> str:
    method _normalize_version (line 162) | def _normalize_version(version: str | None) -> str:
    method _is_newer_version (line 169) | def _is_newer_version(cls, latest: str | None, local: str | None) -> b...
    method _get_latest_version (line 212) | def _get_latest_version(cls) -> str | None:
    method _get_local_version (line 230) | def _get_local_version(cls, pasls_dir: str) -> str | None:
    method _save_local_version (line 242) | def _save_local_version(cls, pasls_dir: str, version: str) -> None:
    method _should_check_update (line 254) | def _should_check_update(cls, pasls_dir: str) -> bool:
    method _update_last_check (line 267) | def _update_last_check(cls, pasls_dir: str) -> None:
    method _get_checksums (line 279) | def _get_checksums(cls) -> dict[str, str] | None:
    method _calculate_sha256 (line 302) | def _calculate_sha256(file_path: str) -> str:
    method _verify_checksum (line 311) | def _verify_checksum(cls, file_path: str, expected_sha256: str) -> bool:
    method _is_file_locked (line 328) | def _is_file_locked(file_path: str) -> bool:
    method _safe_remove (line 344) | def _safe_remove(cls, file_path: str) -> bool:
    method _mark_for_cleanup (line 368) | def _mark_for_cleanup(cls, pasls_dir: str, file_path: str) -> None:
    method _cleanup_old_files (line 378) | def _cleanup_old_files(cls, pasls_dir: str) -> None:
    method _download_archive (line 408) | def _download_archive(cls, url: str, target_path: str) -> bool:
    method _is_safe_tar_member (line 426) | def _is_safe_tar_member(cls, member: tarfile.TarInfo, target_dir: str)...
    method _extract_archive (line 439) | def _extract_archive(cls, archive_path: str, target_dir: str, archive_...
    method _flatten_single_subdir (line 479) | def _flatten_single_subdir(cls, target_dir: str) -> None:
    method _get_archive_filename (line 494) | def _get_archive_filename(cls, dep: RuntimeDependency) -> str:
    method _atomic_install (line 500) | def _atomic_install(cls, pasls_dir: str, deps: RuntimeDependencyCollec...
    method _setup_runtime_dependencies (line 607) | def _setup_runtime_dependencies(cls, solidlsp_settings: SolidLSPSettin...
    method _get_initialize_params (line 738) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 845) | def _start_server(self) -> None:
    method is_ignored_dirname (line 908) | def is_ignored_dirname(self, dirname: str) -> bool:

FILE: src/solidlsp/language_servers/perl_language_server.py
  class PerlLanguageServer (line 26) | class PerlLanguageServer(SolidLanguageServer):
    method _get_perl_version (line 32) | def _get_perl_version() -> str | None:
    method _get_perl_language_server_version (line 43) | def _get_perl_language_server_version() -> str | None:
    method is_ignored_dirname (line 59) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _setup_runtime_dependencies (line 69) | def _setup_runtime_dependencies(cls) -> str:
    method __init__ (line 102) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 112) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 147) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/phpactor.py
  class PhpactorServer (line 27) | class PhpactorServer(SolidLanguageServer):
    method is_ignored_dirname (line 39) | def is_ignored_dirname(self, dirname: str) -> bool:
    class DependencyProvider (line 42) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 43) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 79) | def _create_launch_command(self, core_path: str) -> list[str]:
    method __init__ (line 82) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 92) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method _get_initialize_params (line 95) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_server (line 132) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/powershell_language_server.py
  class PowerShellLanguageServer (line 31) | class PowerShellLanguageServer(SolidLanguageServer):
    method is_ignored_dirname (line 38) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_pwsh_path (line 49) | def _get_pwsh_path() -> str | None:
    method _get_pses_path (line 88) | def _get_pses_path(cls, solidlsp_settings: SolidLSPSettings) -> str | ...
    method _download_pses (line 99) | def _download_pses(cls, solidlsp_settings: SolidLSPSettings) -> str:
    method _setup_runtime_dependency (line 135) | def _setup_runtime_dependency(cls, solidlsp_settings: SolidLSPSettings...
    method __init__ (line 163) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 205) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 265) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/pyright_server.py
  class PyrightServer (line 23) | class PyrightServer(SolidLanguageServer):
    method __init__ (line 29) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 46) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 49) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 50) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 53) | def _create_launch_command(self, core_path: str) -> list[str]:
    method is_ignored_dirname (line 57) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 61) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 119) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/r_language_server.py
  class RLanguageServer (line 18) | class RLanguageServer(SolidLanguageServer):
    method _get_wait_time_for_cross_file_referencing (line 22) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method is_ignored_dirname (line 26) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _check_r_installation (line 36) | def _check_r_installation() -> None:
    method __init__ (line 60) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 72) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 122) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/regal_server.py
  class RegalLanguageServer (line 19) | class RegalLanguageServer(SolidLanguageServer):
    method is_ignored_dirname (line 28) | def is_ignored_dirname(self, dirname: str) -> bool:
    method __init__ (line 31) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 57) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 99) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/ruby_lsp.py
  class RubyLsp (line 25) | class RubyLsp(SolidLanguageServer):
    method __init__ (line 31) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 47) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_wait_time_for_cross_file_referencing (line 66) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method _find_executable_with_extensions (line 75) | def _find_executable_with_extensions(executable_name: str) -> str | None:
    method _setup_runtime_dependencies (line 95) | def _setup_runtime_dependencies(config: LanguageServerConfig, reposito...
    method _detect_rails_project (line 234) | def _detect_rails_project(repository_root_path: str) -> bool:
    method _get_ruby_exclude_patterns (line 263) | def _get_ruby_exclude_patterns(repository_root_path: str) -> list[str]:
    method _get_initialize_params (line 293) | def _get_initialize_params(self) -> InitializeParams:
    method _start_server (line 337) | def _start_server(self) -> None:
    method _handle_initialization_response (line 430) | def _handle_initialization_response(self, init_response: InitializeRes...

FILE: src/solidlsp/language_servers/rust_analyzer.py
  class RustAnalyzer (line 24) | class RustAnalyzer(SolidLanguageServer):
    method _determine_log_level (line 30) | def _determine_log_level(line: str) -> int:
    class DependencyProvider (line 45) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_rustup_version (line 47) | def _get_rustup_version() -> str | None:
      method _get_rust_analyzer_via_rustup (line 58) | def _get_rust_analyzer_via_rustup() -> str | None:
      method _ensure_rust_analyzer_installed (line 69) | def _ensure_rust_analyzer_installed() -> str:
      method _get_or_install_core_dependency (line 165) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 168) | def _create_launch_command(self, core_path: str) -> list[str]:
    method __init__ (line 171) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 187) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method is_ignored_dirname (line 191) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 195) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 668) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/scala_language_server.py
  class StaleLockMode (line 34) | class StaleLockMode(Enum):
  function _get_scala_settings (line 47) | def _get_scala_settings(solidlsp_settings: SolidLSPSettings) -> dict[str...
  class ScalaLanguageServer (line 87) | class ScalaLanguageServer(SolidLanguageServer):
    method __init__ (line 112) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _check_metals_db_status (line 129) | def _check_metals_db_status(self, repository_root_path: str, solidlsp_...
    method is_ignored_dirname (line 186) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _setup_runtime_dependencies (line 194) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method _get_initialize_params (line 263) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 309) | def _start_server(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 323) | def _get_wait_time_for_cross_file_referencing(self) -> float:

FILE: src/solidlsp/language_servers/solargraph.py
  class Solargraph (line 26) | class Solargraph(SolidLanguageServer):
    method __init__ (line 32) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 59) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _setup_runtime_dependencies (line 74) | def _setup_runtime_dependencies(config: LanguageServerConfig, reposito...
    method _detect_rails_project (line 207) | def _detect_rails_project(repository_root_path: str) -> bool:
    method _get_ruby_exclude_patterns (line 236) | def _get_ruby_exclude_patterns(repository_root_path: str) -> list[str]:
    method _get_initialize_params (line 270) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 305) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/solidity_language_server.py
  class SolidityLanguageServer (line 24) | class SolidityLanguageServer(SolidLanguageServer):
    method _determine_log_level (line 33) | def _determine_log_level(line: str) -> int:
    method __init__ (line 46) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 59) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 62) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 63) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 103) | def _create_launch_command(self, core_path: str) -> list[str]:
    method is_ignored_dirname (line 106) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_initialize_params (line 110) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _get_wait_time_for_cross_file_referencing (line 155) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method _start_server (line 159) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/sourcekit_lsp.py
  class SourceKitLSP (line 19) | class SourceKitLSP(SolidLanguageServer):
    method is_ignored_dirname (line 25) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_sourcekit_lsp_version (line 34) | def _get_sourcekit_lsp_version() -> str:
    method __init__ (line 48) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 60) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 302) | def _start_server(self) -> None:
    method request_references (line 338) | def request_references(self, relative_file_path: str, line: int, colum...

FILE: src/solidlsp/language_servers/systemverilog_server.py
  class SystemVerilogLanguageServer (line 22) | class SystemVerilogLanguageServer(SolidLanguageServer):
    method __init__ (line 28) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 31) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 34) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 35) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 134) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 138) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 177) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/taplo_server.py
  function _verify_sha256 (line 46) | def _verify_sha256(file_path: str, expected_hash: str) -> bool:
  function _get_taplo_download_url (line 56) | def _get_taplo_download_url() -> tuple[str, str]:
  class TaploServer (line 94) | class TaploServer(SolidLanguageServer):
    method _determine_log_level (line 101) | def _determine_log_level(line: str) -> int:
    method __init__ (line 116) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 129) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 132) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 133) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 166) | def _create_launch_command(self, core_path: str) -> list[str]:
      method _download_taplo (line 170) | def _download_taplo(cls, install_dir: str, executable_path: str) -> ...
    method _get_initialize_params (line 237) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 276) | def _start_server(self) -> None:
    method is_ignored_dirname (line 314) | def is_ignored_dirname(self, dirname: str) -> bool:

FILE: src/solidlsp/language_servers/terraform_ls.py
  class TerraformLS (line 20) | class TerraformLS(SolidLanguageServer):
    method is_ignored_dirname (line 26) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _determine_log_level (line 30) | def _determine_log_level(line: str) -> int:
    method _ensure_tf_command_available (line 58) | def _ensure_tf_command_available() -> None:
    method _setup_runtime_dependencies (line 89) | def _setup_runtime_dependencies(cls, solidlsp_settings: SolidLSPSettin...
    method __init__ (line 155) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 171) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 203) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/typescript_language_server.py
  class pwd (line 31) | class pwd:  # type: ignore
    method getpwuid (line 33) | def getpwuid(uid: Any) -> Any:
  function prefer_non_node_modules_definition (line 42) | def prefer_non_node_modules_definition(definitions: list[ls_types.Locati...
  class TypeScriptLanguageServer (line 61) | class TypeScriptLanguageServer(SolidLanguageServer):
    method __init__ (line 74) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method wait_for_indexing (line 94) | def wait_for_indexing(self, timeout: float) -> bool:
    method expect_indexing (line 102) | def expect_indexing(self) -> None:
    method _create_dependency_provider (line 111) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method is_ignored_dirname (line 115) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _determine_log_level (line 124) | def _determine_log_level(line: str) -> int:
    class DependencyProvider (line 128) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 129) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 216) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 219) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_server (line 263) | def _start_server(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 395) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method _get_preferred_definition (line 399) | def _get_preferred_definition(self, definitions: list[ls_types.Locatio...

FILE: src/solidlsp/language_servers/vts_language_server.py
  class VtsLanguageServer (line 28) | class VtsLanguageServer(SolidLanguageServer):
    method __init__ (line 34) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 50) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _setup_runtime_dependencies (line 59) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method _get_initialize_params (line 106) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 146) | def _start_server(self) -> None:
    method _get_wait_time_for_cross_file_referencing (line 226) | def _get_wait_time_for_cross_file_referencing(self) -> float:

FILE: src/solidlsp/language_servers/vue_language_server.py
  class VueTypeScriptServer (line 36) | class VueTypeScriptServer(TypeScriptLanguageServer):
    method get_language_enum_instance (line 41) | def get_language_enum_instance(cls) -> Language:
    class DependencyProvider (line 50) | class DependencyProvider(TypeScriptLanguageServer.DependencyProvider):
      method _get_or_install_core_dependency (line 53) | def _get_or_install_core_dependency(self) -> str:
    method _get_language_id_for_file (line 59) | def _get_language_id_for_file(self, relative_file_path: str) -> str:
    method __init__ (line 76) | def __init__(
    method _get_initialize_params (line 92) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_server (line 114) | def _start_server(self) -> None:
  class VueLanguageServer (line 123) | class VueLanguageServer(SolidLanguageServer):
    method __init__ (line 138) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method is_ignored_dirname (line 156) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_language_id_for_file (line 167) | def _get_language_id_for_file(self, relative_file_path: str) -> str:
    method _is_typescript_file (line 178) | def _is_typescript_file(self, file_path: str) -> bool:
    method _find_all_vue_files (line 182) | def _find_all_vue_files(self) -> list[str]:
    method _ensure_vue_files_indexed_on_ts_server (line 196) | def _ensure_vue_files_indexed_on_ts_server(self) -> None:
    method _wait_for_ts_indexing_complete (line 223) | def _wait_for_ts_indexing_complete(self) -> None:
    method _send_references_request (line 237) | def _send_references_request(self, relative_file_path: str, line: int,...
    method _send_ts_references_request (line 247) | def _send_ts_references_request(self, relative_file_path: str, line: i...
    method request_file_references (line 280) | def request_file_references(self, relative_file_path: str) -> list:
    method request_references (line 345) | def request_references(self, relative_file_path: str, line: int, colum...
    method request_definition (line 378) | def request_definition(self, relative_file_path: str, line: int, colum...
    method request_rename_symbol_edit (line 388) | def request_rename_symbol_edit(self, relative_file_path: str, line: in...
    method _setup_runtime_dependencies (line 398) | def _setup_runtime_dependencies(cls, config: LanguageServerConfig, sol...
    method _get_initialize_params (line 491) | def _get_initialize_params(self, repository_absolute_path: str) -> Ini...
    method _start_typescript_server (line 537) | def _start_typescript_server(self) -> None:
    method _forward_tsserver_request (line 574) | def _forward_tsserver_request(self, method: str, params: dict) -> Any:
    method _cleanup_indexed_vue_files (line 594) | def _cleanup_indexed_vue_files(self) -> None:
    method _stop_typescript_server (line 614) | def _stop_typescript_server(self) -> None:
    method _start_server (line 626) | def _start_server(self) -> None:
    method _find_tsconfig_for_file (line 701) | def _find_tsconfig_for_file(self, file_path: str) -> str | None:
    method _get_wait_time_for_cross_file_referencing (line 722) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method stop (line 726) | def stop(self, shutdown_timeout: float = 5.0) -> None:
    method _get_preferred_definition (line 732) | def _get_preferred_definition(self, definitions: list[ls_types.Locatio...
    method _request_document_symbols (line 736) | def _request_document_symbols(
    method _filter_shorthand_property_duplicates (line 763) | def _filter_shorthand_property_duplicates(

FILE: src/solidlsp/language_servers/yaml_language_server.py
  class YamlLanguageServer (line 21) | class YamlLanguageServer(SolidLanguageServer):
    method _determine_log_level (line 28) | def _determine_log_level(line: str) -> int:
    method __init__ (line 43) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _create_dependency_provider (line 56) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    class DependencyProvider (line 59) | class DependencyProvider(LanguageServerDependencyProviderSinglePath):
      method _get_or_install_core_dependency (line 60) | def _get_or_install_core_dependency(self) -> str:
      method _create_launch_command (line 101) | def _create_launch_command(self, core_path: str) -> list[str]:
    method _get_initialize_params (line 105) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 153) | def _start_server(self) -> None:

FILE: src/solidlsp/language_servers/zls.py
  class ZigLanguageServer (line 23) | class ZigLanguageServer(SolidLanguageServer):
    method is_ignored_dirname (line 29) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _get_zig_version (line 38) | def _get_zig_version() -> str | None:
    method _get_zls_version (line 49) | def _get_zls_version() -> str | None:
    method _check_zls_installed (line 60) | def _check_zls_installed() -> bool:
    method _setup_runtime_dependency (line 65) | def _setup_runtime_dependency() -> bool:
    method __init__ (line 98) | def __init__(self, config: LanguageServerConfig, repository_root_path:...
    method _get_initialize_params (line 105) | def _get_initialize_params(repository_absolute_path: str) -> Initializ...
    method _start_server (line 183) | def _start_server(self) -> None:

FILE: src/solidlsp/ls.py
  class ReferenceInSymbol (line 58) | class ReferenceInSymbol:
  class LSPFileBuffer (line 66) | class LSPFileBuffer:
    method __init__ (line 71) | def __init__(
    method _open_in_ls (line 96) | def _open_in_ls(self) -> None:
    method close (line 114) | def close(self) -> None:
    method ensure_open_in_ls (line 124) | def ensure_open_in_ls(self) -> None:
    method contents (line 129) | def contents(self) -> str:
    method contents (line 146) | def contents(self, new_contents: str) -> None:
    method content_hash (line 157) | def content_hash(self) -> str:
    method split_lines (line 162) | def split_lines(self) -> list[str]:
  class SymbolBody (line 167) | class SymbolBody(ToStringMixin):
    method __init__ (line 177) | def __init__(self, lines: list[str], start_line: int, start_col: int, ...
    method _tostring_excludes (line 184) | def _tostring_excludes(self) -> list[str]:
    method get_text (line 187) | def get_text(self) -> str:
  class SymbolBodyFactory (line 203) | class SymbolBodyFactory:
    method __init__ (line 210) | def __init__(self, file_buffer: LSPFileBuffer):
    method create_symbol_body (line 213) | def create_symbol_body(self, symbol: GenericDocumentSymbol) -> SymbolB...
  class DocumentSymbols (line 226) | class DocumentSymbols:
    method __init__ (line 229) | def __init__(self, root_symbols: list[ls_types.UnifiedSymbolInformatio...
    method __getstate__ (line 233) | def __getstate__(self) -> dict:
    method iter_symbols (line 236) | def iter_symbols(self) -> Iterator[ls_types.UnifiedSymbolInformation]:
    method get_all_symbols_and_roots (line 253) | def get_all_symbols_and_roots(self) -> tuple[list[ls_types.UnifiedSymb...
  class LanguageServerDependencyProvider (line 266) | class LanguageServerDependencyProvider(ABC):
    method __init__ (line 272) | def __init__(self, custom_settings: SolidLSPSettings.CustomLSSettings,...
    method create_launch_command (line 277) | def create_launch_command(self) -> list[str]:
    method create_launch_command_env (line 285) | def create_launch_command_env(self) -> dict[str, str]:
  class LanguageServerDependencyProviderSinglePath (line 296) | class LanguageServerDependencyProviderSinglePath(LanguageServerDependenc...
    method _get_or_install_core_dependency (line 307) | def _get_or_install_core_dependency(self) -> str:
    method create_launch_command (line 314) | def create_launch_command(self) -> list[str]:
    method _create_launch_command (line 323) | def _create_launch_command(self, core_path: str) -> list[str]:
  class SolidLanguageServer (line 330) | class SolidLanguageServer(ABC):
    method is_ignored_dirname (line 350) | def is_ignored_dirname(self, dirname: str) -> bool:
    method _determine_log_level (line 358) | def _determine_log_level(line: str) -> int:
    method get_language_enum_instance (line 378) | def get_language_enum_instance(cls) -> Language:
    method ls_resources_dir (line 382) | def ls_resources_dir(cls, solidlsp_settings: SolidLSPSettings, mkdir: ...
    method create (line 403) | def create(
    method __init__ (line 438) | def __init__(
    method _create_dependency_provider (line 534) | def _create_dependency_provider(self) -> LanguageServerDependencyProvi...
    method _create_process_launch_info (line 545) | def _create_process_launch_info(self) -> ProcessLaunchInfo:
    method _get_wait_time_for_cross_file_referencing (line 551) | def _get_wait_time_for_cross_file_referencing(self) -> float:
    method set_request_timeout (line 559) | def set_request_timeout(self, timeout: float | None) -> None:
    method get_ignore_spec (line 565) | def get_ignore_spec(self) -> pathspec.PathSpec:
    method is_ignored_path (line 578) | def is_ignored_path(self, relative_path: str, ignore_unsupported_files...
    method _shutdown (line 614) | def _shutdown(self, timeout: float = 5.0) -> None:
    method start_server (line 674) | def start_server(self) -> Iterator["SolidLanguageServer"]:
    method _start_server_process (line 679) | def _start_server_process(self) -> None:
    method _start_server (line 684) | def _start_server(self) -> None:
    method _get_language_id_for_file (line 687) | def _get_language_id_for_file(self, relative_file_path: str) -> str:
    method open_file (line 696) | def open_file(self, relative_file_path: str, open_in_ls: bool = True) ...
    method _open_file_context (line 744) | def _open_file_context(
    method insert_text_at_position (line 766) | def insert_text_at_position(self, relative_file_path: str, line: int, ...
    method delete_text_between_positions (line 810) | def delete_text_between_positions(
    method _send_definition_request (line 846) | def _send_definition_request(self, definition_params: DefinitionParams...
    method request_definition (line 849) | def request_definition(self, relative_file_path: str, line: int, colum...
    method _send_references_request (line 926) | def _send_references_request(self, relative_file_path: str, line: int,...
    method request_references (line 935) | def request_references(self, relative_file_path: str, line: int, colum...
    method request_text_document_diagnostics (line 1014) | def request_text_document_diagnostics(self, relative_file_path: str) -...
    method retrieve_full_file_content (line 1053) | def retrieve_full_file_content(self, file_path: str) -> str:
    method retrieve_content_around_line (line 1062) | def retrieve_content_around_line(
    method request_completions (line 1085) | def request_completions(
    method _request_document_symbols (line 1170) | def _request_document_symbols(
    method request_document_symbols (line 1221) | def request_document_symbols(self, relative_file_path: str, file_buffe...
    method request_full_symbol_tree (line 1343) | def request_full_symbol_tree(self, within_relative_path: str | None = ...
    method _get_range_from_file_content (line 1479) | def _get_range_from_file_content(file_content: str) -> ls_types.Range:
    method request_dir_overview (line 1488) | def request_dir_overview(self, relative_dir_path: str) -> dict[str, li...
    method request_document_overview (line 1535) | def request_document_overview(self, relative_file_path: str) -> list[U...
    method request_overview (line 1541) | def request_overview(self, within_relative_path: str) -> dict[str, lis...
    method request_hover (line 1558) | def request_hover(
    method _request_hover (line 1574) | def _request_hover(self, file_buffer: LSPFileBuffer, line: int, column...
    method request_signature_help (line 1599) | def request_signature_help(self, relative_file_path: str, line: int, c...
    method create_symbol_body (line 1630) | def create_symbol_body(
    method request_referencing_symbols (line 1642) | def request_referencing_symbols(
    method request_containing_symbol (line 1797) | def request_containing_symbol(
    method request_container_of_symbol (line 1909) | def request_container_of_symbol(
    method _get_preferred_definition (line 1931) | def _get_preferred_definition(self, definitions: list[ls_types.Locatio...
    method request_defining_symbol (line 1948) | def request_defining_symbol(
    method _document_symbols_cache_fingerprint (line 1988) | def _document_symbols_cache_fingerprint(self) -> Hashable | None:
    method _document_symbols_cache_version (line 2008) | def _document_symbols_cache_version(self) -> Hashable:
    method _save_raw_document_symbols_cache (line 2019) | def _save_raw_document_symbols_cache(self) -> None:
    method _raw_document_symbols_cache_version (line 2037) | def _raw_document_symbols_cache_version(self) -> tuple[Hashable, ...]:
    method _load_raw_document_symbols_cache (line 2044) | def _load_raw_document_symbols_cache(self) -> None:
    method _save_document_symbols_cache (line 2089) | def _save_document_symbols_cache(self) -> None:
    method _load_document_symbols_cache (line 2107) | def _load_document_symbols_cache(self) -> None:
    method save_cache (line 2124) | def save_cache(self) -> None:
    method request_workspace_symbol (line 2128) | def request_workspace_symbol(self, query: str) -> list[ls_types.Unifie...
    method request_rename_symbol_edit (line 2155) | def request_rename_symbol_edit(
    method apply_text_edits_to_file (line 2183) | def apply_text_edits_to_file(self, relative_path: str, edits: list[ls_...
    method start (line 2202) | def start(self) -> "SolidLanguageServer":
    method stop (line 2212) | def stop(self, shutdown_timeout: float = 2.0) -> None:
    method language_server (line 2225) | def language_server(self) -> Self:
    method handler (line 2229) | def handler(self) -> LanguageServerProcess:
    method is_running (line 2237) | def is_running(self) -> bool:

FILE: src/solidlsp/ls_config.py
  class FilenameMatcher (line 15) | class FilenameMatcher:
    method __init__ (line 16) | def __init__(self, *patterns: str) -> None:
    method is_relevant_filename (line 22) | def is_relevant_filename(self, fn: str) -> bool:
  class Language (line 29) | class Language(str, Enum):
    method iter_all (line 140) | def iter_all(cls, include_experimental: bool = False) -> Iterable[Self]:
    method is_experimental (line 145) | def is_experimental(self) -> bool:
    method __str__ (line 168) | def __str__(self) -> str:
    method get_priority (line 171) | def get_priority(self) -> int:
    method get_source_fn_matcher (line 188) | def get_source_fn_matcher(self) -> FilenameMatcher:
    method get_ls_class (line 314) | def get_ls_class(self) -> type["SolidLanguageServer"]:
    method from_ls_class (line 526) | def from_ls_class(cls, ls_class: type["SolidLanguageServer"]) -> Self:
  class LanguageServerConfig (line 541) | class LanguageServerConfig:
    method from_dict (line 555) | def from_dict(cls, env: dict) -> Self:

FILE: src/solidlsp/ls_exceptions.py
  class SolidLSPException (line 8) | class SolidLSPException(Exception):
    method __init__ (line 9) | def __init__(self, message: str, cause: Exception | None = None) -> None:
    method is_language_server_terminated (line 22) | def is_language_server_terminated(self) -> bool:
    method get_affected_language (line 31) | def get_affected_language(self) -> Language | None:
    method __str__ (line 41) | def __str__(self) -> str:
  class MetalsStaleLockError (line 55) | class MetalsStaleLockError(SolidLSPException):
    method __init__ (line 65) | def __init__(self, lock_path: str, message: str | None = None) -> None:

FILE: src/solidlsp/ls_process.py
  class LanguageServerTerminatedException (line 40) | class LanguageServerTerminatedException(Exception):
    method __init__ (line 45) | def __init__(self, message: str, language: Language, cause: Exception ...
    method __str__ (line 51) | def __str__(self) -> str:
  class Request (line 55) | class Request(ToStringMixin):
    class Result (line 57) | class Result:
      method is_error (line 61) | def is_error(self) -> bool:
    method __init__ (line 64) | def __init__(self, request_id: int, method: str) -> None:
    method _tostring_includes (line 70) | def _tostring_includes(self) -> list[str]:
    method on_result (line 73) | def on_result(self, params: PayloadLike) -> None:
    method on_error (line 77) | def on_error(self, err: Exception) -> None:
    method get_result (line 86) | def get_result(self, timeout: float | None = None) -> Result:
  class LanguageServerProcess (line 95) | class LanguageServerProcess:
    method __init__ (line 131) | def __init__(
    method set_request_timeout (line 166) | def set_request_timeout(self, timeout: float | None) -> None:
    method is_running (line 172) | def is_running(self) -> bool:
    method start (line 178) | def start(self) -> None:
    method stop (line 226) | def stop(self) -> None:
    method _cleanup_process (line 235) | def _cleanup_process(self, process: subprocess.Popen[bytes]) -> None:
    method _safely_close_pipe (line 252) | def _safely_close_pipe(self, pipe: Any) -> None:
    method _terminate_or_kill_process (line 260) | def _terminate_or_kill_process(self, process: subprocess.Popen[bytes])...
    method _signal_process_tree (line 265) | def _signal_process_tree(self, process: subprocess.Popen[bytes], termi...
    method shutdown (line 297) | def shutdown(self) -> None:
    method _trace (line 309) | def _trace(self, src: str, dest: str, message: str | StringDict) -> None:
    method _read_bytes_from_process (line 316) | def _read_bytes_from_process(self, process, stream, num_bytes) -> byte...
    method _read_ls_process_stdout (line 333) | def _read_ls_process_stdout(self) -> None:
    method _read_ls_process_stderr (line 374) | def _read_ls_process_stderr(self) -> None:
    method _handle_body (line 396) | def _handle_body(self, body: bytes) -> None:
    method _receive_payload (line 409) | def _receive_payload(self, payload: StringDict) -> None:
    method send_notification (line 427) | def send_notification(self, method: str, params: dict | None = None) -...
    method send_response (line 433) | def send_response(self, request_id: Any, params: PayloadLike) -> None:
    method send_error_response (line 439) | def send_error_response(self, request_id: Any, err: LSPError) -> None:
    method _cancel_pending_requests (line 445) | def _cancel_pending_requests(self, exception: Exception) -> None:
    method send_request (line 456) | def send_request(self, method: str, params: dict | None = None) -> Pay...
    method _send_payload (line 482) | def _send_payload(self, payload: StringDict) -> None:
    method on_request (line 501) | def on_request(self, method: str, cb: Callable[[Any], Any]) -> None:
    method on_notification (line 507) | def on_notification(self, method: str, cb: Callable[[Any], None]) -> N...
    method _response_handler (line 513) | def _response_handler(self, response: StringDict) -> None:
    method _request_handler (line 534) | def _request_handler(self, response: StringDict) -> None:
    method _notification_handler (line 558) | def _notification_handler(self, response: StringDict) -> None:

FILE: src/solidlsp/ls_request.py
  class LanguageServerRequest (line 9) | class LanguageServerRequest:
    method __init__ (line 10) | def __init__(self, handler: "LanguageServerProcess"):
    method _send_request (line 13) | def _send_request(self, method: str, params: Any | None = None) -> Any:
    method implementation (line 16) | def implementation(self, params: lsp_types.ImplementationParams) -> Un...
    method type_definition (line 24) | def type_definition(
    method document_color (line 34) | def document_color(self, params: lsp_types.DocumentColorParams) -> lis...
    method color_presentation (line 42) | def color_presentation(self, params: lsp_types.ColorPresentationParams...
    method folding_range (line 50) | def folding_range(self, params: lsp_types.FoldingRangeParams) -> list[...
    method declaration (line 58) | def declaration(self, params: lsp_types.DeclarationParams) -> Union["l...
    method selection_range (line 67) | def selection_range(self, params: lsp_types.SelectionRangeParams) -> l...
    method prepare_call_hierarchy (line 75) | def prepare_call_hierarchy(self, params: lsp_types.CallHierarchyPrepar...
    method incoming_calls (line 83) | def incoming_calls(self, params: lsp_types.CallHierarchyIncomingCallsP...
    method outgoing_calls (line 90) | def outgoing_calls(self, params: lsp_types.CallHierarchyOutgoingCallsP...
    method semantic_tokens_full (line 97) | def semantic_tokens_full(self, params: lsp_types.SemanticTokensParams)...
    method semantic_tokens_delta (line 101) | def semantic_tokens_delta(
    method semantic_tokens_range (line 107) | def semantic_tokens_range(self, params: lsp_types.SemanticTokensRangeP...
    method linked_editing_range (line 111) | def linked_editing_range(self, params: lsp_types.LinkedEditingRangePar...
    method will_create_files (line 118) | def will_create_files(self, params: lsp_types.CreateFilesParams) -> Un...
    method will_rename_files (line 126) | def will_rename_files(self, params: lsp_types.RenameFilesParams) -> Un...
    method will_delete_files (line 134) | def will_delete_files(self, params: lsp_types.DeleteFilesParams) -> Un...
    method moniker (line 142) | def moniker(self, params: lsp_types.MonikerParams) -> list["lsp_types....
    method prepare_type_hierarchy (line 149) | def prepare_type_hierarchy(self, params: lsp_types.TypeHierarchyPrepar...
    method type_hierarchy_supertypes (line 157) | def type_hierarchy_supertypes(self, params: lsp_types.TypeHierarchySup...
    method type_hierarchy_subtypes (line 164) | def type_hierarchy_subtypes(self, params: lsp_types.TypeHierarchySubty...
    method inline_value (line 171) | def inline_value(self, params: lsp_types.InlineValueParams) -> list["l...
    method inlay_hint (line 180) | def inlay_hint(self, params: lsp_types.InlayHintParams) -> list["lsp_t...
    method resolve_inlay_hint (line 189) | def resolve_inlay_hint(self, params: lsp_types.InlayHint) -> "lsp_type...
    method text_document_diagnostic (line 198) | def text_document_diagnostic(self, params: lsp_types.DocumentDiagnosti...
    method workspace_diagnostic (line 205) | def workspace_diagnostic(self, params: lsp_types.WorkspaceDiagnosticPa...
    method initialize (line 212) | def initialize(self, params: lsp_types.InitializeParams) -> "lsp_types...
    method shutdown (line 221) | def shutdown(self) -> None:
    method will_save_wait_until (line 229) | def will_save_wait_until(self, params: lsp_types.WillSaveTextDocumentP...
    method completion (line 239) | def completion(self, params: lsp_types.CompletionParams) -> Union[list...
    method resolve_completion_item (line 252) | def resolve_completion_item(self, params: lsp_types.CompletionItem) ->...
    method hover (line 259) | def hover(self, params: lsp_types.HoverParams) -> Union["lsp_types.Hov...
    method signature_help (line 266) | def signature_help(self, params: lsp_types.SignatureHelpParams) -> Uni...
    method definition (line 269) | def definition(self, params: lsp_types.DefinitionParams) -> Union["lsp...
    method references (line 278) | def references(self, params: lsp_types.ReferenceParams) -> list["lsp_t...
    method document_highlight (line 286) | def document_highlight(self, params: lsp_types.DocumentHighlightParams...
    method document_symbol (line 294) | def document_symbol(
    method code_action (line 304) | def code_action(self, params: lsp_types.CodeActionParams) -> list[Unio...
    method resolve_code_action (line 308) | def resolve_code_action(self, params: lsp_types.CodeAction) -> "lsp_ty...
    method workspace_symbol (line 315) | def workspace_symbol(
    method resolve_workspace_symbol (line 329) | def resolve_workspace_symbol(self, params: lsp_types.WorkspaceSymbol) ...
    method code_lens (line 337) | def code_lens(self, params: lsp_types.CodeLensParams) -> list["lsp_typ...
    method resolve_code_lens (line 341) | def resolve_code_lens(self, params: lsp_types.CodeLens) -> "lsp_types....
    method document_link (line 345) | def document_link(self, params: lsp_types.DocumentLinkParams) -> list[...
    method resolve_document_link (line 349) | def resolve_document_link(self, params: lsp_types.DocumentLink) -> "ls...
    method formatting (line 356) | def formatting(self, params: lsp_types.DocumentFormattingParams) -> li...
    method range_formatting (line 360) | def range_formatting(self, params: lsp_types.DocumentRangeFormattingPa...
    method on_type_formatting (line 364) | def on_type_formatting(self, params: lsp_types.DocumentOnTypeFormattin...
    method rename (line 368) | def rename(self, params: lsp_types.RenameParams) -> Union["lsp_types.W...
    method prepare_rename (line 372) | def prepare_rename(self, params: lsp_types.PrepareRenameParams) -> Uni...
    method execute_command (line 379) | def execute_command(self, params: lsp_types.ExecuteCommandParams) -> U...

FILE: src/solidlsp/ls_types.py
  class Position (line 24) | class Position(TypedDict):
  class Range (line 69) | class Range(TypedDict):
  class Location (line 89) | class Location(TypedDict):
  class CompletionItemKind (line 100) | class CompletionItemKind(IntEnum):
  class CompletionItem (line 130) | class CompletionItem(TypedDict):
  class SymbolKind (line 150) | class SymbolKind(IntEnum):
  class SymbolTag (line 183) | class SymbolTag(IntEnum):
  class UnifiedSymbolInformation (line 193) | class UnifiedSymbolInformation(TypedDict):
  class MarkupKind (line 267) | class MarkupKind(Enum):
  class __MarkedString_Type_1 (line 281) | class __MarkedString_Type_1(TypedDict):
  class MarkupContent (line 301) | class MarkupContent(TypedDict):
  class Hover (line 332) | class Hover(TypedDict):
  class TextDocumentIdentifier (line 342) | class TextDocumentIdentifier(TypedDict):
  class TextEdit (line 349) | class TextEdit(TypedDict):
  class WorkspaceEdit (line 358) | class WorkspaceEdit(TypedDict):
  class Diagnostic (line 367) | class Diagnostic(TypedDict):
  class SignatureHelp (line 384) | class SignatureHelp(TypedDict):
  class SignatureInformation (line 415) | class SignatureInformation(TypedDict):
  class ParameterInformation (line 437) | class ParameterInformation(TypedDict):

FILE: src/solidlsp/ls_utils.py
  class InvalidTextLocationError (line 25) | class InvalidTextLocationError(Exception):
  class TextUtils (line 29) | class TextUtils:
    method get_line_col_from_index (line 35) | def get_line_col_from_index(text: str, index: int) -> tuple[int, int]:
    method get_index_from_line_col (line 53) | def get_index_from_line_col(text: str, line: int, col: int) -> int:
    method _get_updated_position_from_line_and_column_and_edit (line 68) | def _get_updated_position_from_line_and_column_and_edit(l: int, c: int...
    method delete_text_between_positions (line 81) | def delete_text_between_positions(text: str, start_line: int, start_co...
    method insert_text_at_position (line 94) | def insert_text_at_position(text: str, line: int, col: int, text_to_be...
  class PathUtils (line 115) | class PathUtils:
    method uri_to_path (line 121) | def uri_to_path(uri: str) -> str:
    method path_to_uri (line 146) | def path_to_uri(path: str) -> str:
    method is_glob_pattern (line 153) | def is_glob_pattern(pattern: str) -> bool:
    method get_relative_path (line 158) | def get_relative_path(path: str, base_path: str) -> str | None:
  class FileUtils (line 169) | class FileUtils:
    method read_file (line 175) | def read_file(file_path: str, encoding: str) -> str:
    method download_file (line 203) | def download_file(url: str, target_path: str) -> None:
    method download_and_extract_archive (line 220) | def download_and_extract_archive(url: str, target_path: str, archive_t...
  class PlatformId (line 271) | class PlatformId(str, Enum):
    method is_windows (line 284) | def is_windows(self) -> bool:
  class DotnetVersion (line 288) | class DotnetVersion(str, Enum):
  class PlatformUtils (line 297) | class PlatformUtils:
    method get_platform_id (line 303) | def get_platform_id(cls) -> PlatformId:
    method _determine_windows_machine_type (line 334) | def _determine_windows_machine_type() -> str:
    method get_dotnet_version (line 374) | def get_dotnet_version() -> DotnetVersion:
  class SymbolUtils (line 414) | class SymbolUtils:
    method symbol_tree_contains_name (line 416) | def symbol_tree_contains_name(roots: list[UnifiedSymbolInformation], n...

FILE: src/solidlsp/lsp_protocol_handler/lsp_constants.py
  class LSPConstants (line 6) | class LSPConstants:

FILE: src/solidlsp/lsp_protocol_handler/lsp_requests.py
  class LspRequest (line 37) | class LspRequest:
    method __init__ (line 38) | def __init__(self, send_request: Any) -> None:
    method implementation (line 41) | async def implementation(
    method type_definition (line 51) | async def type_definition(
    method document_color (line 61) | async def document_color(self, params: lsp_types.DocumentColorParams) ...
    method color_presentation (line 69) | async def color_presentation(self, params: lsp_types.ColorPresentation...
    method folding_range (line 77) | async def folding_range(self, params: lsp_types.FoldingRangeParams) ->...
    method declaration (line 85) | async def declaration(
    method selection_range (line 96) | async def selection_range(self, params: lsp_types.SelectionRangeParams...
    method prepare_call_hierarchy (line 104) | async def prepare_call_hierarchy(self, params: lsp_types.CallHierarchy...
    method incoming_calls (line 112) | async def incoming_calls(
    method outgoing_calls (line 121) | async def outgoing_calls(
    method semantic_tokens_full (line 130) | async def semantic_tokens_full(self, params: lsp_types.SemanticTokensP...
    method semantic_tokens_delta (line 134) | async def semantic_tokens_delta(
    method semantic_tokens_range (line 140) | async def semantic_tokens_range(self, params: lsp_types.SemanticTokens...
    method linked_editing_range (line 144) | async def linked_editing_range(self, params: lsp_types.LinkedEditingRa...
    method will_create_files (line 151) | async def will_create_files(self, params: lsp_types.CreateFilesParams)...
    method will_rename_files (line 159) | async def will_rename_files(self, params: lsp_types.RenameFilesParams)...
    method will_delete_files (line 167) | async def will_delete_files(self, params: lsp_types.DeleteFilesParams)...
    method moniker (line 175) | async def moniker(self, params: lsp_types.MonikerParams) -> list["lsp_...
    method prepare_type_hierarchy (line 182) | async def prepare_type_hierarchy(self, params: lsp_types.TypeHierarchy...
    method type_hierarchy_supertypes (line 190) | async def type_hierarchy_supertypes(
    method type_hierarchy_subtypes (line 199) | async def type_hierarchy_subtypes(self, params: lsp_types.TypeHierarch...
    method inline_value (line 206) | async def inline_value(self, params: lsp_types.InlineValueParams) -> l...
    method inlay_hint (line 215) | async def inlay_hint(self, params: lsp_types.InlayHintParams) -> list[...
    method resolve_inlay_hint (line 224) | async def resolve_inlay_hint(self, params: lsp_types.InlayHint) -> "ls...
    method text_document_diagnostic (line 233) | async def text_document_diagnostic(self, params: lsp_types.DocumentDia...
    method workspace_diagnostic (line 240) | async def workspace_diagnostic(self, params: lsp_types.WorkspaceDiagno...
    method initialize (line 247) | async def initialize(self, params: lsp_types.InitializeParams) -> "lsp...
    method shutdown (line 256) | async def shutdown(self) -> None:
    method will_save_wait_until (line 264) | async def will_save_wait_until(self, params: lsp_types.WillSaveTextDoc...
    method completion (line 274) | async def completion(
    method resolve_completion_item (line 289) | async def resolve_completion_item(self, params: lsp_types.CompletionIt...
    method hover (line 296) | async def hover(self, params: lsp_types.HoverParams) -> Union["lsp_typ...
    method signature_help (line 303) | async def signature_help(self, params: lsp_types.SignatureHelpParams) ...
    method definition (line 306) | async def definition(self, params: lsp_types.DefinitionParams) -> Unio...
    method references (line 315) | async def references(self, params: lsp_types.ReferenceParams) -> list[...
    method document_highlight (line 323) | async def document_highlight(self, params: lsp_types.DocumentHighlight...
    method document_symbol (line 331) | async def document_symbol(
    method code_action (line 341) | async def code_action(self, params: lsp_types.CodeActionParams) -> lis...
    method resolve_code_action (line 345) | async def resolve_code_action(self, params: lsp_types.CodeAction) -> "...
    method workspace_symbol (line 352) | async def workspace_symbol(
    method resolve_workspace_symbol (line 366) | async def resolve_workspace_symbol(self, params: lsp_types.WorkspaceSy...
    method code_lens (line 374) | async def code_lens(self, params: lsp_types.CodeLensParams) -> list["l...
    method resolve_code_lens (line 378) | async def resolve_code_lens(self, params: lsp_types.CodeLens) -> "lsp_...
    method document_link (line 382) | async def document_link(self, params: lsp_types.DocumentLinkParams) ->...
    method resolve_document_link (line 386) | async def resolve_document_link(self, params: lsp_types.DocumentLink) ...
    method formatting (line 393) | async def formatting(self, params: lsp_types.DocumentFormattingParams)...
    method range_formatting (line 397) | async def range_formatting(self, params: lsp_types.DocumentRangeFormat...
    method on_type_formatting (line 401) | async def on_type_formatting(self, params: lsp_types.DocumentOnTypeFor...
    method rename (line 405) | async def rename(self, params: lsp_types.RenameParams) -> Union["lsp_t...
    method prepare_rename (line 409) | async def prepare_rename(self, params: lsp_types.PrepareRenameParams) ...
    method execute_command (line 416) | async def execute_command(self, params: lsp_types.ExecuteCommandParams...
  class LspNotification (line 423) | class LspNotification:
    method __init__ (line 424) | def __init__(self, send_notification: Any) -> None:
    method did_change_workspace_folders (line 427) | def did_change_workspace_folders(self, params: lsp_types.DidChangeWork...
    method cancel_work_done_progress (line 433) | def cancel_work_done_progress(self, params: lsp_types.WorkDoneProgress...
    method did_create_files (line 439) | def did_create_files(self, params: lsp_types.CreateFilesParams) -> None:
    method did_rename_files (line 447) | def did_rename_files(self, params: lsp_types.RenameFilesParams) -> None:
    method did_delete_files (line 455) | def did_delete_files(self, params: lsp_types.DeleteFilesParams) -> None:
    method did_open_notebook_document (line 463) | def did_open_notebook_document(self, params: lsp_types.DidOpenNotebook...
    method did_change_notebook_document (line 470) | def did_change_notebook_document(self, params: lsp_types.DidChangeNote...
    method did_save_notebook_document (line 473) | def did_save_notebook_document(self, params: lsp_types.DidSaveNotebook...
    method did_close_notebook_document (line 480) | def did_close_notebook_document(self, params: lsp_types.DidCloseNotebo...
    method initialized (line 487) | def initialized(self, params: lsp_types.InitializedParams) -> None:
    method exit (line 494) | def exit(self) -> None:
    method workspace_did_change_configuration (line 500) | def workspace_did_change_configuration(self, params: lsp_types.DidChan...
    method did_open_text_document (line 507) | def did_open_text_document(self, params: lsp_types.DidOpenTextDocument...
    method did_change_text_document (line 519) | def did_change_text_document(self, params: lsp_types.DidChangeTextDocu...
    method did_close_text_document (line 525) | def did_close_text_document(self, params: lsp_types.DidCloseTextDocume...
    method did_save_text_document (line 536) | def did_save_text_document(self, params: lsp_types.DidSaveTextDocument...
    method will_save_text_document (line 542) | def will_save_text_document(self, params: lsp_types.WillSaveTextDocume...
    method did_change_watched_files (line 548) | def did_change_watched_files(self, params: lsp_types.DidChangeWatchedF...
    method set_trace (line 554) | def set_trace(self, params: lsp_types.SetTraceParams) -> None:
    method cancel_request (line 557) | def cancel_request(self, params: lsp_types.CancelParams) -> None:
    method progress (line 560) | def progress(self, params: lsp_types.ProgressParams) -> None:

FILE: src/solidlsp/lsp_protocol_handler/lsp_types.py
  class SemanticTokenTypes (line 43) | class SemanticTokenTypes(Enum):
  class SemanticTokenModifiers (line 79) | class SemanticTokenModifiers(Enum):
  class DocumentDiagnosticReportKind (line 99) | class DocumentDiagnosticReportKind(Enum):
  class ErrorCodes (line 113) | class ErrorCodes(IntEnum):
  class LSPErrorCodes (line 127) | class LSPErrorCodes(IntEnum):
  class FoldingRangeKind (line 155) | class FoldingRangeKind(Enum):
  class SymbolKind (line 166) | class SymbolKind(IntEnum):
    method from_int (line 200) | def from_int(cls, value: int) -> "SymbolKind":
  class SymbolTag (line 207) | class SymbolTag(IntEnum):
  class UniquenessLevel (line 217) | class UniquenessLevel(Enum):
  class MonikerKind (line 235) | class MonikerKind(Enum):
  class InlayHintKind (line 250) | class InlayHintKind(IntEnum):
  class MessageType (line 262) | class MessageType(IntEnum):
  class TextDocumentSyncKind (line 275) | class TextDocumentSyncKind(IntEnum):
  class TextDocumentSaveReason (line 291) | class TextDocumentSaveReason(IntEnum):
  class CompletionItemKind (line 303) | class CompletionItemKind(IntEnum):
  class CompletionItemTag (line 333) | class CompletionItemTag(IntEnum):
  class InsertTextFormat (line 344) | class InsertTextFormat(IntEnum):
  class InsertTextMode (line 362) | class InsertTextMode(IntEnum):
  class DocumentHighlightKind (line 385) | class DocumentHighlightKind(IntEnum):
  class CodeActionKind (line 396) | class CodeActionKind(Enum):
  class TraceValues (line 450) | class TraceValues(Enum):
  class MarkupKind (line 459) | class MarkupKind(Enum):
  class PositionEncodingKind (line 473) | class PositionEncodingKind(Enum):
  class FileChangeType (line 494) | class FileChangeType(IntEnum):
  class WatchKind (line 505) | class WatchKind(IntFlag):
  class DiagnosticSeverity (line 514) | class DiagnosticSeverity(IntEnum):
  class DiagnosticTag (line 527) | class DiagnosticTag(IntEnum):
  class CompletionTriggerKind (line 544) | class CompletionTriggerKind(IntEnum):
  class SignatureHelpTriggerKind (line 557) | class SignatureHelpTriggerKind(IntEnum):
  class CodeActionTriggerKind (line 571) | class CodeActionTriggerKind(IntEnum):
  class FileOperationPatternKind (line 586) | class FileOperationPatternKind(Enum):
  class NotebookCellKind (line 599) | class NotebookCellKind(IntEnum):
  class ResourceOperationKind (line 611) | class ResourceOperationKind(Enum):
  class FailureHandlingKind (line 620) | class FailureHandlingKind(Enum):
  class PrepareSupportDefaultBehavior (line 636) | class PrepareSupportDefaultBehavior(IntEnum):
  class TokenFormat (line 642) | class TokenFormat(Enum):
  class ImplementationParams (line 802) | class ImplementationParams(TypedDict):
  class Location (line 814) | class Location(TypedDict):
  class ImplementationRegistrationOptions (line 823) | class ImplementationRegistrationOptions(TypedDict):
  class TypeDefinitionParams (line 832) | class TypeDefinitionParams(TypedDict):
  class TypeDefinitionRegistrationOptions (line 844) | class TypeDefinitionRegistrationOptions(TypedDict):
  class WorkspaceFolder (line 853) | class WorkspaceFolder(TypedDict):
  class DidChangeWorkspaceFoldersParams (line 863) | class DidChangeWorkspaceFoldersParams(TypedDict):
  class ConfigurationParams (line 870) | class ConfigurationParams(TypedDict):
  class DocumentColorParams (line 876) | class DocumentColorParams(TypedDict):
  class ColorInformation (line 888) | class ColorInformation(TypedDict):
  class DocumentColorRegistrationOptions (line 897) | class DocumentColorRegistrationOptions(TypedDict):
  class ColorPresentationParams (line 906) | class ColorPresentationParams(TypedDict):
  class ColorPresentation (line 922) | class ColorPresentation(TypedDict):
  class WorkDoneProgressOptions (line 936) | class WorkDoneProgressOptions(TypedDict):
  class TextDocumentRegistrationOptions (line 940) | class TextDocumentRegistrationOptions(TypedDict):
  class FoldingRangeParams (line 948) | class FoldingRangeParams(TypedDict):
  class FoldingRange (line 960) | class FoldingRange(TypedDict):
  class FoldingRangeRegistrationOptions (line 987) | class FoldingRangeRegistrationOptions(TypedDict):
  class DeclarationParams (line 996) | class DeclarationParams(TypedDict):
  class DeclarationRegistrationOptions (line 1008) | class DeclarationRegistrationOptions(TypedDict):
  class SelectionRangeParams (line 1017) | class SelectionRangeParams(TypedDict):
  class SelectionRange (line 1031) | class SelectionRange(TypedDict):
  class SelectionRangeRegistrationOptions (line 1042) | class SelectionRangeRegistrationOptions(TypedDict):
  class WorkDoneProgressCreateParams (line 1051) | class WorkDoneProgressCreateParams(TypedDict):
  class WorkDoneProgressCancelParams (line 1056) | class WorkDoneProgressCancelParams(TypedDict):
  class CallHierarchyPrepareParams (line 1061) | class CallHierarchyPrepareParams(TypedDict):
  class CallHierarchyItem (line 1075) | class CallHierarchyItem(TypedDict):
  class CallHierarchyRegistrationOptions (line 1102) | class CallHierarchyRegistrationOptions(TypedDict):
  class CallHierarchyIncomingCallsParams (line 1116) | class CallHierarchyIncomingCallsParams(TypedDict):
  class CallHierarchyOutgoingCallsParams (line 1145) | class CallHierarchyOutgoingCallsParams(TypedDict):
  class CallHierarchyOutgoingCall (line 1159) | class CallHierarchyOutgoingCall(TypedDict):
  class SemanticTokensParams (line 1173) | class SemanticTokensParams(TypedDict):
  class SemanticTokens (line 1185) | class SemanticTokens(TypedDict):
  class SemanticTokensPartialResult (line 1197) | class SemanticTokensPartialResult(TypedDict):
  class SemanticTokensRegistrationOptions (line 1203) | class SemanticTokensRegistrationOptions(TypedDict):
  class SemanticTokensDeltaParams (line 1221) | class SemanticTokensDeltaParams(TypedDict):
  class SemanticTokensDelta (line 1236) | class SemanticTokensDelta(TypedDict):
  class SemanticTokensDeltaPartialResult (line 1244) | class SemanticTokensDeltaPartialResult(TypedDict):
  class SemanticTokensRangeParams (line 1250) | class SemanticTokensRangeParams(TypedDict):
  class ShowDocumentParams (line 1264) | class ShowDocumentParams(TypedDict):
  class ShowDocumentResult (line 1288) | class ShowDocumentResult(TypedDict):
  class LinkedEditingRangeParams (line 1298) | class LinkedEditingRangeParams(TypedDict):
  class LinkedEditingRanges (line 1307) | class LinkedEditingRanges(TypedDict):
  class LinkedEditingRangeRegistrationOptions (line 1322) | class LinkedEditingRangeRegistrationOptions(TypedDict):
  class CreateFilesParams (line 1331) | class CreateFilesParams(TypedDict):
  class WorkspaceEdit (line 1342) | class WorkspaceEdit(TypedDict):
  class FileOperationRegistrationOptions (line 1379) | class FileOperationRegistrationOptions(TypedDict):
  class RenameFilesParams (line 1389) | class RenameFilesParams(TypedDict):
  class DeleteFilesParams (line 1401) | class DeleteFilesParams(TypedDict):
  class MonikerParams (line 1412) | class MonikerParams(TypedDict):
  class Moniker (line 1424) | class Moniker(TypedDict):
  class MonikerRegistrationOptions (line 1441) | class MonikerRegistrationOptions(TypedDict):
  class TypeHierarchyPrepareParams (line 1447) | class TypeHierarchyPrepareParams(TypedDict):
  class TypeHierarchyItem (line 1461) | class TypeHierarchyItem(TypedDict):
  class TypeHierarchyRegistrationOptions (line 1488) | class TypeHierarchyRegistrationOptions(TypedDict):
  class TypeHierarchySupertypesParams (line 1502) | class TypeHierarchySupertypesParams(TypedDict):
  class TypeHierarchySubtypesParams (line 1516) | class TypeHierarchySubtypesParams(TypedDict):
  class InlineValueParams (line 1530) | class InlineValueParams(TypedDict):
  class InlineValueRegistrationOptions (line 1547) | class InlineValueRegistrationOptions(TypedDict):
  class InlayHintParams (line 1561) | class InlayHintParams(TypedDict):
  class InlayHint (line 1575) | class InlayHint(TypedDict):
  class InlayHintRegistrationOptions (line 1616) | class InlayHintRegistrationOptions(TypedDict):
  class DocumentDiagnosticParams (line 1633) | class DocumentDiagnosticParams(TypedDict):
  class DocumentDiagnosticReportPartialResult (line 1652) | class DocumentDiagnosticReportPartialResult(TypedDict):
  class DiagnosticServerCancellationData (line 1664) | class DiagnosticServerCancellationData(TypedDict):
  class DiagnosticRegistrationOptions (line 1673) | class DiagnosticRegistrationOptions(TypedDict):
  class WorkspaceDiagnosticParams (line 1697) | class WorkspaceDiagnosticParams(TypedDict):
  class WorkspaceDiagnosticReport (line 1715) | class WorkspaceDiagnosticReport(TypedDict):
  class WorkspaceDiagnosticReportPartialResult (line 1724) | class WorkspaceDiagnosticReportPartialResult(TypedDict):
  class DidOpenNotebookDocumentParams (line 1733) | class DidOpenNotebookDocumentParams(TypedDict):
  class DidChangeNotebookDocumentParams (line 1746) | class DidChangeNotebookDocumentParams(TypedDict):
  class DidSaveNotebookDocumentParams (line 1773) | class DidSaveNotebookDocumentParams(TypedDict):
  class DidCloseNotebookDocumentParams (line 1783) | class DidCloseNotebookDocumentParams(TypedDict):
  class RegistrationParams (line 1796) | class RegistrationParams(TypedDict):
  class UnregistrationParams (line 1800) | class UnregistrationParams(TypedDict):
  class InitializeParams (line 1804) | class InitializeParams(TypedDict):
  class InitializeResult (line 1851) | class InitializeResult(TypedDict):
  class InitializeError (line 1862) | class InitializeError(TypedDict):
  class InitializedParams (line 1874) | class InitializedParams(TypedDict):
  class DidChangeConfigurationParams (line 1878) | class DidChangeConfigurationParams(TypedDict):
  class DidChangeConfigurationRegistrationOptions (line 1885) | class DidChangeConfigurationRegistrationOptions(TypedDict):
  class ShowMessageParams (line 1889) | class ShowMessageParams(TypedDict):
  class ShowMessageRequestParams (line 1898) | class ShowMessageRequestParams(TypedDict):
  class MessageActionItem (line 1907) | class MessageActionItem(TypedDict):
  class LogMessageParams (line 1912) | class LogMessageParams(TypedDict):
  class DidOpenTextDocumentParams (line 1921) | class DidOpenTextDocumentParams(TypedDict):
  class DidChangeTextDocumentParams (line 1928) | class DidChangeTextDocumentParams(TypedDict):
  class TextDocumentChangeRegistrationOptions (line 1949) | class TextDocumentChangeRegistrationOptions(TypedDict):
  class DidCloseTextDocumentParams (line 1959) | class DidCloseTextDocumentParams(TypedDict):
  class DidSaveTextDocumentParams (line 1966) | class DidSaveTextDocumentParams(TypedDict):
  class TextDocumentSaveRegistrationOptions (line 1976) | class TextDocumentSaveRegistrationOptions(TypedDict):
  class WillSaveTextDocumentParams (line 1986) | class WillSaveTextDocumentParams(TypedDict):
  class TextEdit (line 1995) | class TextEdit(TypedDict):
  class DidChangeWatchedFilesParams (line 2006) | class DidChangeWatchedFilesParams(TypedDict):
  class DidChangeWatchedFilesRegistrationOptions (line 2013) | class DidChangeWatchedFilesRegistrationOptions(TypedDict):
  class PublishDiagnosticsParams (line 2020) | class PublishDiagnosticsParams(TypedDict):
  class CompletionParams (line 2033) | class CompletionParams(TypedDict):
  class CompletionItem (line 2050) | class CompletionItem(TypedDict):
  class CompletionList (line 2174) | class CompletionList(TypedDict):
  class CompletionRegistrationOptions (line 2202) | class CompletionRegistrationOptions(TypedDict):
  class HoverParams (line 2236) | class HoverParams(TypedDict):
  class Hover (line 2247) | class Hover(TypedDict):
  class HoverRegistrationOptions (line 2257) | class HoverRegistrationOptions(TypedDict):
  class SignatureHelpParams (line 2265) | class SignatureHelpParams(TypedDict):
  class SignatureHelp (line 2281) | class SignatureHelp(TypedDict):
  class SignatureHelpRegistrationOptions (line 2309) | class SignatureHelpRegistrationOptions(TypedDict):
  class DefinitionParams (line 2326) | class DefinitionParams(TypedDict):
  class DefinitionRegistrationOptions (line 2340) | class DefinitionRegistrationOptions(TypedDict):
  class ReferenceParams (line 2348) | class ReferenceParams(TypedDict):
  class ReferenceRegistrationOptions (line 2363) | class ReferenceRegistrationOptions(TypedDict):
  class DocumentHighlightParams (line 2371) | class DocumentHighlightParams(TypedDict):
  class DocumentHighlight (line 2385) | class DocumentHighlight(TypedDict):
  class DocumentHighlightRegistrationOptions (line 2397) | class DocumentHighlightRegistrationOptions(TypedDict):
  class DocumentSymbolParams (line 2405) | class DocumentSymbolParams(TypedDict):
  class SymbolInformation (line 2417) | class SymbolInformation(TypedDict):
  class DocumentSymbol (line 2451) | class DocumentSymbol(TypedDict):
  class DocumentSymbolRegistrationOptions (line 2484) | class DocumentSymbolRegistrationOptions(TypedDict):
  class CodeActionParams (line 2497) | class CodeActionParams(TypedDict):
  class Command (line 2513) | class Command(TypedDict):
  class CodeAction (line 2529) | class CodeAction(TypedDict):
  class CodeActionRegistrationOptions (line 2581) | class CodeActionRegistrationOptions(TypedDict):
  class WorkspaceSymbolParams (line 2599) | class WorkspaceSymbolParams(TypedDict):
  class WorkspaceSymbol (line 2612) | class WorkspaceSymbol(TypedDict):
  class WorkspaceSymbolRegistrationOptions (line 2644) | class WorkspaceSymbolRegistrationOptions(TypedDict):
  class CodeLensParams (line 2654) | class CodeLensParams(TypedDict):
  class CodeLens (line 2666) | class CodeLens(TypedDict):
  class CodeLensRegistrationOptions (line 2684) | class CodeLensRegistrationOptions(TypedDict):
  class DocumentLinkParams (line 2694) | class DocumentLinkParams(TypedDict):
  class DocumentLink (line 2706) | class DocumentLink(TypedDict):
  class DocumentLinkRegistrationOptions (line 2728) | class DocumentLinkRegistrationOptions(TypedDict):
  class DocumentFormattingParams (line 2738) | class DocumentFormattingParams(TypedDict):
  class DocumentFormattingRegistrationOptions (line 2749) | class DocumentFormattingRegistrationOptions(TypedDict):
  class DocumentRangeFormattingParams (line 2757) | class DocumentRangeFormattingParams(TypedDict):
  class DocumentRangeFormattingRegistrationOptions (line 2770) | class DocumentRangeFormattingRegistrationOptions(TypedDict):
  class DocumentOnTypeFormattingParams (line 2778) | class DocumentOnTypeFormattingParams(TypedDict):
  class DocumentOnTypeFormattingRegistrationOptions (line 2796) | class DocumentOnTypeFormattingRegistrationOptions(TypedDict):
  class RenameParams (line 2808) | class RenameParams(TypedDict):
  class RenameRegistrationOptions (line 2823) | class RenameRegistrationOptions(TypedDict):
  class PrepareRenameParams (line 2835) | class PrepareRenameParams(TypedDict):
  class ExecuteCommandParams (line 2844) | class ExecuteCommandParams(TypedDict):
  class ExecuteCommandRegistrationOptions (line 2855) | class ExecuteCommandRegistrationOptions(TypedDict):
  class ApplyWorkspaceEditParams (line 2862) | class ApplyWorkspaceEditParams(TypedDict):
  class ApplyWorkspaceEditResult (line 2873) | class ApplyWorkspaceEditResult(TypedDict):
  class WorkDoneProgressBegin (line 2891) | class WorkDoneProgressBegin(TypedDict):
  class WorkDoneProgressReport (line 2917) | class WorkDoneProgressReport(TypedDict):
  class WorkDoneProgressEnd (line 2939) | class WorkDoneProgressEnd(TypedDict):
  class SetTraceParams (line 2946) | class SetTraceParams(TypedDict):
  class LogTraceParams (line 2950) | class LogTraceParams(TypedDict):
  class CancelParams (line 2955) | class CancelParams(TypedDict):
  class ProgressParams (line 2960) | class ProgressParams(TypedDict):
  class TextDocumentPositionParams (line 2967) | class TextDocumentPositionParams(TypedDict):
  class WorkDoneProgressParams (line 2978) | class WorkDoneProgressParams(TypedDict):
  class PartialResultParams (line 2983) | class PartialResultParams(TypedDict):
  class LocationLink (line 2989) | class LocationLink(TypedDict):
  class Range (line 3010) | class Range(TypedDict):
  class ImplementationOptions (line 3030) | class ImplementationOptions(TypedDict):
  class StaticRegistrationOptions (line 3034) | class StaticRegistrationOptions(TypedDict):
  class TypeDefinitionOptions (line 3044) | class TypeDefinitionOptions(TypedDict):
  class WorkspaceFoldersChangeEvent (line 3048) | class WorkspaceFoldersChangeEvent(TypedDict):
  class ConfigurationItem (line 3057) | class ConfigurationItem(TypedDict):
  class TextDocumentIdentifier (line 3064) | class TextDocumentIdentifier(TypedDict):
  class Color (line 3071) | class Color(TypedDict):
  class DocumentColorOptions (line 3084) | class DocumentColorOptions(TypedDict):
  class FoldingRangeOptions (line 3088) | class FoldingRangeOptions(TypedDict):
  class DeclarationOptions (line 3092) | class DeclarationOptions(TypedDict):
  class Position (line 3096) | class Position(TypedDict):
  class SelectionRangeOptions (line 3141) | class SelectionRangeOptions(TypedDict):
  class CallHierarchyOptions (line 3145) | class CallHierarchyOptions(TypedDict):
  class SemanticTokensOptions (line 3154) | class SemanticTokensOptions(TypedDict):
  class SemanticTokensEdit (line 3167) | class SemanticTokensEdit(TypedDict):
  class LinkedEditingRangeOptions (line 3178) | class LinkedEditingRangeOptions(TypedDict):
  class FileCreate (line 3182) | class FileCreate(TypedDict):
  class TextDocumentEdit (line 3192) | class TextDocumentEdit(TypedDict):
  class CreateFile (line 3208) | class CreateFile(TypedDict):
  class RenameFile (line 3223) | class RenameFile(TypedDict):
  class DeleteFile (line 3240) | class DeleteFile(TypedDict):
  class ChangeAnnotation (line 3255) | class ChangeAnnotation(TypedDict):
  class FileOperationFilter (line 3272) | class FileOperationFilter(TypedDict):
  class FileRename (line 3285) | class FileRename(TypedDict):
  class FileDelete (line 3297) | class FileDelete(TypedDict):
  class MonikerOptions (line 3307) | class MonikerOptions(TypedDict):
  class TypeHierarchyOptions (line 3311) | class TypeHierarchyOptions(TypedDict):
  class InlineValueContext (line 3320) | class InlineValueContext(TypedDict):
  class InlineValueText (line 3330) | class InlineValueText(TypedDict):
  class InlineValueVariableLookup (line 3342) | class InlineValueVariableLookup(Type
Condensed preview — 588 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,864K chars).
[
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 381,
    "preview": "{\n  \"name\": \"serena Project\",\n  \"dockerFile\": \"../Dockerfile\",\n  \"workspaceFolder\": \"/workspaces/serena\",\n  \"settings\": "
  },
  {
    "path": ".dockerignore",
    "chars": 231,
    "preview": "data\nlogs\nlog\ntest/log\ndocs/jupyter_execute\ndocs/.jupyter_cache\ndocs/_build\ncoverage.xml\ndocker_build_and_run.sh\n\n# Pyth"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 62,
    "preview": "# These are supported funding model platforms\n\ngithub: oraios\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 27,
    "preview": "blank_issues_enabled: false"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue--bug--performance-problem--question-.md",
    "chars": 1420,
    "preview": "---\nname: Issue (bug, performance problem, etc.)\nabout: General Issue\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\nI have:\n\n"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 239,
    "preview": "<non_negotiable critical=\"true\">\nMUST read IMMEDIATELY and follow the project-specific instructions from the `CLAUDE.md`"
  },
  {
    "path": ".github/workflows/codespell.yml",
    "chars": 530,
    "preview": "# Codespell configuration is within pyproject.toml\n---\nname: Codespell\n\non:\n  push:\n    branches: [main]\n  pull_request:"
  },
  {
    "path": ".github/workflows/docker.yml",
    "chars": 1456,
    "preview": "name: Build and Push Docker Images\n\non:\n  push:\n    branches: [ main ]\n    tags: [ 'v*' ]\n\nenv:\n  REGISTRY: ghcr.io\n  IM"
  },
  {
    "path": ".github/workflows/docs.yaml",
    "chars": 1241,
    "preview": "name: Docs Build\n\non:\n  push:\n    branches: [ main ]\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n"
  },
  {
    "path": ".github/workflows/junie.yml",
    "chars": 472,
    "preview": "name: Junie\nrun-name: Junie run ${{ inputs.run_id }}\n\npermissions:\n  contents: write\n\non:\n  workflow_dispatch:\n    input"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 1322,
    "preview": "name: Publish Python Package\n\non:\n  release:\n    types: [created]\n\n  workflow_dispatch:\n    inputs:\n      tag:\n        d"
  },
  {
    "path": ".github/workflows/pytest.yml",
    "chars": 25856,
    "preview": "name: Tests\n\non:\n  pull_request:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: ci-${{ github.workflow }}-${{"
  },
  {
    "path": ".gitignore",
    "chars": 4083,
    "preview": "# macOS specific files\n.DS_Store\n.AppleDouble\n.LSOverride\n._*\n.Spotlight-V100\n.Trashes\nIcon\n.fseventsd\n.DocumentRevision"
  },
  {
    "path": ".serena/.gitignore",
    "chars": 26,
    "preview": "/cache\n/project.local.yml\n"
  },
  {
    "path": ".serena/memories/adding_new_language_support_guide.md",
    "chars": 7632,
    "preview": "# Adding New Language Support to Serena\n\nThis guide explains how to add support for a new programming language to Serena"
  },
  {
    "path": ".serena/memories/serena_core_concepts_and_architecture.md",
    "chars": 6466,
    "preview": "# Serena Core Concepts and Architecture\n\n## High-Level Architecture\n\nSerena is built around a dual-layer architecture:\n\n"
  },
  {
    "path": ".serena/memories/serena_repository_structure.md",
    "chars": 4087,
    "preview": "# Serena Repository Structure\n\n## Overview\nSerena is a multi-language code assistant that combines two main components:\n"
  },
  {
    "path": ".serena/memories/suggested_commands.md",
    "chars": 1389,
    "preview": "# Suggested Commands\n\n## Development Tasks (using uv and poe)\n\nThe following tasks should generally be executed using `u"
  },
  {
    "path": ".serena/project.yml",
    "chars": 9515,
    "preview": "# the name by which the project can be referenced within Serena\nproject_name: \"serena\"\n\n\n# list of languages for which l"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 19491,
    "preview": "# Latest\n\nStatus of the `main` branch. Changes prior to the next official version change will appear here.\n\n* New langua"
  },
  {
    "path": "CLAUDE.md",
    "chars": 4822,
    "preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1654,
    "preview": "# Contributing to Serena\n\nThank you for your interest in contributing to Serena!\n\n## Scope of Contributions\n\nThe followi"
  },
  {
    "path": "DOCKER.md",
    "chars": 5854,
    "preview": "# Docker Setup for Serena (Experimental)\n\n⚠️ **EXPERIMENTAL FEATURE**: The Docker setup for Serena is still experimental"
  },
  {
    "path": "Dockerfile",
    "chars": 2603,
    "preview": "# Base stage with common dependencies\nFROM python:3.11-slim AS base\nSHELL [\"/bin/bash\", \"-c\"]\n\n# Set environment variabl"
  },
  {
    "path": "LICENSE",
    "chars": 1066,
    "preview": "MIT License\n\nCopyright (c) 2025 Oraios AI\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\n"
  },
  {
    "path": "README.md",
    "chars": 12488,
    "preview": "<p align=\"center\" style=\"text-align:center\">\n  <img src=\"resources/serena-logo.svg#gh-light-mode-only\" style=\"width:500p"
  },
  {
    "path": "compose.yaml",
    "chars": 806,
    "preview": "services:\n  serena:\n    image: serena:latest\n    # To work with projects, you must mount them into /workspace/ in the co"
  },
  {
    "path": "docker_build_and_run.sh",
    "chars": 93,
    "preview": "#!/usr/bin/bash\n\ndocker build -t serena .\n\ndocker run -it --rm -v \"$(pwd)\":/workspace serena\n"
  },
  {
    "path": "docs/.gitignore",
    "chars": 44,
    "preview": "/_toc.yml\n/jupyter_execute\n/conf.py\n/_build\n"
  },
  {
    "path": "docs/01-about/.gitignore",
    "chars": 13,
    "preview": "/035_tools.md"
  },
  {
    "path": "docs/01-about/000_intro.md",
    "chars": 1039,
    "preview": "# About Serena\n\n* Serena is a powerful **coding agent toolkit** capable of turning an LLM into a fully-featured agent th"
  },
  {
    "path": "docs/01-about/010_llm-integration.md",
    "chars": 1208,
    "preview": "# LLM Integration\n\nSerena provides the necessary [tools](035_tools) for coding workflows, but an LLM is required to do t"
  },
  {
    "path": "docs/01-about/020_programming-languages.md",
    "chars": 7924,
    "preview": "# Language Support\n\nSerena provides a set of versatile code querying and editing functionalities\nbased on symbolic under"
  },
  {
    "path": "docs/01-about/030_serena-in-action.md",
    "chars": 1090,
    "preview": "# Serena in Action\n\n## Demonstration 1: Efficient Operation in Claude Code\n\nA demonstration of Serena efficiently retrie"
  },
  {
    "path": "docs/01-about/040_comparison-to-other-agents.md",
    "chars": 2393,
    "preview": "# Comparison with Other Coding Agents\n\nTo our knowledge, Serena is the first fully-featured coding agent where the\nentir"
  },
  {
    "path": "docs/01-about/050_acknowledgements.md",
    "chars": 1981,
    "preview": "# Acknowledgements\n\n## Sponsors\n\nWe are very grateful to our [sponsors](https://github.com/sponsors/oraios), who help us"
  },
  {
    "path": "docs/02-usage/000_intro.md",
    "chars": 305,
    "preview": "# Usage\n\nSerena can be used in various ways and supports coding workflows through a project-based approach.\nIts configur"
  },
  {
    "path": "docs/02-usage/010_prerequisites.md",
    "chars": 509,
    "preview": "# Prerequisites\n\n## Package Manager: uv\n\nSerena is managed by `uv`.\nIf you do not have it yet, install it following the "
  },
  {
    "path": "docs/02-usage/020_running.md",
    "chars": 9543,
    "preview": "# Running Serena\n\nSerena is a command-line tool with a variety of sub-commands.\nThis section describes\n * various ways o"
  },
  {
    "path": "docs/02-usage/025_jetbrains_plugin.md",
    "chars": 9558,
    "preview": "# The Serena JetBrains Plugin\n\nThe [JetBrains Plugin](https://plugins.jetbrains.com/plugin/28946-serena/) allows Serena "
  },
  {
    "path": "docs/02-usage/030_clients.md",
    "chars": 13583,
    "preview": "# Connecting Your MCP Client\n\nIn the following, we provide general instructions on how to connect Serena to your MCP-ena"
  },
  {
    "path": "docs/02-usage/040_workflow.md",
    "chars": 10719,
    "preview": "# The Project Workflow\n\nSerena uses a project-based workflow.\nA **project** is simply a directory on your filesystem tha"
  },
  {
    "path": "docs/02-usage/045_memories.md",
    "chars": 4466,
    "preview": "# Memories & Onboarding\n\nSerena provides the functionality of a fully featured agent, and a useful aspect of this is Ser"
  },
  {
    "path": "docs/02-usage/050_configuration.md",
    "chars": 20614,
    "preview": "# Configuration\n\nSerena is very flexible in terms of configuration. While for most users, the default configurations wil"
  },
  {
    "path": "docs/02-usage/060_dashboard.md",
    "chars": 2135,
    "preview": "# The Dashboard and GUI Tool\n\nSerena comes with built-in tools for monitoring and managing the current session:\n\n* the *"
  },
  {
    "path": "docs/02-usage/065_logs.md",
    "chars": 621,
    "preview": "# Logs\n\nIt can be vital to understand what is happening in Serena, especially when something goes wrong. \n\nYou can acces"
  },
  {
    "path": "docs/02-usage/070_security.md",
    "chars": 904,
    "preview": "# Security Considerations\n\nAs fundamental abilities for a coding agent, Serena contains tools for executing shell comman"
  },
  {
    "path": "docs/02-usage/999_additional-usage.md",
    "chars": 2157,
    "preview": "# Additional Usage Pointers\n\n## Prompting Strategies\n\nWe found that it is often a good idea to spend some time conceptua"
  },
  {
    "path": "docs/03-special-guides/000_intro.md",
    "chars": 114,
    "preview": "# Special Guides\n\nThis section contains special guides for certain topics that require more in-depth explanations."
  },
  {
    "path": "docs/03-special-guides/cpp_setup.md",
    "chars": 3057,
    "preview": "# C/C++ Setup Guide\n\nThis guide explains how to prepare a C/C++ project so that Serena can provide reliable code intelli"
  },
  {
    "path": "docs/03-special-guides/custom_agent.md",
    "chars": 2644,
    "preview": "# Custom Agents with Serena\n\nAs a reference implementation, we provide an integration with the [Agno](https://docs.agno."
  },
  {
    "path": "docs/03-special-guides/groovy_setup_guide_for_serena.md",
    "chars": 3093,
    "preview": "# Groovy Setup Guide for Serena\n\nThe Groovy support in Serena is incomplete and requires the user to provide a functioni"
  },
  {
    "path": "docs/03-special-guides/ocaml_setup_guide_for_serena.md",
    "chars": 2990,
    "preview": "# OCaml Setup Guide for Serena\n\nThis guide explains how to set up an OCaml project so that Serena can provide code intel"
  },
  {
    "path": "docs/03-special-guides/scala_setup_guide_for_serena.md",
    "chars": 4606,
    "preview": "# Scala Setup Guide for Serena\n\nThis guide explains how to prepare a Scala project so that Serena can provide reliable c"
  },
  {
    "path": "docs/03-special-guides/serena_on_chatgpt.md",
    "chars": 3203,
    "preview": "\n# Connecting Serena MCP Server to ChatGPT via MCPO & Cloudflare Tunnel\n\nThis guide explains how to expose a **locally r"
  },
  {
    "path": "docs/_config.yml",
    "chars": 8148,
    "preview": "# Book settings\n# Learn more at https://jupyterbook.org/customize/config.html\n\n#########################################"
  },
  {
    "path": "docs/autogen_docs.py",
    "chars": 7086,
    "preview": "import logging\nimport os\nimport shutil\nfrom pathlib import Path\nfrom typing import Optional, List\n\nfrom sensai.util.stri"
  },
  {
    "path": "docs/create_toc.py",
    "chars": 312,
    "preview": "import os\nfrom pathlib import Path\n\n# This script provides a platform-independent way of making the jupyter-book call (u"
  },
  {
    "path": "docs/index.md",
    "chars": 149,
    "preview": "<meta http-equiv=\"refresh\" content=\"0; url=01-about/000_intro.html\">\nIf you are not redirected automatically, [click her"
  },
  {
    "path": "flake.nix",
    "chars": 3362,
    "preview": "{\n  description = \"A powerful coding agent toolkit providing semantic retrieval and editing capabilities (MCP server & A"
  },
  {
    "path": "lessons_learned.md",
    "chars": 4549,
    "preview": "# Lessons Learned\n\nIn this document we briefly collect what we have learned while developing and using Serena,\nwhat work"
  },
  {
    "path": "llms-install.md",
    "chars": 1582,
    "preview": "# MCP Installation instructions\n\nThis document is mainly used as instructions for AI-assistants like Cline and others th"
  },
  {
    "path": "pyproject.toml",
    "chars": 9658,
    "preview": "[build-system]\nbuild-backend = \"hatchling.build\"\nrequires = [\"hatchling\"]\n\n[project]\nname = \"serena-agent\"\nversion = \"0."
  },
  {
    "path": "repo_dir_sync.py",
    "chars": 15260,
    "preview": "# -*- coding: utf-8 -*-\nimport glob\nimport os\nimport shutil\nfrom subprocess import Popen, PIPE\nimport re\nimport sys\nfrom"
  },
  {
    "path": "scripts/agno_agent.py",
    "chars": 976,
    "preview": "from agno.models.anthropic.claude import Claude\nfrom agno.models.google.gemini import Gemini\nfrom agno.os import AgentOS"
  },
  {
    "path": "scripts/demo_run_tools.py",
    "chars": 1218,
    "preview": "\"\"\"\nThis script demonstrates how to use Serena's tools locally, useful\nfor testing or development. Here the tools will b"
  },
  {
    "path": "scripts/gen_prompt_factory.py",
    "chars": 581,
    "preview": "\"\"\"\r\nAutogenerates the `prompt_factory.py` module\r\n\"\"\"\r\n\r\nfrom pathlib import Path\r\n\r\nfrom sensai.util import logging\r\n\r"
  },
  {
    "path": "scripts/mcp_server.py",
    "chars": 95,
    "preview": "from serena.cli import start_mcp_server\r\n\r\nif __name__ == \"__main__\":\r\n    start_mcp_server()\r\n"
  },
  {
    "path": "scripts/print_language_list.py",
    "chars": 420,
    "preview": "\"\"\"\nPrints the list of supported languages, for use in the project.yml template\n\"\"\"\n\nfrom solidlsp.ls_config import Lang"
  },
  {
    "path": "scripts/print_mode_context_options.py",
    "chars": 559,
    "preview": "from serena.config.context_mode import SerenaAgentContext, SerenaAgentMode\n\nif __name__ == \"__main__\":\n    print(\"------"
  },
  {
    "path": "scripts/print_tool_overview.py",
    "chars": 107,
    "preview": "from serena.agent import ToolRegistry\n\nif __name__ == \"__main__\":\n    ToolRegistry().print_tool_overview()\n"
  },
  {
    "path": "scripts/profile_tool_call.py",
    "chars": 1661,
    "preview": "import cProfile\nfrom pathlib import Path\nfrom typing import Literal\n\nfrom sensai.util import logging\nfrom sensai.util.lo"
  },
  {
    "path": "src/README.md",
    "chars": 290,
    "preview": "Serena uses (modified) versions of other libraries/packages:\n\n * solidlsp (our fork of [microsoft/multilspy](https://git"
  },
  {
    "path": "src/interprompt/.syncCommitId.remote",
    "chars": 40,
    "preview": "059d50b7d4d7e8fb9e7a13df7f7f33bae1aed5e2"
  },
  {
    "path": "src/interprompt/.syncCommitId.this",
    "chars": 40,
    "preview": "53ee7f47c08f29ae336567bcfaf89f79e7d447a2"
  },
  {
    "path": "src/interprompt/__init__.py",
    "chars": 113,
    "preview": "from .prompt_factory import autogenerate_prompt_factory_module\n\n__all__ = [\"autogenerate_prompt_factory_module\"]\n"
  },
  {
    "path": "src/interprompt/jinja_template.py",
    "chars": 1502,
    "preview": "from typing import Any\n\nimport jinja2\nimport jinja2.meta\nimport jinja2.nodes\nimport jinja2.visitor\n\nfrom interprompt.uti"
  },
  {
    "path": "src/interprompt/multilang_prompt.py",
    "chars": 17423,
    "preview": "import logging\nimport os\nfrom enum import Enum\nfrom typing import Any, Generic, Literal, TypeVar\n\nimport yaml\nfrom sensa"
  },
  {
    "path": "src/interprompt/prompt_factory.py",
    "chars": 3846,
    "preview": "import logging\nimport os\nfrom typing import Any\n\nfrom .multilang_prompt import DEFAULT_LANG_CODE, LanguageFallbackMode, "
  },
  {
    "path": "src/interprompt/util/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/interprompt/util/class_decorators.py",
    "chars": 288,
    "preview": "from typing import Any\n\n\ndef singleton(cls: type[Any]) -> Any:\n    instance = None\n\n    def get_instance(*args: Any, **k"
  },
  {
    "path": "src/serena/__init__.py",
    "chars": 523,
    "preview": "__version__ = \"0.1.4\"\n\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\ndef serena_version() -> str:\n    \"\"\"\n    :ret"
  },
  {
    "path": "src/serena/agent.py",
    "chars": 41556,
    "preview": "\"\"\"\nThe Serena Model Context Protocol (MCP) Server\n\"\"\"\n\nimport os\nimport platform\nimport subprocess\nimport sys\nfrom coll"
  },
  {
    "path": "src/serena/agno.py",
    "chars": 5929,
    "preview": "import argparse\r\nimport logging\r\nimport os\r\nimport threading\r\nfrom pathlib import Path\r\nfrom typing import Any\r\n\r\nfrom a"
  },
  {
    "path": "src/serena/analytics.py",
    "chars": 6285,
    "preview": "from __future__ import annotations\n\nimport logging\nimport threading\nfrom abc import ABC, abstractmethod\nfrom collections"
  },
  {
    "path": "src/serena/cli.py",
    "chars": 51202,
    "preview": "import collections\nimport glob\nimport json\nimport os\nimport shutil\nimport subprocess\nimport sys\nfrom collections.abc imp"
  },
  {
    "path": "src/serena/code_editor.py",
    "chars": 19254,
    "preview": "import json\nimport logging\nimport os\nfrom abc import ABC, abstractmethod\nfrom collections.abc import Iterable, Iterator,"
  },
  {
    "path": "src/serena/config/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/serena/config/context_mode.py",
    "chars": 10777,
    "preview": "\"\"\"\nContext and Mode configuration loader\n\"\"\"\n\nimport os\nfrom dataclasses import dataclass, field\nfrom pathlib import Pa"
  },
  {
    "path": "src/serena/config/serena_config.py",
    "chars": 51005,
    "preview": "\"\"\"\nThe Serena Model Context Protocol (MCP) Server\n\"\"\"\n\nimport dataclasses\nimport os\nimport re\nimport shutil\nfrom collec"
  },
  {
    "path": "src/serena/constants.py",
    "chars": 1810,
    "preview": "from pathlib import Path\n\n_repo_root_path = Path(__file__).parent.parent.parent.resolve()\n_serena_pkg_path = Path(__file"
  },
  {
    "path": "src/serena/dashboard.py",
    "chars": 27580,
    "preview": "import os\nimport socket\nimport threading\nfrom collections.abc import Callable\nfrom pathlib import Path\nfrom typing impor"
  },
  {
    "path": "src/serena/generated/generated_prompt_factory.py",
    "chars": 1531,
    "preview": "# ruff: noqa\n# black: skip\n# mypy: ignore-errors\n\n# NOTE: This module is auto-generated from interprompt.autogenerate_pr"
  },
  {
    "path": "src/serena/gui_log_viewer.py",
    "chars": 15661,
    "preview": "# mypy: ignore-errors\r\nimport logging\r\nimport os\r\nimport queue\r\nimport sys\r\nimport threading\r\nimport tkinter as tk\r\nimpo"
  },
  {
    "path": "src/serena/jetbrains/jetbrains_plugin_client.py",
    "chars": 22814,
    "preview": "\"\"\"\nClient for the Serena JetBrains Plugin\n\"\"\"\n\nimport concurrent\nimport json\nimport logging\nimport re\nimport threading\n"
  },
  {
    "path": "src/serena/jetbrains/jetbrains_types.py",
    "chars": 1451,
    "preview": "from typing import Literal, NotRequired, TypedDict\n\n\nclass PluginStatusDTO(TypedDict):\n    project_root: str\n    plugin_"
  },
  {
    "path": "src/serena/ls_manager.py",
    "chars": 11111,
    "preview": "import logging\nimport os.path\nimport threading\nfrom collections.abc import Iterator\n\nfrom sensai.util.logging import Log"
  },
  {
    "path": "src/serena/mcp.py",
    "chars": 16262,
    "preview": "\"\"\"\nThe Serena Model Context Protocol (MCP) Server\n\"\"\"\n\nimport sys\nfrom collections.abc import AsyncIterator, Iterator, "
  },
  {
    "path": "src/serena/project.py",
    "chars": 32899,
    "preview": "import json\nimport logging\nimport os\nimport re\nimport shutil\nimport threading\nfrom collections.abc import Sequence\nfrom "
  },
  {
    "path": "src/serena/project_server.py",
    "chars": 6283,
    "preview": "import json\nimport logging\nfrom typing import TYPE_CHECKING\n\nimport requests as requests_lib\nfrom flask import Flask, re"
  },
  {
    "path": "src/serena/prompt_factory.py",
    "chars": 573,
    "preview": "import os\n\nfrom serena.config.serena_config import SerenaPaths\nfrom serena.constants import PROMPT_TEMPLATES_DIR_INTERNA"
  },
  {
    "path": "src/serena/resources/config/contexts/agent.yml",
    "chars": 219,
    "preview": "description: Agent context where the system prompt (initial instructions) are provided at startup\nprompt: |\n  You are ru"
  },
  {
    "path": "src/serena/resources/config/contexts/chatgpt.yml",
    "chars": 2082,
    "preview": "description: A configuration specific for ChatGPT, which has a limit of 30 tools and requires short descriptions.\nprompt"
  },
  {
    "path": "src/serena/resources/config/contexts/claude-code.yml",
    "chars": 1472,
    "preview": "description: Claude Code (CLI agent where file operations, basic edits, etc. are already covered; single project mode)\np"
  },
  {
    "path": "src/serena/resources/config/contexts/codex.yml",
    "chars": 994,
    "preview": "description: Codex Non-symbolic editing tools and general shell tool are excluded\nprompt: |\n  You are running in the Cod"
  },
  {
    "path": "src/serena/resources/config/contexts/context.template.yml",
    "chars": 1168,
    "preview": "# See Serena's documentation for more details on concept of contexts.\ndescription: Description of the context, not used "
  },
  {
    "path": "src/serena/resources/config/contexts/desktop-app.yml",
    "chars": 996,
    "preview": "description: Desktop application context (chat application detached from code) where Serena's full toolset is provided\np"
  },
  {
    "path": "src/serena/resources/config/contexts/ide.yml",
    "chars": 1459,
    "preview": "description: Generic IDE coding agent context (basic file operations and shell operations assumed to be covered; single "
  },
  {
    "path": "src/serena/resources/config/contexts/oaicompat-agent.yml",
    "chars": 365,
    "preview": "description: All tools except InitialInstructionsTool for agent context, uses OpenAI compatible tool definitions\nprompt:"
  },
  {
    "path": "src/serena/resources/config/internal_modes/jetbrains.yml",
    "chars": 633,
    "preview": "description: JetBrains tools replace language server-based tools\nprompt: |\n  You have access to the very powerful JetBra"
  },
  {
    "path": "src/serena/resources/config/modes/editing.yml",
    "chars": 2625,
    "preview": "description: All tools, with detailed instructions for code editing\nprompt: |\n  You are operating in editing mode. You c"
  },
  {
    "path": "src/serena/resources/config/modes/interactive.yml",
    "chars": 659,
    "preview": "description: Interactive mode for clarification and step-by-step work\nprompt: |\n  You are operating in interactive mode."
  },
  {
    "path": "src/serena/resources/config/modes/mode.template.yml",
    "chars": 422,
    "preview": "# See Serena's documentation for more details on concept of modes.\ndescription: Description of the mode (meta-informatio"
  },
  {
    "path": "src/serena/resources/config/modes/no-memories.yml",
    "chars": 356,
    "preview": "description: Excludes Serena's memory tools (and onboarding tools, which rely on memory)\nprompt: |\n  Serena's memory too"
  },
  {
    "path": "src/serena/resources/config/modes/no-onboarding.yml",
    "chars": 205,
    "preview": "description: The onboarding process is not used (memories may have been created externally)\nprompt: |\n  The onboarding p"
  },
  {
    "path": "src/serena/resources/config/modes/onboarding.yml",
    "chars": 714,
    "preview": "description: Only read-only tools, focused on analysis and planning\nprompt: |\n  You are operating in onboarding mode. Th"
  },
  {
    "path": "src/serena/resources/config/modes/one-shot.yml",
    "chars": 907,
    "preview": "description: Focus on completely finishing a task without interaction\nprompt: |\n  You are operating in one-shot mode. Yo"
  },
  {
    "path": "src/serena/resources/config/modes/planning.yml",
    "chars": 488,
    "preview": "description: Only read-only tools, focused on analysis and planning\nprompt: |\n  You are operating in planning mode. Your"
  },
  {
    "path": "src/serena/resources/config/modes/query-projects.yml",
    "chars": 360,
    "preview": "description: Enables tools that allow inactive projects to be queried\nprompt: |\n  You can use the 'query_project' tool t"
  },
  {
    "path": "src/serena/resources/config/prompt_templates/simple_tool_outputs.yml",
    "chars": 5485,
    "preview": "# Some of Serena's tools are just outputting a fixed text block without doing anything else.\n# Such tools are meant to e"
  },
  {
    "path": "src/serena/resources/config/prompt_templates/system_prompt.yml",
    "chars": 4022,
    "preview": "# The system prompt template. Note that many clients will not allow configuration of the actual system prompt,\n# in whic"
  },
  {
    "path": "src/serena/resources/dashboard/dashboard.css",
    "chars": 27628,
    "preview": "html {\n    scrollbar-gutter: stable; /* Prevent layout shift when scrollbar appears */\n}\n\n:root {\n    /* Light theme var"
  },
  {
    "path": "src/serena/resources/dashboard/dashboard.js",
    "chars": 91136,
    "preview": "class LogMessage {\n    constructor(message, toolNames) {\n        message = this.escapeHtml(message);\n        const logLe"
  },
  {
    "path": "src/serena/resources/dashboard/index.html",
    "chars": 20598,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-widt"
  },
  {
    "path": "src/serena/resources/dashboard/news/20260111.html",
    "chars": 1281,
    "preview": "<div class=\"news-item\">\n    <h3>Extended Symbol Information, Type Hierarchy and Compact Overviews</h3>\n    <p class=\"dat"
  },
  {
    "path": "src/serena/resources/dashboard/news/20260303.html",
    "chars": 504,
    "preview": "<div class=\"news-item\">\n    <h3>Nested and Global Memories</h3>\n    <p class=\"date\">March 03, 2026</p>\n    <p>\n        S"
  },
  {
    "path": "src/serena/resources/project.local.template.yml",
    "chars": 402,
    "preview": "# This file allows you to locally override settings in project.yml for development purposes.\n#\n# Use the same keys as in"
  },
  {
    "path": "src/serena/resources/project.template.yml",
    "chars": 8652,
    "preview": "# the name by which the project can be referenced within Serena\nproject_name: \"project_name\"\n\n\n# list of languages for w"
  },
  {
    "path": "src/serena/resources/serena_config.template.yml",
    "chars": 7810,
    "preview": "# the language backend to use for code understanding and manipulation.\n# Possible values are:\n#  * LSP: Use the language"
  },
  {
    "path": "src/serena/symbol.py",
    "chars": 44481,
    "preview": "import json\nimport logging\nimport os\nfrom abc import ABC, abstractmethod\nfrom collections.abc import Callable, Iterable,"
  },
  {
    "path": "src/serena/task_executor.py",
    "chars": 9622,
    "preview": "import concurrent.futures\nimport threading\nimport time\nfrom collections.abc import Callable\nfrom concurrent.futures impo"
  },
  {
    "path": "src/serena/tools/__init__.py",
    "chars": 270,
    "preview": "# ruff: noqa\nfrom .tools_base import *\nfrom .file_tools import *\nfrom .symbol_tools import *\nfrom .memory_tools import *"
  },
  {
    "path": "src/serena/tools/cmd_tools.py",
    "chars": 2073,
    "preview": "\"\"\"\nTools supporting the execution of (external) commands\n\"\"\"\n\nimport os.path\n\nfrom serena.tools import Tool, ToolMarker"
  },
  {
    "path": "src/serena/tools/config_tools.py",
    "chars": 3191,
    "preview": "from serena.tools import Tool, ToolMarkerDoesNotRequireActiveProject, ToolMarkerOptional\n\n\nclass OpenDashboardTool(Tool,"
  },
  {
    "path": "src/serena/tools/file_tools.py",
    "chars": 19752,
    "preview": "\"\"\"\nFile and file system-related tools, specifically for\n  * listing directory contents\n  * reading files\n  * creating f"
  },
  {
    "path": "src/serena/tools/jetbrains_tools.py",
    "chars": 13061,
    "preview": "import logging\nfrom typing import Any, Literal\n\nimport serena.jetbrains.jetbrains_types as jb\nfrom serena.jetbrains.jetb"
  },
  {
    "path": "src/serena/tools/memory_tools.py",
    "chars": 4817,
    "preview": "from typing import Literal\n\nfrom serena.tools import Tool, ToolMarkerCanEdit\n\n\nclass WriteMemoryTool(Tool, ToolMarkerCan"
  },
  {
    "path": "src/serena/tools/query_project_tools.py",
    "chars": 4192,
    "preview": "import json\n\nfrom serena.config.serena_config import LanguageBackend\nfrom serena.jetbrains.jetbrains_plugin_client impor"
  },
  {
    "path": "src/serena/tools/symbol_tools.py",
    "chars": 16662,
    "preview": "\"\"\"\nLanguage server-related tools\n\"\"\"\n\nimport os\nfrom collections.abc import Sequence\n\nfrom serena.symbol import Languag"
  },
  {
    "path": "src/serena/tools/tools_base.py",
    "chars": 19324,
    "preview": "import inspect\nimport json\nfrom abc import ABC\nfrom collections.abc import Iterable\nfrom dataclasses import dataclass\nfr"
  },
  {
    "path": "src/serena/tools/workflow_tools.py",
    "chars": 5136,
    "preview": "\"\"\"\nTools supporting the general workflow of the agent\n\"\"\"\n\nimport platform\n\nfrom serena.tools import Tool, ToolMarkerDo"
  },
  {
    "path": "src/serena/util/class_decorators.py",
    "chars": 432,
    "preview": "from typing import Any\r\n\r\n\r\n# duplicate of interprompt.class_decorators\r\n# We don't want to depend on interprompt for th"
  },
  {
    "path": "src/serena/util/cli_util.py",
    "chars": 448,
    "preview": "def ask_yes_no(question: str, default: bool | None = None) -> bool:\n    default_prompt = \"Y/n\" if default else \"y/N\"\n\n  "
  },
  {
    "path": "src/serena/util/dataclass.py",
    "chars": 701,
    "preview": "from dataclasses import MISSING, Field\nfrom typing import Any, cast\n\n\ndef get_dataclass_default(cls: type, field_name: s"
  },
  {
    "path": "src/serena/util/dotnet.py",
    "chars": 7108,
    "preview": "import logging\nimport platform\nimport re\nimport shutil\nimport subprocess\nimport urllib\nfrom pathlib import Path\n\nfrom se"
  },
  {
    "path": "src/serena/util/exception.py",
    "chars": 2239,
    "preview": "import os\nimport sys\n\nfrom serena.agent import log\n\n\ndef is_headless_environment() -> bool:\n    \"\"\"\n    Detect if we're "
  },
  {
    "path": "src/serena/util/file_system.py",
    "chars": 14461,
    "preview": "import logging\r\nimport os\r\nfrom collections.abc import Callable, Iterator\r\nfrom dataclasses import dataclass, field\r\nfro"
  },
  {
    "path": "src/serena/util/git.py",
    "chars": 739,
    "preview": "import logging\n\nfrom sensai.util.git import GitStatus\n\nfrom .shell import subprocess_check_output\n\nlog = logging.getLogg"
  },
  {
    "path": "src/serena/util/gui.py",
    "chars": 726,
    "preview": "import os\nimport platform\n\n\ndef system_has_usable_display() -> bool:\n    system = platform.system()\n\n    # macOS and nat"
  },
  {
    "path": "src/serena/util/inspection.py",
    "chars": 2192,
    "preview": "import logging\nimport os\nfrom collections.abc import Callable, Iterator\nfrom typing import TypeVar\n\nfrom serena.util.fil"
  },
  {
    "path": "src/serena/util/logging.py",
    "chars": 5548,
    "preview": "import queue\nimport threading\nfrom collections.abc import Callable\nfrom dataclasses import dataclass\nfrom typing import "
  },
  {
    "path": "src/serena/util/shell.py",
    "chars": 1589,
    "preview": "import os\nimport subprocess\n\nfrom pydantic import BaseModel\n\nfrom solidlsp.util.subprocess_util import subprocess_kwargs"
  },
  {
    "path": "src/serena/util/text_utils.py",
    "chars": 21283,
    "preview": "import fnmatch\nimport logging\nimport os\nimport re\nfrom collections.abc import Callable\nfrom dataclasses import dataclass"
  },
  {
    "path": "src/serena/util/thread.py",
    "chars": 2098,
    "preview": "import threading\nfrom collections.abc import Callable\nfrom enum import Enum\nfrom typing import Generic, TypeVar\n\nfrom se"
  },
  {
    "path": "src/serena/util/version.py",
    "chars": 3658,
    "preview": "class Version:\n    \"\"\"\n    Represents a version, specifically the numeric components of a version string.\n\n    Suffixes "
  },
  {
    "path": "src/serena/util/yaml.py",
    "chars": 12140,
    "preview": "import logging\nimport os\nfrom collections.abc import Sequence\nfrom enum import Enum\nfrom typing import Any\n\nfrom ruamel."
  },
  {
    "path": "src/solidlsp/.gitignore",
    "chars": 23,
    "preview": "language_servers/static"
  },
  {
    "path": "src/solidlsp/__init__.py",
    "chars": 51,
    "preview": "# ruff: noqa\r\nfrom .ls import SolidLanguageServer\r\n"
  },
  {
    "path": "src/solidlsp/language_servers/al_language_server.py",
    "chars": 47552,
    "preview": "\"\"\"AL Language Server implementation for Microsoft Dynamics 365 Business Central.\"\"\"\n\nimport logging\nimport os\nimport pa"
  },
  {
    "path": "src/solidlsp/language_servers/ansible_language_server.py",
    "chars": 13549,
    "preview": "\"\"\"\nProvides Ansible specific instantiation of the LanguageServer class using ansible-language-server.\nContains various "
  },
  {
    "path": "src/solidlsp/language_servers/bash_language_server.py",
    "chars": 9781,
    "preview": "\"\"\"\nProvides Bash specific instantiation of the LanguageServer class using bash-language-server.\nContains various config"
  },
  {
    "path": "src/solidlsp/language_servers/ccls_language_server.py",
    "chars": 5931,
    "preview": "\"\"\"\nThis is an alternative to clangd for large C++ codebases where ccls may perform\nbetter for indexing and navigation. "
  },
  {
    "path": "src/solidlsp/language_servers/clangd_language_server.py",
    "chars": 14714,
    "preview": "import json\nimport logging\nimport os\nimport pathlib\nimport threading\nfrom typing import Any, cast\n\nfrom solidlsp.ls impo"
  },
  {
    "path": "src/solidlsp/language_servers/clojure_lsp.py",
    "chars": 9843,
    "preview": "\"\"\"\nProvides Clojure specific instantiation of the LanguageServer class. Contains various configurations and settings sp"
  },
  {
    "path": "src/solidlsp/language_servers/common.py",
    "chars": 6868,
    "preview": "from __future__ import annotations\n\nimport logging\nimport os\nimport platform\nimport subprocess\nfrom collections.abc impo"
  },
  {
    "path": "src/solidlsp/language_servers/csharp_language_server.py",
    "chars": 32783,
    "preview": "\"\"\"\nCSharp Language Server using Roslyn Language Server (Official Roslyn-based LSP server from NuGet.org)\n\"\"\"\n\nimport lo"
  },
  {
    "path": "src/solidlsp/language_servers/dart_language_server.py",
    "chars": 6641,
    "preview": "import logging\nimport os\nimport pathlib\nfrom typing import cast\n\nfrom solidlsp.ls import SolidLanguageServer\nfrom solidl"
  },
  {
    "path": "src/solidlsp/language_servers/eclipse_jdtls.py",
    "chars": 47707,
    "preview": "\"\"\"\nProvides Java specific instantiation of the LanguageServer class. Contains various configurations and settings speci"
  },
  {
    "path": "src/solidlsp/language_servers/elixir_tools/README.md",
    "chars": 3236,
    "preview": "# Elixir Language Server Integration\n\nThis directory contains the integration for Elixir language support using [Expert]"
  },
  {
    "path": "src/solidlsp/language_servers/elixir_tools/__init__.py",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/solidlsp/language_servers/elixir_tools/elixir_tools.py",
    "chars": 15168,
    "preview": "import logging\nimport os\nimport pathlib\nimport stat\nimport subprocess\nimport threading\nfrom typing import Any, cast\n\nfro"
  },
  {
    "path": "src/solidlsp/language_servers/elm_language_server.py",
    "chars": 8708,
    "preview": "\"\"\"\nProvides Elm specific instantiation of the LanguageServer class. Contains various configurations and settings specif"
  },
  {
    "path": "src/solidlsp/language_servers/erlang_language_server.py",
    "chars": 9207,
    "preview": "\"\"\"Erlang Language Server implementation using Erlang LS.\"\"\"\n\nimport logging\nimport os\nimport shutil\nimport subprocess\ni"
  },
  {
    "path": "src/solidlsp/language_servers/fortran_language_server.py",
    "chars": 12192,
    "preview": "\"\"\"\nFortran Language Server implementation using fortls.\n\"\"\"\n\nimport logging\nimport os\nimport pathlib\nimport re\nimport s"
  },
  {
    "path": "src/solidlsp/language_servers/fsharp_language_server.py",
    "chars": 16260,
    "preview": "\"\"\"\nProvides F# specific instantiation of the LanguageServer class.\n\"\"\"\n\nimport logging\nimport os\nimport pathlib\nimport "
  },
  {
    "path": "src/solidlsp/language_servers/gopls.py",
    "chars": 9678,
    "preview": "import logging\nimport os\nimport pathlib\nimport subprocess\nfrom typing import Any, cast\n\nfrom overrides import override\n\n"
  },
  {
    "path": "src/solidlsp/language_servers/groovy_language_server.py",
    "chars": 12611,
    "preview": "\"\"\"\nProvides Groovy specific instantiation of the LanguageServer class. Contains various configurations and settings spe"
  },
  {
    "path": "src/solidlsp/language_servers/haskell_language_server.py",
    "chars": 17744,
    "preview": "\"\"\"\nProvides Haskell specific instantiation of the LanguageServer class. Contains various configurations and settings sp"
  },
  {
    "path": "src/solidlsp/language_servers/hlsl_language_server.py",
    "chars": 11739,
    "preview": "\"\"\"\nShader language server using shader-language-server (antaalt/shader-sense).\nSupports HLSL, GLSL, and WGSL shader fil"
  },
  {
    "path": "src/solidlsp/language_servers/intelephense.py",
    "chars": 9547,
    "preview": "\"\"\"\nProvides PHP specific instantiation of the LanguageServer class using Intelephense.\n\"\"\"\n\nimport logging\nimport os\nim"
  },
  {
    "path": "src/solidlsp/language_servers/jedi_server.py",
    "chars": 9190,
    "preview": "\"\"\"\nProvides Python specific instantiation of the LanguageServer class. Contains various configurations and settings spe"
  },
  {
    "path": "src/solidlsp/language_servers/julia_server.py",
    "chars": 6792,
    "preview": "import logging\nimport os\nimport pathlib\nimport platform\nimport shutil\nimport subprocess\nfrom typing import Any\n\nfrom ove"
  },
  {
    "path": "src/solidlsp/language_servers/kotlin_language_server.py",
    "chars": 24634,
    "preview": "\"\"\"\nProvides Kotlin specific instantiation of the LanguageServer class. Contains various configurations and settings spe"
  },
  {
    "path": "src/solidlsp/language_servers/lean4_language_server.py",
    "chars": 7355,
    "preview": "\"\"\"\nProvides Lean 4 specific instantiation of the LanguageServer class.\nUses the built-in Lean 4 language server (lean -"
  },
  {
    "path": "src/solidlsp/language_servers/lua_ls.py",
    "chars": 11431,
    "preview": "\"\"\"\nProvides Lua specific instantiation of the LanguageServer class using lua-language-server.\n\"\"\"\n\nimport logging\nimpor"
  },
  {
    "path": "src/solidlsp/language_servers/luau_lsp.py",
    "chars": 15252,
    "preview": "\"\"\"\nProvides Luau specific instantiation of the LanguageServer class using luau-lsp.\n\nLuau is the programming language u"
  },
  {
    "path": "src/solidlsp/language_servers/marksman.py",
    "chars": 9280,
    "preview": "\"\"\"\nProvides Markdown specific instantiation of the LanguageServer class using marksman.\nContains various configurations"
  },
  {
    "path": "src/solidlsp/language_servers/matlab_language_server.py",
    "chars": 24886,
    "preview": "\"\"\"\nMATLAB language server integration using the official MathWorks MATLAB Language Server.\n\nArchitecture:\n    This modu"
  },
  {
    "path": "src/solidlsp/language_servers/nixd_ls.py",
    "chars": 15201,
    "preview": "# type: ignore\n\"\"\"\nProvides Nix specific instantiation of the LanguageServer class using nixd (Nix Language Server).\n\nNo"
  },
  {
    "path": "src/solidlsp/language_servers/ocaml_lsp_server.py",
    "chars": 18699,
    "preview": "\"\"\"\nProvides OCaml and Reason specific instantiation of the SolidLanguageServer class.\nContains various configurations a"
  },
  {
    "path": "src/solidlsp/language_servers/omnisharp/initialize_params.json",
    "chars": 20780,
    "preview": "{\n    \"_description\": \"The parameters sent by the client when initializing the language server with the \\\"initialize\\\" r"
  },
  {
    "path": "src/solidlsp/language_servers/omnisharp/runtime_dependencies.json",
    "chars": 18000,
    "preview": "{\n    \"_description\": \"Used to download the runtime dependencies for running OmniSharp. Obtained from https://github.com"
  },
  {
    "path": "src/solidlsp/language_servers/omnisharp/workspace_did_change_configuration.json",
    "chars": 4115,
    "preview": "{\n    \"RoslynExtensionsOptions\": {\n        \"EnableDecompilationSupport\": false,\n        \"EnableAnalyzersSupport\": true,\n"
  },
  {
    "path": "src/solidlsp/language_servers/omnisharp.py",
    "chars": 17818,
    "preview": "\"\"\"\nProvides C# specific instantiation of the LanguageServer class. Contains various configurations and settings specifi"
  },
  {
    "path": "src/solidlsp/language_servers/pascal_server.py",
    "chars": 38290,
    "preview": "\"\"\"\nProvides Pascal/Free Pascal specific instantiation of the LanguageServer class using pasls.\nContains various configu"
  },
  {
    "path": "src/solidlsp/language_servers/perl_language_server.py",
    "chars": 8762,
    "preview": "\"\"\"\nProvides Perl specific instantiation of the LanguageServer class using Perl::LanguageServer.\n\nNote: Windows is not s"
  },
  {
    "path": "src/solidlsp/language_servers/phpactor.py",
    "chars": 7156,
    "preview": "\"\"\"\nProvides PHP specific instantiation of the LanguageServer class using Phpactor.\n\"\"\"\n\nimport logging\nimport os\nimport"
  },
  {
    "path": "src/solidlsp/language_servers/powershell_language_server.py",
    "chars": 13221,
    "preview": "\"\"\"\nProvides PowerShell specific instantiation of the LanguageServer class using PowerShell Editor Services.\nContains va"
  },
  {
    "path": "src/solidlsp/language_servers/pyright_server.py",
    "chars": 8853,
    "preview": "\"\"\"\nProvides Python specific instantiation of the LanguageServer class. Contains various configurations and settings spe"
  }
]

// ... and 388 more files (download for full content)

About this extraction

This page contains the full source code of the oraios/serena GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 588 files (3.5 MB), approximately 944.8k tokens, and a symbol index with 3909 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!