@nativele/ts-dom 0.5.4 → 0.5.5

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/CHANGELOG.md CHANGED
@@ -10,6 +10,15 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Version
10
10
  - Adding a lint rule is a minor change; lint rules are warnings or opt-in and do not count as breaking.
11
11
  - Before every release run `npm run verify:pack` (`publint` and `attw`), `tsc`, the unit tests, the browser tests, `npm run smoke` and `npm run smoke:no-bundler`; all of them run in `.github/workflows/ci.yml`.
12
12
 
13
+ ## 0.5.5
14
+
15
+ Skills are verified by agent trials and stand on their own: each Skill can be followed and is accurate without its example project, which stays in the repository only as a reference.
16
+
17
+ - A Skill is verified by its agent trials. An `example/` is an optional reference project from the trial and is no longer run in CI; Official means accepted through an agent trial and maintained by the maintainers. Each Skill's Versions table names the version of its last agent trial, and `test/skills.test.ts` keeps that row in line with the `nativele` range.
18
+ - "SKILL.md format" (in `skills.yml`) is a required check for `main`: it reports on every pull request, skips its steps when nothing it checks changed, and also covers the links in the READMEs, `llms.txt` and the guides.
19
+ - `skills/README.md` gives a fixed form for the agent trial record added to a Skill pull request.
20
+ - Every Skill is self-contained. The architecture Skill names the interfaces of the small components its example code uses. Across the Skills, an example project is mentioned only as a reference implementation, never as the source of a step or a fact.
21
+
13
22
  ## 0.5.4
14
23
 
15
24
  The guides, the Skills and the tools agree with each other: wrong statements in the guides are fixed, facts the Skills repeated now live in the guides, and the tools report the traps the Skill trials hit instead of staying silent.
package/README.md CHANGED
@@ -74,7 +74,7 @@ npx ts-dom skills add nativele-core # copy it into .claude/skills/ (when the
74
74
  | `nativele-zod` | form validation with Zod or Valibot (Experimental) |
75
75
  | `nativele-tailwind` | Tailwind CSS in templates and Shadow DOM (Experimental) |
76
76
 
77
- Tiers: Official Skills are verified by the maintainers against an example project in CI; Community Skills are contributed and show their author and last verified versions; Experimental Skills are not fully verified yet. `ts-dom skills` marks a Skill as stale when its verification is more than six months old or does not cover the installed version.
77
+ Tiers: Official Skills are verified through agent trials and maintained by the maintainers; Community Skills are contributed and show their author and last verified versions; Experimental Skills are not fully verified yet. `ts-dom skills` marks a Skill as stale when its verification is more than six months old or does not cover the installed version.
78
78
 
