@mmapp/react-compiler 0.1.0-alpha.1 → 0.1.0-alpha.5

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 (265) hide show
  1. package/ATOM-PIPELINE.md +144 -0
  2. package/README.md +88 -40
  3. package/dist/babel/index.js +2814 -277
  4. package/dist/babel/index.mjs +2 -2
  5. package/dist/chunk-3USIFFE4.mjs +2190 -0
  6. package/dist/chunk-45YMGEVT.mjs +186 -0
  7. package/dist/chunk-4FN2AISW.mjs +148 -0
  8. package/dist/chunk-4OPI5L7G.mjs +2593 -0
  9. package/dist/chunk-4RYTKOOJ.mjs +186 -0
  10. package/dist/chunk-52XHYD2V.mjs +214 -0
  11. package/dist/chunk-5GUFFFGL.mjs +148 -0
  12. package/dist/chunk-5RKTOVR5.mjs +244 -0
  13. package/dist/chunk-5YDMOO4X.mjs +214 -0
  14. package/dist/chunk-64ZWEMLJ.mjs +148 -0
  15. package/dist/chunk-6XP4KSWQ.mjs +2190 -0
  16. package/dist/chunk-72QWL54I.mjs +175 -0
  17. package/dist/chunk-7B4TRI7C.mjs +4835 -0
  18. package/dist/chunk-7ZKGHTNB.mjs +4952 -0
  19. package/dist/chunk-CIESM3BP.mjs +33 -0
  20. package/dist/chunk-DE3ZGQAC.mjs +148 -0
  21. package/dist/chunk-DMCY3BBG.mjs +1933 -0
  22. package/dist/chunk-DPIK3PJS.mjs +244 -0
  23. package/dist/chunk-E5IVH4RE.mjs +186 -0
  24. package/dist/chunk-E6FZNUR5.mjs +4953 -0
  25. package/dist/chunk-EJRBDQDP.mjs +2607 -0
  26. package/dist/chunk-ELO4TXJL.mjs +186 -0
  27. package/dist/chunk-EO6SYNCG.mjs +175 -0
  28. package/dist/chunk-FKRO52XH.mjs +3446 -0
  29. package/dist/chunk-FL4YAKU6.mjs +4941 -0
  30. package/dist/chunk-FYT47UBU.mjs +5076 -0
  31. package/dist/chunk-GCLGPOJZ.mjs +148 -0
  32. package/dist/chunk-GXB4JOP7.mjs +5072 -0
  33. package/dist/chunk-HFXOUMTD.mjs +175 -0
  34. package/dist/chunk-HWIZ47US.mjs +214 -0
  35. package/dist/chunk-IB7MNPQL.mjs +4953 -0
  36. package/dist/chunk-ICSIHQCG.mjs +148 -0
  37. package/dist/chunk-J7JUAHS4.mjs +186 -0
  38. package/dist/chunk-JLA5VNQ3.mjs +186 -0
  39. package/dist/chunk-JQLWFCTM.mjs +214 -0
  40. package/dist/chunk-KFJJCQAL.mjs +148 -0
  41. package/dist/chunk-KJUIIEQE.mjs +186 -0
  42. package/dist/chunk-KNWTHRVQ.mjs +175 -0
  43. package/dist/chunk-KSG4XSZF.mjs +175 -0
  44. package/dist/chunk-LF5N6DOU.mjs +175 -0
  45. package/dist/chunk-LJQCM2IM.mjs +214 -0
  46. package/dist/chunk-NTB7OEX2.mjs +2918 -0
  47. package/dist/chunk-NW6555WJ.mjs +186 -0
  48. package/dist/chunk-OMZE6VLQ.mjs +214 -0
  49. package/dist/chunk-OPJKP747.mjs +7506 -0
  50. package/dist/chunk-P4BR7WVO.mjs +2190 -0
  51. package/dist/chunk-QQHVYH2X.mjs +244 -0
  52. package/dist/chunk-S5QLWLLT.mjs +186 -0
  53. package/dist/chunk-SCWGT2FY.mjs +2190 -0
  54. package/dist/chunk-SMKJUSB3.mjs +2190 -0
  55. package/dist/chunk-THFYE5ZX.mjs +244 -0
  56. package/dist/chunk-VCAY2KGM.mjs +175 -0
  57. package/dist/chunk-WBYMW4NQ.mjs +3450 -0
  58. package/dist/chunk-WECAV6QB.mjs +148 -0
  59. package/dist/chunk-WMKBXUCE.mjs +3228 -0
  60. package/dist/chunk-XAJ5BKKL.mjs +4947 -0
  61. package/dist/chunk-XG2X7AEA.mjs +175 -0
  62. package/dist/chunk-XG7Z23NQ.mjs +148 -0
  63. package/dist/chunk-XWZAOCQ7.mjs +2607 -0
  64. package/dist/chunk-Y6MA7ULW.mjs +148 -0
  65. package/dist/chunk-YMS7Q7LG.mjs +214 -0
  66. package/dist/chunk-ZA37XTGA.mjs +175 -0
  67. package/dist/cli/index.js +13189 -6838
  68. package/dist/cli/index.mjs +140 -22
  69. package/dist/codemod/cli.mjs +1 -1
  70. package/dist/codemod/index.mjs +1 -1
  71. package/dist/config-PL24KEWL.mjs +219 -0
  72. package/dist/dev-server-RmGHIntF.d.mts +113 -0
  73. package/dist/dev-server-RmGHIntF.d.ts +113 -0
  74. package/dist/dev-server.d.mts +1 -1
  75. package/dist/dev-server.d.ts +1 -1
  76. package/dist/dev-server.js +4135 -440
  77. package/dist/dev-server.mjs +5 -5
  78. package/dist/envelope.js +2812 -275
  79. package/dist/envelope.mjs +3 -3
  80. package/dist/index.d.mts +161 -2
  81. package/dist/index.d.ts +161 -2
  82. package/dist/index.js +4429 -428
  83. package/dist/index.mjs +217 -9
  84. package/{src/cli/init.ts → dist/init-7JQMAAXS.mjs} +70 -95
  85. package/dist/init-DQDX3QK6.mjs +369 -0
  86. package/dist/init-EHO4VQ22.mjs +369 -0
  87. package/dist/init-UC3FWPIW.mjs +367 -0
  88. package/dist/init-UNSMVKIK.mjs +366 -0
  89. package/dist/init-UNV5XIDE.mjs +367 -0
  90. package/dist/project-compiler-2P4N4DR7.mjs +10 -0
  91. package/dist/project-compiler-D2LCC27O.mjs +10 -0
  92. package/dist/project-compiler-EJ3GANJE.mjs +10 -0
  93. package/dist/project-compiler-LOQKVRZJ.mjs +10 -0
  94. package/dist/project-compiler-OP2VVGJQ.mjs +10 -0
  95. package/dist/project-compiler-RQ6OQKRM.mjs +10 -0
  96. package/dist/project-compiler-VWNNCHGO.mjs +10 -0
  97. package/dist/project-compiler-XVAAU4C5.mjs +10 -0
  98. package/dist/project-compiler-YES5FGMD.mjs +10 -0
  99. package/dist/project-compiler-ZKMQDLGU.mjs +10 -0
  100. package/dist/project-decompiler-FLXCEJHS.mjs +7 -0
  101. package/dist/project-decompiler-US7GAVIC.mjs +7 -0
  102. package/dist/project-decompiler-VLPR22QF.mjs +7 -0
  103. package/dist/pull-FUS5QYZS.mjs +109 -0
  104. package/dist/pull-LD5ENLGY.mjs +109 -0
  105. package/dist/pull-P44LDRWB.mjs +109 -0
  106. package/dist/testing/index.js +2822 -285
  107. package/dist/testing/index.mjs +2 -2
  108. package/dist/verify-SEIXUGN4.mjs +1833 -0
  109. package/dist/vite/index.js +2815 -278
  110. package/dist/vite/index.mjs +3 -3
  111. package/examples/uber-app/app/admin/fleet.tsx +19 -19
  112. package/package.json +16 -6
  113. package/compile-blueprint-chat.mjs +0 -99
  114. package/compile-blueprint-glass-console.mjs +0 -98
  115. package/compile-chat-defs.mjs +0 -92
  116. package/examples/uber-app/tests/payment.test.tsx +0 -129
  117. package/examples/uber-app/tests/ride-flow.test.tsx +0 -123
  118. package/package.json.backup +0 -86
  119. package/scripts/decompile.ts +0 -226
  120. package/scripts/seed-auth.ts +0 -267
  121. package/scripts/seed-uber.ts +0 -248
  122. package/scripts/validate-uber.ts +0 -119
  123. package/seed-blueprint-chat.mjs +0 -444
  124. package/seed-blueprint-glass-console.mjs +0 -445
  125. package/seed-compiled.mjs +0 -318
  126. package/src/RoundTripValidator.ts +0 -400
  127. package/src/__tests__/atom-rendering-coverage.test.ts +0 -680
  128. package/src/__tests__/auth-module-compilation.test.ts +0 -247
  129. package/src/__tests__/auth-template-compilation.test.ts +0 -589
  130. package/src/__tests__/change-extractor.test.ts +0 -142
  131. package/src/__tests__/cli-pull.test.ts +0 -73
  132. package/src/__tests__/cli-test.test.ts +0 -72
  133. package/src/__tests__/component-extractor.test.ts +0 -331
  134. package/src/__tests__/context-extractor.test.ts +0 -145
  135. package/src/__tests__/decompiler.test.ts +0 -718
  136. package/src/__tests__/define-blueprint.test.ts +0 -133
  137. package/src/__tests__/definition-validator.test.ts +0 -519
  138. package/src/__tests__/during-extractor.test.ts +0 -152
  139. package/src/__tests__/effect-extractor.test.ts +0 -107
  140. package/src/__tests__/event-emission.test.ts +0 -127
  141. package/src/__tests__/examples.test.ts +0 -236
  142. package/src/__tests__/full-blueprint-coverage.test.ts +0 -1221
  143. package/src/__tests__/golden-suite.test.ts +0 -403
  144. package/src/__tests__/grammar-island-extractor.test.ts +0 -289
  145. package/src/__tests__/instance-key.test.ts +0 -82
  146. package/src/__tests__/ir-migration.test.ts +0 -255
  147. package/src/__tests__/lock-file.test.ts +0 -117
  148. package/src/__tests__/model-extractor.test.ts +0 -195
  149. package/src/__tests__/model-field-acl.test.ts +0 -237
  150. package/src/__tests__/model-hooks.test.ts +0 -130
  151. package/src/__tests__/model-ref-resolution.test.ts +0 -268
  152. package/src/__tests__/model-roundtrip.test.ts +0 -502
  153. package/src/__tests__/model-runtime.test.ts +0 -112
  154. package/src/__tests__/model-transitions.test.ts +0 -183
  155. package/src/__tests__/nrt-action-trace.test.ts +0 -391
  156. package/src/__tests__/pipeline-hardening.test.ts +0 -413
  157. package/src/__tests__/project-compiler.test.ts +0 -546
  158. package/src/__tests__/project-decompiler.test.ts +0 -343
  159. package/src/__tests__/query-compilation.test.ts +0 -145
  160. package/src/__tests__/round-trip/PLAN.md +0 -158
  161. package/src/__tests__/round-trip/README.md +0 -52
  162. package/src/__tests__/round-trip/RESULTS.md +0 -86
  163. package/src/__tests__/round-trip/fixtures/data-heavy/main.workflow.tsx +0 -55
  164. package/src/__tests__/round-trip/fixtures/data-heavy/mm.config.ts +0 -11
  165. package/src/__tests__/round-trip/fixtures/data-heavy/models/contact.ts +0 -54
  166. package/src/__tests__/round-trip/fixtures/full-workflow/main.workflow.tsx +0 -79
  167. package/src/__tests__/round-trip/fixtures/full-workflow/mm.config.ts +0 -12
  168. package/src/__tests__/round-trip/fixtures/full-workflow/models/order.ts +0 -50
  169. package/src/__tests__/round-trip/fixtures/simple-crud/main.workflow.tsx +0 -25
  170. package/src/__tests__/round-trip/fixtures/simple-crud/mm.config.ts +0 -11
  171. package/src/__tests__/round-trip/fixtures/simple-crud/models/task.ts +0 -32
  172. package/src/__tests__/round-trip/fixtures/view-heavy/main.workflow.tsx +0 -79
  173. package/src/__tests__/round-trip/fixtures/view-heavy/mm.config.ts +0 -10
  174. package/src/__tests__/round-trip/round-trip.test.ts +0 -2598
  175. package/src/__tests__/round-trip-ir.test.ts +0 -300
  176. package/src/__tests__/round-trip.test.ts +0 -1212
  177. package/src/__tests__/route-merging.test.ts +0 -372
  178. package/src/__tests__/router-composition.test.ts +0 -489
  179. package/src/__tests__/router-extractor.test.ts +0 -176
  180. package/src/__tests__/server-action-extractor.test.ts +0 -128
  181. package/src/__tests__/smart-type-inference.test.ts +0 -365
  182. package/src/__tests__/source-envelope.test.ts +0 -284
  183. package/src/__tests__/source-fidelity.test.ts +0 -516
  184. package/src/__tests__/state-extractor.test.ts +0 -115
  185. package/src/__tests__/strict-mode.test.ts +0 -227
  186. package/src/__tests__/transition-effect-extractor.test.ts +0 -119
  187. package/src/__tests__/transition-extractor.test.ts +0 -68
  188. package/src/__tests__/ts-to-expression.test.ts +0 -462
  189. package/src/__tests__/type-generator.test.ts +0 -201
  190. package/src/__tests__/uber-validation.test.ts +0 -502
  191. package/src/action-compiler.ts +0 -361
  192. package/src/babel/emitters/experience-transform.ts +0 -199
  193. package/src/babel/emitters/ir-to-tsx-emitter.ts +0 -110
  194. package/src/babel/emitters/pure-form-emitter.ts +0 -1023
  195. package/src/babel/emitters/runtime-glue-emitter.ts +0 -39
  196. package/src/babel/extractors/change-extractor.ts +0 -199
  197. package/src/babel/extractors/component-extractor.ts +0 -907
  198. package/src/babel/extractors/computed-extractor.ts +0 -262
  199. package/src/babel/extractors/context-extractor.ts +0 -277
  200. package/src/babel/extractors/during-extractor.ts +0 -295
  201. package/src/babel/extractors/effect-extractor.ts +0 -340
  202. package/src/babel/extractors/event-extractor.ts +0 -235
  203. package/src/babel/extractors/grammar-island-extractor.ts +0 -302
  204. package/src/babel/extractors/model-extractor.ts +0 -1018
  205. package/src/babel/extractors/router-extractor.ts +0 -303
  206. package/src/babel/extractors/server-action-extractor.ts +0 -173
  207. package/src/babel/extractors/server-action-hook-extractor.ts +0 -72
  208. package/src/babel/extractors/server-state-extractor.ts +0 -88
  209. package/src/babel/extractors/state-extractor.ts +0 -214
  210. package/src/babel/extractors/transition-effect-extractor.ts +0 -176
  211. package/src/babel/extractors/transition-extractor.ts +0 -143
  212. package/src/babel/index.ts +0 -24
  213. package/src/babel/transpilers/ts-to-expression.ts +0 -674
  214. package/src/babel/visitor.ts +0 -807
  215. package/src/cli/auth.ts +0 -255
  216. package/src/cli/build.ts +0 -288
  217. package/src/cli/deploy.ts +0 -206
  218. package/src/cli/index.ts +0 -328
  219. package/src/cli/installer.ts +0 -261
  220. package/src/cli/lock-file.ts +0 -94
  221. package/src/cli/mmrc.ts +0 -22
  222. package/src/cli/pull.ts +0 -172
  223. package/src/cli/registry-client.ts +0 -175
  224. package/src/cli/test.ts +0 -397
  225. package/src/cli/type-generator.ts +0 -243
  226. package/src/codemod/__tests__/forward.test.ts +0 -239
  227. package/src/codemod/__tests__/reverse.test.ts +0 -145
  228. package/src/codemod/__tests__/round-trip.test.ts +0 -137
  229. package/src/codemod/annotation.ts +0 -97
  230. package/src/codemod/classify.ts +0 -197
  231. package/src/codemod/cli.ts +0 -207
  232. package/src/codemod/control-flow.ts +0 -409
  233. package/src/codemod/forward.ts +0 -244
  234. package/src/codemod/import-manager.ts +0 -171
  235. package/src/codemod/index.ts +0 -120
  236. package/src/codemod/reverse.ts +0 -197
  237. package/src/codemod/rules.ts +0 -174
  238. package/src/codemod/state-transform.ts +0 -126
  239. package/src/decompiler/ast-builder.ts +0 -538
  240. package/src/decompiler/config-generator.ts +0 -151
  241. package/src/decompiler/index.ts +0 -315
  242. package/src/decompiler/project-decompiler.ts +0 -1776
  243. package/src/decompiler/project.ts +0 -862
  244. package/src/decompiler/split-strategy.ts +0 -140
  245. package/src/decompiler/state-emitter.ts +0 -1053
  246. package/src/decompiler/sx-emitter.ts +0 -318
  247. package/src/decompiler/workspace-hydrator.ts +0 -189
  248. package/src/dev-server.ts +0 -238
  249. package/src/envelope/fs-tree.ts +0 -217
  250. package/src/envelope/source-envelope.ts +0 -264
  251. package/src/envelope.ts +0 -315
  252. package/src/incremental-compiler.ts +0 -401
  253. package/src/index.ts +0 -99
  254. package/src/model-compiler.ts +0 -277
  255. package/src/project-compiler.ts +0 -1629
  256. package/src/route-extractor.ts +0 -333
  257. package/src/testing/index.ts +0 -32
  258. package/src/testing/snapshot.ts +0 -252
  259. package/src/testing/test-utils.ts +0 -226
  260. package/src/types.ts +0 -68
  261. package/src/vite/index.ts +0 -288
  262. package/test-compile.mjs +0 -142
  263. package/tsconfig.json +0 -25
  264. package/tsup.config.ts +0 -23
  265. package/vitest.config.ts +0 -9
