redscript-mc 1.2.30 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/.claude/commands/build-test.md +10 -0
  2. package/.claude/commands/deploy-demo.md +12 -0
  3. package/.claude/commands/stage-status.md +13 -0
  4. package/.claude/settings.json +12 -0
  5. package/.github/workflows/ci.yml +1 -0
  6. package/CLAUDE.md +231 -0
  7. package/demo.gif +0 -0
  8. package/dist/cli.js +2 -554
  9. package/dist/compile.js +2 -266
  10. package/dist/index.js +2 -159
  11. package/dist/lowering/index.js +5 -3
  12. package/dist/src/__tests__/cli.test.d.ts +1 -0
  13. package/dist/src/__tests__/cli.test.js +104 -0
  14. package/dist/src/__tests__/codegen.test.d.ts +1 -0
  15. package/dist/src/__tests__/codegen.test.js +152 -0
  16. package/dist/src/__tests__/compile-all.test.d.ts +10 -0
  17. package/dist/src/__tests__/compile-all.test.js +108 -0
  18. package/dist/src/__tests__/dce.test.d.ts +1 -0
  19. package/dist/src/__tests__/dce.test.js +102 -0
  20. package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
  21. package/dist/src/__tests__/diagnostics.test.js +177 -0
  22. package/dist/src/__tests__/e2e.test.d.ts +6 -0
  23. package/dist/src/__tests__/e2e.test.js +1789 -0
  24. package/dist/src/__tests__/entity-types.test.d.ts +1 -0
  25. package/dist/src/__tests__/entity-types.test.js +203 -0
  26. package/dist/src/__tests__/formatter.test.d.ts +1 -0
  27. package/dist/src/__tests__/formatter.test.js +40 -0
  28. package/dist/src/__tests__/lexer.test.d.ts +1 -0
  29. package/dist/src/__tests__/lexer.test.js +343 -0
  30. package/dist/src/__tests__/lowering.test.d.ts +1 -0
  31. package/dist/src/__tests__/lowering.test.js +1015 -0
  32. package/dist/src/__tests__/macro.test.d.ts +8 -0
  33. package/dist/src/__tests__/macro.test.js +306 -0
  34. package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
  35. package/dist/src/__tests__/mc-integration.test.js +817 -0
  36. package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
  37. package/dist/src/__tests__/mc-syntax.test.js +124 -0
  38. package/dist/src/__tests__/nbt.test.d.ts +1 -0
  39. package/dist/src/__tests__/nbt.test.js +82 -0
  40. package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
  41. package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
  42. package/dist/src/__tests__/optimizer.test.d.ts +1 -0
  43. package/dist/src/__tests__/optimizer.test.js +149 -0
  44. package/dist/src/__tests__/parser.test.d.ts +1 -0
  45. package/dist/src/__tests__/parser.test.js +807 -0
  46. package/dist/src/__tests__/repl.test.d.ts +1 -0
  47. package/dist/src/__tests__/repl.test.js +27 -0
  48. package/dist/src/__tests__/runtime.test.d.ts +1 -0
  49. package/dist/src/__tests__/runtime.test.js +289 -0
  50. package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
  51. package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
  52. package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
  53. package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
  54. package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
  55. package/dist/src/__tests__/stdlib-math.test.js +351 -0
  56. package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
  57. package/dist/src/__tests__/stdlib-vec.test.js +263 -0
  58. package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
  59. package/dist/src/__tests__/structure-optimizer.test.js +33 -0
  60. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  61. package/dist/src/__tests__/typechecker.test.js +552 -0
  62. package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
  63. package/dist/src/__tests__/var-allocator.test.js +69 -0
  64. package/dist/src/ast/types.d.ts +515 -0
  65. package/dist/src/ast/types.js +9 -0
  66. package/dist/src/builtins/metadata.d.ts +36 -0
  67. package/dist/src/builtins/metadata.js +1014 -0
  68. package/dist/src/cli.d.ts +11 -0
  69. package/dist/src/cli.js +443 -0
  70. package/dist/src/codegen/cmdblock/index.d.ts +26 -0
  71. package/dist/src/codegen/cmdblock/index.js +45 -0
  72. package/dist/src/codegen/mcfunction/index.d.ts +40 -0
  73. package/dist/src/codegen/mcfunction/index.js +606 -0
  74. package/dist/src/codegen/structure/index.d.ts +24 -0
  75. package/dist/src/codegen/structure/index.js +279 -0
  76. package/dist/src/codegen/var-allocator.d.ts +45 -0
  77. package/dist/src/codegen/var-allocator.js +104 -0
  78. package/dist/src/compile.d.ts +37 -0
  79. package/dist/src/compile.js +165 -0
  80. package/dist/src/diagnostics/index.d.ts +44 -0
  81. package/dist/src/diagnostics/index.js +140 -0
  82. package/dist/src/events/types.d.ts +35 -0
  83. package/dist/src/events/types.js +59 -0
  84. package/dist/src/formatter/index.d.ts +1 -0
  85. package/dist/src/formatter/index.js +26 -0
  86. package/dist/src/index.d.ts +22 -0
  87. package/dist/src/index.js +45 -0
  88. package/dist/src/ir/builder.d.ts +33 -0
  89. package/dist/src/ir/builder.js +99 -0
  90. package/dist/src/ir/types.d.ts +132 -0
  91. package/dist/src/ir/types.js +15 -0
  92. package/dist/src/lexer/index.d.ts +37 -0
  93. package/dist/src/lexer/index.js +569 -0
  94. package/dist/src/lowering/index.d.ts +188 -0
  95. package/dist/src/lowering/index.js +3405 -0
  96. package/dist/src/mc-test/client.d.ts +128 -0
  97. package/dist/src/mc-test/client.js +174 -0
  98. package/dist/src/mc-test/runner.d.ts +28 -0
  99. package/dist/src/mc-test/runner.js +151 -0
  100. package/dist/src/mc-test/setup.d.ts +11 -0
  101. package/dist/src/mc-test/setup.js +98 -0
  102. package/dist/src/mc-validator/index.d.ts +17 -0
  103. package/dist/src/mc-validator/index.js +322 -0
  104. package/dist/src/nbt/index.d.ts +86 -0
  105. package/dist/src/nbt/index.js +250 -0
  106. package/dist/src/optimizer/commands.d.ts +38 -0
  107. package/dist/src/optimizer/commands.js +451 -0
  108. package/dist/src/optimizer/dce.d.ts +34 -0
  109. package/dist/src/optimizer/dce.js +639 -0
  110. package/dist/src/optimizer/passes.d.ts +34 -0
  111. package/dist/src/optimizer/passes.js +243 -0
  112. package/dist/src/optimizer/structure.d.ts +9 -0
  113. package/dist/src/optimizer/structure.js +356 -0
  114. package/dist/src/parser/index.d.ts +93 -0
  115. package/dist/src/parser/index.js +1687 -0
  116. package/dist/src/repl.d.ts +16 -0
  117. package/dist/src/repl.js +165 -0
  118. package/dist/src/runtime/index.d.ts +107 -0
  119. package/dist/src/runtime/index.js +1409 -0
  120. package/dist/src/typechecker/index.d.ts +61 -0
  121. package/dist/src/typechecker/index.js +1034 -0
  122. package/dist/src/types/entity-hierarchy.d.ts +29 -0
  123. package/dist/src/types/entity-hierarchy.js +107 -0
  124. package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
  125. package/dist/src2/__tests__/e2e/basic.test.js +140 -0
  126. package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
  127. package/dist/src2/__tests__/e2e/macros.test.js +182 -0
  128. package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
  129. package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
  130. package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
  131. package/dist/src2/__tests__/hir/desugar.test.js +234 -0
  132. package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
  133. package/dist/src2/__tests__/lir/lower.test.js +559 -0
  134. package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
  135. package/dist/src2/__tests__/lir/types.test.js +185 -0
  136. package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
  137. package/dist/src2/__tests__/lir/verify.test.js +221 -0
  138. package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
  139. package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
  140. package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
  141. package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
  142. package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
  143. package/dist/src2/__tests__/mir/verify.test.js +223 -0
  144. package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
  145. package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
  146. package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
  147. package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
  148. package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
  149. package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
  150. package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
  151. package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
  152. package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
  153. package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
  154. package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
  155. package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
  156. package/dist/src2/emit/compile.d.ts +19 -0
  157. package/dist/src2/emit/compile.js +80 -0
  158. package/dist/src2/emit/index.d.ts +17 -0
  159. package/dist/src2/emit/index.js +172 -0
  160. package/dist/src2/hir/lower.d.ts +15 -0
  161. package/dist/src2/hir/lower.js +378 -0
  162. package/dist/src2/hir/types.d.ts +373 -0
  163. package/dist/src2/hir/types.js +16 -0
  164. package/dist/src2/lir/lower.d.ts +15 -0
  165. package/dist/src2/lir/lower.js +453 -0
  166. package/dist/src2/lir/types.d.ts +136 -0
  167. package/dist/src2/lir/types.js +11 -0
  168. package/dist/src2/lir/verify.d.ts +14 -0
  169. package/dist/src2/lir/verify.js +113 -0
  170. package/dist/src2/mir/lower.d.ts +9 -0
  171. package/dist/src2/mir/lower.js +1030 -0
  172. package/dist/src2/mir/macro.d.ts +22 -0
  173. package/dist/src2/mir/macro.js +168 -0
  174. package/dist/src2/mir/types.d.ts +183 -0
  175. package/dist/src2/mir/types.js +11 -0
  176. package/dist/src2/mir/verify.d.ts +16 -0
  177. package/dist/src2/mir/verify.js +216 -0
  178. package/dist/src2/optimizer/block_merge.d.ts +12 -0
  179. package/dist/src2/optimizer/block_merge.js +84 -0
  180. package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
  181. package/dist/src2/optimizer/branch_simplify.js +28 -0
  182. package/dist/src2/optimizer/constant_fold.d.ts +10 -0
  183. package/dist/src2/optimizer/constant_fold.js +85 -0
  184. package/dist/src2/optimizer/copy_prop.d.ts +9 -0
  185. package/dist/src2/optimizer/copy_prop.js +113 -0
  186. package/dist/src2/optimizer/dce.d.ts +8 -0
  187. package/dist/src2/optimizer/dce.js +155 -0
  188. package/dist/src2/optimizer/pipeline.d.ts +10 -0
  189. package/dist/src2/optimizer/pipeline.js +42 -0
  190. package/dist/tsconfig.tsbuildinfo +1 -0
  191. package/docs/compiler-pipeline-redesign.md +2243 -0
  192. package/docs/optimization-ideas.md +1076 -0
  193. package/editors/vscode/package-lock.json +3 -3
  194. package/editors/vscode/package.json +1 -1
  195. package/jest.config.js +1 -1
  196. package/package.json +6 -5
  197. package/scripts/postbuild.js +15 -0
  198. package/src/__tests__/cli.test.ts +8 -220
  199. package/src/__tests__/dce.test.ts +11 -56
  200. package/src/__tests__/diagnostics.test.ts +59 -38
  201. package/src/__tests__/mc-integration.test.ts +1 -2
  202. package/src/ast/types.ts +6 -1
  203. package/src/cli.ts +29 -156
  204. package/src/compile.ts +6 -162
  205. package/src/index.ts +14 -178
  206. package/src/mc-test/runner.ts +4 -3
  207. package/src/parser/index.ts +1 -1
  208. package/src/repl.ts +1 -1
  209. package/src/runtime/index.ts +1 -1
  210. package/src2/__tests__/e2e/basic.test.ts +154 -0
  211. package/src2/__tests__/e2e/macros.test.ts +199 -0
  212. package/src2/__tests__/e2e/migrate.test.ts +3008 -0
  213. package/src2/__tests__/hir/desugar.test.ts +263 -0
  214. package/src2/__tests__/lir/lower.test.ts +619 -0
  215. package/src2/__tests__/lir/types.test.ts +207 -0
  216. package/src2/__tests__/lir/verify.test.ts +249 -0
  217. package/src2/__tests__/mir/arithmetic.test.ts +156 -0
  218. package/src2/__tests__/mir/control-flow.test.ts +242 -0
  219. package/src2/__tests__/mir/verify.test.ts +254 -0
  220. package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
  221. package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
  222. package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
  223. package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
  224. package/src2/__tests__/optimizer/dce.test.ts +83 -0
  225. package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
  226. package/src2/emit/compile.ts +99 -0
  227. package/src2/emit/index.ts +222 -0
  228. package/src2/hir/lower.ts +428 -0
  229. package/src2/hir/types.ts +216 -0
  230. package/src2/lir/lower.ts +556 -0
  231. package/src2/lir/types.ts +109 -0
  232. package/src2/lir/verify.ts +129 -0
  233. package/src2/mir/lower.ts +1160 -0
  234. package/src2/mir/macro.ts +167 -0
  235. package/src2/mir/types.ts +106 -0
  236. package/src2/mir/verify.ts +218 -0
  237. package/src2/optimizer/block_merge.ts +93 -0
  238. package/src2/optimizer/branch_simplify.ts +27 -0
  239. package/src2/optimizer/constant_fold.ts +88 -0
  240. package/src2/optimizer/copy_prop.ts +106 -0
  241. package/src2/optimizer/dce.ts +133 -0
  242. package/src2/optimizer/pipeline.ts +44 -0
  243. package/tsconfig.json +2 -2
  244. package/src/__tests__/codegen.test.ts +0 -161
  245. package/src/__tests__/e2e.test.ts +0 -2039
  246. package/src/__tests__/entity-types.test.ts +0 -236
  247. package/src/__tests__/lowering.test.ts +0 -1185
  248. package/src/__tests__/macro.test.ts +0 -343
  249. package/src/__tests__/nbt.test.ts +0 -58
  250. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  251. package/src/__tests__/optimizer.test.ts +0 -162
  252. package/src/__tests__/runtime.test.ts +0 -305
  253. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  254. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  255. package/src/__tests__/stdlib-math.test.ts +0 -374
  256. package/src/__tests__/stdlib-vec.test.ts +0 -259
  257. package/src/__tests__/structure-optimizer.test.ts +0 -38
  258. package/src/__tests__/var-allocator.test.ts +0 -75
  259. package/src/codegen/cmdblock/index.ts +0 -63
  260. package/src/codegen/mcfunction/index.ts +0 -662
  261. package/src/codegen/structure/index.ts +0 -346
  262. package/src/codegen/var-allocator.ts +0 -104
  263. package/src/ir/builder.ts +0 -116
  264. package/src/ir/types.ts +0 -134
  265. package/src/lowering/index.ts +0 -3876
  266. package/src/optimizer/commands.ts +0 -534
  267. package/src/optimizer/dce.ts +0 -679
  268. package/src/optimizer/passes.ts +0 -250
  269. package/src/optimizer/structure.ts +0 -450
