@warlock.js/core 5.34.1 → 5.34.3

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 (38) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/esm/e2e/browser.d.mts.map +1 -1
  3. package/esm/e2e/browser.mjs +3 -1
  4. package/esm/e2e/browser.mjs.map +1 -1
  5. package/esm/e2e/types.d.mts +6 -0
  6. package/esm/e2e/types.d.mts.map +1 -1
  7. package/esm/e2e/types.mjs.map +1 -1
  8. package/esm/http/error-response.d.mts +12 -0
  9. package/esm/http/error-response.d.mts.map +1 -0
  10. package/esm/http/error-response.mjs +41 -0
  11. package/esm/http/error-response.mjs.map +1 -0
  12. package/esm/http/index.d.mts +3 -2
  13. package/esm/http/response.d.mts +2 -0
  14. package/esm/http/response.d.mts.map +1 -1
  15. package/esm/http/response.mjs +2 -0
  16. package/esm/http/response.mjs.map +1 -1
  17. package/esm/http/server.d.mts.map +1 -1
  18. package/esm/http/server.mjs +2 -0
  19. package/esm/http/server.mjs.map +1 -1
  20. package/esm/http/types.d.mts +7 -0
  21. package/esm/http/types.d.mts.map +1 -1
  22. package/esm/index.d.mts +3 -2
  23. package/esm/upgrade/codemods/toolchain-templates.mjs +3 -1
  24. package/esm/upgrade/codemods/toolchain-templates.mjs.map +1 -1
  25. package/llms-full.txt +323 -60
  26. package/llms.txt +56 -54
  27. package/package.json +13 -13
  28. package/skills/configure-app/SKILL.md +27 -0
  29. package/skills/generate-openapi/SKILL.md +1 -1
  30. package/skills/index.md +4 -4
  31. package/skills/{report-framework-issue.md → report-framework-issue/SKILL.md} +5 -0
  32. package/skills/send-response/SKILL.md +27 -0
  33. package/skills/test-browser/SKILL.md +1 -0
  34. package/skills/upgrade-from-5-29/SKILL.md +4 -0
  35. package/skills/warlock-check/SKILL.md +1 -1
  36. package/skills/warlock-trace/SKILL.md +2 -2
  37. package/skills/write-cli-command/SKILL.md +2 -2
  38. package/skills/README.md +0 -76
package/llms-full.txt CHANGED
@@ -4,7 +4,48 @@
4
4
 
5
5
  > Generated artifact. Concatenates every SKILL.md and reference file under `@warlock.js/core/skills/`. Re-run `node scripts/generate-llms.mjs` after any change.
6
6
 
7
- ## add-connector `@warlock.js/core/add-connector/SKILL.md`
7
+ ## Package orientation
8
+
9
+ ---
10
+ description: 'Warlock application runtime: `router`, `Request`, `Response`, `config`, `env`, `sendMail` and `defineConfig`. Use for "add an API route", controllers, middleware, CLI commands, config, uploads, mail, sockets, OpenAPI, testing or upgrades. Not this package → @warlock.js/web for React SSR pages; @warlock.js/cascade for database queries; @warlock.js/seal for standalone schemas; @warlock.js/auth for login.'
11
+ ---
12
+
13
+ # @warlock.js/core
14
+
15
+ Core is the application runtime: it boots the app, auto-loads each module's special files, serves HTTP, and provides the helpers every feature layer uses. Features live in `src/app/<module>/` and flow one way: `routes.ts → controllers → services → repositories → models`; resources map output at the edge. Start with `warlock-conventions.md`, which every other topic assumes.
16
+
17
+ ## The 80% path
18
+
19
+ 1. Scaffold a module (`create-module.md`), then declare routes in its `routes.ts` (`register-route.md`, `warlock-routes.md`).
20
+ 2. Write a thin controller (`create-controller.md`); validate input with a schema attached to the handler (`validate-input.md`).
21
+ 3. Put logic in a service or use case (`write-use-case.md`), and data access in a repository (`use-repository.md`).
22
+ 4. Return via `response.*` (`send-response.md`) and shape output with a resource (`define-resource.md`); declare `responseSchema` for typed clients and docs (`create-controller.md`, `generate-openapi.md`).
23
+ 5. Configure and run (`configure-app.md`, `run-app.md`); check setup with `warlock-doctor.md`, read the app with `warlock-inspect.md` (or serve it to an agent with `warlock-mcp.md`), verify a change with `warlock-check.md`, and a request's runtime behaviour with `warlock-trace.md`.
24
+
25
+ When the framework is wrong or missing a capability, follow the `report-framework-issue` topic to prepare a public report and ask the user before filing.
26
+
27
+ ## Topics by area
28
+
29
+ - **Foundations:** warlock-conventions, create-module, make-endpoint, configure-app, use-app-context, resolve-path, build-url, update-packages, lower-stage3-decorators, upgrade-from-5-29
30
+ - **HTTP & routing:** register-route, warlock-routes, create-controller, use-middleware, write-middleware, validate-input, use-request-locals, build-restful, wire-socket
31
+ - **Responses & resources:** send-response, define-resource, use-model-transformers, use-localization
32
+ - **Domain layers:** write-use-case, use-repository, write-seeder
33
+ - **CLI & running the app:** run-app, write-cli-command, add-connector, health-checks, warlock-doctor, warlock-inspect, warlock-check, generate-openapi
34
+ - **Agent tooling:** warlock-mcp, warlock-trace, warlock-agents-md, warlock-board
35
+ - **Storage, files & mail:** store-file, upload-file, process-image, send-mail
36
+ - **Security & utilities:** hash-password, encrypt-data, store-secrets, retry-operation, benchmark-code, request-memo, request-tracing
37
+ - **Testing:** test-browser, test-http, test-service, test-fakes, model-factories
38
+
39
+ ## Conventions and pitfalls
40
+
41
+ - Several files are auto-loaded (`routes.ts`, `main.ts`, `events/*`, `utils/locales.ts`, `src/config/*`); never import them by hand.
42
+ - Core does NOT re-export `v`/`Infer` (import from `@warlock.js/seal`), or `Model`/`Migration` (from `@warlock.js/cascade`).
43
+ - Controllers stay thin: no business logic, transactions, or external API calls. Resources are output-only.
44
+ - No per-action `*.request.ts` files; schema files export the value and the inferred type together.
45
+ - Prefer typed model getters over scattered `.get<T>("field")` casts.
46
+
47
+
48
+ ## add-connector `@warlock.js/core/skills/add-connector/SKILL.md`
8
49
 
9
50
  ---
10
51
  name: add-connector
