{"id":"mrkirdid/kore","name":"kore","scope":"mrkirdid","platform":"roblox","description":"A game framework with various utilities","version":"0.1.13","latest":"0.1.13","versions":["0.1.6","0.1.7","0.1.8","0.1.9","0.1.10","0.1.11","0.1.12","0.1.13"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{"elttob/fusion":{"version":"^0.2.0","alias":"Fusion"},"howmanysmall/janitor":{"version":"^1.15.1","alias":"Janitor"},"evaera/promise":{"version":"^4.0.0","alias":"Promise"},"sleitnick/signal":{"version":"^2.0.3","alias":"Signal"},"lm-loleris/profilestore":{"version":"^1.0.3","alias":"ProfileStore"}},"integrity":"50b2ebcbc75f946f5cff42aa3727f14e4f66800ac194d23f863dc0b9be95b588","likes":0,"downloads":0,"install":"forest install mrkirdid/kore","url":"https://forest.dev/p/roblox/mrkirdid/kore","files":"https://api.forest.dev/ai/package/roblox/mrkirdid/kore/files","readme":"# Kore\r\n\r\nA professional Roblox Luau game framework. Structured service/controller loader for all server and client scripts, with built-in typed dynamic networking, lifecycle management, multithreading support, and a comprehensive suite of QOL utilities.\r\n\r\n## Installation\r\n\r\n### Wally\r\n```toml\r\n[dependencies]\r\nKore = \"mrkirdid/kore@0.1.6\"\r\n```\r\n\r\nThe package now exposes a standard Wally entrypoint at `init.luau`, so consumers can require it directly from their linked package alias:\r\n\r\n```lua\r\nlocal Packages = game:GetService(\"ReplicatedStorage\"):WaitForChild(\"Packages\")\r\nlocal Kore = require(Packages.Kore)\r\n```\r\n\r\n### Rojo\r\nThis repository still keeps `default.project.json` for local development, but it is not part of the published Wally package.\r\n\r\n## Quick Start\r\n\r\n### Server (KoreServer.server.luau)\r\n```lua\r\nlocal Packages = game:GetService(\"ReplicatedStorage\"):WaitForChild(\"Packages\")\r\nlocal Kore = require(Packages.Kore)\r\n\r\nKore.Start():andThen(function()\r\n  print(\"Server started!\")\r\nend)\r\n```\r\n\r\n### Client (KoreClient.client.luau)\r\n```lua\r\nlocal Packages = game:GetService(\"ReplicatedStorage\"):WaitForChild(\"Packages\")\r\nlocal Kore = require(Packages.Kore)\r\n\r\nKore.Start():andThen(function()\r\n  print(\"Client started!\")\r\nend)\r\n```\r\n\r\n### Defining a Service\r\n```lua\r\n-- src/server/services/MyService.luau\r\nlocal Packages = game:GetService(\"ReplicatedStorage\"):WaitForChild(\"Packages\")\r\nlocal Kore = require(Packages.Kore)\r\n\r\nreturn {\r\n  Name = \"MyService\",\r\n\r\n  Client = {\r\n    GetData = function(self, player, id)\r\n      return { id = id, value = 42 }\r\n    end,\r\n\r\n    DataUpdated = Kore.NetEvent,\r\n  },\r\n\r\n  Init = function(self, ctx)\r\n    ctx.Log.Info(\"Initializing!\")\r\n  end,\r\n\r\n  Start = function(self, ctx)\r\n    ctx.Log.Info(\"Started!\")\r\n  end,\r\n}\r\n```\r\n\r\n### Defining a Controller\r\n```lua\r\n-- src/client/controllers/MyController.luau\r\nreturn {\r\n  Name = \"MyController\",\r\n  Dependencies = { \"MyService\" },\r\n\r\n  Init = function(self, ctx)\r\n  end,\r\n\r\n  Start = function(self, ctx)\r\n    local MyService = ctx.Kore.GetService(\"MyService\")\r\n    MyService.GetData(1):andThen(function(data)\r\n      print(data)\r\n    end)\r\n  end,\r\n}\r\n```\r\n\r\n## Modules\r\n\r\n| Module | Description |\r\n|--------|-------------|\r\n| `Kore.Promise` | Promise/A+ (evaera/promise) |\r\n| `Kore.Signal` | Lightweight signal with optional networking |\r\n| `Kore.Log` | Structured tagged logger |\r\n| `Kore.Timer` | Debounce, Throttle, Delay, Every |\r\n| `Kore.Symbol` | Unique opaque sentinel values |\r\n| `Kore.Util.Table` | Table manipulation utilities |\r\n| `Kore.Util.String` | String manipulation utilities |\r\n| `Kore.Util.Math` | Math utilities |\r\n| `Kore.Tween` | Builder pattern tween with Promise |\r\n| `Kore.Curve` | Keyframe curve sampler |\r\n| `Kore.Data` | ProfileStore bridge |\r\n| `Kore.Thread` | Weave parallel execution wrapper |\r\n| `Kore.Mock` | Test isolation (TestEZ/Hoarcekat) |\r\n| `Kore.Janitor` | Cleanup management |\r\n| `Kore.Fusion` | Re-export of Fusion |\r\n| `Kore.Net` | Networking internals |\r\n\r\n## VS Code Extension\r\n\r\nThe companion extension provides:\r\n- Autocomplete for `Kore.GetService()` and `Kore.GetController()`\r\n- Automatic type generation (`Types.luau`)\r\n- Service/Controller snippets\r\n- Diagnostics (name mismatches, unknown deps, duplicates)\r\n- Hover documentation\r\n\r\nSee `extension/README.md` for details.\r\n\r\n### Kore.toml\r\n\r\nThe extension reads its project config from `Kore.toml` in the workspace root. If the file is missing, Kore-specific extension features stay disabled until you run `Kore: Init Project (Create Kore.toml)`.\r\n\r\n`Kore.toml` supports three sections:\r\n\r\n```toml\r\n[paths]\r\nservices = \"src/server/services\"\r\ncontrollers = \"src/client/controllers\"\r\ntypes = \"src/shared/Kore/Types.luau\"\r\nshared = \"src/shared\"\r\n\r\n[require]\r\nkore = \"game.ReplicatedStorage.Shared.Packages.kore\"\r\n# types = \"game.ReplicatedStorage.Shared.Packages.kore.Types\"\r\n\r\n[options]\r\nautoTemplate = true\r\ndiagnostics = true\r\nsnippets = true\r\ngenerateTypes = true\r\nprefix = \"!\"\r\ndebug = false\r\n```\r\n\r\nOmitted keys fall back to the extension defaults. The file name is case-sensitive on the extension side: use `Kore.toml` in the workspace root.\r\n\r\n> **Note:** Each key must be under the correct section header (`[paths]`, `[require]`, `[options]`). The extension will still pick up option keys placed under the wrong section, but it will log a warning telling you to move them.\r\n\r\n#### `[paths]`\r\n\r\n| Key | Default | Description |\r\n|-----|---------|-------------|\r\n| `services` | `src/server/services` | Conventional services directory. Used for service discovery, watcher setup, and auto-templating when new service files are created there. |\r\n| `controllers` | `src/client/controllers` | Conventional controllers directory. Used for controller discovery, watcher setup, and auto-templating for new controller files. |\r\n| `types` | `src/shared/Kore/Types.luau` | Output file written by the extension when type generation is enabled. |\r\n| `shared` | `src/shared` | Shared-code root used for module indexing and require completions. |\r\n\r\nNotes:\r\n- Paths are relative to the workspace root.\r\n- The extension also performs a global `.luau` scan, so services and controllers outside the configured folders can still be detected by content. The configured `services` and `controllers` paths still matter for templates and the fast-path watchers.\r\n\r\n#### `[require]`\r\n\r\n| Key | Default | Description |\r\n|-----|---------|-------------|\r\n| `kore` | `game.ReplicatedStorage.Shared.Packages.kore` | Luau require expression used when the extension inserts `local Kore = require(...)` into generated snippets and templates. |\r\n| `types` | empty | Optional explicit require expression for the generated `Types` module. If omitted, the extension derives it from `require.kore`. |\r\n\r\n`require.kore` supports both styles:\r\n\r\n```toml\r\n[require]\r\nkore = \"game.ReplicatedStorage.Packages.Kore\"\r\n```\r\n\r\n```toml\r\n[require]\r\nkore = \"@Packages/Kore\"\r\n```\r\n\r\nIf `require.types` is omitted, the extension derives it like this:\r\n- `game.ReplicatedStorage.Packages.Kore` -> `game.ReplicatedStorage.Packages.Kore.Types`\r\n- `@Packages/Kore` -> `\"@Packages/Kore/Types\"`\r\n\r\nSet `require.types` explicitly if your types module lives somewhere else.\r\n\r\n#### `[options]`\r\n\r\n| Key | Default | Description |\r\n|-----|---------|-------------|\r\n| `autoTemplate` | `true` | Automatically fills new empty `.luau` files created inside the configured services/controllers folders with Kore service or controller boilerplate. |\r\n| `diagnostics` | `true` | Enables Kore-specific diagnostics such as name mismatches, duplicate definitions, and unknown dependencies. |\r\n| `snippets` | `true` | Enables Kore snippets and prefix-based quick insert commands such as service/controller presets. |\r\n| `generateTypes` | `true` | Regenerates `Types.luau` when services or controllers change and writes the initial types file during activation. |\r\n| `prefix` | `!` | Trigger prefix for quick completion commands such as `!getservice`, `!getcontroller`, `!service`, `!controller`, `!preset`, `!kore`, and `!require`. |\r\n| `debug` | `false` | Enables verbose logging in the Kore output channel. |\r\n\r\n#### Example for this repo layout\r\n\r\nFor a standard Rojo-style project with shared Kore code in `src/shared`, this is a reasonable starting point:\r\n\r\n```toml\r\n[paths]\r\nservices = \"src/server/services\"\r\ncontrollers = \"src/client/controllers\"\r\ntypes = \"src/shared/Kore/Types.luau\"\r\nshared = \"src/shared\"\r\n\r\n[require]\r\nkore = \"game.ReplicatedStorage.Shared.Packages.kore\"\r\n\r\n[options]\r\nautoTemplate = true\r\ndiagnostics = true\r\nsnippets = true\r\ngenerateTypes = true\r\nprefix = \"!\"\r\ndebug = false\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n","readmeTruncated":false}