@@ -0,0 +1,144 @@
1
+ # Atom Pipeline — How Components Flow From Authoring to Runtime
2
+
3
+ ## The Two Atom Packages Are NOT Duplicates
4
+
5
+ There are two places where atom components live. They serve different purposes and are **not** supposed to be identical.
6
+
7
+ ### `packages/react/src/components/atoms/` — Authoring Atoms (14 components)
8
+
9
+ These are **specifications**, not implementations. They exist so that `.workflow.tsx` authors get TypeScript completion when writing views:
10
+
11
+ ```tsx
12
+ import { Stack, Text, Button, TextInput } from '@mindmatrix/react';
13
+
14
+ export default function MyPage() {
15
+ return (
16
+ <Stack gap={16}>
17
+ <Text variant="h3" value="Hello" />
18
+ <TextInput placeholder="Type here..." onChange={setName} />
19
+ <Button variant="primary" onPress={submit}>Save</Button>
20
+ </Stack>
21
+ );
22
+ }
23
+ ```
24
+
25
+ The Babel compiler (`react-compiler`) extracts this JSX into IR nodes. These components **never render in production**. They only need enough implementation to satisfy TypeScript and render a basic preview in tests.
26
+
27
+ **Full list:** Stack, Row, Column, Text, Heading, Button, TextInput, Each, Show, Slot, Badge, Card, Divider
28
+
29
+ ### `packages/frontend/src/experiences/atoms/` — Runtime Atoms (50+ components)
30
+
31
+ These are **real React components** that render in the browser. They implement the full visual and interactive behavior: Radix UI primitives, Tailwind styling, event handling, accessibility, config prop resolution, Style IR support.
32
+
33
+ The `ComponentTreeRenderer` maps IR node `component` strings to these atoms via the component registry (`component-registry.ts`). When the experience tree has `{ component: 'TextInput', config: { placeholder: '...' } }`, the registry resolves it to the `TextInput` atom from this directory.
34
+
35
+ **These include everything the authoring atoms have, plus:** Select, Icon, Image, Modal, Tabs, Accordion, Router, Route, NavLink, RoleGuard, AnimatedBox, Canvas3D, DataGrid, Chart, MetricCard, ServerGrid, all media atoms (Video, Audio, Map), interactive atoms (Slider, Toggle, Rating, Counter), data display (Tag, Timeline, Pricing), layout (Breadcrumb, Stepper, Drawer), and 17 sub-experience components.
36
+
37
+ ## Why They Differ
38
+
39
+ The authoring atoms are intentionally minimal because:
40
+
41
+ 1. **Different players implement different subsets.** A web player has 90+ renderers. An iOS player might implement 30. A console/CLI player might implement 10. The authoring atoms define the universal vocabulary — what authors can write. Each player decides what it can render, falling back gracefully for unknown components.
42
+
43
+ 2. **The IR is the contract, not the React components.** The compiled IR node `{ component: 'TextInput', config: { placeholder, maxLength, multiline } }` is the spec. Any player that can render a `TextInput` with those config keys is compliant. The React authoring atoms are just one convenient way to produce that IR.
44
+
45
+ 3. **Player-specific atoms shouldn't pollute the authoring SDK.** The web player has `Canvas3D`, `DataGrid`, `GlassConsoleRunner`. These are web-specific. They don't belong in the authoring package that iOS developers also import.
46
+
47
+ ## The Full Pipeline
48
+
49
+ ```
50
+ Author writes .workflow.tsx
51
+
52
+
53
+ @mindmatrix/react atoms (Stack, Text, Button, ...)
54
+ │ TypeScript types + basic rendering for preview
55
+
56
+
57
+ react-compiler Babel plugin
58
+ │ component-extractor.ts extracts JSX → IRExperienceNode
59
+ │ Each JSX element becomes { component, config, bindings, children }
60
+
61
+
62
+ IRExperienceNode tree (stored in database)
63
+ │ component: "TextInput"
64
+ │ config: { placeholder: "Search...", maxLength: 100 }
65
+ │ bindings: { value: "$local.query", onChange: "$action.setLocal('query', $value)" }
66
+
67
+
68
+ ComponentTreeRenderer (packages/frontend/src/experiences/)
69
+ │ Walks the IR tree, resolves each node.component via component-registry
70
+ │ Applies binding-resolver for dynamic values
71
+ │ Passes config as props, style from Style IR
72
+
73
+
74
+ Frontend atoms render in the browser
75
+ TextInput, SelectAtom, ButtonAtom, etc.
76
+ Full Radix UI + Tailwind + accessibility
77
+ ```
78
+
79
+ ## The Decompiler (Reverse Direction)
80
+
81
+ The decompiler converts IR back to `.workflow.tsx` source:
82
+
83
+ ```
84
+ IRExperienceNode tree
85
+
86
+
87
+ ast-builder.ts builds Babel JSX AST
88
+ │ Uses REACT_ATOMS set (32 components) to decide imports
89
+ │ Maps IR tokens ($local.x, $action.y) back to variable names
90
+
91
+
92
+ @babel/generator produces source code
93
+
94
+
95
+ .workflow.tsx with imports from @mindmatrix/react
96
+ ```
97
+
98
+ The `REACT_ATOMS` set in `ast-builder.ts` determines which components get `import { X } from '@mindmatrix/react'` in the decompiled output. Components not in this set are emitted as bare identifiers (assumed to be local imports or custom components).
99
+
100
+ ## Style IR and the `style` Prop
101
+
102
+ The compiled experience tree may attach Style IR to nodes as inline `style` objects. These flow through to the atom's wrapper div. This means **atoms receive border, borderRadius, background, etc. from the compiled view** — not just from their own CSS.
103
+
104
+ If an atom should always be borderless (like TextInput and Select inside Cards), it must explicitly override the style prop:
105
+
106
+ ```tsx
107
+ <div style={{ ...style, border: 'none', borderRadius: 0, background: 'transparent' }}>
108
+ ```
109
+
110
+ This is by design — Style IR gives authors control over visual appearance, but atoms can override properties that conflict with their intended rendering.
111
+
112
+ ## Coverage Validation
113
+
114
+ `atom-rendering-coverage.test.ts` validates the full pipeline:
115
+
116
+ 1. Compiles all blueprint packages and examples to IR
117
+ 2. Collects every unique `component` string from IR trees
118
+ 3. Checks each against `KNOWN_RENDERERS` (90+ registered) and `STRUCTURAL_COMPONENTS` (HTML elements)
119
+ 4. Fails if any IR component has no renderer
120
+
121
+ This catches: new authoring atoms missing a frontend renderer, typos in component names, and regression when atoms are renamed.
122
+
123
+ ## Key Files
124
+
125
+ | File | Purpose |
126
+ |------|---------|
127
+ | `packages/react/src/components/atoms/index.tsx` | Authoring atoms (14) — the author's vocabulary |
128
+ | `packages/frontend/src/experiences/atoms/` | Runtime atoms (50+) — what actually renders |
129
+ | `packages/frontend/src/experiences/ComponentTreeRenderer.tsx` | Walks IR tree, resolves components, applies bindings |
130
+ | `packages/frontend/src/experiences/component-registry.ts` | Maps component name strings → lazy-loaded React components |
131
+ | `packages/frontend/src/experiences/binding-resolver.ts` | Resolves $local, $instance, $action, $fn expressions |
132
+ | `packages/react-compiler/src/babel/extractors/component-extractor.ts` | Extracts JSX → IR nodes during compilation |
133
+ | `packages/react-compiler/src/decompiler/ast-builder.ts` | Builds JSX AST from IR nodes (REACT_ATOMS set) |
134
+ | `packages/react-compiler/src/__tests__/atom-rendering-coverage.test.ts` | Validates no gaps in the pipeline |
135
+
136
+ ## Rules of Thumb
137
+
138
+ - **Adding a new authoring atom?** Add it to `packages/react/src/components/atoms/`, export from the package, and add a matching renderer in `packages/frontend/src/experiences/atoms/`. Register it in `component-registry.ts`. The coverage test will catch if you forget the renderer.
139
+
140
+ - **Adding a web-only atom?** Add it only to `packages/frontend/src/experiences/atoms/` and register in `component-registry.ts`. Don't add it to the authoring package — it's platform-specific.
141
+
142
+ - **Adding a new player (iOS, CLI, etc.)?** Implement renderers for whichever atoms make sense for that platform. The IR is the contract. Unknown components should render a fallback, not crash.
143
+
144
+ - **Atom props drifting?** The coverage test catches missing atoms but not missing props. If you add a new config key to an authoring atom, make sure the corresponding frontend atom handles it. TypeScript won't catch this — it crosses package boundaries through IR serialization.
package/README.md CHANGED
@@ -1,21 +1,47 @@
1
- # @mindmatrix/react-compiler
1
+ # @mmapp/react-compiler
2
2
 
