Conversation
328d567 to
63af087
Compare
be99c6d to
96a16cd
Compare
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.
2c69620 to
c0c879a
Compare
mhanberg
left a comment
There was a problem hiding this comment.
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"
a423e25 to
90ab70a
Compare
|
@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 |
13a9a77 to
d6279f4
Compare
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. |
|
expert/apps/expert/lib/expert/configuration.ex Lines 42 to 45 in 1a6a12e This seemed foreboding and worthy of mention |
|
@doorgan lets get this rebased and then address Cameron's comments, probably time to merge if it seems stable to you. |
ae1d3eb to
685b0d4
Compare
|
This isn't stable anymore for me but I can't pinpoint why. I started getting these errors after a computer restart: 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. |
This comment was stale, so I removed it |
685b0d4 to
e0688f4
Compare
|
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.
4a63a91 to
ba93e9a
Compare
|
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 |
#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.
🤖 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>
🤖 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<->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>
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.exsfile 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
aandbin the same root folderfoo, and you start Expert on the root folder, then the manager node will be named after the first project node that is started. Runningepmd -namesshows this:project-a-entropyproject-b-entropymanager-a-entropyI htink having the manager be named
manager-foo-entropysounds more correct.To test this branch you can clone this repo: https://github.com/doorgan/monorepo_test
Then check on files from both
mainandsecondarythat:Additionally you can also test that Lexical works on
.exsor.exfiles in a workspace without amix.exsfile.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