@jskit-ai/agent-docs 0.1.85 → 0.1.87

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.
@@ -162,7 +162,6 @@ The most important parts look like this:
162
162
  "server": "node ./bin/server.js",
163
163
  "server:all": "node ./bin/server.js",
164
164
  "server:home": "SERVER_SURFACE=home node ./bin/server.js",
165
- "devlinks": "jskit app link-local-packages",
166
165
  "dev": "vite",
167
166
  "dev:all": "vite",
168
167
  "dev:home": "VITE_SURFACE=home vite",
@@ -206,9 +205,9 @@ The most important parts look like this:
206
205
 
207
206
  Published JSKIT libraries and tooling support Node.js 22 from 22.12.0 onward, Node.js 24, and Node.js 26. Newly generated applications deliberately require Node 26: their app-level `engines` contract, `.nvmrc`, and JSKIT-managed verification workflow all name that runtime. The app-level contract is the runtime boundary for the app and its installed JSKIT runtime packages, while independently consumed JSKIT CLI and tooling packages retain the wider supported range. The dependency on `@local/main` points at `file:packages/main`, which means your app already contains its own local JSKIT package. The maintenance scripts are also useful to notice early, because they show an important ownership boundary in JSKIT.
208
207
 
209
- `verify`, `jskit:update`, `devlinks`, and `release` are intentionally thin wrappers. They stay in `package.json` because they are convenient app-local shortcuts, but the real implementation lives in `jskit app ...`, not in copied scaffold scripts.
208
+ `verify`, `jskit:update`, and `release` are intentionally thin wrappers. They stay in `package.json` because they are convenient app-local shortcuts, but the real implementation lives in `jskit app ...`, not in copied scaffold scripts.
210
209
 
211
- That matters because JSKIT maintenance policy changes over time. If the scaffold copied a large shell script into every app, existing apps would freeze the old behavior forever. By delegating to `jskit app verify`, `jskit app update-packages`, `jskit app link-local-packages`, and `jskit app release`, the app keeps the nice `npm run` shortcuts while the maintained behavior stays in the installed CLI package.
210
+ That matters because JSKIT maintenance policy changes over time. If the scaffold copied a large shell script into every app, existing apps would freeze the old behavior forever. By delegating to `jskit app verify`, `jskit app update-packages`, and `jskit app release`, the app keeps the nice `npm run` shortcuts while the maintained behavior stays in the installed CLI package.
212
211
 
213
212
  The Playwright scaffold follows the same rule. `playwright.config.mjs` delegates to `@jskit-ai/jskit-cli/test/playwright`, and the starter browser specs delegate their shared responsive checks to published JSKIT helpers. The generated files stay small while later JSKIT package updates can change local server startup, managed `PLAYWRIGHT_BASE_URL` handling, and `JSKIT_PLAYWRIGHT_STORAGE_STATE` support without copying that logic into each new app.
214
213
 
