roport 1.4.0 → 2.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/common/src/types.ts","../../../node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/uuid/dist/esm-node/regex.js","../../../node_modules/uuid/dist/esm-node/validate.js","../../../node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/uuid/dist/esm-node/v1.js","../../../node_modules/uuid/dist/esm-node/parse.js","../../../node_modules/uuid/dist/esm-node/v35.js","../../../node_modules/uuid/dist/esm-node/md5.js","../../../node_modules/uuid/dist/esm-node/v3.js","../../../node_modules/uuid/dist/esm-node/native.js","../../../node_modules/uuid/dist/esm-node/v4.js","../../../node_modules/uuid/dist/esm-node/sha1.js","../../../node_modules/uuid/dist/esm-node/v5.js","../../../node_modules/uuid/dist/esm-node/nil.js","../../../node_modules/uuid/dist/esm-node/version.js","../../../node_modules/uuid/dist/esm-node/index.js","../../../packages/common/src/utils/GuidGenerator.ts","../../../packages/common/src/utils/PathUtils.ts","../../../packages/common/src/index.ts","../src/cli/index.ts","../src/cli/build.ts","../src/build/Builder.ts","../src/schema/SchemaLoader.ts","../src/codecs/Encoder/Vector3.ts","../src/codecs/Encoder/Vector2.ts","../src/codecs/Encoder/CFrame.ts","../src/codecs/Encoder/Color3.ts","../src/codecs/Encoder/UDim.ts","../src/codecs/Encoder/Rect.ts","../src/codecs/Encoder/NumberRange.ts","../src/codecs/Encoder/Ray.ts","../src/codecs/Encoder/Enum.ts","../src/cli/serve.ts","../src/server/Server.ts","../src/net/ConnectionManager.ts","../src/ai/TreeSnapshot.ts","../src/fs/FileWatcher.ts","../src/fs/PathMapper.ts","../src/sync/OpReconciler.ts","../src/sync/Writer.ts","../src/server/ApiServer.ts","../src/cli/init.ts"],"sourcesContent":["export interface Op {\r\n id: string; // Unique ID of the operation\r\n type: OpType;\r\n payload: any;\r\n rev?: number; // Revision number\r\n baseRev?: number; // Base revision for conflict detection\r\n}\r\n\r\nexport enum OpType {\r\n CreateInstance = 'CreateInstance',\r\n SetProperties = 'SetProperties',\r\n ReparentInstance = 'ReparentInstance',\r\n DeleteInstance = 'DeleteInstance',\r\n ImportChunk = 'ImportChunk',\r\n}\r\n\r\nexport interface RoportEvent<T = any> {\r\n channel: 'dm' | 'fs' | 'logs' | 'assets' | 'control';\r\n topic: string;\r\n data: T;\r\n}\r\n\r\nexport interface Metadata {\r\n id: string; // GUID\r\n class: string;\r\n name: string;\r\n properties?: Record<string, any>; // Only diffs\r\n order?: string[];\r\n}\r\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nlet _nodeId;\n\nlet _clockseq; // Previous uuid creation time\n\n\nlet _lastMSecs = 0;\nlet _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n let i = buf && offset || 0;\n const b = buf || new Array(16);\n options = options || {};\n let node = options.node || _nodeId;\n let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n const seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (let n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || unsafeStringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import { unsafeStringify } from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n var _namespace;\n\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","import crypto from 'crypto';\n\nfunction md5(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return crypto.createHash('md5').update(bytes).digest();\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nconst v3 = v35('v3', 0x30, md5);\nexport default v3;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import crypto from 'crypto';\n\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return crypto.createHash('sha1').update(bytes).digest();\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nconst v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.slice(14, 15), 16);\n}\n\nexport default version;","export { default as v1 } from './v1.js';\nexport { default as v3 } from './v3.js';\nexport { default as v4 } from './v4.js';\nexport { default as v5 } from './v5.js';\nexport { default as NIL } from './nil.js';\nexport { default as version } from './version.js';\nexport { default as validate } from './validate.js';\nexport { default as stringify } from './stringify.js';\nexport { default as parse } from './parse.js';","import { v4 as uuidv4 } from 'uuid';\r\n\r\nexport class GuidGenerator {\r\n static generate(): string {\r\n return uuidv4();\r\n }\r\n}\r\n","export class PathUtils {\r\n static readonly SEPARATOR = '/';\r\n\r\n static normalize(path: string): string {\r\n return path.replace(/\\\\/g, this.SEPARATOR);\r\n }\r\n\r\n static join(...parts: string[]): string {\r\n return parts.map(p => this.normalize(p)).join(this.SEPARATOR).replace(/\\/+/g, this.SEPARATOR);\r\n }\r\n \r\n static getParent(path: string): string {\r\n const normalized = this.normalize(path);\r\n const lastIndex = normalized.lastIndexOf(this.SEPARATOR);\r\n if (lastIndex === -1) return '';\r\n return normalized.substring(0, lastIndex);\r\n }\r\n\r\n static getName(path: string): string {\r\n const normalized = this.normalize(path);\r\n const lastIndex = normalized.lastIndexOf(this.SEPARATOR);\r\n return normalized.substring(lastIndex + 1);\r\n }\r\n}\r\n","export * from './types';\r\nexport * from './utils/GuidGenerator';\r\nexport * from './utils/PathUtils';\r\n","#!/usr/bin/env node\r\nimport { Command } from 'commander';\r\nimport { buildCommand } from './build';\r\nimport { serveCommand } from './serve';\r\nimport { initCommand } from './init';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('roport')\r\n .description('Roport V2 CLI - AI-First Roblox Development')\r\n .version('2.0.0');\r\n\r\nprogram.addCommand(buildCommand);\r\nprogram.addCommand(serveCommand);\r\nprogram.addCommand(initCommand);\r\n\r\nprogram.parse(process.argv);\r\n","import { Command } from 'commander';\r\nimport path from 'path';\r\nimport { Builder } from '../build/Builder';\r\n\r\nexport const buildCommand = new Command('build')\r\n .description('Build the project into a Roblox Model/Place file')\r\n .argument('[dir]', 'Project directory', '.')\r\n .option('-o, --output <path>', 'Output file path', 'game.rbxmx')\r\n .action(async (dir, options) => {\r\n const cwd = process.cwd();\r\n const rootPath = path.resolve(cwd, dir);\r\n const outputPath = path.resolve(cwd, options.output);\r\n\r\n console.log(`[Roport] Building from ${rootPath} to ${outputPath}...`);\r\n \r\n try {\r\n const builder = new Builder(rootPath);\r\n await builder.build(outputPath);\r\n } catch (e) {\r\n console.error('[Roport] Build failed:', e);\r\n process.exit(1);\r\n }\r\n });\r\n\r\n","import fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { SchemaLoader } from '../schema/SchemaLoader';\r\nimport { encodeVector3 } from '../codecs/Encoder/Vector3';\r\nimport { encodeVector2 } from '../codecs/Encoder/Vector2';\r\nimport { encodeCFrame } from '../codecs/Encoder/CFrame';\r\nimport { encodeColor3 } from '../codecs/Encoder/Color3';\r\nimport { encodeUDim, encodeUDim2 } from '../codecs/Encoder/UDim';\r\nimport { encodeRect } from '../codecs/Encoder/Rect';\r\nimport { encodeNumberRange } from '../codecs/Encoder/NumberRange';\r\nimport { encodeRay } from '../codecs/Encoder/Ray';\r\nimport { encodeEnum } from '../codecs/Encoder/Enum';\r\n\r\ninterface BuildNode {\r\n className: string;\r\n name: string;\r\n properties: Record<string, any>;\r\n children: BuildNode[];\r\n}\r\n\r\nexport class Builder {\r\n private schemaLoader: SchemaLoader;\r\n\r\n constructor(private rootPath: string) {\r\n this.schemaLoader = new SchemaLoader(path.join(rootPath, '.roport', 'cache'));\r\n }\r\n\r\n public async build(outputPath: string): Promise<void> {\r\n console.log(`[Builder] Starting build from ${this.rootPath}...`);\r\n \r\n await this.schemaLoader.load();\r\n\r\n const projectPath = path.join(this.rootPath, 'default.project.json');\r\n let projectJson: any = null;\r\n try {\r\n const projectContent = await fs.readFile(projectPath, 'utf-8');\r\n projectJson = JSON.parse(projectContent);\r\n } catch { }\r\n\r\n let roots: BuildNode[] = [];\r\n\r\n if (projectJson && projectJson.tree) {\r\n console.log('[Builder] Found default.project.json');\r\n for (const [key, value] of Object.entries(projectJson.tree)) {\r\n if (key.startsWith('$')) continue;\r\n const nodeDef = value as any;\r\n const nodePath = nodeDef.$path ? path.resolve(this.rootPath, nodeDef.$path) : null;\r\n const className = nodeDef.$className || key;\r\n if (nodePath) {\r\n try {\r\n const builtNode = await this.buildNode(nodePath);\r\n if (builtNode) {\r\n builtNode.className = className;\r\n builtNode.name = key;\r\n roots.push(builtNode);\r\n }\r\n } catch (e) { console.warn(`[Builder] Missing path for ${key}: ${nodePath}`); }\r\n }\r\n }\r\n } else {\r\n console.log('[Builder] using directory scan...');\r\n const root = await this.buildNode(this.rootPath);\r\n if (root) roots.push(root);\r\n }\r\n \r\n if (roots.length === 0) throw new Error(\"No buildable content found\");\r\n\r\n let xmlContent = `<roblox xmlns:xmime=\"http://www.w3.org/2005/05/xmlmime\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.roblox.com/roblox.xsd\" version=\"4\">\\n`;\r\n for (const root of roots) {\r\n xmlContent += this.generateXmlInner(root, 1);\r\n }\r\n xmlContent += `</roblox>`;\r\n \r\n await fs.writeFile(outputPath, xmlContent);\r\n console.log(`[Builder] Build written to ${outputPath}`);\r\n }\r\n\r\n private async buildNode(dirPath: string): Promise<BuildNode | null> {\r\n // Check if directory exists\r\n try {\r\n await fs.access(dirPath);\r\n } catch {\r\n return null;\r\n }\r\n\r\n // Read meta file\r\n const metaPath = path.join(dirPath, '__meta.json');\r\n let meta: any = {};\r\n try {\r\n const metaContent = await fs.readFile(metaPath, 'utf-8');\r\n meta = JSON.parse(metaContent);\r\n } catch (e) {\r\n // Implicit folder or workspace root?\r\n // If strictly enforced, we might return null.\r\n // For now, assume simple Folder if no meta, or use directory name\r\n meta = {\r\n class: \"Folder\",\r\n name: path.basename(dirPath),\r\n properties: {}\r\n };\r\n }\r\n\r\n const node: BuildNode = {\r\n className: meta.class || \"Folder\",\r\n name: meta.name || path.basename(dirPath),\r\n properties: meta.properties || {},\r\n children: []\r\n };\r\n\r\n // Read scripts\r\n // Check for .server.luau, .client.luau, .luau (ModuleScript) in this directory?\r\n // OR are scripts strictly sub-files? \r\n // In Roport V2, scripts are files that might have associated meta.\r\n // We need to list contents.\r\n\r\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\r\n \r\n // Sort/prioritize?\r\n \r\n for (const entry of entries) {\r\n const entryPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n if (entry.name === '.roport_trash' || entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist' || entry.name === 'out') continue;\r\n\r\n const childNode = await this.buildNode(entryPath);\r\n if (childNode) {\r\n node.children.push(childNode);\r\n }\r\n } else if (entry.isFile()) {\r\n // Check if it is a script\r\n if (entry.name.endsWith('.luau')) {\r\n // It's a script. In Roport V2 layout, does a script sit NEXT to the folder or INSIDE?\r\n // \"Scripts map to .luau files.\"\r\n // If we are scanning a folder, we might find \"MyScript.luau\".\r\n // Does \"MyScript.luau\" have a \"MyScript\" folder for children?\r\n // Roport usually uses folders.\r\n \r\n const scriptNode = await this.scriptToNode(entryPath);\r\n if (scriptNode) node.children.push(scriptNode);\r\n }\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private async scriptToNode(filePath: string): Promise<BuildNode> {\r\n const name = path.basename(filePath, '.luau').replace(/\\.(server|client)$/, '');\r\n let className = 'ModuleScript';\r\n if (filePath.endsWith('.server.luau')) className = 'Script';\r\n else if (filePath.endsWith('.client.luau')) className = 'LocalScript';\r\n\r\n const source = await fs.readFile(filePath, 'utf-8');\r\n\r\n return {\r\n className,\r\n name,\r\n properties: {\r\n Source: source // Special handling for XML needed\r\n },\r\n children: []\r\n };\r\n }\r\n\r\n private generateXml(node: BuildNode, indentLevel: number = 0): string {\r\n if (indentLevel === 0) {\r\n let xml = `<roblox xmlns:xmime=\"http://www.w3.org/2005/05/xmlmime\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.roblox.com/roblox.xsd\" version=\"4\">\\n`;\r\n xml += this.generateXmlInner(node, 1);\r\n xml += `</roblox>`;\r\n return xml;\r\n }\r\n return this.generateXmlInner(node, indentLevel);\r\n }\r\n\r\n private generateXmlInner(node: BuildNode, indentLevel: number): string {\r\n const indent = ' '.repeat(indentLevel);\r\n let xml = `${indent}<Item class=\"${node.className}\" referent=\"RBX${Math.random().toString(36).substr(2, 9)}\">\\n`;\r\n \r\n // Properties\r\n xml += `${indent} <Properties>\\n`;\r\n xml += `${indent} <string name=\"Name\">${node.name}</string>\\n`;\r\n \r\n for (const [propName, propValue] of Object.entries(node.properties)) {\r\n if (propName === 'Source') {\r\n const safeSource = (propValue as string)\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n xml += `${indent} <ProtectedString name=\"Source\">${safeSource}</ProtectedString>\\n`;\r\n continue;\r\n }\r\n\r\n const type = this.schemaLoader.getPropertyType(node.className, propName) || 'string';\r\n\r\n if (type === 'Vector3') xml += `${indent} ${encodeVector3(propName, propValue)}\\n`;\r\n else if (type === 'Vector2') xml += `${indent} ${encodeVector2(propName, propValue)}\\n`;\r\n else if (type === 'CFrame') xml += `${indent} ${encodeCFrame(propName, propValue)}\\n`;\r\n else if (type === 'Color3') xml += `${indent} ${encodeColor3(propName, propValue)}\\n`;\r\n else if (type === 'UDim') xml += `${indent} ${encodeUDim(propName, propValue)}\\n`;\r\n else if (type === 'UDim2') xml += `${indent} ${encodeUDim2(propName, propValue)}\\n`;\r\n else if (type === 'Rect') xml += `${indent} ${encodeRect(propName, propValue)}\\n`;\r\n else if (type === 'NumberRange') xml += `${indent} ${encodeNumberRange(propName, propValue)}\\n`;\r\n else if (type === 'Ray') xml += `${indent} ${encodeRay(propName, propValue)}\\n`;\r\n else if (type === 'string') xml += `${indent} <string name=\"${propName}\">${propValue}</string>\\n`;\r\n else if (type === 'bool') xml += `${indent} <bool name=\"${propName}\">${propValue}</bool>\\n`;\r\n else if (type === 'double' || type === 'float') xml += `${indent} <float name=\"${propName}\">${propValue}</float>\\n`;\r\n else if (type === 'int' || type === 'int64') xml += `${indent} <int64 name=\"${propName}\">${propValue}</int64>\\n`;\r\n else {\r\n // Check for Enum pattern\r\n if (typeof propValue === 'string' && propValue.startsWith('Enum.')) {\r\n const parts = propValue.split('.');\r\n if (parts.length === 3) {\r\n const val = this.schemaLoader.getEnumValue(parts[1], parts[2]);\r\n xml += `${indent} ${encodeEnum(propName, propValue, val)}\\n`;\r\n }\r\n }\r\n }\r\n }\r\n xml += `${indent} </Properties>\\n`;\r\n\r\n // Children\r\n for (const child of node.children) {\r\n xml += this.generateXmlInner(child, indentLevel + 1);\r\n }\r\n\r\n xml += `${indent}</Item>\\n`;\r\n return xml;\r\n }\r\n}\r\n","import axios from 'axios';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\n\r\nexport class SchemaLoader {\r\n private dumpUrl = 'https://raw.githubusercontent.com/CloneTrooper1019/Roblox-Client-Tracker/roblox/API-Dump.json';\r\n private cachePath: string;\r\n private apiDump: any = null;\r\n\r\n constructor(cacheDir: string) {\r\n this.cachePath = path.join(cacheDir, 'api-dump.json');\r\n }\r\n\r\n public async load() {\r\n try {\r\n // Try loading from cache first\r\n const data = await fs.readFile(this.cachePath, 'utf-8');\r\n this.apiDump = JSON.parse(data);\r\n console.log('[Roport] Loaded API Dump from cache');\r\n } catch (e) {\r\n console.log('[Roport] Cache not found, fetching API Dump...');\r\n await this.update();\r\n }\r\n }\r\n\r\n public async update() {\r\n try {\r\n const response = await axios.get(this.dumpUrl);\r\n this.apiDump = response.data;\r\n await fs.mkdir(path.dirname(this.cachePath), { recursive: true });\r\n await fs.writeFile(this.cachePath, JSON.stringify(this.apiDump));\r\n console.log('[Roport] API Dump updated and cached');\r\n } catch (e) {\r\n console.error('[Roport] Failed to fetch API Dump', e);\r\n }\r\n }\r\n\r\n public getDump() {\r\n return this.apiDump;\r\n }\r\n\r\n public getPropertyType(className: string, propName: string): string | null {\r\n if (!this.apiDump) return null;\r\n\r\n let currentClass = className;\r\n while (currentClass && currentClass !== '<<ROOT>>') {\r\n const classDef = this.apiDump.Classes.find((c: any) => c.Name === currentClass);\r\n if (!classDef) break;\r\n\r\n const prop = classDef.Members.find((m: any) => m.Name === propName && m.MemberType === 'Property');\r\n if (prop) {\r\n return prop.ValueType.Name;\r\n }\r\n \r\n currentClass = classDef.Superclass;\r\n }\r\n return null;\r\n }\r\n\r\n public getEnumValue(enumName: string, itemName: string): number {\r\n if (!this.apiDump) return 0;\r\n \r\n const enumDef = this.apiDump.Enums.find((e: any) => e.Name === enumName);\r\n if (!enumDef) return 0;\r\n\r\n const item = enumDef.Items.find((i: any) => i.Name === itemName);\r\n return item ? item.Value : 0;\r\n }\r\n}\r\n","export function encodeVector3(name: string, val: any): string {\r\n const x = val?.v?.[0] ?? 0;\r\n const y = val?.v?.[1] ?? 0;\r\n const z = val?.v?.[2] ?? 0;\r\n\r\n return `<Vector3 name=\"${name}\">\r\n <X>${x}</X>\r\n <Y>${y}</Y>\r\n <Z>${z}</Z>\r\n </Vector3>`;\r\n}\r\n","export function encodeVector2(name: string, val: any): string {\r\n const x = val?.v?.[0] ?? 0;\r\n const y = val?.v?.[1] ?? 0;\r\n\r\n return `<Vector2 name=\"${name}\">\r\n <X>${x}</X>\r\n <Y>${y}</Y>\r\n </Vector2>`;\r\n}\r\n","export function encodeCFrame(name: string, val: any): string {\r\n const v = val?.v || [];\r\n const x = v[0] ?? 0;\r\n const y = v[1] ?? 0;\r\n const z = v[2] ?? 0;\r\n const r00 = v[3] ?? 1;\r\n const r01 = v[4] ?? 0;\r\n const r02 = v[5] ?? 0;\r\n const r10 = v[6] ?? 0;\r\n const r11 = v[7] ?? 1;\r\n const r12 = v[8] ?? 0;\r\n const r20 = v[9] ?? 0;\r\n const r21 = v[10] ?? 0;\r\n const r22 = v[11] ?? 1;\r\n\r\n return `<CoordinateFrame name=\"${name}\">\r\n <X>${x}</X>\r\n <Y>${y}</Y>\r\n <Z>${z}</Z>\r\n <R00>${r00}</R00>\r\n <R01>${r01}</R01>\r\n <R02>${r02}</R02>\r\n <R10>${r10}</R10>\r\n <R11>${r11}</R11>\r\n <R12>${r12}</R12>\r\n <R20>${r20}</R20>\r\n <R21>${r21}</R21>\r\n <R22>${r22}</R22>\r\n </CoordinateFrame>`;\r\n}\r\n","export function encodeColor3(name: string, val: any): string {\r\n // Stored as RGB 0-1 in .v\r\n // XML expects 0-?\r\n // Validated: RBXMX uses 0-1 float for Color3 usually? Or is it specific tag?\r\n // <Color3 name=\"Color\">\r\n // <R>0.639216</R>\r\n // <G>0.635294</G>\r\n // <B>0.647059</B>\r\n // </Color3>\r\n // Yes, 0-1 floats.\r\n \r\n const r = val?.v?.[0] ?? 0;\r\n const g = val?.v?.[1] ?? 0;\r\n const b = val?.v?.[2] ?? 0;\r\n\r\n return `<Color3 name=\"${name}\">\r\n <R>${r}</R>\r\n <G>${g}</G>\r\n <B>${b}</B>\r\n </Color3>`;\r\n}\r\n","export function encodeUDim(name: string, val: any): string {\r\n const s = val?.v?.[0] ?? 0;\r\n const o = val?.v?.[1] ?? 0;\r\n\r\n return `<UDim name=\"${name}\">\r\n <S>${s}</S>\r\n <O>${o}</O>\r\n </UDim>`;\r\n}\r\n\r\nexport function encodeUDim2(name: string, val: any): string {\r\n const xs = val?.v?.[0] ?? 0;\r\n const xo = val?.v?.[1] ?? 0;\r\n const ys = val?.v?.[2] ?? 0;\r\n const yo = val?.v?.[3] ?? 0;\r\n\r\n return `<UDim2 name=\"${name}\">\r\n <XS>${xs}</XS>\r\n <XO>${xo}</XO>\r\n <YS>${ys}</YS>\r\n <YO>${yo}</YO>\r\n </UDim2>`;\r\n}\r\n","export function encodeRect(name: string, val: any): string {\r\n const x0 = val?.v?.[0] ?? 0;\r\n const y0 = val?.v?.[1] ?? 0;\r\n const x1 = val?.v?.[2] ?? 0;\r\n const y1 = val?.v?.[3] ?? 0;\r\n\r\n return `<Rect2D name=\"${name}\">\r\n <min>\r\n <X>${x0}</X>\r\n <Y>${y0}</Y>\r\n </min>\r\n <max>\r\n <X>${x1}</X>\r\n <Y>${y1}</Y>\r\n </max>\r\n </Rect2D>`;\r\n}\r\n","export function encodeNumberRange(name: string, val: any): string {\r\n const min = val?.v?.[0] ?? 0;\r\n const max = val?.v?.[1] ?? 0;\r\n\r\n return `<NumberRange name=\"${name}\">${min} ${max}</NumberRange>`;\r\n}\r\n","export function encodeRay(name: string, val: any): string {\r\n const ox = val?.v?.[0] ?? 0;\r\n const oy = val?.v?.[1] ?? 0;\r\n const oz = val?.v?.[2] ?? 0;\r\n const dx = val?.v?.[3] ?? 0;\r\n const dy = val?.v?.[4] ?? 0;\r\n const dz = val?.v?.[5] ?? 0;\r\n\r\n return `<Ray name=\"${name}\">\r\n <origin>\r\n <X>${ox}</X>\r\n <Y>${oy}</Y>\r\n <Z>${oz}</Z>\r\n </origin>\r\n <direction>\r\n <X>${dx}</X>\r\n <Y>${dy}</Y>\r\n <Z>${dz}</Z>\r\n </direction>\r\n </Ray>`;\r\n}\r\n","export function encodeEnum(name: string, val: any, enumValue?: number): string {\r\n // If we have the resolved integer value, use it.\r\n // If not, we might be stuck.\r\n // val is \"Enum.Type.Item\"\r\n \r\n // For now, if enumValue is provided, use it.\r\n // Otherwise, default to 0 and warn?\r\n const value = enumValue !== undefined ? enumValue : 0;\r\n\r\n return `<token name=\"${name}\">${value}</token>`;\r\n}\r\n","import { Command } from 'commander';\r\nimport path from 'path';\r\nimport { RoportServer } from '../server/Server';\r\n\r\nexport const serveCommand = new Command('serve')\r\n .description('Start the Roport sync server')\r\n .argument('[dir]', 'Project directory', '.')\r\n .action(async (dir) => {\r\n const workspacePath = path.resolve(process.cwd(), dir);\r\n const server = new RoportServer(workspacePath);\r\n await server.start();\r\n \r\n // Keep process alive\r\n process.stdin.resume();\r\n });\r\n","import path from 'path';\r\nimport fs from 'fs';\r\nimport { ConnectionManager } from '../net/ConnectionManager';\r\nimport { FileWatcher } from '../fs/FileWatcher';\r\nimport { PathMapper } from '../fs/PathMapper';\r\nimport { OpReconciler } from '../sync/OpReconciler';\r\nimport { Writer } from '../sync/Writer';\r\nimport { ApiServer } from './ApiServer';\r\nimport { RoportEvent } from '@roport/common';\r\n\r\nexport class RoportServer {\r\n private connectionManager: ConnectionManager;\r\n private fileWatcher: FileWatcher;\r\n private pathMapper: PathMapper;\r\n private opReconciler: OpReconciler;\r\n private writer: Writer;\r\n private apiServer: ApiServer;\r\n\r\n constructor(private workspacePath: string) {\r\n this.connectionManager = new ConnectionManager(workspacePath);\r\n this.pathMapper = new PathMapper();\r\n this.fileWatcher = new FileWatcher(workspacePath);\r\n this.opReconciler = new OpReconciler(this.pathMapper);\r\n this.writer = new Writer(workspacePath, this.pathMapper);\r\n this.apiServer = new ApiServer(workspacePath);\r\n }\r\n\r\n public async start() {\r\n console.log(`[Roport] Starting server in ${this.workspacePath}`);\r\n \r\n // 0. Start API Server\r\n this.apiServer.start();\r\n \r\n // 1. Build Index\r\n console.log('[Roport] Rebuilding index...');\r\n await this.pathMapper.rebuildIndex(this.workspacePath);\r\n\r\n // 2. Wire Disk -> Studio\r\n // Handle Directory Events to keep PathMapper clean\r\n this.fileWatcher.on('addDir', (dirPath) => {\r\n // Re-scan or let OpReconciler handle it?\r\n // Since we rely on meta files, maybe we wait for the meta?\r\n // But if a user blindly renames, we might need to know.\r\n // For now, let's keep it simple. PathMapper is updated by Writer, \r\n // but externally renaming a folder is separate.\r\n });\r\n\r\n this.fileWatcher.on('unlinkDir', (dirPath) => {\r\n // If folder deleted externally, remove from map\r\n this.pathMapper.removeByPath(dirPath);\r\n });\r\n\r\n this.fileWatcher.on('change', async (filePath) => {\r\n if (filePath.endsWith('__meta.json')) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const meta = JSON.parse(content);\r\n \r\n // Update Mapper on read if not set (e.g. initial add or external add)\r\n const dirPath = path.dirname(filePath);\r\n if (meta.id) {\r\n this.pathMapper.set(dirPath, meta.id);\r\n }\r\n\r\n const ops = this.opReconciler.reconcileMeta(filePath, meta);\r\n \r\n ops.forEach(op => {\r\n this.connectionManager.broadcast({\r\n channel: 'dm',\r\n topic: 'events',\r\n data: op\r\n });\r\n });\r\n } catch (e) {\r\n console.error(`[Roport] Failed to process meta change ${filePath}`, e);\r\n }\r\n } else if (filePath.endsWith('.luau')) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const ops = this.opReconciler.reconcileScript(filePath, content);\r\n \r\n ops.forEach(op => {\r\n this.connectionManager.broadcast({\r\n channel: 'dm',\r\n topic: 'events',\r\n data: op\r\n });\r\n });\r\n } catch (e) {\r\n console.error(`[Roport] Failed to process script change ${filePath}`, e);\r\n }\r\n }\r\n });\r\n\r\n // 3. Wire Studio -> Disk\r\n this.connectionManager.on('event', async (event: RoportEvent) => {\r\n if (event.channel === 'dm' && event.topic === 'events') {\r\n const op = event.data;\r\n console.log(`[Roport] Received Studio Op: ${op.type}`);\r\n await this.writer.applyOp({\r\n id: `op-studio-${Date.now()}`,\r\n type: op.type,\r\n payload: op\r\n });\r\n } else if (event.channel === 'logs') {\r\n console.log(`[Studio Log] ${event.data.message}`);\r\n }\r\n });\r\n \r\n console.log('[Roport] Server ready.');\r\n }\r\n}\r\n","import { WebSocketServer, WebSocket } from 'ws';\r\nimport { RoportEvent } from '@roport/common';\r\nimport { EventEmitter } from 'events';\r\nimport http from 'http';\r\nimport express, { Request, Response } from 'express';\r\nimport cors from 'cors';\r\n\r\nimport { TreeSnapshot } from '../ai/TreeSnapshot';\r\n\r\nexport class ConnectionManager extends EventEmitter {\r\n private wss: WebSocketServer | undefined;\r\n private httpServer: http.Server | undefined;\r\n private app: express.Application;\r\n private clients: Set<WebSocket> = new Set();\r\n private port: number = 34872;\r\n private messageQueue: { id: string, event: RoportEvent }[] = [];\r\n private pollWaiters: { res: Response, since: number }[] = [];\r\n private workspacePath: string;\r\n\r\n constructor(workspacePath: string) {\r\n super();\r\n this.workspacePath = workspacePath;\r\n this.app = express();\r\n this.config();\r\n this.startServer();\r\n }\r\n\r\n private config() {\r\n this.app.use(cors());\r\n this.app.use(express.json({ limit: '50mb' }));\r\n \r\n this.app.get('/', (req, res) => {\r\n res.send('Roport Sync Server');\r\n });\r\n\r\n this.app.get('/status', (req, res) => {\r\n res.json({ status: 'running', version: '2.0.0' });\r\n });\r\n\r\n // Serve the real tree snapshot\r\n this.app.get('/tree', async (req, res) => {\r\n const snapshot = new TreeSnapshot(this.workspacePath);\r\n const tree = await snapshot.generate();\r\n res.json(tree);\r\n });\r\n\r\n // Polling endpoint for Studio\r\n this.app.get('/api/poll', (req: Request, res: Response) => {\r\n // If we have messages newer than 'since', return immediately\r\n // Else wait (long poll)\r\n // simplified for now: just return all new messages or empty\r\n \r\n // In a robust implementation, we'd use long polling.\r\n // For this fix: simple return of pending messages in queue.\r\n \r\n const messages = this.messageQueue; \r\n // Ideally we clear queue after ack, but for now let's just send what we have \r\n // and rely on a simple 'pop' mechanic for a single client assumption or better: logic.\r\n \r\n // \"Rojo-like\" is quite complex. Let's do a simple poll.\r\n // We pop all messages and send them.\r\n const sending = [...this.messageQueue];\r\n this.messageQueue = []; \r\n \r\n res.json({ events: sending.map(x => x.event) });\r\n });\r\n\r\n this.app.post('/api/push', (req: Request, res: Response) => {\r\n try {\r\n const event: RoportEvent = req.body;\r\n this.emit('event', event);\r\n res.json({ success: true });\r\n } catch (e) {\r\n console.error(e);\r\n res.status(500).json({ error: 'Failed to process' });\r\n }\r\n });\r\n }\r\n\r\n private startServer() {\r\n this.httpServer = http.createServer(this.app);\r\n this.wss = new WebSocketServer({ server: this.httpServer });\r\n\r\n this.httpServer.listen(this.port, () => {\r\n console.log(`[Roport] Sync Server (HTTP/WS) listening on port ${this.port}`);\r\n });\r\n\r\n this.wss.on('connection', (ws: WebSocket) => {\r\n console.log('[Roport] Client connected (WS)');\r\n this.clients.add(ws);\r\n this.setupHeartbeat(ws);\r\n\r\n ws.on('message', (message: any) => {\r\n this.handleMessage(ws, message);\r\n });\r\n\r\n ws.on('close', () => {\r\n console.log('[Roport] Client disconnected (WS)');\r\n this.clients.delete(ws);\r\n });\r\n \r\n ws.on('error', (err) => {\r\n console.error('[Roport] WebSocket error:', err);\r\n });\r\n });\r\n }\r\n\r\n private setupHeartbeat(ws: WebSocket) {\r\n const pingInterval = setInterval(() => {\r\n if (ws.readyState === WebSocket.OPEN) {\r\n ws.ping();\r\n } else {\r\n clearInterval(pingInterval);\r\n }\r\n }, 30000);\r\n \r\n ws.on('close', () => clearInterval(pingInterval));\r\n }\r\n\r\n private handleMessage(sender: WebSocket, rawMessage: any) {\r\n try {\r\n const event: RoportEvent = JSON.parse(rawMessage.toString());\r\n // Emit event so Main can route it\r\n this.emit('event', event); \r\n } catch (e) {\r\n console.error('[Roport] Failed to parse message', e);\r\n }\r\n }\r\n\r\n public broadcast(event: RoportEvent) {\r\n // 1. Send to WS clients\r\n const payload = JSON.stringify(event);\r\n this.clients.forEach(client => {\r\n if (client.readyState === WebSocket.OPEN) {\r\n client.send(payload);\r\n }\r\n });\r\n\r\n // 2. Queue for HTTP pollers\r\n // limit queue size\r\n if (this.messageQueue.length > 1000) this.messageQueue.shift();\r\n this.messageQueue.push({ id: Date.now().toString(), event });\r\n }\r\n}\r\n","import fs from 'fs';\r\nimport path from 'path';\r\n\r\nexport interface TreeNode {\r\n name: string;\r\n className: string;\r\n id: string;\r\n children?: TreeNode[];\r\n properties?: Record<string, any>;\r\n filePath?: string;\r\n}\r\n\r\nexport class TreeSnapshot {\r\n constructor(private rootPath: string) {}\r\n\r\n public async generate(): Promise<TreeNode[]> {\r\n const nodes: TreeNode[] = [];\r\n \r\n // Ensure root exists\r\n if (!fs.existsSync(this.rootPath)) return nodes;\r\n\r\n const entries = fs.readdirSync(this.rootPath);\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(this.rootPath, entry);\r\n // Ignore hidden files / node_modules\r\n if (entry.startsWith('.') || entry === 'node_modules') continue;\r\n\r\n if (fs.statSync(fullPath).isDirectory()) {\r\n const node = await this.scanRecursive(fullPath);\r\n if (node) {\r\n nodes.push(node);\r\n }\r\n }\r\n }\r\n return nodes;\r\n }\r\n\r\n private async scanRecursive(dirPath: string): Promise<TreeNode | null> {\r\n const metaPath = path.join(dirPath, '__meta.json');\r\n \r\n let meta: any = {};\r\n if (fs.existsSync(metaPath)) {\r\n try {\r\n meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));\r\n } catch (e) {\r\n console.warn(`[Roport] Bad meta at ${dirPath}`);\r\n }\r\n } else {\r\n // Implicit Folder?\r\n // Only include if it maps to a Roblox service container name\r\n // Or if we decide to treat regular folders as Folders.\r\n meta = { class: 'Folder', name: path.basename(dirPath), id: 'implicit-' + path.basename(dirPath) };\r\n }\r\n\r\n const node: TreeNode = {\r\n name: meta.name || path.basename(dirPath),\r\n className: meta.class || 'Folder',\r\n id: meta.id || meta.guid || ('gen-' + Math.random()), \r\n properties: meta.properties,\r\n children: [],\r\n filePath: dirPath\r\n };\r\n\r\n const entries = fs.readdirSync(dirPath);\r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry);\r\n if (entry.startsWith('.') || entry === '__meta.json') continue;\r\n\r\n const stat = fs.statSync(fullPath);\r\n\r\n if (stat.isDirectory()) {\r\n const child = await this.scanRecursive(fullPath);\r\n if (child) {\r\n node.children?.push(child);\r\n }\r\n } else if (entry.endsWith('.luau')) {\r\n // Handle Script Files\r\n const name = path.basename(entry, '.luau').replace(/\\.(server|client)$/, '');\r\n let className = 'ModuleScript';\r\n if (entry.endsWith('.server.luau')) className = 'Script';\r\n else if (entry.endsWith('.client.luau')) className = 'LocalScript';\r\n\r\n node.children?.push({\r\n name,\r\n className,\r\n id: 'script-' + name, // Placeholder ID\r\n children: [],\r\n filePath: fullPath\r\n });\r\n }\r\n }\r\n return node;\r\n }\r\n}\r\n","import chokidar from 'chokidar';\r\nimport { EventEmitter } from 'events';\r\n\r\n// Emits raw FS events\r\nexport class FileWatcher extends EventEmitter {\r\n private watcher: chokidar.FSWatcher | null = null;\r\n \r\n constructor(private rootPath: string) {\r\n super();\r\n this.initialize();\r\n }\r\n\r\n private initialize() {\r\n this.watcher = chokidar.watch(this.rootPath, {\r\n ignored: [\r\n /(^|[\\/\\\\])\\../, // ignore dotfiles\r\n '**/node_modules/**',\r\n '**/.git/**',\r\n '**/.roport_trash/**'\r\n ],\r\n persistent: true,\r\n ignoreInitial: true \r\n });\r\n\r\n this.watcher\r\n .on('add', path => this.emit('add', path))\r\n .on('change', path => this.emit('change', path))\r\n .on('unlink', path => this.emit('unlink', path))\r\n .on('addDir', path => this.emit('addDir', path))\r\n .on('unlinkDir', path => this.emit('unlinkDir', path))\r\n .on('error', error => console.error(`[Roport] Watcher error: ${error}`));\r\n \r\n console.log(`[Roport] FileWatcher started on ${this.rootPath}`);\r\n }\r\n\r\n public close() {\r\n this.watcher?.close();\r\n }\r\n}\r\n","// Maps Path <-> GUID\r\nexport class PathMapper {\r\n private pathToGuid: Map<string, string> = new Map();\r\n private guidToPath: Map<string, string> = new Map();\r\n\r\n public set(path: string, guid: string) {\r\n this.pathToGuid.set(path, guid);\r\n this.guidToPath.set(guid, path);\r\n }\r\n\r\n public removeByPath(path: string) {\r\n const guid = this.pathToGuid.get(path);\r\n if (guid) {\r\n this.pathToGuid.delete(path);\r\n this.guidToPath.delete(guid);\r\n }\r\n }\r\n\r\n public removeByGuid(guid: string) {\r\n const path = this.guidToPath.get(guid);\r\n if (path) {\r\n this.guidToPath.delete(guid);\r\n this.pathToGuid.delete(path);\r\n }\r\n }\r\n\r\n resolveGuid(path: string): string | undefined { \r\n return this.pathToGuid.get(path); \r\n }\r\n\r\n resolvePath(guid: string): string | undefined { \r\n return this.guidToPath.get(guid); \r\n }\r\n\r\n // TODO: Implement Index Rebuild (scan disk on startup)\r\n public async rebuildIndex(rootPath: string): Promise<void> {\r\n // recursive scan to find __meta.json and populate maps\r\n await this.scanDir(rootPath);\r\n }\r\n\r\n private async scanDir(dir: string) {\r\n // Simple implementation using fs/promises (assuming imported or available)\r\n const fs = require('fs/promises');\r\n const path = require('path');\r\n \r\n try {\r\n const entries = await fs.readdir(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory() && !fullPath.includes('node_modules') && !fullPath.includes('.git') && !fullPath.includes('.roport_trash')) {\r\n // Check for meta\r\n try {\r\n const metaPath = path.join(fullPath, '__meta.json');\r\n const metaContent = await fs.readFile(metaPath, 'utf-8');\r\n const meta = JSON.parse(metaContent);\r\n if (meta.id) {\r\n this.set(fullPath, meta.id);\r\n }\r\n } catch (e) {\r\n // No meta or invalid\r\n }\r\n await this.scanDir(fullPath);\r\n }\r\n }\r\n } catch (e) {\r\n console.error(`[Roport] Scan error at ${dir}:`, e);\r\n }\r\n }\r\n}\r\n","import { Op, OpType } from '@roport/common';\r\nimport { PathMapper } from '../fs/PathMapper';\r\nimport path from 'path';\r\n\r\n// Converts FS events to Ops\r\nexport class OpReconciler {\r\n constructor(private pathMapper: PathMapper) {}\r\n\r\n public reconcileMeta(filePath: string, meta: any): Op[] {\r\n const ops: Op[] = [];\r\n \r\n // Ensure ID presence\r\n if (!meta.id) {\r\n console.warn(`[Roport] Meta file at ${filePath} missing ID`);\r\n return ops;\r\n }\r\n\r\n // Check if map knows this ID\r\n const existingPath = this.pathMapper.resolvePath(meta.id);\r\n \r\n // If known and path matches (or we don't care about path mismatch for property update)\r\n // We generate SetProperties\r\n // In a real reconciler, we would diff against a cache to minimalize ops.\r\n // potentially generate CreateInstance if completely new.\r\n \r\n const isNew = !existingPath; \r\n \r\n if (isNew) {\r\n // It's a Create\r\n // We need to resolve parent GUID from directory\r\n const parentDir = path.dirname(path.dirname(filePath)); // .../Parent/Child/__meta.json -> .../Parent\r\n // This path logic depends on structure. \r\n // src/Workspace/Part/__meta.json -> Parent is Workspace.\r\n \r\n const parentGuid = this.pathMapper.resolveGuid(parentDir) || 'NULL'; // Handling root or unmapped parents\r\n \r\n ops.push({\r\n id: `op-${Date.now()}`,\r\n type: OpType.CreateInstance,\r\n rev: meta.rev,\r\n payload: {\r\n guid: meta.id,\r\n className: meta.class,\r\n name: meta.name,\r\n parentGuid: parentGuid,\r\n properties: meta.properties || {}\r\n }\r\n });\r\n \r\n this.pathMapper.set(path.dirname(filePath), meta.id);\r\n } else {\r\n // Update\r\n ops.push({\r\n id: `op-${Date.now()}`,\r\n type: OpType.SetProperties,\r\n rev: meta.rev,\r\n payload: {\r\n guid: meta.id,\r\n properties: meta.properties || {}\r\n }\r\n });\r\n }\r\n\r\n return ops;\r\n }\r\n\r\n public reconcileScript(filePath: string, content: string): Op[] {\r\n const dirPath = path.dirname(filePath);\r\n const guid = this.pathMapper.resolveGuid(dirPath);\r\n \r\n if (!guid) {\r\n // It might be that the map isn't updated if the folder was just created externally?\r\n // Or this is a stray file.\r\n // For now, warning is appropriate.\r\n // console.warn(`[OpReconciler] Script change at ${filePath} has no associated GUID`);\r\n return [];\r\n }\r\n \r\n return [{\r\n id: `op-${Date.now()}`,\r\n type: OpType.SetProperties,\r\n payload: {\r\n guid,\r\n properties: {\r\n Source: content\r\n }\r\n }\r\n }];\r\n }\r\n}\r\n","import fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { Op, OpType } from '@roport/common';\r\nimport { PathMapper } from '../fs/PathMapper';\r\n\r\nexport class Writer {\r\n constructor(private rootPath: string, private pathMapper: PathMapper) {}\r\n\r\n public async applyOp(op: Op) {\r\n switch (op.type) {\r\n case OpType.SetProperties:\r\n await this.handleSetProperties(op.payload, op.baseRev);\r\n break;\r\n case OpType.CreateInstance:\r\n await this.handleCreate(op.payload);\r\n break;\r\n case OpType.DeleteInstance:\r\n await this.handleDelete(op.payload);\r\n break;\r\n case OpType.ReparentInstance:\r\n await this.handleReparent(op.payload);\r\n break;\r\n }\r\n }\r\n\r\n private async handleSetProperties(payload: any, baseRev?: number) {\r\n const { guid, properties } = payload;\r\n const filePath = this.pathMapper.resolvePath(guid);\r\n \r\n if (!filePath) {\r\n console.warn(`[Writer] Unknown GUID ${guid} for SetProperties`);\r\n return;\r\n }\r\n\r\n const metaPath = path.join(filePath, '__meta.json');\r\n \r\n try {\r\n // Read existing\r\n let meta: any = {};\r\n try {\r\n const content = await fs.readFile(metaPath, 'utf-8');\r\n meta = JSON.parse(content);\r\n } catch (e) {\r\n // If it doesn't exist, we might be in trouble or it's a script? \r\n // For V2, everything has a meta if it's a folder/model.\r\n }\r\n\r\n // Conflict Detection\r\n if (baseRev !== undefined && meta.rev !== undefined) {\r\n if (baseRev < meta.rev) {\r\n console.warn(`[Writer] REJECTED write to ${guid}: Stale revision (Base: ${baseRev}, Curr: ${meta.rev})`);\r\n // TODO: Notify Studio of rejection?\r\n // Ideally we should emit a \"Conflict\" event back so Studio can revert/notify user.\r\n return; \r\n }\r\n }\r\n\r\n // Handle Script Source\r\n if ('Source' in properties) {\r\n const scriptName = this.getScriptFileName(meta.class);\r\n if (scriptName) {\r\n const sourcePath = path.join(filePath, scriptName);\r\n await fs.writeFile(sourcePath, properties.Source);\r\n console.log(`[Writer] Updated Script Source: ${sourcePath}`);\r\n \r\n // Do NOT write Source to meta.json\r\n delete properties.Source;\r\n }\r\n }\r\n\r\n // Update props (Simple merge)\r\n meta.properties = { ...meta.properties, ...properties };\r\n \r\n // Clean up nulls/defaults if we had access to default values\r\n // verify we aren't writing massive files\r\n \r\n // Increment Revision\r\n meta.rev = (meta.rev || 0) + 1;\r\n\r\n await this.writeMeta(metaPath, meta);\r\n console.log(`[Writer] Updated ${metaPath} (Rev: ${meta.rev})`);\r\n } catch (e) {\r\n console.error(`[Writer] Failed to write properties for ${guid}`, e);\r\n }\r\n }\r\n\r\n private async handleCreate(payload: any) {\r\n // Studio created something. We need to create a folder + meta.\r\n // Or if it's a Script, a .luau file.\r\n // For MVP, assume everything is a Folder/Container structure for now.\r\n \r\n const { guid, className, name, parentGuid, properties } = payload;\r\n \r\n let parentPath = this.rootPath;\r\n if (parentGuid && parentGuid !== 'game' && parentGuid !== 'NULL') {\r\n const resolved = this.pathMapper.resolvePath(parentGuid);\r\n if (resolved) parentPath = resolved;\r\n }\r\n\r\n // Handle Name Collisions? \r\n // For MVP, just use name.\r\n const dirPath = path.join(parentPath, name);\r\n \r\n try {\r\n await fs.mkdir(dirPath, { recursive: true });\r\n\r\n // Handle Script Source during Create\r\n let props = properties || {};\r\n if ('Source' in props) {\r\n const scriptName = this.getScriptFileName(className);\r\n if (scriptName) {\r\n await fs.writeFile(path.join(dirPath, scriptName), props.Source);\r\n \r\n // Clone props to avoid mutating original payload if reused\r\n props = { ...props };\r\n delete props.Source;\r\n }\r\n }\r\n \r\n const meta = {\r\n id: guid,\r\n class: className,\r\n name: name,\r\n properties: props\r\n };\r\n \r\n await this.writeMeta(path.join(dirPath, '__meta.json'), meta);\r\n\r\n // Update Parent's Order\r\n if (parentGuid) {\r\n await this.updateParentOrder(parentGuid, guid, 'add');\r\n }\r\n \r\n // Update Map immediately so subsequent ops work\r\n this.pathMapper.set(dirPath, guid);\r\n \r\n console.log(`[Writer] Created ${dirPath}`);\r\n } catch (e) {\r\n console.error(`[Writer] Failed to create ${dirPath}`, e);\r\n }\r\n }\r\n\r\n private getScriptFileName(className: string): string | null {\r\n switch (className) {\r\n case 'Script': return 'source.server.luau';\r\n case 'LocalScript': return 'source.client.luau';\r\n case 'ModuleScript': return 'source.luau';\r\n default: return null;\r\n }\r\n }\r\n\r\n private async handleDelete(payload: any) {\r\n const { guid } = payload;\r\n const filePath = this.pathMapper.resolvePath(guid);\r\n \r\n if (!filePath) return;\r\n \r\n // Safety check: Don't delete root\r\n if (path.relative(this.rootPath, filePath) === '') return;\r\n\r\n const parentDir = path.dirname(filePath);\r\n const parentGuid = this.pathMapper.resolveGuid(parentDir);\r\n\r\n try {\r\n // Soft Delete: Move to trash\r\n const trashRoot = path.join(this.rootPath, '.roport_trash');\r\n const trashDir = path.join(trashRoot, Date.now().toString());\r\n await fs.mkdir(trashDir, { recursive: true });\r\n \r\n const trashPath = path.join(trashDir, path.basename(filePath));\r\n \r\n await fs.rename(filePath, trashPath);\r\n \r\n this.pathMapper.removeByGuid(guid);\r\n \r\n if (parentGuid) {\r\n await this.updateParentOrder(parentGuid, guid, 'remove');\r\n }\r\n\r\n console.log(`[Writer] Soft deleted ${filePath} -> ${trashPath}`);\r\n } catch (e) {\r\n console.error(`[Writer] Failed to delete ${filePath}`, e);\r\n }\r\n }\r\n\r\n private async handleReparent(payload: any) {\r\n const { guid, newParentGuid } = payload;\r\n const oldPath = this.pathMapper.resolvePath(guid);\r\n \r\n let newParentPath = this.rootPath;\r\n if (newParentGuid && newParentGuid !== 'game') {\r\n const resolved = this.pathMapper.resolvePath(newParentGuid);\r\n if (resolved) newParentPath = resolved;\r\n }\r\n\r\n if (!oldPath) return;\r\n\r\n const oldParentDir = path.dirname(oldPath);\r\n const oldParentGuid = this.pathMapper.resolveGuid(oldParentDir);\r\n\r\n const dirName = path.basename(oldPath);\r\n const newPath = path.join(newParentPath, dirName);\r\n\r\n try {\r\n await fs.rename(oldPath, newPath);\r\n // Update map handled by FileWatcher usually, but we can preempt\r\n this.pathMapper.removeByGuid(guid);\r\n this.pathMapper.set(newPath, guid);\r\n\r\n if (oldParentGuid) {\r\n await this.updateParentOrder(oldParentGuid, guid, 'remove');\r\n }\r\n if (newParentGuid) {\r\n await this.updateParentOrder(newParentGuid, guid, 'add');\r\n }\r\n\r\n console.log(`[Writer] Moved ${oldPath} -> ${newPath}`);\r\n } catch (e) {\r\n console.error(`[Writer] Failed to move`, e);\r\n }\r\n }\r\n\r\n private async writeMeta(path: string, data: any) {\r\n await fs.writeFile(path, JSON.stringify(data, null, 2));\r\n }\r\n\r\n private async updateParentOrder(parentGuid: string, childGuid: string, operation: 'add' | 'remove') {\r\n if (!parentGuid || parentGuid === 'game' || parentGuid === 'NULL') {\r\n // Root ordering (game) usually not tracked in file system unless we have a root meta\r\n return; \r\n }\r\n\r\n const parentPath = this.pathMapper.resolvePath(parentGuid);\r\n if (!parentPath) return;\r\n\r\n const metaPath = path.join(parentPath, '__meta.json');\r\n \r\n try {\r\n let meta: any = {};\r\n try {\r\n const content = await fs.readFile(metaPath, 'utf-8');\r\n meta = JSON.parse(content);\r\n } catch (e) {\r\n return;\r\n }\r\n\r\n let order: string[] = meta.order || [];\r\n\r\n if (operation === 'add') {\r\n if (!order.includes(childGuid)) {\r\n order.push(childGuid);\r\n }\r\n } else if (operation === 'remove') {\r\n order = order.filter(id => id !== childGuid);\r\n }\r\n\r\n meta.order = order;\r\n // Also increment parent revision as its content (order) changed\r\n meta.rev = (meta.rev || 0) + 1;\r\n\r\n await this.writeMeta(metaPath, meta);\r\n } catch (e) {\r\n console.error(`[Writer] Failed to update order for ${parentGuid}`, e);\r\n }\r\n }\r\n}\r\n","import express from 'express';\r\nimport cors from 'cors';\r\nimport { TreeSnapshot } from '../ai/TreeSnapshot';\r\n\r\nexport class ApiServer {\r\n private app: express.Application;\r\n private port = 3000;\r\n private treeSnapshot: TreeSnapshot;\r\n\r\n constructor(workspacePath: string) {\r\n this.app = express();\r\n this.app.use(cors());\r\n this.app.use(express.json());\r\n \r\n this.treeSnapshot = new TreeSnapshot(workspacePath);\r\n \r\n this.setupRoutes();\r\n }\r\n\r\n private setupRoutes() {\r\n this.app.get('/tree', async (req, res) => {\r\n try {\r\n const tree = await this.treeSnapshot.generate();\r\n res.json(tree);\r\n } catch (e) {\r\n res.status(500).json({ error: 'Failed to generate tree' });\r\n }\r\n });\r\n\r\n this.app.get('/health', (req, res) => {\r\n res.json({ status: 'ok', version: '2.0.0' });\r\n });\r\n }\r\n\r\n public start() {\r\n this.app.listen(this.port, () => {\r\n console.log(`[ApiServer] Listening on http://localhost:${this.port}`);\r\n });\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport path from 'path';\r\nimport fs from 'fs/promises';\r\n\r\nexport const initCommand = new Command('init')\r\n .description('Initialize a new Roport project in the current directory')\r\n .option('-f, --force', 'Overwrite existing files', false)\r\n .action(async (options) => {\r\n const cwd = process.cwd();\r\n console.log(`[Roport] Initializing project in ${cwd}...`);\r\n\r\n const dirs = [\r\n 'src/Workspace',\r\n 'src/ReplicatedStorage',\r\n 'src/ServerScriptService',\r\n 'src/ServerStorage',\r\n 'src/StarterGui',\r\n 'src/StarterPack',\r\n 'src/StarterPlayer',\r\n 'src/Lighting',\r\n 'src/SoundService',\r\n ];\r\n\r\n try {\r\n // Create Directories\r\n for (const dir of dirs) {\r\n const fullPath = path.join(cwd, dir);\r\n await fs.mkdir(fullPath, { recursive: true });\r\n // Create __meta.json for each root to ensure mapping?\r\n // Actually, Roots are usually implicit in Roport/Rojo, but let's add minimal meta if needed.\r\n }\r\n\r\n // Create default.project.json\r\n const projectJson = {\r\n \"name\": path.basename(cwd),\r\n \"tree\": {\r\n \"$className\": \"DataModel\",\r\n \"Workspace\": {\r\n \"$className\": \"Workspace\",\r\n \"$path\": \"src/Workspace\"\r\n },\r\n \"ReplicatedStorage\": {\r\n \"$className\": \"ReplicatedStorage\",\r\n \"$path\": \"src/ReplicatedStorage\"\r\n },\r\n \"ServerScriptService\": {\r\n \"$className\": \"ServerScriptService\",\r\n \"$path\": \"src/ServerScriptService\"\r\n },\r\n \"ServerStorage\": {\r\n \"$className\": \"ServerStorage\",\r\n \"$path\": \"src/ServerStorage\"\r\n },\r\n \"StarterGui\": {\r\n \"$className\": \"StarterGui\",\r\n \"$path\": \"src/StarterGui\"\r\n },\r\n \"StarterPack\": {\r\n \"$className\": \"StarterPack\",\r\n \"$path\": \"src/StarterPack\"\r\n },\r\n \"StarterPlayer\": {\r\n \"$className\": \"StarterPlayer\",\r\n \"$path\": \"src/StarterPlayer\"\r\n },\r\n \"Lighting\": {\r\n \"$className\": \"Lighting\",\r\n \"$path\": \"src/Lighting\"\r\n },\r\n \"SoundService\": {\r\n \"$className\": \"SoundService\",\r\n \"$path\": \"src/SoundService\"\r\n }\r\n }\r\n };\r\n\r\n await fs.writeFile(\r\n path.join(cwd, 'default.project.json'), \r\n JSON.stringify(projectJson, null, 2)\r\n );\r\n\r\n // Create .gitignore\r\n const gitignore = `\r\nnode_modules/\r\n.roport_trash/\r\n*.rbxl\r\n*.rbxlx\r\n `.trim();\r\n \r\n await fs.writeFile(path.join(cwd, '.gitignore'), gitignore);\r\n\r\n console.log('[Roport] Project initialized successfully!');\r\n console.log('Run \"roport serve\" to start the sync server.');\r\n\r\n } catch (e) {\r\n console.error('[Roport] Failed to initialize project:', e);\r\n }\r\n });\r\n"],"mappings":"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","names":["OpType","exports","crypto","version","crypto","import_crypto","import_crypto","crypto","crypto","import_crypto","exports","path","exports","exports","import_commander","import_path","import_promises","import_path","path","fs","axios","path","fs","path","import_commander","import_path","import_path","import_fs","import_path","fs","path","express","cors","http","import_events","chokidar","path","path","fs","import_path","path","import_promises","import_path","import_common","path","fs","import_express","import_cors","express","cors","fs","path","path","import_commander","import_path","import_promises","path","fs"]}
package/package.json CHANGED
@@ -1,44 +1,37 @@
1
1
  {
2
2
  "name": "roport",
3
- "version": "1.4.0",
4
- "description": "A sync server for Roblox development. Works with the Roport Roblox Plugin. Features AI integration and full project sync.",
5
- "main": "src/server.js",
3
+ "version": "2.0.1",
4
+ "private": false,
6
5
  "bin": {
7
- "roport": "./bin/roport.js"
6
+ "roport": "./dist/index.js"
8
7
  },
9
- "scripts": {
10
- "start": "node bin/roport.js serve",
11
- "test": "jest"
12
- },
13
- "repository": {
14
- "type": "git",
15
- "url": "https://github.com/Rydaguy101/RojoExportPlugin.git"
16
- },
17
- "keywords": [
18
- "roblox",
19
- "rojo",
20
- "sync",
21
- "plugin",
22
- "development"
23
- ],
24
- "author": "Rydaguy101",
25
- "license": "MIT",
26
8
  "files": [
27
- "bin",
28
- "src",
29
- "templates",
30
- "assets",
31
- "README.md"
9
+ "dist"
32
10
  ],
11
+ "main": "./dist/index.js",
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "prepublishOnly": "npm run build",
15
+ "start": "ts-node src/cli/index.ts serve",
16
+ "watch": "tsup --watch --onSuccess \"node dist/index.js serve\"",
17
+ "roport": "ts-node src/cli/index.ts"
18
+ },
33
19
  "dependencies": {
34
- "body-parser": "^1.20.2",
35
- "chalk": "^4.1.2",
36
- "commander": "^11.0.0",
20
+ "axios": "^1.4.0",
21
+ "chokidar": "^3.5.3",
22
+ "commander": "^14.0.2",
23
+ "cors": "^2.8.5",
37
24
  "express": "^4.18.2",
38
- "fs-extra": "^11.1.1"
25
+ "ws": "^8.13.0"
39
26
  },
40
27
  "devDependencies": {
41
- "jest": "^30.2.0",
42
- "supertest": "^7.1.4"
28
+ "@roport/common": "^0.1.0",
29
+ "@types/cors": "^2.8.13",
30
+ "@types/express": "^4.17.17",
31
+ "@types/node": "^20.0.0",
32
+ "@types/ws": "^8.5.4",
33
+ "ts-node": "^10.9.2",
34
+ "tsup": "^8.5.1",
35
+ "typescript": "^5.0.0"
43
36
  }
44
37
  }