3
- Babel plugin + Vite integration that transforms React workflow files into Pure Form (IR) JSON output.
3
+ Babel plugin, Vite integration, and CLI for compiling React workflow files into Pure Form IR (Intermediate Representation).
4
+
5
+ Published on npm as `@mmapp/react-compiler` (internal workspace name: `@mindmatrix/react-compiler`).
4
6
 
5
7
  ## Installation
6
8
 
7
9
  ```bash
8
- pnpm add -D @mindmatrix/react-compiler
10
+ npm install -g @mmapp/react-compiler # for mmrc CLI
11
+ npm install -D @mmapp/react-compiler # for Vite/Babel plugin
9
12
  ```
10
13
 
11
- ## Usage
14
+ ## CLI — `mmrc`
15
+
16
+ ```bash
17
+ # Scaffold a new blueprint
18
+ mmrc init my-app
19
+
20
+ # Build workflows to IR
21
+ mmrc build --src src/workflows --out dist/workflows
22
+
23
+ # Deploy to MindMatrix server
24
+ mmrc deploy --api-url https://dev.mindmatrix.club --token YOUR_TOKEN
25
+
26
+ # Start dev server with hot reload
27
+ mmrc dev
28
+
29
+ # Run workflow tests
30
+ mmrc test
31
+
32
+ # Pull remote definitions to local files
33
+ mmrc pull --slug my-workflow
12
34
 
13
- ### Vite Plugin
35
+ # Auth
36
+ mmrc login / mmrc logout / mmrc whoami
37
+ ```
38
+
39
+ ## Vite Plugin
14
40
 
