genesis-stack 1.4.6 → 1.4.8
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/README.md +2 -1
- package/package.json +1 -1
- package/stacks/pieces/django.md +3 -0
- package/stacks/pieces/jskit-mysql.md +8 -0
- package/stacks/pieces/jskit-postgresql.md +8 -0
- package/stacks/pieces/jskit.md +41 -1
- package/stacks/pieces/laravel.md +4 -0
- package/stacks/pieces/nodejs.md +3 -0
- package/stacks/pieces/rails.md +3 -0
- package/stacks/pieces/spring-boot.md +3 -1
- package/stacks/pieces/vue.md +4 -0
package/README.md
CHANGED
|
@@ -33,7 +33,8 @@ executes catalog code. Framework pieces such as JSKIT and Vue link to their
|
|
|
33
33
|
authoritative documentation in ordinary Stack guidance. Each piece's
|
|
34
34
|
"Sanity checks with <stack>" guidance says how to apply Genesis's
|
|
35
35
|
stack-neutral sanity checks with that stack's own tools, such as its strict
|
|
36
|
-
loading mode, query-count assertion and parallel test
|
|
36
|
+
loading mode, query-count assertion, query-side filters and parallel test
|
|
37
|
+
runner; it names a
|
|
37
38
|
framework default only where official documentation confirms it.
|
|
38
39
|
|
|
39
40
|
Genesis still supports optional Agent Skills generically. A Stack piece from
|
package/package.json
CHANGED
package/stacks/pieces/django.md
CHANGED
|
@@ -111,6 +111,9 @@ https://docs.djangoproject.com/
|
|
|
111
111
|
rows.
|
|
112
112
|
- `assertNumQueries` asserts a given number. Use it to compare a few rows
|
|
113
113
|
with a realistic number, never as a fixed ceiling.
|
|
114
|
+
- Narrow on the queryset (`filter()`, `exclude()`, `exists()`, `count()`, a
|
|
115
|
+
slice taken before it is evaluated), never in Python: a comprehension or
|
|
116
|
+
loop over fetched rows, `len()` or `if queryset:` loads every row.
|
|
114
117
|
- Django runs tests one at a time unless asked: run
|
|
115
118
|
`manage.py test --parallel auto`, which clones the test database once per
|
|
116
119
|
process, so the database user needs permission to create databases. Add
|
|
@@ -82,3 +82,11 @@ JSKIT MySQL runtime, live-schema CRUD generation, and persistence conventions.
|
|
|
82
82
|
error translation at one established persistence boundary.
|
|
83
83
|
- Never compete with or rewrite a generator-owned baseline migration. Preserve
|
|
84
84
|
retained migration history and data semantics.
|
|
85
|
+
|
|
86
|
+
## Data pass
|
|
87
|
+
|
|
88
|
+
- Apply the MySQL part of JSKIT's data pass page at
|
|
89
|
+
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-pass#mysql`:
|
|
90
|
+
one schema change per migration because MySQL DDL commits as it goes, online
|
|
91
|
+
index changes that fail rather than lock (`ALGORITHM=INPLACE, LOCK=NONE`),
|
|
92
|
+
and `EXPLAIN ANALYZE` on the test database at realistic size.
|
|
@@ -78,3 +78,11 @@ JSKIT PostgreSQL runtime, live-schema CRUD generation, and persistence conventio
|
|
|
78
78
|
error translation at one established persistence boundary.
|
|
79
79
|
- Never compete with or rewrite a generator-owned baseline migration. Preserve
|
|
80
80
|
retained migration history and data semantics.
|
|
81
|
+
|
|
82
|
+
## Data pass
|
|
83
|
+
|
|
84
|
+
- Apply the PostgreSQL part of JSKIT's data pass page at
|
|
85
|
+
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-pass#postgresql`:
|
|
86
|
+
concurrent index builds in a migration without a transaction, constraints
|
|
87
|
+
added `NOT VALID` and validated afterwards on large tables, and
|
|
88
|
+
`EXPLAIN (ANALYZE, BUFFERS)` on the test database at realistic size.
|
package/stacks/pieces/jskit.md
CHANGED
|
@@ -93,7 +93,11 @@ https://mobily-enterprises.github.io/jskit-ai/
|
|
|
93
93
|
describes; list, batch and write paths compare their query counts at
|
|
94
94
|
realistic sizes, as
|
|
95
95
|
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/typed-features#query-counts-at-realistic-sizes`
|
|
96
|
-
describes.
|
|
96
|
+
describes. A read narrows in its query, with the filters the resource's
|
|
97
|
+
`searchSchema` maps (a field, an id list, `q`), never with `filter`, `find`
|
|
98
|
+
or `slice` on rows a query returned; a list's Search box and a lookup field's
|
|
99
|
+
autocomplete send `q` to the server, which narrows only where that resource
|
|
100
|
+
maps `searchSchema.q`.
|
|
97
101
|
|
|
98
102
|
- When application integrations are requested or `integrations.json` exists,
|
|
99
103
|
treat that file as the application-owned configuration used by both editor
|
|
@@ -322,6 +326,42 @@ https://mobily-enterprises.github.io/jskit-ai/
|
|
|
322
326
|
- The checks cannot see layout, spacing or contrast; look at every screenshot
|
|
323
327
|
for those.
|
|
324
328
|
|
|
329
|
+
## Identity pass
|
|
330
|
+
|
|
331
|
+
- Read JSKIT's visual identity page at
|
|
332
|
+
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/visual-identity`
|
|
333
|
+
and its Material 3 rules at
|
|
334
|
+
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/material-3`
|
|
335
|
+
completely. The identity lives where that page puts it: the seed and a
|
|
336
|
+
named colour per content kind in `src/theme/index.js`, every content colour
|
|
337
|
+
in `src/theme/palettes.js`, the cover and empty-state art in
|
|
338
|
+
`src/components/art/`, the logo with `favicon.svg`, the startup shell in
|
|
339
|
+
`index.html`, and sign-in in the auth surface's `AppBrand.vue`.
|
|
340
|
+
- Run `npx jskit check m3` until it reports nothing and `npx jskit check`
|
|
341
|
+
until it passes, then take the screenshots as JSKIT's UI pass method shows.
|
|
342
|
+
|
|
343
|
+
## Quality pass
|
|
344
|
+
|
|
345
|
+
- Read JSKIT's quality pass page at
|
|
346
|
+
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/quality-pass`
|
|
347
|
+
completely: where loading, empty, error and refused states live in a JSKIT
|
|
348
|
+
app, how each refusal carries its own code to `useJskitText()`'s
|
|
349
|
+
`serverMessage()`, and how Playwright forces each state.
|
|
350
|
+
- Run `npm run verify` and the focused Vitest and Playwright tests of the
|
|
351
|
+
affected screens.
|
|
352
|
+
|
|
353
|
+
## Data pass
|
|
354
|
+
|
|
355
|
+
- Read JSKIT's data pass page at
|
|
356
|
+
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-pass`
|
|
357
|
+
and its data access guide at
|
|
358
|
+
`https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-access`
|
|
359
|
+
completely: the table resource is each table's one owner, Knex migrations
|
|
360
|
+
carry constraints and indexes, and `expectFlatQueries()` compares a path's
|
|
361
|
+
queries at a few rows and at a realistic number on `TEST_DB_NAME`.
|
|
362
|
+
- Leave `npm run lint` (which reports narrowing in code) and `npx jskit check`
|
|
363
|
+
without findings.
|
|
364
|
+
|
|
325
365
|
## Verification
|
|
326
366
|
|
|
327
367
|
- Verify `application`: `npm` `run` `verify`
|
package/stacks/pieces/laravel.md
CHANGED
|
@@ -104,6 +104,10 @@ conventions. Authoritative framework documentation: https://laravel.com/docs/
|
|
|
104
104
|
- `get()` and `all()` return every row. `paginate()` returns one page, with
|
|
105
105
|
`total` and `next_page_url` in its JSON, and never stands for every row.
|
|
106
106
|
Batches iterate with `chunkById()` or `lazyById()`.
|
|
107
|
+
- Narrow in the query builder (`where`, local scopes, `whereHas`,
|
|
108
|
+
`exists()`, `count()`), never with a Collection's `filter()`, `where()` or
|
|
109
|
+
`first()` on fetched rows: `$post->comments()->where(...)` is a query,
|
|
110
|
+
while `$post->comments->where(...)` loads every comment and filters in PHP.
|
|
107
111
|
- Laravel runs tests one at a time in one process. Add `brianium/paratest`
|
|
108
112
|
as a development dependency and run `php artisan test --parallel`: each
|
|
109
113
|
process gets its own `<database>_test_<token>` database, which Laravel
|
package/stacks/pieces/nodejs.md
CHANGED
|
@@ -73,6 +73,9 @@ Node.js package, command, module, dependency, and test conventions.
|
|
|
73
73
|
`maxFailures` defaults to 0, no cap: set a low cap only on a diagnosis run.
|
|
74
74
|
- Count a list's queries at a few rows and at a realistic number through the
|
|
75
75
|
database client's query event or log.
|
|
76
|
+
- Narrow in the database client's query (its `where`, `limit` and count),
|
|
77
|
+
never with an array's `filter`, `find`, `some` or `slice` on rows already
|
|
78
|
+
read.
|
|
76
79
|
|
|
77
80
|
## Adoption
|
|
78
81
|
|
package/stacks/pieces/rails.md
CHANGED
|
@@ -132,6 +132,9 @@ Authoritative framework documentation: https://guides.rubyonrails.org/
|
|
|
132
132
|
with a realistic number, never as a fixed ceiling.
|
|
133
133
|
- `Model.all` has no `LIMIT`; batches iterate with `find_each`, 1,000 rows at
|
|
134
134
|
a time.
|
|
135
|
+
- Narrow on the relation (`where`, scopes, `limit`, `exists?`, `count`),
|
|
136
|
+
never on loaded records: `length` and the block forms of `select`, `find`
|
|
137
|
+
and `any?` load every record and work in Ruby.
|
|
135
138
|
- Keep the generated `parallelize(workers: :number_of_processors)` in
|
|
136
139
|
`test/test_helper.rb`. Rails parallelizes from 50 tests up and creates a
|
|
137
140
|
database for each worker, so the database user needs permission to create
|
|
@@ -102,7 +102,9 @@ https://docs.spring.io/spring-boot/
|
|
|
102
102
|
and the persistence layer's own tools, as their official documentation
|
|
103
103
|
describes them: count a list's statements at a few rows and at a realistic
|
|
104
104
|
number, run test classes in parallel with a database each, and prepare test
|
|
105
|
-
databases without replaying every migration per test class.
|
|
105
|
+
databases without replaying every migration per test class. Narrow in the
|
|
106
|
+
repository query (a derived `findBy`, `existsBy` or `countBy` method,
|
|
107
|
+
`@Query`, a `Specification`), never with a stream `filter` over `findAll()`.
|
|
106
108
|
|
|
107
109
|
## Adoption
|
|
108
110
|
|
package/stacks/pieces/vue.md
CHANGED
|
@@ -45,6 +45,10 @@ conventions. Authoritative framework documentation: https://vuejs.org/
|
|
|
45
45
|
production build has no such check, so repeat the changes there and look
|
|
46
46
|
for a frozen tab or blank region. Count the DOM nodes a long list renders
|
|
47
47
|
with realistic data.
|
|
48
|
+
- A picker, lookup or autocomplete over stored records sends the typed search
|
|
49
|
+
to the server and shows what it returns, never a loaded list filtered in a
|
|
50
|
+
`computed`. Vuetify's `v-autocomplete` filters only the items it holds:
|
|
51
|
+
give it `no-filter` and load its items on `update:search`.
|
|
48
52
|
|
|
49
53
|
### Reactive state hydration
|
|
50
54
|
|