@plures/praxis 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Verify Command
3
+ *
4
+ * Verifies the implementation of the project against the schema/rules.
5
+ */
6
+ export interface VerifyOptions {
7
+ detailed?: boolean;
8
+ }
9
+ export declare function verify(type: string, _options: VerifyOptions): Promise<void>;
10
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCjF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Verify Command
3
+ *
4
+ * Verifies the implementation of the project against the schema/rules.
5
+ */
6
+ import { verifyImplementation } from '../../../ui/canvas-inspector/src/verify-fsm-implementation.js';
7
+ export async function verify(type, _options) {
8
+ if (type !== 'implementation') {
9
+ console.error(`Unknown verification type: ${type}`);
10
+ console.log('Supported types: implementation');
11
+ process.exit(1);
12
+ }
13
+ console.log('Verifying FSM implementation...');
14
+ try {
15
+ const result = verifyImplementation();
16
+ const missingCount = result.missingHandlers.length;
17
+ const emptyCount = result.emptyHandlers.length;
18
+ if (missingCount === 0 && emptyCount === 0) {
19
+ console.log('✅ Verification passed! All rules have implementations.');
20
+ }
21
+ else {
22
+ console.log('⚠️ Verification found issues:');
23
+ if (missingCount > 0) {
24
+ console.log(`\n Missing Handlers (${missingCount}):`);
25
+ result.missingHandlers.forEach((h) => console.log(` - ${h}`));
26
+ }
27
+ if (emptyCount > 0) {
28
+ console.log(`\n Empty Handlers (${emptyCount}):`);
29
+ result.emptyHandlers.forEach((h) => console.log(` - ${h}`));
30
+ }
31
+ process.exit(1);
32
+ }
33
+ }
34
+ catch (error) {
35
+ console.error('Verification failed:', error);
36
+ process.exit(1);
37
+ }
38
+ }
39
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+DAA+D,CAAC;AAMrG,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,QAAuB;IAChE,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;QAEtC,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;QAE/C,IAAI,YAAY,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAE9C,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,IAAI,CAAC,CAAC;gBACvD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,IAAI,CAAC,CAAC;gBACnD,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -207,5 +207,20 @@ cloudCmd
207
207
  process.exit(1);
208
208
  }
209
209
  });
210
+ // Verify command
211
+ program
212
+ .command('verify <type>')
213
+ .description('Verify project implementation (e.g., implementation)')
214
+ .option('-d, --detailed', 'Show detailed analysis')
215
+ .action(async (type, options) => {
216
+ try {
217
+ const { verify } = await import('./commands/verify.js');
218
+ await verify(type, options);
219
+ }
220
+ catch (error) {
221
+ console.error('Error verifying:', error);
222
+ process.exit(1);
223
+ }
224
+ });
210
225
  program.parse();
