redscript-mc 1.2.29 → 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 (274) 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/README.md +29 -28
  8. package/README.zh.md +28 -28
  9. package/demo.gif +0 -0
  10. package/dist/cli.js +2 -554
  11. package/dist/compile.js +2 -266
  12. package/dist/index.js +2 -159
  13. package/dist/lexer/index.js +9 -1
  14. package/dist/lowering/index.js +22 -5
  15. package/dist/src/__tests__/cli.test.d.ts +1 -0
  16. package/dist/src/__tests__/cli.test.js +104 -0
  17. package/dist/src/__tests__/codegen.test.d.ts +1 -0
  18. package/dist/src/__tests__/codegen.test.js +152 -0
  19. package/dist/src/__tests__/compile-all.test.d.ts +10 -0
  20. package/dist/src/__tests__/compile-all.test.js +108 -0
  21. package/dist/src/__tests__/dce.test.d.ts +1 -0
  22. package/dist/src/__tests__/dce.test.js +102 -0
  23. package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
  24. package/dist/src/__tests__/diagnostics.test.js +177 -0
  25. package/dist/src/__tests__/e2e.test.d.ts +6 -0
  26. package/dist/src/__tests__/e2e.test.js +1789 -0
  27. package/dist/src/__tests__/entity-types.test.d.ts +1 -0
  28. package/dist/src/__tests__/entity-types.test.js +203 -0
  29. package/dist/src/__tests__/formatter.test.d.ts +1 -0
  30. package/dist/src/__tests__/formatter.test.js +40 -0
  31. package/dist/src/__tests__/lexer.test.d.ts +1 -0
  32. package/dist/src/__tests__/lexer.test.js +343 -0
  33. package/dist/src/__tests__/lowering.test.d.ts +1 -0
  34. package/dist/src/__tests__/lowering.test.js +1015 -0
  35. package/dist/src/__tests__/macro.test.d.ts +8 -0
  36. package/dist/src/__tests__/macro.test.js +306 -0
  37. package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
  38. package/dist/src/__tests__/mc-integration.test.js +817 -0
  39. package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
  40. package/dist/src/__tests__/mc-syntax.test.js +124 -0
  41. package/dist/src/__tests__/nbt.test.d.ts +1 -0
  42. package/dist/src/__tests__/nbt.test.js +82 -0
  43. package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
  44. package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
  45. package/dist/src/__tests__/optimizer.test.d.ts +1 -0
  46. package/dist/src/__tests__/optimizer.test.js +149 -0
  47. package/dist/src/__tests__/parser.test.d.ts +1 -0
  48. package/dist/src/__tests__/parser.test.js +807 -0
  49. package/dist/src/__tests__/repl.test.d.ts +1 -0
  50. package/dist/src/__tests__/repl.test.js +27 -0
  51. package/dist/src/__tests__/runtime.test.d.ts +1 -0
  52. package/dist/src/__tests__/runtime.test.js +289 -0
  53. package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
  54. package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
  55. package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
  56. package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
  57. package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
  58. package/dist/src/__tests__/stdlib-math.test.js +351 -0
  59. package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
  60. package/dist/src/__tests__/stdlib-vec.test.js +263 -0
  61. package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
  62. package/dist/src/__tests__/structure-optimizer.test.js +33 -0
  63. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  64. package/dist/src/__tests__/typechecker.test.js +552 -0
  65. package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
  66. package/dist/src/__tests__/var-allocator.test.js +69 -0
  67. package/dist/src/ast/types.d.ts +515 -0
  68. package/dist/src/ast/types.js +9 -0
  69. package/dist/src/builtins/metadata.d.ts +36 -0
  70. package/dist/src/builtins/metadata.js +1014 -0
  71. package/dist/src/cli.d.ts +11 -0
  72. package/dist/src/cli.js +443 -0
  73. package/dist/src/codegen/cmdblock/index.d.ts +26 -0
  74. package/dist/src/codegen/cmdblock/index.js +45 -0
  75. package/dist/src/codegen/mcfunction/index.d.ts +40 -0
  76. package/dist/src/codegen/mcfunction/index.js +606 -0
  77. package/dist/src/codegen/structure/index.d.ts +24 -0
  78. package/dist/src/codegen/structure/index.js +279 -0
  79. package/dist/src/codegen/var-allocator.d.ts +45 -0
  80. package/dist/src/codegen/var-allocator.js +104 -0
  81. package/dist/src/compile.d.ts +37 -0
  82. package/dist/src/compile.js +165 -0
  83. package/dist/src/diagnostics/index.d.ts +44 -0
  84. package/dist/src/diagnostics/index.js +140 -0
  85. package/dist/src/events/types.d.ts +35 -0
  86. package/dist/src/events/types.js +59 -0
  87. package/dist/src/formatter/index.d.ts +1 -0
  88. package/dist/src/formatter/index.js +26 -0
  89. package/dist/src/index.d.ts +22 -0
  90. package/dist/src/index.js +45 -0
  91. package/dist/src/ir/builder.d.ts +33 -0
  92. package/dist/src/ir/builder.js +99 -0
  93. package/dist/src/ir/types.d.ts +132 -0
  94. package/dist/src/ir/types.js +15 -0
  95. package/dist/src/lexer/index.d.ts +37 -0
  96. package/dist/src/lexer/index.js +569 -0
  97. package/dist/src/lowering/index.d.ts +188 -0
  98. package/dist/src/lowering/index.js +3405 -0
  99. package/dist/src/mc-test/client.d.ts +128 -0
  100. package/dist/src/mc-test/client.js +174 -0
  101. package/dist/src/mc-test/runner.d.ts +28 -0
  102. package/dist/src/mc-test/runner.js +151 -0
  103. package/dist/src/mc-test/setup.d.ts +11 -0
  104. package/dist/src/mc-test/setup.js +98 -0
  105. package/dist/src/mc-validator/index.d.ts +17 -0
  106. package/dist/src/mc-validator/index.js +322 -0
  107. package/dist/src/nbt/index.d.ts +86 -0
  108. package/dist/src/nbt/index.js +250 -0
  109. package/dist/src/optimizer/commands.d.ts +38 -0
  110. package/dist/src/optimizer/commands.js +451 -0
  111. package/dist/src/optimizer/dce.d.ts +34 -0
  112. package/dist/src/optimizer/dce.js +639 -0
  113. package/dist/src/optimizer/passes.d.ts +34 -0
  114. package/dist/src/optimizer/passes.js +243 -0
  115. package/dist/src/optimizer/structure.d.ts +9 -0
  116. package/dist/src/optimizer/structure.js +356 -0
  117. package/dist/src/parser/index.d.ts +93 -0
  118. package/dist/src/parser/index.js +1687 -0
  119. package/dist/src/repl.d.ts +16 -0
  120. package/dist/src/repl.js +165 -0
  121. package/dist/src/runtime/index.d.ts +107 -0
  122. package/dist/src/runtime/index.js +1409 -0
  123. package/dist/src/typechecker/index.d.ts +61 -0
  124. package/dist/src/typechecker/index.js +1034 -0
  125. package/dist/src/types/entity-hierarchy.d.ts +29 -0
  126. package/dist/src/types/entity-hierarchy.js +107 -0
  127. package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
  128. package/dist/src2/__tests__/e2e/basic.test.js +140 -0
  129. package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
  130. package/dist/src2/__tests__/e2e/macros.test.js +182 -0
  131. package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
  132. package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
  133. package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
  134. package/dist/src2/__tests__/hir/desugar.test.js +234 -0
  135. package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
  136. package/dist/src2/__tests__/lir/lower.test.js +559 -0
  137. package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
  138. package/dist/src2/__tests__/lir/types.test.js +185 -0
  139. package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
  140. package/dist/src2/__tests__/lir/verify.test.js +221 -0
  141. package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
  142. package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
  143. package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
  144. package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
  145. package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
  146. package/dist/src2/__tests__/mir/verify.test.js +223 -0
  147. package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
  148. package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
  149. package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
  150. package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
  151. package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
  152. package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
  153. package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
  154. package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
  155. package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
  156. package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
  157. package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
  158. package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
  159. package/dist/src2/emit/compile.d.ts +19 -0
  160. package/dist/src2/emit/compile.js +80 -0
  161. package/dist/src2/emit/index.d.ts +17 -0
  162. package/dist/src2/emit/index.js +172 -0
  163. package/dist/src2/hir/lower.d.ts +15 -0
  164. package/dist/src2/hir/lower.js +378 -0
  165. package/dist/src2/hir/types.d.ts +373 -0
  166. package/dist/src2/hir/types.js +16 -0
  167. package/dist/src2/lir/lower.d.ts +15 -0
  168. package/dist/src2/lir/lower.js +453 -0
  169. package/dist/src2/lir/types.d.ts +136 -0
  170. package/dist/src2/lir/types.js +11 -0
  171. package/dist/src2/lir/verify.d.ts +14 -0
  172. package/dist/src2/lir/verify.js +113 -0
  173. package/dist/src2/mir/lower.d.ts +9 -0
  174. package/dist/src2/mir/lower.js +1030 -0
  175. package/dist/src2/mir/macro.d.ts +22 -0
  176. package/dist/src2/mir/macro.js +168 -0
  177. package/dist/src2/mir/types.d.ts +183 -0
  178. package/dist/src2/mir/types.js +11 -0
  179. package/dist/src2/mir/verify.d.ts +16 -0
  180. package/dist/src2/mir/verify.js +216 -0
  181. package/dist/src2/optimizer/block_merge.d.ts +12 -0
  182. package/dist/src2/optimizer/block_merge.js +84 -0
  183. package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
  184. package/dist/src2/optimizer/branch_simplify.js +28 -0
  185. package/dist/src2/optimizer/constant_fold.d.ts +10 -0
  186. package/dist/src2/optimizer/constant_fold.js +85 -0
  187. package/dist/src2/optimizer/copy_prop.d.ts +9 -0
  188. package/dist/src2/optimizer/copy_prop.js +113 -0
  189. package/dist/src2/optimizer/dce.d.ts +8 -0
  190. package/dist/src2/optimizer/dce.js +155 -0
  191. package/dist/src2/optimizer/pipeline.d.ts +10 -0
  192. package/dist/src2/optimizer/pipeline.js +42 -0
  193. package/dist/tsconfig.tsbuildinfo +1 -0
  194. package/docs/compiler-pipeline-redesign.md +2243 -0
  195. package/docs/optimization-ideas.md +1076 -0
  196. package/editors/vscode/package-lock.json +3 -3
  197. package/editors/vscode/package.json +1 -1
  198. package/examples/readme-demo.mcrs +44 -66
  199. package/jest.config.js +1 -1
  200. package/package.json +6 -5
  201. package/scripts/postbuild.js +15 -0
  202. package/src/__tests__/cli.test.ts +8 -220
  203. package/src/__tests__/dce.test.ts +11 -56
  204. package/src/__tests__/diagnostics.test.ts +59 -38
  205. package/src/__tests__/mc-integration.test.ts +1 -2
  206. package/src/ast/types.ts +6 -1
  207. package/src/cli.ts +29 -156
  208. package/src/compile.ts +6 -162
  209. package/src/index.ts +14 -178
  210. package/src/lexer/index.ts +9 -1
  211. package/src/mc-test/runner.ts +4 -3
  212. package/src/parser/index.ts +1 -1
  213. package/src/repl.ts +1 -1
  214. package/src/runtime/index.ts +1 -1
  215. package/src2/__tests__/e2e/basic.test.ts +154 -0
  216. package/src2/__tests__/e2e/macros.test.ts +199 -0
  217. package/src2/__tests__/e2e/migrate.test.ts +3008 -0
  218. package/src2/__tests__/hir/desugar.test.ts +263 -0
  219. package/src2/__tests__/lir/lower.test.ts +619 -0
  220. package/src2/__tests__/lir/types.test.ts +207 -0
  221. package/src2/__tests__/lir/verify.test.ts +249 -0
  222. package/src2/__tests__/mir/arithmetic.test.ts +156 -0
  223. package/src2/__tests__/mir/control-flow.test.ts +242 -0
  224. package/src2/__tests__/mir/verify.test.ts +254 -0
  225. package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
  226. package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
  227. package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
  228. package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
  229. package/src2/__tests__/optimizer/dce.test.ts +83 -0
  230. package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
  231. package/src2/emit/compile.ts +99 -0
  232. package/src2/emit/index.ts +222 -0
  233. package/src2/hir/lower.ts +428 -0
  234. package/src2/hir/types.ts +216 -0
  235. package/src2/lir/lower.ts +556 -0
  236. package/src2/lir/types.ts +109 -0
  237. package/src2/lir/verify.ts +129 -0
  238. package/src2/mir/lower.ts +1160 -0
  239. package/src2/mir/macro.ts +167 -0
  240. package/src2/mir/types.ts +106 -0
  241. package/src2/mir/verify.ts +218 -0
  242. package/src2/optimizer/block_merge.ts +93 -0
  243. package/src2/optimizer/branch_simplify.ts +27 -0
  244. package/src2/optimizer/constant_fold.ts +88 -0
  245. package/src2/optimizer/copy_prop.ts +106 -0
  246. package/src2/optimizer/dce.ts +133 -0
  247. package/src2/optimizer/pipeline.ts +44 -0
  248. package/tsconfig.json +2 -2
  249. package/src/__tests__/codegen.test.ts +0 -161
  250. package/src/__tests__/e2e.test.ts +0 -2039
  251. package/src/__tests__/entity-types.test.ts +0 -236
  252. package/src/__tests__/lowering.test.ts +0 -1185
  253. package/src/__tests__/macro.test.ts +0 -343
  254. package/src/__tests__/nbt.test.ts +0 -58
  255. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  256. package/src/__tests__/optimizer.test.ts +0 -162
  257. package/src/__tests__/runtime.test.ts +0 -305
  258. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  259. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  260. package/src/__tests__/stdlib-math.test.ts +0 -374
  261. package/src/__tests__/stdlib-vec.test.ts +0 -259
  262. package/src/__tests__/structure-optimizer.test.ts +0 -38
  263. package/src/__tests__/var-allocator.test.ts +0 -75
  264. package/src/codegen/cmdblock/index.ts +0 -63
  265. package/src/codegen/mcfunction/index.ts +0 -662
  266. package/src/codegen/structure/index.ts +0 -346
  267. package/src/codegen/var-allocator.ts +0 -104
  268. package/src/ir/builder.ts +0 -116
  269. package/src/ir/types.ts +0 -134
  270. package/src/lowering/index.ts +0 -3860
  271. package/src/optimizer/commands.ts +0 -534
  272. package/src/optimizer/dce.ts +0 -679
  273. package/src/optimizer/passes.ts +0 -250
  274. 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/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  <img src="./logo.png" alt="RedScript Logo" width="64" />
4
4
 
5
- <img src="https://img.shields.io/badge/RedScript-1.2.27-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
5
+ <img src="https://img.shields.io/badge/RedScript-1.2.29-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
6
6
 
7
7
  **A typed scripting language that compiles to Minecraft datapacks.**
8
8
 
9
9
  Write clean game logic. RedScript handles the scoreboard spaghetti.
10
10
 
11
11
  [![CI](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml)
12
- [![Tests](https://img.shields.io/badge/tests-918%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
12
+ [![Tests](https://img.shields.io/badge/tests-920%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
13
13
  [![npm](https://img.shields.io/npm/v/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
14
14
  [![npm downloads](https://img.shields.io/npm/dm/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
15
15
  [![VSCode](https://img.shields.io/badge/VSCode-Extension-007ACC?logo=visualstudiocode)](https://marketplace.visualstudio.com/items?itemName=bkmashiro.redscript-vscode)
@@ -20,9 +20,11 @@ Write clean game logic. RedScript handles the scoreboard spaghetti.
20
20
 
21
21
  ### 🚀 [Try it online — no install needed!](https://redscript-ide.pages.dev)
22
22
 
23
- <img src="./demo.gif" alt="RedScript Demo" width="400" />
23
+ <img src="./demo.gif" alt="RedScript Demo — math curves drawn with particles in Minecraft" width="520" />
24
24
 
25
- *↑ Particles spawning at player position every tick — 100% vanilla, no mods! Just 30 lines of RedScript with full control flow: `if`, `foreach`, `@tick`, f-strings, and more.*
25
+ *↑ Five mathematical curves rendered in real-time with particles — 100% vanilla, no mods!*
26
+ *`y = x·sin(x)` · `y = sin(x) + ½sin(2x)` · `y = e⁻ˣsin(4x)` · `y = tanh(2x)` · `r = cos(2θ)` rose curve*
27
+ *Each curve is computed tick-by-tick using RedScript's fixed-point math stdlib.*
26
28
 
27
29
  </div>
28
30
 
@@ -32,34 +34,33 @@ Write clean game logic. RedScript handles the scoreboard spaghetti.
32
34
 
33
35
  RedScript is a typed scripting language that compiles to vanilla Minecraft datapacks. Write clean code with variables, functions, loops, and events — RedScript handles the scoreboard commands and `.mcfunction` files for you.
34
36
 
35
- **The demo above?** Just 30 lines:
37
+ **The demo above?** Five math curves drawn with 64 sample points each. The core logic:
36
38
 
37
39
  ```rs
38
- let counter: int = 0;
39
- let running: bool = false;
40
-
41
- @tick fn demo_tick() {
42
- if (!running) { return; }
43
- counter = counter + 1;
44
-
45
- foreach (p in @a) at @s {
46
- particle("minecraft:end_rod", ~0, ~1, ~0, 0.5, 0.5, 0.5, 0.1, 5);
47
- }
48
-
49
- if (counter % 20 == 0) {
50
- say(f"Running for {counter} ticks");
51
- }
52
- }
40
+ import "stdlib/math.mcrs"
53
41
 
54
- fn start() {
55
- running = true;
56
- counter = 0;
57
- say(f"Demo started!");
58
- }
42
+ let phase: int = 0;
43
+ let frame: int = 0;
44
+
45
+ // 5 curves cycle every 128 ticks (~6.5 s each)
46
+ @tick fn _wave_tick() {
47
+ phase = (phase + 4) % 360;
48
+ frame = frame + 1;
49
+
50
+ let curve_id: int = (frame / 128) % 5;
51
+
52
+ // Compute sin at 9 column offsets (40° apart = full sine wave span)
53
+ let s0: int = sin_fixed((phase + 0) % 360);
54
+ let s1: int = sin_fixed((phase + 40) % 360);
55
+ // ... s2 through s8 ...
56
+
57
+ // Draw bar chart: each column height = sin value
58
+ // (64 fixed particle positions per curve, all respawned each tick)
59
+ if (curve_id == 0) { _draw_xsinx(); }
60
+ if (curve_id == 1) { _draw_harmonic(); }
61
+ // ...
59
62
 
60
- fn stop() {
61
- running = false;
62
- say(f"Demo stopped at {counter} ticks.");
63
+ actionbar(@a, f"§e y = x·sin(x) phase: {phase}° center: {s0}‰");
63
64
  }
64
65
  ```
65
66
 
package/README.zh.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  <img src="./logo.png" alt="RedScript Logo" width="64" />
4
4
 
5
- <img src="https://img.shields.io/badge/RedScript-1.2.27-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
5
+ <img src="https://img.shields.io/badge/RedScript-1.2.29-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
6
6
 
7
7
  **一个编译到 Minecraft Datapack 的类型化脚本语言。**
8
8
 
9
9
  写干净的游戏逻辑,把记分板的面条代码交给 RedScript 处理。
10
10
 
11
11
  [![CI](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml)
12
- [![Tests](https://img.shields.io/badge/tests-918%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
12
+ [![Tests](https://img.shields.io/badge/tests-920%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
13
13
  [![npm](https://img.shields.io/npm/v/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
14
14
  [![npm downloads](https://img.shields.io/npm/dm/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
15
15
  [![VSCode](https://img.shields.io/badge/VSCode-插件-007ACC?logo=visualstudiocode)](https://marketplace.visualstudio.com/items?itemName=bkmashiro.redscript-vscode)
@@ -20,9 +20,11 @@
20
20
 
21
21
  ### 🚀 [在线试用 — 无需安装!](https://redscript-ide.pages.dev)
22
22
 
23
- <img src="./demo.gif" alt="RedScript Demo" width="400" />
23
+ <img src="./demo.gif" alt="RedScript Demo — 用粒子在 Minecraft 中绘制数学曲线" width="520" />
24
24
 
25
- *↑ tick 在玩家位置生成粒子 — 纯原版,无需 MOD!仅 30 行 RedScript,包含完整控制流:`if`、`foreach`、`@tick`、f-strings 等。*
25
+ *↑ 五条数学函数图像实时粒子渲染 — 纯原版,无需 MOD!*
26
+ *`y = x·sin(x)` · `y = sin(x) + ½sin(2x)` · `y = e⁻ˣsin(4x)` · `y = tanh(2x)` · 玫瑰曲线 `r = cos(2θ)`*
27
+ *每条曲线由 RedScript 定点数学库逐 tick 计算,64 个采样点动态绘制。*
26
28
 
27
29
  </div>
28
30
 
@@ -32,34 +34,32 @@
32
34
 
33
35
  RedScript 是一门编译到原版 Minecraft 数据包的脚本语言。用变量、函数、循环、事件写代码,RedScript 帮你生成记分板命令和 `.mcfunction` 文件。
34
36
 
35
- **上面的演示?** 只有 30 行:
37
+ **上面的演示?** 五条数学曲线,每条 64 个采样点,核心逻辑:
36
38
 
37
39
  ```rs
38
- let counter: int = 0;
39
- let running: bool = false;
40
-
41
- @tick fn demo_tick() {
42
- if (!running) { return; }
43
- counter = counter + 1;
44
-
45
- foreach (p in @a) at @s {
46
- particle("minecraft:end_rod", ~0, ~1, ~0, 0.5, 0.5, 0.5, 0.1, 5);
47
- }
48
-
49
- if (counter % 20 == 0) {
50
- say(f"已运行 {counter} ticks");
51
- }
52
- }
40
+ import "stdlib/math.mcrs"
53
41
 
54
- @keep fn start() {
55
- running = true;
56
- counter = 0;
57
- say(f"Demo 已启动!");
58
- }
42
+ let phase: int = 0;
43
+ let frame: int = 0;
44
+
45
+ // 5 条曲线每 128 tick (~6.5 ) 自动切换
46
+ @tick fn _wave_tick() {
47
+ phase = (phase + 4) % 360;
48
+ frame = frame + 1;
49
+
50
+ let curve_id: int = (frame / 128) % 5;
51
+
52
+ // 计算 9 列的 sin 值(每列相差 40°,刚好覆盖完整周期)
53
+ let s0: int = sin_fixed((phase + 0) % 360);
54
+ let s1: int = sin_fixed((phase + 40) % 360);
55
+ // ... s2 到 s8 ...
56
+
57
+ // 绘制图像:每条曲线有 64 个固定坐标粒子,每 tick 全部重绘
58
+ if (curve_id == 0) { _draw_xsinx(); }
59
+ if (curve_id == 1) { _draw_harmonic(); }
60
+ // ...
59
61
 
60
- @keep fn stop() {
61
- running = false;
62
- say(f"Demo 已停止,共运行 {counter} ticks。");
62
+ actionbar(@a, f"§e y = x·sin(x) phase: {phase}° center: {s0}‰");
63
63
  }
64
64
  ```
65
65
 
package/demo.gif CHANGED
Binary file