@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.
- package/FRAMEWORK.md +420 -0
- package/LICENSE +21 -0
- package/README.md +1310 -0
- package/dist/adapters/cli.d.ts +43 -0
- package/dist/adapters/cli.d.ts.map +1 -0
- package/dist/adapters/cli.js +126 -0
- package/dist/adapters/cli.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +26 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +233 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/cloud.d.ts +27 -0
- package/dist/cli/commands/cloud.d.ts.map +1 -0
- package/dist/cli/commands/cloud.js +232 -0
- package/dist/cli/commands/cloud.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +25 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +168 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +179 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cloud/auth.d.ts +51 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +194 -0
- package/dist/cloud/auth.js.map +1 -0
- package/dist/cloud/billing.d.ts +184 -0
- package/dist/cloud/billing.d.ts.map +1 -0
- package/dist/cloud/billing.js +179 -0
- package/dist/cloud/billing.js.map +1 -0
- package/dist/cloud/client.d.ts +39 -0
- package/dist/cloud/client.d.ts.map +1 -0
- package/dist/cloud/client.js +176 -0
- package/dist/cloud/client.js.map +1 -0
- package/dist/cloud/index.d.ts +44 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +44 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/marketplace.d.ts +166 -0
- package/dist/cloud/marketplace.d.ts.map +1 -0
- package/dist/cloud/marketplace.js +159 -0
- package/dist/cloud/marketplace.js.map +1 -0
- package/dist/cloud/provisioning.d.ts +110 -0
- package/dist/cloud/provisioning.d.ts.map +1 -0
- package/dist/cloud/provisioning.js +148 -0
- package/dist/cloud/provisioning.js.map +1 -0
- package/dist/cloud/relay/endpoints.d.ts +62 -0
- package/dist/cloud/relay/endpoints.d.ts.map +1 -0
- package/dist/cloud/relay/endpoints.js +217 -0
- package/dist/cloud/relay/endpoints.js.map +1 -0
- package/dist/cloud/relay/health/index.d.ts +5 -0
- package/dist/cloud/relay/health/index.d.ts.map +1 -0
- package/dist/cloud/relay/health/index.js +9 -0
- package/dist/cloud/relay/health/index.js.map +1 -0
- package/dist/cloud/relay/stats/index.d.ts +5 -0
- package/dist/cloud/relay/stats/index.d.ts.map +1 -0
- package/dist/cloud/relay/stats/index.js +9 -0
- package/dist/cloud/relay/stats/index.js.map +1 -0
- package/dist/cloud/relay/sync/index.d.ts +5 -0
- package/dist/cloud/relay/sync/index.d.ts.map +1 -0
- package/dist/cloud/relay/sync/index.js +9 -0
- package/dist/cloud/relay/sync/index.js.map +1 -0
- package/dist/cloud/relay/usage/index.d.ts +5 -0
- package/dist/cloud/relay/usage/index.d.ts.map +1 -0
- package/dist/cloud/relay/usage/index.js +9 -0
- package/dist/cloud/relay/usage/index.js.map +1 -0
- package/dist/cloud/sponsors.d.ts +81 -0
- package/dist/cloud/sponsors.d.ts.map +1 -0
- package/dist/cloud/sponsors.js +130 -0
- package/dist/cloud/sponsors.js.map +1 -0
- package/dist/cloud/types.d.ts +169 -0
- package/dist/cloud/types.d.ts.map +1 -0
- package/dist/cloud/types.js +7 -0
- package/dist/cloud/types.js.map +1 -0
- package/dist/components/index.d.ts +43 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +17 -0
- package/dist/components/index.js.map +1 -0
- package/dist/core/actors.d.ts +95 -0
- package/dist/core/actors.d.ts.map +1 -0
- package/dist/core/actors.js +158 -0
- package/dist/core/actors.js.map +1 -0
- package/dist/core/component/generator.d.ts +122 -0
- package/dist/core/component/generator.d.ts.map +1 -0
- package/dist/core/component/generator.js +307 -0
- package/dist/core/component/generator.js.map +1 -0
- package/dist/core/engine.d.ts +92 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +199 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/introspection.d.ts +141 -0
- package/dist/core/introspection.d.ts.map +1 -0
- package/dist/core/introspection.js +208 -0
- package/dist/core/introspection.js.map +1 -0
- package/dist/core/logic/generator.d.ts +76 -0
- package/dist/core/logic/generator.d.ts.map +1 -0
- package/dist/core/logic/generator.js +339 -0
- package/dist/core/logic/generator.js.map +1 -0
- package/dist/core/pluresdb/generator.d.ts +58 -0
- package/dist/core/pluresdb/generator.d.ts.map +1 -0
- package/dist/core/pluresdb/generator.js +162 -0
- package/dist/core/pluresdb/generator.js.map +1 -0
- package/dist/core/protocol.d.ts +121 -0
- package/dist/core/protocol.d.ts.map +1 -0
- package/dist/core/protocol.js +46 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/rules.d.ts +120 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +81 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/schema/loader.d.ts +47 -0
- package/dist/core/schema/loader.d.ts.map +1 -0
- package/dist/core/schema/loader.js +189 -0
- package/dist/core/schema/loader.js.map +1 -0
- package/dist/core/schema/normalize.d.ts +72 -0
- package/dist/core/schema/normalize.d.ts.map +1 -0
- package/dist/core/schema/normalize.js +190 -0
- package/dist/core/schema/normalize.js.map +1 -0
- package/dist/core/schema/types.d.ts +370 -0
- package/dist/core/schema/types.d.ts.map +1 -0
- package/dist/core/schema/types.js +161 -0
- package/dist/core/schema/types.js.map +1 -0
- package/dist/dsl/index.d.ts +152 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +132 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl.d.ts +124 -0
- package/dist/dsl.d.ts.map +1 -0
- package/dist/dsl.js +130 -0
- package/dist/dsl.js.map +1 -0
- package/dist/examples/advanced-todo/index.d.ts +55 -0
- package/dist/examples/advanced-todo/index.d.ts.map +1 -0
- package/dist/examples/advanced-todo/index.js +222 -0
- package/dist/examples/advanced-todo/index.js.map +1 -0
- package/dist/examples/auth-basic/index.d.ts +17 -0
- package/dist/examples/auth-basic/index.d.ts.map +1 -0
- package/dist/examples/auth-basic/index.js +122 -0
- package/dist/examples/auth-basic/index.js.map +1 -0
- package/dist/examples/cart/index.d.ts +19 -0
- package/dist/examples/cart/index.d.ts.map +1 -0
- package/dist/examples/cart/index.js +202 -0
- package/dist/examples/cart/index.js.map +1 -0
- package/dist/examples/hero-ecommerce/index.d.ts +39 -0
- package/dist/examples/hero-ecommerce/index.d.ts.map +1 -0
- package/dist/examples/hero-ecommerce/index.js +506 -0
- package/dist/examples/hero-ecommerce/index.js.map +1 -0
- package/dist/examples/svelte-counter/index.d.ts +31 -0
- package/dist/examples/svelte-counter/index.d.ts.map +1 -0
- package/dist/examples/svelte-counter/index.js +123 -0
- package/dist/examples/svelte-counter/index.js.map +1 -0
- package/dist/flows.d.ts +125 -0
- package/dist/flows.d.ts.map +1 -0
- package/dist/flows.js +160 -0
- package/dist/flows.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/pluresdb.d.ts +56 -0
- package/dist/integrations/pluresdb.d.ts.map +1 -0
- package/dist/integrations/pluresdb.js +46 -0
- package/dist/integrations/pluresdb.js.map +1 -0
- package/dist/integrations/svelte.d.ts +306 -0
- package/dist/integrations/svelte.d.ts.map +1 -0
- package/dist/integrations/svelte.js +447 -0
- package/dist/integrations/svelte.js.map +1 -0
- package/dist/registry.d.ts +94 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +181 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime/terminal-adapter.d.ts +105 -0
- package/dist/runtime/terminal-adapter.d.ts.map +1 -0
- package/dist/runtime/terminal-adapter.js +113 -0
- package/dist/runtime/terminal-adapter.js.map +1 -0
- package/dist/step.d.ts +34 -0
- package/dist/step.d.ts.map +1 -0
- package/dist/step.js +111 -0
- package/dist/step.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/docs/MONETIZATION.md +394 -0
- package/docs/TERMINAL_NODE.md +588 -0
- package/docs/guides/canvas.md +389 -0
- package/docs/guides/getting-started.md +347 -0
- package/docs/guides/history-state-pattern.md +618 -0
- package/docs/guides/orchestration.md +617 -0
- package/docs/guides/parallel-state-pattern.md +767 -0
- package/docs/guides/svelte-integration.md +691 -0
- package/package.json +96 -0
- package/src/__tests__/actors.test.ts +270 -0
- package/src/__tests__/billing.test.ts +175 -0
- package/src/__tests__/cloud.test.ts +247 -0
- package/src/__tests__/dsl.test.ts +154 -0
- package/src/__tests__/edge-cases.test.ts +475 -0
- package/src/__tests__/engine.test.ts +137 -0
- package/src/__tests__/generators.test.ts +270 -0
- package/src/__tests__/introspection.test.ts +321 -0
- package/src/__tests__/protocol.test.ts +40 -0
- package/src/__tests__/provisioning.test.ts +162 -0
- package/src/__tests__/schema.test.ts +241 -0
- package/src/__tests__/svelte-integration.test.ts +431 -0
- package/src/__tests__/terminal-node.test.ts +352 -0
- package/src/adapters/cli.ts +175 -0
- package/src/cli/commands/auth.ts +271 -0
- package/src/cli/commands/cloud.ts +281 -0
- package/src/cli/commands/generate.ts +225 -0
- package/src/cli/index.ts +190 -0
- package/src/cloud/README.md +383 -0
- package/src/cloud/auth.ts +245 -0
- package/src/cloud/billing.ts +336 -0
- package/src/cloud/client.ts +221 -0
- package/src/cloud/index.ts +121 -0
- package/src/cloud/marketplace.ts +303 -0
- package/src/cloud/provisioning.ts +254 -0
- package/src/cloud/relay/endpoints.ts +307 -0
- package/src/cloud/relay/health/function.json +17 -0
- package/src/cloud/relay/health/index.ts +10 -0
- package/src/cloud/relay/host.json +15 -0
- package/src/cloud/relay/local.settings.json +8 -0
- package/src/cloud/relay/stats/function.json +17 -0
- package/src/cloud/relay/stats/index.ts +10 -0
- package/src/cloud/relay/sync/function.json +17 -0
- package/src/cloud/relay/sync/index.ts +10 -0
- package/src/cloud/relay/usage/function.json +17 -0
- package/src/cloud/relay/usage/index.ts +10 -0
- package/src/cloud/sponsors.ts +213 -0
- package/src/cloud/types.ts +198 -0
- package/src/components/README.md +125 -0
- package/src/components/TerminalNode.svelte +457 -0
- package/src/components/index.ts +46 -0
- package/src/core/actors.ts +205 -0
- package/src/core/component/generator.ts +432 -0
- package/src/core/engine.ts +243 -0
- package/src/core/introspection.ts +329 -0
- package/src/core/logic/generator.ts +420 -0
- package/src/core/pluresdb/generator.ts +229 -0
- package/src/core/protocol.ts +132 -0
- package/src/core/rules.ts +167 -0
- package/src/core/schema/loader.ts +247 -0
- package/src/core/schema/normalize.ts +322 -0
- package/src/core/schema/types.ts +557 -0
- package/src/dsl/index.ts +218 -0
- package/src/dsl.ts +214 -0
- package/src/examples/advanced-todo/App.svelte +506 -0
- package/src/examples/advanced-todo/README.md +371 -0
- package/src/examples/advanced-todo/index.ts +309 -0
- package/src/examples/auth-basic/index.ts +163 -0
- package/src/examples/cart/index.ts +259 -0
- package/src/examples/hero-ecommerce/index.ts +657 -0
- package/src/examples/svelte-counter/index.ts +168 -0
- package/src/flows.ts +268 -0
- package/src/index.ts +154 -0
- package/src/integrations/pluresdb.ts +93 -0
- package/src/integrations/svelte.ts +617 -0
- package/src/registry.ts +223 -0
- package/src/runtime/terminal-adapter.ts +175 -0
- package/src/step.ts +151 -0
- package/src/types.ts +70 -0
- package/templates/basic-app/README.md +147 -0
- 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
|
+
}
|
package/src/cli/index.ts
ADDED
|
@@ -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();
|