15
41
  ```typescript
16
42
  // vite.config.ts
17
43
  import { defineConfig } from 'vite';
18
- import { mindmatrixReact } from '@mindmatrix/react-compiler/vite';
44
+ import { mindmatrixReact } from '@mmapp/react-compiler/vite';
19
45
 
20
46
  export default defineConfig({
21
47
  plugins: [
@@ -27,41 +53,36 @@ export default defineConfig({
27
53
  });
28
54
  ```
29
55
 
30
- ### Babel Plugin
56
+ ## Babel Plugin
31
57
 
32
58
  ```javascript
33
59
  // babel.config.js
34
60
  module.exports = {
35
61
  plugins: [
36
- ['@mindmatrix/react-compiler/babel', { mode: 'infer' }]
62
+ ['@mmapp/react-compiler/babel', { mode: 'infer' }]
37
63
  ]
38
64
  };
39
65
  ```
40
66
 
41
- ### CLI
42
-
43
- ```bash
44
- # Build workflows
45
- pnpm mmrc build --src src/workflows --out dist/workflows
46
-
47
- # Deploy workflows
48
- pnpm mmrc deploy --api-url http://localhost:3010 --token YOUR_TOKEN
49
- ```
50
-
51
- ## Features
52
-
53
- - Extract `useState` calls IR field definitions
54
- - Extract `useOnEnter`, `useOnExit` IR action definitions
55
- - Extract `useTransition` → IR transition definitions
56
- - Extract `useOnEvent` → IR event subscriptions
57
- - Extract JSX components → IR experience nodes
58
- - Emit Pure Form JSON matching `IRWorkflowDefinition` schema
67
+ ## What It Compiles
68
+
69
+ | Source Pattern | IR Output |
70
+ |---------------|-----------|
71
+ | `useState(initial)` | Field definition |
72
+ | `useOnEnter(state, fn)` | State on_enter actions |
73
+ | `useOnExit(state, fn)` | State on_exit actions |
74
+ | `useTransition(name)` | Transition definition |
75
+ | `useOnEvent(pattern, fn)` | Event subscription |
76
+ | JSX components | Experience tree nodes |
77
+ | `defineModel({...})` | Model IR (fields, states, transitions) |
78
+ | `defineBlueprint({...})` | Blueprint manifest |
79
+ | `useServerAction(name)` | Server action binding |
80
+ | Router/Route composition | Route definitions |
59
81
 