@@ -236,7 +277,7 @@ See the [Registering a connector](#registering-a-connector) section above for th
236
277
  - The `warlock-conventions` topic — module layout, canonical imports.
237
278
 
238
279
 
239
- ## benchmark-code `@warlock.js/core/benchmark-code/SKILL.md`
280
+ ## benchmark-code `@warlock.js/core/skills/benchmark-code/SKILL.md`
240
281
 
241
282
  ---
242
283
  name: benchmark-code
@@ -502,7 +543,7 @@ The `latency` is the _total_ time including retries — useful for the SLO you a
502
543
  - The `configure-app` topic — wiring `src/config/benchmark.ts`.
503
544
 
504
545
 
505
- ## build-restful `@warlock.js/core/build-restful/SKILL.md`
546
+ ## build-restful `@warlock.js/core/skills/build-restful/SKILL.md`
506
547
 
507
548
  ---
508
549
  name: build-restful
@@ -774,7 +815,7 @@ router.restfulResource("/orders", new OrdersRestful());
774
815
  - The `warlock-conventions` topic — controller/service/repository layering rules.
775
816
 
776
817
 
777
- ## build-url `@warlock.js/core/build-url/SKILL.md`
818
+ ## build-url `@warlock.js/core/skills/build-url/SKILL.md`
778
819
 
779
820
  ---
780
821
  name: build-url
@@ -958,7 +999,7 @@ Don't call `setBaseUrl` per request — it's process-global and races every othe
958
999
  - The `configure-app` topic — `src/config/app.ts` and the `baseUrl` env wiring.
959
1000
 
960
1001
 
961
- ## configure-app `@warlock.js/core/configure-app/SKILL.md`
1002
+ ## configure-app `@warlock.js/core/skills/configure-app/SKILL.md`
962
1003
 
963
1004
  ---
964
1005
  name: configure-app
@@ -1384,8 +1425,35 @@ Keep the domain error class in an app module imported by both the service and
1384
1425
  this config. Return `undefined` for errors you do not recognize; a mapped 5xx
1385
1426
  is opaque unless the mapper explicitly chooses a public message.
1386
1427
 
1428
+ ## Format every JSON error response
1429
+
1430
+ `http.errorMapper` classifies thrown non-`HttpError` errors as `{ status, message?, payload? }`. It does not see existing `HttpError` subclasses, returned validation errors, helper responses, unmatched routes, or global rate-limit failures.
1431
+
1432
+ Use `http.errorResponse` when the application needs one JSON error envelope across those paths:
1433
+
1434
+ ```ts title="src/config/http.ts"
1435
+ import type { HttpConfigurations } from "@warlock.js/core";
1436
+
1437
+ export default {
1438
+ errorMapper: () => ({ status: 500 }),
1439
+ errorResponse({ status, requestId }) {
1440
+ return {
1441
+ error: {
1442
+ code: status >= 500 ? "serverError" : `http${status}`,
1443
+ message: status >= 500 ? "Internal server error." : "Request failed.",
1444
+ },
1445
+ requestId,
1446
+ };
1447
+ },
1448
+ } satisfies HttpConfigurations;
1449
+ ```
1450
+
1451
+ The synchronous formatter receives `HttpErrorResponseContext`: `{ status: number, body: unknown, requestId: string }`. Narrow `body` before reading fields; it is the parsed, serialized JSON body. Return a JSON-serializable object or `undefined` to keep the original. The formatter changes only the body, preserving the HTTP status and headers except for recalculated content length, a `private, no-store` cache policy, and the correlation header. If it throws or cannot serialize its result, core logs the formatter error and retains the original body.
1387
1452
 
1388
- ## create-controller `@warlock.js/core/create-controller/SKILL.md`
1453
+ The hook covers status 400–599 with `application/json` or an `application/*+json` content type, including Fastify parsing errors, unmatched-route 404s, validation 422s, rate-limit 429s, and 500s. Warlock responses use the ID already stamped from `request.id`. Before Warlock creates a Request, the formatter receives Fastify's `request.id` and echoes that same value under `http.requestId.header` (default `X-Request-Id`). Setting `http.requestId.enabled: false` suppresses that header; without a stamped Warlock ID, the formatter falls back to Fastify's request ID even for routed responses. Keep request-ID headers enabled when the body must correlate with Warlock request logs. HTML pages, files, raw text, streams, and errors after headers have been sent are not reformatted. With no formatter configured, existing response shapes are unchanged.
1454
+
1455
+
1456
+ ## create-controller `@warlock.js/core/skills/create-controller/SKILL.md`
1389
1457
 
1390
1458
  ---
1391
1459
  name: create-controller
@@ -1684,7 +1752,7 @@ export const remoteCatalogController: RequestHandler = async ({ request, respons
1684
1752
  ```
1685
1753
 
1686
1754
 
1687
- ## create-module `@warlock.js/core/create-module/SKILL.md`
1755
+ ## create-module `@warlock.js/core/skills/create-module/SKILL.md`
1688
1756
 
1689
1757
  ---
1690
1758
  name: create-module
@@ -1885,7 +1953,7 @@ After editing generated code, run `npm run format` and `npm run lint:check`.
1885
1953
  Formatting retains unused imports; the linter reports them.
1886
1954
 
1887
1955
 
1888
- ## define-resource `@warlock.js/core/define-resource/SKILL.md`
1956
+ ## define-resource `@warlock.js/core/skills/define-resource/SKILL.md`
1889
1957
 
1890
1958
  ---
1891
1959
  name: define-resource
@@ -2292,7 +2360,7 @@ export const CommentResource = defineResource({
2292
2360
  - The `create-controller` topic — calling `new XResource(record).toJSON()` from a controller.
2293
2361
 
2294
2362
 
2295
- ## encrypt-data `@warlock.js/core/encrypt-data/SKILL.md`
2363
+ ## encrypt-data `@warlock.js/core/skills/encrypt-data/SKILL.md`
2296
2364
 
2297
2365
  ---
2298
2366
  name: encrypt-data
@@ -2506,11 +2574,11 @@ Password hashing (`hashPassword`) needs `bcryptjs`, which is its own install —
2506
2574
  - The `warlock-conventions` topic — service layering, where the encryption boundary should sit.
2507
2575
 
2508
2576
 
2509
- ## generate-openapi `@warlock.js/core/generate-openapi/SKILL.md`
2577
+ ## generate-openapi `@warlock.js/core/skills/generate-openapi/SKILL.md`
2510
2578
 
2511
2579
  ---
2512
2580
  name: generate-openapi
2513
- description: 'Generate an OpenAPI 3.1 document from the registered routes with `warlock generate.openapi` (default `storage/openapi/openapi.json`), write a Postman collection from it with `warlock generate.postman` (default `storage/postman/collection.json`), and read it live in the dev-only API docs page at `/__warlock/docs`. Documents paths, path/query parameters, request bodies from Seal validation, responses from `handler.responseSchema`, 401/422 and bearer/cookie security from `authMiddleware()`. Triggers: `generate.openapi`, `openApiGeneratorCommand`, `buildOpenApiDocument`, `getDevelopmentOpenApiDocument`, `generate.postman`, `openApiToPostmanCollection`, `getDevelopmentPostmanCollection`, `responseSchema`, `--include-pages`, `/__warlock/docs`; "OpenAPI", "Swagger", "API docs", "import my API into Postman or Insomnia", "document my routes". Skip: declaring response types on a handler — the `create-controller` topic; the devtools dashboard — the `devtools-overview` topic of the `warlock-js-devtools` skill; listing routes — the `warlock-routes` topic.'
2581
+ description: 'Generate an OpenAPI 3.1 document from the registered routes with `warlock generate.openapi` (default `storage/openapi/openapi.json`), write a Postman collection from it with `warlock generate.postman` (default `storage/postman/collection.json`), and read it live in the dev-only API docs page at `/__warlock/docs`. Documents paths, path/query parameters, request bodies from Seal validation, responses from `handler.responseSchema`, 401/422 and bearer/cookie security from `authMiddleware()`. Triggers: `generate.openapi`, `openApiGeneratorCommand`, `buildOpenApiDocument`, `getDevelopmentOpenApiDocument`, `generate.postman`, `openApiToPostmanCollection`, `getDevelopmentPostmanCollection`, `responseSchema`, `--include-pages`, `/__warlock/docs`; "OpenAPI", "Swagger", "API docs", "import my API into Postman or Insomnia", "document my routes". Skip: declaring response types on a handler — the `create-controller` topic; the devtools dashboard — the `warlock-js-devtools` skill; listing routes — the `warlock-routes` topic.'
2514
2582
  ---
2515
2583
 
2516
2584
  # Warlock — generate an OpenAPI document
@@ -2684,7 +2752,7 @@ const { document, warnings } = buildOpenApiDocument(router.list(), {
2684
2752
  - The `warlock-routes` topic — list the routes the document is built from.
2685
2753
 
2686
2754
 
2687
- ## hash-password `@warlock.js/core/hash-password/SKILL.md`
2755
+ ## hash-password `@warlock.js/core/skills/hash-password/SKILL.md`
2688
2756
 
2689
2757
  ---
2690
2758
  name: hash-password
@@ -2871,7 +2939,7 @@ There is no `warlock add` feature for password hashing — `bcryptjs` is a plain
2871
2939
  - The `warlock-conventions` topic — service layering, where the password boundary should sit.
2872
2940
 
2873
2941
 
2874
- ## health-checks `@warlock.js/core/health-checks/SKILL.md`
2942
+ ## health-checks `@warlock.js/core/skills/health-checks/SKILL.md`
2875
2943
 
2876
2944
  ---
2877
2945
  name: health-checks
@@ -3013,7 +3081,7 @@ For an even smoother handoff, give the load balancer time to observe the 503 bef
3013
3081
  - The `use-middleware` topic — maintenance mode and other built-in middleware.
3014
3082
 
3015
3083
 
3016
- ## lower-stage3-decorators `@warlock.js/core/lower-stage3-decorators/SKILL.md`
3084
+ ## lower-stage3-decorators `@warlock.js/core/skills/lower-stage3-decorators/SKILL.md`
3017
3085
 
3018
3086
  ---
3019
3087
  name: lower-stage3-decorators
@@ -3073,7 +3141,7 @@ It's the **same esbuild transform the production `tsx`/build path uses**, so a f
3073
3141
  - The `write-migration` topic of the `warlock-js-cascade` skill — the decorated models this plugin lets you load.
3074
3142
 
3075
3143
 
3076
- ## make-endpoint `@warlock.js/core/make-endpoint/SKILL.md`
3144
+ ## make-endpoint `@warlock.js/core/skills/make-endpoint/SKILL.md`
3077
3145
 
3078
3146
  ---
3079
3147
  name: make-endpoint
@@ -3187,7 +3255,7 @@ Every `generate.*` command, `make`, and `add` take both. `--dry-run` writes (and
3187
3255
  - The `generate-openapi` topic — what `responseSchema` documents.
3188
3256
 
3189
3257
 
3190
- ## model-factories `@warlock.js/core/model-factories/SKILL.md`
3258
+ ## model-factories `@warlock.js/core/skills/model-factories/SKILL.md`
3191
3259
 
3192
3260
  ---
3193
3261
  name: model-factories
@@ -3283,7 +3351,7 @@ it("lists users", async () => {
3283
3351
  - The `write-seeder` topic — seeding a development database.
3284
3352
 
3285
3353
 
3286
- ## process-image `@warlock.js/core/process-image/SKILL.md`
3354
+ ## process-image `@warlock.js/core/skills/process-image/SKILL.md`
3287
3355
 
3288
3356
  ---
3289
3357
  name: process-image
@@ -3460,7 +3528,7 @@ See the `upload-file` topic for the multipart entry point and the `store-file` t
3460
3528
  - The `warlock-conventions` topic — where image-processing services live.
3461
3529
 
3462
3530
 
3463
- ## register-route `@warlock.js/core/register-route/SKILL.md`
3531
+ ## register-route `@warlock.js/core/skills/register-route/SKILL.md`
3464
3532
 
3465
3533
  ---
3466
3534
  name: register-route
@@ -3745,7 +3813,170 @@ router.get("/webhooks/status", webhookStatusController, { rateLimit: false });
3745
3813
  - The `warlock-conventions` topic — module layout, the `guarded` convention, path aliases.
3746
3814
 
3747
3815
 
3748
- ## request-memo `@warlock.js/core/request-memo/SKILL.md`
3816
+ ## report-framework-issue `@warlock.js/core/skills/report-framework-issue/SKILL.md`
3817
+
3818
+ ---
3819
+ name: report-framework-issue
3820
+ description: "Report a confirmed Warlock.js framework bug or missing capability. Read when behavior contradicts the installed docs, a crash appears to originate in @warlock.js packages, or no documented API meets a requirement; covers minimal reproduction, duplicate searches, sanitized warlock issue output and user approval before filing."
3821
+ ---
3822
+
3823
+ # Report a Warlock.js framework issue
3824
+
3825
+ Use this topic when behavior contradicts the installed version's docs or skills,
3826
+ a crash originates inside `@warlock.js/*`, or a needed framework capability is
3827
+ missing. Framework reports belong at <https://github.com/warlockjs/framework>.
3828
+
3829
+ ## Confirm and search first
3830
+
3831
+ 1. Reduce the problem to a minimal reproduction in a clean, generic app. Isolate
3832
+ application logic, third-party packages and configuration mistakes; a stack
3833
+ frame in the framework alone does not prove a framework bug.
3834
+ 2. Read the **installed version's** package `CHANGELOG.md` and skills. Confirm
3835
+ that the documented API exists in that version and check whether a later
3836
+ release already addresses it. For a feature, describe the missing capability
3837
+ and why the documented APIs or an app-level workaround are insufficient.
3838
+ 3. Run `warlock doctor --json` (see `warlock-doctor.md`). Fix app/environment
3839
+ findings first. If boot fails, retain only the sanitized failure; `warlock
3840
+ issue` itself does not boot the app.
3841
+ 4. Search existing reports, including closed issues, using distinctive public
3842
+ terms. If a matching issue exists, show its link and help draft a useful
3843
+ follow-up instead of opening a duplicate. Ask before posting that follow-up.
3844
+
3845
+ ```bash
3846
+ gh issue list -R warlockjs/framework --state all --search "public error or capability"
3847
+ ```
3848
+
3849
+ Without GitHub CLI, use
3850
+ <https://github.com/warlockjs/framework/issues?q=is%3Aissue> and enter those terms.
3851
+
3852
+ ## Collect and protect
3853
+
3854
+ ```bash
3855
+ warlock issue --type bug --title "Public description of the failure"
3856
+ warlock issue --type feature --title "Public description of the capability" --json
3857
+ ```
3858
+
3859
+ Collect affected package names and **installed versions**, Node and package
3860
+ manager versions, OS/architecture, TypeScript version, the reviewed `warlock
3861
+ issue` environment output, a minimal reproduction with exact steps, expected
3862
+ versus actual behavior, and relevant sanitized logs / `warlock doctor --json`
3863
+ output. If a tool cannot run or there are no relevant logs, explain why.
3864
+
3865
+ **Never paste secrets, tokens, `.env` contents, customer data, proprietary code or
3866
+ private app names** into titles, bodies, logs, screenshots, repro repositories,
3867
+ search queries or URLs. Replace the original app with a minimal generic repro.
3868
+ Review even generated environment output and stack traces; remove local paths,
3869
+ hostnames and identifying details. The command reads installed package metadata
3870
+ and a static config summary; it never reads `.env` or executes the app/config.
3871
+ Do not attach the app's full config or diagnostic report without sanitizing it.
3872
+
3873
+ ## Draft and get consent
3874
+
3875
+ Choose one template below, replace every prompt with concrete evidence, and
3876
+ write the sanitized body to a local UTF-8 file such as `framework-issue.md`.
3877
+ **Always show the complete drafted title and body to the user and explicitly ask
3878
+ before filing.** Generating a draft or URL is not consent to publish. If the user
3879
+ requests edits, show the revised draft and obtain approval for that version.
3880
+
3881
+ ### Bug body
3882
+
3883
+ ```markdown
3884
+ ### Summary
3885
+
3886
+ Public description of the framework failure and affected packages.
3887
+
3888
+ ### Environment / warlock issue output
3889
+
3890
+ Reviewed environment output: installed @warlock.js package versions, Node,
3891
+ package manager + version, OS/arch, TypeScript, static config summary.
3892
+
3893
+ ### Minimal reproduction
3894
+
3895
+ Public minimal code or repro link, setup commands and exact steps.
3896
+
3897
+ ### Expected behavior
3898
+
3899
+ What should happen, with the installed version's docs/skills reference.
3900
+
3901
+ ### Actual / current behavior
3902
+
3903
+ What happens instead, including the error and impact.
3904
+
3905
+ ### Sanitized logs / doctor output
3906
+
3907
+ Relevant logs and warlock doctor --json, or why unavailable / not applicable.
3908
+
3909
+ ### Checks
3910
+
3911
+ - [ ] Searched existing issues and checked installed-version CHANGELOG and skills.
3912
+ - [ ] Removed secrets, tokens, .env, customer data, proprietary code and private app names.
3913
+ - [ ] User reviewed this complete draft and approved filing.
3914
+ ```
3915
+
3916
+ ### Feature request body
3917
+
3918
+ ```markdown
3919
+ ### Problem / use case
3920
+
3921
+ Public description of the missing framework capability and affected packages.
3922
+
3923
+ ### Environment / warlock issue output
3924
+
3925
+ Reviewed environment output: installed @warlock.js package versions, Node,
3926
+ package manager + version, OS/arch, TypeScript, static config summary.
3927
+
3928
+ ### Minimal reproduction
3929
+
3930
+ Minimal public example of the capability that cannot currently be expressed.
3931
+
3932
+ ### Proposed behavior
3933
+
3934
+ Desired API/behavior, with an example and why it belongs in the framework.
3935
+
3936
+ ### Actual / current behavior
3937
+
3938
+ Current limitation and relevant installed-version docs/skills.
3939
+
3940
+ ### Alternatives considered
3941
+
3942
+ Existing APIs, app-level workarounds and their limitations.
3943
+
3944
+ ### Sanitized logs / doctor output
3945
+
3946
+ Relevant logs and warlock doctor --json, or why unavailable / not applicable.
3947
+
3948
+ ### Checks
3949
+
3950
+ - [ ] Searched existing issues and checked installed-version CHANGELOG and skills.
3951
+ - [ ] Removed secrets, tokens, .env, customer data, proprietary code and private app names.
3952
+ - [ ] User reviewed this complete draft and approved filing.
3953
+ ```
3954
+
3955
+ Only check a box after completing that step, including obtaining consent.
3956
+
3957
+ ## File the approved draft
3958
+
3959
+ Check `gh --version` and `gh auth status --hostname github.com`. If GitHub CLI is
3960
+ available and authenticated, **after approval** run:
3961
+
3962
+ ```bash
3963
+ gh issue create -R warlockjs/framework --title "Approved public title" --body-file framework-issue.md
3964
+ ```
3965
+
3966
+ Return the created issue's link. If GitHub CLI is unavailable or unauthenticated,
3967
+ give the user the pre-filled new-issue URL printed by `warlock issue` together
3968
+ with the approved body. The URL selects `bug.yml` or `feature.yml` and prefills
3969
+ the environment field; the user must complete the remaining form fields. URLs
3970
+ are capped at 7,500 characters and may include a truncation note: restore the
3971
+ remaining reviewed output manually. Never claim the issue was filed from merely
3972
+ printing or opening a URL. `warlock issue` never sends anything itself.
3973
+
3974
+ GitHub CLI flags: [list](https://cli.github.com/manual/gh_issue_list),
3975
+ [create](https://cli.github.com/manual/gh_issue_create),
3976
+ [authentication](https://cli.github.com/manual/gh_auth_status).
3977
+
3978
+
3979
+ ## request-memo `@warlock.js/core/skills/request-memo/SKILL.md`
3749
3980
 
3750
3981
  ---
3751
3982
  name: request-memo
@@ -3891,7 +4122,7 @@ Reusing one key for different result types is a caller bug: TypeScript cannot co
3891
4122
  - The `create-controller` topic — consuming request-scoped values from controllers.
3892
4123
 
3893
4124
 
3894
- ## request-tracing `@warlock.js/core/request-tracing/SKILL.md`
4125
+ ## request-tracing `@warlock.js/core/skills/request-tracing/SKILL.md`
3895
4126
 
3896
4127
  ---
3897
4128
  name: request-tracing
@@ -4129,7 +4360,7 @@ export default httpConfig;
4129
4360
  - The `logger-basics` topic of the `warlock-js-logger` skill — structured logging; tracing hooks are the place to bridge phase timing into your log channel.
4130
4361
 
4131
4362
 
4132
- ## resolve-path `@warlock.js/core/resolve-path/SKILL.md`
4363
+ ## resolve-path `@warlock.js/core/skills/resolve-path/SKILL.md`
4133
4364
 
4134
4365
  ---
4135
4366
  name: resolve-path
@@ -4304,7 +4535,7 @@ If you find yourself reaching for `path.join(process.cwd(), ...)` — that's a s
4304
4535
  - The `upload-file` topic — the `UploadedFile` shape that pairs with `uploadsPath`.
4305
4536
 
4306
4537
 
4307
- ## retry-operation `@warlock.js/core/retry-operation/SKILL.md`
4538
+ ## retry-operation `@warlock.js/core/skills/retry-operation/SKILL.md`
4308
4539
 
4309
4540
  ---
4310
4541
  name: retry-operation
@@ -4426,7 +4657,7 @@ const result = await measure("publish-event", () =>
4426
4657
  - The `write-use-case` topic — the use-case `retry` option.
4427
4658
 
4428
4659
 
4429
- ## run-app `@warlock.js/core/run-app/SKILL.md`
4660
+ ## run-app `@warlock.js/core/skills/run-app/SKILL.md`
4430
4661
 
4431
4662
  ---
4432
4663
  name: run-app
@@ -5146,7 +5377,7 @@ directly. Regression tests cover both paths without inherited loader hooks,
5146
5377
  including configured declaration roots, source updates and deleted declarations.
5147
5378
 
5148
5379
 
5149
- ## send-mail `@warlock.js/core/send-mail/SKILL.md`
5380
+ ## send-mail `@warlock.js/core/skills/send-mail/SKILL.md`
5150
5381
 
5151
5382
  ---
5152
5383
  name: send-mail
@@ -5552,7 +5783,7 @@ await Mail.to(user.email)
5552
5783
  - The `warlock-conventions` topic — where mail-sending services live.
5553
5784
 
5554
5785
 
5555
- ## send-response `@warlock.js/core/send-response/SKILL.md`
5786
+ ## send-response `@warlock.js/core/skills/send-response/SKILL.md`
5556
5787
 
5557
5788
  ---
5558
5789
  name: send-response
@@ -6038,8 +6269,35 @@ export function requireProduct<T>(product: T | null | undefined): T {
6038
6269
  }
6039
6270
  ```
6040
6271
 
6272
+ ## Format every JSON error response
6273
+
6274
+ `http.errorMapper` classifies thrown non-`HttpError` errors as `{ status, message?, payload? }`. It does not see existing `HttpError` subclasses, returned validation errors, helper responses, unmatched routes, or global rate-limit failures.
6041
6275
 
6042
- ## store-file `@warlock.js/core/store-file/SKILL.md`
6276
+ Use `http.errorResponse` when the application needs one JSON error envelope across those paths:
6277
+
6278
+ ```ts title="src/config/http.ts"
6279
+ import type { HttpConfigurations } from "@warlock.js/core";
6280
+
6281
+ export default {
6282
+ errorMapper: () => ({ status: 500 }),
6283
+ errorResponse({ status, requestId }) {
6284
+ return {
6285
+ error: {
6286
+ code: status >= 500 ? "serverError" : `http${status}`,
6287
+ message: status >= 500 ? "Internal server error." : "Request failed.",
6288
+ },
6289
+ requestId,
6290
+ };
6291
+ },
6292
+ } satisfies HttpConfigurations;
6293
+ ```
6294
+
6295
+ The synchronous formatter receives `HttpErrorResponseContext`: `{ status: number, body: unknown, requestId: string }`. Narrow `body` before reading fields; it is the parsed, serialized JSON body. Return a JSON-serializable object or `undefined` to keep the original. The formatter changes only the body, preserving the HTTP status and headers except for recalculated content length, a `private, no-store` cache policy, and the correlation header. If it throws or cannot serialize its result, core logs the formatter error and retains the original body.
6296
+
6297
+ The hook covers status 400–599 with `application/json` or an `application/*+json` content type, including Fastify parsing errors, unmatched-route 404s, validation 422s, rate-limit 429s, and 500s. Warlock responses use the ID already stamped from `request.id`. Before Warlock creates a Request, the formatter receives Fastify's `request.id` and echoes that same value under `http.requestId.header` (default `X-Request-Id`). Setting `http.requestId.enabled: false` suppresses that header; without a stamped Warlock ID, the formatter falls back to Fastify's request ID even for routed responses. Keep request-ID headers enabled when the body must correlate with Warlock request logs. HTML pages, files, raw text, streams, and errors after headers have been sent are not reformatted. With no formatter configured, existing response shapes are unchanged.
6298
+
6299
+
6300
+ ## store-file `@warlock.js/core/skills/store-file/SKILL.md`
6043
6301
 
6044
6302
  ---
6045
6303
  name: store-file
@@ -6487,7 +6745,7 @@ Client `PUT`s the bytes straight to R2 — your server never sees them.
6487
6745
  - The `send-response` topic — `response.sendFile(absPath)` for serving local files.
6488
6746
 
6489
6747
 
6490
- ## store-secrets `@warlock.js/core/store-secrets/SKILL.md`
6748
+ ## store-secrets `@warlock.js/core/skills/store-secrets/SKILL.md`
6491
6749
 
6492
6750
  ---
6493
6751
  name: store-secrets
@@ -6651,7 +6909,7 @@ The normal test harness still installs `secretsFake`; explicit `backend`
6651
6909
  instances and that fake continue to bypass configured backend selection.
6652
6910
 
6653
6911
 
6654
- ## test-browser `@warlock.js/core/test-browser/SKILL.md`
6912
+ ## test-browser `@warlock.js/core/skills/test-browser/SKILL.md`
6655
6913
 
6656
6914
  ---
6657
6915
  name: test-browser
@@ -6758,6 +7016,7 @@ port-file handshake above when the app supports binding `0` itself.
6758
7016
  document. Selector helpers do not enter frames or closed shadow roots.
6759
7017
 
6760
7018
  Use `--browser /path/to/chrome` or `WARLOCK_E2E_BROWSER` if discovery fails.
7019
+ Set `browser.startupTimeoutMs` (default 30 seconds) when the browser is slow to start, for example on shared CI runners.
6761
7020
  `browser: { args: ["--no-sandbox"] }` is an explicit option for controlled root
6762
7021
  containers; it is not a default. On Windows, command arrays should invoke JS tools
6763
7022
  through `process.execPath`, avoiding `.cmd` executables that require a shell.
@@ -6774,7 +7033,7 @@ if ownership verification fails and reports the failure in evidence. Do not add
6774
7033
  process-name or port-based kills to a spec.
6775
7034
 
6776
7035
 
6777
- ## test-fakes `@warlock.js/core/test-fakes/SKILL.md`
7036
+ ## test-fakes `@warlock.js/core/skills/test-fakes/SKILL.md`
6778
7037
 
6779
7038
  ---
6780
7039
  name: test-fakes
@@ -6903,7 +7162,7 @@ An unknown fake name or a non-boolean value fails setup with the list of known f
6903
7162
  - The `model-factories` topic — deterministic fixtures.
6904
7163
 
6905
7164
 
6906
- ## test-http `@warlock.js/core/test-http/SKILL.md`
7165
+ ## test-http `@warlock.js/core/skills/test-http/SKILL.md`
6907
7166
 
6908
7167
  ---
6909
7168
  name: test-http
@@ -7367,7 +7626,7 @@ This is fine for normal test flow. It bites when you're inside a transaction the
7367
7626
  - The `write-cli-command` topic — `warlock add test` scaffolds both global + worker setup files.
7368
7627
 
7369
7628
 
7370
- ## test-service `@warlock.js/core/test-service/SKILL.md`
7629
+ ## test-service `@warlock.js/core/skills/test-service/SKILL.md`
7371
7630
 
7372
7631
  ---
7373
7632
  name: test-service
@@ -7817,7 +8076,7 @@ setupTest({ importModule: (file) => import(file) });
7817
8076
  The generated `src/test-setup.ts` already does this. Without it, `setupTest()` under Vitest warns once.
7818
8077
 
7819
8078
 
7820
- ## update-packages `@warlock.js/core/update-packages/SKILL.md`
8079
+ ## update-packages `@warlock.js/core/skills/update-packages/SKILL.md`
7821
8080
 
7822
8081
  ---
7823
8082
  name: update-packages
@@ -7965,7 +8224,7 @@ Two small zero-dependency utilities back the tooling and are exported from `@war
7965
8224
  - The `configure-app` topic — `warlock.config.ts` shape and `defineConfig`.
7966
8225
 
7967
8226
 
7968
- ## upgrade-from-5-29 `@warlock.js/core/upgrade-from-5-29/SKILL.md`
8227
+ ## upgrade-from-5-29 `@warlock.js/core/skills/upgrade-from-5-29/SKILL.md`
7969
8228
 
7970
8229
  ---
7971
8230
  name: upgrade-from-5-29
@@ -8445,6 +8704,10 @@ It replaces standard scripts/dependencies, pins TypeScript 7.0.2, updates genera
8445
8704
  editor settings, removes `healthCheckers.eslint` and selects Oxlint. A generated
8446
8705
  `.prettierignore` becomes `.oxfmtignore`; Oxfmt scripts read it explicitly.
8447
8706
 
8707
+ Generated migration configs enable `typescript/no-explicit-any`, `curly`, and
8708
+ `no-console` as errors, matching new apps. Fix those diagnostics before running
8709
+ `npm run lint:check` and `npx warlock check` again.
8710
+
8448
8711
  The `oxc-toolchain` codemod also updates generated VS Code settings and literal
8449
8712
  ESLint/Oxlint health-check switches. Custom editor settings, checker arrays,
8450
8713
  computed options and nonstandard scripts require review. Oxc diagnostics keep
@@ -8501,7 +8764,7 @@ marker determines the installer: `package-lock.json` plus `pnpm-workspace.yaml`
8501
8764
  without `pnpm-lock.yaml` now produces `npm install`.
8502
8765
 
8503
8766
 
8504
- ## upload-file `@warlock.js/core/upload-file/SKILL.md`
8767
+ ## upload-file `@warlock.js/core/skills/upload-file/SKILL.md`
8505
8768
 
8506
8769
  ---
8507
8770
  name: upload-file
@@ -8814,7 +9077,7 @@ The reverse direction — sending a stored file back via `response.sendFile(...)
8814
9077
  - The `warlock-conventions` topic — storage configuration and driver selection.
8815
9078
 
8816
9079
 
8817
- ## use-app-context `@warlock.js/core/use-app-context/SKILL.md`
9080
+ ## use-app-context `@warlock.js/core/skills/use-app-context/SKILL.md`
8818
9081
 
8819
9082
  ---
8820
9083
  name: use-app-context
@@ -9125,7 +9388,7 @@ cors: {
9125
9388
  - The `warlock-conventions` topic — module layout, where paths point to.
9126
9389
 
9127
9390
 
9128
- ## use-localization `@warlock.js/core/use-localization/SKILL.md`
9391
+ ## use-localization `@warlock.js/core/skills/use-localization/SKILL.md`
9129
9392
 
9130
9393
  ---
9131
9394
  name: use-localization
@@ -9467,7 +9730,7 @@ This produces `account.title` and `account.actions.save`. Keep every leaf comple
9467
9730
  When a route-locales snapshot applies, `t()` (through the request binding) and `request.transFrom(locale, key, placeholders?)` resolve through it; without one, they retain the existing global-registry behavior. The underlying `transFromKeywords(locale, keywords, key, placeholders?, converter?)` is supplied by `@mongez/localization` 3.5.0. Error pages rebind to their own snapshot, while framework fallback uses the app/root snapshot. Development HMR add/edit/delete publishes a new snapshot, and the snapshot revision keeps page-cache entries from reusing old JSON. Generated `.warlock` typings contain the flattened route keys; do not maintain a second handwritten key union.
9468
9731
 
9469
9732
 
9470
- ## use-middleware `@warlock.js/core/use-middleware/SKILL.md`
9733
+ ## use-middleware `@warlock.js/core/skills/use-middleware/SKILL.md`
9471
9734
 
9472
9735
  ---
9473
9736
  name: use-middleware
@@ -9765,7 +10028,7 @@ router.post("/private/preview", ({ response }) => response.success({ ready: true
9765
10028
  ```
9766
10029
 
9767
10030
 
9768
- ## use-model-transformers `@warlock.js/core/use-model-transformers/SKILL.md`
10031
+ ## use-model-transformers `@warlock.js/core/skills/use-model-transformers/SKILL.md`
9769
10032
 
9770
10033
  ---
9771
10034
  name: use-model-transformers
@@ -9998,7 +10261,7 @@ Rule of thumb: transformers are for **pure, deterministic** transforms of the ro
9998
10261
  - The `warlock-conventions` topic — schema files live in `src/app/<module>/models/<entity>/<entity>.model.ts`.
9999
10262
 
10000
10263
 
10001
- ## use-repository `@warlock.js/core/use-repository/SKILL.md`
10264
+ ## use-repository `@warlock.js/core/skills/use-repository/SKILL.md`
10002
10265
 
10003
10266
  ---
10004
10267
  name: use-repository
@@ -10432,7 +10695,7 @@ The third arg is a context object — `{ allValues, dateFormat, ... }` — for f
10432
10695
  - The `warlock-conventions` topic — controller → service → repository → model layering.
10433
10696
 
10434
10697
 
10435
- ## use-request-locals `@warlock.js/core/use-request-locals/SKILL.md`
10698
+ ## use-request-locals `@warlock.js/core/skills/use-request-locals/SKILL.md`
10436
10699
 
10437
10700
  ---
10438
10701
  name: use-request-locals
@@ -10603,7 +10866,7 @@ Writing `request.locals.organization` does not affect `request.all()`, `request.
10603
10866
  - The `create-controller` topic — reading locals in downstream controllers.
10604
10867
 
10605
10868
 
10606
- ## validate-input `@warlock.js/core/validate-input/SKILL.md`
10869
+ ## validate-input `@warlock.js/core/skills/validate-input/SKILL.md`
10607
10870
 
10608
10871
  ---
10609
10872
  name: validate-input
@@ -10961,7 +11224,7 @@ updateProductController.validation = {
10961
11224
  - The `warlock-conventions` topic — `Request<Schema>` type-alias convention.
10962
11225
 
10963
11226
 
10964
- ## warlock-agents-md `@warlock.js/core/warlock-agents-md/SKILL.md`
11227
+ ## warlock-agents-md `@warlock.js/core/skills/warlock-agents-md/SKILL.md`
10965
11228
 
10966
11229
  ---
10967
11230
  name: warlock-agents-md
@@ -11061,7 +11324,7 @@ refresher.dispose();
11061
11324
  - The `warlock-conventions` topic — the conventions listed in the section.
11062
11325
 
11063
11326
 
11064
- ## warlock-board `@warlock.js/core/warlock-board/SKILL.md`
11327
+ ## warlock-board `@warlock.js/core/skills/warlock-board/SKILL.md`
11065
11328
 
11066
11329
  ---
11067
11330
  name: warlock-board
@@ -11188,7 +11451,7 @@ const { messages } = await watchBoard({ agent: "implementer", timeoutMs: 30 * 60
11188
11451
  - The `warlock-inspect` topic — the app's facts as JSON before you change it.
11189
11452
 
11190
11453
 
11191
- ## warlock-check `@warlock.js/core/warlock-check/SKILL.md`
11454
+ ## warlock-check `@warlock.js/core/skills/warlock-check/SKILL.md`
11192
11455
 
11193
11456
  ---
11194
11457
  name: warlock-check
@@ -11319,7 +11582,7 @@ const types = runTypecheck({ files: ["src/app/posts/services/publish.service.ts"
11319
11582
 
11320
11583
  ## See also
11321
11584
 
11322
- - `report-framework-issue.md` — confirm a framework bug or missing capability, collect `warlock issue` output, and get the user's approval before filing.
11585
+ - the `report-framework-issue` topic — confirm a framework bug or missing capability, collect `warlock issue` output, and get the user's approval before filing.
11323
11586
  - The `warlock-doctor` topic — boot-time diagnostics; `doctor --json` uses the same codes and fields.
11324
11587
  - The `warlock-inspect` topic — the app's routes, models and config as JSON.
11325
11588
  - The `warlock-conventions` topic — the rules behind `WL9001`–`WL9012`, with the fix for each.
@@ -11329,7 +11592,7 @@ Migrate lint and format tooling with
11329
11592
  and work through the manual-review list. Use `--lint=oxc` for new apps.
11330
11593
 
11331
11594
 
11332
- ## warlock-conventions `@warlock.js/core/warlock-conventions/SKILL.md`
11595
+ ## warlock-conventions `@warlock.js/core/skills/warlock-conventions/SKILL.md`
11333
11596
 
11334
11597
  ---
11335
11598
  name: warlock-conventions
@@ -11585,7 +11848,7 @@ The comment covers the codes it names on its own line and the next; with no code
11585
11848
  - The `send-response` topic — the full Response helper surface.
11586
11849
 
11587
11850
 
11588
- ## warlock-doctor `@warlock.js/core/warlock-doctor/SKILL.md`
11851
+ ## warlock-doctor `@warlock.js/core/skills/warlock-doctor/SKILL.md`
11589
11852
 
11590
11853
  ---
11591
11854
  name: warlock-doctor
@@ -11768,7 +12031,7 @@ formatting. Oxlint/Oxfmt are the only supported tools in 5.34.0. Use the
11768
12031
  Migrate with `npx warlock upgrade --from 5.32 --to 5.33.0` (preview with `--dry-run`).
11769
12032
 
11770
12033
 
11771
- ## warlock-inspect `@warlock.js/core/warlock-inspect/SKILL.md`
12034
+ ## warlock-inspect `@warlock.js/core/skills/warlock-inspect/SKILL.md`
11772
12035
 
11773
12036
  ---
11774
12037
  name: warlock-inspect
@@ -11906,7 +12169,7 @@ const valid = new Ajv2020({ strict: false }).validate(INSPECT_REPORT_JSON_SCHEMA
11906
12169
  - The `generate-openapi` topic — the same route schemas as an OpenAPI document.
11907
12170
 
11908
12171
 
11909
- ## warlock-mcp `@warlock.js/core/warlock-mcp/SKILL.md`
12172
+ ## warlock-mcp `@warlock.js/core/skills/warlock-mcp/SKILL.md`
11910
12173
 
11911
12174
  ---
11912
12175
  name: warlock-mcp
@@ -12030,7 +12293,7 @@ await server.close();
12030
12293
  - The `expose-as-mcp-server` topic of @warlock.js/ai-tools — the transport underneath.
12031
12294
 
12032
12295
 
12033
- ## warlock-routes `@warlock.js/core/warlock-routes/SKILL.md`
12296
+ ## warlock-routes `@warlock.js/core/skills/warlock-routes/SKILL.md`
12034
12297
 
12035
12298
  ---
12036
12299
  name: warlock-routes
@@ -12170,11 +12433,11 @@ and exits non-zero.
12170
12433
  - The `write-cli-command` topic — the command + `preload` shape `routesCommand` is built from.
12171
12434
 
12172
12435
 
12173
- ## warlock-trace `@warlock.js/core/warlock-trace/SKILL.md`
12436
+ ## warlock-trace `@warlock.js/core/skills/warlock-trace/SKILL.md`
12174
12437
 
12175
12438
  ---
12176
12439
  name: warlock-trace
12177
- description: 'Verify runtime behaviour without a browser: `warlock trace <method> <url> [--body json|@file] [--header k:v] [--json]` sends one request to the running `warlock dev` server and prints what devtools recorded for it — middleware chain with timings, validation result and errors, handler time, queries with N+1 flags, logs, cache operations, captured mails, the response and timings — as a versioned report (`schemaVersion: 1`); `traceRequest()` returns the same object. Triggers: `warlock trace`, `traceRequest`, `TraceReport`, `buildTraceReport`, `x-request-id`, `.warlock/dev-server.json`, `WL8008`, `WL8009`, `WL5004`, `--id-header`; "did validation pass for this request", "which queries does this endpoint run", "is there an N+1 on this route", "what middleware runs on this route", "check the endpoint after my change", "request timeline as JSON". Skip: the devtools dashboard in a browser — the `devtools-overview` skill of @warlock.js/devtools; static route facts (guard, rate limit, schemas) — the `warlock-inspect` topic; typecheck/lint/tests — the `warlock-check` topic.'
12440
+ description: 'Verify runtime behaviour without a browser: `warlock trace <method> <url> [--body json|@file] [--header k:v] [--json]` sends one request to the running `warlock dev` server and prints what devtools recorded for it — middleware chain with timings, validation result and errors, handler time, queries with N+1 flags, logs, cache operations, captured mails, the response and timings — as a versioned report (`schemaVersion: 1`); `traceRequest()` returns the same object. Triggers: `warlock trace`, `traceRequest`, `TraceReport`, `buildTraceReport`, `x-request-id`, `.warlock/dev-server.json`, `WL8008`, `WL8009`, `WL5004`, `--id-header`; "did validation pass for this request", "which queries does this endpoint run", "is there an N+1 on this route", "what middleware runs on this route", "check the endpoint after my change", "request timeline as JSON". Skip: the devtools dashboard in a browser — the `warlock-js-devtools` skill; static route facts (guard, rate limit, schemas) — the `warlock-inspect` topic; typecheck/lint/tests — the `warlock-check` topic.'
12178
12441
  ---
12179
12442
 
12180
12443
  # Warlock — `warlock trace`
@@ -12252,10 +12515,10 @@ Devtools is checked before anything is sent. With `--json` a failure prints `{ "
12252
12515
 
12253
12516
  - The `warlock-inspect` topic — the static facts of a route (guard, rate limit, schemas).
12254
12517
  - The `warlock-check` topic — typecheck, lint, tests and conventions in one run.
12255
- - The `devtools-overview` skill of `@warlock.js/devtools` — the dashboard behind the timeline.
12518
+ - The `warlock-js-devtools` skill — the dashboard behind the timeline.
12256
12519
 
12257
12520
 
12258
- ## wire-socket `@warlock.js/core/wire-socket/SKILL.md`
12521
+ ## wire-socket `@warlock.js/core/skills/wire-socket/SKILL.md`
12259
12522
 
12260
12523
  ---
12261
12524
  name: wire-socket
@@ -12566,7 +12829,7 @@ CLI commands, scheduled jobs, queue workers — anything running outside an HTTP
12566
12829
  - The `warlock-conventions` topic — where socket-related code lives (a setup function for handler registration, `services/` for emit sites).
12567
12830
 
12568
12831
 
12569
- ## write-cli-command `@warlock.js/core/write-cli-command/SKILL.md`
12832
+ ## write-cli-command `@warlock.js/core/skills/write-cli-command/SKILL.md`
12570
12833
 
12571
12834
  ---
12572
12835
  name: write-cli-command
@@ -12907,11 +13170,11 @@ Set a unique owner and registry per app instance, then import `processes` from
12907
13170
  the generated module and await `processes.spawn({ kind: "worker", command,
12908
13171
  args, labels })`. Consume output and await `handle.exited`. Use handle stops or
12909
13172
  label filters; never stop processes by command or name. `spawnPty()` lazily
12910
- loads separately installed optional peer `node-pty`. The `supervise-processes`
12911
- skill in `@warlock.js/process` contains complete working examples.
13173
+ loads separately installed optional peer `node-pty`. The `warlock-js-process`
13174
+ skill contains complete working examples.
12912
13175
 
12913
13176
 
12914
- ## write-middleware `@warlock.js/core/write-middleware/SKILL.md`
13177
+ ## write-middleware `@warlock.js/core/skills/write-middleware/SKILL.md`
12915
13178
 
12916
13179
  ---
12917
13180
  name: write-middleware
@@ -13139,7 +13402,7 @@ export const optionalAuth: Middleware = async ({ request, response }) => {
13139
13402
  - The `warlock-conventions` topic — the `guarded()` / `guardedAdmin()` / `publicRoutes()` convention.
13140
13403
 
13141
13404
 
13142
- ## write-seeder `@warlock.js/core/write-seeder/SKILL.md`
13405
+ ## write-seeder `@warlock.js/core/skills/write-seeder/SKILL.md`
13143
13406
 
13144
13407
  ---
13145
13408
  name: write-seeder
@@ -13534,7 +13797,7 @@ warlock seed --transaction # (default true) — pass --transaction=false to s
13534
13797
  - The `warlock-conventions` topic — `seeds/` is the canonical folder name (singular `seed/` is incorrect).
13535
13798
 
13536
13799
 
13537
- ## write-use-case `@warlock.js/core/write-use-case/SKILL.md`
13800
+ ## write-use-case `@warlock.js/core/skills/write-use-case/SKILL.md`
13538
13801
 
13539
13802
  ---
13540
13803
  name: write-use-case