@pie-element/cli 0.1.1 → 0.1.2-next.1

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 (281) hide show
  1. package/README.md +48 -10
  2. package/dist/commands/dev/demo/index.d.ts +1 -1
  3. package/dist/commands/dev/demo/index.js +21 -0
  4. package/dist/commands/dev/demo/index.js.map +1 -1
  5. package/dist/commands/dev/test-bundler.d.ts +0 -1
  6. package/dist/commands/dev/test-bundler.js +2 -10
  7. package/dist/commands/dev/test-bundler.js.map +1 -1
  8. package/dist/commands/docs/generate.d.ts +16 -0
  9. package/dist/commands/docs/generate.js +150 -0
  10. package/dist/commands/docs/generate.js.map +1 -0
  11. package/dist/commands/docs/verify.d.ts +12 -0
  12. package/dist/commands/docs/verify.js +40 -0
  13. package/dist/commands/docs/verify.js.map +1 -0
  14. package/dist/commands/packages/create-controllers.d.ts +0 -1
  15. package/dist/commands/packages/create-controllers.js.map +1 -1
  16. package/dist/commands/packages/create-lib-react.d.ts +0 -1
  17. package/dist/commands/packages/create-lib-react.js +1 -3
  18. package/dist/commands/packages/create-lib-react.js.map +1 -1
  19. package/dist/commands/packages/create-react-elements.d.ts +0 -1
  20. package/dist/commands/packages/create-react-elements.js +2 -3
  21. package/dist/commands/packages/create-react-elements.js.map +1 -1
  22. package/dist/commands/packages/enable-publishing.d.ts +0 -1
  23. package/dist/commands/packages/enable-publishing.js +26 -23
  24. package/dist/commands/packages/enable-publishing.js.map +1 -1
  25. package/dist/commands/packages/init-synced-elements.d.ts +0 -1
  26. package/dist/commands/packages/init-synced-elements.js +1 -1
  27. package/dist/commands/packages/init-synced-elements.js.map +1 -1
  28. package/dist/commands/upstream/analyze-esm.d.ts +0 -1
  29. package/dist/commands/upstream/analyze-esm.js +5 -1
  30. package/dist/commands/upstream/analyze-esm.js.map +1 -1
  31. package/dist/commands/upstream/check.d.ts +0 -1
  32. package/dist/commands/upstream/check.js.map +1 -1
  33. package/dist/commands/upstream/deps.d.ts +0 -1
  34. package/dist/commands/upstream/deps.js.map +1 -1
  35. package/dist/commands/upstream/sync.d.ts +11 -2
  36. package/dist/commands/upstream/sync.js +364 -25
  37. package/dist/commands/upstream/sync.js.map +1 -1
  38. package/dist/commands/upstream/track.d.ts +0 -1
  39. package/dist/commands/upstream/track.js.map +1 -1
  40. package/dist/commands/upstream/update.d.ts +0 -1
  41. package/dist/commands/upstream/update.js +37 -7
  42. package/dist/commands/upstream/update.js.map +1 -1
  43. package/dist/commands/verify/controllers.d.ts +0 -1
  44. package/dist/commands/verify/controllers.js +213 -59
  45. package/dist/commands/verify/controllers.js.map +1 -1
  46. package/dist/commands/verify/dependency-integrity.d.ts +18 -0
  47. package/dist/commands/verify/dependency-integrity.js +147 -0
  48. package/dist/commands/verify/dependency-integrity.js.map +1 -0
  49. package/dist/commands/verify/react-build.d.ts +0 -1
  50. package/dist/commands/verify/react-build.js.map +1 -1
  51. package/dist/index.d.ts +0 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/lib/docs/contract-validator.d.ts +12 -0
  54. package/dist/lib/docs/contract-validator.js +38 -0
  55. package/dist/lib/docs/contract-validator.js.map +1 -0
  56. package/dist/lib/docs/contracts.d.ts +11 -0
  57. package/dist/lib/docs/contracts.js +241 -0
  58. package/dist/lib/docs/contracts.js.map +1 -0
  59. package/dist/lib/docs/discovery.d.ts +10 -0
  60. package/dist/lib/docs/discovery.js +91 -0
  61. package/dist/lib/docs/discovery.js.map +1 -0
  62. package/dist/lib/docs/generator.d.ts +14 -0
  63. package/dist/lib/docs/generator.js +450 -0
  64. package/dist/lib/docs/generator.js.map +1 -0
  65. package/dist/lib/docs/source-extractor.d.ts +2 -0
  66. package/dist/lib/docs/source-extractor.js +209 -0
  67. package/dist/lib/docs/source-extractor.js.map +1 -0
  68. package/dist/lib/docs/types.d.ts +77 -0
  69. package/dist/lib/docs/types.js +2 -0
  70. package/dist/lib/docs/types.js.map +1 -0
  71. package/dist/lib/upstream/repo-utils.d.ts +0 -1
  72. package/dist/lib/upstream/repo-utils.js.map +1 -1
  73. package/dist/lib/upstream/sync-compatibility.d.ts +0 -1
  74. package/dist/lib/upstream/sync-compatibility.js.map +1 -1
  75. package/dist/lib/upstream/sync-constants.d.ts +35 -7
  76. package/dist/lib/upstream/sync-constants.js +40 -11
  77. package/dist/lib/upstream/sync-constants.js.map +1 -1
  78. package/dist/lib/upstream/sync-controllers-strategy.d.ts +0 -1
  79. package/dist/lib/upstream/sync-controllers-strategy.js +14 -4
  80. package/dist/lib/upstream/sync-controllers-strategy.js.map +1 -1
  81. package/dist/lib/upstream/sync-demo-metadata.d.ts +0 -1
  82. package/dist/lib/upstream/sync-demo-metadata.js +1 -1
  83. package/dist/lib/upstream/sync-demo-metadata.js.map +1 -1
  84. package/dist/lib/upstream/sync-entry-discovery.d.ts +3 -0
  85. package/dist/lib/upstream/sync-entry-discovery.js +23 -0
  86. package/dist/lib/upstream/sync-entry-discovery.js.map +1 -0
  87. package/dist/lib/upstream/sync-externals.d.ts +7 -7
  88. package/dist/lib/upstream/sync-externals.js +51 -35
  89. package/dist/lib/upstream/sync-externals.js.map +1 -1
  90. package/dist/lib/upstream/sync-filesystem.d.ts +0 -1
  91. package/dist/lib/upstream/sync-filesystem.js.map +1 -1
  92. package/dist/lib/upstream/sync-imports.d.ts +82 -62
  93. package/dist/lib/upstream/sync-imports.js +658 -185
  94. package/dist/lib/upstream/sync-imports.js.map +1 -1
  95. package/dist/lib/upstream/sync-package-json.d.ts +0 -1
  96. package/dist/lib/upstream/sync-package-json.js +7 -0
  97. package/dist/lib/upstream/sync-package-json.js.map +1 -1
  98. package/dist/lib/upstream/sync-package-manager.d.ts +14 -4
  99. package/dist/lib/upstream/sync-package-manager.js +408 -72
  100. package/dist/lib/upstream/sync-package-manager.js.map +1 -1
  101. package/dist/lib/upstream/sync-pielib-strategy.d.ts +2 -1
  102. package/dist/lib/upstream/sync-pielib-strategy.js +228 -110
  103. package/dist/lib/upstream/sync-pielib-strategy.js.map +1 -1
  104. package/dist/lib/upstream/sync-presets.d.ts +53 -0
  105. package/dist/lib/upstream/sync-presets.js +203 -0
  106. package/dist/lib/upstream/sync-presets.js.map +1 -0
  107. package/dist/lib/upstream/sync-react-strategy.d.ts +6 -1
  108. package/dist/lib/upstream/sync-react-strategy.js +342 -134
  109. package/dist/lib/upstream/sync-react-strategy.js.map +1 -1
  110. package/dist/lib/upstream/sync-source-edit.d.ts +14 -0
  111. package/dist/lib/upstream/sync-source-edit.js +89 -0
  112. package/dist/lib/upstream/sync-source-edit.js.map +1 -0
  113. package/dist/lib/upstream/sync-source-tree.d.ts +22 -0
  114. package/dist/lib/upstream/sync-source-tree.js +99 -0
  115. package/dist/lib/upstream/sync-source-tree.js.map +1 -0
  116. package/dist/lib/upstream/sync-strategy.d.ts +1 -1
  117. package/dist/lib/upstream/sync-strategy.js.map +1 -1
  118. package/dist/lib/upstream/sync-summary.d.ts +0 -1
  119. package/dist/lib/upstream/sync-summary.js.map +1 -1
  120. package/dist/lib/upstream/sync-transforms.d.ts +13 -11
  121. package/dist/lib/upstream/sync-transforms.js +23 -17
  122. package/dist/lib/upstream/sync-transforms.js.map +1 -1
  123. package/dist/lib/upstream/sync-vite-config.d.ts +13 -1
  124. package/dist/lib/upstream/sync-vite-config.js +65 -46
  125. package/dist/lib/upstream/sync-vite-config.js.map +1 -1
  126. package/dist/utils/compatibility.d.ts +13 -1
  127. package/dist/utils/compatibility.js +143 -2
  128. package/dist/utils/compatibility.js.map +1 -1
  129. package/dist/utils/conversion.d.ts +0 -1
  130. package/dist/utils/conversion.js.map +1 -1
  131. package/dist/utils/dependency-integrity.d.ts +37 -0
  132. package/dist/utils/dependency-integrity.js +557 -0
  133. package/dist/utils/dependency-integrity.js.map +1 -0
  134. package/dist/utils/git.d.ts +0 -1
  135. package/dist/utils/git.js.map +1 -1
  136. package/dist/utils/logger.d.ts +0 -1
  137. package/dist/utils/logger.js.map +1 -1
  138. package/dist/utils/package-json.d.ts +0 -1
  139. package/dist/utils/package-json.js.map +1 -1
  140. package/package.json +24 -12
  141. package/.compatibility/report.json +0 -2491
  142. package/.turbo/turbo-build.log +0 -1
  143. package/CHANGELOG.md +0 -8
  144. package/REFACTORING.md +0 -131
  145. package/bin/dev.js +0 -5
  146. package/dist/commands/dev/demo/index.d.ts.map +0 -1
  147. package/dist/commands/dev/test-bundler.d.ts.map +0 -1
  148. package/dist/commands/mathquill/migrate.d.ts +0 -20
  149. package/dist/commands/mathquill/migrate.d.ts.map +0 -1
  150. package/dist/commands/mathquill/migrate.js +0 -240
  151. package/dist/commands/mathquill/migrate.js.map +0 -1
  152. package/dist/commands/mathquill/status.d.ts +0 -20
  153. package/dist/commands/mathquill/status.d.ts.map +0 -1
  154. package/dist/commands/mathquill/status.js +0 -231
  155. package/dist/commands/mathquill/status.js.map +0 -1
  156. package/dist/commands/packages/create-controllers.d.ts.map +0 -1
  157. package/dist/commands/packages/create-lib-react.d.ts.map +0 -1
  158. package/dist/commands/packages/create-react-elements.d.ts.map +0 -1
  159. package/dist/commands/packages/enable-publishing.d.ts.map +0 -1
  160. package/dist/commands/packages/init-synced-elements.d.ts.map +0 -1
  161. package/dist/commands/upstream/analyze-esm.d.ts.map +0 -1
  162. package/dist/commands/upstream/check.d.ts.map +0 -1
  163. package/dist/commands/upstream/deps.d.ts.map +0 -1
  164. package/dist/commands/upstream/sync-mathquill.d.ts +0 -12
  165. package/dist/commands/upstream/sync-mathquill.d.ts.map +0 -1
  166. package/dist/commands/upstream/sync-mathquill.js +0 -97
  167. package/dist/commands/upstream/sync-mathquill.js.map +0 -1
  168. package/dist/commands/upstream/sync.d.ts.map +0 -1
  169. package/dist/commands/upstream/track.d.ts.map +0 -1
  170. package/dist/commands/upstream/update.d.ts.map +0 -1
  171. package/dist/commands/verify/controllers.d.ts.map +0 -1
  172. package/dist/commands/verify/react-build.d.ts.map +0 -1
  173. package/dist/index.d.ts.map +0 -1
  174. package/dist/lib/mathquill/extension-generator.d.ts +0 -9
  175. package/dist/lib/mathquill/extension-generator.d.ts.map +0 -1
  176. package/dist/lib/mathquill/extension-generator.js +0 -107
  177. package/dist/lib/mathquill/extension-generator.js.map +0 -1
  178. package/dist/lib/mathquill/khan-extractor.d.ts +0 -16
  179. package/dist/lib/mathquill/khan-extractor.d.ts.map +0 -1
  180. package/dist/lib/mathquill/khan-extractor.js +0 -148
  181. package/dist/lib/mathquill/khan-extractor.js.map +0 -1
  182. package/dist/lib/mathquill/learnosity-extractor.d.ts +0 -15
  183. package/dist/lib/mathquill/learnosity-extractor.d.ts.map +0 -1
  184. package/dist/lib/mathquill/learnosity-extractor.js +0 -170
  185. package/dist/lib/mathquill/learnosity-extractor.js.map +0 -1
  186. package/dist/lib/mathquill/migration-orchestrator.d.ts +0 -77
  187. package/dist/lib/mathquill/migration-orchestrator.d.ts.map +0 -1
  188. package/dist/lib/mathquill/migration-orchestrator.js +0 -391
  189. package/dist/lib/mathquill/migration-orchestrator.js.map +0 -1
  190. package/dist/lib/mathquill/package-updater.d.ts +0 -9
  191. package/dist/lib/mathquill/package-updater.d.ts.map +0 -1
  192. package/dist/lib/mathquill/package-updater.js +0 -103
  193. package/dist/lib/mathquill/package-updater.js.map +0 -1
  194. package/dist/lib/mathquill/pie-extractor.d.ts +0 -14
  195. package/dist/lib/mathquill/pie-extractor.d.ts.map +0 -1
  196. package/dist/lib/mathquill/pie-extractor.js +0 -167
  197. package/dist/lib/mathquill/pie-extractor.js.map +0 -1
  198. package/dist/lib/upstream/repo-utils.d.ts.map +0 -1
  199. package/dist/lib/upstream/sync-compatibility.d.ts.map +0 -1
  200. package/dist/lib/upstream/sync-constants.d.ts.map +0 -1
  201. package/dist/lib/upstream/sync-controllers-strategy.d.ts.map +0 -1
  202. package/dist/lib/upstream/sync-demo-metadata.d.ts.map +0 -1
  203. package/dist/lib/upstream/sync-dev-exports.d.ts +0 -13
  204. package/dist/lib/upstream/sync-dev-exports.d.ts.map +0 -1
  205. package/dist/lib/upstream/sync-dev-exports.js +0 -115
  206. package/dist/lib/upstream/sync-dev-exports.js.map +0 -1
  207. package/dist/lib/upstream/sync-externals.d.ts.map +0 -1
  208. package/dist/lib/upstream/sync-filesystem.d.ts.map +0 -1
  209. package/dist/lib/upstream/sync-imports.d.ts.map +0 -1
  210. package/dist/lib/upstream/sync-mathquill.d.ts +0 -19
  211. package/dist/lib/upstream/sync-mathquill.d.ts.map +0 -1
  212. package/dist/lib/upstream/sync-mathquill.js +0 -160
  213. package/dist/lib/upstream/sync-mathquill.js.map +0 -1
  214. package/dist/lib/upstream/sync-package-json.d.ts.map +0 -1
  215. package/dist/lib/upstream/sync-package-manager.d.ts.map +0 -1
  216. package/dist/lib/upstream/sync-pielib-strategy.d.ts.map +0 -1
  217. package/dist/lib/upstream/sync-react-strategy.d.ts.map +0 -1
  218. package/dist/lib/upstream/sync-strategy.d.ts.map +0 -1
  219. package/dist/lib/upstream/sync-summary.d.ts.map +0 -1
  220. package/dist/lib/upstream/sync-transforms.d.ts.map +0 -1
  221. package/dist/lib/upstream/sync-vite-config.d.ts.map +0 -1
  222. package/dist/utils/compatibility.d.ts.map +0 -1
  223. package/dist/utils/conversion.d.ts.map +0 -1
  224. package/dist/utils/git.d.ts.map +0 -1
  225. package/dist/utils/logger.d.ts.map +0 -1
  226. package/dist/utils/package-json.d.ts.map +0 -1
  227. package/packages/cli/bin/dev.js +0 -5
  228. package/packages/cli/bin/run.js +0 -5
  229. package/src/commands/dev/demo/index.ts +0 -313
  230. package/src/commands/dev/test-bundler.ts +0 -345
  231. package/src/commands/mathquill/migrate.ts +0 -269
  232. package/src/commands/mathquill/status.ts +0 -267
  233. package/src/commands/packages/create-controllers.ts +0 -127
  234. package/src/commands/packages/create-lib-react.ts +0 -279
  235. package/src/commands/packages/create-react-elements.ts +0 -306
  236. package/src/commands/packages/enable-publishing.ts +0 -161
  237. package/src/commands/packages/init-synced-elements.ts +0 -259
  238. package/src/commands/upstream/README.md +0 -444
  239. package/src/commands/upstream/analyze-esm.ts +0 -1973
  240. package/src/commands/upstream/check.ts +0 -228
  241. package/src/commands/upstream/deps.ts +0 -222
  242. package/src/commands/upstream/sync-mathquill.ts +0 -108
  243. package/src/commands/upstream/sync.ts +0 -687
  244. package/src/commands/upstream/track.ts +0 -145
  245. package/src/commands/upstream/update.ts +0 -110
  246. package/src/commands/verify/controllers.ts +0 -166
  247. package/src/commands/verify/react-build.ts +0 -171
  248. package/src/index.ts +0 -1
  249. package/src/lib/mathquill/extension-generator.ts +0 -111
  250. package/src/lib/mathquill/khan-extractor.ts +0 -175
  251. package/src/lib/mathquill/learnosity-extractor.ts +0 -198
  252. package/src/lib/mathquill/migration-orchestrator.ts +0 -513
  253. package/src/lib/mathquill/package-updater.ts +0 -120
  254. package/src/lib/mathquill/pie-extractor.ts +0 -194
  255. package/src/lib/upstream/repo-utils.ts +0 -18
  256. package/src/lib/upstream/sync-compatibility.ts +0 -89
  257. package/src/lib/upstream/sync-constants.ts +0 -77
  258. package/src/lib/upstream/sync-controllers-strategy.ts +0 -291
  259. package/src/lib/upstream/sync-demo-metadata.ts +0 -199
  260. package/src/lib/upstream/sync-dev-exports.ts +0 -151
  261. package/src/lib/upstream/sync-externals.ts +0 -159
  262. package/src/lib/upstream/sync-filesystem.ts +0 -87
  263. package/src/lib/upstream/sync-imports.ts +0 -992
  264. package/src/lib/upstream/sync-mathquill.ts +0 -194
  265. package/src/lib/upstream/sync-package-json.ts +0 -86
  266. package/src/lib/upstream/sync-package-manager.ts +0 -694
  267. package/src/lib/upstream/sync-pielib-strategy.ts +0 -441
  268. package/src/lib/upstream/sync-react-strategy.ts +0 -945
  269. package/src/lib/upstream/sync-strategy.ts +0 -61
  270. package/src/lib/upstream/sync-summary.ts +0 -194
  271. package/src/lib/upstream/sync-transforms.ts +0 -154
  272. package/src/lib/upstream/sync-vite-config.ts +0 -243
  273. package/src/types/es-module-lexer.d.ts +0 -4
  274. package/src/utils/compatibility.ts +0 -182
  275. package/src/utils/conversion.ts +0 -153
  276. package/src/utils/git.ts +0 -63
  277. package/src/utils/logger.ts +0 -69
  278. package/src/utils/package-json.ts +0 -43
  279. package/tests/sync-package-manager.test.ts +0 -112
  280. package/tests/transform-assign-props.test.ts +0 -101
  281. package/tsconfig.json +0 -15
