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

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 (251) hide show
  1. package/ATOM-PIPELINE.md +144 -0
  2. package/README.md +88 -40
  3. package/dist/babel/index.js +113 -6
  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-5RKTOVR5.mjs +244 -0
  11. package/dist/chunk-5YDMOO4X.mjs +214 -0
  12. package/dist/chunk-64ZWEMLJ.mjs +148 -0
  13. package/dist/chunk-6XP4KSWQ.mjs +2190 -0
  14. package/dist/chunk-72QWL54I.mjs +175 -0
  15. package/dist/chunk-7B4TRI7C.mjs +4835 -0
  16. package/dist/chunk-7ZKGHTNB.mjs +4952 -0
  17. package/dist/chunk-CIESM3BP.mjs +33 -0
  18. package/dist/chunk-DE3ZGQAC.mjs +148 -0
  19. package/dist/chunk-DMCY3BBG.mjs +1933 -0
  20. package/dist/chunk-DPIK3PJS.mjs +244 -0
  21. package/dist/chunk-E5IVH4RE.mjs +186 -0
  22. package/dist/chunk-E6FZNUR5.mjs +4953 -0
  23. package/dist/chunk-EJRBDQDP.mjs +2607 -0
  24. package/dist/chunk-ELO4TXJL.mjs +186 -0
  25. package/dist/chunk-FKRO52XH.mjs +3446 -0
  26. package/dist/chunk-FL4YAKU6.mjs +4941 -0
  27. package/dist/chunk-FYT47UBU.mjs +5076 -0
  28. package/dist/chunk-GCLGPOJZ.mjs +148 -0
  29. package/dist/chunk-GXB4JOP7.mjs +5072 -0
  30. package/dist/chunk-HFXOUMTD.mjs +175 -0
  31. package/dist/chunk-HWIZ47US.mjs +214 -0
  32. package/dist/chunk-IB7MNPQL.mjs +4953 -0
  33. package/dist/chunk-ICSIHQCG.mjs +148 -0
  34. package/dist/chunk-JLA5VNQ3.mjs +186 -0
  35. package/dist/chunk-JQLWFCTM.mjs +214 -0
  36. package/dist/chunk-KFJJCQAL.mjs +148 -0
  37. package/dist/chunk-KJUIIEQE.mjs +186 -0
  38. package/dist/chunk-KNWTHRVQ.mjs +175 -0
  39. package/dist/chunk-KSG4XSZF.mjs +175 -0
  40. package/dist/chunk-LF5N6DOU.mjs +175 -0
  41. package/dist/chunk-LJQCM2IM.mjs +214 -0
  42. package/dist/chunk-NW6555WJ.mjs +186 -0
  43. package/dist/chunk-OMZE6VLQ.mjs +214 -0
  44. package/dist/chunk-P4BR7WVO.mjs +2190 -0
  45. package/dist/chunk-QQHVYH2X.mjs +244 -0
  46. package/dist/chunk-S5QLWLLT.mjs +186 -0
  47. package/dist/chunk-SCWGT2FY.mjs +2190 -0
  48. package/dist/chunk-SMKJUSB3.mjs +2190 -0
  49. package/dist/chunk-VCAY2KGM.mjs +175 -0
  50. package/dist/chunk-WECAV6QB.mjs +148 -0
  51. package/dist/chunk-WMKBXUCE.mjs +3228 -0
  52. package/dist/chunk-XAJ5BKKL.mjs +4947 -0
  53. package/dist/chunk-XG2X7AEA.mjs +175 -0
  54. package/dist/chunk-XG7Z23NQ.mjs +148 -0
  55. package/dist/chunk-XWZAOCQ7.mjs +2607 -0
  56. package/dist/chunk-Y6MA7ULW.mjs +148 -0
  57. package/dist/chunk-YMS7Q7LG.mjs +214 -0
  58. package/dist/chunk-ZA37XTGA.mjs +175 -0
  59. package/dist/cli/index.js +1616 -366
  60. package/dist/cli/index.mjs +8 -8
  61. package/dist/codemod/cli.mjs +1 -1
  62. package/dist/codemod/index.mjs +1 -1
  63. package/dist/dev-server-RmGHIntF.d.mts +113 -0
  64. package/dist/dev-server-RmGHIntF.d.ts +113 -0
  65. package/dist/dev-server.d.mts +1 -1
  66. package/dist/dev-server.d.ts +1 -1
  67. package/dist/dev-server.js +982 -53
  68. package/dist/dev-server.mjs +5 -5
  69. package/dist/envelope.js +113 -6
  70. package/dist/envelope.mjs +3 -3
  71. package/dist/index.d.mts +5 -1
  72. package/dist/index.d.ts +5 -1
  73. package/dist/index.js +992 -63
  74. package/dist/index.mjs +8 -8
  75. package/{src/cli/init.ts → dist/init-7JQMAAXS.mjs} +70 -95
  76. package/dist/init-EHO4VQ22.mjs +369 -0
  77. package/dist/init-UC3FWPIW.mjs +367 -0
  78. package/dist/init-UNSMVKIK.mjs +366 -0
  79. package/dist/init-UNV5XIDE.mjs +367 -0
  80. package/dist/project-compiler-2P4N4DR7.mjs +10 -0
  81. package/dist/project-compiler-D2LCC27O.mjs +10 -0
  82. package/dist/project-compiler-EJ3GANJE.mjs +10 -0
  83. package/dist/project-compiler-LOQKVRZJ.mjs +10 -0
  84. package/dist/project-compiler-RQ6OQKRM.mjs +10 -0
  85. package/dist/project-compiler-VWNNCHGO.mjs +10 -0
  86. package/dist/project-compiler-XVAAU4C5.mjs +10 -0
  87. package/dist/project-compiler-YES5FGMD.mjs +10 -0
  88. package/dist/project-compiler-ZKMQDLGU.mjs +10 -0
  89. package/dist/project-decompiler-FLXCEJHS.mjs +7 -0
  90. package/dist/project-decompiler-VLPR22QF.mjs +7 -0
  91. package/dist/pull-FUS5QYZS.mjs +109 -0
  92. package/dist/pull-LD5ENLGY.mjs +109 -0
  93. package/dist/testing/index.js +113 -6
  94. package/dist/testing/index.mjs +2 -2
  95. package/dist/vite/index.js +113 -6
  96. package/dist/vite/index.mjs +3 -3
  97. package/examples/uber-app/app/admin/fleet.tsx +19 -19
  98. package/package.json +4 -3
  99. package/compile-blueprint-chat.mjs +0 -99
  100. package/compile-blueprint-glass-console.mjs +0 -98
  101. package/compile-chat-defs.mjs +0 -92
  102. package/examples/uber-app/tests/payment.test.tsx +0 -129
  103. package/examples/uber-app/tests/ride-flow.test.tsx +0 -123
  104. package/package.json.backup +0 -86
  105. package/scripts/decompile.ts +0 -226
  106. package/scripts/seed-auth.ts +0 -267
  107. package/scripts/seed-uber.ts +0 -248
  108. package/scripts/validate-uber.ts +0 -119
  109. package/seed-blueprint-chat.mjs +0 -444
  110. package/seed-blueprint-glass-console.mjs +0 -445
  111. package/seed-compiled.mjs +0 -318
  112. package/src/RoundTripValidator.ts +0 -400
  113. package/src/__tests__/atom-rendering-coverage.test.ts +0 -680
  114. package/src/__tests__/auth-module-compilation.test.ts +0 -247
  115. package/src/__tests__/auth-template-compilation.test.ts +0 -589
  116. package/src/__tests__/change-extractor.test.ts +0 -142
  117. package/src/__tests__/cli-pull.test.ts +0 -73
  118. package/src/__tests__/cli-test.test.ts +0 -72
  119. package/src/__tests__/component-extractor.test.ts +0 -331
  120. package/src/__tests__/context-extractor.test.ts +0 -145
  121. package/src/__tests__/decompiler.test.ts +0 -718
  122. package/src/__tests__/define-blueprint.test.ts +0 -133
  123. package/src/__tests__/definition-validator.test.ts +0 -519
  124. package/src/__tests__/during-extractor.test.ts +0 -152
  125. package/src/__tests__/effect-extractor.test.ts +0 -107
  126. package/src/__tests__/event-emission.test.ts +0 -127
  127. package/src/__tests__/examples.test.ts +0 -236
  128. package/src/__tests__/full-blueprint-coverage.test.ts +0 -1221
  129. package/src/__tests__/golden-suite.test.ts +0 -403
  130. package/src/__tests__/grammar-island-extractor.test.ts +0 -289
  131. package/src/__tests__/instance-key.test.ts +0 -82
  132. package/src/__tests__/ir-migration.test.ts +0 -255
  133. package/src/__tests__/lock-file.test.ts +0 -117
  134. package/src/__tests__/model-extractor.test.ts +0 -195
  135. package/src/__tests__/model-field-acl.test.ts +0 -237
  136. package/src/__tests__/model-hooks.test.ts +0 -130
  137. package/src/__tests__/model-ref-resolution.test.ts +0 -268
  138. package/src/__tests__/model-roundtrip.test.ts +0 -502
  139. package/src/__tests__/model-runtime.test.ts +0 -112
  140. package/src/__tests__/model-transitions.test.ts +0 -183
  141. package/src/__tests__/nrt-action-trace.test.ts +0 -391
  142. package/src/__tests__/pipeline-hardening.test.ts +0 -413
  143. package/src/__tests__/project-compiler.test.ts +0 -546
  144. package/src/__tests__/project-decompiler.test.ts +0 -343
  145. package/src/__tests__/query-compilation.test.ts +0 -145
  146. package/src/__tests__/round-trip/PLAN.md +0 -158
  147. package/src/__tests__/round-trip/README.md +0 -52
  148. package/src/__tests__/round-trip/RESULTS.md +0 -86
  149. package/src/__tests__/round-trip/fixtures/data-heavy/main.workflow.tsx +0 -55
  150. package/src/__tests__/round-trip/fixtures/data-heavy/mm.config.ts +0 -11
  151. package/src/__tests__/round-trip/fixtures/data-heavy/models/contact.ts +0 -54
  152. package/src/__tests__/round-trip/fixtures/full-workflow/main.workflow.tsx +0 -79
  153. package/src/__tests__/round-trip/fixtures/full-workflow/mm.config.ts +0 -12
  154. package/src/__tests__/round-trip/fixtures/full-workflow/models/order.ts +0 -50
  155. package/src/__tests__/round-trip/fixtures/simple-crud/main.workflow.tsx +0 -25
  156. package/src/__tests__/round-trip/fixtures/simple-crud/mm.config.ts +0 -11
  157. package/src/__tests__/round-trip/fixtures/simple-crud/models/task.ts +0 -32
  158. package/src/__tests__/round-trip/fixtures/view-heavy/main.workflow.tsx +0 -79
  159. package/src/__tests__/round-trip/fixtures/view-heavy/mm.config.ts +0 -10
  160. package/src/__tests__/round-trip/round-trip.test.ts +0 -2598
  161. package/src/__tests__/round-trip-ir.test.ts +0 -300
  162. package/src/__tests__/round-trip.test.ts +0 -1212
  163. package/src/__tests__/route-merging.test.ts +0 -372
  164. package/src/__tests__/router-composition.test.ts +0 -489
  165. package/src/__tests__/router-extractor.test.ts +0 -176
  166. package/src/__tests__/server-action-extractor.test.ts +0 -128
  167. package/src/__tests__/smart-type-inference.test.ts +0 -365
  168. package/src/__tests__/source-envelope.test.ts +0 -284
  169. package/src/__tests__/source-fidelity.test.ts +0 -516
  170. package/src/__tests__/state-extractor.test.ts +0 -115
  171. package/src/__tests__/strict-mode.test.ts +0 -227
  172. package/src/__tests__/transition-effect-extractor.test.ts +0 -119
  173. package/src/__tests__/transition-extractor.test.ts +0 -68
  174. package/src/__tests__/ts-to-expression.test.ts +0 -462
  175. package/src/__tests__/type-generator.test.ts +0 -201
  176. package/src/__tests__/uber-validation.test.ts +0 -502
  177. package/src/action-compiler.ts +0 -361
  178. package/src/babel/emitters/experience-transform.ts +0 -199
  179. package/src/babel/emitters/ir-to-tsx-emitter.ts +0 -110
  180. package/src/babel/emitters/pure-form-emitter.ts +0 -1023
  181. package/src/babel/emitters/runtime-glue-emitter.ts +0 -39
  182. package/src/babel/extractors/change-extractor.ts +0 -199
  183. package/src/babel/extractors/component-extractor.ts +0 -907
  184. package/src/babel/extractors/computed-extractor.ts +0 -262
  185. package/src/babel/extractors/context-extractor.ts +0 -277
  186. package/src/babel/extractors/during-extractor.ts +0 -295
  187. package/src/babel/extractors/effect-extractor.ts +0 -340
  188. package/src/babel/extractors/event-extractor.ts +0 -235
  189. package/src/babel/extractors/grammar-island-extractor.ts +0 -302
  190. package/src/babel/extractors/model-extractor.ts +0 -1018
  191. package/src/babel/extractors/router-extractor.ts +0 -303
  192. package/src/babel/extractors/server-action-extractor.ts +0 -173
  193. package/src/babel/extractors/server-action-hook-extractor.ts +0 -72
  194. package/src/babel/extractors/server-state-extractor.ts +0 -88
  195. package/src/babel/extractors/state-extractor.ts +0 -214
  196. package/src/babel/extractors/transition-effect-extractor.ts +0 -176
  197. package/src/babel/extractors/transition-extractor.ts +0 -143
  198. package/src/babel/index.ts +0 -24
  199. package/src/babel/transpilers/ts-to-expression.ts +0 -674
  200. package/src/babel/visitor.ts +0 -807
  201. package/src/cli/auth.ts +0 -255
  202. package/src/cli/build.ts +0 -288
  203. package/src/cli/deploy.ts +0 -206
  204. package/src/cli/index.ts +0 -328
  205. package/src/cli/installer.ts +0 -261
  206. package/src/cli/lock-file.ts +0 -94
  207. package/src/cli/mmrc.ts +0 -22
  208. package/src/cli/pull.ts +0 -172
  209. package/src/cli/registry-client.ts +0 -175
  210. package/src/cli/test.ts +0 -397
  211. package/src/cli/type-generator.ts +0 -243
  212. package/src/codemod/__tests__/forward.test.ts +0 -239
  213. package/src/codemod/__tests__/reverse.test.ts +0 -145
  214. package/src/codemod/__tests__/round-trip.test.ts +0 -137
  215. package/src/codemod/annotation.ts +0 -97
  216. package/src/codemod/classify.ts +0 -197
  217. package/src/codemod/cli.ts +0 -207
  218. package/src/codemod/control-flow.ts +0 -409
  219. package/src/codemod/forward.ts +0 -244
  220. package/src/codemod/import-manager.ts +0 -171
  221. package/src/codemod/index.ts +0 -120
  222. package/src/codemod/reverse.ts +0 -197
  223. package/src/codemod/rules.ts +0 -174
  224. package/src/codemod/state-transform.ts +0 -126
  225. package/src/decompiler/ast-builder.ts +0 -538
  226. package/src/decompiler/config-generator.ts +0 -151
  227. package/src/decompiler/index.ts +0 -315
  228. package/src/decompiler/project-decompiler.ts +0 -1776
  229. package/src/decompiler/project.ts +0 -862
  230. package/src/decompiler/split-strategy.ts +0 -140
  231. package/src/decompiler/state-emitter.ts +0 -1053
  232. package/src/decompiler/sx-emitter.ts +0 -318
  233. package/src/decompiler/workspace-hydrator.ts +0 -189
  234. package/src/dev-server.ts +0 -238
  235. package/src/envelope/fs-tree.ts +0 -217
  236. package/src/envelope/source-envelope.ts +0 -264
  237. package/src/envelope.ts +0 -315
  238. package/src/incremental-compiler.ts +0 -401
  239. package/src/index.ts +0 -99
  240. package/src/model-compiler.ts +0 -277
  241. package/src/project-compiler.ts +0 -1629
  242. package/src/route-extractor.ts +0 -333
  243. package/src/testing/index.ts +0 -32
  244. package/src/testing/snapshot.ts +0 -252
  245. package/src/testing/test-utils.ts +0 -226
  246. package/src/types.ts +0 -68
  247. package/src/vite/index.ts +0 -288
  248. package/test-compile.mjs +0 -142
  249. package/tsconfig.json +0 -25
  250. package/tsup.config.ts +0 -23
  251. package/vitest.config.ts +0 -9