@@ -0,0 +1,10 @@
1
+ # build-test
2
+
3
+ Build and run all tests. Always run this after making changes.
4
+
5
+ ```bash
6
+ npm run build && npm test
7
+ ```
8
+
9
+ Expected: 920/920 tests passing.
10
+ If any test fails, fix it before committing.
@@ -0,0 +1,12 @@
1
+ # deploy-demo
2
+
3
+ Compile and deploy the readme demo to the local test server.
4
+
5
+ ```bash
6
+ node dist/cli.js compile examples/readme-demo.mcrs \
7
+ -o ~/mc-test-server/world/datapacks/rsdemo \
8
+ --namespace rsdemo
9
+ ```
10
+
11
+ Then in-game: `/reload` → `/function rsdemo:start`
12
+ Stand ~10 blocks back, face forward.
@@ -0,0 +1,13 @@
1
+ # stage-status
2
+
3
+ Show the current state of the refactor pipeline.
4
+
5
+ Check what exists in src2/ (if the refactor branch is active), run tests,
6
+ and summarize which pipeline stages are implemented and passing.
7
+
8
+ ```bash
9
+ echo "=== Current branch ===" && git branch --show-current
10
+ echo "=== Test status ===" && npm test -- --passWithNoTests 2>&1 | tail -5
11
+ echo "=== src2 exists? ===" && ls src2/ 2>/dev/null || echo "not started"
12
+ echo "=== Design doc ===" && wc -l docs/compiler-pipeline-redesign.md
13
+ ```
@@ -0,0 +1,12 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(npm run build)",
5
+ "Bash(npm test)",
6
+ "Bash(npm run build && npm test)",
7
+ "Bash(git *)",
8
+ "Bash(node dist/cli.js *)",
9
+ "Bash(trash *)"
10
+ ]
11
+ }
12
+ }
@@ -15,6 +15,7 @@ jobs:
15
15
  node-version: 20