79
79
  Nativele stays a light UI layer and grows its integrations through Skills: a new Skill changes no runtime code and adds no dependency. The planned Skills and how to contribute one are in [the Skills guide](https://github.com/Pixmi/nativele/blob/main/skills/README.md).
80
80
 
package/README.zh-TW.md CHANGED
@@ -74,7 +74,7 @@ npx ts-dom skills add nativele-core # 複製到 .claude/skills/(專案有 .
74
74
  | `nativele-zod` | 用 Zod 或 Valibot 驗證表單(Experimental) |
75
75
  | `nativele-tailwind` | 在範本與 Shadow DOM 中使用 Tailwind CSS(Experimental) |
76
76
 
77
- 等級:Official 由維護者以 CI 中的範例專案驗證;Community 由社群貢獻,標示作者與最後驗證版本;Experimental 尚未充分驗證。驗證超過六個月,或不涵蓋已安裝的版本時,`ts-dom skills` 會標示為可能過期。
77
+ 等級:Official 經 agent 實際驗收、由維護者維護;Community 由社群貢獻,標示作者與最後驗證版本;Experimental 尚未充分驗證。驗證超過六個月,或不涵蓋已安裝的版本時,`ts-dom skills` 會標示為可能過期。
78
78
 
79
79
  Nativele 維持輕量的 UI 層,整合能力透過 Skill 擴展:新增 Skill 不改動執行期程式碼,也不增加依賴。規劃中的 Skill 與貢獻方式見 [Skills 指南](https://github.com/Pixmi/nativele/blob/main/skills/README.md)。
80
80
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nativele/ts-dom",
3
- "version": "0.5.4",
3
+ "version": "0.5.5",
4
4
  "description": "Designed for AI agents. Driven by TypeScript. Defined in vanilla HTML. A lightweight library for building web components: typed templates, native custom elements, no virtual DOM, no template expressions, no bundler required.",
5
5
  "keywords": [
6
6
  "html",
package/skills/README.md CHANGED
@@ -19,7 +19,7 @@ skills/
19
19
  │ └── SKILL.md
20
20
  ├── nativele-react/
21
21
  │ ├── SKILL.md
22
- │ └── example/ # Official only: the project the Skill is verified with
22
+ │ └── example/ # optional: a reference project from the agent trial
23
23
  │ ├── package.json # exact versions of every tool the Skill names
24
24
  │ ├── ... # the minimal app the SKILL.md example comes from
25
25
  │ └── verify.mjs # browser checks run by `npm run verify` (or the project's own tests, see below)
@@ -38,7 +38,7 @@ name: nativele-react
38
38
  description: "Use Nativele web components inside a React 19 app: props, events, children and slots, lifecycle, and TSX types. Use when a project has react and @nativele/ts-dom."
39
39
  metadata:
40
40
  tier: official # official | community | experimental
41
- nativele: ">=0.5.0 <0.6.0" # the library versions the Skill was verified with
41
+ nativele: ">=0.5.0 <0.6.0" # the library versions the Skill supports; the lower bound is the first one it was verified with
42
42
  verified: "2026-11-05" # date of the last verification
43
43
  tools: "react@19.3.1 react-dom@19.3.1 vite@8.3.5 @vitejs/plugin-react@6.2.1 typescript@7.0.2"
44
44
  author: "Nativele maintainers" # for community Skills: the contributor
@@ -51,7 +51,7 @@ Quote the `description` and any value that contains `: `, so the frontmatter sta
51
51
  Required sections, in this order:
52
52
 
53
53
  1. **When to use**: the situation and the signals (dependencies, files) that call for this Skill, and when not to use it.
54
- 2. **Versions**: a table of every tool and the exact version it was verified with, and the date. If the project uses a different major version of a tool, the Skill says so and stops treating its steps as verified.
54
+ 2. **Versions**: a table of every tool and the exact version it was verified with, and the date. The `@nativele/ts-dom` row names the version of the Skill's last agent trial. If the project uses a different major version of a tool, the Skill says so and stops treating its steps as verified.
55
55
  3. **Set-up**: numbered steps with the exact commands and file contents, starting from a working project of the tool (for an integration Skill) and covering only what Nativele adds or changes.
56
56
  4. **Example**: a complete, minimal working example (every file it needs, short).
57
57
  5. **Known limitations**: what does not work or needs care, each with what to do instead. An agent must never have to guess these.
@@ -70,12 +70,12 @@ Rules for the content:
70
70
 
71
71
  | Tier | Who maintains it | Requirements | Shown by `ts-dom skills` |
72
72
  |---|---|---|---|
73
- | Official | the Nativele maintainers | accepted through an agent trial, and an `example/` project that `npm run verify` checks in CI; verified within the last 6 months | as official |
73
+ | Official | the Nativele maintainers | accepted through an agent trial and maintained by the maintainers; verified within the last 6 months | as official |
74
74
  | Community | its author | the full SKILL.md format, `author` and `verified` filled in, accepted through a maintainer's agent trial | as community, with the author |
75
75
  | Experimental | its author | the SKILL.md format; verification not complete | as experimental, with a warning |
76
76
 
77
- - A new contribution starts as Experimental. It becomes Community when it passes a maintainer's agent trial (see "How a Skill pull request is accepted"), and Official when the maintainers adopt it with an `example/` project in CI.
78
- - A Skill whose `verified` date is older than 6 months, or whose `nativele` range does not include the installed version, is shown as stale. A stale Official Skill whose CI check fails is moved to Experimental until fixed.
77
+ - A new contribution starts as Experimental. It becomes Community when it passes a maintainer's agent trial (see "How a Skill pull request is accepted"), and Official when the maintainers adopt and maintain it.
78
+ - A Skill whose `verified` date is older than 6 months, or whose `nativele` range does not include the installed version, is shown as stale. A stale Official Skill is verified again with a new agent trial, or moved to Experimental until it is.
79
79
 
80
80
  ## Delivering Skills to projects
81
81
 
@@ -88,12 +88,11 @@ The library already lives in the user's `node_modules`, so its Skills travel wit
88
88
 
89
89
  None of this adds a runtime dependency: listing and copying read the Markdown files with Node's file API, and the frontmatter is parsed with a small reader for the fields above.
90
90
 
91
- ## Verification of Official Skills
91
+ ## Examples
92
92
 
93
- - `skills/<name>/example/package.json` pins every tool version the Skill names, depends on the library through `file:../../..` (the library in the same repository), and has `npm run verify`, which runs `ts-dom check`, `ts-dom doctor`, `tsc`, the build, and a real-browser test of what the Skill promises: usually a `verify.mjs` script; an example whose Skill sets up tests (`nativele-testing`, `nativele-architecture`) runs its own Vitest and Playwright Test suites instead.
94
- - `nativele-core` has no example of its own: the library's CI, which checks every example in the repository, verifies it.
95
- - The workflow `.github/workflows/skills.yml` runs `npm run verify` for each Official Skill when an `example/` changes, when the library's runtime changes, and once a month, so a third-party release that breaks a Skill is found. A change to `SKILL.md` runs only `.github/workflows/skills-format.yml`, which checks every `SKILL.md` against this specification. Neither is a required check for `main`.
96
- - The monthly run opens nothing by itself; a failure is reported in the workflow run, and the Skill is fixed or moved to Experimental.
93
+ A Skill may keep the project from its agent trial in `skills/<name>/example/` as a reference: the files the Skill's example comes from, with exact versions and `"@nativele/ts-dom": "file:../../.."`. An example is not run in CI; the Skill is verified by its agent trials. The npm package does not ship the `example/` folders.
94
+
95
+ The workflow `.github/workflows/skills.yml` has one required check for `main`, "SKILL.md format": it checks every `SKILL.md` against this specification, and the links in the READMEs, `llms.txt` and the guides, whenever any of them changes.
97
96
 
98
97
  ## Contributing a Skill
99
98
 
@@ -117,7 +116,28 @@ The Skill is accepted when:
117
116
  - the agent followed the Skill's steps as written, and no step was wrong for the stated versions;
118
117
  - every guess, outside search or unexplained error in the report is already covered by the Skill; a guess about the tool itself (how to configure the framework, the build tool or the test runner beyond what Nativele needs) is not a gap in the Skill.
119
118
 
120
- Otherwise the maintainers send the gaps back to the contributor as review comments (a missing step, a limitation to list, a Troubleshooting row to add), and the trial runs again, with a new agent, on the updated Skill. The record of the passing trial (agent and model, date, versions, Verify output) is added to the PR as a review comment.
119
+ Otherwise the maintainers send the gaps back to the contributor as review comments (a missing step, a limitation to list, a Troubleshooting row to add), and the trial runs again, with a new agent, on the updated Skill. Each trial is recorded on the PR as a review comment in this form, so a reader can see which agent passed which task, what it ran into, and whether a later change to the Skill needs a new trial:
120
+
121
+ ```yaml
122
+ trial:
123
+ skill: nativele-vue
124
+ round: 2 # 1 for the first trial; a new agent each round
125
+ date: 2026-11-05
126
+ nativele: 0.5.4 # the packed version the agent installed
127
+ tools: vue@3.5.44 vite@8.3.6 vue-tsc@3.3.14 typescript@6.0.3
128
+ agent: Claude Code # or Codex, Cursor, ...
129
+ model: <model id>
130
+ start: create-vite vue-ts, built once before Nativele was added
131
+ task: |
132
+ An inventory screen: an item component in a keyed list Vue sorts, a two-way bound input,
133
+ Light DOM and shadow slots with Vue-managed children, a store bound under <KeepAlive>.
134
+ verify: # the Skill's Verify commands, as the maintainer re-ran them
135
+ "npx ts-dom check src/nv": "ts-dom check: no issues"
136
+ "npm run build": "built"
137
+ browser: 22 checks passed, no console errors or Vue warnings
138
+ gaps: [] # each guess or error the Skill did not cover; empty to accept
139
+ result: accepted # or: gaps sent back
140
+ ```
121
141
 
122
142
  ## Skills
123
143
 
@@ -25,7 +25,7 @@ Nativele components are native custom elements. Angular renders their tags like
25
25
 
26
26
  | Tool | Verified version |
27
27
  |---|---|
28
- | @nativele/ts-dom | 0.5.1 |
28
+ | @nativele/ts-dom | 0.5.1 (the last agent trial) |
29
29
  | @angular/core, @angular/common, @angular/compiler, @angular/compiler-cli, @angular/platform-browser, @angular/router | 22.2.4 |
30
30
  | @angular/cli, @angular/build | 22.2.6 |
31
31
  | typescript | 6.0.3 |
@@ -26,7 +26,7 @@ metadata:
26
26
 
27
27
  | Tool | Verified version |
28
28
  |---|---|
29
- | @nativele/ts-dom | 0.5.3 |
29
+ | @nativele/ts-dom | 0.5.3 (the last agent trial) |
30
30
  | vite | 8.3.6 |
31
31
  | typescript | 7.0.2 |
32
32
  | create-vite (`vanilla-ts` template, the starting point) | 9.3.4 |
@@ -35,9 +35,9 @@ metadata:
35
35
  | @vitest/browser-playwright | 5.1.0 |
36
36
  | playwright | 1.64.1 (drives the installed Chrome; no browser is downloaded) |
37
37
  | @playwright/test | 1.64.1 |
38
- | universal-router | 10.0.3 (checked by hand with the example's tests, see step 5; the example project does not run it) |
38
+ | universal-router | 10.0.3 (checked by hand with the same tests as the Navigation API router, see step 5) |
39
39
 
40
- Verified on 2026-11-05 with Node 24 and Google Chrome 148, with the example project in the Nativele repository (https://github.com/Pixmi/nativele/tree/main/skills/nativele-architecture/example; it is not in the npm package), which CI runs again when the example or the library changes and once a month. The router relies on the Navigation API and `URLPattern`, verified in Chrome only. With another major version of any tool above, treat every step as unverified.
40
+ Verified on 2026-11-05 with Node 24 and Google Chrome 148, with the example project in the Nativele repository (https://github.com/Pixmi/nativele/tree/main/skills/nativele-architecture/example; it is not in the npm package), and by an agent trial: a fresh agent did real work with only the Skill, and the result was checked independently. The example is a reference; it is not run in CI. The router relies on the Navigation API and `URLPattern`, verified in Chrome only. With another major version of any tool above, treat every step as unverified.
41
41
 
42
42
  ## Set-up
43
43
 
@@ -139,7 +139,7 @@ Verified on 2026-11-05 with Node 24 and Google Chrome 148, with the example proj
139
139
  }
140
140
  ```
141
141
 
142
- `router.resolve()` returns `undefined` when an action returns nothing, so test the match with `!= null`. With this router, the example's unit tests and its end-to-end tests pass except the one for a browser without the Navigation API (links are always handled by the click handler) and the one that calls `navigation.navigate()`, which passes when it clicks a link instead; its browser router tests use the Navigation API and do not apply.
142
+ `router.resolve()` returns `undefined` when an action returns nothing, so test the match with `!= null`. With this router, the same unit tests and end-to-end tests pass except the one for a browser without the Navigation API (links are always handled by the click handler) and the one that calls `navigation.navigate()`, which passes when it clicks a link instead; its browser router tests use the Navigation API and do not apply.
143
143
 
144
144
  6. **Write each page as a component** in its feature folder: route params arrive as string props (`props: { projectId: "" }`), the page shows what an unknown id means, and it binds its stores in `connected()`. Everything a page must keep after the user leaves goes into a store: leaving removes the page, which ends its `bind` subscriptions, and coming back creates a new element.
145
145
 
@@ -171,7 +171,7 @@ Verified on 2026-11-05 with Node 24 and Google Chrome 148, with the example proj
171
171
 
172
172
  ## Example
173
173
 
174
- The example project is a project tracker: a projects list (`/`), a project page with its tasks (`/projects/:id`) and a settings page (`/settings`).
174
+ A project tracker: a projects list (`/`), a project page with its tasks (`/projects/:id`) and a settings page (`/settings`). Everything below is enough to build the same layout; the full project from the agent trial is in the repository only as a reference.
175
175
 
176
176
  ```
177
177
  index.html package.json tsconfig.json vite.config.ts playwright.config.ts
@@ -183,6 +183,16 @@ src/features/settings/settings-page.* settings-page.test.ts
183
183
  e2e/app.spec.ts
184
184
  ```
185
185
 
186
+ The small components the code below uses, by their interface (write them like any component, with the core Skill):
187
+
188
+ | Component | Folder | Props | Events |
189
+ |---|---|---|---|
190
+ | `text-entry` | `src/shared/` | `label`, `action` (strings) | `entry-submit` with `{ value: string }` |
191
+ | `progress-meter` | `src/shared/` | `done`, `total` (numbers) | none |
192
+ | `task-row` | `src/features/projects/` | `task` (a `Task`) | `task-toggle`, no data |
193
+ | `route-message` | `src/app/` | `heading`, `detail` (strings) | none |
194
+ | `app-nav` | `src/app/` | none; it binds `currentPath` and `preferences` to mark the current link and show the user name | none |
195
+
186
196
  The router (Navigation API and `URLPattern`, no dependency):
187
197
 
188
198
  ```ts
@@ -264,7 +274,7 @@ export const currentPath = createStore(location.pathname);
264
274
  A feature store and a page of that feature:
265
275
 
266
276
  ```ts
267
- // src/features/projects/projects-store.ts (abridged: the example adds addProject and more seed data)
277
+ // src/features/projects/projects-store.ts
268
278
  import { createStore } from "@nativele/ts-dom";
269
279
 
270
280
  export interface Project { id: string; name: string }
@@ -476,7 +486,7 @@ test("each page module is loaded only when its route is first shown", async ({ p
476
486
 
477
487
  1. **Scan one folder.** Several folders work too (`dirs: ["src/shared", "src/features"]`): a template imports a child defined in any scanned folder, and a tag defined in two of them is `duplicate-define`. But every folder then needs to be named in `tsDom({ dirs })`, `ts-dom check`, `ts-dom doctor` and the tsconfig `include` alike, and a folder left out of one of them is silently not generated or not checked there. One folder, `src`, avoids that. A component outside every scanned folder is not imported automatically: import its module where it is used.
478
488
  2. **Browser support.** The router needs `URLPattern`: without it the app stops at start-up with `URLPattern is not defined`. Without the Navigation API, `startRouter` attaches nothing, every link loads a new document, and the router renders the route at start-up (verified in Chrome with `navigation` removed). Only Chrome 148 was verified; check your target browsers, or use a History API router (step 5).
479
- 3. **Keep the abort check.** Without `if (signal?.aborted) return;` after the import, a page module that loads slowly mounts over the page of a later navigation, and the address bar and the page disagree. The example's end-to-end test delays a chunk to prove the check, for both routers.
489
+ 3. **Keep the abort check.** Without `if (signal?.aborted) return;` after the import, a page module that loads slowly mounts over the page of a later navigation, and the address bar and the page disagree. To prove the check in a test, delay one page's chunk and navigate twice: the second page must stay.
480
490
  4. **Every app path must return `index.html`.** Deep links and reloads (and every link, without the Navigation API) ask the server for the page's path. `vite dev` and `vite preview` answer with `index.html`; a production server must be set up the same way (not verified here).
481
491
  5. **A page is a new element on every navigation.** Its `state` starts over, also on back and forward, and also between `/projects/p1` and `/projects/p2`. Keep what must survive in a store.
482
492
  6. **Feature stores live as long as the document.** A store created in a lazily loaded module is created on the first visit to the feature and kept until a reload; reset it in tests with `store.set(seed())` in `beforeEach`.
@@ -495,7 +505,7 @@ npm run test:browser # expect: every src/**/*.browser.test.ts passes in he
495
505
  npm run test:e2e # expect: every e2e spec passes against vite preview on the built app
496
506
  ```
497
507
 
498
- The example project's `npm run verify` runs exactly these, from a clean checkout with nothing generated; its output (the `info` lines left out):
508
+ From a clean checkout with nothing generated, the output of these commands for the project tracker (the `info` lines left out):
499
509
 
500
510
  ```
501
511
  ts-dom check: no issues
@@ -23,10 +23,10 @@ A component is two files. The HTML holds structure and names (`{{ name }}`, `dat
23
23
 
24
24
  | Tool | Verified version |
25
25
  |---|---|
26
- | @nativele/ts-dom | 0.5.0 |
26
+ | @nativele/ts-dom | 0.5.0 (the last agent trial) |
27
27
  | typescript | 7.0.2 |
28
28
 
29
- Verified on 2026-11-05 by the library's own CI, which type-checks, lints and runs every example in the repository in real Chrome.
29
+ Verified on 2026-11-05 by agent trials: fresh agents built real components with only this Skill, and the results were checked independently. The library's own CI type-checks, lints and runs the examples in the repository in real Chrome.
30
30
 
31
31
  ## Set-up
32
32
 
@@ -25,13 +25,13 @@ Nativele components are native custom elements. The framework renders their tags
25
25
 
26
26
  | Tool | Verified version |
27
27
  |---|---|
28
- | @nativele/ts-dom | 0.5.1 |
28
+ | @nativele/ts-dom | 0.5.1 (the last agent trial) |
29
29
  | preact | 11.1.1 |
30
30
  | vite | 8.3.6 |
31
31
  | @preact/preset-vite | 2.10.6 |
32
32
  | typescript | 7.0.2 |
33
33
 
34
- Verified on 2026-11-05 in Google Chrome 148, starting from `create-vite` 9.3.4 with the `preact-ts` template, with the example project in the Nativele repository (`skills/nativele-integration/example`), which CI runs again when the example or the library changes and once a month. The procedure was also followed earlier in a Vue app made with the `vue-ts` template. The rules come from the custom element standard and hold for any framework, but each framework's own behavior (the answers to step 3) is verified only for Preact 11 here and for the frameworks that have their own Skill. With Preact 10, treat the Preact answers below as unverified.
34
+ Verified on 2026-11-05 in Google Chrome 148, starting from `create-vite` 9.3.4 with the `preact-ts` template, with the example project in the Nativele repository (`skills/nativele-integration/example`), and by an agent trial: a fresh agent did real work with only the Skill, and the result was checked independently. The example is a reference; it is not run in CI. The procedure was also followed earlier in a Vue app made with the `vue-ts` template. The rules come from the custom element standard and hold for any framework, but each framework's own behavior (the answers to step 3) is verified only for Preact 11 here and for the frameworks that have their own Skill. With Preact 10, treat the Preact answers below as unverified.
35
35
 
36
36
  ## Set-up
37
37
 
@@ -168,7 +168,7 @@ In the browser, render a component with an object prop and an event listener, an
168
168
  - the listener runs once per event;
169
169
  - children that the framework toggles, reorders, adds and removes stay in the right slot, with no errors or framework warnings in the console (run this check once against the dev server too: production builds drop framework warnings). Read a slot with `el.assignedNodes(name)` (`""` is the default slot), which works in both modes; a Light DOM component has no `<slot>` elements once rendered. Frameworks leave comment and empty text nodes as anchors among the children, so compare elements, not all nodes.
170
170
 
171
- The example project's [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-integration/example/verify.mjs) does these checks for Preact with Playwright, plus a component defined after render, keyed reordering of hosts with and without `moveBefore`, and the end of `bind` on removal.
171
+ A reference implementation of these checks is the [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-integration/example/verify.mjs) of the trial's example project, which does them for Preact with Playwright, plus a component defined after render, keyed reordering of hosts with and without `moveBefore`, and the end of `bind` on removal.
172
172
 
173
173
  ## Troubleshooting
174
174
 
@@ -24,14 +24,14 @@ Nativele components are native custom elements. React renders them like any othe
24
24
 
25
25
  | Tool | Verified version |
26
26
  |---|---|
27
- | @nativele/ts-dom | 0.5.1 |
27
+ | @nativele/ts-dom | 0.5.1 (the last agent trial) |
28
28
  | react, react-dom | 19.3.1 |
29
29
  | @types/react, @types/react-dom | 19.3.0 |
30
30
  | vite | 8.3.5 |
31
31
  | @vitejs/plugin-react | 6.2.1 |
32
32
  | typescript | 7.0.2 |
33
33
 
34
- Verified on 2026-11-05 in Google Chrome 148 with the example project in the Nativele repository (`skills/nativele-react/example`), which CI runs again when the example or the library changes and once a month. With a different major version of React, treat every step as unverified.
34
+ Verified on 2026-11-05 in Google Chrome 148 with the example project in the Nativele repository (`skills/nativele-react/example`), and by an agent trial: a fresh agent did real work with only the Skill, and the result was checked independently. The example is a reference; it is not run in CI. With a different major version of React, treat every step as unverified.
35
35
 
36
36
  ## Set-up
37
37
 
@@ -189,7 +189,7 @@ npm run build # expect: ✓ built (it runs ts-dom gen, tsc -b and
189
189
 
190
190
  Pass `tsc` the tsconfig from step 3. A root `tsconfig.json` that only lists `references` (as in Vite's template) checks nothing itself, so `tsc --noEmit` without `-p` passes even with type errors.
191
191
 
192
- In the browser, render a component with an object prop and an event handler, and check that the element has no `item` attribute (`el.getAttributeNames()`), that `el.item` is the object, and that the handler fires once per click. The example project's [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-react/example/verify.mjs) does these checks with Playwright, plus children that React reorders, adds and removes inside a `shadow: true` component and inside stable wrappers in a Light DOM component. A Light DOM component has no `<slot>` elements once rendered; check where the children ended up with `el.assignedNodes(name)`, where `""` is the default slot.
192
+ In the browser, render a component with an object prop and an event handler, and check that the element has no `item` attribute (`el.getAttributeNames()`), that `el.item` is the object, and that the handler fires once per click. A reference implementation of these checks is the [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-react/example/verify.mjs) of the trial's example project, which does them with Playwright, plus children that React reorders, adds and removes inside a `shadow: true` component and inside stable wrappers in a Light DOM component. A Light DOM component has no `<slot>` elements once rendered; check where the children ended up with `el.assignedNodes(name)`, where `""` is the default slot.
193
193
 
194
194
  ## Troubleshooting
195
195
 
@@ -24,16 +24,16 @@ metadata:
24
24
 
25
25
  | Tool | Verified version |
26
26
  |---|---|
27
- | @nativele/ts-dom | 0.5.2 |
27
+ | @nativele/ts-dom | 0.5.2 (the last agent trial) |
28
28
  | zustand (`zustand/vanilla`) | 5.0.16 |
29
29
  | @reduxjs/toolkit | 2.14.0 |
30
- | redux | 5.0.1 (installed by `@reduxjs/toolkit`; a `legacy_createStore` store with the adapter was checked by hand with `tsc` and Node, the example project does not run it) |
30
+ | redux | 5.0.1 (installed by `@reduxjs/toolkit`; a `legacy_createStore` store with the adapter was checked by hand with `tsc` and Node) |
31
31
  | nanostores | 1.5.5 (`atom` only) |
32
32
  | vite | 8.3.6 |
33
33
  | typescript | 7.0.2 |
34
34
  | create-vite (`vanilla-ts` template, the starting point) | 9.3.4 |
35
35
 
36
- Verified on 2026-11-05 in Google Chrome 148 with the example project in the Nativele repository (`skills/nativele-state-management/example`), which CI runs again when the example or the library changes and once a month. With a different major version of a state library, treat the adapter and every limitation about that library as unverified.
36
+ Verified on 2026-11-05 in Google Chrome 148 with the example project in the Nativele repository (`skills/nativele-state-management/example`), and by an agent trial: a fresh agent did real work with only the Skill, and the result was checked independently. The example is a reference; it is not run in CI. With a different major version of a state library, treat the adapter and every limitation about that library as unverified.
37
37
 
38
38
  ## Set-up
39
39
 
@@ -294,7 +294,7 @@ for (const name of ["set", "render"]) {
294
294
  }
295
295
  ```
296
296
 
297
- Then typing a note must log nothing for `cart-badge`, and adding an item must log `set` and `render` once each. The example project's [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-state-management/example/verify.mjs) does these checks with Playwright for Zustand, Redux, nanostores and `createStore`, plus the `bind` contract itself (an immediate call, no call for an `Object.is`-equal set, nothing after removal), the nanostores double call, selectors that return a new object or a kept slice, and no console errors.
297
+ Then typing a note must log nothing for `cart-badge`, and adding an item must log `set` and `render` once each. A reference implementation of these checks is the [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-state-management/example/verify.mjs) of the trial's example project, which does them with Playwright for Zustand, Redux, nanostores and `createStore`, plus the `bind` contract itself (an immediate call, no call for an `Object.is`-equal set, nothing after removal), the nanostores double call, selectors that return a new object or a kept slice, and no console errors.
298
298
 
299
299
  ## Troubleshooting
300
300
 
@@ -25,7 +25,7 @@ Nativele components are native custom elements. Svelte renders them like any oth
25
25
 
26
26
  | Tool | Verified version |
27
27
  |---|---|
28
- | @nativele/ts-dom | 0.5.1 |
28
+ | @nativele/ts-dom | 0.5.1 (the last agent trial) |
29
29
  | svelte | 5.57.3 |
30
30
  | @sveltejs/vite-plugin-svelte | 7.3.1 |
31
31
  | svelte-check | 4.7.8 |
@@ -23,7 +23,7 @@ metadata:
23
23
 
24
24
  | Tool | Verified version |
25
25
  |---|---|
26
- | @nativele/ts-dom | 0.5.2 |
26
+ | @nativele/ts-dom | 0.5.2 (the last agent trial) |
27
27
  | tailwindcss | 4.3.4 |
28
28
  | @tailwindcss/vite | 4.3.4 |
29
29
  | vite | 8.3.6 |
@@ -25,7 +25,7 @@ metadata:
25
25
 
26
26
  | Tool | Verified version |
27
27
  |---|---|
28
- | @nativele/ts-dom | 0.5.2 |
28
+ | @nativele/ts-dom | 0.5.2 (the last agent trial) |
29
29
  | @tanstack/query-core | 5.106.1 |
30
30
  | vite | 8.3.6 |
31
31
  | typescript | 7.0.2 |
@@ -25,7 +25,7 @@ The recommended path is Vitest: component tests in happy-dom, and the few behavi
25
25
 
26
26
  | Tool | Verified version |
27
27
  |---|---|
28
- | @nativele/ts-dom | 0.5.2 |
28
+ | @nativele/ts-dom | 0.5.2 (the last agent trial) |
29
29
  | vitest | 5.1.0 |
30
30
  | happy-dom | 21.0.4 |
31
31
  | jsdom | 30.1.3 (the same component tests pass; not the recommended environment) |
@@ -35,7 +35,7 @@ The recommended path is Vitest: component tests in happy-dom, and the few behavi
35
35
  | vite | 8.3.6 |
36
36
  | typescript | 7.0.2 |
37
37
 
38
- Verified on 2026-11-05 with Node 24 and Google Chrome 148, starting from `create-vite` 9.3.4 with the `vanilla-ts` template, with the example project in the Nativele repository (`skills/nativele-testing/example`), which CI runs again when the example or the library changes and once a month. Vitest 5 changed its configuration (`test.api`, `test.projects`, providers as separate packages); with Vitest 4 or older, or another major version of any tool above, treat every step as unverified.
38
+ Verified on 2026-11-05 with Node 24 and Google Chrome 148, starting from `create-vite` 9.3.4 with the `vanilla-ts` template, with the example project in the Nativele repository (`skills/nativele-testing/example`), and by an agent trial: a fresh agent did real work with only the Skill, and the result was checked independently. The example is a reference; it is not run in CI. Vitest 5 changed its configuration (`test.api`, `test.projects`, providers as separate packages); with Vitest 4 or older, or another major version of any tool above, treat every step as unverified.
39
39
 
40
40
  ## Set-up
41
41
 
@@ -129,7 +129,7 @@ Verified on 2026-11-05 with Node 24 and Google Chrome 148, starting from `create
129
129
 
130
130
  ## Example
131
131
 
132
- The component under test (from the example project, `src/nv/counter-card.*`):
132
+ The component under test (`src/nv/counter-card.*`):
133
133
 
134
134
  ```html
135
135
  <!-- src/nv/counter-card.html -->
@@ -224,7 +224,7 @@ The steps every test follows:
224
224
  4. Assert at once. Rendering is synchronous: after `append`, a prop assignment, `setAttribute`, `el.click()` or `store.set()`, the DOM is already updated, and `emit` listeners have already run. For a form, set the input's `value`, then call `click()` on its submit button or `form.requestSubmit()`: both run the template's `data-on-submit` handler, in happy-dom too. The only waits are for slot changes made after connection (one microtask, below).
225
225
  5. Empty the document in `afterEach` (`document.body.replaceChildren()`): removing the elements runs `disconnected()` and ends their `bind`, `on` and `onCleanup` registrations.
226
226
 
227
- Other parts of the API, as in the example project's tests:
227
+ Other parts of the API:
228
228
 
229
229
  ```ts
230
230
  // lists (test/todo-list.test.ts): items as components; an item's event reaches the parent with hit.key
@@ -286,7 +286,7 @@ test("Chrome moves a list item with moveBefore: it stays connected and keeps foc
286
286
  });
287
287
  ```
288
288
 
289
- Under happy-dom this test fails: there is no `moveBefore`, both callbacks run and the input loses focus. The example's `test/todo-list.test.ts` asserts the happy-dom behavior, so a later happy-dom release that adds `moveBefore` shows up as a failing test. The Vitest API in browser mode is the same: the example's other happy-dom tests also pass unchanged when run in the browser project, so moving a test there is a matter of renaming it.
289
+ Under happy-dom this test fails: there is no `moveBefore`, both callbacks run and the input loses focus. A unit test can assert the happy-dom behavior, so that a later happy-dom release that adds `moveBefore` shows up as a failing test. The Vitest API in browser mode is the same: happy-dom tests also pass unchanged when run in the browser project, so moving a test there is a matter of renaming it.
290
290
 
291
291
  A page test with Playwright (the alternative):
292
292
 
@@ -336,7 +336,7 @@ npx vitest run --project browser # expect: the *.browser.test.ts files pass in
336
336
  npx playwright test # if you use the alternative: builds, serves on port 4432, passes
337
337
  ```
338
338
 
339
- The example project's `verify` script runs exactly these, plus the same unit tests under jsdom as a third Vitest project (`"environment": "jsdom"`), which shows that jsdom works for the same tests. Its tests prove each limitation above: the module import, per-file isolation, `define()` twice, `vi.resetModules()`, slot timing in both modes, and the move that happy-dom and Chrome handle differently.
339
+ The same unit tests also pass under jsdom, as a third Vitest project with `"environment": "jsdom"`. Each limitation above was proved by a test in the agent trial: the module import, per-file isolation, `define()` twice, `vi.resetModules()`, slot timing in both modes, and the move that happy-dom and Chrome handle differently.
340
340
 
341
341
  ## Troubleshooting
342
342
 
@@ -24,13 +24,13 @@ metadata:
24
24
 
25
25
  | Tool | Verified version |
26
26
  |---|---|
27
- | @nativele/ts-dom | 0.5.1 |
27
+ | @nativele/ts-dom | 0.5.1 (the last agent trial) |
28
28
  | vite | 8.3.6 |
29
29
  | typescript | 7.0.2 |
30
30
  | create-vite (`vanilla-ts` template, the starting point) | 9.3.4 |
31
- | vite-plus | 1.5.0 (checked by hand with `vp dev`, `vp build` and `vp lint`; the example project does not run it) |
31
+ | vite-plus | 1.5.0 (checked by hand with `vp dev`, `vp build` and `vp lint`) |
32
32
 
33
- Verified on 2026-11-05 in Google Chrome 148 with the example project in the Nativele repository (`skills/nativele-vite/example`), which CI runs again when the example or the library changes and once a month. With a different major version of Vite, treat every step as unverified.
33
+ Verified on 2026-11-05 in Google Chrome 148 with the example project in the Nativele repository (`skills/nativele-vite/example`), and by an agent trial: a fresh agent did real work with only the Skill, and the result was checked independently. The example is a reference; it is not run in CI. With a different major version of Vite, treat every step as unverified.
34
34
 
35
35
  ## Set-up
36
36
 
@@ -75,7 +75,7 @@ Starting from the `vanilla-ts` template, which already has `"type": "module"`, a
75
75
 
76
76
  ## Example
77
77
 
78
- A two-page app with `root: "web"`, as in the example project:
78
+ A two-page app with `root: "web"`:
79
79
 
80
80
  ```
81
81
  package.json tsconfig.json vite.config.ts
@@ -173,7 +173,7 @@ npm run build # expect: ts-dom check: no issues, then ✓ built,
173
173
  npx ts-dom doctor src/nv # expect: ts-dom doctor: the set-up looks right
174
174
  ```
175
175
 
176
- Then run `npm run dev`, open every page and check that its components render and respond. Edit a template and check that the page reloads once and shows the change. The example project's [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-vite/example/verify.mjs) checks with Playwright that `vite build` alone writes the generated files, that both built pages work under `vite preview`, and every row of the table in Known limitations, restoring the files it edits.
176
+ Then run `npm run dev`, open every page and check that its components render and respond. Edit a template and check that the page reloads once and shows the change. A reference implementation is the [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-vite/example/verify.mjs) of the trial's example project, which checks with Playwright that `vite build` alone writes the generated files, that both built pages work under `vite preview`, and every row of the table in Known limitations, restoring the files it edits.
177
177
 
178
178
  ## Troubleshooting
179
179
 
@@ -25,7 +25,7 @@ Nativele components are native custom elements. Vue renders them like any other
25
25
 
26
26
  | Tool | Verified version |
27
27
  |---|---|
28
- | @nativele/ts-dom | 0.5.1 |
28
+ | @nativele/ts-dom | 0.5.1 (the last agent trial) |
29
29
  | vue | 3.5.44 |
30
30
  | vite | 8.3.6 |
31
31
  | @vitejs/plugin-vue | 6.0.10 |
@@ -33,7 +33,7 @@ Nativele components are native custom elements. Vue renders them like any other
33
33
  | typescript | 6.0.3 |
34
34
  | @vue/tsconfig | 0.9.1 |
35
35
 
36
- Verified on 2026-11-05 in Google Chrome 148, starting from `create-vite` 9.3.4 with the `vue-ts` template, with the example project in the Nativele repository (`skills/nativele-vue/example`), which CI runs again when the example or the library changes and once a month. With a different major version of Vue, treat every step as unverified.
36
+ Verified on 2026-11-05 in Google Chrome 148, starting from `create-vite` 9.3.4 with the `vue-ts` template, with the example project in the Nativele repository (`skills/nativele-vue/example`), and by an agent trial: a fresh agent did real work with only the Skill, and the result was checked independently. The example is a reference; it is not run in CI. With a different major version of Vue, treat every step as unverified.
37
37
 
38
38
  ## Set-up
39
39
 
@@ -252,7 +252,7 @@ Prove that the declaration types props: keep a `.vue` file that the app never im
252
252
 
253
253
  `vue-tsc -b` passes only while each of these is an error; if the declaration stops working, it reports `TS2578: Unused '@ts-expect-error' directive`.
254
254
 
255
- In the browser, against the dev server (production builds drop Vue warnings), check that an element with an object prop has no attribute for it (`el.getAttributeNames()`) and that `el.item` is the object, that the listener runs once per event, that a kebab-case Vue component still renders, and that there are no errors or `[Vue warn]` lines in the console. The example project's [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-vue/example/verify.mjs) does these checks with Playwright, plus the `v-model` replacement, a component defined after mount, children that Vue reorders, adds and removes in both slot modes, and the lifecycle under `v-for`, `<KeepAlive>` and `v-if`. A Light DOM component has no `<slot>` elements once rendered; read a slot with `el.assignedNodes(name)`, where `""` is the default slot, and compare elements only, because Vue leaves comment and empty text nodes among the children.
255
+ In the browser, against the dev server (production builds drop Vue warnings), check that an element with an object prop has no attribute for it (`el.getAttributeNames()`) and that `el.item` is the object, that the listener runs once per event, that a kebab-case Vue component still renders, and that there are no errors or `[Vue warn]` lines in the console. A reference implementation of these checks is the [`verify.mjs`](https://github.com/Pixmi/nativele/blob/main/skills/nativele-vue/example/verify.mjs) of the trial's example project, which does them with Playwright, plus the `v-model` replacement, a component defined after mount, children that Vue reorders, adds and removes in both slot modes, and the lifecycle under `v-for`, `<KeepAlive>` and `v-if`. A Light DOM component has no `<slot>` elements once rendered; read a slot with `el.assignedNodes(name)`, where `""` is the default slot, and compare elements only, because Vue leaves comment and empty text nodes among the children.
256
256
 
257
257
  ## Troubleshooting
258
258
 
@@ -23,7 +23,7 @@ metadata:
23
23
 
24
24
  | Tool | Verified version |
25
25
  |---|---|
26
- | @nativele/ts-dom | 0.5.2 |
26
+ | @nativele/ts-dom | 0.5.2 (the last agent trial) |
27
27
  | zod | 4.6.7 (the procedure was also run with 3.25.76, with the schema changes in limitation 10) |
28
28
  | valibot | 1.5.0 (limitation 11) |
29
29
  | vite | 8.3.6 |