Skip to content

feat: workspace folders#18

Merged
doorgan merged 39 commits intomainfrom
doorgan/multiroot_support
Jan 8, 2026
Merged

feat: workspace folders#18
doorgan merged 39 commits intomainfrom
doorgan/multiroot_support

Conversation

@doorgan
Copy link
Collaborator

@doorgan doorgan commented May 28, 2025

This adds support for multiple projects within the server node, and starts a project node for each detected project within the workspace. The detection implemented here is just using the presence of a mix.exs file to assume it's a project root.

It also changes the manager node to use the name of the workspace folder instead of the name of the first project that starts distribution. The reason is that if you have projects a and b in the same root folder foo, and you start Expert on the root folder, then the manager node will be named after the first project node that is started. Running epmd -names shows this:

  • project-a-entropy
  • project-b-entropy
  • manager-a-entropy

I htink having the manager be named manager-foo-entropy sounds more correct.

To test this branch you can clone this repo: https://github.com/doorgan/monorepo_test
Then check on files from both main and secondary that:

  • Completions work
  • Go to definition and workspace symbols work
  • Code actions (like Refactorex refactors) work
  • Instructing the LSP to reindex everything runs the indexer on all projects

Additionally you can also test that Lexical works on .exs or .ex files in a workspace without a mix.exs file.

It is worth noting that this should be tested with VS Code using the Lexical LSP extension and pointing it to an expert release using this branch, or some other editor (like emacs) that doesn't automatically start a new Expert server(ie something other than Neovim)

Closes #136

@doorgan doorgan force-pushed the doorgan/multiroot_support branch 2 times, most recently from 328d567 to 63af087 Compare May 28, 2025 19:22
@doorgan doorgan force-pushed the doorgan/multiroot_support branch from be99c6d to 96a16cd Compare June 20, 2025 22:56
doorgan added 5 commits June 23, 2025 15:50
This adds support for multiple projects within the server node,
and starts a project node for each detected project within the
workspace.

It also changes the manager node to use the name of the workspace
folder instead of the name of the first project that starts
distribution.
@doorgan doorgan force-pushed the doorgan/multiroot_support branch from 2c69620 to c0c879a Compare June 23, 2025 18:57
@doorgan doorgan changed the title Support multiple root projects feat: support multiple root projects Jul 4, 2025
Copy link
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.

Are you able to add tests that validate adding and removing workspace folders?

Otherwise looks good, just change the PR title to say "feat: workspace folders"

@doorgan doorgan changed the title feat: support multiple root projects feat: workspace folders Jul 9, 2025
@doorgan doorgan force-pushed the doorgan/multiroot_support branch from a423e25 to 90ab70a Compare July 9, 2025 20:50
@doorgan
Copy link
Collaborator Author

doorgan commented Jul 9, 2025

@mhanberg using GenLSP test helpers sometimes exunit will not terminate after running all tests(or sometimes it will run only a subset of the new tests), do you know if this may be related to the GenLSP helpers? Other tests that start project nodes like apps/expert/test/expert/engine_node_test.exs don't have this problem, so it seems unlikely the project node is what's causing this

@doorgan doorgan force-pushed the doorgan/multiroot_support branch from 13a9a77 to d6279f4 Compare July 9, 2025 21:17
@mhanberg
Copy link
Member

mhanberg commented Jul 9, 2025

@mhanberg using GenLSP test helpers sometimes exunit will not terminate after running all tests(or sometimes it will run only a subset of the new tests), do you know if this may be related to the GenLSP helpers? Other tests that start project nodes like apps/expert/test/expert/engine_node_test.exs don't have this problem, so it seems unlikely the project node is what's causing this

Not that I know of, but I'll pull it down and see what happens.

@mhanberg
Copy link
Member

@mhanberg using GenLSP test helpers sometimes exunit will not terminate after running all tests(or sometimes it will run only a subset of the new tests), do you know if this may be related to the GenLSP helpers? Other tests that start project nodes like apps/expert/test/expert/engine_node_test.exs don't have this problem, so it seems unlikely the project node is what's causing this

