ludic/examples/library
Orkuncakilkaya aca263642d feat(cli): install in one command, and call the CLI ludic
Getting started meant cloning the repository, bootstrapping a compiler and
learning a task runner called `x`. That is a contributor's workflow handed to
everyone who wants to try the language.

Installing is now one command:

    curl -fsSL https://workshopsoft.pages.workshopsoft.io/ludic/install.sh | sh

install.sh puts a complete toolchain — compiler, CLI, engine runtime, bundled
ludic.* packages, formatter, language server — in ~/.ludic and adds it to PATH.
Prebuilt artifacts are checksum-verified; where a platform has none, or the
release predates this layout, it bootstraps from the compiler's own IR seed with
clang. The docs site publishes the script beside the pages that quote it, so the
page and the script can never come from different releases.

`x` becomes `ludic`, and the surface splits by audience. A user of the language
sees `new`, `run`, `build`, `test`, `add`, `fmt`, `lsp`, `doctor`, `upgrade`;
`ludic new` scaffolds a project that builds and plays as it stands. Everything
the toolchain repo needs moved under `ludic dev` — build, test, reseed,
bootstrap-cfree, docs-gen, release — unchanged apart from the namespace. Those
tasks read arguments one position further along, so dispatch_dev sets a shift
and commands use arg_n()/arg_total() rather than each knowing its own depth.

Release artifacts become complete install roots (bin/ beside runtime/, packages/
and VERSION) rather than bare binaries, which is what the installer unpacks.
`ludic dev test` asserts the whole shape: it stages an install, puts it on PATH
with no LUDIC_HOME, and runs new -> build -> test through it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 22:01:52 +03:00
..
anim.ludic feat(stdlib): add Anim.* + Tween.* — deterministic 2D animation & tweening (#5) 2026-08-31 13:05:06 +03:00
anim_ecs.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
anim_sugar.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
arena.ludic chore(repo): DX cleanup — categorise examples, text-diffable golden, build/ output (#27 #28 #30) 2026-08-30 18:54:21 +03:00
atlas.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
audio.ludic feat(audio): Audio.* standard library over a native AVAudioPlayer backend (#22) 2026-08-31 17:52:31 +03:00
bignum.ludic feat(types): BigInt + Decimal exact economy numbers (#52) 2026-08-31 18:45:14 +03:00
camera_zoom.ludic feat(camera): #78 deterministic Camera.zoom (Q16.16 render-time zoom) 2026-09-02 06:55:37 +03:00
clear_color.ludic feat(render): #86 @ClearColor — Render phase auto-clears + auto-presents 2026-09-02 07:10:44 +03:00
combat.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
combat_kit.ludic feat(engine): #90 atlas-aware Sprite component, #91 become from listeners, 0.3.x ergonomics batch 2026-09-04 01:36:08 +03:00
component_access.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
containers.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
core_components.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
coverage.ludic feat(cli): install in one command, and call the CLI ludic 2026-09-05 22:01:52 +03:00
crypto.ludic feat(stdlib): finish Crypto (CSPRNG + base64) and add Uuid.* library (#19 #16) 2026-08-30 21:40:51 +03:00
cursor_capture.ludic feat(input): #89 cursor capture — Input.cursor_mode (hide/lock/confine) 2026-09-02 08:06:34 +03:00
errors.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
fs.ludic feat(stdlib): add Fs.* / Path.* / Mime.* — filesystem, paths, content types (#10) 2026-08-30 22:43:50 +03:00
gameplay_foundation.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
grid.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
http.ludic feat(http): Http.* poll-based HTTP/HTTPS client over a native NSURLConnection backend (#6) 2026-08-31 18:10:53 +03:00
input_actions.ludic feat(input): action maps + deterministic record/replay (#7) 2026-08-31 16:03:56 +03:00
input_auto.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
input_device.ludic feat(input): raw device layer — multi-key held state, analog, mouse, gamepad, touch, full-state replay (#50) 2026-08-31 17:14:24 +03:00
input_edge.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
input_manager.ludic feat(input): #83 Input Manager + auto-commit the device layer in the frame loop 2026-09-02 07:04:10 +03:00
input_movement.ludic feat(input,ecs): #79 Input.axis_i directional int + #84 world bounds 2026-09-02 07:44:41 +03:00
jobs.ludic feat(stdlib): Jobs, Promises & opt-in Sync concurrency (#14) 2026-09-01 03:32:31 +03:00
light_ecs.ludic feat(ecs): Light2D/Occluder/Ambient as auto-consumed components (#47) 2026-08-31 15:49:50 +03:00
light_tiers.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
lighting.ludic feat(rendering): add Light.* — deterministic 2D light accumulation with hard shadows (#4) 2026-08-31 14:07:19 +03:00
logging.ludic feat(stdlib): add Log.* — levelled, structured logging (#15) 2026-08-30 21:57:22 +03:00
managers.ludic feat(engine): #90 atlas-aware Sprite component, #91 become from listeners, 0.3.x ergonomics batch 2026-09-04 01:36:08 +03:00
namespace_block.ludic feat(lang): #76 namespace block form with export/internal visibility 2026-09-02 08:14:54 +03:00
noise.ludic feat(stdlib): add Noise.* — deterministic fixed-point procedural noise (#3) 2026-08-30 21:50:50 +03:00
numeric.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
optionresult.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
os.ludic feat(compiler): list literals, typed compound assignment, file:line diagnostics 2026-09-05 01:12:16 +03:00
physics.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
physics_tiles.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
pool.ludic feat(ecs): #80 entity-pool stats (Pool.live/free/reserved/capacity) 2026-09-02 08:23:58 +03:00
prefabs.ludic feat(engine): #90 atlas-aware Sprite component, #91 become from listeners, 0.3.x ergonomics batch 2026-09-04 01:36:08 +03:00
preload.ludic feat(assets): #82 incremental asset preloading + loading-scene pattern 2026-09-02 08:19:19 +03:00
query.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
recover.ludic feat(errors): recoverable failures as values — try/else over ok/err results (#46) 2026-08-31 15:04:14 +03:00
reflect.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
regex.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
render.ludic feat(rendering): add Screen.camera/clip/blend_mode/oval + Camera.* + Screen.pixel (#23) 2026-08-31 13:43:01 +03:00
scene_menus.ludic feat(engine): #90 atlas-aware Sprite component, #91 become from listeners, 0.3.x ergonomics batch 2026-09-04 01:36:08 +03:00
serialize.ludic feat(reflect): generic value tree + Reflect.serialize/apply + JSON bridge (#44) 2026-08-31 15:19:21 +03:00
sprite_atlas.ludic feat(engine): #90 atlas-aware Sprite component, #91 become from listeners, 0.3.x ergonomics batch 2026-09-04 01:36:08 +03:00
sprite_render.ludic feat(render): #85 engine sprite-render system + deprecate bare draw_sprite 2026-09-02 07:20:13 +03:00
testing.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
tiled_p0.ludic feat(stdlib): Tiled P0 — XML reader + base64 decode + gzip framing (#67) 2026-09-01 14:04:49 +03:00
tiled_p1.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
tiled_p2.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
tiled_p3.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
tiled_p4.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
tiled_p05.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
tiled_p5.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
tiled_p6.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
unicode.ludic feat(stdlib): add Unicode.* — UTF-8 code points, graphemes, case mapping (#13) 2026-08-30 22:29:00 +03:00
uuid.ludic feat(stdlib): finish Crypto (CSPRNG + base64) and add Uuid.* library (#19 #16) 2026-08-30 21:40:51 +03:00
world_bounds.ludic refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00