W0 exists to keep the repository deterministic and reviewable before kernel work scales. Every local setup should run the same commands, use the same tool versions, and hit the same guardrails.
mise install
mise run install
mise run sourcemap
mise run testmise run format
mise run lint
mise run test # Full regression suite W2-W8 (see docs/test-strategy-v2.md)
mise run serveRun mise run sourcemap again whenever the Rojo tree changes.
The extension cannot find the rojo binary if it is only installed via mise (not on PATH for the GUI app).
- Workspace settings (
.vscode/settings.json) setluau-lsp.sourcemap.autogenerateto false so the LSP does not spawn Rojo itself. - Generate the map with the same toolchain as the repo:
mise run sourcemap(writessourcemap.json; gitignored). - Reload the window (
Developer: Reload Window) or restart the Luau language server.
default.project.json mounts src/shared under both ReplicatedStorage.Shared and StarterPlayer.StarterPlayerScripts.Shared so client require(script.Parent.Parent.Parent.Shared...) matches the DataModel. Require-able gameplay modules should stay on plain .luau; reserve .server.luau / .client.luau for actual bootstrap scripts so Rojo and Luau LSP agree on instance class.
| Tier | When to Run | Coverage |
|---|---|---|
smoke |
Every commit | Repo structure, tooling, naming |
unit |
Every PR | Pure rules + service adapters |
simulation |
PR-029+ | Full chain: matchmaking → dungeon → boss |
release-candidate |
PR-031+ | Full regression + staging playtest |
See docs/test-strategy-v2.md for full coverage map.
The repo ships with:
.vscode/settings.jsonfor Luau formatting on save.vscode/extensions.jsonfor the minimum recommended extensions
In Studio, enable the Luau LSP Companion plugin before relying on intellisense.
- Keep changes patch-sized.
- One subsystem per branch or PR.
- Do not mix repo OS work with gameplay design changes.
- Record validation and rollback notes in the PR description.
Use the task and PR templates in:
| Type | Pattern | Example |
|---|---|---|
| Server bootstrap | Something.server.luau |
Bootstrap.server.luau |
| Server module/service | Something.luau |
CombatService.luau |
| Client bootstrap | Something.client.luau |
ClientBootstrap.client.luau |
| Client module/controller | Something.luau |
MovementController.luau |
| Shared config | SomethingConfig.luau |
CombatConfig.luau |
| Shared types | SomethingTypes.luau |
MovementTypes.luau |
| Tests | *.spec.luau or repo smoke scripts in tests/ |
Parry.spec.luau |
Rojo maps filesystem modules into the DataModel. sourcemap.json exists only to
help tooling and should stay generated, not hand-edited.
Examples:
src/shared/Types/init.luau -> ReplicatedStorage.Shared.Types.init
src/server/Services/CombatService.luau -> ServerScriptService.Server.Services.CombatService
- Run
mise run sourcemap. - Reload the editor window.
- Confirm Luau LSP Companion is enabled in Studio.
- Run
mise run serve. - Confirm
default.project.jsonstill matches the folder tree. - Reconnect Studio to Rojo.
The repo now ships with a Studio-only harness:
Default behavior:
- no-op outside Studio
- no-op in Studio unless
GameConfig.debug.devHarness.autoRunInStudio = true
Manual run from the Server command bar while playing in Studio:
local results = require(game.ServerScriptService.Server.DevHarness).runAll()
print(results)This harness can spawn two anchored dummy rigs in Workspace.HCLW_DevHarness, run a combat smoke, a dungeon smoke, and a boss smoke, then print/TestService-log a summary.
Studio now has an assetless placeholder pipeline so combat can be played before real art/animation imports:
- ClientBootstrap.client.luau
- PlaytestSceneService.luau
- ProceduralCombatPresentation.luau
- StudioDevPanel.luau
What it provides:
- graybox combat room
- graybox boss room
- placeholder sword template (
ReplicatedStorage.SwordOfLight) - targetable dummy enemies
- free-spawn dummy types:
neutral,attack,auto_parry,auto_block,auto_dodge,mixed - procedural slash / parry / dodge feedback
- combat debug HUD with posture / tag / outcome / target state
- nearest-target auto-lock for attack inputs
In Studio play mode:
- press
F8to toggle the Studio dev panel - press
F7to toggle the combat debug HUD - press
Gto toggle the movement debug panel
Server command bar alternatives:
require(game.ServerScriptService.Server.PlaytestSceneService).spawnTestScene()
require(game.ServerScriptService.Server.PlaytestSceneService).spawnCombatScene()
require(game.ServerScriptService.Server.PlaytestSceneService).spawnBossScene()
require(game.ServerScriptService.Server.PlaytestSceneService).spawnDummy("auto_parry", 1)
require(game.ServerScriptService.Server.PlaytestSceneService).runHarness()- Run
mise run format. - Run
mise run lint. - Run
mise run test. - Fix repo OS issues before touching gameplay logic.