Not that I know of, but I'll pull it down and see what happens.

Sorry about the wait, but I pulled this down. The tests seem to just run as normal, except for one test failing of a code error.

@Moosieus
Copy link
Collaborator

defp set(%__MODULE__{} = config) do
# FIXME(mhanberg): I don't think this will work once we have workspace support
:persistent_term.put(__MODULE__, config)
end

This seemed foreboding and worthy of mention

@mhanberg
Copy link
Member

@doorgan lets get this rebased and then address Cameron's comments, probably time to merge if it seems stable to you.

@doorgan doorgan force-pushed the doorgan/multiroot_support branch 3 times, most recently from ae1d3eb to 685b0d4 Compare December 19, 2025 16:46
@doorgan
Copy link
Collaborator Author

doorgan commented Dec 19, 2025

This isn't stable anymore for me but I can't pinpoint why. I started getting these errors after a computer restart:

14:07:49.480 [warning] 'global' at :"expert-project-main-55714@127.0.0.1" failed to connect to :"expert-project-secondary-17485@127.0.0.1"
secondary: 
14:07:49.480 [warning] 'global' at :"expert-project-secondary-17485@127.0.0.1" failed to connect to :"expert-project-main-55714@127.0.0.1"


14:07:49.481 [warning] 'global' at node :"expert-project-secondary-17485@127.0.0.1" requested disconnect from node :"expert-project-main-55714@127.0.0.1" in order to prevent overlapping partitions

Then it starts an endless loop of trying to start either project node and nothing works anymore. It still works if I'm on a single root project, the problem happens when there's more than 1 project node.

Also FWIW I don't think we want project nodes connecting to each other.

@doorgan
Copy link
Collaborator Author

doorgan commented Dec 19, 2025

defp set(%__MODULE__{} = config) do
# FIXME(mhanberg): I don't think this will work once we have workspace support
:persistent_term.put(__MODULE__, config)
end

This seemed foreboding and worthy of mention

This comment was stale, so I removed it

@doorgan doorgan force-pushed the doorgan/multiroot_support branch from 685b0d4 to e0688f4 Compare December 19, 2025 17:28
@mhanberg
Copy link
Member

I'll take a look.

this was preventing NodePortMapper from properly registering nodes,
causing disconnections and crashes when more than one engine node
was spawned.
@doorgan doorgan force-pushed the doorgan/multiroot_support branch from 4a63a91 to ba93e9a Compare January 8, 2026 09:42
@doorgan
Copy link
Collaborator Author

doorgan commented Jan 8, 2026

I think I managed to fix the issue I was having. We were registering the nodes using the longname, but then trying to retrieve their ports using the shortname. Apparently it's not an issue with a single engine node because it's directly connected to the manager, but extra nodes makes :global try to fully connect the node mesh, then fails to find the port for the first engine node and kicks the second engine node from the mesh due to that failure to connect.

@doorgan doorgan merged commit 1204313 into main Jan 8, 2026
37 checks passed
@doorgan doorgan deleted the doorgan/multiroot_support branch January 8, 2026 12:53
doorgan added a commit that referenced this pull request Jan 10, 2026
#18 introduced an issue where progress is trying to be reported before
the server is initialized, which causes the client to report back an
error and stops the server from starting up properly in VSCode.

This fix ensures we start the projects only after the server is fully
initialized, and so the progress from those projects is reproted at the
right time.
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>
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](elixir-lang/expert@v0.1.0...v0.1.0-rc.0)
(2026-02-19)

* add CLI flag handling
([elixir-lang#185](elixir-lang#185))

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

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

* release as 0.1.0
([7625d3c](elixir-lang@7625d3c))
* release as 0.1.0-rc.0
([c98b870](elixir-lang@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

Development

Successfully merging this pull request may close these issues.

Workspace Folders

3 participants