diff --git a/npm/packages/ruvbot/.dockerignore b/npm/packages/ruvbot/.dockerignore new file mode 100644 index 0000000000..9952b58c0f --- /dev/null +++ b/npm/packages/ruvbot/.dockerignore @@ -0,0 +1,7 @@ +node_modules +dist +coverage +*.tgz +.env +.env.* +!.env.example diff --git a/npm/packages/ruvbot/Dockerfile b/npm/packages/ruvbot/Dockerfile index d60f982caf..89318f7b5f 100644 --- a/npm/packages/ruvbot/Dockerfile +++ b/npm/packages/ruvbot/Dockerfile @@ -19,7 +19,7 @@ WORKDIR /app COPY package.json package-lock.json* ./ # Install production dependencies only -RUN npm ci --only=production --ignore-scripts && \ +RUN npm ci --omit=dev --ignore-scripts --legacy-peer-deps && \ npm cache clean --force # ----------------------------------------------------------------------------- @@ -33,10 +33,11 @@ WORKDIR /app COPY package.json package-lock.json* tsconfig*.json ./ # Install all dependencies (including dev) -RUN npm ci --ignore-scripts +RUN npm ci --ignore-scripts --legacy-peer-deps # Copy source code COPY src/ ./src/ +COPY scripts/fix-esm.js ./scripts/fix-esm.js # Build TypeScript RUN npm run build diff --git a/npm/packages/ruvbot/package.json b/npm/packages/ruvbot/package.json index 28294ab2f0..1a54d16b23 100644 --- a/npm/packages/ruvbot/package.json +++ b/npm/packages/ruvbot/package.json @@ -1,6 +1,6 @@ { "name": "ruvbot", - "version": "0.3.5", + "version": "0.3.6", "description": "Enterprise-grade self-learning AI assistant with military-strength security, 150x faster vector search, and 12+ LLM models", "main": "dist/index.js", "module": "dist/esm/index.js", @@ -39,7 +39,7 @@ "scripts": { "build": "npm run build:cjs && npm run build:esm", "build:cjs": "tsc -p tsconfig.json", - "build:esm": "tsc -p tsconfig.esm.json", + "build:esm": "tsc -p tsconfig.esm.json && node scripts/fix-esm.js", "build:rvf": "node scripts/build-rvf.js", "run:rvf": "node scripts/run-rvf.js", "inspect:rvf": "node scripts/run-rvf.js --inspect", diff --git a/npm/packages/ruvbot/scripts/fix-esm.js b/npm/packages/ruvbot/scripts/fix-esm.js new file mode 100644 index 0000000000..69d59d8528 --- /dev/null +++ b/npm/packages/ruvbot/scripts/fix-esm.js @@ -0,0 +1,65 @@ +#!/usr/bin/env node +/** + * Post-build step for the ESM output (dist/esm). + * + * The package root is CommonJS (no "type" field), so Node treats every .js + * file as CJS unless a nearer package.json says otherwise. tsc does not emit + * one, which made `import('ruvbot')` fail. This script: + * + * 1. writes dist/esm/package.json with {"type":"module"} + * 2. verifies that every relative specifier in dist/esm resolves to a real + * file (ESM forbids extensionless and directory imports) and fails the + * build if one does not, so the bug cannot silently come back. + */ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const esmDir = path.resolve(__dirname, '..', 'dist', 'esm'); + +if (!fs.existsSync(esmDir)) { + console.error(`fix-esm: ${esmDir} does not exist; run build:esm first`); + process.exit(1); +} + +fs.writeFileSync( + path.join(esmDir, 'package.json'), + JSON.stringify({ type: 'module' }, null, 2) + '\n' +); + +const SPECIFIER_RE = + /(?:\bfrom\s*|\bimport\s*\(\s*|^\s*import\s+)(['"])(\.{1,2}\/[^'"]*)\1/gm; + +function walk(dir, out) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) walk(full, out); + else if (entry.name.endsWith('.js')) out.push(full); + } + return out; +} + +const problems = []; +for (const file of walk(esmDir, [])) { + const src = fs.readFileSync(file, 'utf8'); + for (const match of src.matchAll(SPECIFIER_RE)) { + const spec = match[2]; + const target = path.resolve(path.dirname(file), spec); + let ok = false; + try { + ok = fs.statSync(target).isFile(); + } catch { + ok = false; + } + if (!ok) problems.push(`${path.relative(esmDir, file)}: '${spec}'`); + } +} + +if (problems.length > 0) { + console.error('fix-esm: unresolvable relative ESM specifiers (use explicit ".js" / "/index.js"):'); + for (const p of problems) console.error(` ${p}`); + process.exit(1); +} + +console.log('fix-esm: wrote dist/esm/package.json; all relative ESM specifiers resolve'); diff --git a/npm/packages/ruvbot/src/api/public/index.html b/npm/packages/ruvbot/src/api/public/index.html index 0233c6c072..bd2df5eafe 100644 --- a/npm/packages/ruvbot/src/api/public/index.html +++ b/npm/packages/ruvbot/src/api/public/index.html @@ -664,6 +664,98 @@