solid2-agent-kit 0.23.0 → 0.23.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/bin/solid2-kit.mjs
CHANGED
|
@@ -849,12 +849,13 @@ const CHECKS = [
|
|
|
849
849
|
},
|
|
850
850
|
];
|
|
851
851
|
|
|
852
|
-
// Named imports from "@solidjs/router"
|
|
853
|
-
//
|
|
854
|
-
// `formAction as action` (the local
|
|
852
|
+
// Named imports (and re-exports) from "@solidjs/router" or its `/data` subpath
|
|
853
|
+
// among `names`, located at the name inside the import list. Only the imported
|
|
854
|
+
// name counts: `action as save` is flagged, `formAction as action` (the local
|
|
855
|
+
// name) is not.
|
|
855
856
|
function routerImportFindings(content, names) {
|
|
856
857
|
const findings = [];
|
|
857
|
-
for (const statement of content.matchAll(/import\s
|
|
858
|
+
for (const statement of content.matchAll(/(?:import|export)\s*(?:type\s+)?\{([^}]*)\}\s*from\s*['"]@solidjs\/router(?:\/data)?['"]/g)) {
|
|
858
859
|
const list = statement[1];
|
|
859
860
|
const offset = statement.index + statement[0].indexOf(list);
|
|
860
861
|
for (const name of names) {
|
|
@@ -316,7 +316,8 @@ Claude Code) for full patterns, decision tables, and official documentation URLs
|
|
|
316
316
|
<!-- upstream:uncommitted-input-overwritten -->. Bind a draft signal written from
|
|
317
317
|
`onInput` (`createSignal(() => props.name)` resets it when the prop changes), use
|
|
318
318
|
`defaultValue` for an uncontrolled field, or write the next value back explicitly;
|
|
319
|
-
`equals: false` on the signal
|
|
319
|
+
`equals: false` on the bound signal is no way to reject input — a source firing with an
|
|
320
|
+
equal value is one of the causes the warning names, so it only adds re-writes.
|
|
320
321
|
22. Miscellaneous defaults: SSR-stable element ids come from `createUniqueId()` (never
|
|
321
322
|
`Math.random()` or hardcoded duplicates); pass store data to `structuredClone` /
|
|
322
323
|
`postMessage` / logs via `snapshot(store)` (proxies fail or leak reactivity) — a
|
|
@@ -162,8 +162,9 @@ seed the shape through the `createStore` argument or a derivation.
|
|
|
162
162
|
**The store itself is read-only; only the draft writes.** An assignment or mutating
|
|
163
163
|
call on the store proxy outside a setter is *ignored* — no throw, the value does not
|
|
164
164
|
change, and TypeScript accepts it (`Store<T>` is `T`). Since 2.0.0-rc.17 dev warns
|
|
165
|
-
`[STORE_WRITE_OUTSIDE_SETTER]` once per store object and key (
|
|
166
|
-
|
|
165
|
+
`[STORE_WRITE_OUTSIDE_SETTER]` once per store object and key (a later delete of a key
|
|
166
|
+
already reported is not reported again; the operation is only in the event's `data`);
|
|
167
|
+
production stays silent
|
|
167
168
|
<!-- upstream:store-write-outside-setter -->. This is the
|
|
168
169
|
MobX / Vue / Solid 1 `createMutable` reflex:
|
|
169
170
|
|
|
@@ -947,8 +948,9 @@ const [draft, setDraft] = createSignal(() => props.name);
|
|
|
947
948
|
// 3. explicit write-back when the field must follow an external value exactly
|
|
948
949
|
```
|
|
949
950
|
|
|
950
|
-
`equals: false` on the committed signal
|
|
951
|
-
|
|
951
|
+
`equals: false` on the committed signal makes it worse, not better — a source firing with
|
|
952
|
+
an equal value is one of the three causes the warning names, beside another binding in the
|
|
953
|
+
same template changing and a spread re-running — and a `createEffect` that copies the prop into the field is rule 4 again.
|
|
952
954
|
|
|
953
955
|
### Context
|
|
954
956
|
|
|
@@ -1233,7 +1235,7 @@ committed value over uncommitted user input <!-- upstream:uncommitted-input-over
|
|
|
1233
1235
|
`[ASYNC_OUTSIDE_LOADING_BOUNDARY]` when a tracked read has no boundary above it, and
|
|
1234
1236
|
`[LOADING_ON_OUTSIDE_HOLD]` when a `<Loading on>` boundary's data is also read outside it.
|
|
1235
1237
|
Each entry carries a stable `[CODE]`, what the runtime observed, an owner chain
|
|
1236
|
-
(`in <App> › <Cart> › <LineItem>`), and — since rc.
|
|
1238
|
+
(`in <App> › <Cart> › <LineItem>`), and — since rc.16, under `vite dev` — an
|
|
1237
1239
|
`at src/Cart.tsx:12:5` line naming where the scope was created (the compiler's
|
|
1238
1240
|
`sourceNames.locations`; the same `loc` sits on every artifact event)
|
|
1239
1241
|
<!-- upstream:source-names-locations -->; never silence a code before understanding it.
|
|
@@ -1291,7 +1293,7 @@ anonymous nodes print as `computed` / `effect` / `signal`; component labels
|
|
|
1291
1293
|
(`<Checkout>`) are always present under `vite dev` and survive minification only with
|
|
1292
1294
|
the compiler's `sourceNames` option (components, binding effects, primitives — the Vite
|
|
1293
1295
|
plugin turns it on under `vite dev` and `observe: true`; `componentNames` was its rc.9 name
|
|
1294
|
-
and is rejected now) <!-- upstream:source-names-option -->. Its `locations` kind (rc.
|
|
1296
|
+
and is rejected now) <!-- upstream:source-names-option -->. Its `locations` kind (rc.16)
|
|
1295
1297
|
adds `file:line:col` to every name — `createComponent(Home, props, "Home", "src/App.tsx:12:5")`,
|
|
1296
1298
|
`{ name, loc }` on primitives — which is what the `at …` line in a diagnostic and
|
|
1297
1299
|
`event.loc` in an artifact print; the plugin turns it on under `vite dev` only, and an
|
|
@@ -2179,7 +2181,7 @@ how to reuse. Prefer the form on the right.
|
|
|
2179
2181
|
| `onClick={setCount}` | `onClick={() => setCount((c) => c + 1)}` |
|
|
2180
2182
|
| `onclick={fn}` / `onmouseover={fn}` (lowercase handlers) | `onClick={fn}` — a lowercase `on*` name is a plain attribute (dev warns `[LOWERCASE_EVENT_ATTRIBUTE]`), not an event <!-- upstream:lowercase-event-attribute --> |
|
|
2181
2183
|
| `on:click={fn}` / `use:tooltip` / `attr:title` / `classList={{ on: x() }}` on a native element | `onClick`, a ref callback from a directive factory, `title`, `class={["btn", { on: x() }]}` — the 1.x forms are compile errors since rc.17 (`prop:` remains) <!-- upstream:removed-attribute-compile-error --> |
|
|
2182
|
-
| `value={props.name} onChange={(e) => props.onCommit(e.currentTarget.value)}` (bound to the committed value, no per-edit write) | a draft signal `createSignal(() => props.name)` written from `onInput`, or `defaultValue={props.name}` — the binding re-applies the committed value over uncommitted typing (`[UNCOMMITTED_INPUT_OVERWRITTEN]`); `equals: false`
|
|
2184
|
+
| `value={props.name} onChange={(e) => props.onCommit(e.currentTarget.value)}` (bound to the committed value, no per-edit write) | a draft signal `createSignal(() => props.name)` written from `onInput`, or `defaultValue={props.name}` — the binding re-applies the committed value over uncommitted typing (`[UNCOMMITTED_INPUT_OVERWRITTEN]`); `equals: false` is one of its causes, not a fix <!-- upstream:uncommitted-input-overwritten --> |
|
|
2183
2185
|
| `useDeferredValue(query())` / `startTransition(() => setQuery(q))` for an expensive derivation | `const rows = createDeferred(() => filter(all(), query()))` — an async memo that lags but never leads its inputs; `isPending(rows)` while it catches up. Unrelated to the 1.x `createDeferred(source, { timeoutMs })` <!-- upstream:create-deferred-export --> |
|
|
2184
2186
|
| `event.target.value` | `event.currentTarget.value` |
|
|
2185
2187
|
| `createContext(emptyStore)` for reactive state | `createContext<Todos>()` — dummy defaults silently no-op |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "solid2-agent-kit",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.1",
|
|
4
4
|
"description": "Teach AI coding agents (Cursor, Claude Code) to write correct Solid 2.0 instead of React or Solid 1.x — always-applied rules, an agent skill, and a mechanical pattern gate.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|