211
226
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface RuleAnalysis {
2
+ ruleId: string;
3
+ guards: string[];
4
+ mutations: string[];
5
+ events: string[];
6
+ }
7
+ export declare function analyzeRuleFile(filePath: string): RuleAnalysis[];
8
+ //# sourceMappingURL=ast-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-analyzer.d.ts","sourceRoot":"","sources":["../../../../tools/ast-analyzer/src/ast-analyzer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAsIhE"}
@@ -0,0 +1,119 @@
1
+ import * as ts from 'typescript';
2
+ import * as fs from 'fs';
3
+ export function analyzeRuleFile(filePath) {
4
+ const fileContent = fs.readFileSync(filePath, 'utf-8');
5
+ const sourceFile = ts.createSourceFile(filePath, fileContent, ts.ScriptTarget.Latest, true);
6
+ const results = [];
7
+ function visit(node) {
8
+ // Look for variable declarations: export const myRule = defineRule(...)
9
+ if (ts.isVariableDeclaration(node)) {
10
+ const initializer = node.initializer;
11
+ if (initializer && ts.isCallExpression(initializer)) {
12
+ const expression = initializer.expression;
13
+ // Check if it's defineRule call
14
+ if (ts.isIdentifier(expression) && expression.text === 'defineRule') {
15
+ if (initializer.arguments.length > 0) {
16
+ const arg = initializer.arguments[0];
17
+ if (ts.isObjectLiteralExpression(arg)) {
18
+ analyzeRuleObject(arg);
19
+ }
20
+ }
21
+ }
22
+ }
23
+ }
24
+ ts.forEachChild(node, visit);
25
+ }
26
+ function analyzeRuleObject(obj) {
27
+ let ruleId = '';
28
+ let implMethod;
29
+ // Extract ID and impl
30
+ obj.properties.forEach(prop => {
31
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
32
+ if (prop.name.text === 'id') {
33
+ if (ts.isStringLiteral(prop.initializer)) {
34
+ ruleId = prop.initializer.text;
35
+ }
36
+ }
37
+ else if (prop.name.text === 'impl') {
38
+ if (ts.isArrowFunction(prop.initializer) || ts.isFunctionExpression(prop.initializer)) {
39
+ implMethod = prop.initializer;
40
+ }
41
+ }
42
+ }
43
+ });
44
+ if (ruleId && implMethod) {
45
+ const analysis = analyzeImpl(implMethod, fileContent);
46
+ results.push({
47
+ ruleId,
48
+ ...analysis
49
+ });
50
+ }
51
+ }
52
+ function analyzeImpl(func, _fullText) {
53
+ const guards = [];
54
+ const mutations = [];
55
+ const events = [];
56
+ const body = func.body;
57
+ if (ts.isBlock(body)) {
58
+ body.statements.forEach(stmt => {
59
+ // 1. Detect Guards: if (...) return [];
60
+ if (ts.isIfStatement(stmt)) {
61
+ const thenStmt = stmt.thenStatement;
62
+ let isGuard = false;
63
+ // Check if 'then' block returns empty array
64
+ if (ts.isReturnStatement(thenStmt)) {
65
+ isGuard = isReturnEmptyArray(thenStmt);
66
+ }
67
+ else if (ts.isBlock(thenStmt)) {
68
+ // Check if block contains just return []
69
+ if (thenStmt.statements.length === 1 && ts.isReturnStatement(thenStmt.statements[0])) {
70
+ isGuard = isReturnEmptyArray(thenStmt.statements[0]);
71
+ }
72
+ }
73
+ if (isGuard) {
74
+ guards.push(stmt.expression.getText(sourceFile));
75
+ }
76
+ }
77
+ // 2. Detect Mutations: state.context.x = y
78
+ // We need to traverse the statement to find assignments
79
+ findMutations(stmt, mutations, sourceFile);
80
+ // 3. Detect Events: findEvent(events, EventType)
81
+ findEvents(stmt, events, sourceFile);
82
+ });
83
+ }
84
+ return { guards, mutations, events };
85
+ }
86
+ function isReturnEmptyArray(stmt) {
87
+ if (stmt.expression && ts.isArrayLiteralExpression(stmt.expression)) {
88
+ return stmt.expression.elements.length === 0;
89
+ }
90
+ return false;
91
+ }
92
+ function findMutations(node, mutations, sourceFile) {
93
+ if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
94
+ const left = node.left;
95
+ // Check for state.context.*
96
+ if (ts.isPropertyAccessExpression(left)) {
97
+ const text = left.getText(sourceFile);
98
+ if (text.startsWith('state.context.')) {
99
+ mutations.push(`${text} = ${node.right.getText(sourceFile)}`);
100
+ }
101
+ }
102
+ }
103
+ ts.forEachChild(node, n => findMutations(n, mutations, sourceFile));
104
+ }
105
+ function findEvents(node, events, sourceFile) {
106
+ if (ts.isCallExpression(node)) {
107
+ if (ts.isIdentifier(node.expression) && node.expression.text === 'findEvent') {
108
+ if (node.arguments.length >= 2) {
109
+ const eventType = node.arguments[1].getText(sourceFile);
110
+ events.push(eventType);
111
+ }
112
+ }
113
+ }
114
+ ts.forEachChild(node, n => findEvents(n, events, sourceFile));
115
+ }
116
+ visit(sourceFile);
117
+ return results;
118
+ }
119
+ //# sourceMappingURL=ast-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-analyzer.js","sourceRoot":"","sources":["../../../../tools/ast-analyzer/src/ast-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../ui/canvas-inspector/src/server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,248 @@
1
+ import * as http from 'http';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { WebSocketServer, WebSocket } from 'ws';
6
+ import { verifyImplementation } from './verify-fsm-implementation.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const PORT = 3000;
10
+ const WS_PORT = 3001;
11
+ const PROJECT_ROOT = process.cwd();
12
+ const CANVAS_JSON_PATH = process.env.PRAXIS_CANVAS_PATH || path.join(PROJECT_ROOT, 'praxis.canvas.json');
13
+ const HTML_TEMPLATE_PATH = path.join(__dirname, '../template/index.html');
14
+ // Default to a standard structure, or use env var
15
+ const RULES_DIR = process.env.PRAXIS_RULES_DIR ? path.resolve(process.env.PRAXIS_RULES_DIR) : path.join(PROJECT_ROOT, 'src/rules');
16
+ const SCAFFOLD_DIR = path.join(RULES_DIR, 'scaffolded');
17
+ const INDEX_FILE = path.join(RULES_DIR, 'index.ts');
18
+ // Ensure scaffold directory exists if we are going to use it
19
+ // We'll check existence before writing
20
+ // WebSocket Server
21
+ const wss = new WebSocketServer({ port: WS_PORT });
22
+ console.log(`\n🔌 WebSocket Server running at ws://localhost:${WS_PORT}`);
23
+ function broadcastAnalysis() {
24
+ try {
25
+ const { missingHandlers, emptyHandlers } = verifyImplementation();
26
+ const events = [
27
+ ...missingHandlers.map(h => ({ type: h, status: 'unhandled' })),
28
+ ...emptyHandlers.map(h => ({ type: h, status: 'empty' }))
29
+ ];
30
+ const msg = JSON.stringify({
31
+ type: 'LOGIC_INSPECTION',
32
+ events
33
+ });
34
+ wss.clients.forEach((client) => {
35
+ if (client.readyState === WebSocket.OPEN) {
36
+ client.send(msg);
37
+ }
38
+ });
39
+ }
40
+ catch (e) {
41
+ console.error('Analysis failed:', e);
42
+ }
43
+ }
44
+ wss.on('connection', (ws) => {
45
+ console.log('Client connected');
46
+ // Send initial analysis
47
+ setTimeout(broadcastAnalysis, 1000);
48
+ ws.on('message', (message) => {
49
+ try {
50
+ const data = JSON.parse(message.toString());
51
+ // Broadcast to all other clients (e.g. Extension -> Canvas, or Canvas -> Extension)
52
+ wss.clients.forEach((client) => {
53
+ if (client !== ws && client.readyState === WebSocket.OPEN) {
54
+ client.send(JSON.stringify(data));
55
+ }
56
+ });
57
+ }
58
+ catch (e) {
59
+ console.error('Error parsing message:', e);
60
+ }
61
+ });
62
+ ws.on('close', () => {
63
+ console.log('Client disconnected');
64
+ });
65
+ });
66
+ async function startServer() {
67
+ if (!fs.existsSync(CANVAS_JSON_PATH)) {
68
+ console.error(`Error: Canvas data not found at ${CANVAS_JSON_PATH}`);
69
+ console.error('Please ensure you have generated the canvas schema.');
70
+ // Don't exit, just warn, so the server can still start (maybe for other features)
71
+ // process.exit(1);
72
+ }
73
+ const server = http.createServer((req, res) => {
74
+ if (req.url === '/') {
75
+ try {
76
+ let canvasData = { nodes: [], edges: [] };
77
+ if (fs.existsSync(CANVAS_JSON_PATH)) {
78
+ canvasData = JSON.parse(fs.readFileSync(CANVAS_JSON_PATH, 'utf-8'));
79
+ }
80
+ let html = fs.readFileSync(HTML_TEMPLATE_PATH, 'utf-8');
81
+ // Transform Praxis Canvas format to Cytoscape format
82
+ const nodes = canvasData.nodes.map((n) => {
83
+ const { id: dataId, ...restData } = n.data || {};
84
+ return {
85
+ data: {
86
+ ...restData,
87
+ originalId: dataId,
88
+ id: n.id,
89
+ label: n.label,
90
+ type: n.type,
91
+ parent: n.id.includes('.') ? n.id.split('.')[0] : undefined, // Group by domain
92
+ },
93
+ position: n.position,
94
+ };
95
+ });
96
+ // Create parent nodes for domains
97
+ const domains = new Set();
98
+ nodes.forEach((n) => {
99
+ if (n.data.parent)
100
+ domains.add(n.data.parent);
101
+ });
102
+ const parentNodes = Array.from(domains).map((domain) => ({
103
+ data: {
104
+ id: domain,
105
+ label: domain.toUpperCase(),
106
+ type: 'domain',
107
+ },
108
+ }));
109
+ const cyElements = [
110
+ ...parentNodes,
111
+ ...nodes,
112
+ ...canvasData.edges.map((e) => ({
113
+ data: {
114
+ id: e.id,
115
+ source: e.source,
116
+ target: e.target,
117
+ label: e.label,
118
+ type: e.type,
119
+ },
120
+ })),
121
+ ];
122
+ // Inject data
123
+ html = html.replace('window.CANVAS_DATA', JSON.stringify(cyElements));
124
+ res.writeHead(200, { 'Content-Type': 'text/html' });
125
+ res.end(html);
126
+ }
127
+ catch (err) {
128
+ console.error(err);
129
+ res.writeHead(500);
130
+ res.end('Internal Server Error');
131
+ }
132
+ }
133
+ else if (req.url === '/api/analyze' && req.method === 'POST') {
134
+ broadcastAnalysis();
135
+ res.writeHead(200, { 'Content-Type': 'application/json' });
136
+ res.end(JSON.stringify({ success: true }));
137
+ }
138
+ else if (req.url === '/api/save' && req.method === 'POST') {
139
+ let body = '';
140
+ req.on('data', (chunk) => {
141
+ body += chunk.toString();
142
+ });
143
+ req.on('end', () => {
144
+ try {
145
+ const positions = JSON.parse(body);
146
+ if (!fs.existsSync(CANVAS_JSON_PATH)) {
147
+ throw new Error('Canvas file not found');
148
+ }
149
+ const canvasData = JSON.parse(fs.readFileSync(CANVAS_JSON_PATH, 'utf-8'));
150
+ // Update positions
151
+ for (const node of canvasData.nodes) {
152
+ if (positions[node.id]) {
153
+ node.position = positions[node.id];
154
+ }
155
+ }
156
+ fs.writeFileSync(CANVAS_JSON_PATH, JSON.stringify(canvasData, null, 2));
157
+ res.writeHead(200, { 'Content-Type': 'application/json' });
158
+ res.end(JSON.stringify({ success: true }));
159
+ }
160
+ catch (err) {
161
+ console.error(err);
162
+ res.writeHead(500);
163
+ res.end(JSON.stringify({ error: 'Failed to save' }));
164
+ }
165
+ });
166
+ }
167
+ else if (req.url === '/api/rules' && req.method === 'POST') {
168
+ let body = '';
169
+ req.on('data', (chunk) => (body += chunk.toString()));
170
+ req.on('end', async () => {
171
+ try {
172
+ if (!fs.existsSync(SCAFFOLD_DIR)) {
173
+ fs.mkdirSync(SCAFFOLD_DIR, { recursive: true });
174
+ }
175
+ const { id, description, triggers } = JSON.parse(body);
176
+ const safeName = id.replace(/\./g, '_');
177
+ const fileName = `${safeName}.ts`;
178
+ const filePath = path.join(SCAFFOLD_DIR, fileName);
179
+ const content = `
180
+ import { defineRule } from '@plures/praxis';
181
+ // Note: You may need to adjust this import based on your project structure
182
+ import type { ApplicationEngineContext } from '../../engine.js';
183
+
184
+ /**
185
+ * ${description || id}
186
+ */
187
+ export const ${safeName} = defineRule<ApplicationEngineContext>({
188
+ id: '${id}',
189
+ description: '${description || id}',
190
+ meta: {
191
+ triggers: ${JSON.stringify(triggers || [])},
192
+ },
193
+ impl: (state, events) => {
194
+ // TODO: Implement rule logic
195
+ return [];
196
+ },
197
+ });
198
+ `;
199
+ fs.writeFileSync(filePath, content.trim());
200
+ // Update index.ts
201
+ if (fs.existsSync(INDEX_FILE)) {
202
+ let indexContent = fs.readFileSync(INDEX_FILE, 'utf-8');
203
+ const exportLine = `export * from './scaffolded/${safeName}.js';`;
204
+ if (!indexContent.includes(exportLine)) {
205
+ fs.appendFileSync(INDEX_FILE, `\n${exportLine}`);
206
+ }
207
+ }
208
+ // Regenerate schema
209
+ // This assumes a script exists in the user's package.json
210
+ const { exec } = await import('child_process');
211
+ exec('npm run generate:schema', (error, _stdout, _stderr) => {
212
+ if (error) {
213
+ console.error(`exec error: ${error}`);
214
+ // Don't fail the request if schema gen fails, just warn
215
+ // res.writeHead(500);
216
+ // res.end(JSON.stringify({ error: 'Failed to regenerate schema' }));
217
+ // return;
218
+ }
219
+ res.writeHead(200, { 'Content-Type': 'application/json' });
220
+ res.end(JSON.stringify({ success: true }));
221
+ });
222
+ }
223
+ catch (err) {
224
+ console.error(err);
225
+ res.writeHead(500);
226
+ res.end(JSON.stringify({ error: 'Failed to create rule' }));
227
+ }
228
+ });
229
+ }
230
+ else if (req.url === '/api/connections' && req.method === 'POST') {
231
+ // Connection logic omitted for brevity in this portable version
232
+ // as it requires complex file finding logic that depends on project structure.
233
+ // In a full implementation, we would use the AST analyzer to find the files.
234
+ res.writeHead(501);
235
+ res.end(JSON.stringify({ error: 'Not implemented in portable version' }));
236
+ }
237
+ else {
238
+ res.writeHead(404);
239
+ res.end('Not Found');
240
+ }
241
+ });
242
+ server.listen(PORT, () => {
243
+ console.log(`\n🎨 Praxis Canvas running at http://localhost:${PORT}`);
244
+ console.log('Press Ctrl+C to stop.\n');
245
+ });
246
+ }
247
+ startServer();
248
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../ui/canvas-inspector/src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function verifyImplementation(): {
2
+ missingHandlers: never[];
3
+ emptyHandlers: any[];
4
+ };
5
+ //# sourceMappingURL=verify-fsm-implementation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-fsm-implementation.d.ts","sourceRoot":"","sources":["../../../../ui/canvas-inspector/src/verify-fsm-implementation.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB;;;EAmCnC"}
@@ -0,0 +1,58 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { analyzeRuleFile } from '../../../tools/ast-analyzer/src/ast-analyzer.js';
4
+ export function verifyImplementation() {
5
+ const projectRoot = process.cwd();
6
+ // Default assumption: rules are in src/fsm/rules or src/rules
7
+ // We'll search recursively in src/
8
+ const srcDir = path.join(projectRoot, 'src');
9
+ if (!fs.existsSync(srcDir)) {
10
+ console.warn('src directory not found, skipping verification');
11
+ return { missingHandlers: [], emptyHandlers: [] };
12
+ }
13
+ const ruleFiles = findRuleFiles(srcDir);
14
+ const allRules = [];
15
+ for (const file of ruleFiles) {
16
+ try {
17
+ const analysis = analyzeRuleFile(file);
18
+ allRules.push(...analysis);
19
+ }
20
+ catch (e) {
21
+ // Ignore errors in individual files
22
+ }
23
+ }
24
+ // For now, we just report what we found as a proof of concept
25
+ // In a real scenario, we would compare against the schema
26
+ // Check for empty implementations (no mutations, no events)
27
+ const emptyHandlers = allRules
28
+ .filter(r => r.mutations.length === 0 && r.events.length === 0)
29
+ .map(r => r.ruleId);
30
+ return {
31
+ missingHandlers: [], // We'd need the schema to know what's missing
32
+ emptyHandlers
33
+ };
34
+ }
35
+ function findRuleFiles(dir) {
36
+ let results = [];
37
+ const list = fs.readdirSync(dir);
38
+ for (const file of list) {
39
+ const filePath = path.join(dir, file);
40
+ const stat = fs.statSync(filePath);
41
+ if (stat && stat.isDirectory()) {
42
+ if (file !== 'node_modules' && file !== 'dist') {
43
+ results = results.concat(findRuleFiles(filePath));
44
+ }
45
+ }
46
+ else {
47
+ if (file.endsWith('.ts') && !file.endsWith('.d.ts')) {
48
+ // Heuristic: check if file contains 'defineRule'
49
+ const content = fs.readFileSync(filePath, 'utf-8');
50
+ if (content.includes('defineRule')) {
51
+ results.push(filePath);
52
+ }
53
+ }
54
+ }
55
+ }
56
+ return results;
57
+ }
58
+ //# sourceMappingURL=verify-fsm-implementation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-fsm-implementation.js","sourceRoot":"","sources":["../../../../ui/canvas-inspector/src/verify-fsm-implementation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAElF,MAAM,UAAU,oBAAoB;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,8DAA8D;IAC9D,mCAAmC;IAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAU,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,0DAA0D;IAE1D,4DAA4D;IAC5D,MAAM,aAAa,GAAG,QAAQ;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;SAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEtB,OAAO;QACL,eAAe,EAAE,EAAE,EAAE,8CAA8C;QACnE,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,iDAAiD;gBACjD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plures/praxis",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "The Full Plures Application Framework - declarative schemas, logic engine, component generation, and local-first data",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -76,6 +76,7 @@
76
76
  "devDependencies": {
77
77
  "@types/js-yaml": "^4.0.9",
78
78
  "@types/node": "^24.10.1",
79
+ "@types/ws": "^8.18.1",
79
80
  "@vitest/ui": "^4.0.10",
80
81
  "tsx": "^4.20.6",
81
82
  "typescript": "^5.9.3",
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Verify Command
3
+ *
4
+ * Verifies the implementation of the project against the schema/rules.
5
+ */
6
+
7
+ import { verifyImplementation } from '../../../ui/canvas-inspector/src/verify-fsm-implementation.js';
8
+
9
+ export interface VerifyOptions {
10
+ detailed?: boolean;
11
+ }
12
+
13
+ export async function verify(type: string, _options: VerifyOptions): Promise<void> {
14
+ if (type !== 'implementation') {
15
+ console.error(`Unknown verification type: ${type}`);
16
+ console.log('Supported types: implementation');
17
+ process.exit(1);
18
+ }
19
+
20
+ console.log('Verifying FSM implementation...');
21
+
22
+ try {
23
+ const result = verifyImplementation();
24
+
25
+ const missingCount = result.missingHandlers.length;
26
+ const emptyCount = result.emptyHandlers.length;
27
+
28
+ if (missingCount === 0 && emptyCount === 0) {
29
+ console.log('✅ Verification passed! All rules have implementations.');
30
+ } else {
31
+ console.log('⚠️ Verification found issues:');
32
+
33
+ if (missingCount > 0) {
34
+ console.log(`\n Missing Handlers (${missingCount}):`);
35
+ result.missingHandlers.forEach((h: string) => console.log(` - ${h}`));
36
+ }
37
+
38
+ if (emptyCount > 0) {
39
+ console.log(`\n Empty Handlers (${emptyCount}):`);
40
+ result.emptyHandlers.forEach((h: string) => console.log(` - ${h}`));
41
+ }
42
+
43
+ process.exit(1);
44
+ }
45
+
46
+ } catch (error) {
47
+ console.error('Verification failed:', error);
48
+ process.exit(1);
49
+ }
50
+ }
package/src/cli/index.ts CHANGED
@@ -206,12 +206,27 @@ cloudCmd
206
206
  .description('View cloud usage metrics')
207
207
  .action(async () => {
208
208
  try {
209
- const { cloudUsage } = await import('./commands/cloud.js');
210
- await cloudUsage();
209
+ const { cloudUsage } = await import('./commands/cloud.js');
210
+ await cloudUsage();
211
+ } catch (error) {
212
+ console.error('Error retrieving usage metrics:', error);
213
+ process.exit(1);
214
+ }
215
+ });
216
+
217
+ // Verify command
218
+ program
219
+ .command('verify <type>')
220
+ .description('Verify project implementation (e.g., implementation)')
221
+ .option('-d, --detailed', 'Show detailed analysis')
222
+ .action(async (type, options) => {
223
+ try {
224
+ const { verify } = await import('./commands/verify.js');
225
+ await verify(type, options);
211
226
  } catch (error) {
212
- console.error('Error retrieving usage metrics:', error);
227
+ console.error('Error verifying:', error);
213
228
  process.exit(1);
214
229
  }
215
230
  });
216
231
 
217
- program.parse();
232
+ program.parse();