60
82
  ## Example
61
83
 
62
84
  ```tsx
63
- // src/workflows/approval.workflow.tsx
64
- import { useState, useOnEnter, useTransition } from '@mindmatrix/react';
85
+ import { useState, useOnEnter, useTransition } from '@mmapp/react';
65
86
 
66
87
  export function ApprovalWorkflow() {
67
88
  const [status, setStatus] = useState('pending');
@@ -83,25 +104,52 @@ Compiles to:
83
104
  {
84
105
  "slug": "approval",
85
106
  "name": "ApprovalWorkflow",
86
- "version": "0.1.0",
87
- "category": "workflow",
88
107
  "fields": [
89
108
  { "name": "status", "type": "text", "default_value": "pending" },
90
109
  { "name": "approver", "type": "text", "default_value": "" }
91
110
  ],
92
111
  "states": [
93
- {
94
- "name": "approved",
95
- "type": "REGULAR",
96
- "on_enter": [
97
- { "id": "auto_1", "type": "set_field", "mode": "auto", "config": { "field": "status", "value": "done" } }
98
- ],
99
- "during": [],
100
- "on_exit": []
101
- }
112
+ { "name": "approved", "type": "REGULAR",
113
+ "on_enter": [{ "type": "set_field", "config": { "field": "status", "value": "done" } }] }
102
114
  ],
103
115
  "transitions": [
104
- { "name": "approve", "from": [], "to": "approved", "actions": [], "conditions": [] }
116
+ { "name": "approve", "from": [], "to": "approved" }
105
117
  ]
106
118
  }
107
119
  ```
