Skip to content

feat: epmdless clustering#205

Merged
doorgan merged 3 commits intomainfrom
doorgan/epmdless-2
Nov 15, 2025
Merged

feat: epmdless clustering#205
doorgan merged 3 commits intomainfrom
doorgan/epmdless-2

Conversation

@doorgan
Copy link
Copy Markdown
Contributor

@doorgan doorgan commented Nov 10, 2025

Alternative to #191 without introducing dependencies.

TODO:

  • Figure out why the engine node thinks Forge.EPMD does not exist.

@doorgan doorgan force-pushed the doorgan/epmdless-2 branch 2 times, most recently from fccf784 to 4bffe9b Compare November 11, 2025 02:29
Comment thread apps/expert/rel/remote.vm.args.eex Outdated
## Enable deployment without epmd
## (requires changing both vm.args and remote.vm.args)
-epmd_module Elixir.XPForge.EPMD
-start_epmd false -dist_listen false
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need the -dist_listen false anymore

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, this is a leftover of me splitting hairs

@mhanberg
Copy link
Copy Markdown
Member

Figure out why the engine node thinks Forge.EPMD does not exist.

Are you seeing this in tests or when you actually put it up?

@doorgan
Copy link
Copy Markdown
Contributor Author

doorgan commented Nov 11, 2025

@mhanberg both in tests and when building a release, I'm getting this error:

Kernel pid terminated (application_controller) ("{application_start_failure,kernel,{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,'Elixir.Forge.EPMD',{'EXIT',{undef,[{'Elixir.Forge.EPMD',start_link,[],[]},{supervisor,do_start_child_i,3,[{file,\"supervisor.erl\"},{line,959}]},{supervisor,do_start_child,3,[{file,\"supervisor.erl\"},{line,945}]},{supervisor,'-start_children/2-fun-0-',3,[{file,\"supervisor.erl\"},{line,929}]},{supervisor,children_map,4,[{file,\"supervisor.erl\"},{line,1820}]},{supervisor,init_children,2,[{file,\"supervisor.erl\"},{line,889}]},{gen_server,init_it,2,[{file,\"gen_server.erl\"},{line,2229}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,2184}]}]}}}}}},{kernel,start,[normal,[]]}}}")

@mhanberg
Copy link
Copy Markdown
Member

@mhanberg both in tests and when building a release, I'm getting this error:

Kernel pid terminated (application_controller) ("{application_start_failure,kernel,{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,'Elixir.Forge.EPMD',{'EXIT',{undef,[{'Elixir.Forge.EPMD',start_link,[],[]},{supervisor,do_start_child_i,3,[{file,\"supervisor.erl\"},{line,959}]},{supervisor,do_start_child,3,[{file,\"supervisor.erl\"},{line,945}]},{supervisor,'-start_children/2-fun-0-',3,[{file,\"supervisor.erl\"},{line,929}]},{supervisor,children_map,4,[{file,\"supervisor.erl\"},{line,1820}]},{supervisor,init_children,2,[{file,\"supervisor.erl\"},{line,889}]},{gen_server,init_it,2,[{file,\"gen_server.erl\"},{line,2229}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,2184}]}]}}}}}},{kernel,start,[normal,[]]}}}")

What stands out to me is that the module name is not namespaced.

Comment thread apps/engine/lib/engine/bootstrap.ex Outdated
require Logger

def init(%Project{} = project, document_store_entropy, app_configs) do
Application.put_env(:kernel, :epmd_module, Forge.EPMD, persistent: true)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you know why this is necessary?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I't not or it should not be, I'm trying out things from the Livebook codebase
It seems like the vm tries to find the EPMD module before loading the code paths provided via -pa
Here in particular I was trying to not specify the epmd module with erl flags and instead try to change the epmd module after the engine node starts. This line wasn't reached because the rpc command to bootstrap didn't get through, but this in the -e flag doesn't help either

Comment thread apps/expert/lib/expert/engine_node.ex
@doorgan
Copy link
Copy Markdown
Contributor Author

doorgan commented Nov 11, 2025

What stands out to me is that the module name is not namespaced.

Ah, that log is from running tests, where namespacing doesn't run
If I build a release I get this in the lsp logs:

