@jskit-ai/agent-docs 0.1.3 → 0.1.4

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.
Files changed (42) hide show
  1. package/DISTR_AGENT.md +11 -1
  2. package/guide/agent/app-extras/assistant.md +1 -1
  3. package/guide/agent/app-extras/realtime.md +1 -1
  4. package/guide/agent/app-setup/a-more-interesting-shell.md +1 -1
  5. package/guide/agent/app-setup/authentication.md +9 -1
  6. package/guide/agent/app-setup/console.md +1 -1
  7. package/guide/agent/app-setup/database-layer.md +1 -1
  8. package/guide/agent/app-setup/initial-scaffolding.md +1 -1
  9. package/guide/agent/app-setup/multi-homing.md +3 -1
  10. package/guide/agent/app-setup/users.md +1 -1
  11. package/guide/agent/app-setup/working-with-the-jskit-cli.md +1 -1
  12. package/guide/agent/generators/advanced-cruds.md +163 -1
  13. package/guide/agent/generators/crud-generators.md +30 -1
  14. package/guide/agent/generators/intro.md +1 -1
  15. package/guide/agent/generators/ui-generators.md +1 -1
  16. package/guide/agent/index.md +1 -1
  17. package/package.json +1 -1
  18. package/reference/autogen/packages/agent-docs.md +18 -0
  19. package/skills/jskit-review/SKILL.md +12 -2
  20. package/templates/APP_BLUEPRINT.md +9 -0
  21. package/templates/WORKBOARD.md +3 -3
  22. package/templates/app/AGENTS.md +15 -3
  23. package/workflow/bootstrap.md +17 -2
  24. package/workflow/feature-delivery.md +19 -3
  25. package/workflow/review.md +9 -3
  26. package/workflow/scoping.md +10 -1
  27. package/workflow/workboard.md +1 -1
  28. package/guide/human/app-extras/assistant.md +0 -693
  29. package/guide/human/app-extras/realtime.md +0 -268
  30. package/guide/human/app-setup/a-more-interesting-shell.md +0 -732
  31. package/guide/human/app-setup/authentication.md +0 -961
  32. package/guide/human/app-setup/console.md +0 -350
  33. package/guide/human/app-setup/database-layer.md +0 -820
  34. package/guide/human/app-setup/initial-scaffolding.md +0 -753
  35. package/guide/human/app-setup/multi-homing.md +0 -793
  36. package/guide/human/app-setup/users.md +0 -402
  37. package/guide/human/app-setup/working-with-the-jskit-cli.md +0 -1047
  38. package/guide/human/generators/advanced-cruds.md +0 -921
  39. package/guide/human/generators/crud-generators.md +0 -554
  40. package/guide/human/generators/intro.md +0 -107
  41. package/guide/human/generators/ui-generators.md +0 -663
  42. package/guide/human/index.md +0 -37