package/README.md DELETED
@@ -1,52 +0,0 @@
1
- # Roport CLI
2
-
3
- Roport is a next-generation sync tool for Roblox, designed to be AI-friendly and feature-rich. It allows you to sync scripts, models, and assets between your local file system and Roblox Studio.
4
-
5
- ## Features
6
-
7
- * **Full Two-Way Sync**: Edit in VS Code, see changes in Studio. Rename in Studio, see changes in VS Code.
8
- * **AI-Optimized**:
9
- * `roport context`: Generates a token-efficient summary of your project for AI context.
10
- * `.model.json`: Define complex Roblox instances (Parts, UIs, Constraints) using simple JSON.
11
- * **Scalable**: Handles large projects with batching and streaming.
12
- * **Robust**: Safe renaming, binary file support, and ignore file support (`.gitignore`, `.rojoignore`).
13
-
14
- ## Installation
15
-
16
- ```bash
17
- npm install -g roport
18
- ```
19
-
20
- ## Usage
21
-
22
- ### 1. Initialize a Project
23
- ```bash
24
- mkdir MyGame
25
- cd MyGame
26
- roport init
27
- ```
28
-
29
- ### 2. Install the Plugin
30
- ```bash
31
- roport plugin install
32
- ```
33
- *Restart Roblox Studio after installing.*
34
-
35
- ### 3. Start the Server
36
- ```bash
37
- roport serve
38
- ```
39
-
40
- ### 4. Connect in Studio
41
- Open the **Roport** plugin in Roblox Studio and click **Connect**.
42
-
43
- ## Commands
44
-
45
- * `roport serve`: Start the sync server.
46
- * `roport build -o <file.rbxmx>`: Build the project into a model file.
47
- * `roport context`: Generate a project summary for AI.
48
- * `roport sourcemap`: Generate a sourcemap.
49
- * `roport plugin install`: Install the Studio plugin.
50
-
51
- ## AI Generation Guide
52
- See `AI_GUIDE.md` in your project root (created by `roport init`) for instructions on how to generate Roblox content using AI.