[ERROR][2025-11-10 19:03:47] ...p/_transport.lua:36     "rpc"   "/Users/dorgan/dev/expert/apps/expert/burrito_out/expert_darwin_arm64"  "stderr"        "plication_controller) (\"{application_start_failure,kernel,{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,'Elixir.XPForge.EPMD',{'EXIT',{undef,[{'Elixir.XPForge.EPMD',start_link,[],[]},{supervisor,do_start_child_i,3,[{file,\\\"supervisor.erl\\\"},{line,420}]},{supervisor,do_start_child,2,[{file,\\\"supervisor.erl\\\"},{line,406}]},{supervis"

@doorgan
Copy link
Copy Markdown
Contributor Author

doorgan commented Nov 11, 2025

I can reproduce the same issues on a barebones mix project: https://github.com/doorgan/epmdless

It does partially work if I follow @josevalim's example and run elixirc on a file containing both modules(although I get the requested disconnect from node in order to prevent overlapping partitions warning and children can't connect to each other), but it breaks inside a mix project

@mhanberg
Copy link
Copy Markdown
Member

I haven't researched further to validate and find a solution, but I believe the reason this is happening in the engine but not in expert is because expert is started as a release, which i believe by default loads all modules before the app starts.

Normal mix run or mix phx.server or iex -S mix invocations will lazily load modules as they are started, which is why it isn't present when it tries to utilize the -epmd_module. Which it seems to not load it when it tries to invoke it i guess.

Relevant section from the release docs at https://hexdocs.pm/elixir/releases.html#operating-system-scripts

# # Set the release to load code on demand (interactive) instead of preloading (embedded).
# export RELEASE_MODE=interactive

@josevalim
Copy link
Copy Markdown
Contributor

I can take a look later but in Livebook we don't start the node in the release, we explicitly call :net_kernel.start or similar to start them. It may be for the reasons above. i will investigate later.

@doorgan doorgan marked this pull request as ready for review November 14, 2025 15:20
@doorgan
Copy link
Copy Markdown
Contributor Author

doorgan commented Nov 14, 2025

@josevalim thanks for all the help! This PR is now ready for testing and review

Comment thread justfile
Comment on lines +37 to +40
(cd "apps/$proj" && elixir --erl "-start_epmd false -epmd_module Elixir.Forge.EPMD" -S mix {{args}})
;;
engine)
(cd "apps/$proj" && elixir --erl "-start_epmd false -epmd_module Elixir.Forge.EPMD" -S mix {{args}})
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's still useful to keep them separate even if they're the same right now but I don't feel strongly about it