120
+
121
+ ## npm Publishing
122
+
123
+ This package is published to npm under the `@mmapp` scope.
124
+
125
+ | npm name | workspace name | current version |
126
+ |----------|---------------|-----------------|
127
+ | `@mmapp/react-compiler` | `@mindmatrix/react-compiler` | 0.1.0-alpha.1 |
128
+
129
+ ### Publishing a new version
130
+
131
+ Use the publish script from the monorepo root:
132
+
133
+ ```bash
134
+ # Publish all 3 packages (player-core, react, react-compiler)
135
+ ./scripts/publish-npm.sh patch # 0.1.0-alpha.1 → 0.1.0-alpha.2
136
+ ./scripts/publish-npm.sh minor # 0.1.0-alpha.1 → 0.2.0-alpha.1
137
+ ./scripts/publish-npm.sh 0.2.0-beta.1 # explicit version
138
+ ```
139
+
140
+ Or publish just this package:
141
+
142
+ ```bash
143
+ cd packages/react-compiler
144
+ pnpm run publish:alpha # auto-increments alpha version
145
+ ```
146
+
147
+ ### Version strategy
148
+
149
+ - `0.1.0-alpha.X` — internal development (current)
150
+ - `0.1.0-beta.X` — user testing
151
+ - `1.0.0` — production launch
152
+
153
+ ### Important: workspace dependency handling
154
+
155
+ When publishing to npm, `workspace:*` dependencies are automatically rewritten to `@mmapp/*` equivalents by the publish script. The internal `@mindmatrix/player-core` becomes `@mmapp/player-core` in the published tarball.