16
16
  cache: npm
17
17
  - run: npm install
18
+ - run: npm run build
18
19
  - run: npm test
19
20
 
20
21
  build:
package/CLAUDE.md ADDED
@@ -0,0 +1,231 @@
1
+ # RedScript Compiler — Claude Project Context
2
+
3
+ RedScript is a statically-typed programming language that compiles to Minecraft
4
+ Java Edition datapacks (`.mcfunction` files). It targets the MC scoreboard/NBT
5
+ runtime and generates commands that run inside the MC game engine.
6
+
7
+ **npm package:** `redscript-mc` | **VSCode extension:** `redscript-vscode`
8
+ **Docs:** https://redscript-docs.pages.dev | **IDE:** https://redscript-ide.pages.dev
9
+
10
+ ---
11
+
12
+ ## Build & Test
13
+
14
+ ```bash
15
+ npm run build # tsc compile
16
+ npm test # jest (920 tests, ~35 s)
17
+ npm run build && npm test # always run together after changes
18
+ ```
19
+
20
+ **Tests must be green before any commit.** Current baseline: 920/920.
21
+
22
+ ---
23
+
24
+ ## Rules
25
+
26
+ - **`trash` not `rm`** — always use `trash` for deletions (recoverable)
27
+ - **Plain `git commit`** — GPG signing is passwordless, no flags needed
28
+ - **`git pull --rebase` before every push**
29
+ - **Remove Co-Authored-By** from commit messages before pushing
30
+ - **Small, frequent commits** — one logical unit per commit; do not batch
31
+ - **Never include Co-Authored-By** — strip it from every commit message before committing
32
+ - **Good commit granularity examples:**
33
+ - ✅ `feat(mir): add MIRInstr type definitions`
34
+ - ✅ `feat(mir): implement HIR→MIR lowering for if/else → branch`
35
+ - ✅ `feat(mir): implement HIR→MIR lowering for while → loop CFG`
36
+ - ✅ `feat(mir): add MIR verifier`
37
+ - ✅ `test(mir): arithmetic lowering tests`
38
+ - ✅ `test(mir): control-flow CFG shape tests`
39
+ - ❌ `feat(stage3): implement Stage 3 MIR` (too big — splits into at least 4-6 commits)
40
+ - **Lowercase MC function names** — MC rejects uppercase paths
41
+ - **File extension:** `.mcrs`
42
+
43
+ ---
44
+
45
+ ## Current Architecture (v1.2.x — pre-refactor)
46
+
47
+ ```
48
+ src/
49
+ lexer/index.ts Tokenizer
50
+ parser/index.ts Recursive-descent parser → AST
51
+ lowering/index.ts AST → IR ⚠️ 3500 lines, stages 2+3+5 merged
52
+ ir/index.ts IR types (2-address)
53
+ optimizer/
54
+ passes.ts Optimization passes (2-addr IR, regex-based)
55
+ commands.ts Scoreboard command regex patterns
56
+ structure.ts Structural analysis
57
+ codegen/
58
+ mcfunction/index.ts IR → .mcfunction text
59
+ compile.ts Top-level compile() entry point
60
+ cli.ts CLI
61
+ runtime/index.ts MCRuntime simulator (used by tests)
62
+ stdlib/ math.mcrs, vec.mcrs, advanced.mcrs, bigint.mcrs, timer.mcrs
63
+ __tests__/ 920 Jest tests
64
+ ```
65
+
66
+ **Key identifiers:**
67
+ - Scoreboard objective default: `` `__${namespace}` `` (avoids multi-datapack collision)
68
+ - Macro sentinel: `\x01` at start of raw IR cmd string → codegen converts to `$`
69
+ - IR variable naming: `$fnname_varname` (function-scoped to avoid cross-fn collision)
70
+ - `LOWERING_OBJ` export in `src/lowering/index.ts`: the current objective name
71
+
72
+ ---
73
+
74
+ ## Planned Refactor (next major version)
75
+
76
+ **Full specification:** `docs/compiler-pipeline-redesign.md` (1700+ lines)
77
+ **Optimization ideas:** `docs/optimization-ideas.md` (1076 lines)
78
+
79
+ ### 7-stage pipeline
80
+
81
+ ```
82
+ Source → [Stage 1] AST → [Stage 2] HIR → [Stage 3] MIR (3-addr CFG)
83
+ → [Stage 4] MIR optimized → [Stage 5] LIR (MC 2-addr)
84
+ → [Stage 6] LIR optimized → [Stage 7] .mcfunction
85
+ ```
86
+
87
+ ### Implementation approach
88
+
89
+ - New code goes in `src2/` on branch `refactor/pipeline-v2`
90
+ - `src/` (current compiler) stays untouched until `src2/` passes 920/920
91
+ - Stage by stage: write unit tests for each stage, pass them, then move on
92
+ - 920 e2e tests only all-green at Stage 7 completion — partial pass mid-refactor is normal
93
+ - Adapt if stage boundaries feel wrong; design is a guide, not a contract
94
+
95
+ ### MIR/LIR specs are in the design doc
96
+ The exact TypeScript types for `MIRInstr`, `LIRInstr`, `MIRBlock`, etc. are
97
+ fully specified in `docs/compiler-pipeline-redesign.md`. Read it before
98
+ implementing any stage.
99
+
100
+ ---
101
+
102
+ ## Language Quick Reference
103
+
104
+ ```redscript
105
+ // Types: int, float (×1000 fixed-point), bool, string, void
106
+ // MC types: selector<entity>, selector<player>, BlockPos
107
+
108
+ let x: int = 0;
109
+ const MAX: int = 100;
110
+ fn add(a: int, b: int): int { return a + b; }
111
+
112
+ // Structs (value type — fields are scoreboard slots, no heap, no references)
113
+ struct Vec2 { x: int; y: int; }
114
+ impl Vec2 { fn length_sq(self): int { return self.x * self.x + self.y * self.y; } }
115
+
116
+ // Decorators
117
+ @tick fn _tick() { ... } // runs every MC tick
118
+ @load fn _load() { ... } // runs on /reload
119
+ export fn public_api() { ... } // survives DCE
120
+
121
+ // MC-specific
122
+ foreach (p in @e[tag=foo]) at @s { ... }
123
+ kill(@e[tag=screen]);
124
+ particle("minecraft:end_rod", ^px, ^py, ^5, 0.02, 0.02, 0.02, 0.0, 10);
125
+
126
+ // Macro functions (auto-detected when params appear in ^ coords)
127
+ fn draw_pt(px: float, py: float) {
128
+ particle("minecraft:end_rod", ^px, ^py, ^5, 0.02, 0.02, 0.02, 0.0, 10);
129
+ }
130
+ // Compiles to: function ns:draw_pt with storage rs:macro_args
131
+
132
+ // Math stdlib (fixed-point ×1000)
133
+ let s: int = sin_fixed(45); // = 707 (sin(45°) × 1000)
134
+ let r: int = sqrt_fixed(2000); // = 1414 (√2 × 1000)
135
+ let m: int = mulfix(a, b); // = (a × b) / 1000
136
+ ```
137
+
138
+ ---
139
+
140
+ ## Known Bugs / Technical Debt
141
+
142
+ - `redscript check` hardcodes `namespace = 'redscript'`; doesn't run TypeChecker
143
+ - TypeChecker is "warn mode" — type errors don't block compilation
144
+ - `watch` mode recompiles all files on any change (no incremental)
145
+ - Timer stdlib is single-instance only (shared fake player names)
146
+ - Optimizer passes use regex on raw command strings — fragile
147
+ - All of the above are addressed in the refactor plan
148
+
149
+ ---
150
+
151
+ ## Test Server
152
+
153
+ ```bash
154
+ # Server: Paper 1.21.4, port 25561
155
+ cd ~/mc-test-server
156
+ /opt/homebrew/opt/openjdk@21/bin/java -jar paper.jar --nogui
157
+
158
+ # Deploy
159
+ node dist/cli.js compile examples/readme-demo.mcrs \
160
+ -o ~/mc-test-server/world/datapacks/rsdemo --namespace rsdemo
161
+ # then in-game: /reload && /function rsdemo:start
162
+ ```
163
+
164
+ ---
165
+
166
+ ## Useful Files
167
+
168
+ | File | Purpose |
169
+ |---|---|
170
+ | `docs/compiler-pipeline-redesign.md` | Full refactor spec (read this first) |
171
+ | `docs/optimization-ideas.md` | Optimization pass catalogue |
172
+ | `examples/readme-demo.mcrs` | Sine wave particle demo |
173
+ | `examples/math-showcase.mcrs` | Math stdlib showcase |
174
+ | `src/stdlib/math.mcrs` | sin/cos/sqrt/mulfix/divfix |
175
+ | `src/__tests__/` | 920 Jest tests — do not break these |
176
+ | `src/runtime/index.ts` | MCRuntime (scoreboard + NBT simulator) |
177
+
178
+ ---
179
+
180
+ ## Profiler (planned)
181
+
182
+ `MCRuntime` will gain a profiling mode (`{ profiling: { enabled: true } }`):
183
+ - Per-function command counts
184
+ - Error analysis vs JS float ground truth for math functions
185
+ - Coroutine BATCH auto-calibration
186
+
187
+ See `docs/compiler-pipeline-redesign.md` → "MCRuntime Profiler" section.
188
+
189
+ ---
190
+
191
+ ## VSCode Extension & npm Package Maintenance
192
+
193
+ ### npm package (`redscript-mc`)
194
+
195
+ Claude can maintain fully:
196
+ - Version bumps via `npm version patch/minor/major` in root `package.json`
197
+ - Publishing: push to main → CI handles it automatically
198
+ - The 920 tests verify CLI behavior end-to-end
199
+
200
+ ### VSCode extension (`editors/vscode/`)
201
+
202
+ **What Claude can verify automatically:**
203
+ ```bash
204
+ cd editors/vscode
205
+ npm run build # esbuild bundle must succeed
206
+ vsce package # .vsix must build without errors
207
+ ```
208
+
209
+ Grammar unit tests (if set up with `vscode-tmgrammar-test`):
210
+ ```bash
211
+ # Tests that specific source lines tokenize as expected
212
+ # e.g. "fn foo(x: int): int" → keyword.fn, entity.function, etc.
213
+ npm test
214
+ ```
215
+
216
+ **What Claude cannot verify:** visual rendering, hover UI, color themes,
217
+ real-time IntelliSense behavior. These require a running VS Code instance.
218
+
219
+ **Division of labor:**
220
+ - Claude: grammar files, manifest, version sync, CI publish, update tokens on syntax changes
221
+ - You: visual check before major releases (`code --install-extension *.vsix`)
222
+
223
+ **When syntax changes (e.g. `->` → `:`, `@keep` → `export`):**
224
+ Claude must update `editors/vscode/syntaxes/redscript.tmLanguage.json`
225
+ to match the new grammar, then rebuild and repackage.
226
+
227
+ **CI publish flow:**
228
+ Push to main → `publish-extension-on-ci.yml` auto-bumps patch version and
229
+ publishes via `VSCE_PAT` secret. Manual minor/major bump: edit
230
+ `editors/vscode/package.json` version directly before pushing.
231
+
package/demo.gif CHANGED
Binary file