Comment thread apps/expert/lib/expert/engine_node.ex Outdated
you must set the environment variable ELIXIR_ERL_OPTIONS="-epmd_module #{Forge.EPMD}"
""")
end
end
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we do this when expert boots rather than when we try to start a child node?


## Enable deployment without epmd
## (requires changing both vm.args and remote.vm.args)
-epmd_module Elixir.XPForge.EPMD
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please double check this is indeed necessary. You may be fine using epmd for remote debugging (or maybe remote debugging is pointless).

Copy link
Copy Markdown
Contributor

@josevalim josevalim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me! I have added some comments but none of them are stoppers (and they might be wrong :D)

Copy link
Copy Markdown
Member

@mhanberg mhanberg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works on my corporate macbook and on my personal linux desktop

:shipit:

@doorgan doorgan merged commit 488d3a9 into main Nov 15, 2025
36 checks passed
@doorgan doorgan deleted the doorgan/epmdless-2 branch November 15, 2025 17:31
@doorgan doorgan mentioned this pull request Nov 15, 2025
mhanberg pushed a commit that referenced this pull request Feb 19, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.1.0-rc.0](v0.1.0...v0.1.0-rc.0)
(2026-02-19)


### ⚠ BREAKING CHANGES

* add CLI flag handling
([#185](#185))

### Features

* add CLI flag handling
([#185](#185))
([46713a1](46713a1))
* add engine subcommands to expert
([#254](#254))
([d7c348c](d7c348c))
* add missing require code action
([#283](#283))
([a9ee0ec](a9ee0ec))
* configure Workspace Symbols to return all symbols on empty query
([#293](#293))
([03ec5c6](03ec5c6))
* create undefined function code action
([#287](#287))
([9624b3a](9624b3a))
* **engine:** hover for module attributes
([#329](#329))
([1330370](1330370))
* **engine:** indicate progress when loading checkpoint
([#313](#313))
([fad5a0b](fad5a0b))
* **engine:** support shorthand notation inside ~H sigil
([#278](#278))
([e1e5666](e1e5666))
* **engine:** use ElixirSense for hover resolution
([#351](#351))
([0e7896b](0e7896b))
* epmdless clustering
([#205](#205))
([488d3a9](488d3a9))
* epmdless deployments
([#167](#167))
([9cfb5cc](9cfb5cc))
* on the fly engine builds
([#24](#24))
([51eb6f1](51eb6f1))
* use Spitfire to provide document symbols on documents with syntax
errors ([#288](#288))
([2ed7a81](2ed7a81))
* windows support
([#219](#219))
([d0927ce](d0927ce))
* workspace folders
([#18](#18))
([1204313](1204313)),
closes [#136](#136)


### Bug Fixes

* add lsp logging when failing to find an elixir executable
([#169](#169))
([4dfba22](4dfba22))
* avoid crashing when calling `ActiveProjects.active?/1`
([#297](#297))
([ae352b9](ae352b9))
* better handling of native<->lsp conversions
([#34](#34))
([88dc456](88dc456))
* bring back completions for things defined in test files
([#32](#32))
([8d7a47a](8d7a47a))
* clamp start_char for comletion prefix
([#239](#239))
([46d3446](46d3446))
* **cli:** don't crash when there is no CLI arg provided
([#348](#348))
([9a9140e](9a9140e))
* **cli:** show per tool version engine builds
([#301](#301))
([399b2a0](399b2a0))
* correctly order aliases
([#322](#322))
([fb269fa](fb269fa))
* Crash when typing english
([#742](https://github.com/elixir-lang/expert/issues/742))
([697eac9](697eac9)),
closes [#741](https://github.com/elixir-lang/expert/issues/741)
* Current module not identified in defimpl
([#665](https://github.com/elixir-lang/expert/issues/665))
([29f1055](29f1055))
* **deps:** update sourceror to 1.10.1 to fix range calculations
([#362](#362))
([59489c7](59489c7))
* disable shell sessions when fetching the PATH
([#177](#177))
([78236ef](78236ef))
* do not clamp character recvd from client
([#123](#123))
([1a3b843](1a3b843))
* don't convert to_lsp twice in server specific messages
([#190](#190))
([33bb850](33bb850))
* don't sometimes hang
([5d6bcde](5d6bcde))
* Edge case for module loading
([#738](https://github.com/elixir-lang/expert/issues/738))
([dbbef2c](dbbef2c))
* elixir path discovery
([#248](#248))
([f9b119c](f9b119c))
* **engine_node:** error reason not being shown
([#277](#277))
([c7b7fa8](c7b7fa8))
* **engine:** avoid duplicate spec annotation when falling back to
ElixirSense ([#410](#410))
([5b4faee](5b4faee))
* **engine:** code lens exception when mix.exs not found
([#281](#281))
([f9c81da](f9c81da))
* **engine:** correctly match any-struct references
([#347](#347))
([6a92581](6a92581))
* **engine:** don't attempt search when ETS checkpoint is loading
([#308](#308))
([438c965](438c965))
* **engine:** don't crash on hover for piped expression in curly braces
in HEEx ([#350](#350))
([f0044d6](f0044d6))
* **engine:** don't crash when calling references on an atom
([#396](#396))
([a8badfc](a8badfc))
* **engine:** don't terminate search store on timeout
([#338](#338))
([d91f6af](d91f6af)),
closes [#303](#303)
* **engine:** download Hex and Rebar only if missing
([#337](#337))
([bc7f57e](bc7f57e))
* **engine:** handle failing build script
([#188](#188))
([ce9ac22](ce9ac22))
* **engine:** handle matches against any struct
([#343](#343))
([86fe8ec](86fe8ec))
* **engine:** improve entity resolution for HEEx components with curly
braces ([#328](#328))
([eff68bf](eff68bf))
* **engine:** index functions with default arguments
([#402](#402))
([1aea6c7](1aea6c7))
* **engine:** resolve correct arity from inside ~H sigil
([#314](#314))
([d2eacc0](d2eacc0))
* **engine:** stuck on format request
([#378](#378))
([aa5ba2b](aa5ba2b))
* **engine:** support go to definition when function is called via
__MODULE__ ([#261](#261))
([b1d5e17](b1d5e17))
* Exclude expert dependencies from completions based on project
dependencies
([3a47058](3a47058))
* **expert:** always log PATH on start
([#387](#387))
([bfeb8a2](bfeb8a2))
* **expert:** build engine for elixir version 1.16.1 and below
([#330](#330))
([2a2bdd9](2a2bdd9))
* **expert:** correctly handle unicode characters sent via port
([#388](#388))
([4fe530b](4fe530b))
* **expert:** print to stderr when no transport argument provided
([#280](#280))
([fc841e4](fc841e4))
* **expert:** save new configuration after
`workspace/didChangeConfiguration`
([#282](#282))
([b060d23](b060d23))
* **expert:** spec completions for functions with guards
([#406](#406))
([d615858](d615858))
* fallback to packaged or system elixir
([#300](#300))
([10262cf](10262cf))
* filter out RELEASE_ROOT from PATH instead of running a login shell
([#344](#344))
([375391c](375391c))
* fix release-all command
([492022f](492022f))
* fixup namespacing and packaging
([#29](#29))
([69ac8fe](69ac8fe))
* **forge:** don't crash on analysis of code with incorrect aliases
([#408](#408))
([7c30502](7c30502))
* **forge:** handle interpolation when it starts with a special token
([#342](#342))
([dd7b027](dd7b027))
* **forge:** improve log when Spitfire crashes
([#352](#352))
([80900e5](80900e5))
* formatting format incorrectly when contain special character
([#252](#252))
([b5b001b](b5b001b))
* Function definition extractor chokes on macro functions
([#682](https://github.com/elixir-lang/expert/issues/682))
([ccf355f](ccf355f)),
closes [#680](https://github.com/elixir-lang/expert/issues/680)
* give proper argument to `TaskQueue.add/2` in Server.handle_message
([#791](https://github.com/elixir-lang/expert/issues/791))
([34ee071](34ee071))
* handle missing metadata in indexer extractors
([#390](#390))
([71c33f1](71c33f1))
* handle spitfire crashes
([#319](#319))
([ffe360c](ffe360c))
* handle string ids in requests
([#120](#120))
([5d6bcde](5d6bcde))
* include erlang source files when packaging engine
([580ccc8](580ccc8))
* inherited PATH pollutes project environment
([#298](#298))
([8e1bb3d](8e1bb3d))
* interpolation_ranges/1 should work for empty interpolations
([#321](#321))
([3ec1810](3ec1810))
* Invalid reads for requests that contain multi-byte characters
([#661](https://github.com/elixir-lang/expert/issues/661))
([f6ca36f](f6ca36f))
* let the system figure out the elixir version for the project
([#162](#162))
([5dacce4](5dacce4))
* log project's erl path
([#367](#367))
([d8c81cd](d8c81cd))
* make sure asdf shims are in the PATH
([#87](#87))
([7626f90](7626f90))
* Module suggestion was incorrect for files with multiple periods
([#705](https://github.com/elixir-lang/expert/issues/705))
([824df66](824df66)),
closes [#703](https://github.com/elixir-lang/expert/issues/703)
* nil.__struct__/0 is undefined when receiving shutdown
([#250](#250))
([849003e](849003e))
* **nix:** use eval release command
([#199](#199))
([25f80c8](25f80c8))
* Non-string test names crash exunit indexer
([#676](https://github.com/elixir-lang/expert/issues/676))
([29373d5](29373d5)),
closes [#675](https://github.com/elixir-lang/expert/issues/675)
* properly log when engine fails to initialize
([#244](#244))
([81e1184](81e1184))
* properly set the mix env when building expert
([4caf258](4caf258))
* **release:** don't cd into rel directory before starting app
([#268](#268))
([3b76e97](3b76e97))
* remove all usages of epmd
([#339](#339))
([cef4adb](cef4adb))
* remove erts from extra_applications
([#202](#202))
([aa8bd84](aa8bd84))
* remove escape sequences from PATH in fish
([#237](#237))
([b237fd5](b237fd5))
* Resolve doesn't recognize zero-arg defs as functions
([#606](https://github.com/elixir-lang/expert/issues/606))
([38a649c](38a649c)),
closes [#604](https://github.com/elixir-lang/expert/issues/604)
* resolve function delegates on hover docs
([#399](#399))
([a3c629a](a3c629a))
* revert "feat: epmdless deployments
([#167](#167))"
([#180](#180))
([0f66faa](0f66faa))
* revert dev server
([#48](#48))
([9345e31](9345e31))
* sanitize node names
([#323](#323))
([7591304](7591304))
* start projects after server is initialized
([#294](#294))
([76d6cd5](76d6cd5))
* stop sending genlsp datastructures to engine
([#31](#31))
([43d406f](43d406f))
* support Fish shell's space-separated PATH format
([#172](#172))
([9803293](9803293))
* support mise et al on windows
([#304](#304))
([3cc343f](3cc343f))
* support Nushell for PATH detection
([#272](#272))
([8a9fd3d](8a9fd3d))
* trim any quotes wrapping PATH when elixir is managed by mise
([#82](#82))
([d828966](d828966))
* trim PATH returned by shell
([#213](#213))
([735199d](735199d))
* update document store on didchange even without the engine running
([#326](#326))
([c80b72d](c80b72d))
* update gen_lsp to 0.11.3
([#315](#315))
([13cfee6](13cfee6)),
closes [#245](#245)
* update spitfire to v0.3.4
([#373](#373))
([6f57f16](6f57f16))
* update spitfire to v0.3.5
([#376](#376))
([85822fe](85822fe))
* use Calendar.UTCOnlyTimeZoneDatabase instead of project configured tz
database ([#324](#324))
([9e913f6](9e913f6))
* use correct build directory when namespacing expert
([b6540dd](b6540dd))
* use dynamic registrations and start project node asynchronously
([#30](#30))
([e1ce165](e1ce165))
* use minimal PATH on unix instead of fully removing it
([#305](#305))
([74da1a5](74da1a5))
* use project directory when building engine
([#203](#203))
([c5ac441](c5ac441))
* utf8_prefix should take into account empty lines
([#164](#164))
([16c21e0](16c21e0))


### Miscellaneous Chores

* release as 0.1.0
([7625d3c](7625d3c))
* release as 0.1.0-rc.0
([c98b870](c98b870))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@doorgan doorgan restored the doorgan/epmdless-2 branch February 19, 2026 10:07
@doorgan doorgan deleted the doorgan/epmdless-2 branch February 19, 2026 11:54
katafrakt pushed a commit to katafrakt/expert that referenced this pull request Feb 20, 2026
🤖 I have created a release *beep* *boop*
---

[0.1.0-rc.0](expert-lsp/expert@v0.1.0...v0.1.0-rc.0)
(2026-02-19)

* add CLI flag handling
([expert-lsp#185](expert-lsp#185))

* add CLI flag handling
([expert-lsp#185](expert-lsp#185))
([46713a1](expert-lsp@46713a1))
* add engine subcommands to expert
([expert-lsp#254](expert-lsp#254))
([d7c348c](expert-lsp@d7c348c))
* add missing require code action
([expert-lsp#283](expert-lsp#283))
([a9ee0ec](expert-lsp@a9ee0ec))
* configure Workspace Symbols to return all symbols on empty query
([expert-lsp#293](expert-lsp#293))
([03ec5c6](expert-lsp@03ec5c6))
* create undefined function code action
([expert-lsp#287](expert-lsp#287))
([9624b3a](expert-lsp@9624b3a))
* **engine:** hover for module attributes
([expert-lsp#329](expert-lsp#329))
([1330370](expert-lsp@1330370))
* **engine:** indicate progress when loading checkpoint
([expert-lsp#313](expert-lsp#313))
([fad5a0b](expert-lsp@fad5a0b))
* **engine:** support shorthand notation inside ~H sigil
([expert-lsp#278](expert-lsp#278))
([e1e5666](expert-lsp@e1e5666))
* **engine:** use ElixirSense for hover resolution
([expert-lsp#351](expert-lsp#351))
([0e7896b](expert-lsp@0e7896b))
* epmdless clustering
([expert-lsp#205](expert-lsp#205))
([488d3a9](expert-lsp@488d3a9))
* epmdless deployments
([expert-lsp#167](expert-lsp#167))
([9cfb5cc](expert-lsp@9cfb5cc))
* on the fly engine builds
([expert-lsp#24](expert-lsp#24))
([51eb6f1](expert-lsp@51eb6f1))
* use Spitfire to provide document symbols on documents with syntax
errors ([expert-lsp#288](expert-lsp#288))
([2ed7a81](expert-lsp@2ed7a81))
* windows support
([expert-lsp#219](expert-lsp#219))
([d0927ce](expert-lsp@d0927ce))
* workspace folders
([expert-lsp#18](expert-lsp#18))
([1204313](expert-lsp@1204313)),
closes [expert-lsp#136](expert-lsp#136)

* add lsp logging when failing to find an elixir executable
([expert-lsp#169](expert-lsp#169))
([4dfba22](expert-lsp@4dfba22))
* avoid crashing when calling `ActiveProjects.active?/1`
([expert-lsp#297](expert-lsp#297))
([ae352b9](expert-lsp@ae352b9))
* better handling of native&lt;-&gt;lsp conversions
([expert-lsp#34](expert-lsp#34))
([88dc456](expert-lsp@88dc456))
* bring back completions for things defined in test files
([expert-lsp#32](expert-lsp#32))
([8d7a47a](expert-lsp@8d7a47a))
* clamp start_char for comletion prefix
([expert-lsp#239](expert-lsp#239))
([46d3446](expert-lsp@46d3446))
* **cli:** don't crash when there is no CLI arg provided
([expert-lsp#348](expert-lsp#348))
([9a9140e](expert-lsp@9a9140e))
* **cli:** show per tool version engine builds
([expert-lsp#301](expert-lsp#301))
([399b2a0](expert-lsp@399b2a0))
* correctly order aliases
([expert-lsp#322](expert-lsp#322))
([fb269fa](expert-lsp@fb269fa))
* Crash when typing english
([#742](https://github.com/elixir-lang/expert/issues/742))
([697eac9](expert-lsp@697eac9)),
closes [#741](https://github.com/elixir-lang/expert/issues/741)
* Current module not identified in defimpl
([#665](https://github.com/elixir-lang/expert/issues/665))
([29f1055](expert-lsp@29f1055))
* **deps:** update sourceror to 1.10.1 to fix range calculations
([expert-lsp#362](expert-lsp#362))
([59489c7](expert-lsp@59489c7))
* disable shell sessions when fetching the PATH
([expert-lsp#177](expert-lsp#177))
([78236ef](expert-lsp@78236ef))
* do not clamp character recvd from client
([expert-lsp#123](expert-lsp#123))
([1a3b843](expert-lsp@1a3b843))
* don't convert to_lsp twice in server specific messages
([expert-lsp#190](expert-lsp#190))
([33bb850](expert-lsp@33bb850))
* don't sometimes hang
([5d6bcde](expert-lsp@5d6bcde))
* Edge case for module loading
([#738](https://github.com/elixir-lang/expert/issues/738))
([dbbef2c](expert-lsp@dbbef2c))
* elixir path discovery
([expert-lsp#248](expert-lsp#248))
([f9b119c](expert-lsp@f9b119c))
* **engine_node:** error reason not being shown
([expert-lsp#277](expert-lsp#277))
([c7b7fa8](expert-lsp@c7b7fa8))
* **engine:** avoid duplicate spec annotation when falling back to
ElixirSense ([expert-lsp#410](expert-lsp#410))
([5b4faee](expert-lsp@5b4faee))
* **engine:** code lens exception when mix.exs not found
([expert-lsp#281](expert-lsp#281))
([f9c81da](expert-lsp@f9c81da))
* **engine:** correctly match any-struct references
([expert-lsp#347](expert-lsp#347))
([6a92581](expert-lsp@6a92581))
* **engine:** don't attempt search when ETS checkpoint is loading
([expert-lsp#308](expert-lsp#308))
([438c965](expert-lsp@438c965))
* **engine:** don't crash on hover for piped expression in curly braces
in HEEx ([expert-lsp#350](expert-lsp#350))
([f0044d6](expert-lsp@f0044d6))
* **engine:** don't crash when calling references on an atom
([expert-lsp#396](expert-lsp#396))
([a8badfc](expert-lsp@a8badfc))
* **engine:** don't terminate search store on timeout
([expert-lsp#338](expert-lsp#338))
([d91f6af](expert-lsp@d91f6af)),
closes [expert-lsp#303](expert-lsp#303)
* **engine:** download Hex and Rebar only if missing
([expert-lsp#337](expert-lsp#337))
([bc7f57e](expert-lsp@bc7f57e))
* **engine:** handle failing build script
([expert-lsp#188](expert-lsp#188))
([ce9ac22](expert-lsp@ce9ac22))
* **engine:** handle matches against any struct
([expert-lsp#343](expert-lsp#343))
([86fe8ec](expert-lsp@86fe8ec))
* **engine:** improve entity resolution for HEEx components with curly
braces ([expert-lsp#328](expert-lsp#328))
([eff68bf](expert-lsp@eff68bf))
* **engine:** index functions with default arguments
([expert-lsp#402](expert-lsp#402))
([1aea6c7](expert-lsp@1aea6c7))
* **engine:** resolve correct arity from inside ~H sigil
([expert-lsp#314](expert-lsp#314))
([d2eacc0](expert-lsp@d2eacc0))
* **engine:** stuck on format request
([expert-lsp#378](expert-lsp#378))
([aa5ba2b](expert-lsp@aa5ba2b))
* **engine:** support go to definition when function is called via
__MODULE__ ([expert-lsp#261](expert-lsp#261))
([b1d5e17](expert-lsp@b1d5e17))
* Exclude expert dependencies from completions based on project
dependencies
([3a47058](expert-lsp@3a47058))
* **expert:** always log PATH on start
([expert-lsp#387](expert-lsp#387))
([bfeb8a2](expert-lsp@bfeb8a2))
* **expert:** build engine for elixir version 1.16.1 and below
([expert-lsp#330](expert-lsp#330))
([2a2bdd9](expert-lsp@2a2bdd9))
* **expert:** correctly handle unicode characters sent via port
([expert-lsp#388](expert-lsp#388))
([4fe530b](expert-lsp@4fe530b))
* **expert:** print to stderr when no transport argument provided
([expert-lsp#280](expert-lsp#280))
([fc841e4](expert-lsp@fc841e4))
* **expert:** save new configuration after
`workspace/didChangeConfiguration`
([expert-lsp#282](expert-lsp#282))
([b060d23](expert-lsp@b060d23))
* **expert:** spec completions for functions with guards
([expert-lsp#406](expert-lsp#406))
([d615858](expert-lsp@d615858))
* fallback to packaged or system elixir
([expert-lsp#300](expert-lsp#300))
([10262cf](expert-lsp@10262cf))
* filter out RELEASE_ROOT from PATH instead of running a login shell
([expert-lsp#344](expert-lsp#344))
([375391c](expert-lsp@375391c))
* fix release-all command
([492022f](expert-lsp@492022f))
* fixup namespacing and packaging
([expert-lsp#29](expert-lsp#29))
([69ac8fe](expert-lsp@69ac8fe))
* **forge:** don't crash on analysis of code with incorrect aliases
([expert-lsp#408](expert-lsp#408))
([7c30502](expert-lsp@7c30502))
* **forge:** handle interpolation when it starts with a special token
([expert-lsp#342](expert-lsp#342))
([dd7b027](expert-lsp@dd7b027))
* **forge:** improve log when Spitfire crashes
([expert-lsp#352](expert-lsp#352))
([80900e5](expert-lsp@80900e5))
* formatting format incorrectly when contain special character
([expert-lsp#252](expert-lsp#252))
([b5b001b](expert-lsp@b5b001b))
* Function definition extractor chokes on macro functions
([#682](https://github.com/elixir-lang/expert/issues/682))
([ccf355f](expert-lsp@ccf355f)),
closes [#680](https://github.com/elixir-lang/expert/issues/680)
* give proper argument to `TaskQueue.add/2` in Server.handle_message
([#791](https://github.com/elixir-lang/expert/issues/791))
([34ee071](expert-lsp@34ee071))
* handle missing metadata in indexer extractors
([expert-lsp#390](expert-lsp#390))
([71c33f1](expert-lsp@71c33f1))
* handle spitfire crashes
([expert-lsp#319](expert-lsp#319))
([ffe360c](expert-lsp@ffe360c))
* handle string ids in requests
([expert-lsp#120](expert-lsp#120))
([5d6bcde](expert-lsp@5d6bcde))
* include erlang source files when packaging engine
([580ccc8](expert-lsp@580ccc8))
* inherited PATH pollutes project environment
([expert-lsp#298](expert-lsp#298))
([8e1bb3d](expert-lsp@8e1bb3d))
* interpolation_ranges/1 should work for empty interpolations
([expert-lsp#321](expert-lsp#321))
([3ec1810](expert-lsp@3ec1810))
* Invalid reads for requests that contain multi-byte characters
([#661](https://github.com/elixir-lang/expert/issues/661))
([f6ca36f](expert-lsp@f6ca36f))
* let the system figure out the elixir version for the project
([expert-lsp#162](expert-lsp#162))
([5dacce4](expert-lsp@5dacce4))
* log project's erl path
([expert-lsp#367](expert-lsp#367))
([d8c81cd](expert-lsp@d8c81cd))
* make sure asdf shims are in the PATH
([expert-lsp#87](expert-lsp#87))
([7626f90](expert-lsp@7626f90))
* Module suggestion was incorrect for files with multiple periods
([#705](https://github.com/elixir-lang/expert/issues/705))
([824df66](expert-lsp@824df66)),
closes [#703](https://github.com/elixir-lang/expert/issues/703)
* nil.__struct__/0 is undefined when receiving shutdown
([expert-lsp#250](expert-lsp#250))
([849003e](expert-lsp@849003e))
* **nix:** use eval release command
([expert-lsp#199](expert-lsp#199))
([25f80c8](expert-lsp@25f80c8))
* Non-string test names crash exunit indexer
([#676](https://github.com/elixir-lang/expert/issues/676))
([29373d5](expert-lsp@29373d5)),
closes [#675](https://github.com/elixir-lang/expert/issues/675)
* properly log when engine fails to initialize
([expert-lsp#244](expert-lsp#244))
([81e1184](expert-lsp@81e1184))
* properly set the mix env when building expert
([4caf258](expert-lsp@4caf258))
* **release:** don't cd into rel directory before starting app
([expert-lsp#268](expert-lsp#268))
([3b76e97](expert-lsp@3b76e97))
* remove all usages of epmd
([expert-lsp#339](expert-lsp#339))
([cef4adb](expert-lsp@cef4adb))
* remove erts from extra_applications
([expert-lsp#202](expert-lsp#202))
([aa8bd84](expert-lsp@aa8bd84))
* remove escape sequences from PATH in fish
([expert-lsp#237](expert-lsp#237))
([b237fd5](expert-lsp@b237fd5))
* Resolve doesn't recognize zero-arg defs as functions
([#606](https://github.com/elixir-lang/expert/issues/606))
([38a649c](expert-lsp@38a649c)),
closes [#604](https://github.com/elixir-lang/expert/issues/604)
* resolve function delegates on hover docs
([expert-lsp#399](expert-lsp#399))
([a3c629a](expert-lsp@a3c629a))
* revert "feat: epmdless deployments
([expert-lsp#167](expert-lsp#167))"
([expert-lsp#180](expert-lsp#180))
([0f66faa](expert-lsp@0f66faa))
* revert dev server
([expert-lsp#48](expert-lsp#48))
([9345e31](expert-lsp@9345e31))
* sanitize node names
([expert-lsp#323](expert-lsp#323))
([7591304](expert-lsp@7591304))
* start projects after server is initialized
([expert-lsp#294](expert-lsp#294))
([76d6cd5](expert-lsp@76d6cd5))
* stop sending genlsp datastructures to engine
([expert-lsp#31](expert-lsp#31))
([43d406f](expert-lsp@43d406f))
* support Fish shell's space-separated PATH format
([expert-lsp#172](expert-lsp#172))
([9803293](expert-lsp@9803293))
* support mise et al on windows
([expert-lsp#304](expert-lsp#304))
([3cc343f](expert-lsp@3cc343f))
* support Nushell for PATH detection
([expert-lsp#272](expert-lsp#272))
([8a9fd3d](expert-lsp@8a9fd3d))
* trim any quotes wrapping PATH when elixir is managed by mise
([expert-lsp#82](expert-lsp#82))
([d828966](expert-lsp@d828966))
* trim PATH returned by shell
([expert-lsp#213](expert-lsp#213))
([735199d](expert-lsp@735199d))
* update document store on didchange even without the engine running
([expert-lsp#326](expert-lsp#326))
([c80b72d](expert-lsp@c80b72d))
* update gen_lsp to 0.11.3
([expert-lsp#315](expert-lsp#315))
([13cfee6](expert-lsp@13cfee6)),
closes [expert-lsp#245](expert-lsp#245)
* update spitfire to v0.3.4
([expert-lsp#373](expert-lsp#373))
([6f57f16](expert-lsp@6f57f16))
* update spitfire to v0.3.5
([expert-lsp#376](expert-lsp#376))
([85822fe](expert-lsp@85822fe))
* use Calendar.UTCOnlyTimeZoneDatabase instead of project configured tz
database ([expert-lsp#324](expert-lsp#324))
([9e913f6](expert-lsp@9e913f6))
* use correct build directory when namespacing expert
([b6540dd](expert-lsp@b6540dd))
* use dynamic registrations and start project node asynchronously
([expert-lsp#30](expert-lsp#30))
([e1ce165](expert-lsp@e1ce165))
* use minimal PATH on unix instead of fully removing it
([expert-lsp#305](expert-lsp#305))
([74da1a5](expert-lsp@74da1a5))
* use project directory when building engine
([expert-lsp#203](expert-lsp#203))
([c5ac441](expert-lsp@c5ac441))
* utf8_prefix should take into account empty lines
([expert-lsp#164](expert-lsp#164))
([16c21e0](expert-lsp@16c21e0))

* release as 0.1.0
([7625d3c](expert-lsp@7625d3c))
* release as 0.1.0-rc.0
([c98b870](expert-lsp@c98b870))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants