@plures/praxis 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/FRAMEWORK.md +420 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1310 -0
  4. package/dist/adapters/cli.d.ts +43 -0
  5. package/dist/adapters/cli.d.ts.map +1 -0
  6. package/dist/adapters/cli.js +126 -0
  7. package/dist/adapters/cli.js.map +1 -0
  8. package/dist/cli/commands/auth.d.ts +26 -0
  9. package/dist/cli/commands/auth.d.ts.map +1 -0
  10. package/dist/cli/commands/auth.js +233 -0
  11. package/dist/cli/commands/auth.js.map +1 -0
  12. package/dist/cli/commands/cloud.d.ts +27 -0
  13. package/dist/cli/commands/cloud.d.ts.map +1 -0
  14. package/dist/cli/commands/cloud.js +232 -0
  15. package/dist/cli/commands/cloud.js.map +1 -0
  16. package/dist/cli/commands/generate.d.ts +25 -0
  17. package/dist/cli/commands/generate.d.ts.map +1 -0
  18. package/dist/cli/commands/generate.js +168 -0
  19. package/dist/cli/commands/generate.js.map +1 -0
  20. package/dist/cli/index.d.ts +8 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +179 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cloud/auth.d.ts +51 -0
  25. package/dist/cloud/auth.d.ts.map +1 -0
  26. package/dist/cloud/auth.js +194 -0
  27. package/dist/cloud/auth.js.map +1 -0
  28. package/dist/cloud/billing.d.ts +184 -0
  29. package/dist/cloud/billing.d.ts.map +1 -0
  30. package/dist/cloud/billing.js +179 -0
  31. package/dist/cloud/billing.js.map +1 -0
  32. package/dist/cloud/client.d.ts +39 -0
  33. package/dist/cloud/client.d.ts.map +1 -0
  34. package/dist/cloud/client.js +176 -0
  35. package/dist/cloud/client.js.map +1 -0
  36. package/dist/cloud/index.d.ts +44 -0
  37. package/dist/cloud/index.d.ts.map +1 -0
  38. package/dist/cloud/index.js +44 -0
  39. package/dist/cloud/index.js.map +1 -0
  40. package/dist/cloud/marketplace.d.ts +166 -0
  41. package/dist/cloud/marketplace.d.ts.map +1 -0
  42. package/dist/cloud/marketplace.js +159 -0
  43. package/dist/cloud/marketplace.js.map +1 -0
  44. package/dist/cloud/provisioning.d.ts +110 -0
  45. package/dist/cloud/provisioning.d.ts.map +1 -0
  46. package/dist/cloud/provisioning.js +148 -0
  47. package/dist/cloud/provisioning.js.map +1 -0
  48. package/dist/cloud/relay/endpoints.d.ts +62 -0
  49. package/dist/cloud/relay/endpoints.d.ts.map +1 -0
  50. package/dist/cloud/relay/endpoints.js +217 -0
  51. package/dist/cloud/relay/endpoints.js.map +1 -0
  52. package/dist/cloud/relay/health/index.d.ts +5 -0
  53. package/dist/cloud/relay/health/index.d.ts.map +1 -0
  54. package/dist/cloud/relay/health/index.js +9 -0
  55. package/dist/cloud/relay/health/index.js.map +1 -0
  56. package/dist/cloud/relay/stats/index.d.ts +5 -0
  57. package/dist/cloud/relay/stats/index.d.ts.map +1 -0
  58. package/dist/cloud/relay/stats/index.js +9 -0
  59. package/dist/cloud/relay/stats/index.js.map +1 -0
  60. package/dist/cloud/relay/sync/index.d.ts +5 -0
  61. package/dist/cloud/relay/sync/index.d.ts.map +1 -0
  62. package/dist/cloud/relay/sync/index.js +9 -0
  63. package/dist/cloud/relay/sync/index.js.map +1 -0
  64. package/dist/cloud/relay/usage/index.d.ts +5 -0
  65. package/dist/cloud/relay/usage/index.d.ts.map +1 -0
  66. package/dist/cloud/relay/usage/index.js +9 -0
  67. package/dist/cloud/relay/usage/index.js.map +1 -0
  68. package/dist/cloud/sponsors.d.ts +81 -0
  69. package/dist/cloud/sponsors.d.ts.map +1 -0
  70. package/dist/cloud/sponsors.js +130 -0
  71. package/dist/cloud/sponsors.js.map +1 -0
  72. package/dist/cloud/types.d.ts +169 -0
  73. package/dist/cloud/types.d.ts.map +1 -0
  74. package/dist/cloud/types.js +7 -0
  75. package/dist/cloud/types.js.map +1 -0
  76. package/dist/components/index.d.ts +43 -0
  77. package/dist/components/index.d.ts.map +1 -0
  78. package/dist/components/index.js +17 -0
  79. package/dist/components/index.js.map +1 -0
  80. package/dist/core/actors.d.ts +95 -0
  81. package/dist/core/actors.d.ts.map +1 -0
  82. package/dist/core/actors.js +158 -0
  83. package/dist/core/actors.js.map +1 -0
  84. package/dist/core/component/generator.d.ts +122 -0
  85. package/dist/core/component/generator.d.ts.map +1 -0
  86. package/dist/core/component/generator.js +307 -0
  87. package/dist/core/component/generator.js.map +1 -0
  88. package/dist/core/engine.d.ts +92 -0
  89. package/dist/core/engine.d.ts.map +1 -0
  90. package/dist/core/engine.js +199 -0
  91. package/dist/core/engine.js.map +1 -0
  92. package/dist/core/introspection.d.ts +141 -0
  93. package/dist/core/introspection.d.ts.map +1 -0
  94. package/dist/core/introspection.js +208 -0
  95. package/dist/core/introspection.js.map +1 -0
  96. package/dist/core/logic/generator.d.ts +76 -0
  97. package/dist/core/logic/generator.d.ts.map +1 -0
  98. package/dist/core/logic/generator.js +339 -0
  99. package/dist/core/logic/generator.js.map +1 -0
  100. package/dist/core/pluresdb/generator.d.ts +58 -0
  101. package/dist/core/pluresdb/generator.d.ts.map +1 -0
  102. package/dist/core/pluresdb/generator.js +162 -0
  103. package/dist/core/pluresdb/generator.js.map +1 -0
  104. package/dist/core/protocol.d.ts +121 -0
  105. package/dist/core/protocol.d.ts.map +1 -0
  106. package/dist/core/protocol.js +46 -0
  107. package/dist/core/protocol.js.map +1 -0
  108. package/dist/core/rules.d.ts +120 -0
  109. package/dist/core/rules.d.ts.map +1 -0
  110. package/dist/core/rules.js +81 -0
  111. package/dist/core/rules.js.map +1 -0
  112. package/dist/core/schema/loader.d.ts +47 -0
  113. package/dist/core/schema/loader.d.ts.map +1 -0
  114. package/dist/core/schema/loader.js +189 -0
  115. package/dist/core/schema/loader.js.map +1 -0
  116. package/dist/core/schema/normalize.d.ts +72 -0
  117. package/dist/core/schema/normalize.d.ts.map +1 -0
  118. package/dist/core/schema/normalize.js +190 -0
  119. package/dist/core/schema/normalize.js.map +1 -0
  120. package/dist/core/schema/types.d.ts +370 -0
  121. package/dist/core/schema/types.d.ts.map +1 -0
  122. package/dist/core/schema/types.js +161 -0
  123. package/dist/core/schema/types.js.map +1 -0
  124. package/dist/dsl/index.d.ts +152 -0
  125. package/dist/dsl/index.d.ts.map +1 -0
  126. package/dist/dsl/index.js +132 -0
  127. package/dist/dsl/index.js.map +1 -0
  128. package/dist/dsl.d.ts +124 -0
  129. package/dist/dsl.d.ts.map +1 -0
  130. package/dist/dsl.js +130 -0
  131. package/dist/dsl.js.map +1 -0
  132. package/dist/examples/advanced-todo/index.d.ts +55 -0
  133. package/dist/examples/advanced-todo/index.d.ts.map +1 -0
  134. package/dist/examples/advanced-todo/index.js +222 -0
  135. package/dist/examples/advanced-todo/index.js.map +1 -0
  136. package/dist/examples/auth-basic/index.d.ts +17 -0
  137. package/dist/examples/auth-basic/index.d.ts.map +1 -0
  138. package/dist/examples/auth-basic/index.js +122 -0
  139. package/dist/examples/auth-basic/index.js.map +1 -0
  140. package/dist/examples/cart/index.d.ts +19 -0
  141. package/dist/examples/cart/index.d.ts.map +1 -0
  142. package/dist/examples/cart/index.js +202 -0
  143. package/dist/examples/cart/index.js.map +1 -0
  144. package/dist/examples/hero-ecommerce/index.d.ts +39 -0
  145. package/dist/examples/hero-ecommerce/index.d.ts.map +1 -0
  146. package/dist/examples/hero-ecommerce/index.js +506 -0
  147. package/dist/examples/hero-ecommerce/index.js.map +1 -0
  148. package/dist/examples/svelte-counter/index.d.ts +31 -0
  149. package/dist/examples/svelte-counter/index.d.ts.map +1 -0
  150. package/dist/examples/svelte-counter/index.js +123 -0
  151. package/dist/examples/svelte-counter/index.js.map +1 -0
  152. package/dist/flows.d.ts +125 -0
  153. package/dist/flows.d.ts.map +1 -0
  154. package/dist/flows.js +160 -0
  155. package/dist/flows.js.map +1 -0
  156. package/dist/index.d.ts +67 -0
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +59 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/integrations/pluresdb.d.ts +56 -0
  161. package/dist/integrations/pluresdb.d.ts.map +1 -0
  162. package/dist/integrations/pluresdb.js +46 -0
  163. package/dist/integrations/pluresdb.js.map +1 -0
  164. package/dist/integrations/svelte.d.ts +306 -0
  165. package/dist/integrations/svelte.d.ts.map +1 -0
  166. package/dist/integrations/svelte.js +447 -0
  167. package/dist/integrations/svelte.js.map +1 -0
  168. package/dist/registry.d.ts +94 -0
  169. package/dist/registry.d.ts.map +1 -0
  170. package/dist/registry.js +181 -0
  171. package/dist/registry.js.map +1 -0
  172. package/dist/runtime/terminal-adapter.d.ts +105 -0
  173. package/dist/runtime/terminal-adapter.d.ts.map +1 -0
  174. package/dist/runtime/terminal-adapter.js +113 -0
  175. package/dist/runtime/terminal-adapter.js.map +1 -0
  176. package/dist/step.d.ts +34 -0
  177. package/dist/step.d.ts.map +1 -0
  178. package/dist/step.js +111 -0
  179. package/dist/step.js.map +1 -0
  180. package/dist/types.d.ts +63 -0
  181. package/dist/types.d.ts.map +1 -0
  182. package/dist/types.js +6 -0
  183. package/dist/types.js.map +1 -0
  184. package/docs/MONETIZATION.md +394 -0
  185. package/docs/TERMINAL_NODE.md +588 -0
  186. package/docs/guides/canvas.md +389 -0
  187. package/docs/guides/getting-started.md +347 -0
  188. package/docs/guides/history-state-pattern.md +618 -0
  189. package/docs/guides/orchestration.md +617 -0
  190. package/docs/guides/parallel-state-pattern.md +767 -0
  191. package/docs/guides/svelte-integration.md +691 -0
  192. package/package.json +96 -0
  193. package/src/__tests__/actors.test.ts +270 -0
  194. package/src/__tests__/billing.test.ts +175 -0
  195. package/src/__tests__/cloud.test.ts +247 -0
  196. package/src/__tests__/dsl.test.ts +154 -0
  197. package/src/__tests__/edge-cases.test.ts +475 -0
  198. package/src/__tests__/engine.test.ts +137 -0
  199. package/src/__tests__/generators.test.ts +270 -0
  200. package/src/__tests__/introspection.test.ts +321 -0
  201. package/src/__tests__/protocol.test.ts +40 -0
  202. package/src/__tests__/provisioning.test.ts +162 -0
  203. package/src/__tests__/schema.test.ts +241 -0
  204. package/src/__tests__/svelte-integration.test.ts +431 -0
  205. package/src/__tests__/terminal-node.test.ts +352 -0
  206. package/src/adapters/cli.ts +175 -0
  207. package/src/cli/commands/auth.ts +271 -0
  208. package/src/cli/commands/cloud.ts +281 -0
  209. package/src/cli/commands/generate.ts +225 -0
  210. package/src/cli/index.ts +190 -0
  211. package/src/cloud/README.md +383 -0
  212. package/src/cloud/auth.ts +245 -0
  213. package/src/cloud/billing.ts +336 -0
  214. package/src/cloud/client.ts +221 -0
  215. package/src/cloud/index.ts +121 -0
  216. package/src/cloud/marketplace.ts +303 -0
  217. package/src/cloud/provisioning.ts +254 -0
  218. package/src/cloud/relay/endpoints.ts +307 -0
  219. package/src/cloud/relay/health/function.json +17 -0
  220. package/src/cloud/relay/health/index.ts +10 -0
  221. package/src/cloud/relay/host.json +15 -0
  222. package/src/cloud/relay/local.settings.json +8 -0
  223. package/src/cloud/relay/stats/function.json +17 -0
  224. package/src/cloud/relay/stats/index.ts +10 -0
  225. package/src/cloud/relay/sync/function.json +17 -0
  226. package/src/cloud/relay/sync/index.ts +10 -0
  227. package/src/cloud/relay/usage/function.json +17 -0
  228. package/src/cloud/relay/usage/index.ts +10 -0
  229. package/src/cloud/sponsors.ts +213 -0
  230. package/src/cloud/types.ts +198 -0
  231. package/src/components/README.md +125 -0
  232. package/src/components/TerminalNode.svelte +457 -0
  233. package/src/components/index.ts +46 -0
  234. package/src/core/actors.ts +205 -0
  235. package/src/core/component/generator.ts +432 -0
  236. package/src/core/engine.ts +243 -0
  237. package/src/core/introspection.ts +329 -0
  238. package/src/core/logic/generator.ts +420 -0
  239. package/src/core/pluresdb/generator.ts +229 -0
  240. package/src/core/protocol.ts +132 -0
  241. package/src/core/rules.ts +167 -0
  242. package/src/core/schema/loader.ts +247 -0
  243. package/src/core/schema/normalize.ts +322 -0
  244. package/src/core/schema/types.ts +557 -0
  245. package/src/dsl/index.ts +218 -0
  246. package/src/dsl.ts +214 -0
  247. package/src/examples/advanced-todo/App.svelte +506 -0
  248. package/src/examples/advanced-todo/README.md +371 -0
  249. package/src/examples/advanced-todo/index.ts +309 -0
  250. package/src/examples/auth-basic/index.ts +163 -0
  251. package/src/examples/cart/index.ts +259 -0
  252. package/src/examples/hero-ecommerce/index.ts +657 -0
  253. package/src/examples/svelte-counter/index.ts +168 -0
  254. package/src/flows.ts +268 -0
  255. package/src/index.ts +154 -0
  256. package/src/integrations/pluresdb.ts +93 -0
  257. package/src/integrations/svelte.ts +617 -0
  258. package/src/registry.ts +223 -0
  259. package/src/runtime/terminal-adapter.ts +175 -0
  260. package/src/step.ts +151 -0
  261. package/src/types.ts +70 -0
  262. package/templates/basic-app/README.md +147 -0
  263. package/templates/fullstack-app/README.md +279 -0
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Praxis Generate Command
3
+ *
4
+ * Generates code from Praxis schema files.
5
+ */
6
+
7
+ import { mkdir, writeFile } from 'fs/promises';
8
+ import { dirname, resolve } from 'path';
9
+ import { loadSchemaFromFile, validateForGeneration } from '../../core/schema/loader.js';
10
+ import { normalizeSchema, type NormalizedSchema } from '../../core/schema/normalize.js';
11
+ import { createLogicGenerator } from '../../core/logic/generator.js';
12
+ import { createComponentGenerator } from '../../core/component/generator.js';
13
+ import { createPluresDBGenerator } from '../../core/pluresdb/generator.js';
14
+
15
+ /**
16
+ * Generate command options
17
+ */
18
+ export interface GenerateOptions {
19
+ /** Schema file path */
20
+ schema?: string;
21
+ /** Generation target */
22
+ target?: 'all' | 'logic' | 'components' | 'pluresdb';
23
+ /** Output directory */
24
+ output?: string;
25
+ /** Watch mode */
26
+ watch?: boolean;
27
+ /** Auto-indexing strategy for PluresDB: 'all' (default), 'explicit', or 'none' */
28
+ autoIndex?: 'all' | 'explicit' | 'none';
29
+ }
30
+
31
+ /**
32
+ * Execute the generate command
33
+ */
34
+ export async function generate(options: GenerateOptions): Promise<void> {
35
+ try {
36
+ // Determine schema file path
37
+ const schemaPath = options.schema || './praxis.schema.js';
38
+ const resolvedSchemaPath = resolve(process.cwd(), schemaPath);
39
+
40
+ console.log(`Loading schema from: ${resolvedSchemaPath}`);
41
+
42
+ // Load the schema
43
+ const loadResult = await loadSchemaFromFile(resolvedSchemaPath, {
44
+ validate: true,
45
+ });
46
+
47
+ if (loadResult.errors.length > 0) {
48
+ console.error('❌ Failed to load schema:');
49
+ loadResult.errors.forEach((error) => console.error(` - ${error}`));
50
+ process.exit(1);
51
+ }
52
+
53
+ if (!loadResult.schema) {
54
+ console.error('❌ No schema found');
55
+ process.exit(1);
56
+ }
57
+
58
+ // Validate schema for generation
59
+ const generationValidation = validateForGeneration(loadResult.schema);
60
+ if (!generationValidation.valid) {
61
+ console.error('❌ Schema validation failed:');
62
+ generationValidation.errors.forEach((error) =>
63
+ console.error(` - ${error.message}`)
64
+ );
65
+ process.exit(1);
66
+ }
67
+
68
+ console.log('✓ Schema loaded successfully');
69
+
70
+ // Normalize the schema
71
+ console.log('Normalizing schema...');
72
+ const normalizedSchema = normalizeSchema(loadResult.schema);
73
+ console.log('✓ Schema normalized');
74
+
75
+ // Determine output directory
76
+ const outputDir = options.output || './generated';
77
+ const resolvedOutputDir = resolve(process.cwd(), outputDir);
78
+
79
+ // Generate based on target
80
+ const target = options.target || 'all';
81
+ let generatedFiles = 0;
82
+
83
+ if (target === 'all' || target === 'logic') {
84
+ console.log('\nGenerating logic module...');
85
+ const logicOutputDir = `${resolvedOutputDir}/logic`;
86
+ await generateLogic(normalizedSchema, logicOutputDir);
87
+ generatedFiles += 5; // facts, events, rules, engine, index
88
+ console.log(`✓ Logic module generated in ${logicOutputDir}`);
89
+ }
90
+
91
+ if (target === 'all' || target === 'components') {
92
+ console.log('\nGenerating components...');
93
+ const componentsOutputDir = `${resolvedOutputDir}/components`;
94
+ const componentCount = await generateComponents(
95
+ normalizedSchema,
96
+ componentsOutputDir
97
+ );
98
+ generatedFiles += componentCount;
99
+ console.log(`✓ ${componentCount} components generated in ${componentsOutputDir}`);
100
+ }
101
+
102
+ if (target === 'all' || target === 'pluresdb') {
103
+ console.log('\nGenerating PluresDB configuration...');
104
+ const dbOutputDir = resolvedOutputDir;
105
+ await generatePluresDB(normalizedSchema, dbOutputDir, options.autoIndex);
106
+ generatedFiles += 1;
107
+ console.log(`✓ PluresDB config generated in ${dbOutputDir}`);
108
+ }
109
+
110
+ console.log(`\n✅ Generation complete! ${generatedFiles} files generated.`);
111
+
112
+ if (options.watch) {
113
+ console.log('\n👀 Watching for changes...');
114
+ console.log('(Watch mode not yet implemented)');
115
+ }
116
+ } catch (error) {
117
+ console.error('❌ Generation failed:');
118
+ if (error instanceof Error) {
119
+ console.error(error.message);
120
+ if (process.env.DEBUG) {
121
+ console.error(error.stack);
122
+ }
123
+ } else {
124
+ console.error('Unknown error');
125
+ }
126
+ process.exit(1);
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Generate logic module
132
+ */
133
+ async function generateLogic(
134
+ schema: NormalizedSchema,
135
+ outputDir: string
136
+ ): Promise<void> {
137
+ const generator = createLogicGenerator(outputDir);
138
+ const files = generator.generateLogic(schema);
139
+
140
+ // Write files
141
+ for (const file of files) {
142
+ await ensureDir(dirname(file.path));
143
+ await writeFile(file.path, file.content, 'utf-8');
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Generate components
149
+ */
150
+ async function generateComponents(
151
+ schema: NormalizedSchema,
152
+ outputDir: string
153
+ ): Promise<number> {
154
+ if (!schema.components || schema.components.length === 0) {
155
+ console.log(' No components defined in schema');
156
+ return 0;
157
+ }
158
+
159
+ const generator = createComponentGenerator(outputDir, {
160
+ typescript: true,
161
+ includeTests: false,
162
+ includeDocs: true,
163
+ });
164
+
165
+ let fileCount = 0;
166
+
167
+ for (const component of schema.components) {
168
+ // Find model if component references one
169
+ const model = component.resolvedModel || undefined;
170
+
171
+ const result = generator.generateComponent(component, model);
172
+
173
+ if (!result.success) {
174
+ console.error(` ⚠️ Failed to generate ${component.name}:`);
175
+ result.errors.forEach((error) => console.error(` - ${error.message}`));
176
+ continue;
177
+ }
178
+
179
+ // Write files
180
+ for (const file of result.files) {
181
+ await ensureDir(dirname(file.path));
182
+ await writeFile(file.path, file.content, 'utf-8');
183
+ fileCount++;
184
+ }
185
+ }
186
+
187
+ return fileCount;
188
+ }
189
+
190
+ /**
191
+ * Generate PluresDB configuration
192
+ */
193
+ async function generatePluresDB(
194
+ schema: NormalizedSchema,
195
+ outputDir: string,
196
+ autoIndex?: 'all' | 'explicit' | 'none'
197
+ ): Promise<void> {
198
+ const generator = createPluresDBGenerator(outputDir, {
199
+ dbName: schema.name.toLowerCase(),
200
+ enableSync: false,
201
+ autoIndex: autoIndex || 'all',
202
+ });
203
+
204
+ const files = generator.generateConfig(schema);
205
+
206
+ // Write files
207
+ for (const file of files) {
208
+ await ensureDir(dirname(file.path));
209
+ await writeFile(file.path, file.content, 'utf-8');
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Ensure directory exists
215
+ */
216
+ async function ensureDir(dir: string): Promise<void> {
217
+ try {
218
+ await mkdir(dir, { recursive: true });
219
+ } catch (error: any) {
220
+ // Only ignore if directory already exists
221
+ if (error.code !== 'EEXIST') {
222
+ throw error;
223
+ }
224
+ }
225
+ }
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Praxis CLI
5
+ *
6
+ * Command-line interface for the Praxis framework.
7
+ */
8
+
9
+ import { Command } from 'commander';
10
+ import { generate } from './commands/generate.js';
11
+
12
+ const program = new Command();
13
+
14
+ program
15
+ .name('praxis')
16
+ .description('Praxis Framework - Full-stack application development')
17
+ .version('0.1.0');
18
+
19
+ // Authentication command
20
+ program
21
+ .command('login')
22
+ .description('Authenticate with GitHub for Praxis Cloud access')
23
+ .option('--token <token>', 'Use a personal access token instead of device flow')
24
+ .action(async (options) => {
25
+ try {
26
+ const { loginCommand } = await import('./commands/auth.js');
27
+ await loginCommand(options);
28
+ } catch (error) {
29
+ console.error('Error during login:', error);
30
+ process.exit(1);
31
+ }
32
+ });
33
+
34
+ program
35
+ .command('logout')
36
+ .description('Log out from Praxis Cloud')
37
+ .action(async () => {
38
+ try {
39
+ const { logoutCommand } = await import('./commands/auth.js');
40
+ await logoutCommand();
41
+ } catch (error) {
42
+ console.error('Error during logout:', error);
43
+ process.exit(1);
44
+ }
45
+ });
46
+
47
+ program
48
+ .command('whoami')
49
+ .description('Show current authenticated user')
50
+ .action(async () => {
51
+ try {
52
+ const { whoamiCommand } = await import('./commands/auth.js');
53
+ await whoamiCommand();
54
+ } catch (error) {
55
+ console.error('Error checking authentication:', error);
56
+ process.exit(1);
57
+ }
58
+ });
59
+
60
+ // Create commands
61
+ program
62
+ .command('create <type> [name]')
63
+ .description('Create a new Praxis project or component')
64
+ .option('-t, --template <template>', 'Template to use', 'basic')
65
+ .option('-d, --directory <dir>', 'Output directory')
66
+ .option('--features <features...>', 'Features to include')
67
+ .action((type, name, options) => {
68
+ console.log(`Creating ${type}: ${name || 'unnamed'}`);
69
+ console.log('Options:', options);
70
+ console.log('Note: Full implementation coming soon');
71
+ });
72
+
73
+ program
74
+ .command('generate')
75
+ .description('Generate code from schemas')
76
+ .option('-s, --schema <file>', 'Schema file path')
77
+ .option('-t, --target <target>', 'Generation target (all, logic, components, pluresdb)', 'all')
78
+ .option('-o, --output <dir>', 'Output directory', './generated')
79
+ .option('-w, --watch', 'Watch for changes')
80
+ .option('--auto-index <strategy>', 'Auto-indexing strategy for PluresDB (all, explicit, none)', 'all')
81
+ .action(async (options) => {
82
+ await generate(options);
83
+ });
84
+
85
+ program
86
+ .command('canvas [schema]')
87
+ .description('Open CodeCanvas for visual editing')
88
+ .option('-p, --port <port>', 'Port for Canvas server', '3000')
89
+ .option('-m, --mode <mode>', 'Mode (edit, view, present)', 'edit')
90
+ .action((schema, options) => {
91
+ console.log(`Opening Canvas for: ${schema || 'new schema'}`);
92
+ console.log('Options:', options);
93
+ console.log('Note: Full implementation coming soon');
94
+ });
95
+
96
+ program
97
+ .command('orchestrate')
98
+ .description('Manage orchestration and distributed coordination')
99
+ .option('-c, --config <file>', 'Orchestration configuration file')
100
+ .option('-n, --nodes <count>', 'Number of nodes', '1')
101
+ .action((options) => {
102
+ console.log('Starting orchestration...');
103
+ console.log('Options:', options);
104
+ console.log('Note: Full implementation coming soon');
105
+ });
106
+
107
+ program
108
+ .command('dev')
109
+ .description('Start development server')
110
+ .option('-p, --port <port>', 'Port number', '5173')
111
+ .action((options) => {
112
+ console.log('Starting development server...');
113
+ console.log('Options:', options);
114
+ console.log('Note: Full implementation coming soon');
115
+ });
116
+
117
+ program
118
+ .command('build')
119
+ .description('Build application for production')
120
+ .option('-o, --output <dir>', 'Output directory', './dist')
121
+ .option('--target <target>', 'Build target (web, desktop, mobile)', 'web')
122
+ .action((options) => {
123
+ console.log('Building application...');
124
+ console.log('Options:', options);
125
+ console.log('Note: Full implementation coming soon');
126
+ });
127
+
128
+ // Cloud commands
129
+ const cloudCmd = program
130
+ .command('cloud')
131
+ .description('Manage Praxis Cloud connection and synchronization');
132
+
133
+ cloudCmd
134
+ .command('init')
135
+ .description('Connect to Praxis Cloud (setup wizard)')
136
+ .option('-e, --endpoint <url>', 'Azure Function App endpoint URL')
137
+ .option('-a, --app-id <id>', 'Application identifier')
138
+ .option('--auto-sync', 'Enable automatic synchronization', false)
139
+ .option('--interval <ms>', 'Sync interval in milliseconds', '5000')
140
+ .action(async (options) => {
141
+ try {
142
+ // Dynamic import to avoid loading cloud module unless needed
143
+ const { cloudInit } = await import('./commands/cloud.js');
144
+ await cloudInit(options);
145
+ } catch (error) {
146
+ console.error('Error initializing cloud connection:', error);
147
+ process.exit(1);
148
+ }
149
+ });
150
+
151
+ cloudCmd
152
+ .command('status')
153
+ .description('Check Praxis Cloud connection status')
154
+ .action(async () => {
155
+ try {
156
+ const { cloudStatus } = await import('./commands/cloud.js');
157
+ await cloudStatus();
158
+ } catch (error) {
159
+ console.error('Error checking cloud status:', error);
160
+ process.exit(1);
161
+ }
162
+ });
163
+
164
+ cloudCmd
165
+ .command('sync')
166
+ .description('Manually trigger cloud synchronization')
167
+ .action(async () => {
168
+ try {
169
+ const { cloudSync } = await import('./commands/cloud.js');
170
+ await cloudSync();
171
+ } catch (error) {
172
+ console.error('Error syncing to cloud:', error);
173
+ process.exit(1);
174
+ }
175
+ });
176
+
177
+ cloudCmd
178
+ .command('usage')
179
+ .description('View cloud usage metrics')
180
+ .action(async () => {
181
+ try {
182
+ const { cloudUsage } = await import('./commands/cloud.js');
183
+ await cloudUsage();
184
+ } catch (error) {
185
+ console.error('Error retrieving usage metrics:', error);
186
+ process.exit(1);
187
+ }
188
+ });
189
+
190
+ program.parse();