@@ -1,269 +0,0 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import { Logger } from '../../utils/logger.js';
3
- import { MigrationOrchestrator } from '../../lib/mathquill/migration-orchestrator.js';
4
- import { existsSync } from 'node:fs';
5
- import { join } from 'node:path';
6
-
7
- export default class MathQuillMigrate extends Command {
8
- static override description = `Migrate MathQuill from PIE fork to Desmos fork with patches
9
-
10
- Automates the migration from PIE's 2015 MathQuill fork to the modern Desmos fork
11
- with Khan Academy patches, Learnosity features, and PIE extensions.
12
-
13
- This command:
14
- 1. Clones Desmos, Khan, and Learnosity forks to temp directory
15
- 2. Extracts features from each fork:
16
- - Khan: Mobile keyboard fixes, i18n ARIA strings
17
- - Learnosity: Recurring decimals, nless/ngtr symbols, empty() method
18
- - PIE: Matrices (pmatrix, bmatrix, vmatrix), lrnexponent
19
- 3. Generates TypeScript extension modules with source attribution
20
- 4. Creates unified extension loader
21
- 5. Updates package.json to use Desmos fork
22
- 6. Runs automated tests
23
-
24
- The migration is repeatable - you can re-run it when forks update.
25
-
26
- After migration, review changes and test thoroughly before committing.
27
- `;
28
-
29
- static override examples = [
30
- {
31
- description: 'Show what would be migrated (dry run)',
32
- command: '<%= config.bin %> <%= command.id %> --dry-run',
33
- },
34
- {
35
- description: 'Run full migration',
36
- command: '<%= config.bin %> <%= command.id %>',
37
- },
38
- {
39
- description: 'Verbose output with detailed progress',
40
- command: '<%= config.bin %> <%= command.id %> --verbose',
41
- },
42
- {
43
- description: 'Force migration (skip confirmations)',
44
- command: '<%= config.bin %> <%= command.id %> --force',
45
- },
46
- {
47
- description: 'Skip tests',
48
- command: '<%= config.bin %> <%= command.id %> --skip-tests',
49
- },
50
- ];
51
-
52
- static override flags = {
53
- 'dry-run': Flags.boolean({
54
- description: 'Show what would be done without making changes',
55
- default: false,
56
- }),
57
- force: Flags.boolean({
58
- description: 'Skip confirmation prompts and continue on non-fatal errors',
59
- default: false,
60
- }),
61
- verbose: Flags.boolean({
62
- char: 'v',
63
- description: 'Show detailed progress output',
64
- default: false,
65
- }),
66
- 'skip-tests': Flags.boolean({
67
- description: 'Skip running tests after migration',
68
- default: false,
69
- }),
70
- 'temp-dir': Flags.string({
71
- description: 'Temporary directory for cloning forks',
72
- default: '/tmp/mathquill-migration',
73
- }),
74
- clean: Flags.boolean({
75
- description: 'Clean temporary directory before starting',
76
- default: false,
77
- }),
78
- };
79
-
80
- async run(): Promise<void> {
81
- const { flags } = await this.parse(MathQuillMigrate);
82
- const logger = new Logger(flags.verbose);
83
-
84
- // Validate workspace
85
- const workspaceRoot = process.cwd();
86
- const mathquillPath = join(workspaceRoot, 'packages/shared/mathquill');
87
-
88
- if (!existsSync(mathquillPath)) {
89
- logger.error('MathQuill package not found at: packages/shared/mathquill');
90
- logger.info('This command must be run from the workspace root');
91
- this.exit(1);
92
- }
93
-
94
- // Show banner
95
- logger.section('šŸš€ MathQuill Migration');
96
- logger.info(' Migrating from PIE fork to Desmos fork + patches\n');
97
-
98
- if (flags['dry-run']) {
99
- logger.warn('šŸƒ DRY RUN MODE - No changes will be made\n');
100
- }
101
-
102
- // Create orchestrator
103
- const orchestrator = new MigrationOrchestrator({
104
- workspaceRoot,
105
- mathquillPath,
106
- tempDir: flags['temp-dir'],
107
- dryRun: flags['dry-run'],
108
- force: flags.force,
109
- skipTests: flags['skip-tests'],
110
- clean: flags.clean,
111
- logger,
112
- });
113
-
114
- // Show configuration
115
- if (flags.verbose) {
116
- logger.section('Configuration');
117
- logger.info(` Workspace: ${workspaceRoot}`);
118
- logger.info(` MathQuill: ${mathquillPath}`);
119
- logger.info(` Temp Dir: ${flags['temp-dir']}`);
120
- logger.info(` Dry Run: ${flags['dry-run']}`);
121
- logger.info(` Force: ${flags.force}`);
122
- logger.info(` Skip Tests: ${flags['skip-tests']}\n`);
123
- }
124
-
125
- // Confirm if not in dry-run or force mode
126
- if (!flags['dry-run'] && !flags.force) {
127
- logger.warn('āš ļø This will modify packages/shared/mathquill');
128
- logger.info(' A git commit is recommended before proceeding.\n');
129
-
130
- // In a real implementation, you'd use inquirer or similar
131
- // For now, we'll just proceed
132
- logger.info(' Proceeding with migration...\n');
133
- }
134
-
135
- try {
136
- // Run migration
137
- const result = await orchestrator.migrate();
138
-
139
- if (flags['dry-run']) {
140
- this.showDryRunSummary(result, logger);
141
- } else {
142
- this.showSuccessSummary(result, logger);
143
- }
144
-
145
- if (!result.success) {
146
- this.exit(1);
147
- }
148
- } catch (error) {
149
- logger.error('\nāŒ Migration failed');
150
-
151
- if (error instanceof Error) {
152
- logger.error(` ${error.message}`);
153
- if (flags.verbose && error.stack) {
154
- logger.debug(`\n${error.stack}`);
155
- }
156
- }
157
-
158
- logger.info('\nšŸ’” Troubleshooting:');
159
- logger.info(' 1. Check internet connectivity for git clones');
160
- logger.info(' 2. Ensure temp directory is writable');
161
- logger.info(' 3. Run with --verbose for detailed output');
162
- logger.info(' 4. Try --clean to remove cached forks');
163
- logger.info(' 5. Check docs/MATHQUILL_MIGRATION_CLI_PLAN.md');
164
-
165
- this.exit(1);
166
- }
167
- }
168
-
169
- private showDryRunSummary(result: any, logger: Logger): void {
170
- logger.section('šŸ“‹ Dry Run Summary');
171
- logger.info('Would perform the following actions:\n');
172
-
173
- logger.info('šŸ“‚ Prepare environment:');
174
- logger.info(` • Create temp directory: ${result.tempDir}`);
175
- logger.info(' • Create extension directories\n');
176
-
177
- logger.info('šŸ”„ Clone forks:');
178
- logger.info(' • Desmos fork (desmosinc/mathquill)');
179
- logger.info(' • Khan fork (Khan/mathquill v1.0.3)');
180
- logger.info(' • Learnosity fork (Learnosity/mathquill)\n');
181
-
182
- logger.info('šŸ“¦ Extract features:');
183
- logger.info(' Khan Academy:');
184
- logger.info(' • mobile-keyboard.ts (Android keyboard fixes)');
185
- logger.info(' • i18n-aria.ts (Internationalized ARIA strings)');
186
- logger.info(' Learnosity:');
187
- logger.info(' • recurring-decimal.ts (Recurring decimal dot)');
188
- logger.info(' • not-symbols.ts (nless, ngtr symbols)');
189
- logger.info(' • empty-method.ts (Check if field is empty)');
190
- logger.info(' PIE:');
191
- logger.info(' • matrices.ts (pmatrix, bmatrix, vmatrix)');
192
- logger.info(' • lrn-exponent.ts (LRN exponent notation)\n');
193
-
194
- logger.info('šŸ”Ø Generate:');
195
- logger.info(' • Extension loader (src/extensions/index.ts)\n');
196
-
197
- logger.info('šŸ“ Update:');
198
- logger.info(' • Install: mathquill@github:desmosinc/mathquill');
199
- logger.info(' • Update: package.json with migration metadata\n');
200
-
201
- logger.info('🧪 Test:');
202
- logger.info(' • Run unit tests');
203
- logger.info(' • Run integration tests\n');
204
-
205
- logger.success('Dry run complete!');
206
- logger.info('\nRun without --dry-run to execute migration.');
207
- }
208
-
209
- private showSuccessSummary(result: any, logger: Logger): void {
210
- logger.section('āœ… Migration Complete!');
211
-
212
- logger.info('\nšŸ“Š Summary:');
213
- logger.info(` Base: Desmos fork (${result.desmos?.commit || 'latest'})`);
214
- logger.info(` + Khan: ${result.khan?.featuresCount || 0} patches applied`);
215
- logger.info(` + Learnosity: ${result.learnosity?.featuresCount || 0} features added`);
216
- logger.info(` + PIE: ${result.pie?.featuresCount || 0} extensions ported`);
217
-
218
- if (result.files && result.files.length > 0) {
219
- logger.info('\nšŸ“‚ Generated Files:');
220
- logger.info(' packages/shared/mathquill/src/extensions/');
221
- logger.info(' ā”œā”€ā”€ khan/');
222
- logger.info(' │ ā”œā”€ā”€ mobile-keyboard.ts');
223
- logger.info(' │ └── i18n-aria.ts');
224
- logger.info(' ā”œā”€ā”€ learnosity/');
225
- logger.info(' │ ā”œā”€ā”€ recurring-decimal.ts');
226
- logger.info(' │ ā”œā”€ā”€ not-symbols.ts');
227
- logger.info(' │ └── empty-method.ts');
228
- logger.info(' ā”œā”€ā”€ pie/');
229
- logger.info(' │ ā”œā”€ā”€ matrices.ts');
230
- logger.info(' │ └── lrn-exponent.ts');
231
- logger.info(' └── index.ts (loader)');
232
- }
233
-
234
- if (result.tests) {
235
- logger.info('\n🧪 Tests:');
236
- if (result.tests.unit?.passed) {
237
- logger.success(` Unit tests: ${result.tests.unit.passed} passed`);
238
- }
239
- if (result.tests.integration?.passed) {
240
- logger.success(` Integration tests: ${result.tests.integration.passed} passed`);
241
- }
242
- if (result.tests.warnings && result.tests.warnings.length > 0) {
243
- logger.warn(` Warnings: ${result.tests.warnings.length}`);
244
- }
245
- }
246
-
247
- logger.info('\nšŸ“ Next Steps:');
248
- logger.info(' 1. Review changes:');
249
- logger.info(' git diff packages/shared/mathquill');
250
- logger.info(' 2. Build package:');
251
- logger.info(' cd packages/shared/mathquill && bun run build');
252
- logger.info(' 3. Test in demo:');
253
- logger.info(' bun run dev:demo');
254
- logger.info(' 4. Verify migration:');
255
- logger.info(' pie mathquill:status');
256
- logger.info(' 5. Run full test suite:');
257
- logger.info(' bun test packages/lib-react/math-input');
258
- logger.info(' bun test packages/elements-react/math-inline');
259
- logger.info(' 6. Commit changes:');
260
- logger.info(' git add packages/shared/mathquill');
261
- logger.info(' git commit -m "Migrate MathQuill to Desmos fork + patches"');
262
-
263
- logger.info('\nšŸ’” Tips:');
264
- logger.info(' • Review docs/MATHQUILL_MIGRATION_PLAN.md for details');
265
- logger.info(' • Check docs/MATHQUILL_FORK_ANALYSIS.md for fork comparison');
266
- logger.info(' • Run "pie mathquill:status" to verify migration state');
267
- logger.info(' • Keep /tmp/mathquill-migration for re-running migration\n');
268
- }
269
- }
@@ -1,267 +0,0 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import { Logger } from '../../utils/logger.js';
3
- import { existsSync, readFileSync } from 'node:fs';
4
- import { join } from 'node:path';
5
-
6
- export default class MathQuillStatus extends Command {
7
- static override description = `Show MathQuill migration status
8
-
9
- Displays the current state of the MathQuill migration:
10
- - Current version and source
11
- - Migration state (pending, in-progress, complete)
12
- - Installed fork versions (Desmos, Khan patches, Learnosity features)
13
- - Extracted features and extensions
14
- - Test results
15
- - Next steps
16
-
17
- Use this to verify migration success or check what needs to be done.
18
- `;
19
-
20
- static override examples = [
21
- {
22
- description: 'Show migration status',
23
- command: '<%= config.bin %> <%= command.id %>',
24
- },
25
- {
26
- description: 'Verbose output with file details',
27
- command: '<%= config.bin %> <%= command.id %> --verbose',
28
- },
29
- ];
30
-
31
- static override flags = {
32
- verbose: Flags.boolean({
33
- char: 'v',
34
- description: 'Show detailed information',
35
- default: false,
36
- }),
37
- };
38
-
39
- async run(): Promise<void> {
40
- const { flags } = await this.parse(MathQuillStatus);
41
- const logger = new Logger(flags.verbose);
42
-
43
- const workspaceRoot = process.cwd();
44
- const mathquillPath = join(workspaceRoot, 'packages/shared/mathquill');
45
-
46
- if (!existsSync(mathquillPath)) {
47
- logger.error('MathQuill package not found at: packages/shared/mathquill');
48
- this.exit(1);
49
- }
50
-
51
- logger.section('šŸ“Š MathQuill Status');
52
-
53
- // Read package.json
54
- const pkgPath = join(mathquillPath, 'package.json');
55
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
56
-
57
- // Determine migration state
58
- const isLegacy = existsSync(join(mathquillPath, 'src/legacy/mathquill-bundle.js'));
59
- const hasExtensions = existsSync(join(mathquillPath, 'src/extensions'));
60
- const hasLoader = existsSync(join(mathquillPath, 'src/extensions/index.ts'));
61
- const migrationConfig = this.loadMigrationConfig(mathquillPath);
62
-
63
- // Current state
64
- this.log('\nšŸ“¦ Current Configuration:');
65
- this.log(` Package: ${pkg.name}@${pkg.version}`);
66
- this.log(` Source: ${this.detectSource(pkg, isLegacy, hasExtensions)}`);
67
-
68
- if (pkg.dependencies?.mathquill) {
69
- const dep = pkg.dependencies.mathquill;
70
- if (dep.includes('desmosinc')) {
71
- this.log(` Fork: Desmos (${dep})`);
72
- } else if (dep.includes('Khan')) {
73
- this.log(` Fork: Khan Academy (${dep})`);
74
- } else if (dep.includes('Learnosity')) {
75
- this.log(` Fork: Learnosity (${dep})`);
76
- } else {
77
- this.log(` Fork: ${dep}`);
78
- }
79
- }
80
-
81
- // Migration state
82
- this.log('\nšŸ”„ Migration State:');
83
- const migrationState = this.determineMigrationState(
84
- isLegacy,
85
- hasExtensions,
86
- hasLoader,
87
- migrationConfig
88
- );
89
- this.log(` Status: ${migrationState.status} ${migrationState.icon}`);
90
- if (migrationState.detail) {
91
- this.log(` Detail: ${migrationState.detail}`);
92
- }
93
-
94
- // Extension state
95
- if (hasExtensions) {
96
- this.log('\nšŸ”§ Extensions:');
97
- this.showExtensionStatus(mathquillPath, flags.verbose, logger);
98
- }
99
-
100
- // Migration metadata
101
- if (migrationConfig) {
102
- this.log('\nšŸ“‹ Migration Metadata:');
103
- this.showMigrationMetadata(migrationConfig);
104
- }
105
-
106
- // Next steps
107
- this.log('\nšŸ“ Next Steps:');
108
- this.showNextSteps(migrationState.status, isLegacy, hasExtensions);
109
-
110
- this.log('');
111
- }
112
-
113
- private detectSource(_pkg: any, isLegacy: boolean, hasExtensions: boolean): string {
114
- if (hasExtensions && !isLegacy) {
115
- return 'Desmos fork + patches (migrated)';
116
- }
117
- if (isLegacy) {
118
- return 'PIE fork (legacy - needs migration)';
119
- }
120
- return 'Unknown';
121
- }
122
-
123
- private determineMigrationState(
124
- isLegacy: boolean,
125
- hasExtensions: boolean,
126
- hasLoader: boolean,
127
- _config: any
128
- ): { status: string; icon: string; detail?: string } {
129
- if (!isLegacy && hasExtensions && hasLoader) {
130
- return {
131
- status: 'Complete',
132
- icon: 'āœ…',
133
- detail: 'Migration successful',
134
- };
135
- }
136
-
137
- if (hasExtensions && !hasLoader) {
138
- return {
139
- status: 'In Progress',
140
- icon: 'āš ļø',
141
- detail: 'Extensions exist but loader missing',
142
- };
143
- }
144
-
145
- if (isLegacy && !hasExtensions) {
146
- return {
147
- status: 'Pending',
148
- icon: 'šŸ“‹',
149
- detail: 'Legacy fork still in use',
150
- };
151
- }
152
-
153
- if (isLegacy && hasExtensions) {
154
- return {
155
- status: 'Transitioning',
156
- icon: 'šŸ”„',
157
- detail: 'Both legacy and new extensions present',
158
- };
159
- }
160
-
161
- return {
162
- status: 'Unknown',
163
- icon: 'ā“',
164
- detail: 'Unexpected state',
165
- };
166
- }
167
-
168
- private showExtensionStatus(mathquillPath: string, verbose: boolean, _logger: Logger): void {
169
- const extensionDirs = [
170
- { name: 'Khan', path: 'src/extensions/khan' },
171
- { name: 'Learnosity', path: 'src/extensions/learnosity' },
172
- { name: 'PIE', path: 'src/extensions/pie' },
173
- ];
174
-
175
- for (const ext of extensionDirs) {
176
- const fullPath = join(mathquillPath, ext.path);
177
- if (existsSync(fullPath)) {
178
- const files = this.countTypeScriptFiles(fullPath);
179
- this.log(` ${ext.name}: ${files} file(s) āœ“`);
180
-
181
- if (verbose) {
182
- const indexExists = existsSync(join(fullPath, 'index.ts'));
183
- this.log(` • index.ts: ${indexExists ? 'āœ“' : 'āœ—'}`);
184
- }
185
- } else {
186
- this.log(` ${ext.name}: Not found āœ—`);
187
- }
188
- }
189
-
190
- const loaderPath = join(mathquillPath, 'src/extensions/index.ts');
191
- if (existsSync(loaderPath)) {
192
- this.log(` Loader: āœ“`);
193
- } else {
194
- this.log(` Loader: āœ— (Missing extension loader)`);
195
- }
196
- }
197
-
198
- private countTypeScriptFiles(dir: string): number {
199
- if (!existsSync(dir)) return 0;
200
-
201
- try {
202
- const { readdirSync } = require('node:fs');
203
- const files = readdirSync(dir);
204
- return files.filter((f: string) => f.endsWith('.ts') || f.endsWith('.tsx')).length;
205
- } catch {
206
- return 0;
207
- }
208
- }
209
-
210
- private loadMigrationConfig(mathquillPath: string): any {
211
- const configPath = join(mathquillPath, 'migration-config.json');
212
- if (!existsSync(configPath)) {
213
- return null;
214
- }
215
-
216
- try {
217
- return JSON.parse(readFileSync(configPath, 'utf-8'));
218
- } catch {
219
- return null;
220
- }
221
- }
222
-
223
- private showMigrationMetadata(config: any): void {
224
- if (config.version) {
225
- this.log(` Version: ${config.version}`);
226
- }
227
- if (config.lastMigration) {
228
- this.log(` Last run: ${new Date(config.lastMigration).toLocaleString()}`);
229
- }
230
- if (config.base?.installed) {
231
- this.log(` Base fork: ${config.base.fork}@${config.base.installed}`);
232
- }
233
- if (config.migrationState) {
234
- this.log(` State: ${config.migrationState}`);
235
- }
236
- }
237
-
238
- private showNextSteps(status: string, isLegacy: boolean, _hasExtensions: boolean): void {
239
- if (status === 'Complete') {
240
- this.log(' āœ… Migration complete!');
241
- this.log(' • Build: cd packages/shared/mathquill && bun run build');
242
- this.log(' • Test: bun test packages/lib-react/math-input');
243
- this.log(' • Demo: bun run dev:demo');
244
- return;
245
- }
246
-
247
- if (status === 'Pending' && isLegacy) {
248
- this.log(' šŸ“‹ Migration needed');
249
- this.log(' 1. Run: pie mathquill:migrate --dry-run');
250
- this.log(' 2. Review the migration plan');
251
- this.log(' 3. Run: pie mathquill:migrate');
252
- this.log(' 4. Test thoroughly before committing');
253
- return;
254
- }
255
-
256
- if (status === 'In Progress' || status === 'Transitioning') {
257
- this.log(' āš ļø Migration incomplete');
258
- this.log(' 1. Check for errors: pie mathquill:migrate --verbose');
259
- this.log(' 2. Or re-run: pie mathquill:migrate --force');
260
- return;
261
- }
262
-
263
- this.log(' ā“ Unknown state - check documentation');
264
- this.log(' • See: docs/MATHQUILL_MIGRATION_PLAN.md');
265
- this.log(' • See: docs/MATHQUILL_MIGRATION_CLI_PLAN.md');
266
- }
267
- }
@@ -1,127 +0,0 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import { Logger } from '../../utils/logger.js';
3
- import { extractDependencies } from '../../utils/package-json.js';
4
- import { existsSync } from 'node:fs';
5
- import { readdir, readFile, writeFile } from 'node:fs/promises';
6
- import { join } from 'node:path';
7
-
8
- const SHARED_DIR = 'packages/shared';
9
-
10
- export default class CreateControllers extends Command {
11
- static override description = 'Create package.json files for synced controllers';
12
-
13
- static override examples = ['<%= config.bin %> <%= command.id %>'];
14
-
15
- static override flags = {
16
- verbose: Flags.boolean({
17
- char: 'v',
18
- description: 'Show detailed output',
19
- default: false,
20
- }),
21
- };
22
-
23
- private logger = new Logger();
24
-
25
- public async run(): Promise<void> {
26
- const { flags } = await this.parse(CreateControllers);
27
-
28
- this.logger = new Logger(flags.verbose);
29
-
30
- this.logger.section('šŸ“¦ Creating package.json files for controllers');
31
-
32
- const controllers = await readdir(SHARED_DIR);
33
- let created = 0;
34
- let skipped = 0;
35
-
36
- for (const controller of controllers) {
37
- const controllerDir = join(SHARED_DIR, controller);
38
- const packageJsonPath = join(controllerDir, 'package.json');
39
-
40
- // Skip if package.json already exists
41
- if (existsSync(packageJsonPath)) {
42
- this.logger.info(` ā­ļø ${controller}: package.json already exists`);
43
- skipped++;
44
- continue;
45
- }
46
-
47
- // Scan for dependencies
48
- const deps = await this.scanController(controllerDir);
49
-
50
- // Generate package.json
51
- const content = this.generatePackageJson(controller, deps);
52
-
53
- // Write file
54
- await writeFile(packageJsonPath, content, 'utf-8');
55
- this.logger.success(` āœ… ${controller}: Created package.json (${deps.length} dependencies)`);
56
- created++;
57
- }
58
-
59
- this.logger.section(`\nšŸ“Š Summary: ${created} created, ${skipped} skipped`);
60
- }
61
-
62
- private async scanController(controllerDir: string): Promise<string[]> {
63
- const srcDir = join(controllerDir, 'src');
64
- const deps = new Set<string>();
65
-
66
- if (!existsSync(srcDir)) {
67
- return [];
68
- }
69
-
70
- const files = await readdir(srcDir);
71
-
72
- for (const file of files) {
73
- if (!file.endsWith('.ts')) continue;
74
-
75
- const filePath = join(srcDir, file);
76
- const content = await readFile(filePath, 'utf-8');
77
- const fileDeps = extractDependencies(content);
78
-
79
- for (const dep of fileDeps) deps.add(dep);
80
- }
81
-
82
- return Array.from(deps).sort();
83
- }
84
-
85
- private generatePackageJson(name: string, deps: string[]): string {
86
- const dependencies: Record<string, string> = {};
87
-
88
- for (const dep of deps) {
89
- // Use * for external dependencies (they're in root package.json)
90
- dependencies[dep] = '*';
91
- }
92
-
93
- const pkg = {
94
- name: `@pie-element/${name}`,
95
- version: '0.1.0',
96
- description: `Framework-agnostic ${name.replace('-controller', '')} controller synced from pie-elements`,
97
- type: 'module',
98
- main: './src/index.ts',
99
- types: './src/index.ts',
100
- exports: {
101
- '.': {
102
- types: './src/index.ts',
103
- default: './src/index.ts',
104
- },
105
- },
106
- files: ['src'],
107
- scripts: {
108
- build: "echo 'Controllers are consumed as TypeScript source'",
109
- lint: 'biome check .',
110
- 'lint:fix': 'biome check --write .',
111
- },
112
- dependencies: Object.keys(dependencies).length > 0 ? dependencies : undefined,
113
- keywords: ['pie', 'pie-element', 'controller', name.replace('-controller', ''), 'assessment'],
114
- license: 'ISC',
115
- repository: {
116
- type: 'git',
117
- url: 'https://github.com/pie-framework/pie-elements-ng.git',
118
- directory: `packages/shared/${name}`,
119
- },
120
- };
121
-
122
- // Remove undefined fields
123
- const cleaned = JSON.parse(JSON.stringify(pkg));
124
-
125
- return `${JSON.stringify(cleaned, null, 2)}\n`;
126
- }
127
- }