@geometra/cli 1.13.1 → 1.13.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.
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import { viewInTerminal } from './viewer.js';
3
+ const url = process.argv[2];
4
+ if (!url) {
5
+ console.error('Usage: geometra <url>');
6
+ console.error('');
7
+ console.error(' View any Geometra-powered site in the terminal.');
8
+ console.error('');
9
+ console.error('Examples:');
10
+ console.error(' geometra https://artemis-two.razroo.com/');
11
+ console.error(' geometra http://localhost:5173/');
12
+ console.error(' geometra ws://localhost:8080/geometra-ws');
13
+ process.exit(1);
14
+ }
15
+ // Direct WebSocket URL — single view
16
+ if (url.startsWith('ws://') || url.startsWith('wss://')) {
17
+ console.error(`Connecting to ${url}...`);
18
+ const viewer = viewInTerminal({ url });
19
+ process.on('SIGINT', () => { viewer.close(); process.exit(0); });
20
+ process.on('SIGTERM', () => { viewer.close(); process.exit(0); });
21
+ }
22
+ else {
23
+ // HTTP(S) URL — discover all Geometra WebSocket endpoints from the page HTML
24
+ ;
25
+ (async () => {
26
+ const parsed = new URL(url);
27
+ const wsProto = parsed.protocol === 'https:' ? 'wss:' : 'ws:';
28
+ const baseWs = `${wsProto}//${parsed.host}`;
29
+ console.error(`Fetching ${url} to discover Geometra endpoints...`);
30
+ try {
31
+ const res = await fetch(url);
32
+ const html = await res.text();
33
+ // Find all geometra-ws paths in the HTML/JS source
34
+ const wsPathRegex = /["'`](\/geometra-ws[^"'`]*?)["'`]/g;
35
+ const paths = new Set();
36
+ let match;
37
+ while ((match = wsPathRegex.exec(html)) !== null) {
38
+ paths.add(match[1]);
39
+ }
40
+ // Fallback to default path
41
+ if (paths.size === 0) {
42
+ paths.add('/geometra-ws');
43
+ }
44
+ // Sort: header first, then main, then hud, then below
45
+ const sorted = [...paths].sort((a, b) => {
46
+ const order = (p) => p.includes('header') ? 0 :
47
+ p === '/geometra-ws' ? 1 :
48
+ p.includes('hud') ? 2 :
49
+ p.includes('below') ? 3 : 4;
50
+ return order(a) - order(b);
51
+ });
52
+ console.error(`Found ${sorted.length} Geometra view(s): ${sorted.join(', ')}`);
53
+ const viewers = sorted.map(path => viewInTerminal({
54
+ url: `${baseWs}${path}`,
55
+ // Stack views vertically — divide terminal rows among views
56
+ height: Math.max(6, Math.floor((process.stdout.rows || 24) / sorted.length)),
57
+ }));
58
+ process.on('SIGINT', () => { viewers.forEach(v => v.close()); process.exit(0); });
59
+ process.on('SIGTERM', () => { viewers.forEach(v => v.close()); process.exit(0); });
60
+ }
61
+ catch (err) {
62
+ // If fetch fails, fall back to default WS path
63
+ console.error(`Could not fetch page, trying default /geometra-ws...`);
64
+ const viewer = viewInTerminal({ url: `${baseWs}/geometra-ws` });
65
+ process.on('SIGINT', () => { viewer.close(); process.exit(0); });
66
+ process.on('SIGTERM', () => { viewer.close(); process.exit(0); });
67
+ }
68
+ })();
69
+ }
70
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { viewInTerminal } from './viewer.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { viewInTerminal } from './viewer.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,16 @@
1
+ export interface ViewOptions {
2
+ /** WebSocket URL to connect to. */
3
+ url: string;
4
+ /** Terminal columns (default: stdout columns). */
5
+ width?: number;
6
+ /** Terminal rows (default: stdout rows). */
7
+ height?: number;
8
+ }
9
+ /**
10
+ * Connect to a Geometra server WebSocket and render in the terminal.
11
+ * Returns a cleanup function to close the connection.
12
+ */
13
+ export declare function viewInTerminal(options: ViewOptions): {
14
+ close: () => void;
15
+ };
16
+ //# sourceMappingURL=viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CA4C1E"}
package/dist/viewer.js ADDED
@@ -0,0 +1,63 @@
1
+ import { TerminalRenderer } from '@geometra/renderer-terminal';
2
+ import WebSocket from 'ws';
3
+ function applyPatches(layout, patches) {
4
+ for (const patch of patches) {
5
+ let node = layout;
6
+ for (const idx of patch.path) {
7
+ node = node.children[idx];
8
+ }
9
+ if (patch.x !== undefined)
10
+ node.x = patch.x;
11
+ if (patch.y !== undefined)
12
+ node.y = patch.y;
13
+ if (patch.width !== undefined)
14
+ node.width = patch.width;
15
+ if (patch.height !== undefined)
16
+ node.height = patch.height;
17
+ }
18
+ }
19
+ /**
20
+ * Connect to a Geometra server WebSocket and render in the terminal.
21
+ * Returns a cleanup function to close the connection.
22
+ */
23
+ export function viewInTerminal(options) {
24
+ const renderer = new TerminalRenderer({
25
+ width: options.width,
26
+ height: options.height,
27
+ });
28
+ let layout = null;
29
+ let tree = null;
30
+ const ws = new WebSocket(options.url);
31
+ ws.on('message', (data) => {
32
+ try {
33
+ const msg = JSON.parse(data.toString());
34
+ if (msg.type === 'frame') {
35
+ const frame = msg;
36
+ layout = frame.layout;
37
+ tree = frame.tree;
38
+ renderer.render(layout, tree);
39
+ }
40
+ else if (msg.type === 'patch' && layout && tree) {
41
+ applyPatches(layout, msg.patches);
42
+ renderer.render(layout, tree);
43
+ }
44
+ }
45
+ catch {
46
+ // ignore parse errors
47
+ }
48
+ });
49
+ ws.on('error', (err) => {
50
+ process.stderr.write(`\x1b[31mConnection error: ${err.message}\x1b[0m\n`);
51
+ });
52
+ ws.on('close', () => {
53
+ renderer.destroy();
54
+ process.stderr.write('Disconnected.\n');
55
+ });
56
+ return {
57
+ close() {
58
+ ws.close();
59
+ renderer.destroy();
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAG9D,OAAO,SAAS,MAAM,IAAI,CAAA;AAe1B,SAAS,YAAY,CAAC,MAAsB,EAAE,OAA+B;IAC3E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAmB,MAAM,CAAA;QACjC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAE,CAAA;QAC5B,CAAC;QACD,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAC3C,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAC3C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACvD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAC5D,CAAC;AACH,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAoB;IACjD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;IAEF,IAAI,MAAM,GAA0B,IAAI,CAAA;IACxC,IAAI,IAAI,GAAqB,IAAI,CAAA;IAEjC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAErC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAEtD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,GAAkB,CAAA;gBAChC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;gBACrB,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;gBACjB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAClD,YAAY,CAAC,MAAM,EAAG,GAAmB,CAAC,OAAO,CAAC,CAAA;gBAClD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,OAAO,WAAW,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,QAAQ,CAAC,OAAO,EAAE,CAAA;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,QAAQ,CAAC,OAAO,EAAE,CAAA;QACpB,CAAC;KACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geometra/cli",
3
- "version": "1.13.1",
3
+ "version": "1.13.3",
4
4
  "description": "CLI to view any Geometra-powered site in the terminal",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -35,9 +35,9 @@
35
35
  "check": "tsc --noEmit"
36
36
  },
37
37
  "dependencies": {
38
- "@geometra/core": "^1.13.1",
39
- "@geometra/renderer-terminal": "^1.13.1",
40
- "textura": "^1.13.1",
38
+ "@geometra/core": "^1.13.3",
39
+ "@geometra/renderer-terminal": "^1.13.3",
40
+ "textura": "^1.13.3",
41
41
  "ws": "^8.18.0"
42
42
  },
43
43
  "devDependencies": {