uniweb 0.50.0 → 0.51.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uniweb",
3
- "version": "0.50.0",
3
+ "version": "0.51.1",
4
4
  "description": "Create structured Vite + React sites with content/code separation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,13 +41,13 @@
41
41
  "js-yaml": "^4.1.0",
42
42
  "prompts": "^2.4.2",
43
43
  "tar": "^7.0.0",
44
- "@uniweb/core": "^0.25.1",
45
- "@uniweb/kit": "^0.18.3",
46
- "@uniweb/semantic-parser": "^1.4.0",
47
- "@uniweb/runtime": "^0.20.1"
44
+ "@uniweb/core": "^0.26.1",
45
+ "@uniweb/kit": "^0.18.4",
46
+ "@uniweb/runtime": "^0.20.3",
47
+ "@uniweb/semantic-parser": "^1.4.0"
48
48
  },
49
49
  "peerDependencies": {
50
- "@uniweb/build": "^0.46.0",
50
+ "@uniweb/build": "^0.47.0",
51
51
  "@uniweb/content-reader": "^1.2.4",
52
52
  "@uniweb/semantic-parser": "^1.4.0"
53
53
  },
@@ -697,7 +697,7 @@ What can actually *read* it depends on where you deploy, because reading it need
697
697
 
698
698
  The artifacts **your build emits** to describe the public site never name them — `llms.txt`, the per-page `.md` projections, and the search index all describe pages a visitor reads, and a knowledge page's prose was written for the assistant instead. Two settings **outrank** `knowledge:`, so a contradiction resolves toward the narrower reach: `agents.exclude` in `site.yml`, and any `_`-prefixed route segment. *(A host that derives these artifacts itself, rather than serving the ones your build produced, applies its own rules — ask your host what it does with `knowledge:` before relying on it there.)*
699
699
 
700
- Don't confuse it with the visibility flags: `hidden: true` is a **draft** (not published at all), `hideIn` only controls **nav placement** (still reachable by URL), and `knowledge: true` is a **different audience** (never rendered for anyone).
700
+ Don't confuse it with the visibility flags: `hidden: true` is a **draft** (not published at all), `hideIn` only controls **nav placement** (still reachable by URL), and `knowledge: true` is a **different audience** (never rendered for anyone). ⛔ `hidden: true` on `pages/404/` means a **draft 404** — it is not published and the site falls back to the generic `404.html`; an authored 404 needs no flag, since it is never listed in navigation anyway.
701
701
 
702
702
  **A site can be nothing but knowledge — that is a real and useful shape.** A site is a set of routes; it does not have to have HTML pages. Mark the root `knowledge: true` and every page inherits it, so the site renders nothing at all and exists to *be* an agent: a `/_agent/chat` URL that a web app, a mobile app, or someone else's backend sends requests to.
703
703
 
@@ -897,7 +897,7 @@ pages/blog/
897
897
 
898
898
  `entities/article/design-tips.md` becomes `/blog/design-tips`. The section inside `[slug]/` needs no special markdown — the matched record is delivered to it. Generated pages are excluded from navigation menus.
899
899
 
