Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions docs/architecture/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ sidebar_position: 2

# Nevermore design principles

Nevermore consists of a few hundred packages in a [mono-repo](https://en.wikipedia.org/wiki/Monorepo). These packages are [semantically versioned](https://semver.org/) such that long-term maintaince can be done. Nevermore it trying to provide utility modules, and is not a framework.
Nevermore consists of a few hundred packages in a [mono-repo](https://en.wikipedia.org/wiki/Monorepo). These packages are [semantically versioned](https://semver.org/) such that long-term maintenance can be done. Nevermore is trying to provide utility modules, and is not a framework.

* **Lego blocks** - Nevermore provides utility modules that can combined in a variety of ways
* **Lego blocks** - Nevermore provides utility modules that can be combined in a variety of ways
* **Not a framework** - Nevermore works in a variety of other architectures
* **Versioned** - Nevermore should be versioned. Nevermore should not break games when changes are made.
* **Fast development** - Nevermore should accelerate game development
Expand Down Expand Up @@ -35,7 +35,7 @@ Library packages tend to be packages that export one or multiple libraries. Thes
* [Elo](/api/EloUtils)

### Object utility libraries
These are very similiar to libraries but they tend to export an object, and some supporting objects. These objects are concepts that are useful to learn, and generally exist outside of Roblox (although they may not). These are fundamental building blocks and patterns in Roblox.
These are very similar to libraries but they tend to export an object, and some supporting objects. These objects are concepts that are useful to learn, and generally exist outside of Roblox (although they may not). These are fundamental building blocks and patterns in Roblox.

* [Octree](/api/Octree)
* [Maid](/api/Maid)
Expand All @@ -45,7 +45,7 @@ These are very similiar to libraries but they tend to export an object, and some
* [Queue](/api/Queue)

### Integration services
There services are primary about providing a contract between two services.
These services are primarily about providing a contract between two services.

* [GameConfigService](/api/GameConfigService)
* [CameraStackService](/api/CameraStackService)
Expand All @@ -63,7 +63,7 @@ opinionated about...
2. Consumption of code (plugin, game, et cetera)

Code is designed to be copied and pasted as needed, but first and foremost, is designed to empower James's (Quenty's) workflow. For this reason, while Nevermore tries its best to be useful
to as wide of an audience as possible, in many ways document and design notes are lacking because this is not its first purpose.
to as wide of an audience as possible, in many ways documentation and design notes are lacking because this is not its first purpose.


## Loading system
Expand Down
10 changes: 5 additions & 5 deletions docs/architecture/servicebag.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Services in Nevermore use [ServiceBag](/api/ServiceBag/) and need to be
required through them. ServiceBag provides services and helps with game or
plugin initialization, and is like a `game` in Roblox. You can retrieve
services from it, and it will ensure the service exists and is initialized.
This will bootstrap any other dependent dependencies.
This will bootstrap any other dependencies.

## tl;dr

Expand Down Expand Up @@ -107,7 +107,7 @@ serviceBag:Start()
:::warning
An important detail of ServiceBag is that it does not allow your services to
yield in the `:Init()` methods. This is to prevent a service from delaying your
entires game start. If you need to yield, do work in `:Start()` or export your
entire game start. If you need to yield, do work in `:Start()` or export your
API calls as promises. See [Cmdr](/api/CmdrService/) for a good example of how
this works.
:::
Expand Down Expand Up @@ -205,7 +205,7 @@ end

## Extras

### Why is understanding ServiceBag is important?
### Why is understanding ServiceBag important?

Nevermore tries to be a collection of libraries that can be plugged together,
and not exist as a set framework that forces specific design decisions. While
Expand Down Expand Up @@ -244,7 +244,7 @@ and dependency injection system is a really good idea.
### What ServiceBag tries to achieve

ServiceBag does service dependency injection and initialization. These words
may be unfamiliar with you. Dependency injection is the process of retrieving
may be unfamiliar to you. Dependency injection is the process of retrieving
dependencies instead of constructing them in an object. Lifecycle management is
the process of managing the life of services, which often includes the game.

Expand Down Expand Up @@ -374,6 +374,6 @@ local function getAnyModule(module)
end
```

It's preferably your systems interop with ServiceBag directly as ServiceBag
It's preferable that your systems interop with ServiceBag directly as ServiceBag
provides more control, better testability, and more clarity on where things are
coming from.
4 changes: 2 additions & 2 deletions docs/build.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ In general you want to install the following by hand.
2. [Git](https://git-scm.com/downloads)
3. [Aftman](https://github.com/LPGhatguy/aftman)

After than you will want to clone Nevermore to a folder.
After that you will want to clone Nevermore to a folder.

```bash
git clone https://github.com/Quenty/NevermoreEngine.git
Expand All @@ -86,4 +86,4 @@ pnpm install
You can then serve a test place

## Why does building need a custom version of Rojo?
Nevermore does not need a custom version of Rojo to be consumed, but it does need one to be built. This custom version of Rojo understands symlinks and turn them into ObjectValues. These symlinks link the packages together and means that a change to a transient dependency, or direct dependency will immediately be shown in the upstream package.
Nevermore does not need a custom version of Rojo to be consumed, but it does need one to be built. This custom version of Rojo understands symlinks and turn them into ObjectValues. These symlinks link the packages together and means that a change to a transitive dependency, or direct dependency will immediately be shown in the upstream package.
4 changes: 2 additions & 2 deletions docs/ides/vscode.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ sidebar_position: 1

# Getting started with VSCode

VSCode works with Nevermore relatively easily. We have default extensions.json setup. Follow the general setup tips. These types should generally work for Cursor and other VS-Code based IDEs.
VSCode works with Nevermore relatively easily. We have default extensions.json setup. Follow the general setup tips. These tips should generally work for Cursor and other VS-Code based IDEs.

## Extensions

Expand All @@ -22,7 +22,7 @@ These will provide snippets, styling, and linking.

You currently must use the forked version of luau-lsp. You can use the default extension.

in `settings.json` configure the luau-lsp server to point towards a custom exe path. This should be your Luau-lsp exe path installed via aftman.toml.
In `settings.json`, configure the luau-lsp server to point towards a custom exe path. This should be your Luau-lsp exe path installed via aftman.toml.

```json
"luau-lsp.server.path": "<path-to-aftman>/tool-storage/quenty/luau-lsp/<version>/luau-lsp.exe",
Expand Down
4 changes: 2 additions & 2 deletions docs/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ npm install -g @quenty/nevermore-cli
This will install the current version of Maid and all dependencies into the `node_modules` folder. To upgrade you will want to run `npm upgrade` You should ignore the `node_modules` folder in your source control system.

### What is NPM and why are we using it?
[npm](https://www.npmjs.com/) is a package manager. Nevermore uses npm to manage package versions and install transient dependencies. A transient dependency is a dependency of a dependency (for example, [Blend](/api/Blend) depends upon [Maid](/api/Maid).
[npm](https://www.npmjs.com/) is a package manager. Nevermore uses npm to manage package versions and install transitive dependencies. A transitive dependency is a dependency of a dependency (for example, [Blend](/api/Blend) depends upon [Maid](/api/Maid)).

### How do I install additional packages?
The default installation comes with very few packages. This is normal. You can see which packages are installed by looking at the `package.json` file in a text editor. To install additional packages, simply run the following command in a terminal:
Expand Down Expand Up @@ -135,7 +135,7 @@ local require = require(loader).bootstrapGame(loader.Parent)
Assuming you've changed nothing, the path to the replicated modules should be the same as the one used on the server, just indexed under ReplicatedStorage instead.

## Manually installing via NPM for a stand-alone module.
If you want to use Nevermore for more stand-alone or reusable scenarios (where you can't assume that a packages folder will be reused, you can manually bootstrap the components using the loader system.
If you want to use Nevermore for more stand-alone or reusable scenarios (where you can't assume that a packages folder will be reused), you can manually bootstrap the components using the loader system.

Ensure that you have [Node.js](https://nodejs.org/en/download/) v14+ installed on your computer.

Expand Down
2 changes: 1 addition & 1 deletion docs/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Nevermore has had significant cultural impact. There are some packages this repo
* [DataStore](/api/DataStore) - Battle-tested datastore wrapper
* [Camera](/api/CameraStackService) - Layered camera system that interops with Roblox's cameras

## Nevermore can by used in many cases
## Nevermore can be used in many cases
While Nevermore was originally designed to make games, in general Nevermore is now a collection of utility libraries that can be used in the following. These use cases have been carefully battle tested. Nevermore is in many top games, gamejams, plugins, and other components across Roblox.

* **Top Games** - Both built originally with Nevermore, or games that use other systems and frameworks but may want to include Nevermore
Expand Down
3 changes: 2 additions & 1 deletion docs/testing/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,4 +257,5 @@ For CI, set `ROBLOSECURITY` as a repository or Codespace secret. The `.github/wo
- **Workflows should be thin.** All logic lives in `nevermore-cli` commands — GitHub Actions workflows just call them. This keeps CI debuggable locally.
- **Rate limiting** is shared across concurrent workers via the `OpenCloudClient` instance. The `RateLimiter` serializes all Open Cloud API requests (one in-flight at a time) and reads `x-ratelimit-remaining` / `x-ratelimit-reset` headers.
- **Post results via CLI**: `nevermore tools post-test-results <file>` posts or updates a PR comment with test results and writes to the GitHub Actions job summary. Requires `GITHUB_TOKEN` for PR comments; job summaries are written automatically when `GITHUB_STEP_SUMMARY` is set.
- **Job summaries**: Results are automatically written to the [GitHub Actions job summary](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-commands#adding-a-job-summary) when running in CI. This makes results visible on the workflow run summary page, complementing the PR comment.
- **Live comment updates during the run**: When `nevermore batch test` detects a CI environment, it also updates the PR comment as packages transition between phases (throttled to ~10s). The `post-test-results` step still writes the final snapshot, but reviewers see progress without waiting for the full run to finish. In `--aggregated` mode every package shares one execution, so they move through `uploading` → `scheduling` → `executing` in lock-step — that's expected, not a bug.
- **Job summaries**: Results are automatically written to the [GitHub Actions job summary](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-commands#adding-a-job-summary) when running in CI. This makes results visible on the workflow run summary page, complementing the PR comment. The job summary is only written by `post-test-results` (not by the live batch run) to avoid duplicate entries on the workflow summary page.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"build:sourcemap": "rojo sourcemap default.project.json --output sourcemap.json --absolute && npx @quenty/nevermore-cli tools strip-sourcemap-jest",
"build:ts": "pnpm -r --filter './tools/**' --filter '!./tools/nevermore-vscode' run build",
"format": "stylua --config-path=stylua.toml src games plugins",
"format:ts": "prettier --ignore-path .gitignore --write 'tools/**/*.{ts,tsx,js,jsx}'",
"format:ts": "prettier --ignore-path .gitignore --write \"tools/**/*.{ts,tsx,js,jsx}\"",
"lint:luau": "luau-lsp analyze --sourcemap=sourcemap.json --base-luaurc=.luaurc --defs=globalTypes.d.lua --flag:LuauSolverV2=false --ignore=**/node_modules/** --ignore=**/*.story.lua --ignore=**/*.client.lua --ignore=**/*.server.lua src",
"lint:moonwave": "npx lerna exec --parallel -- moonwave-extractor extract src",
"lint:prettier": "prettier --ignore-path .gitignore --check 'tools/**/*.{ts,tsx,js,jsx}'",
Expand Down
15 changes: 15 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div align="center">
<h1>Nevermore</h1>
<p>
<a href="http://quenty.github.io/NevermoreEngine/">
<a href="https://quenty.github.io/NevermoreEngine/">
<img src="https://github.com/Quenty/NevermoreEngine/actions/workflows/docs.yml/badge.svg" alt="Documentation status" />
</a>
<a href="https://discord.gg/mhtGUS8">
Expand Down
2 changes: 1 addition & 1 deletion src/blend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ npm install @quenty/blend --save

## Attributes

This system is designed to be very similar to fusion, except that we do not having any global state management, do not rely upon weak references, works with my types, and is built on top of Rx types.
This system is designed to be very similar to fusion, except that we do not have any global state management, do not rely upon weak references, works with my types, and is built on top of Rx types.

* No global state
* Extensible
Expand Down
2 changes: 1 addition & 1 deletion src/brine/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
</a>
</div>

Fast and efficient extensible serialiation and deserialization library for Roblox with native instance support out of the box
Fast and efficient extensible serialization and deserialization library for Roblox with native instance support out of the box

<div align="center"><a href="https://quenty.github.io/NevermoreEngine/api/BrineUtils">View docs →</a></div>

Expand Down
10 changes: 10 additions & 0 deletions src/brine/deploy.nevermore.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"targets": {
"test": {
"universeId": 9716264427,
"placeId": 115317112879009,
"project": "test/default.project.json",
"scriptTemplate": "test/scripts/Server/ServerMain.server.lua"
}
}
}
5 changes: 5 additions & 0 deletions src/brine/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,20 @@
"Quenty"
],
"dependencies": {
"@quenty/baseobject": "workspace:*",
"@quenty/bufferencoder": "workspace:*",
"@quenty/instanceutils": "workspace:*",
"@quenty/loader": "workspace:*",
"@quenty/maid": "workspace:*",
"@quenty/memoize": "workspace:*",
"@quenty/nevermore-test-runner": "workspace:*",
"@quenty/rx": "workspace:*",
"@quenty/selectionutils": "workspace:*",
"@quenty/servicebag": "workspace:*",
"@quenty/steputils": "workspace:*",
"@quenty/string": "workspace:*",
"@quenty/symbol": "workspace:*",
"@quenty/table": "workspace:*",
"@quenty/viewport": "workspace:*",
"@quentystudios/jest-lua": "3.10.0-quenty.2"
},
Expand Down
Loading
Loading