@@ -819,7 +818,7 @@ That is why you saw `@jskit-ai/kernel` and `@jskit-ai/http-runtime` earlier in `
819
818
 
820
819
  ### Other files and options
821
820
 
822
- The remaining files are easier to understand once you know the core pieces above. `vite.config.mjs` configures the frontend build and the `/api` proxy used during development. `index.html` is the HTML shell Vite uses to mount Vue. `tests/` contains basic smoke tests so the app has a verification path from day one. The `scripts/` directory is intentionally small because JSKIT maintenance helpers such as `verify`, `jskit:update`, `devlinks`, and `release` are package-owned CLI commands rather than copied app scripts.
821
+ The remaining files are easier to understand once you know the core pieces above. `vite.config.mjs` configures the frontend build and the `/api` proxy used during development. `index.html` is the HTML shell Vite uses to mount Vue. `tests/` contains basic smoke tests so the app has a verification path from day one. The `scripts/` directory is intentionally small because JSKIT maintenance helpers such as `verify`, `jskit:update`, and `release` are package-owned CLI commands rather than copied app scripts.
823
822
 
824
823
  The `create-app` command also accepts a few other flags that are useful without changing the basic meaning of this chapter's setup. `--title <text>` lets you replace the browser title and other template text with a friendlier app name. `--target <path>` lets you choose a different output directory instead of the default `./exampleapp`. `--tenancy-mode <mode>` can seed `none`, `personal`, or `workspaces`; for this chapter we intentionally use `none` so the first scaffold stays small and non-workspace. `--minimal` selects the bare `minimal-shell` template instead of the default shell-web app template. `--force` allows writing into a non-empty target directory when you know that is what you want. `--dry-run` prints the planned file writes without touching the filesystem, which is useful when you want to inspect what the generator would do. `-h` or `--help` prints the command help.
825
824
 
@@ -53,7 +53,6 @@ The important examples are:
53
53
 
54
54
  - `npm run verify`
55
55
  - `npm run jskit:update`
56
- - `npm run devlinks`
57
56
  - `npm run release`
58
57
 
59
58
  In the current scaffold, those scripts are intentionally thin:
@@ -63,7 +62,6 @@ In the current scaffold, those scripts are intentionally thin:
63
62
  "scripts": {
64
63
  "verify": "jskit app verify && npm run --if-present verify:app",
65
64
  "jskit:update": "jskit app update-packages",
66
- "devlinks": "jskit app link-local-packages",
67
65
  "release": "jskit app release"
68
66
  }
69
67
  }
@@ -71,12 +69,11 @@ In the current scaffold, those scripts are intentionally thin:
71
69
 
72
70
  That is a deliberate design choice.
73
71
 
74
- The app keeps the handy `npm run` names, but the real maintenance policy lives in the installed CLI package instead of copied shell scripts inside the app. That means if JSKIT later changes how package updates, local linking, or baseline verification should work, apps can pick up the new behavior by updating `@jskit-ai/jskit-cli` instead of hand-editing frozen scaffold files.
72
+ The app keeps the handy `npm run` names, but the real maintenance policy lives in the installed CLI package instead of copied shell scripts inside the app. That means if JSKIT later changes how package updates or baseline verification should work, apps can pick up the new behavior by updating `@jskit-ai/jskit-cli` instead of hand-editing frozen scaffold files.
75
73
 
76
74
  This gives you a clean ownership split:
77
75
 
78
76
  - app-owned scripts still describe how *this app* runs, builds, and tests
79
- - `npm run devlinks` re-applies local checkout links after `npm install` when you are testing an app against this monorepo
80
77
  - JSKIT-owned wrapper scripts delegate framework maintenance to `jskit app ...`
81
78
 
82
79
  That split is worth keeping in mind through the rest of the guide. When you see `npm run verify`, read it as "run the app's JSKIT baseline verification policy, then any app-specific extra verification hook".
@@ -116,14 +113,9 @@ npm run jskit:update
116
113
 
117
114
  After it succeeds, npm dependencies and descriptor-managed app state are current together. If a managed app-owned file is missing, a required saved option can no longer be resolved, or another package update cannot be applied safely, the app-wide update fails instead of leaving that package silently stale. `--dry-run` reports which installed packages would be reapplied without invoking their update lifecycle.
118
115
 
119
- There is one unavoidable bootstrap detail for apps whose installed CLI predates managed package reapplication: a CLI process that is already running cannot adopt code npm installs underneath it. Upgrade the CLI once, then run the app-wide update with the new process:
116
+ At the start of a real update, JSKIT resolves and installs the latest `@jskit-ai/jskit-cli`, then hands the rest of the operation to that app-local CLI process. This keeps the one-command contract even when the updater itself has changed: the current code, not the already-running older process, owns package reapplication, migrations, workspace refreshes, and CI synchronization.
120
117
 
121
- ```bash
122
- npm install --save-dev --save-exact @jskit-ai/jskit-cli@latest
123
- npm run jskit:update
124
- ```
125
-
126
- After that bootstrap, normal future upgrades use only `npm run jskit:update`. Do not work around the first upgrade by editing `.jskit/lock.json`; the new updater must reapply the descriptor contract and write managed state itself.
118
+ Do not pre-install the CLI separately and do not edit `.jskit/lock.json`. Run `npm run jskit:update`; the updater owns its bootstrap and writes managed state through the normal package lifecycle.
127
119
 
128
120
  The update reports elapsed progress for registry and install work. It also refreshes JSKIT-managed migrations and CI after root package changes. Preview the complete operation without changing manifests, descriptors, the lockfile, migrations, or CI with:
129
121
 
@@ -571,12 +563,6 @@ npm install
571
563
 
572
564
  `jskit add` changes the app. `npm install` downloads the dependencies that the changed app requires.
573
565
 
574
- If the app is being tested against a local JSKIT checkout with linked packages, run the local-link wrapper again after every `npm install`:
575
-
576
- ```bash
577
- npm run devlinks
578
- ```
579
-
580
566
  ### `add bundle`
581
567
 
582
568
  Bundles are a convenience layer for catalog shortcuts. Prefer package commands in setup docs and normal app work, especially for auth, because provider ownership is clearer when the selected provider package is installed explicitly.
@@ -314,12 +314,6 @@ So before you build or run the app again, install that new local package:
314
314
  npm install
315
315
  ```
316
316
 
317
- If you are verifying the guide against a local JSKIT checkout and have already been using local package links, rerun:
318
-
319
- ```bash
320
- npm run devlinks
321
- ```
322
-
323
317
  The same rule applies after later server scaffolds such as `addresses` and `comments`. The UI generator can still read the generated resource file directly, but the app runtime needs the local package install boundary to be completed before the CRUD can boot normally.
324
318
 
325
319
  For standard CRUDs, that file is intentionally compact. It uses `defineCrudResource(...)` from `@jskit-ai/resource-crud-core`, authors the canonical `schema` / `searchSchema` / `defaultSort` / `autofilter` shape once, and lets JSKIT derive the standard CRUD operation contracts from it.