@@ -1,261 +0,0 @@
1
- /**
2
- * Installer — handles install, list, update, and remove commands.
3
- *
4
- * Modes:
5
- * type-only (default): writes .d.ts to node_modules/@mm/<slug>/
6
- * full: uses project decompiler to generate full source in packages/<slug>/
7
- */
8
-
9
- import { mkdirSync, writeFileSync, existsSync, rmSync } from 'fs';
10
- import { join, dirname } from 'path';
11
- import { fetchDefinition, searchDefinitions } from './registry-client';
12
- import type { RegistryConfig, WorkflowDefinitionResponse } from './registry-client';
13
- import { generateTypeDeclaration, generateFullSource } from './type-generator';
14
- import { readLockFile, upsertLockEntry, removeLockEntry } from './lock-file';
15
- import type { LockData } from './lock-file';
16
-
17
- export interface InstallOptions {
18
- slug: string;
19
- mode: 'type-only' | 'full';
20
- config: RegistryConfig;
21
- cwd?: string;
22
- }
23
-
24
- export interface InstallResult {
25
- slug: string;
26
- version: string;
27
- mode: 'type-only' | 'full';
28
- filesWritten: string[];
29
- }
30
-
31
- export interface ListResult {
32
- entries: LockData;
33
- }
34
-
35
- /**
36
- * Install a workflow definition package.
37
- */
38
- export async function install(options: InstallOptions): Promise<InstallResult> {
39
- const { slug, mode, config } = options;
40
- const cwd = options.cwd ?? process.cwd();
41
-
42
- console.log(`[mmrc] Installing ${slug}...`);
43
-
44
- // 1. Fetch definition from registry
45
- const def = await fetchDefinition(slug, config);
46
- const version = def.version || '1.0.0';
47
-
48
- console.log(` Found: ${def.name || def.slug} v${version} (${def.category || 'workflow'})`);
49
- console.log(` Fields: ${def.fields?.length ?? 0}, States: ${def.states?.length ?? 0}, Transitions: ${def.transitions?.length ?? 0}`);
50
-
51
- const filesWritten: string[] = [];
52
-
53
- if (mode === 'full') {
54
- filesWritten.push(...installFull(def, cwd));
55
- } else {
56
- filesWritten.push(...installTypeOnly(def, cwd));
57
- }
58
-
59
- // 4. Update lock file
60
- const content = mode === 'full' ? generateFullSource(def) : generateTypeDeclaration(def);
61
- upsertLockEntry(cwd, slug, version, mode, content);
62
-
63
- console.log(`\n[mmrc] Installed ${slug}@${version} (${mode})`);
64
- for (const f of filesWritten) {
65
- console.log(` + ${f}`);
66
- }
67
-
68
- return { slug, version, mode, filesWritten };
69
- }
70
-
71
- /**
72
- * Install type-only: write .d.ts to node_modules/@mm/<slug>/
73
- */
74
- function installTypeOnly(
75
- def: WorkflowDefinitionResponse,
76
- cwd: string,
77
- ): string[] {
78
- const packageDir = join(cwd, 'node_modules', '@mm', def.slug);
79
- mkdirSync(packageDir, { recursive: true });
80
-
81
- // Generate type declaration
82
- const dts = generateTypeDeclaration(def);
83
- const dtsPath = join(packageDir, 'index.d.ts');
84
- writeFileSync(dtsPath, dts, 'utf-8');
85
-
86
- // Generate a minimal package.json for resolution
87
- const pkgJson = {
88
- name: `@mm/${def.slug}`,
89
- version: def.version || '1.0.0',
90
- types: './index.d.ts',
91
- main: './index.js',
92
- };
93
- writeFileSync(join(packageDir, 'package.json'), JSON.stringify(pkgJson, null, 2) + '\n', 'utf-8');
94
-
95
- // Generate a minimal index.js stub (for runtime resolution)
96
- const jsStub = [
97
- `// Auto-generated stub for @mm/${def.slug}`,
98
- `// This package provides type information only.`,
99
- `// The actual runtime comes from the workflow engine.`,
100
- `module.exports = { slug: '${def.slug}', version: '${def.version || '1.0.0'}' };`,
101
- '',
102
- ].join('\n');
103
- writeFileSync(join(packageDir, 'index.js'), jsStub, 'utf-8');
104
-
105
- return [
106
- `node_modules/@mm/${def.slug}/index.d.ts`,
107
- `node_modules/@mm/${def.slug}/package.json`,
108
- `node_modules/@mm/${def.slug}/index.js`,
109
- ];
110
- }
111
-
112
- /**
113
- * Install full: use decompiler to generate project files.
114
- */
115
- function installFull(
116
- def: WorkflowDefinitionResponse,
117
- cwd: string,
118
- ): string[] {
119
- const outDir = join(cwd, 'packages', def.slug);
120
- mkdirSync(outDir, { recursive: true });
121
-
122
- const filesWritten: string[] = [];
123
-
124
- // Try to use the project decompiler for full source
125
- try {
126
- // Dynamic import to avoid circular dependency at module level
127
- // eslint-disable-next-line @typescript-eslint/no-require-imports
128
- const { decompileProjectEnhanced } = require('../decompiler/project-decompiler');
129
- const result = decompileProjectEnhanced(def);
130
-
131
- for (const file of result.files) {
132
- const filePath = join(outDir, file.path);
133
- mkdirSync(dirname(filePath), { recursive: true });
134
- writeFileSync(filePath, file.content, 'utf-8');
135
- filesWritten.push(`packages/${def.slug}/${file.path}`);
136
- }
137
- } catch {
138
- // Fallback: generate a basic source file
139
- console.log(' (decompiler unavailable, generating basic source)');
140
- const source = generateFullSource(def);
141
- const indexPath = join(outDir, 'index.ts');
142
- writeFileSync(indexPath, source, 'utf-8');
143
- filesWritten.push(`packages/${def.slug}/index.ts`);
144
-
145
- // Generate package.json
146
- const pkgJson = {
147
- name: `@mm/${def.slug}`,
148
- version: def.version || '1.0.0',
149
- main: './index.ts',
150
- types: './index.ts',
151
- };
152
- writeFileSync(join(outDir, 'package.json'), JSON.stringify(pkgJson, null, 2) + '\n', 'utf-8');
153
- filesWritten.push(`packages/${def.slug}/package.json`);
154
- }
155
-
156
- return filesWritten;
157
- }
158
-
159
- /**
160
- * List all installed workflow packages.
161
- */
162
- export function list(cwd?: string): ListResult {
163
- const dir = cwd ?? process.cwd();
164
- const entries = readLockFile(dir);
165
- return { entries };
166
- }
167
-
168
- /**
169
- * Update all installed packages (re-fetch and regenerate).
170
- */
171
- export async function update(config: RegistryConfig, cwd?: string): Promise<InstallResult[]> {
172
- const dir = cwd ?? process.cwd();
173
- const entries = readLockFile(dir);
174
- const slugs = Object.keys(entries);
175
-
176
- if (slugs.length === 0) {
177
- console.log('[mmrc] No packages installed. Use `mmrc install <slug>` first.');
178
- return [];
179
- }
180
-
181
- console.log(`[mmrc] Updating ${slugs.length} package(s)...`);
182
- const results: InstallResult[] = [];
183
-
184
- for (const slug of slugs) {
185
- const entry = entries[slug];
186
- try {
187
- const result = await install({
188
- slug,
189
- mode: entry.mode,
190
- config,
191
- cwd: dir,
192
- });
193
- results.push(result);
194
- } catch (err) {
195
- console.error(` x Failed to update ${slug}: ${err instanceof Error ? err.message : String(err)}`);
196
- }
197
- }
198
-
199
- console.log(`\n[mmrc] Updated ${results.length}/${slugs.length} package(s).`);
200
- return results;
201
- }
202
-
203
- /**
204
- * Remove an installed package.
205
- */
206
- export function remove(slug: string, cwd?: string): boolean {
207
- const dir = cwd ?? process.cwd();
208
- const entries = readLockFile(dir);
209
-
210
- if (!(slug in entries)) {
211
- console.error(`[mmrc] Package "${slug}" is not installed.`);
212
- return false;
213
- }
214
-
215
- const entry = entries[slug];
216
-
217
- // Remove files based on mode
218
- if (entry.mode === 'type-only') {
219
- const packageDir = join(dir, 'node_modules', '@mm', slug);
220
- if (existsSync(packageDir)) {
221
- rmSync(packageDir, { recursive: true, force: true });
222
- }
223
- } else {
224
- const packageDir = join(dir, 'packages', slug);
225
- if (existsSync(packageDir)) {
226
- rmSync(packageDir, { recursive: true, force: true });
227
- }
228
- }
229
-
230
- // Remove lock entry
231
- removeLockEntry(dir, slug);
232
- console.log(`[mmrc] Removed ${slug}.`);
233
-
234
- return true;
235
- }
236
-
237
- /**
238
- * Search for available workflow definitions.
239
- */
240
- export async function search(query: string, config: RegistryConfig): Promise<void> {
241
- console.log(`[mmrc] Searching for "${query}"...`);
242
-
243
- const results = await searchDefinitions(query, config);
244
-
245
- if (results.length === 0) {
246
- console.log(' No definitions found.');
247
- return;
248
- }
249
-
250
- console.log(` Found ${results.length} definition(s):\n`);
251
- for (const def of results) {
252
- const fieldCount = def.fields?.length ?? 0;
253
- const stateCount = def.states?.length ?? 0;
254
- console.log(` ${def.slug} v${def.version || '1.0.0'} — ${def.name || '(unnamed)'}`);
255
- console.log(` ${def.category || 'workflow'} | ${fieldCount} fields, ${stateCount} states`);
256
- if (def.description) {
257
- console.log(` ${def.description}`);
258
- }
259
- console.log('');
260
- }
261
- }
@@ -1,94 +0,0 @@
1
- /**
2
- * mm.lock — Lock file management for installed workflow packages.
3
- *
4
- * Simple JSON lock file that tracks installed packages, versions, and modes.
5
- */
6
-
7
- import { readFileSync, writeFileSync, existsSync } from 'fs';
8
- import { join } from 'path';
9
- import { createHash } from 'crypto';
10
-
11
- export interface LockEntry {
12
- slug: string;
13
- version: string;
14
- installedAt: string;
15
- mode: 'type-only' | 'full';
16
- hash: string;
17
- }
18
-
19
- export type LockData = Record<string, LockEntry>;
20
-
21
- const LOCK_FILENAME = 'mm.lock';
22
-
23
- /**
24
- * Read the lock file from the given directory.
25
- * Returns an empty object if the lock file doesn't exist.
26
- */
27
- export function readLockFile(dir: string): LockData {
28
- const lockPath = join(dir, LOCK_FILENAME);
29
- if (!existsSync(lockPath)) {
30
- return {};
31
- }
32
-
33
- try {
34
- const content = readFileSync(lockPath, 'utf-8');
35
- return JSON.parse(content) as LockData;
36
- } catch {
37
- // Corrupted lock file — start fresh
38
- return {};
39
- }
40
- }
41
-
42
- /**
43
- * Write the lock file to the given directory.
44
- */
45
- export function writeLockFile(dir: string, entries: LockData): void {
46
- const lockPath = join(dir, LOCK_FILENAME);
47
-
48
- // Sort keys for deterministic output
49
- const sorted: LockData = {};
50
- for (const key of Object.keys(entries).sort()) {
51
- sorted[key] = entries[key];
52
- }
53
-
54
- writeFileSync(lockPath, JSON.stringify(sorted, null, 2) + '\n', 'utf-8');
55
- }
56
-
57
- /**
58
- * Add or update a lock entry.
59
- */
60
- export function upsertLockEntry(
61
- dir: string,
62
- slug: string,
63
- version: string,
64
- mode: 'type-only' | 'full',
65
- content: string,
66
- ): void {
67
- const entries = readLockFile(dir);
68
- entries[slug] = {
69
- slug,
70
- version,
71
- installedAt: new Date().toISOString(),
72
- mode,
73
- hash: computeHash(content),
74
- };
75
- writeLockFile(dir, entries);
76
- }
77
-
78
- /**
79
- * Remove a lock entry.
80
- */
81
- export function removeLockEntry(dir: string, slug: string): boolean {
82
- const entries = readLockFile(dir);
83
- if (!(slug in entries)) return false;
84
- delete entries[slug];
85
- writeLockFile(dir, entries);
86
- return true;
87
- }
88
-
89
- /**
90
- * Compute a content hash for change detection.
91
- */
92
- export function computeHash(content: string): string {
93
- return createHash('sha256').update(content).digest('hex').slice(0, 16);
94
- }
package/src/cli/mmrc.ts DELETED
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * mmrc — MindMatrix React Compiler CLI
4
- *
5
- * This is an alias entry point. The actual CLI logic lives in ./index.ts.
6
- *
7
- * Commands:
8
- * mmrc dev Start dev server with hot reload
9
- * mmrc build Compile workflow files to Pure Form IR
10
- * mmrc test Run workflow test files
11
- * mmrc deploy Compile + upload workflows to backend DB
12
- * mmrc pull Fetch a definition from DB and scaffold local project
13
- * mmrc install <slug> Install a workflow definition (type-only by default)
14
- * mmrc install <slug> --full Install with full source code
15
- * mmrc list List installed workflow packages
16
- * mmrc update Update all installed packages
17
- * mmrc remove <slug> Remove an installed package
18
- * mmrc search <query> Search available definitions
19
- */
20
-
21
- // Re-export from main CLI entry point
22
- import './index';
package/src/cli/pull.ts DELETED
@@ -1,172 +0,0 @@
1
- /**
2
- * CLI Pull Command — fetches a workflow definition from DB and scaffolds
3
- * a local React framework project.
4
- *
5
- * Usage:
6
- * mmrc pull <slug> --api-url http://... --token TOKEN --out ./my-project
7
- *
8
- * Pipeline:
9
- * GET /api/v1/workflow/definitions?slug=<slug>
10
- * → IRWorkflowDefinition
11
- * → project-decompiler
12
- * → local files (mm.config.ts, main.workflow.tsx, pages/, models/)
13
- */
14
-
15
- import { mkdirSync, writeFileSync } from 'fs';
16
- import { join, dirname } from 'path';
17
- import { decompileProjectEnhanced as decompileProject } from '../decompiler/project-decompiler';
18
- import type { IRWorkflowDefinition } from '@mindmatrix/player-core';
19
-
20
- export interface PullOptions {
21
- slug: string;
22
- apiUrl: string;
23
- token: string;
24
- outDir?: string;
25
- }
26
-
27
- export interface PullResult {
28
- slug: string;
29
- filesWritten: string[];
30
- outDir: string;
31
- }
32
-
33
- export async function pull(options: PullOptions): Promise<PullResult> {
34
- const { slug, apiUrl, token } = options;
35
- const outDir = options.outDir ?? slug;
36
-
37
- console.log(`[mmrc pull] Fetching "${slug}" from ${apiUrl}...`);
38
-
39
- // 1. Fetch the definition from the API
40
- const ir = await fetchDefinition(apiUrl, token, slug);
41
- if (!ir) {
42
- throw new Error(`Definition "${slug}" not found`);
43
- }
44
-
45
- console.log(` Found: ${ir.name || ir.slug} (${ir.category || 'workflow'}, v${ir.version || '1.0.0'})`);
46
- console.log(` Fields: ${ir.fields?.length ?? 0}, States: ${ir.states?.length ?? 0}, Transitions: ${ir.transitions?.length ?? 0}`);
47
-
48
- // 2. Decompile to project files
49
- const result = decompileProject(ir);
50
-
51
- // 3. Write files to disk
52
- mkdirSync(outDir, { recursive: true });
53
- const filesWritten: string[] = [];
54
-
55
- for (const file of result.files) {
56
- const filePath = join(outDir, file.path);
57
- mkdirSync(dirname(filePath), { recursive: true });
58
- writeFileSync(filePath, file.content, 'utf-8');
59
- filesWritten.push(file.path);
60
- console.log(` + ${file.path}`);
61
- }
62
-
63
- console.log(`\n[mmrc pull] Scaffolded ${filesWritten.length} files in ${outDir}/`);
64
- console.log(` Entry: ${result.entryFile}`);
65
- console.log(`\n Next steps:`);
66
- console.log(` cd ${outDir}`);
67
- console.log(` mmrc dev --src .`);
68
- console.log(` # Edit files, then deploy back:`);
69
- console.log(` mmrc deploy --src . --api-url ${apiUrl} --token <token>`);
70
-
71
- return { slug, filesWritten, outDir };
72
- }
73
-
74
- // =============================================================================
75
- // API fetch
76
- // =============================================================================
77
-
78
- async function fetchDefinition(
79
- apiUrl: string,
80
- token: string,
81
- slug: string,
82
- ): Promise<IRWorkflowDefinition | null> {
83
- // Try by slug first
84
- const bySlug = await tryFetch(`${apiUrl}/workflow/definitions?slug=${encodeURIComponent(slug)}`, token);
85
- if (bySlug) return bySlug;
86
-
87
- // Try the definitions endpoint with search
88
- const bySearch = await tryFetch(`${apiUrl}/workflow/catalog/search?q=${encodeURIComponent(slug)}`, token);
89
- if (bySearch) return bySearch;
90
-
91
- // Try modules endpoint (for category=module definitions)
92
- const modulesRes = await fetch(`${apiUrl}/modules`, {
93
- headers: { Authorization: `Bearer ${token}` },
94
- });
95
- if (modulesRes.ok) {
96
- const modules = await modulesRes.json() as any[];
97
- const mod = modules.find((m: any) => m.module_id === slug || m.name?.toLowerCase() === slug.toLowerCase());
98
- if (mod) {
99
- // Re-fetch the full definition by ID
100
- const fullRes = await fetch(`${apiUrl}/workflow/definitions/${mod.module_id}`, {
101
- headers: { Authorization: `Bearer ${token}` },
102
- });
103
- if (fullRes.ok) {
104
- return normalizeApiResponse(await fullRes.json());
105
- }
106
- }
107
- }
108
-
109
- return null;
110
- }
111
-
112
- async function tryFetch(url: string, token: string): Promise<IRWorkflowDefinition | null> {
113
- try {
114
- const res = await fetch(url, {
115
- headers: { Authorization: `Bearer ${token}` },
116
- });
117
- if (!res.ok) return null;
118
-
119
- const data = await res.json() as any;
120
-
121
- // Handle array responses (search/list endpoints)
122
- if (Array.isArray(data)) {
123
- if (data.length === 0) return null;
124
- return normalizeApiResponse(data[0]);
125
- }
126
-
127
- // Handle paginated responses (items or data key)
128
- const items = data.items ?? data.data;
129
- if (items && Array.isArray(items)) {
130
- if (items.length === 0) return null;
131
- return normalizeApiResponse(items[0]);
132
- }
133
-
134
- // Direct object
135
- return normalizeApiResponse(data);
136
- } catch {
137
- return null;
138
- }
139
- }
140
-
141
- /**
142
- * Normalize API response to IRWorkflowDefinition shape.
143
- * Backend uses `view` for experience tree, IR uses `metadata.experience`.
144
- */
145
- function normalizeApiResponse(def: any): IRWorkflowDefinition {
146
- const ir: any = {
147
- slug: def.slug,
148
- name: def.name,
149
- version: def.version || '1.0.0',
150
- description: def.description || '',
151
- category: def.category || 'workflow',
152
- fields: def.fields || [],
153
- states: def.states || [],
154
- transitions: def.transitions || [],
155
- roles: def.roles || [],
156
- on_event: def.on_event || [],
157
- metadata: {
158
- ...(def.metadata || {}),
159
- },
160
- };
161
-
162
- // The experience tree may be in `view`, `experience`, or `metadata.experience`
163
- // Must set ir.experience at top level — the decompiler checks definition.experience
164
- const experience = def.view || def.experience || def.metadata?.experience;
165
- if (experience) {
166
- ir.experience = experience;
167
- ir.metadata.experience = experience;
168
- ir.view = experience;
169
- }
170
-
171
- return ir as IRWorkflowDefinition;
172
- }