900
- **Which query the URL narrows — the page's route query:** the `[slug]` page's own `query:`, else its parent page's (the usual shape, above), else `site.yml`'s; if none declares one, the query its sections all declare. The first query of that level wins. Every section the route query reaches gets the one record; a section declaring a *different* query of its own gets that query as declared. The folder name says what the URL segment matches: `[slug]` the record's handle (`$name`, which compiled records carry — equal to their `slug`), `[uuid]` its `$uuid`, any other `[name]` the record's own field of that name. A folder inside `[slug]/` (`[slug]/cv/` → `/blog/:slug/cv`) is a parametric page too, reading the record when `[slug]/page.yml` declares the query. `[dir]` and `[path]` are refused as folder names, and so is any folder inside `[...path]/`.
900
+ **Which query the URL narrows — the page's route query:** the `[slug]` page's own `query:`, else its parent page's (the usual shape, above), else `site.yml`'s; if none declares one, the query its sections all declare. The first query of that level wins. Every section the route query reaches gets the one record; a section declaring a *different* query of its own gets that query as declared. The folder name says what the URL segment matches: `[slug]` the record's handle (`$name`, which compiled records carry — equal to their `slug`), `[uuid]` its `$uuid`, any other `[name]` the record's own field of that name — and when that field holds several values, **any member** matches (the record's own link is its first value). Routing by a field that is not unique picks one record and which one is not guaranteed; the build warns. A folder inside `[slug]/` (`[slug]/cv/` → `/blog/:slug/cv`) is a parametric page too, reading the record when `[slug]/page.yml` declares the query. `[dir]` and `[path]` are refused as folder names, and so is any folder inside `[...path]/`.
901
901
 
902
902
  > **The record arrives as a single-element array under the query key** — `content.data.recent[0]`, not `content.data.article`. The runtime never coerces it to an object and never synthesizes a singular key. See *Data* in Part 4.
903
903
 
@@ -9,12 +9,27 @@
9
9
  * the answer.
10
10
  *
11
11
  * ⛔ THERE IS NO PRE-FLIGHT, AND ADDING ONE BACK IS A REGRESSION. A
12
- * `GET …/can-go-live` probe used to run before go-live; it called a route no
13
- * backend serves, and it folded every failure 404 included into
14
- * "proceed". A check that answers "fine" when it cannot reach the server is not
15
- * a check, and it made the CLI assume a posture it has no business assuming. A
16
- * pre-flight also cannot be authoritative: the backend re-evaluates at publish
17
- * time regardless, so a second asker is a second producer of one decision.
12
+ * `can-go-live` probe used to run before go-live, and it folded every failure
13
+ * 404 included into "proceed". A check that answers "fine" when it cannot
14
+ * reach the server is not a check, and it made the CLI assume a posture it has no
15
+ * business assuming. A pre-flight also cannot be authoritative: the backend
16
+ * re-evaluates at publish time regardless, so a second asker is a second producer
17
+ * of one decision which is the reason that would stand even if the probe had
18
+ * worked.
19
+ *
20
+ * ⚠️ **THIS COMMENT USED TO SAY THE PROBE "called a route no backend serves".
21
+ * That was FALSE, corrected 2026-09-12.** What it called was
22
+ * `/dev/site/{uuid}/can-go-live` — and the 404 came from the PATH being wrong,
23
+ * not from the capability being absent. So the probe never worked at any version
24
+ * that shipped it, and every failure was swallowed by the fold above, which is
25
+ * exactly why nobody noticed.
26
+ *
27
+ * ⭐ Kept as a warning about the SHAPE of the old justification, not just the
28
+ * fact: a correct rule was resting on a claim about another system that this
29
+ * repo cannot see, and the claim was wrong. The rule survives because its real
30
+ * reasons are local — the fold, and the second-producer argument. **If you find
31
+ * yourself defending a rule here with an assertion about what a server does,
32
+ * check it or drop it.**
18
33
  *
19
34
  * WHAT THE CLI KNOWS ABOUT PAYMENT: nothing. It opens whatever settlement URL
20
35
  * the backend hands it, VERBATIM — provider-agnostic, and route-agnostic. The
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-09-11T23:04:50.071Z",
3
+ "generatedAt": "2026-09-12T17:35:34.207Z",
4
4
  "packages": {
5
5
  "@uniweb/api": {
6
- "version": "0.3.2",
6
+ "version": "0.3.3",
7
7
  "path": "framework/api",
8
8
  "deps": [
9
9
  "@uniweb/core"
10
10
  ]
11
11
  },
12
12
  "@uniweb/build": {
13
- "version": "0.46.0",
13
+ "version": "0.47.0",
14
14
  "path": "framework/build",
15
15
  "deps": [
16
16
  "@uniweb/content-reader",
@@ -34,7 +34,7 @@
34
34
  "deps": []
35
35
  },
36
36
  "@uniweb/core": {
37
- "version": "0.25.1",
37
+ "version": "0.26.1",
38
38
  "path": "framework/core",
39
39
  "deps": [
40
40
  "@uniweb/semantic-parser",
@@ -47,14 +47,14 @@
47
47
  "deps": []
48
48
  },
49
49
  "@uniweb/icons": {
50
- "version": "0.4.16",
50
+ "version": "0.4.17",
51
51
  "path": "framework/icons",
52
52
  "deps": [
53
53
  "@uniweb/core"
54
54
  ]
55
55
  },
56
56
  "@uniweb/kit": {
57
- "version": "0.18.3",
57
+ "version": "0.18.4",
58
58
  "path": "framework/kit",
59
59
  "deps": [
60
60
  "@uniweb/core",
@@ -74,7 +74,7 @@
74
74
  "deps": []
75
75
  },
76
76
  "@uniweb/projections": {
77
- "version": "0.6.1",
77
+ "version": "0.6.2",
78
78
  "path": "framework/projections",
79
79
  "deps": [
80
80
  "@uniweb/content-writer",
@@ -82,7 +82,7 @@
82
82
  ]
83
83
  },
84
84
  "@uniweb/runtime": {
85
- "version": "0.20.1",
85
+ "version": "0.20.3",
86
86
  "path": "framework/runtime",
87
87
  "deps": [
88
88
  "@uniweb/core",
@@ -110,7 +110,7 @@
110
110
  "deps": []
111
111
  },
112
112
  "@uniweb/templates": {
113
- "version": "0.12.5",
113
+ "version": "0.13.1",
114
114
  "path": "framework/templates",
115
115
  "deps": []
116
116
  },
@@ -120,7 +120,7 @@
120
120
  "deps": []
121
121
  },
122
122
  "@uniweb/unipress": {
123
- "version": "0.9.13",
123
+ "version": "0.9.15",
124
124
  "path": "framework/unipress",
125
125
  "deps": [
126
126
  "@uniweb/build",