@kudzujs/core 0.12.0 → 0.12.2

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/PERFORMANCE.md CHANGED
@@ -6,6 +6,48 @@ Reproducibility classes: `npm run benchmark`, `npm run benchmark:keyed`, `npm ru
6
6
 
7
7
  The maintained 2026-08-13 comparison used Node 24.14.0 and an Intel Core i5-9500 Linux x64 host, one warm-up, and seven alternating fresh-process samples against clean `v0.8.44`. A narrow fast path skips Kudzu semantic transformation for 450 plain `.ts` modules whose runtime edges are exclusively resolvable relative TypeScript imports or exports; all other modules retain the existing transformer. Compile median fell from 2,323.9 ms to 1,413.2 ms (39.2%) and clean-build median from 3,325.3 ms to 2,382.4 ms (28.4%); every paired sample improved. Compile peak-RSS median fell from 571.2 MiB to 552.6 MiB, while build peak RSS was 570.9 MiB versus 568.8 MiB. Compiler scratch fell from 7,328,390 to 1,971,061 bytes. Both targets emitted the same 50 static HTML files, 10,980 bytes, and deploy SHA-256 `e107d78a7f55bc8a1af0ea6e53efeffa19b3d44d21c892484d103fa346e7ba7b`. This is a source-scale compiler comparison, not a cross-framework result.
8
8
 
9
+ ## 0.12.2 Authentication And Permission Boundary
10
+
11
+ Measured 2026-08-23 on macOS arm64 with Node 25.6.1 and Chrome
12
+ 151.0.7922.172. Required Chrome proves invalid and valid login, token-backed
13
+ reload restoration, anonymous and rejected direct entry, role-aware controls,
14
+ server-enforced API and admin authorization, token clearing, and logout.
15
+
16
+ The two-route session uses 16 JavaScript files totaling 60,767 raw / 22,561
17
+ aggregate gzip bytes, an increase of 1,793 raw / 432 gzip bytes from `0.12.1`
18
+ for authored session state, restoration, and authorization headers. Navigation
19
+ samples are `[1.3, 1.5, 1.5, 1.2, 1.3, 1.4, 1.4]` ms, with a 1.4 ms median and
20
+ 1.2/1.5 ms minimum/maximum. The range overlaps `0.12.1`, so no latency change
21
+ is claimed.
22
+
23
+ The application emits 43 files totaling 123,476 raw / 45,305 aggregate gzip
24
+ bytes with deploy SHA-256
25
+ `81d0b3c5e0d1d1f72f29d219647601463f5317f215274e14a45fe5ba92eb033e`.
26
+ The login route uses 12,093 raw / 5,795 aggregate gzip JavaScript bytes. Core
27
+ semantic LOC remains 5,682 with no pass, primitive, production compiler/runtime
28
+ change, or runtime-concept change. `/help` remains 0 B JavaScript.
29
+
30
+ ## 0.12.1 Shared Layout, History, Focus, And Scroll
31
+
32
+ Measured 2026-08-23 on macOS arm64 with Node 25.6.1 and Chrome
33
+ 151.0.7922.172. `RUNS=7 npm run benchmark:project-navigation` uses fresh Chrome
34
+ profiles after the required browser journey proves hash and non-hash focus,
35
+ explicit hash/top scroll, title/live announcements, back/forward, retained
36
+ layout state, fresh route state, and native navigation outside the route group.
37
+
38
+ The two-route session uses 16 JavaScript files totaling 58,974 raw / 22,129
39
+ aggregate gzip bytes, an increase of 4 raw / 5 gzip bytes from `0.12.0` for the
40
+ correct non-hash focus fallback. Navigation samples are
41
+ `[1.5, 1.4, 1.3, 1.3, 1.3, 1.3, 1.4]` ms, with a 1.3 ms median and 1.3/1.5 ms
42
+ minimum/maximum. The range overlaps `0.12.0`, so no latency change is claimed.
43
+
44
+ The application emits 36 files totaling 106,096 raw / 38,201 aggregate gzip
45
+ bytes with deploy SHA-256
46
+ `4f1ce541af0794fcb17458ad37db7b32beb434f3a83cb7f949f13b3e4536fe1c`.
47
+ Core semantic LOC remains 5,682 with no pass, primitive, or runtime-concept
48
+ change. `/help` remains 0 B JavaScript. No AI-delivery cost comparison applies
49
+ to this browser correctness patch.
50
+
9
51
  ## 0.12.0 Project Route Shell And Runtime Parameters
10
52
 
11
53
  Measured 2026-08-23 on macOS arm64 with Node 25.6.1 and Chrome
package/README.md CHANGED
@@ -12,9 +12,9 @@ Kudzu compiles ordinary React-shaped TypeScript and TSX into complete static HTM
12
12
 
13
13
  *Watch: React-shaped TSX to static HTML and route-specific ESM in 22 seconds.*
14
14
 
15
- > Experimental `0.11.x`: the compiler API and supported TSX surface may change.
15
+ > Experimental `0.12.x`: the compiler API and supported TSX surface may change.
16
16
 
17
- **Latest release: 0.12.0 - Project route shell and runtime parameters.** Directly addressable project and issue routes now reuse bracket file routes, pathname parameters, complete fallback HTML, generated host rewrites, and native anchors without an SPA router. Read the [release notes](./RELEASES.md#0120---project-route-shell-and-runtime-parameters), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.12.0), or follow the [architecture packet](./docs/next-architecture/README.md).
17
+ **Latest release: 0.12.2 - Authentication and permission boundary.** Native login, token restoration, role-aware controls, server-enforced 401/403 responses, token clearing, and logout now compose from existing application primitives without an auth runtime. Read the [release notes](./RELEASES.md#0122---authentication-and-permission-boundary), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.12.2), or follow the [architecture packet](./docs/next-architecture/README.md).
18
18
 
19
19
  - [Documentation](https://kudzujs.cloud/docs)
20
20
  - [Installation guide](https://kudzujs.cloud/docs#install)
package/RELEASES.md CHANGED
@@ -1,5 +1,107 @@
1
1
  # Kudzu Releases
2
2
 
3
+ ## 0.12.2 - Authentication And Permission Boundary
4
+
5
+ Kudzu 0.12.2 completes the project application's login, restoration,
6
+ permission-aware UI, server rejection, and logout journey using existing
7
+ application primitives.
8
+
9
+ ### Changed in 0.12.2
10
+
11
+ - Replaced the placeholder login route with a native constrained form and one
12
+ application-owned async submit handler.
13
+ - Added layout-owned token restoration, session validation, authenticated user
14
+ state, role-aware admin controls, and explicit logout.
15
+ - Added bearer authorization to project reads and mutations; the deterministic
16
+ server rejects missing tokens with 401 and member mutations with 403.
17
+ - Proved that protected static HTML is a UX shell while server authorization is
18
+ the security boundary.
19
+ - Updated `create-kudzu@0.1.115` to generate projects on
20
+ `@kudzujs/core@^0.12.2`.
21
+
22
+ ### Output Evidence
23
+
24
+ - The application emits 43 files, 123,476 raw / 45,305 aggregate gzip bytes,
25
+ and deploy digest
26
+ `81d0b3c5e0d1d1f72f29d219647601463f5317f215274e14a45fe5ba92eb033e`.
27
+ - The maintained enhanced session uses 16 JavaScript files totaling 60,767 raw
28
+ / 22,561 aggregate gzip bytes, 1,793 raw / 432 gzip bytes above `0.12.1`.
29
+ - The login route uses 12,093 raw / 5,795 aggregate gzip JavaScript bytes, while
30
+ `/help` remains complete HTML with 0 B JavaScript.
31
+ - No semantic primitive, compiler pass, core compiler line, runtime concept,
32
+ public API, auth runtime, or server was added to Kudzu.
33
+
34
+ ### Validation
35
+
36
+ - Required Chrome proves invalid and valid login, reload restoration, direct
37
+ anonymous and rejected entry, member/admin UI, server 401/403 responses,
38
+ token clearing, and logout.
39
+ - Seven fresh Chrome profiles record a 1.4 ms navigation median with a 1.2-1.5
40
+ ms range. The range overlaps `0.12.1`, so no latency change is claimed.
41
+ - The full suite, package smoke, registry metadata, and fresh installation are
42
+ release gates.
43
+
44
+ ### Limits
45
+
46
+ Client conditional rendering only controls presentation. Applications and
47
+ deployment hosts remain responsible for authorizing protected data and actions.
48
+
49
+ ### Upgrade
50
+
51
+ ```sh
52
+ npm install @kudzujs/core@^0.12.2
53
+ ```
54
+
55
+ ## 0.12.1 - Shared Layout, History, Focus, And Scroll
56
+
57
+ Kudzu 0.12.1 completes the accepted same-document project route group with
58
+ explicit history, focus, announcement, and scroll behavior.
59
+
60
+ ### Changed in 0.12.1
61
+
62
+ - Fixed non-hash enhanced navigation so the existing heading/main focus
63
+ fallback runs instead of treating an empty hash as a target.
64
+ - Proved push, back, and forward navigation with retained layout state and
65
+ freshly recreated route state.
66
+ - Added route titles, a native hash anchor, and an intrinsic hash destination to
67
+ the maintained project application.
68
+ - Proved polite navigation announcements, hash scrolling, top scrolling, and
69
+ browser-native links outside the configured route group.
70
+ - Updated `create-kudzu@0.1.114` to generate projects on
71
+ `@kudzujs/core@^0.12.1`.
72
+
73
+ ### Output Evidence
74
+
75
+ - The application emits 36 files, 106,096 raw / 38,201 aggregate gzip bytes,
76
+ and deploy digest
77
+ `4f1ce541af0794fcb17458ad37db7b32beb434f3a83cb7f949f13b3e4536fe1c`.
78
+ - The maintained enhanced session uses 16 JavaScript files totaling 58,974 raw
79
+ / 22,129 aggregate gzip bytes, 4 raw / 5 gzip bytes above `0.12.0`.
80
+ - `/help` remains complete HTML with 0 B JavaScript.
81
+ - No semantic primitive, compiler pass, core compiler line, runtime concept,
82
+ public API, or browser route registry was added.
83
+
84
+ ### Validation
85
+
86
+ - Required Chrome proves focused anchor activation, back/forward, layout
87
+ retention, route cleanup/reset, title/live updates, hash/heading focus, and
88
+ hash/top scroll behavior.
89
+ - Seven fresh Chrome profiles record a 1.3 ms navigation median with a 1.3-1.5
90
+ ms range. The range overlaps `0.12.0`, so no latency change is claimed.
91
+ - The full suite, package smoke, registry metadata, and fresh installation are
92
+ release gates.
93
+
94
+ ### Limits
95
+
96
+ Enhanced navigation remains explicit and route-group scoped. Routes outside the
97
+ group use browser-native document navigation.
98
+
99
+ ### Upgrade
100
+
101
+ ```sh
102
+ npm install @kudzujs/core@^0.12.1
103
+ ```
104
+
3
105
  ## 0.12.0 - Project Route Shell And Runtime Parameters
4
106
 
5
107
  Kudzu 0.12.0 opens the routing and application-lifetime train with directly
@@ -557,6 +557,31 @@ overlaps `0.11.4`, so no latency change is claimed.
557
557
  - **Done condition:** keyboard and browser-history journeys pass with native
558
558
  recovery.
559
559
 
560
+ **Completion evidence:** the project application adds route titles, one native
561
+ hash anchor, and one intrinsic hash destination. Required Chrome activates the
562
+ focused anchor, retains the layout and workspace state through push, back, and
563
+ forward navigation, releases and recreates dirty route state, updates the title
564
+ and polite live status, focuses hash and heading destinations, applies explicit
565
+ hash and top scroll policies, and leaves `/help` browser-native outside the
566
+ approved route group.
567
+
568
+ The journey exposed one existing JavaScript value bug: an absent hash produced
569
+ the empty string and prevented the nullish heading/main focus fallback. The
570
+ navigation runtime now produces `null` for that case. This packet adds zero
571
+ semantic primitives, ModuleIR kinds, compiler passes, core compiler lines,
572
+ runtime concepts, normalization rules, adapter rules, or public APIs. Runtime
573
+ source remains 351 lines. One positive application fixture gains the complete
574
+ acceptance journey; `/help` remains 0 B JavaScript.
575
+
576
+ The fixture emits 36 files totaling 106,096 raw / 38,201 aggregate gzip bytes
577
+ with deploy SHA-256
578
+ `4f1ce541af0794fcb17458ad37db7b32beb434f3a83cb7f949f13b3e4536fe1c`.
579
+ The two-route session uses 16 JavaScript files totaling 58,974 raw / 22,129
580
+ aggregate gzip bytes, 4 raw / 5 gzip bytes above `0.12.0`. Seven fresh Chrome
581
+ profiles record a 1.3 ms navigation median with a 1.3/1.5 ms range. The range
582
+ overlaps `0.12.0`, so no latency change is claimed. This correctness packet has
583
+ no measured AI-delivery cost effect.
584
+
560
585
  ### `0.12.2`: Authentication And Permission Boundary
561
586
 
562
587
  - **Purpose:** complete login, restore, 401, logout, and permission-aware UI.
@@ -569,6 +594,29 @@ overlaps `0.11.4`, so no latency change is claimed.
569
594
  - **Done condition:** server authorization and client UX responsibilities are
570
595
  executable and explicit.
571
596
 
597
+ **Completion evidence:** the project application replaces its placeholder login
598
+ route with a native constrained form and one async handler. The shared layout
599
+ restores a stored token, validates the current user, exposes authenticated
600
+ identity and role state, and clears local state before replacement navigation on
601
+ rejection or logout. Required Chrome proves invalid and valid login, reload
602
+ restoration, anonymous and rejected direct protected entry, member/admin control
603
+ visibility, server 401/403 enforcement, token clearing, and logout. Client
604
+ conditions are recorded as presentation only; the deterministic API server
605
+ authorizes every protected read and mutation.
606
+
607
+ Existing native forms, state, layout ownership, effects, storage, fetch, and
608
+ native navigation are sufficient. This packet adds zero semantic primitives,
609
+ ModuleIR kinds, compiler passes, production compiler/runtime lines, runtime
610
+ concepts, normalization rules, adapter rules, public APIs, auth runtimes, or
611
+ servers. The fixture emits 43 files totaling 123,476 raw / 45,305 aggregate gzip
612
+ bytes with deploy SHA-256
613
+ `81d0b3c5e0d1d1f72f29d219647601463f5317f215274e14a45fe5ba92eb033e`.
614
+ The login route uses 12,093 raw / 5,795 gzip JavaScript bytes. The two-route
615
+ session uses 16 JavaScript files totaling 60,767 raw / 22,561 aggregate gzip
616
+ bytes. Seven fresh Chrome profiles record a 1.4 ms navigation median with a
617
+ 1.2/1.5 ms range; the range overlaps `0.12.1`, so no latency change is claimed.
618
+ `/help` remains 0 B JavaScript.
619
+
572
620
  ### `0.12.3`: Route Failure And Restoration Policy
573
621
 
574
622
  - **Purpose:** decide application-visible handling of navigation/data failures.
@@ -1124,5 +1172,7 @@ release transaction where possible or document and publish a forward-fix patch.
1124
1172
  | `0.11.2` | Released | Preserve the published no-new-primitive architecture decision and zero-byte result. | None |
1125
1173
  | `0.11.3` | Released | Preserve the published optimistic rollback, duplicate prevention, navigation, and retry evidence. | None |
1126
1174
  | `0.11.4` | Released | Preserve the published bounded pagination, history, refresh, polling cleanup, and exact request-count evidence. | None |
1127
- | `0.12.0` | Active | Release the completed runtime project/issue route-shell evidence. | None |
1128
- | `0.12.1` onward | Blocked | Wait for explicit approval after the minor-version entry release. | User-directed minor-version boundary |
1175
+ | `0.12.0` | Released | Preserve direct runtime entry, reload, rewrite, and native fallback evidence. | None |
1176
+ | `0.12.1` | Released | Preserve the published layout/history/focus/scroll evidence. | None |
1177
+ | `0.12.2` | Active | Release the completed authentication and permission evidence. | None |
1178
+ | `0.12.3` onward | Blocked | Complete the `0.12.2` release transaction first. | Ordered patch boundary |
@@ -66,7 +66,7 @@ Keep each patch behavior-preserving and independently reviewable. If a boundary
66
66
 
67
67
  ## Generator Versions
68
68
 
69
- `create-kudzu@0.1.113` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.12.0`.
69
+ `create-kudzu@0.1.115` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.12.2`.
70
70
 
71
71
  ## Release Boundary
72
72
 
@@ -330,7 +330,7 @@ function updateHead(incoming) {
330
330
  }
331
331
 
332
332
  function focusAndScroll(url) {
333
- const hashTarget = url.hash && document.getElementById(decodeURIComponent(url.hash.slice(1)))
333
+ const hashTarget = url.hash ? document.getElementById(decodeURIComponent(url.hash.slice(1))) : null
334
334
  const target = hashTarget ?? routeElement("h1") ?? routeElement("main")
335
335
  if (target) {
336
336
  if (!target.hasAttribute("tabindex")) target.setAttribute("tabindex", "-1")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kudzujs/core",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
4
4
  "description": "HTML-first TSX framework with synchronous state semantics and no virtual DOM",
5
5
  "type": "module",
6
6
  "license": "MIT",