mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-06 10:47:12 +08:00
The sync-assets prebuild step shelled out to 'cp -r node_modules/@nous-research/ui/dist/fonts ...' with a path relative to apps/dashboard/. That works only when the dep is installed locally in the dashboard workspace, but 'npm install' at the repo root (the documented setup — see apps/desktop/README.md) hoists shared deps to the root node_modules under npm workspaces. The relative cp then fails with 'No such file or directory', sync-assets exits 1, the Vite build aborts, and 'hermes dashboard' surfaces a generic 'Web UI build failed' message. Replace the shell one-liner with scripts/sync-assets.cjs, which walks up from the dashboard directory looking for node_modules/ @nous-research/ui — working in both the hoisted (workspaces) and co-located (standalone) layouts. Also guards against a missing dist/fonts or dist/assets with a clearer error pointing at a rebuild of the UI package rather than silently copying nothing.
47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Copy font and asset folders from @nous-research/ui into public/ for Vite.
|
|
*
|
|
* Locates @nous-research/ui by walking up from this script looking for
|
|
* node_modules/@nous-research/ui — works whether the dep is co-located
|
|
* (non-workspace layout) or hoisted to the repo root (npm workspaces).
|
|
*/
|
|
const fs = require('node:fs')
|
|
const path = require('node:path')
|
|
|
|
const DASHBOARD_ROOT = path.resolve(__dirname, '..')
|
|
|
|
function locateUiPackage() {
|
|
let dir = DASHBOARD_ROOT
|
|
const { root } = path.parse(dir)
|
|
while (true) {
|
|
const candidate = path.join(dir, 'node_modules', '@nous-research', 'ui')
|
|
if (fs.existsSync(path.join(candidate, 'package.json'))) {
|
|
return candidate
|
|
}
|
|
if (dir === root) break
|
|
dir = path.dirname(dir)
|
|
}
|
|
throw new Error(
|
|
'@nous-research/ui not found. Run `npm install` from the repo root.'
|
|
)
|
|
}
|
|
|
|
const uiRoot = locateUiPackage()
|
|
const distRoot = path.join(uiRoot, 'dist')
|
|
|
|
const mappings = [
|
|
['fonts', path.join(DASHBOARD_ROOT, 'public', 'fonts')],
|
|
['assets', path.join(DASHBOARD_ROOT, 'public', 'ds-assets')],
|
|
]
|
|
|
|
for (const [srcName, destPath] of mappings) {
|
|
const srcPath = path.join(distRoot, srcName)
|
|
if (!fs.existsSync(srcPath)) {
|
|
throw new Error(`Missing ${srcPath} in @nous-research/ui — rebuild that package.`)
|
|
}
|
|
fs.rmSync(destPath, { recursive: true, force: true })
|
|
fs.cpSync(srcPath, destPath, { recursive: true })
|
|
console.log(`synced ${path.relative(DASHBOARD_ROOT, destPath)}`)
|
|
}
|