@uniweb/build 0.18.5 → 0.20.0
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/package.json +7 -7
- package/src/site/config.js +0 -22
- package/src/site/content-collector.js +6 -5
- package/src/site/deploy-config.js +23 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uniweb/build",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "Build tooling for the Uniweb Component Web Platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -59,16 +59,16 @@
|
|
|
59
59
|
"js-yaml": "^4.1.0",
|
|
60
60
|
"sharp": "^0.35.3",
|
|
61
61
|
"yaml": "^2.5.0",
|
|
62
|
-
"@uniweb/theming": "^0.1.15",
|
|
63
|
-
"@uniweb/projections": "^0.2.8",
|
|
64
62
|
"@uniweb/content-writer": "^0.3.3",
|
|
65
|
-
"@uniweb/
|
|
63
|
+
"@uniweb/projections": "^0.2.8",
|
|
64
|
+
"@uniweb/schemas": "^0.2.10",
|
|
65
|
+
"@uniweb/theming": "^0.1.15"
|
|
66
66
|
},
|
|
67
67
|
"optionalDependencies": {
|
|
68
|
-
"@uniweb/runtime": "^0.11.5",
|
|
69
|
-
"@uniweb/semantic-parser": "^1.2.2",
|
|
70
68
|
"@uniweb/content-reader": "^1.2.2",
|
|
71
|
-
"@uniweb/schemas": "^0.2.10"
|
|
69
|
+
"@uniweb/schemas": "^0.2.10",
|
|
70
|
+
"@uniweb/semantic-parser": "^1.2.2",
|
|
71
|
+
"@uniweb/runtime": "^0.11.7"
|
|
72
72
|
},
|
|
73
73
|
"peerDependencies": {
|
|
74
74
|
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0",
|
package/src/site/config.js
CHANGED
|
@@ -255,28 +255,6 @@ export function readSiteConfig(siteRoot) {
|
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
-
/**
|
|
259
|
-
* Read and parse intelligence.yml configuration (AI knowledge page settings).
|
|
260
|
-
*
|
|
261
|
-
* Returns the non-secret fields. The `apiKey` field (if present) uses the
|
|
262
|
-
* `env:VAR_NAME` syntax for CLI/local dev — the actual key is never stored
|
|
263
|
-
* in artifacts or published content.
|
|
264
|
-
*
|
|
265
|
-
* @param {string} siteRoot - Path to site directory
|
|
266
|
-
* @returns {Object|null} Parsed intelligence config, or null if no file exists
|
|
267
|
-
*/
|
|
268
|
-
export function readIntelligenceConfig(siteRoot) {
|
|
269
|
-
const configPath = resolve(siteRoot, 'intelligence.yml')
|
|
270
|
-
if (!existsSync(configPath)) return null
|
|
271
|
-
|
|
272
|
-
try {
|
|
273
|
-
return yaml.load(readFileSync(configPath, 'utf8')) || {}
|
|
274
|
-
} catch (err) {
|
|
275
|
-
console.warn('[site-config] Failed to read intelligence.yml:', err.message)
|
|
276
|
-
return null
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
258
|
/**
|
|
281
259
|
* Create a complete Vite configuration for a Uniweb site
|
|
282
260
|
*
|
|
@@ -2345,10 +2345,6 @@ export async function collectSiteContent(sitePath, options = {}) {
|
|
|
2345
2345
|
// Convert versionedScopes Map to plain object for JSON serialization
|
|
2346
2346
|
const versionedScopesObj = Object.fromEntries(versionedScopes)
|
|
2347
2347
|
|
|
2348
|
-
// Read intelligence.yml if it exists (AI knowledge page settings)
|
|
2349
|
-
const intelligenceConfig = await readYamlFile(join(sitePath, 'intelligence.yml'))
|
|
2350
|
-
const hasIntelligence = intelligenceConfig && Object.keys(intelligenceConfig).length > 0
|
|
2351
|
-
|
|
2352
2348
|
// Compile per-page `slug:` maps into config.i18n.routeTranslations
|
|
2353
2349
|
// (canonical route → per-locale display route). Producer-only: the runtime
|
|
2354
2350
|
// (@uniweb/core website.js) and the sitemap generator already consume this
|
|
@@ -2410,7 +2406,12 @@ export async function collectSiteContent(sitePath, options = {}) {
|
|
|
2410
2406
|
? { languages: publishable }
|
|
2411
2407
|
: {}),
|
|
2412
2408
|
fetch: parseFetchConfig(siteConfig.fetch),
|
|
2413
|
-
|
|
2409
|
+
// NOTE: `intelligence.yml` was read here and emitted as `config.intelligence`.
|
|
2410
|
+
// Removed 2026-08-12 — the assistant surface is `site.yml::assistant`, which
|
|
2411
|
+
// needs no line at all on this lane (`config` spreads all of site.yml) and one
|
|
2412
|
+
// line on the sync lane, so it reaches BOTH. The separate file could only ever
|
|
2413
|
+
// reach this one, which is what made an authored persona vanish on hosted
|
|
2414
|
+
// sites. See kb/framework/architecture/assistant-config.md.
|
|
2414
2415
|
...(routeTranslations
|
|
2415
2416
|
? { i18n: { ...(siteConfig.i18n || {}), routeTranslations } }
|
|
2416
2417
|
: {}),
|
|
@@ -110,6 +110,29 @@ function validate(doc, path) {
|
|
|
110
110
|
if (doc.targets !== undefined && (typeof doc.targets !== 'object' || Array.isArray(doc.targets))) {
|
|
111
111
|
throw new Error(`${path}: \`targets\` must be a map.`)
|
|
112
112
|
}
|
|
113
|
+
// A site has exactly ONE Uniweb identity — `site.yml::$uuid`, a single scalar,
|
|
114
|
+
// set by the create and never moved. So two targets naming `host: uniweb` cannot
|
|
115
|
+
// both be coherent: whichever one `default:` selects is the site, and the other
|
|
116
|
+
// silently describes a site that does not exist. The per-target `backend` key
|
|
117
|
+
// makes that look expressible, which is exactly why it is worth rejecting rather
|
|
118
|
+
// than leaving to be discovered.
|
|
119
|
+
//
|
|
120
|
+
// *(Diego, 2026-08-12: multiple deploys are not expected in general, and are not
|
|
121
|
+
// allowed for Uniweb Cloud specifically — the only host that reads `$uuid` at
|
|
122
|
+
// all. Every other host is stateless from the CLI's side, so any number of those
|
|
123
|
+
// targets is fine.)*
|
|
124
|
+
if (doc.targets && typeof doc.targets === 'object' && !Array.isArray(doc.targets)) {
|
|
125
|
+
const uniwebTargets = Object.entries(doc.targets)
|
|
126
|
+
.filter(([, t]) => t && typeof t === 'object' && t.host === 'uniweb')
|
|
127
|
+
.map(([name]) => name)
|
|
128
|
+
if (uniwebTargets.length > 1) {
|
|
129
|
+
throw new Error(
|
|
130
|
+
`${path}: only one target may use \`host: uniweb\` — found ${uniwebTargets.length} (${uniwebTargets.join(', ')}). ` +
|
|
131
|
+
'A site has a single Uniweb identity (site.yml::$uuid), so a second Uniweb target cannot describe a different site. ' +
|
|
132
|
+
'Keep one, or point the others at a third-party host.'
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
113
136
|
if (doc.autoSave !== undefined && !VALID_AUTOSAVE.has(doc.autoSave)) {
|
|
114
137
|
throw new Error(
|
|
115
138
|
`${path}: \`autoSave\` must be one of: ${[...VALID_AUTOSAVE].join(', ')}.`
|