@@ -1,663 +0,0 @@
1
- # UI Generators
2
-
3
- The earlier chapters already used `ui-generator` a little when we added:
4
-
5
- - the `Alerts Widget`
6
- - the `Profile` settings page
7
- - the `Notifications` settings page
8
-
9
- This chapter steps back and treats that tool as a subject in its own right.
10
-
11
- Use `ui-generator` when you want app-owned UI that is **not** a CRUD route tree.
12
-
13
- That usually means one of four jobs:
14
-
15
- - create a route page
16
- - create a small placed UI element
17
- - turn an existing page into a host for child routes
18
- - add a generic placement seam to an existing Vue file
19
-
20
- ## Recap from previous chapters
21
-
22
- To get back to the same starting point as the end of the shell chapter, run:
23
-
24
- ```bash
25
- npx @jskit-ai/create-app exampleapp --tenancy-mode none
26
- cd exampleapp
27
- npm install
28
-
29
- npx jskit add package shell-web
30
- npm install
31
- ```
32
-
33
- If you are already continuing from the earlier guide chapters, you are already in the right place and can skip that setup.
34
-
35
- One important detail before we start: `ui-generator` is a CLI tool, not a runtime package you add to the app. The runtime package that makes these examples meaningful is `shell-web`, because that is what gives the app real surfaces, placements, and nested shell structure.
36
-
37
- ## `ui-generator` `@jskit-ai/ui-generator` `(0.1.22)`
38
-
39
- `ui-generator` has four subcommands:
40
-
41
- - `page`
42
- - `placed-element`
43
- - `add-subpages`
44
- - `outlet`
45
-
46
- They are all about app-owned UI, but they solve different problems.
47
-
48
- The easiest way to understand them is:
49
-
50
- - `page` creates a route and the link that reaches it
51
- - `placed-element` creates a reusable component and places it somewhere
52
- - `add-subpages` upgrades a page into a routed child-page host
53
- - `outlet` adds only a placement seam, without routed child-page behavior
54
-
55
- ## The simplest case: `page`
56
-
57
- Start with the most common command:
58
-
59
- ```bash
60
- npx jskit generate ui-generator page \
61
- home/reports/index.vue \
62
- --name "Reports"
63
- ```
64
-
65
- This command creates a page at:
66
-
67
- ```text
68
- src/pages/home/reports/index.vue
69
- ```
70
-
71
- and it also appends a matching link placement into:
72
-
73
- ```text
74
- src/placement.js
75
- ```
76
-
77
- That second part is important. `page` is not just a file generator. It also makes the new page reachable inside the shell.
78
-
79
- In a fresh `home` surface app, the generated placement looks like a normal shell menu link. In the throwaway app used to verify this chapter, the command reported:
80
-
81
- ```text
82
- Generated UI page "/reports" at src/pages/home/reports/index.vue.
83
- Touched files (2):
84
- - src/pages/home/reports/index.vue
85
- - src/placement.js
86
- ```
87
-
88
- That is the baseline behavior of `page`:
89
-
90
- - one app-owned page file
91
- - one app-owned placement entry
92
-
93
- The important default is this:
94
-
95
- - if JSKIT sees no nearer routed host, the new page gets a normal shell/menu placement
96
- - if JSKIT does see a nearer routed host, the new page gets linked into that host instead
97
-
98
- Open the app and you now have a real `/reports` page plus a real shell link for it.
99
-
100
- ### Customizing the generated menu link
101
-
102
- The generated page command does not ask for an icon up front. That is deliberate. The command's job is to create the route and the matching placement entry, not to force every menu detail during generation.
103
-
104
- If you want to customize the link afterwards, edit the placement entry that `page` wrote into `src/placement.js`.
105
-
106
- That is where things such as:
107
-
108
- - `label`
109
- - `order`
110
- - `icon`
111
- - a custom `componentToken`
112
-
113
- normally get adjusted.
114
-
115
- The important icon rule is this:
116
-
117
- - inside `src/placement.js` menu metadata, raw `mdi-*` strings are fine
118
- - inside normal Vue component props, they are not
119
-
120
- So this is a valid menu-placement customization:
121
-
122
- ```js
123
- props: {
124
- label: "Reports",
125
- to: "/reports",
126
- icon: "mdi-chart-box-outline"
127
- }
128
- ```
129
-
130
- But if you later open the generated page file itself and add a Vuetify icon to the template, switch back to `@mdi/js`:
131
-
132
- ```vue
133
- <script setup>
134
- import { mdiChartBoxOutline } from "@mdi/js";
135
- </script>
136
-
137
- <v-icon :icon="mdiChartBoxOutline" />
138
- ```
139
-
140
- This split matters because JSKIT's shell menu components normalize menu metadata icons for you, while direct Vue icon props go straight to Vuetify.
141
-
142
- ## What `page` is really good at
143
-
144
- The reason `page` is the primary subcommand is that it understands more than just "create this file".
145
-
146
- It also understands shell topology.
147
-
148
- If you create a page that lives under a parent page which has already been upgraded into a child-page host, `page` does **not** keep treating it as a top-level shell entry. It changes behavior and links the new page into the nearest host instead.
149
-
150
- That is what makes it fit naturally with the rest of JSKIT.
151
-
152
- ### The important `page` overrides
153
-
154
- The happy path is intentionally simple, but `page` also has a small set of override options that matter as soon as you stop accepting the defaults.
155
-
156
- #### `--link-placement`
157
-
158
- Use this when the generated page link should go somewhere other than the generator's inferred default.
159
-
160
- Typical reasons:
161
-
162
- - you want the page in a different shell menu
163
- - you want the page link inside a specific existing outlet
164
- - you do not want the link to land in the normal top-level menu
165
-
166
- For example, if a page should appear in a settings menu rather than the shell drawer, `--link-placement` is the override that says so.
167
-
168
- #### `--link-component-token`
169
-
170
- Use this when the page link should render with a different link component than the default inferred one.
171
-
172
- In practice, this often means:
173
-
174
- - using a tab-style link instead of a normal menu link
175
- - using a local custom link token for a special shell section
176
-
177
- This matters most once you start targeting non-default outlets. A settings or tab host may want a different link renderer than the main shell drawer.
178
-
179
- #### `--link-to`
180
-
181
- Use this when you want to override the generated `props.to` value.
182
-
183
- This is especially useful for nested pages, because when JSKIT detects a parent subpages host it normally infers a relative link like:
184
-
185
- ```js
186
- to: "./exports"
187
- ```
188
-
189
- That default is usually correct. But if the host needs a different local target shape, or you are wiring a link into a custom outlet with different expectations, `--link-to` is the escape hatch.
190
-
191
- So the rough rule is:
192
-
193
- - if the link destination is obvious from the route tree, let JSKIT infer it
194
- - if you need a very specific link destination, use `--link-to`
195
-
196
- #### `--force`
197
-
198
- Use this only when the target page file already exists and you intentionally want to overwrite it.
199
-
200
- That is most common when:
201
-
202
- - you are regenerating an experimental page
203
- - you want to throw away the current file and replace it with fresh scaffold
204
-
205
- It is not a routing option. It is simply an overwrite guard.
206
-
207
- ## Turning a page into a child-page host: `add-subpages`
208
-
209
- Suppose `Reports` should stop being a single screen and start becoming a section with child routes under it.
210
-
211
- Run:
212
-
213
- ```bash
214
- npx jskit generate ui-generator add-subpages \
215
- home/reports/index.vue \
216
- --title "Reports" \
217
- --subtitle "View and manage reporting modules."
218
- ```
219
-
220
- This upgrades `src/pages/home/reports/index.vue` into a routed host page.
221
-
222
- On the first use in a fresh app, it also installs the support shell component:
223
-
224
- ```text
225
- src/components/SectionContainerShell.vue
226
- ```
227
-
228
- In the verified throwaway app, the command reported:
229
-
230
- ```text
231
- Enabled subpages in src/pages/home/reports/index.vue for "/reports" using outlet target "reports:sub-pages".
232
- Touched files (2):
233
- - src/components/SectionContainerShell.vue
234
- - src/pages/home/reports/index.vue
235
- ```
236
-
237
- After the command, the page gains three important pieces:
238
-
239
- - `SectionContainerShell`
240
- - a `ShellOutlet` for the child-page tabs
241
- - `RouterView`
242
-
243
- That means the page can now keep rendering shared content while child routes render underneath it.
244
-
245
- This is the first big distinction in this chapter:
246
-
247
- - a plain page is just a page
248
- - a subpages host is a page plus routed child-page structure
249
-
250
- If what you need is routed children, `add-subpages` is the right tool.
251
-
252
- ### When `page` becomes a tab-like child instead of a top-level menu entry
253
-
254
- This is the key transition to understand.
255
-
256
- Before `add-subpages`, `page` usually creates:
257
-
258
- - a page file
259
- - a top-level shell link
260
-
261
- After `add-subpages`, that same `page` command may create:
262
-
263
- - a page file
264
- - a child link inside the nearest parent host outlet
265
-
266
- That is why nested pages often feel "tab-like" even though the generator command is still just `page`.
267
-
268
- The route page is still a normal page file. What changes is the inferred placement target:
269
-
270
- - no parent host found -> shell/menu entry
271
- - nearest parent host found -> child link inside that host
272
-
273
- So JSKIT is not switching to a different generator. It is switching the inferred placement behavior because the route tree now has a routed host above the new page.
274
-
275
- ## Nested pages under an `index.vue` host
276
-
277
- Once `Reports` is a host, create a child page under it:
278
-
279
- ```bash
280
- npx jskit generate ui-generator page \
281
- home/reports/index/exports/index.vue \
282
- --name "Exports"
283
- ```
284
-
285
- This path shape matters.
286
-
287
- Because the parent host is:
288
-
289
- ```text
290
- src/pages/home/reports/index.vue
291
- ```
292
-
293
- the child belongs under:
294
-
295
- ```text
296
- src/pages/home/reports/index/exports/index.vue
297
- ```
298
-
299
- That `index/...` folder segment is not an odd JSKIT convention. It is the real nesting rule for children of an `index.vue` route host.
300
-
301
- And this is where `page` becomes interesting again.
302
-
303
- In the throwaway app, the command reported:
304
-
305
- ```text
306
- Generated UI page "/reports/exports" at src/pages/home/reports/index/exports/index.vue.
307
- Touched files (2):
308
- - src/pages/home/reports/index/exports/index.vue
309
- - src/placement.js
310
- ```
311
-
312
- But the placement it wrote was **not** another top-level shell link.
313
-
314
- Instead, it targeted the host outlet:
315
-
316
- ```text
317
- reports:sub-pages
318
- ```
319
-
320
- and used the tab-link renderer with:
321
-
322
- ```js
323
- to: "./exports"
324
- ```
325
-
326
- That is exactly the behavior you want:
327
-
328
- - `Reports` stays the host page
329
- - `Exports` becomes a child tab under it
330
- - the child route renders under the parent instead of becoming another top-level menu entry
331
-
332
- This is also why `--link-placement`, `--link-component-token`, and `--link-to` are often unnecessary in the default nested case. Once the host exists, JSKIT already knows the likely child placement target, link renderer, and relative `to` value.
333
-
334
- ## Nested pages under a file-route host
335
-
336
- There is a second nesting shape that matters just as much.
337
-
338
- Create a dynamic file-route page:
339
-
340
- ```bash
341
- npx jskit generate ui-generator page \
342
- home/contacts/[contactId].vue \
343
- --name "Contact"
344
- ```
345
-
346
- Then upgrade that page into a host:
347
-
348
- ```bash
349
- npx jskit generate ui-generator add-subpages \
350
- home/contacts/[contactId].vue \
351
- --title "Contact" \
352
- --subtitle "View and manage this contact."
353
- ```
354
-
355
- This time the parent is a file route, not an `index.vue` route.
356
-
357
- So the child-page path is different:
358
-
359
- ```bash
360
- npx jskit generate ui-generator page \
361
- home/contacts/[contactId]/notes/index.vue \
362
- --name "Notes"
363
- ```
364
-
365
- That is the other important nesting rule:
366
-
367
- - if the host is an `index.vue` page, children go under `index/...`
368
- - if the host is a file-route page, children go under that page's directory
369
-
370
- In the verified throwaway app, this command created:
371
-
372
- ```text
373
- src/pages/home/contacts/[contactId]/notes/index.vue
374
- ```
375
-
376
- and its link placement targeted:
377
-
378
- ```text
379
- contacts-contact-id:sub-pages
380
- ```
381
-
382
- So the exact host token changes, but the principle stays the same:
383
-
384
- - a nearer routed host changes where `page` places the new link
385
- - the child page becomes a tab or child link inside that host
386
-
387
- This is one of the most important things to understand about `ui-generator`: nested pages are not a separate feature bolted on afterwards. The generator already knows how to attach them to the right place.
388
-
389
- ### A practical rule for child-page paths
390
-
391
- Use these two rules when deciding where the child page file should go:
392
-
393
- - host is `.../index.vue` -> child pages go under `.../index/...`
394
- - host is `...[param].vue` or another file route -> child pages go under `.../[param]/...`
395
-
396
- That is not only a file-layout preference. It is how the router keeps the parent host visible while the child page renders beneath it.
397
-
398
- ## Adding small placed UI: `placed-element`
399
-
400
- Not everything should be a route.
401
-
402
- If what you need is a small block of UI rendered into an existing placement target, use `placed-element` instead:
403
-
404
- ```bash
405
- npx jskit generate ui-generator placed-element \
406
- --name "Alerts Widget"
407
- ```
408
-
409
- In the verified throwaway app, that command touched:
410
-
411
- ```text
412
- - packages/main/src/client/providers/MainClientProvider.js
413
- - src/components/AlertsWidgetElement.vue
414
- - src/placement.js
415
- ```
416
-
417
- Those three edits explain the feature:
418
-
419
- - the component file is created in `src/components/`
420
- - the app's local client provider registers a new local token for it
421
- - `src/placement.js` adds a placement entry that renders that token
422
-
423
- This is different from `page` in a very important way:
424
-
425
- - `page` gives you a URL and a link
426
- - `placed-element` gives you a component token and a placement entry
427
-
428
- So if the thing you are adding should live *inside* an existing shell region, not at its own route, `placed-element` is the right command.
429
-
430
- By default, the element goes into:
431
-
432
- ```text
433
- shell-layout:top-right
434
- ```
435
-
436
- That is why this is such a good command for widgets, status panels, and compact shell extensions.
437
-
438
- ### When `--surface` matters
439
-
440
- `placed-element` only needs `--surface` when JSKIT cannot infer the target surface cleanly.
441
-
442
- The easiest cases are:
443
-
444
- - the app has only one enabled surface
445
- - the chosen placement target clearly belongs to a page-owned outlet on one surface
446
-
447
- In those cases, surface inference is straightforward.
448
-
449
- The ambiguous cases are the ones to watch for:
450
-
451
- - the app has several enabled surfaces
452
- - the target placement is shared shell infrastructure rather than a page-owned outlet
453
- - the placement itself does not tell JSKIT which surface you meant
454
-
455
- That is exactly when `--surface` becomes important.
456
-
457
- A practical example is:
458
-
459
- ```bash
460
- npx jskit generate ui-generator placed-element \
461
- --name "Ops Panel" \
462
- --surface admin \
463
- --placement shell-layout:top-right
464
- ```
465
-
466
- `shell-layout:top-right` can exist across several surfaces. If your app has several enabled surfaces, `--surface admin` tells JSKIT which one this element is actually meant for.
467
-
468
- So the rule of thumb is:
469
-
470
- - page-owned outlet target -> surface is often inferable
471
- - shared shell target in a multi-surface app -> pass `--surface`
472
-
473
- ### `--placement`
474
-
475
- Use `--placement` when the default target `shell-layout:top-right` is not what you want.
476
-
477
- This is the option that answers:
478
-
479
- - *where should this element render?*
480
-
481
- In practice, it is the first override you will use for `placed-element`.
482
-
483
- ### `--path`
484
-
485
- Use `--path` when the component file should live somewhere other than `src/components`.
486
-
487
- This is not about placement in the UI. It is about placement in the source tree.
488
-
489
- Typical reasons:
490
-
491
- - you want widgets under `src/widgets`
492
- - you want admin-specific pieces under a more specific component directory
493
- - you want support scaffold grouped near a feature area instead of dumped into the default component folder
494
-
495
- So `--path` changes where the new Vue file is written, not where it renders.
496
-
497
- ### `--force`
498
-
499
- Use `--force` when the target component file already exists and you want to replace it with fresh generated scaffold.
500
-
501
- That is most useful when:
502
-
503
- - you are regenerating a throwaway prototype
504
- - you intentionally want to reset the file to generator output
505
-
506
- As with `page`, this is an overwrite guard, not a placement rule.
507
-
508
- ## Adding a plain placement seam: `outlet`
509
-
510
- Now suppose you already have a component and you do **not** need routed child pages. You only need a named place where later UI can render.
511
-
512
- That is what `outlet` is for.
513
-
514
- In the verified throwaway app, after generating `Alerts Widget`, I ran:
515
-
516
- ```bash
517
- npx jskit generate ui-generator outlet \
518
- src/components/AlertsWidgetElement.vue \
519
- --target alerts-widget:actions
520
- ```
521
-
522
- That command touched only one file:
523
-
524
- ```text
525
- src/components/AlertsWidgetElement.vue
526
- ```
527
-
528
- and injected:
529
-
530
- ```vue
531
- <ShellOutlet target="alerts-widget:actions" />
532
- ```
533
-
534
- It did **not** add:
535
-
536
- - `RouterView`
537
- - `SectionContainerShell`
538
- - child-page tab structure
539
-
540
- That is the clean boundary between `outlet` and `add-subpages`.
541
-
542
- Use `outlet` when you want:
543
-
544
- - a placement seam inside an existing page or component
545
- - later content to be targetable there
546
- - no routed child-page behavior
547
-
548
- After adding the outlet, `npx jskit list-placements` showed the new target immediately:
549
-
550
- ```text
551
- - alerts-widget:actions [src/components/AlertsWidgetElement.vue]
552
- ```
553
-
554
- So `outlet` is the smallest possible way to make a Vue file part of the placement topology.
555
-
556
- ### When `outlet` is the smaller correct tool
557
-
558
- This is the right command when you want to say:
559
-
560
- - "other things should be able to render here later"
561
-
562
- without also saying:
563
-
564
- - "this file should become a routed host page"
565
-
566
- That is why `outlet` is often the better choice for:
567
-
568
- - summary cards
569
- - header/action regions
570
- - detail panes
571
- - reusable components that need extension points
572
-
573
- If you do **not** need `RouterView` and you do **not** need child routes, `outlet` is usually the cleaner tool.
574
-
575
- ### Choosing a good custom `--target`
576
-
577
- `--target` should be meaningful to humans, not just syntactically valid.
578
-
579
- A target like:
580
-
581
- ```text
582
- customer-view:summary-actions
583
- ```
584
-
585
- is good because it tells you:
586
-
587
- - the host area: `customer-view`
588
- - the position or outlet purpose: `summary-actions`
589
-
590
- That is much better than something vague like:
591
-
592
- ```text
593
- custom-area:slot1
594
- ```
595
-
596
- because the meaningful target name will later show up in:
597
-
598
- - `jskit list-placements`
599
- - placement entries
600
- - future generator commands
601
-
602
- So the target should describe the UI seam you are creating, not just satisfy the `host:position` format.
603
-
604
- ## `add-subpages` versus `outlet`
605
-
606
- This is the distinction that most often causes hesitation.
607
-
608
- Use `add-subpages` when:
609
-
610
- - the page should stay visible while child routes render underneath it
611
- - you need a routed host page
612
- - you want later generated child pages to attach there automatically
613
-
614
- Use `outlet` when:
615
-
616
- - you only want a placement seam
617
- - the file already exists
618
- - you do not want routed children
619
-
620
- So:
621
-
622
- - `add-subpages` changes the routing shape of the page
623
- - `outlet` changes only the placement shape of the file
624
-
625
- `add-subpages` also tends to be the right tool when the parent page is meant to stay visible while a series of related child pages render under it. `outlet` is the right tool when the file just needs extension points.
626
-
627
- ## Picking the right command
628
-
629
- The short rule is:
630
-
631
- - use `page` for new route pages
632
- - use `placed-element` for reusable placed UI
633
- - use `add-subpages` when the page should become a routed host
634
- - use `outlet` when you only need a placement target inside an existing file
635
-
636
- And the slightly longer rule is:
637
-
638
- - if it needs a URL, start from `page`
639
- - if it needs child routes, add `add-subpages`
640
- - if it does not need a URL but should render somewhere, use `placed-element`
641
- - if the file already exists and only needs a target for later UI, use `outlet`
642
-
643
- ## Summary
644
-
645
- `ui-generator` is the non-CRUD side of JSKIT scaffolding.
646
-
647
- It writes app-owned UI structure in four different shapes:
648
-
649
- - route pages
650
- - placed components
651
- - routed host pages
652
- - plain placement seams
653
-
654
- The most important thing to remember is that nested pages are not a special afterthought. Once a page has been upgraded with `add-subpages`, later `page` generation automatically treats that host as the real placement target.
655
-
656
- That is why the commands fit together cleanly:
657
-
658
- - `page` creates routes
659
- - `add-subpages` turns routes into hosts
660
- - `page` can then create nested child routes under those hosts
661
- - `placed-element` and `outlet` handle the non-routed side of the same UI system
662
-
663
- Once the UI you want is no longer just page structure and starts needing real database-backed list/view/new/edit behavior, move to the CRUD generators chapter.
@@ -1,37 +0,0 @@
1
- # Guide
2
-
3
- This guide is the main hands-on path through JSKIT.
4
-
5
- It starts with the smallest scaffold, then explains how to work with the JSKIT CLI itself before adding the shell and authentication. After that, it introduces the database-backed users layer, expands into console and workspace-aware app structure, and adds a small `App extras` section for optional runtime packages such as realtime and assistant. Finally, the guide breaks out generator-specific workflows into their own section.
6
-
7
- ## Table of Contents
8
-
9
- ### App Setup
10
-
11
- - [Initial Scaffolding](/guide/app-setup/initial-scaffolding)
12
- - [Working With The JSKIT CLI](/guide/app-setup/working-with-the-jskit-cli)
13
- - [A More Interesting Shell](/guide/app-setup/a-more-interesting-shell)
14
- - [Authentication](/guide/app-setup/authentication)
15
- - [Database Layer](/guide/app-setup/database-layer)
16
- - [Users](/guide/app-setup/users)
17
- - [Console](/guide/app-setup/console)
18
- - [Multi-homing](/guide/app-setup/multi-homing)
19
-
20
- ### App Extras
21
-
22
- - [Realtime](/guide/app-extras/realtime)
23
- - [Assistant](/guide/app-extras/assistant)
24
-
25
- ### Generators
26
-
27
- - [Intro](/guide/generators/intro)
28
- - [UI Generators](/guide/generators/ui-generators)
29
- - [CRUD Generators](/guide/generators/crud-generators)
30
- - [Advanced CRUDs](/guide/generators/advanced-cruds)
31
-
32
- ## How to use this guide
33
-
34
- - Start with `App Setup` if you are building up a JSKIT app from scratch.
35
- - Use `App Extras` once the base app structure is in place and you want optional runtime packages.
36
- - Jump into `Generators` if you already understand the runtime packages and want app-owned scaffolding workflows.
37
- - Inside `Generators`, read `CRUD Generators` before `Advanced CRUDs`: the first chapter teaches the workflow, and the second explains the generated anatomy and customization points.