kerfjs 4.0.0 → 4.1.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/CHANGELOG.md CHANGED
@@ -6,6 +6,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [4.1.1] - 2026-08-14
10
+
11
+
12
+
13
+ - Added a CDN / importmap quickstart (`docs/6-jsx-runtime.md` §6.11.1) covering three no-install ways to load kerf from an ESM CDN: a direct `esm.sh` import, and jsDelivr / unpkg behind an importmap that also maps `@preact/signals-core`. Explains why a raw `dist/*.js` path fails (its unrewritten bare `@preact/signals-core` import won't resolve in the browser) and recommends pinning to a major version.
14
+ - Updated the README no-build example to use version-pinned CDN URLs (`kerfjs@4`) and noted that jsDelivr / unpkg need an importmap while esm.sh works with a direct import.
15
+
16
+ ## [4.1.0] - 2026-07-31
17
+
18
+
19
+
20
+ - ESLint 10 is now supported: `eslint-plugin-kerfjs` declares `peerDependencies.eslint` as `^9.0.0 || ^10.0.0`, and every named major is exercised by the rule suite in CI.
21
+ - The plugin now runs its rule suite against each supported ESLint major via `npm run test:eslint-matrix`, which also fails if the declared peer range, the tested set, and the CI matrix disagree — or if the range is left open-ended.
22
+
23
+
24
+ - **ESLint 8 is no longer supported by `eslint-plugin-kerfjs`.** The package is ESM-only and ESLint 8 resolves `.eslintrc` plugins with `require()`, so `extends: ["plugin:kerfjs/…"]` could never load it.
25
+ - **Legacy `.eslintrc` configuration is documented as unsupported.** Use flat config (`eslint.config.js`); the `legacy-recommended` export remains in the package but is unreachable through any config system and should be treated as deprecated.
26
+
27
+
28
+ - Generated Hot Sheet skill and rule files no longer hardcode a machine's local API port or shared secret. The curl fallbacks read `$HOTSHEET_PORT` / `$HOTSHEET_SECRET` from `.hotsheet/settings.local.json` and `.hotsheet/secret.json` instead, with `.hotsheet/settings.json` as the fallback for older projects.
29
+ - A new `npm run check:audit` gate runs `npm audit --omit=dev --audit-level=high` against the published dependency tree and is wired into the pre-push `check:full` gate.
30
+
31
+
32
+ - Test tooling moved to vitest 4 and ESLint 10; coverage thresholds were recalibrated to 98.5% branches / 99.5% statements (lines and functions stay at 100%) after vitest 4's sharper AST-based coverage mapping resolved seventeen previously-miscredited defensive branches.
33
+ - Removed the `hs-m` marketing-ticket skill and Cursor rule.
34
+
9
35
  ## [4.0.0] - 2026-07-28
10
36
 
11
37
 
package/README.md CHANGED
@@ -189,8 +189,8 @@ Same algorithm `mount()` uses internally — `data-morph-skip`, `data-morph-skip
189
189
 
190
190
  ```html
191
191
  <script type="module">
192
- import { signal, mount, each } from 'https://esm.sh/kerfjs';
193
- import { html } from 'https://esm.sh/kerfjs/html';
192
+ import { signal, mount, each } from 'https://esm.sh/kerfjs@4';
193
+ import { html } from 'https://esm.sh/kerfjs@4/html';
194
194
 
195
195
  const items = signal([{ id: 1, label: 'no build step' }]);
196
196
 
@@ -200,7 +200,7 @@ Same algorithm `mount()` uses internally — `data-morph-skip`, `data-morph-skip
200
200
  </script>
201
201
  ```
202
202
 
203
- Attribute names are written verbatim (`class`, not `className`), and holes are only legal in text positions or as a complete attribute value — anything ambiguous throws with an actionable message. Static template parts parse once per call site. See [`docs/6-jsx-runtime.md`](./docs/6-jsx-runtime.md) §6.11 — or the [live-poll example](https://brianwestphal.github.io/kerf/examples/complete/live-poll/), a complete app served exactly as authored: no bundler ever touches it.
203
+ Nothing is self-hosted — `kerfjs` is on npm, so every ESM CDN (esm.sh, jsDelivr, unpkg) mirrors it automatically. esm.sh works with a direct import as shown; jsDelivr / unpkg want an importmap so the internal `@preact/signals-core` import resolves. Pin to a major (`@4`, as shown — the latest `4.x`) rather than floating on `latest`, or an exact version (`@4.1.0`) for full reproducibility. Attribute names are written verbatim (`class`, not `className`), and holes are only legal in text positions or as a complete attribute value — anything ambiguous throws with an actionable message. See [`docs/6-jsx-runtime.md`](./docs/6-jsx-runtime.md) §6.11 (§6.11.1 for the full CDN / importmap recipes) — or the [live-poll example](https://brianwestphal.github.io/kerf/examples/complete/live-poll/), a complete app served exactly as authored: no bundler ever touches it.
204
204
 
205
205
  ## Install
206
206
 
package/ai/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "kerfjsVersion": "4.0.0",
2
+ "kerfjsVersion": "4.1.1",
3
3
  "files": [
4
4
  {
5
5
  "name": "skill",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kerfjs",
3
- "version": "4.0.0",
3
+ "version": "4.1.1",
4
4
  "description": "Tiny reactive UI framework — fine-grained signals + DOM morphing + JSX. Apply the smallest possible cut to update your DOM.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -91,12 +91,13 @@
91
91
  "bench:serve": "bash bench/site.sh",
92
92
  "lint": "eslint src tests",
93
93
  "typecheck": "node node_modules/typescript7/bin/tsc --noEmit",
94
- "check": "npm run lint && npm run typecheck && node scripts/check-doc-test-inventory.mjs && node scripts/check-doc-api-coverage.mjs && node scripts/check-doc-site-tickets.mjs && node scripts/check-dev-warn-docs.mjs && node scripts/check-skill-freshness.mjs && node scripts/check-design-rule-5.mjs && node scripts/check-feature-coverage.mjs && node scripts/check-ai-bundle.mjs && npm test && npm run build && node scripts/check-bundle-size.mjs && node scripts/check-doc-api-signatures.mjs && vitest run --config vitest.config.dist.ts && vitest run --config vitest.config.dist-full.ts && node node_modules/typescript7/bin/tsc -p tests/dist/jsx-typing/tsconfig.json && node node_modules/typescript7/bin/tsc -p site/src/examples/complete/tsconfig.json && node node_modules/typescript7/bin/tsc -p tests/dist/scaffold-typing/tsconfig.json && node scripts/check-docs-examples.mjs",
94
+ "check": "npm run lint && npm run typecheck && node scripts/check-doc-test-inventory.mjs && node scripts/check-doc-api-coverage.mjs && node scripts/check-doc-site-tickets.mjs && node scripts/check-cdn-versions.mjs && node scripts/check-dev-warn-docs.mjs && node scripts/check-skill-freshness.mjs && node scripts/check-design-rule-5.mjs && node scripts/check-feature-coverage.mjs && node scripts/check-ai-bundle.mjs && npm test && npm run build && node scripts/check-bundle-size.mjs && node scripts/check-doc-api-signatures.mjs && vitest run --config vitest.config.dist.ts && vitest run --config vitest.config.dist-full.ts && node node_modules/typescript7/bin/tsc -p tests/dist/jsx-typing/tsconfig.json && node node_modules/typescript7/bin/tsc -p site/src/examples/complete/tsconfig.json && node node_modules/typescript7/bin/tsc -p tests/dist/scaffold-typing/tsconfig.json && node scripts/check-docs-examples.mjs",
95
95
  "check:docs:examples": "node scripts/check-docs-examples.mjs",
96
- "check:full": "npm run check && playwright test",
96
+ "check:full": "npm run check && npm run --silent check:audit && playwright test",
97
97
  "check:docs:test-inventory": "node scripts/check-doc-test-inventory.mjs",
98
98
  "check:docs:api-coverage": "node scripts/check-doc-api-coverage.mjs",
99
99
  "check:docs:site-tickets": "node scripts/check-doc-site-tickets.mjs",
100
+ "check:cdn-versions": "node scripts/check-cdn-versions.mjs",
100
101
  "check:docs:api-signatures": "npm run build && node scripts/check-doc-api-signatures.mjs",
101
102
  "fuzz:soak": "node scripts/fuzz-soak.mjs",
102
103
  "check:features": "node scripts/check-feature-coverage.mjs",
@@ -116,20 +117,22 @@
116
117
  "check:bundle-size": "npm run build && node scripts/check-bundle-size.mjs",
117
118
  "check:skills": "node scripts/check-skill-freshness.mjs",
118
119
  "check:design-rule-5": "node scripts/check-design-rule-5.mjs",
119
- "check:docs:dev-warns": "node scripts/check-dev-warn-docs.mjs"
120
+ "check:docs:dev-warns": "node scripts/check-dev-warn-docs.mjs",
121
+ "check:audit": "npm audit --omit=dev --audit-level=high"
120
122
  },
121
123
  "dependencies": {
122
124
  "@preact/signals-core": "^1.14.1"
123
125
  },
124
126
  "devDependencies": {
127
+ "@eslint/js": "^10.0.1",
125
128
  "@playwright/test": "^1.59.1",
126
129
  "@types/jsdom": "^28.0.1",
127
130
  "@types/node": "^22.10.0",
128
131
  "@typescript-eslint/eslint-plugin": "^8.65.0",
129
132
  "@typescript-eslint/parser": "^8.65.0",
130
- "@vitest/coverage-v8": "^3.0.0",
131
- "domotion-svg": "^0.21.1",
132
- "eslint": "^9.16.0",
133
+ "@vitest/coverage-v8": "^4.1.10",
134
+ "domotion-svg": "^0.22.2",
135
+ "eslint": "^10.8.0",
133
136
  "eslint-plugin-simple-import-sort": "^12.1.1",
134
137
  "gitgist": "^1.1.0",
135
138
  "happy-dom": "^20.9.0",
@@ -139,7 +142,7 @@
139
142
  "tsup": "^8.3.0",
140
143
  "typescript": "^6.0.3",
141
144
  "typescript7": "npm:typescript@^7.0.2",
142
- "vitest": "^3.0.0"
145
+ "vitest": "^4.1.10"
143
146
  },
144
147
  "gitgist": {
145
148
  "exclude": [