@@ -435,12 +429,6 @@ Then install the generated local package:
435
429
  npm install
436
430
  ```
437
431
 
438
- If you are developing against a local JSKIT checkout, relink your app to the local packages before you run the UI:
439
-
440
- ```bash
441
- npm run devlinks
442
- ```
443
-
444
432
  ### Step 3: refine the generated lookup metadata by hand
445
433
 
446
434
  Open `packages/addresses/src/shared/addressResource.js` and add `labelKey: "fullName"` to the generated `contactId` relation:
@@ -617,12 +605,6 @@ Then install the generated local package:
617
605
  npm install
618
606
  ```
619
607
 
620
- If you are developing against a local JSKIT checkout, relink the app before you run the UI:
621
-
622
- ```bash
623
- npm run devlinks
624
- ```
625
-
626
608
  ### Step 3: refine the generated lookup metadata by hand
627
609
 
628
610
  Open `packages/comments/src/shared/commentResource.js` and add `labelKey: "fullName"` to the generated `contactId` relation:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/agent-docs",
3
- "version": "0.1.85",
3
+ "version": "0.1.87",
4
4
  "description": "Distributed JSKIT agent references, prompts, guides, and generated reference maps.",
5
5
  "type": "module",
6
6
  "files": [
@@ -512,15 +512,6 @@ Exports
512
512
  Local functions
513
513
  - `shouldRewriteScript(currentValue = "", scriptName = "", force = false)`
514
514
 
515
- ### `src/server/commandHandlers/appCommands/linkLocalPackages.js`
516
- Exports
517
- - `runAppLinkLocalPackagesCommand(ctx = {}, { appRoot = "", options = {}, stdout })`
518
- Local functions
519
- - `collectDeclaredPackageNames(packageJson = {})`
520
- - `verifySymlinkTarget(targetPath = "", sourceDir = "", { packageName = "" } = {})`
521
- - `replaceWithSymlink(targetPath = "", sourceDir = "", { packageName = "" } = {})`
522
- - `maybeLinkCompanionPackages({ appRoot = "", repoRoot = "", stdout, createCliError })`
523
-
524
515
  ### `src/server/commandHandlers/appCommands/migrateSourceMutations.js`
525
516
  Exports
526
517
  - `buildCrudFormFieldPushMigration(sourceText = "")`
@@ -558,11 +549,7 @@ Exports
558
549
  - `formatUtcReleaseTimestamp(date = new Date())`
559
550
  - `resolveLocalJskitBin(appRoot = "")`
560
551
  - `runLocalJskit(appRoot, args = [], { stdout, stderr, createCliError, quiet = false } = {})`
561
- - `runLocalJskitAsync(appRoot, args = [], { stdout, stderr, createCliError, quiet = false } = {})`
562
- - `resolveLocalRepoRoot({ appRoot = "", explicitRepoRoot = "" } = {})`
563
- - `discoverLocalPackageMap(repoRoot = "")`
564
- - `linkPackageBinEntries({ appRoot, packageDirName, sourceDir, stdout } = {})`
565
- - `resolveSymlinkType()`
552
+ - `runLocalJskitAsync(appRoot, args = [], { env = {}, stdout, stderr, createCliError, quiet = false } = {})`
566
553
  Local functions
567
554
  - `ensureCommandSucceeded(result, label, { createCliError, cwd = "", stdout, stderr, quiet = false } = {})`
568
555
 
@@ -752,11 +739,11 @@ Local functions
752
739
  - `collectPlacementComponentTokensFromManagedRecords(installedPackageRecords = [])`
753
740
  - `renderWrappedShellCommand(binaryName, args = [], { maxWidth = 100, continuationIndent = " " } = {})`
754
741
  - `runLocalProjectBinary(binaryName, args = [], { appRoot, io, pathModule = path, createCliError, explanation = "", dryRun = false } = {})`
755
- - `installAppDependenciesForHook({ appRoot, appPackageJson, io, pathModule = path, createCliError, dryRun = false, runDevlinks = false } = {})`
742
+ - `installAppDependenciesForHook({ appRoot, io, pathModule = path, createCliError, dryRun = false } = {})`
756
743
  - `resolvePackageOptionInputForInstall({ packageEntry, existingInstall, packageInlineOptions, appRoot, readFileBufferIfExists })`
757
744
  - `validateHookResult(result = {}, { packageId = "", hookLabel = "" } = {})`
758
745
  - `loadInstallHook({ packageEntry, appRoot, hookSpec, hookLabel = "" } = {})`
759
- - `createInstallHookHelpers({ ctx, appRoot, io, appPackageJson, commandOptions = {} } = {})`
746
+ - `createInstallHookHelpers({ ctx, appRoot, io, appPackageJson } = {})`
760
747
  - `invokeInstallHook({ packageEntry, appRoot, hookSpec, hookLabel, hookContext, createCliError } = {})`
761
748
 
762
749
  ### `src/server/commandHandlers/packageCommands/create.js`