@rehearsal-db/core 0.1.0-beta.8 → 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +364 -1
  2. package/COMPATIBILITY.md +30 -3
  3. package/README.md +69 -22
  4. package/dist/package.json +100 -0
  5. package/dist/scripts/install/create_root_config.d.mts +3 -0
  6. package/dist/scripts/install/create_root_config.mjs +13 -0
  7. package/dist/scripts/runtime/manage_database.d.mts +6 -0
  8. package/dist/scripts/runtime/manage_database.mjs +16 -0
  9. package/dist/src/application/interactive_task.d.mts +30 -0
  10. package/dist/src/application/interactive_task.mjs +83 -0
  11. package/dist/src/application/session.d.mts +97 -0
  12. package/dist/src/application/session.mjs +380 -0
  13. package/dist/src/baseline/artifact.d.mts +119 -0
  14. package/dist/src/baseline/artifact.mjs +522 -0
  15. package/dist/src/baseline/builder.d.mts +19 -0
  16. package/dist/src/baseline/builder.mjs +142 -0
  17. package/dist/src/baseline/input_discovery.d.mts +13 -0
  18. package/dist/src/baseline/input_discovery.mjs +149 -0
  19. package/dist/src/baseline/policy_review.d.mts +56 -0
  20. package/dist/src/baseline/policy_review.mjs +73 -0
  21. package/dist/src/baseline/preparation.d.mts +63 -0
  22. package/dist/src/baseline/preparation.mjs +295 -0
  23. package/dist/src/baseline/privacy_contract.d.mts +147 -0
  24. package/dist/src/baseline/privacy_contract.mjs +2 -0
  25. package/dist/src/baseline/privacy_dependency_graph.d.mts +7 -0
  26. package/dist/src/baseline/privacy_dependency_graph.mjs +110 -0
  27. package/dist/src/baseline/privacy_engine.d.mts +5 -0
  28. package/dist/src/baseline/privacy_engine.mjs +4 -0
  29. package/dist/src/baseline/privacy_key.d.mts +7 -0
  30. package/dist/src/baseline/privacy_key.mjs +42 -0
  31. package/dist/src/baseline/privacy_pipeline.d.mts +7 -0
  32. package/dist/src/baseline/privacy_pipeline.mjs +127 -0
  33. package/dist/src/baseline/privacy_policy.d.mts +6 -0
  34. package/dist/src/baseline/privacy_policy.mjs +237 -0
  35. package/dist/src/baseline/privacy_recipe_validation.d.mts +5 -0
  36. package/dist/src/baseline/privacy_recipe_validation.mjs +289 -0
  37. package/dist/src/baseline/privacy_rule_registry.d.mts +18 -0
  38. package/dist/src/baseline/privacy_rule_registry.mjs +143 -0
  39. package/dist/src/baseline/privacy_structured_json.d.mts +66 -0
  40. package/dist/src/baseline/privacy_structured_json.mjs +464 -0
  41. package/dist/src/baseline/privacy_transforms.d.mts +18 -0
  42. package/dist/src/baseline/privacy_transforms.mjs +142 -0
  43. package/dist/src/baseline/privacy_validation_shared.d.mts +31 -0
  44. package/dist/src/baseline/privacy_validation_shared.mjs +127 -0
  45. package/dist/src/baseline/sanitization_policy.d.mts +69 -0
  46. package/dist/src/baseline/sanitization_policy.mjs +227 -0
  47. package/dist/src/baseline/schema_snapshot.d.mts +19 -0
  48. package/dist/src/baseline/schema_snapshot.mjs +79 -0
  49. package/dist/src/cli/application_command_handlers.d.mts +8 -0
  50. package/dist/src/cli/application_command_handlers.mjs +52 -0
  51. package/dist/src/cli/arguments.d.mts +38 -0
  52. package/dist/src/cli/arguments.mjs +130 -0
  53. package/dist/src/cli/basic_command_handlers.d.mts +4 -0
  54. package/dist/src/cli/basic_command_handlers.mjs +57 -0
  55. package/dist/src/cli/cli_commands.d.mts +14 -0
  56. package/dist/src/cli/cli_commands.mjs +34 -0
  57. package/dist/src/cli/command_contract.d.mts +57 -0
  58. package/dist/src/cli/command_contract.mjs +39 -0
  59. package/dist/src/cli/command_output.d.mts +12 -0
  60. package/dist/src/cli/command_output.mjs +20 -0
  61. package/dist/src/cli/command_registry.d.mts +7 -0
  62. package/dist/src/cli/command_registry.mjs +14 -0
  63. package/dist/src/cli/guided.d.mts +53 -0
  64. package/dist/src/cli/guided.mjs +727 -0
  65. package/dist/src/cli/identity_command_handlers.d.mts +12 -0
  66. package/dist/src/cli/identity_command_handlers.mjs +239 -0
  67. package/dist/src/cli/identity_renderer.d.mts +8 -0
  68. package/dist/src/cli/identity_renderer.mjs +33 -0
  69. package/dist/src/cli/init_command.d.mts +21 -0
  70. package/dist/src/cli/init_command.mjs +90 -0
  71. package/dist/src/cli/inspection_command_handlers.d.mts +3 -0
  72. package/dist/src/cli/inspection_command_handlers.mjs +79 -0
  73. package/dist/src/cli/project_command_handlers.d.mts +11 -0
  74. package/dist/src/cli/project_command_handlers.mjs +92 -0
  75. package/dist/src/cli/project_commands.d.mts +283 -0
  76. package/dist/src/cli/project_commands.mjs +192 -0
  77. package/dist/src/cli/rehearsal.d.mts +7 -0
  78. package/dist/src/cli/rehearsal.mjs +190 -0
  79. package/dist/src/cli/renderers.d.mts +299 -0
  80. package/dist/src/cli/renderers.mjs +554 -0
  81. package/dist/src/cli/runtime_action_handlers.d.mts +12 -0
  82. package/dist/src/cli/runtime_action_handlers.mjs +201 -0
  83. package/dist/src/cli/runtime_commands.d.mts +294 -0
  84. package/dist/src/cli/runtime_commands.mjs +619 -0
  85. package/dist/src/cli/source_command_handlers.d.mts +8 -0
  86. package/dist/src/cli/source_command_handlers.mjs +62 -0
  87. package/dist/src/cli/source_commands.d.mts +436 -0
  88. package/dist/src/cli/source_commands.mjs +301 -0
  89. package/dist/src/cli/terminal.d.mts +59 -0
  90. package/dist/src/cli/terminal.mjs +230 -0
  91. package/dist/src/identity/claim.d.mts +5 -0
  92. package/dist/src/identity/claim.mjs +4 -0
  93. package/dist/src/identity/claim_contract.d.mts +135 -0
  94. package/dist/src/identity/claim_contract.mjs +6 -0
  95. package/dist/src/identity/claim_executor.d.mts +10 -0
  96. package/dist/src/identity/claim_executor.mjs +358 -0
  97. package/dist/src/identity/claim_identity_lookup.d.mts +23 -0
  98. package/dist/src/identity/claim_identity_lookup.mjs +134 -0
  99. package/dist/src/identity/claim_plan.d.mts +8 -0
  100. package/dist/src/identity/claim_plan.mjs +61 -0
  101. package/dist/src/identity/claim_policy.d.mts +3 -0
  102. package/dist/src/identity/claim_policy.mjs +377 -0
  103. package/dist/src/identity/claim_sql.d.mts +10 -0
  104. package/dist/src/identity/claim_sql.mjs +46 -0
  105. package/dist/src/identity/claim_verification.d.mts +13 -0
  106. package/dist/src/identity/claim_verification.mjs +35 -0
  107. package/dist/src/identity/connect.d.mts +30 -0
  108. package/dist/src/identity/connect.mjs +111 -0
  109. package/dist/src/identity/provider_configuration.d.mts +37 -0
  110. package/dist/src/identity/provider_configuration.mjs +132 -0
  111. package/dist/src/identity/storage.d.mts +21 -0
  112. package/dist/src/identity/storage.mjs +122 -0
  113. package/dist/src/index.d.mts +4 -0
  114. package/dist/src/index.mjs +3 -0
  115. package/dist/src/project/configuration.d.mts +13 -0
  116. package/dist/src/project/configuration.mjs +9 -0
  117. package/dist/src/project/configuration_contract.d.mts +125 -0
  118. package/dist/src/project/configuration_contract.mjs +27 -0
  119. package/dist/src/project/configuration_discovery.d.mts +7 -0
  120. package/dist/src/project/configuration_discovery.mjs +37 -0
  121. package/dist/src/project/configuration_normalization.d.mts +107 -0
  122. package/dist/src/project/configuration_normalization.mjs +302 -0
  123. package/dist/src/project/configuration_rendering.d.mts +14 -0
  124. package/dist/src/project/configuration_rendering.mjs +226 -0
  125. package/dist/src/project/configuration_resolution.d.mts +125 -0
  126. package/dist/src/project/configuration_resolution.mjs +81 -0
  127. package/dist/src/project/configuration_schema.d.mts +22 -0
  128. package/dist/src/project/configuration_schema.mjs +160 -0
  129. package/dist/src/project/configuration_validation.d.mts +22 -0
  130. package/dist/src/project/configuration_validation.mjs +136 -0
  131. package/dist/src/project/install_scaffold.d.mts +42 -0
  132. package/dist/src/project/install_scaffold.mjs +263 -0
  133. package/dist/src/project/project_detection.d.mts +14 -0
  134. package/dist/src/project/project_detection.mjs +47 -0
  135. package/dist/src/project/setup.d.mts +87 -0
  136. package/dist/src/project/setup.mjs +414 -0
  137. package/dist/src/project/support_report.d.mts +88 -0
  138. package/dist/src/project/support_report.mjs +83 -0
  139. package/dist/src/runtime/cleanup.d.mts +85 -0
  140. package/dist/src/runtime/cleanup.mjs +311 -0
  141. package/dist/src/runtime/lifecycle_engine.d.mts +63 -0
  142. package/dist/src/runtime/lifecycle_engine.mjs +114 -0
  143. package/dist/src/runtime/migration_history.d.mts +51 -0
  144. package/dist/src/runtime/migration_history.mjs +170 -0
  145. package/dist/src/runtime/plan.d.mts +134 -0
  146. package/dist/src/runtime/plan.mjs +637 -0
  147. package/dist/src/runtime/policy.d.mts +66 -0
  148. package/dist/src/runtime/policy.mjs +369 -0
  149. package/dist/src/runtime/restore.d.mts +22 -0
  150. package/dist/src/runtime/restore.mjs +276 -0
  151. package/dist/src/runtime/service_environment.d.mts +11 -0
  152. package/dist/src/runtime/service_environment.mjs +58 -0
  153. package/dist/src/runtime/topology.d.mts +51 -0
  154. package/dist/src/runtime/topology.mjs +128 -0
  155. package/dist/src/shared/diagnostics.d.mts +97 -0
  156. package/dist/src/shared/diagnostics.mjs +170 -0
  157. package/dist/src/shared/human_output.d.mts +2 -0
  158. package/{scripts/lib/rehearsal → dist/src/shared}/human_output.mjs +1 -3
  159. package/dist/src/shared/node_runtime.d.mts +14 -0
  160. package/dist/src/shared/node_runtime.mjs +25 -0
  161. package/dist/src/shared/operation_guard.d.mts +22 -0
  162. package/dist/src/shared/operation_guard.mjs +150 -0
  163. package/dist/src/shared/process_environment.d.mts +15 -0
  164. package/dist/src/shared/process_environment.mjs +50 -0
  165. package/dist/src/source/access.d.mts +165 -0
  166. package/dist/src/source/access.mjs +602 -0
  167. package/dist/src/source/asset_transfer.d.mts +27 -0
  168. package/dist/src/source/asset_transfer.mjs +202 -0
  169. package/dist/src/source/baseline.d.mts +66 -0
  170. package/dist/src/source/baseline.mjs +372 -0
  171. package/dist/src/source/external_reader.d.mts +42 -0
  172. package/dist/src/source/external_reader.mjs +278 -0
  173. package/dist/src/source/postgresql_access.d.mts +86 -0
  174. package/dist/src/source/postgresql_access.mjs +454 -0
  175. package/dist/src/source/privacy_paths.d.mts +10 -0
  176. package/dist/src/source/privacy_paths.mjs +27 -0
  177. package/dist/src/targets/driver.d.mts +2 -0
  178. package/dist/src/targets/driver.mjs +13 -0
  179. package/dist/src/targets/postgresql.d.mts +5 -0
  180. package/dist/src/targets/postgresql.mjs +620 -0
  181. package/dist/src/targets/supabase.d.mts +8 -0
  182. package/dist/src/targets/supabase.mjs +627 -0
  183. package/dist/src/targets/supabase_environment.d.mts +49 -0
  184. package/dist/src/targets/supabase_environment.mjs +162 -0
  185. package/dist/src/targets/target.d.mts +33 -0
  186. package/dist/src/targets/target.mjs +39 -0
  187. package/docs/README.md +40 -0
  188. package/docs/adapters.md +15 -6
  189. package/docs/architecture.md +183 -0
  190. package/docs/baselines.md +22 -1
  191. package/docs/commands.md +116 -16
  192. package/docs/configuration.md +314 -34
  193. package/docs/getting-started.md +77 -10
  194. package/docs/glossary.md +4 -0
  195. package/docs/index.md +48 -0
  196. package/docs/production-source.md +334 -33
  197. package/docs/releasing.md +24 -12
  198. package/docs/roadmap.md +40 -37
  199. package/docs/runtime-policies.md +264 -0
  200. package/docs/sanitization.md +592 -8
  201. package/docs/security-model.md +37 -8
  202. package/docs/stability.md +69 -0
  203. package/docs/standalone-workflow.md +130 -0
  204. package/docs/troubleshooting.md +88 -8
  205. package/docs/tutorial.md +7 -1
  206. package/docs/typescript.md +134 -0
  207. package/package.json +45 -27
  208. package/types/configuration.d.mts +5 -0
  209. package/scripts/lib/environment/local_supabase.mjs +0 -197
  210. package/scripts/lib/rehearsal/baseline_artifact.mjs +0 -565
  211. package/scripts/lib/rehearsal/baseline_builder.mjs +0 -160
  212. package/scripts/lib/rehearsal/baseline_preparation.mjs +0 -316
  213. package/scripts/lib/rehearsal/cleanup.mjs +0 -381
  214. package/scripts/lib/rehearsal/configuration.d.mts +0 -119
  215. package/scripts/lib/rehearsal/configuration.mjs +0 -847
  216. package/scripts/lib/rehearsal/diagnostics.mjs +0 -199
  217. package/scripts/lib/rehearsal/input_discovery.mjs +0 -155
  218. package/scripts/lib/rehearsal/migration_history.mjs +0 -220
  219. package/scripts/lib/rehearsal/plan.mjs +0 -685
  220. package/scripts/lib/rehearsal/policy_review.mjs +0 -92
  221. package/scripts/lib/rehearsal/process_environment.mjs +0 -64
  222. package/scripts/lib/rehearsal/runtime_restore.mjs +0 -314
  223. package/scripts/lib/rehearsal/sanitization_policy.mjs +0 -279
  224. package/scripts/lib/rehearsal/schema_snapshot.mjs +0 -113
  225. package/scripts/lib/rehearsal/service_environment.mjs +0 -82
  226. package/scripts/lib/rehearsal/setup.mjs +0 -379
  227. package/scripts/lib/rehearsal/support_report.mjs +0 -102
  228. package/scripts/lib/runtime/postgresql_runtime.mjs +0 -773
  229. package/scripts/lib/runtime/runtime_target.mjs +0 -66
  230. package/scripts/lib/runtime/supabase_runtime.mjs +0 -793
  231. package/scripts/operations/database/manage_rehearsal_database.mjs +0 -18
  232. package/scripts/operations/rehearsal/rehearsal_cli.mjs +0 -2169
package/CHANGELOG.md CHANGED
@@ -5,6 +5,358 @@ a Changelog, and versions will follow Semantic Versioning after the package exis
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## [0.1.0-rc.1] - 2026-10-08
9
+
10
+ ### Changed
11
+
12
+ - Promotes the exact beta.18 behavior and documented compatibility surface to the first
13
+ release candidate. No runtime, configuration, policy, CLI, or public TypeScript
14
+ capability changed after beta.18.
15
+ - Broad feature work is frozen while the release candidate completes two independent
16
+ Test Lab passes, one final package-only consumer upgrade, and its observation window.
17
+
18
+ ## [0.1.0-beta.18] - 2026-10-08
19
+
20
+ ### Added
21
+
22
+ - A concise stability contract now defines the supported public surface, defects that
23
+ block the first stable release, and the exact beta-to-RC-to-stable promotion gate.
24
+ - Automated release-policy tests cover beta, release-candidate, stable, malformed, and
25
+ mismatched GitHub release metadata.
26
+
27
+ ### Changed
28
+
29
+ - Protected OIDC publication now supports both prerelease and stable versions. Beta and
30
+ release-candidate versions update `beta`; once a stable version exists they cannot
31
+ replace `latest`. Stable publication updates `latest` without rewriting `beta`.
32
+ - npm channel selection lives only in the protected release workflow instead of static
33
+ package metadata, and missing beta.16 and beta.17 changelog comparisons are restored.
34
+ - Vitest's locked patch release is updated from 5.0.2 to 5.0.3 after the complete CI
35
+ matrix passed.
36
+
37
+ ## [0.1.0-beta.17] - 2026-10-08
38
+
39
+ ### Added
40
+
41
+ - `rehearsal identity connect` and the guided home screen now keep the sandbox app
42
+ available during ordinary provider sign-in, detect exactly one approved verified local
43
+ identity, show a redacted copied-account preview, and apply the existing exact claim
44
+ after one deliberate confirmation. The app is reopened automatically with an honest
45
+ fresh-session instruction; explicit `identity plan` and `identity claim` commands remain
46
+ available for scripts.
47
+
48
+ ## [0.1.0-beta.16] - 2026-10-08
49
+
50
+ ### Changed
51
+
52
+ - The CLI now routes guided and scripted requests through focused typed command
53
+ handlers and one result/output contract. The executable retains only process
54
+ lifecycle, project locking, guided-loop coordination, and top-level error handling;
55
+ command-session caches no longer live in public parsed flags.
56
+ - Configuration now passes through separate discovery, raw-schema validation,
57
+ normalization, project-root path resolution, project detection, and starter-rendering
58
+ modules behind the existing import path. Public declarations come from the same
59
+ TypeScript source, including the new `NormalizedRehearsalConfig` type.
60
+ - Installed-consumer verification now shares one scenario catalog, artifact installer,
61
+ isolated workspace boundary, process boundary, and persistent application-session
62
+ helper. The complete release gate runs every scenario against one immutable tarball
63
+ and records its exact version, SHA-256, tool environment, commands, timings, and
64
+ results.
65
+ - Identity policy validation, deterministic claim planning, SQL generation, local Auth
66
+ lookup, pure verification, and transactional execution now live in separate typed
67
+ stages behind the unchanged public claim API. Generated reference SQL is independently
68
+ testable, while only the executor can mutate the local database or Storage runtime.
69
+ - PostgreSQL and Supabase now share one typed runtime lifecycle engine for command
70
+ dispatch, active-baseline loading, migration confirmation and receipts, runtime
71
+ markers, and rollback. Candidate receipts are bound to their exact database target,
72
+ while each driver retains its own ownership proof and database-specific behavior.
73
+ - Privacy policy types, recipe normalization, dependency validation, deterministic
74
+ transforms, structured JSON, rule dispatch, row execution, and key handling now live
75
+ in focused typed stages behind the unchanged public privacy import. An explicit closed
76
+ registry covers every supported action and derivation without widening policy v2.
77
+
78
+ ## [0.1.0-beta.15] - 2026-10-08
79
+
80
+ ### Added
81
+
82
+ - A strict, no-emit TypeScript gate now checks the first shared runtime utilities and
83
+ verifies that consumers can compile against Rehearsal's public configuration types.
84
+ - The documentation site now explains the supported TypeScript surface with examples
85
+ that are compiled and checked against their rendered documentation source.
86
+ - All shipped implementation and executable-helper source now uses TypeScript. Clean
87
+ builds emit Node-compatible ESM and declarations into the reviewed package boundary,
88
+ and tests exercise that compiled output rather than an alternate source path.
89
+ - The published build omits repository-only JavaScript source maps while retaining
90
+ runtime JavaScript and declarations, keeping the installed package compact.
91
+
92
+ ### Fixed
93
+
94
+ - Packed onboarding chooses an available local port block for preserved configuration
95
+ fixtures, so unrelated running Rehearsal projects cannot make the isolation test fail.
96
+
97
+ ## [0.1.0-beta.14] - 2026-10-05
98
+
99
+ ### Added
100
+
101
+ - Packed-package onboarding is now a required CI job. It covers fresh Supabase and
102
+ PostgreSQL installs, beta.7 configuration preservation, missing credentials, occupied
103
+ ports, malformed configuration, and non-destructive partial-setup recovery.
104
+ - The independent test lab can run the same first-install boundary against an exact
105
+ candidate tarball before either database lifecycle.
106
+ - Installation and setup now report the exact active Rehearsal configuration path and
107
+ explain when a supported existing nested config prevents root-file generation.
108
+ - Packed-package onboarding covers fresh, nested, existing-root, and repeated installs
109
+ while proving reviewed configuration bytes are preserved.
110
+ - Privacy policy version 2 can explicitly treat nullable owners as non-matches and match
111
+ an approved owner through any of a bounded list of pseudonymized identity columns.
112
+ - Bounded JSON unions classify each permitted root type, while JSON dictionaries require
113
+ reviewed runtime-key formats, key actions, value recipes, and item/depth/byte limits.
114
+ - JSON dictionaries can restrict runtime keys to canonical signed integers within an
115
+ explicit safe-integer range, preserving positive, negative, and reviewed zero keys
116
+ without widening numeric maps to arbitrary text.
117
+ - Date shifting can explicitly preserve numeric epoch-millisecond representation,
118
+ including inside structured JSON, while sharing a stable grouped offset with related
119
+ epoch or ISO-string dates.
120
+ - Bounded scalar enums retain only explicitly reviewed structural strings, finite
121
+ numbers, or booleans inside ordinary fields and nested JSON declarations, rejecting
122
+ out-of-domain values without echoing them in diagnostics.
123
+ - Validated strings preserve bounded, case-sensitive structural codes from open domains
124
+ using a package-owned portable alphabet, refusing credential-shaped and malformed
125
+ text without consumer regexes, callbacks, or static identifier lists.
126
+ - Keyed hexadecimal and GTIN pseudonyms preserve reviewed database constraints, while
127
+ fixed-width digest recipes derive fingerprints only from explicitly named sanitized
128
+ columns and reject missing, excluded, duplicate, or cyclic inputs.
129
+ - A single GTIN recipe can declare reviewed `allowedLengths`, preserving each source
130
+ value's 8-, 12-, 13-, or 14-digit shape and check digit even inside structured JSON.
131
+ - Keyed URL pseudonyms replace private HTTPS URLs with deterministic, bounded HTTPS
132
+ loopback paths without retaining source hosts, paths, credentials, queries, or tokens.
133
+ - Bounded binding substitution can retain permitted surrounding text while replacing
134
+ exact occurrences of a reviewed UUID with its corresponding keyed UUID pseudonym.
135
+ - External PostgreSQL readers can declare a bounded exact allowlist of provider-owned
136
+ permission groups. Rehearsal verifies safe membership options, group attributes,
137
+ nesting, view ownership, and the complete effective privilege surface.
138
+
139
+ ### Documentation
140
+
141
+ - First-time users now have a short recovery table for interrupted setup, failed
142
+ upgrades, port conflicts, missing OAuth credentials, and low Docker capacity.
143
+ - The configuration guide documents a safe manual move to the project root, separating
144
+ config-file-relative JavaScript imports from project-root-relative Rehearsal paths.
145
+ - The sanitization guide documents nullable and multi-column ownership, heterogeneous
146
+ JSON values, runtime-keyed dictionaries, keyed HTTPS replacements, bounded identity
147
+ substitution, and their fail-closed boundaries.
148
+
149
+ ### Fixed
150
+
151
+ - Source preparation now stores and reads each target's access receipt and owner-only
152
+ reader credential under its configured baseline artifact directory. Nested and
153
+ multi-target state roots no longer collide, and retirement refuses a receipt from a
154
+ different target root.
155
+ - Supabase Storage source preparation now recursively traverses real folder placeholder
156
+ entries while keeping the approved prefix, path, depth, object-count, per-object, and
157
+ total-byte boundaries fail closed.
158
+ - Approved-owner selection now rejects non-finite numeric values in every declared
159
+ owner column before choosing a privacy branch, including when another column already
160
+ matches the approved owner.
161
+ - Pseudonymized canonical integer dictionary keys now share the same keyed identity
162
+ mapping as numeric columns and nested numeric values using the same namespace, so
163
+ runtime maps keep their reviewed cross-representation joins.
164
+ - External-reader membership mismatches now return a redacted, actionable source
165
+ authorization refusal instead of an internal-failure diagnostic.
166
+ - All external-reader privilege, expiration, readable-surface, and security-definer
167
+ denials now use the same `SOURCE_AUTHORIZATION_REFUSED` diagnostic and exit code 3.
168
+ - Identity claims now sequence PostgreSQL reads on their single transaction client,
169
+ avoiding deprecated overlapping queries and remaining compatible with pg 9.
170
+
171
+ ## [0.1.0-beta.13] - 2026-10-05
172
+
173
+ ### Added
174
+
175
+ - Runtime and CI compatibility now cover maintained Node.js 22, 24, and 26 releases;
176
+ Node.js 24 LTS remains the recommended default and release-build runtime.
177
+ - Source access policies can use an externally provisioned, database-expiring
178
+ PostgreSQL reader without administrator credentials. Rehearsal binds canonical export
179
+ view definitions, verifies the complete approved read surface and deny controls, and
180
+ never changes or retires provider-owned source objects.
181
+ - `rehearsal --version`, its conventional `-V` alias, and `rehearsal version` now
182
+ report the installed package version without requiring project configuration.
183
+ - Privacy policy version 2 can use one reviewed identity-aware path mapping for both
184
+ database references and physical Storage destinations. Owner prefixes stay in the
185
+ environment, review plans retain only their hashes, and unsafe or mismatched paths
186
+ fail closed.
187
+ - Related timestamps can share a named deterministic date-shift group, preserving their
188
+ ordering and duration without consumer callbacks.
189
+ - The baseline verification corpus now exercises two unrelated target schemas, a
190
+ 10,003-row packed-package stream, concurrent row/schema/ledger changes, malformed and
191
+ truncated results, connection loss, low disk, interruption, and deterministic
192
+ fixed-key output.
193
+
194
+ ### Fixed
195
+
196
+ - Baseline preparation now rejects missing, negative, overflowing, malformed, or
197
+ oversized PostgreSQL estimate and cursor results before activation. Every preparation
198
+ failure preserves the active baseline, removes private staging, and leaves an edited
199
+ runtime untouched.
200
+ - Approved-owner UUID columns are no longer confused with PostgreSQL sequence-backed
201
+ identities. Restore checks the actual local schema before resetting a sequence, while
202
+ genuine numeric identity columns retain correct next-value behavior.
203
+ - A failed Storage transfer now recursively restores write permission only within its
204
+ owned staging tree, removes that incomplete generation, and preserves the original
205
+ safe preparation error instead of replacing it with a cleanup error.
206
+ - Storage preparation now records a canonical media type from reviewed object metadata,
207
+ removing response-only parameters such as a text charset that local bucket MIME
208
+ allowlists reject during restore.
209
+ - Container startup and health failures are now classified as runtime dependency
210
+ failures and include safe Docker/Colima capacity context instead of being mislabeled
211
+ as migration verification failures.
212
+
213
+ ## [0.1.0-beta.12] - 2026-10-04
214
+
215
+ ### Added
216
+
217
+ - Supabase projects can declaratively configure local Google or GitHub OAuth in
218
+ `rehearsal.config.mjs`. Rehearsal derives the credential allowlist, injects only the
219
+ ignored owner-only environment values, and generates the exact loopback callback in
220
+ the disposable runtime without tracking secrets. Local signup requires an explicit
221
+ acknowledgment and is enabled only in that generated runtime copy.
222
+ - Branded, responsive documentation is now hosted on GitHub Pages with searchable
223
+ navigation, light and dark themes, and automatic deployment from `main`.
224
+ - The documentation home page and packaged README show the live monthly npm download
225
+ count and link directly to the npm package.
226
+ - Packed-package onboarding acceptance now proves both fresh root-config creation and a
227
+ real beta.11 upgrade that preserves the user's existing configuration byte for byte.
228
+
229
+ ### Changed
230
+
231
+ - The packaged README now links prominently to the hosted documentation, npm package,
232
+ and issue tracker. Package homepage metadata also points to the hosted documentation.
233
+ - GitHub Pages publishing uses the current Node.js 24 action generations without legacy
234
+ runtime warnings.
235
+ - `rehearsal init` now calls out important optional settings that are available but not
236
+ enabled before showing the current installed-release template.
237
+
238
+ ### Fixed
239
+
240
+ - Existing Google or GitHub provider sections can transition to declarative ownership
241
+ without editing the tracked Supabase template. Rehearsal replaces only a compatible
242
+ section in the disposable runtime copy, while `doctor` refuses ambiguous or
243
+ safety-weakening provider settings before reset.
244
+ - Multi-target plain-text plans now print each declarative OAuth callback, and `init`
245
+ advertises the declarative replacement even when a project still uses legacy provider
246
+ fields.
247
+
248
+ ## [0.1.0-beta.11] - 2026-10-03
249
+
250
+ ### Added
251
+
252
+ - Privacy policy version 2 now supports hashed approved-owner bindings, conditional
253
+ approved/other-owner transformations, bounded JSON arrays, nested recipes, and
254
+ explicitly optional object fields without consumer sanitizer callbacks.
255
+ - Local npm installs now create a validated, commented project-root
256
+ `rehearsal.config.mjs`, dedicated local runtime configuration, and additive safe ignore
257
+ entries when exactly one consumer application can be proven. Guided setup remains the
258
+ tested recovery path when lifecycle scripts are disabled or a workspace is ambiguous.
259
+ - Copied-account association accepts explicit verified-email provider allowlists and
260
+ hashed provider-subject matchers for supported Supabase identities. Google, GitHub,
261
+ and email sign-in now share one review-and-confirm claim workflow.
262
+
263
+ ### Changed
264
+
265
+ - Setup is idempotent, supported custom config paths are preserved, `.gitignore` updates
266
+ use an exclusive lock and atomic replacement, and `rehearsal init` shows the current
267
+ release template without replacing an existing config.
268
+
269
+ ### Fixed
270
+
271
+ - Identity plan JSON no longer serializes the raw approved email or provider subject;
272
+ only the environment-variable name and reviewed SHA-256 receipt leave the process.
273
+
274
+ ## [0.1.0-beta.10] - 2026-10-03
275
+
276
+ ### Added
277
+
278
+ - `rehearsal open` starts and verifies the configured runtime stack, launches the normal
279
+ application with declared local environment mappings, and keeps it available for
280
+ hands-on testing until interrupted.
281
+ - The guide now offers **Open the sandbox app** after a runtime exists.
282
+
283
+ ### Changed
284
+
285
+ - Persistent application sessions stop only their owned application process group on
286
+ `Ctrl+C`, `Ctrl+Z`, terminal close, or termination. The database and Storage runtime
287
+ stay running with local changes preserved across later sessions.
288
+
289
+ ### Fixed
290
+
291
+ - `rehearsal open` keeps interruption handling active throughout application teardown,
292
+ so an npm-forwarded `Ctrl+C` cannot terminate the CLI early or orphan the app.
293
+
294
+ ## [0.1.0-beta.9] - 2026-10-02
295
+
296
+ ### Added
297
+
298
+ - Primary configurations may declare isolated dependent database targets. Rehearsal
299
+ validates unique ownership boundaries, combines migration approval, orders lifecycle
300
+ actions, runs project-owned preparation and proofs, and previews cleanup across the
301
+ complete stack.
302
+ - A packed-package two-target PostgreSQL fixture proves source-to-read-model preparation,
303
+ positive and negative assertions, reverse shutdown, and exact cleanup without a
304
+ project-owned container engine.
305
+ - A separately opted-in, exact-digest PostgreSQL source-access lifecycle with scoped
306
+ temporary roles/views, deny checks, owner-only credentials, and exact retirement.
307
+ - Bounded coherent baseline refresh with executable privacy policy version 2, stable
308
+ keyed pseudonyms, atomic activation, capacity limits, and drift/interruption safety.
309
+ - Approved Supabase Storage inventory/transfer with bucket-prefix, size, path, version,
310
+ and exact-byte controls.
311
+ - Declarative runtime prerequisites and structural checks, plus exact local identity
312
+ association without application callback patches.
313
+ - Package-owned application startup, local environment mapping, readiness, child-process
314
+ teardown, and meaningful positive/negative HTTP proof orchestration.
315
+ - An exact-preview `refresh` command that builds a verified replacement first, resets the
316
+ complete local runtime stack, rolls back on runtime failure, and only then prunes the
317
+ specifically reviewed old baseline generations.
318
+
319
+ ### Changed
320
+
321
+ - Shipped source, runtime adapters, repository-only verification, and tests now use a
322
+ domain-based layout with documented placement rules and contract checks.
323
+ - Generated configs include a commented dependent-target example, and the documentation
324
+ explains that avoiding server errors is not a sufficient positive-path proof.
325
+ - Generated configs explain the optional standalone policy paths, direct local runtime
326
+ environment mappings, and application readiness contract.
327
+ - Source, privacy, runtime, identity, onboarding, and security documentation now describe
328
+ the package-owned declarative workflow and its separate authorization boundaries.
329
+
330
+ ### Fixed
331
+
332
+ - Supabase restores now install declared schemas and extensions before restoring
333
+ extension-dependent objects, preserve the original `public` schema privilege baseline,
334
+ and add declared triggers only after their functions exist.
335
+ - Supabase runtime environments now include a validated loopback-only database URL and
336
+ standard PostgreSQL variables for package-owned commands.
337
+ - Identity claims can safely replace complete signup defaults, require application role
338
+ references, remap declared text/JSONB and Storage object paths, and verify token-hook
339
+ claims while refusing edited or independent local account data.
340
+ - Baselines and restore checks now identify relations by schema and table, default old
341
+ records to `public`, and restore same-named tables in separate schemas independently.
342
+ - Identity claims can preserve immutable audit authorship while transferring the active
343
+ account, and retain only the synthetic Auth actor required by that history.
344
+ - Storage path transfer now copies through the local Supabase API, verifies exact bytes,
345
+ rolls back staged copies on database failure, and removes the old physical objects
346
+ only after the database commit succeeds.
347
+ - Identity Storage scopes now accept restored objects whose owner is unset, refuse
348
+ conflicting owners, and verify the destination owner before rewriting application
349
+ paths.
350
+ - Runtime-policy seeds may explicitly follow a named identity association, so later
351
+ verification checks the transferred key without recreating an obsolete placeholder
352
+ role.
353
+ - Failed project proofs always report their exit status and bounded output byte counts
354
+ without echoing arbitrary project logs.
355
+ - State-changing commands now use a project-wide operation lock and detect replacement
356
+ of the installed Rehearsal package while an operation is running.
357
+ - Identity claims now refuse to rewrite copied Storage paths when referenced physical
358
+ objects are missing.
359
+
8
360
  ## [0.1.0-beta.8] - 2026-10-02
9
361
 
10
362
  ### Fixed
@@ -202,7 +554,18 @@ a Changelog, and versions will follow Semantic Versioning after the package exis
202
554
  publication uses short-lived trusted OIDC, and every release tag must already exist on
203
555
  protected `main`.
204
556
 
205
- [Unreleased]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.8...HEAD
557
+ [Unreleased]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-rc.1...HEAD
558
+ [0.1.0-rc.1]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.18...v0.1.0-rc.1
559
+ [0.1.0-beta.18]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.17...v0.1.0-beta.18
560
+ [0.1.0-beta.17]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.16...v0.1.0-beta.17
561
+ [0.1.0-beta.16]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.15...v0.1.0-beta.16
562
+ [0.1.0-beta.15]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.14...v0.1.0-beta.15
563
+ [0.1.0-beta.14]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.13...v0.1.0-beta.14
564
+ [0.1.0-beta.13]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.12...v0.1.0-beta.13
565
+ [0.1.0-beta.12]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.11...v0.1.0-beta.12
566
+ [0.1.0-beta.11]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.10...v0.1.0-beta.11
567
+ [0.1.0-beta.10]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.9...v0.1.0-beta.10
568
+ [0.1.0-beta.9]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.8...v0.1.0-beta.9
206
569
  [0.1.0-beta.8]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.7...v0.1.0-beta.8
207
570
  [0.1.0-beta.7]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.6...v0.1.0-beta.7
208
571
  [0.1.0-beta.6]: https://github.com/Ddupasquier/rehearsal-db/compare/v0.1.0-beta.5...v0.1.0-beta.6
package/COMPATIBILITY.md CHANGED
@@ -21,7 +21,34 @@ The first stable `1.0.0` requires external beta evidence, a support policy, and
21
21
  public API. Supporting additional database families, package managers, or operating
22
22
  systems is not implied by the 0.x contract.
23
23
 
24
+ Rehearsal supports maintained even-numbered Node.js release lines that pass its CI
25
+ matrix. Beta.13 supports Node.js 22, 24, and 26; Node.js 24 LTS is the recommended
26
+ default and the release-build runtime. End-of-life and odd-numbered Node.js releases are
27
+ not supported. A future release may remove a Node.js line after its upstream end-of-life
28
+ date, with that change called out in the changelog.
29
+
30
+ The npm install hook may create project scaffolding only when it proves one application
31
+ root. Ordinary npm application installs are covered. A workspace is automatic only when
32
+ one declaring consumer is already visible in its manifest or lockfile; npm can save a
33
+ new `--workspace` declaration after dependency hooks run, so a first workspace install
34
+ may use the guided fallback. pnpm and Yarn install layouts are not yet an
35
+ automatic-generation contract. Run `npx rehearsal` from the application directory for
36
+ all skipped cases. Global, cache, temporary `npx`, and ambiguous multi-application
37
+ workspace installs do not receive files.
38
+
24
39
  The PostgreSQL target covers timestamped SQL migrations running in a dedicated local
25
- `postgres` Docker image. It does not imply support for hosted connection strings,
26
- existing unmanaged servers, ORM-specific nested migration formats, Supabase Storage, or
27
- Supabase Auth emulation.
40
+ `postgres` Docker image. Runtime commands reject hosted connection strings and existing
41
+ unmanaged servers. The separately opted-in PostgreSQL preparation boundary may use a
42
+ reviewed, short-lived source reader; this does not make a hosted database a runtime
43
+ target. ORM-specific nested migration formats remain unsupported. Supabase Storage and
44
+ Auth behavior apply only to the Supabase runtime.
45
+
46
+ A primary config may declare flat dependent PostgreSQL or Supabase targets. Each target
47
+ must have its own complete config, immutable baseline, project ID, ports, environment
48
+ file, and artifact directory. Nested dependency graphs and shared runtime ownership are
49
+ not supported.
50
+
51
+ Executable privacy policy version 2, source-access policy version 1, runtime policy
52
+ version 1, and identity policy version 1 are strict declarative contracts. Unknown
53
+ fields fail closed. They do not imply support for arbitrary transformations, SQL,
54
+ provider administration, consent decisions, or every PostgreSQL extension.
package/README.md CHANGED
@@ -1,18 +1,28 @@
1
1
  # Rehearsal
2
2
 
3
+ [![Monthly npm downloads](https://img.shields.io/npm/dm/%40rehearsal-db%2Fcore?style=flat-square&logo=npm&logoColor=white&label=npm%20downloads&labelColor=1c2a34&color=287b5c)](https://www.npmjs.com/package/@rehearsal-db/core)
4
+
5
+ [Read the documentation](https://ddupasquier.github.io/rehearsal-db/) · [View on npm](https://www.npmjs.com/package/@rehearsal-db/core) · [Report a problem](https://github.com/Ddupasquier/rehearsal-db/issues)
6
+
3
7
  Rehearsal tests PostgreSQL and Supabase migrations on your computer before you run them
4
8
  anywhere important. It restores safe test data into a disposable local database, applies
5
9
  only the migrations you approve, and runs your project's own test command.
6
10
 
7
- Rehearsal never connects to a hosted database. It is a migration-testing tool, not a
8
- backup system or a production deployment tool.
11
+ Projects with a separate publication or read-model database can declare it as a
12
+ dependent target. Rehearsal then manages the complete isolated runtime stack.
13
+
14
+ Normal rehearsal commands never connect to a hosted database. An optional, separately
15
+ approved preparation workflow can create a short-lived read-only export surface, stream
16
+ it through a reviewed privacy policy, and retire the access again. It is never part of
17
+ `run`, `reset`, `migrate`, or application launch. Rehearsal is not a backup system or a
18
+ production deployment tool.
9
19
 
10
20
  > Rehearsal is in public beta. Use it on a branch and keep a working backup of your
11
21
  > project.
12
22
 
13
23
  ## What you need
14
24
 
15
- - Node.js 24 and npm
25
+ - Node.js 22, 24, or 26 and npm (Node.js 24 LTS recommended)
16
26
  - Docker Desktop, Colima, or another Docker-compatible engine
17
27
  - timestamped `.sql` migration files
18
28
  - a project test command that can prove the migrated application works
@@ -31,11 +41,17 @@ npm install --save-dev @rehearsal-db/core@beta
31
41
  npx rehearsal
32
42
  ```
33
43
 
34
- The first run detects your project and offers to create a commented
35
- `rehearsal.config.mjs` with the project name, migration paths, commands, ports, and safe
36
- defaults already filled in. Choose **Set the stage**, select Supabase or PostgreSQL,
37
- review the preview, and confirm the files it will create. Existing files are never
38
- overwritten.
44
+ For an ordinary npm application install, Rehearsal safely creates a commented
45
+ `rehearsal.config.mjs` in the project root, adds only its local-artifact entries to
46
+ `.gitignore`, and prepares the isolated local runtime configuration. It detects the
47
+ project name, database target, migration paths, commands, and free ports. Review lines
48
+ marked `CHECK`, then open the guide. Existing files are never overwritten. If a supported
49
+ root or nested config already exists, Rehearsal reports that active path and does not
50
+ create a competing file; see [Configuration](docs/configuration.md#workspaces-and-custom-paths).
51
+
52
+ If install scripts are disabled or the workspace root is ambiguous, installation makes
53
+ no guess. Run `npx rehearsal` inside the application and choose **Set the stage** for the
54
+ same previewed setup.
39
55
 
40
56
  For PostgreSQL, download the reviewed local image once before running the guide:
41
57
 
@@ -45,6 +61,11 @@ docker pull postgres:17-alpine
45
61
 
46
62
  Rehearsal itself never downloads a database image during a rehearsal.
47
63
 
64
+ For local Google or GitHub sign-in, the generated config includes a commented
65
+ `supabase.authentication` example. It names an ignored owner-only credential file;
66
+ Rehearsal generates the provider block and local callback inside the disposable runtime.
67
+ See [Supabase authentication](docs/configuration.md#supabase-authentication).
68
+
48
69
  ## Three terms you will see
49
70
 
50
71
  - **Baseline:** a locked, safe starting copy of your schema and test data.
@@ -52,16 +73,28 @@ Rehearsal itself never downloads a database image during a rehearsal.
52
73
  - **Runtime:** the disposable local database where the rehearsal happens.
53
74
 
54
75
  The baseline may contain synthetic data or properly sanitized production-shaped data.
55
- Start with synthetic data. Rehearsal does not copy or sanitize production data for you.
76
+ Start with synthetic data. Real source preparation is opt-in and requires separate
77
+ source-owner approval; see [Standalone workflow](docs/standalone-workflow.md).
56
78
 
57
79
  ## The normal workflow
58
80
 
59
81
  1. Run `npx rehearsal`.
60
- 2. Let the guide create the local-only configuration.
82
+ 2. Review the generated local-only configuration, or let the guide create it when the
83
+ install hook safely skipped it.
61
84
  3. Review the sanitization policy and create the baseline.
62
85
  4. Review the exact candidate migration list.
63
86
  5. Run the rehearsal and your application proof.
64
- 6. Test the local application, then verify, reset, stop, or discard the runtime.
87
+ 6. Choose **Open the sandbox app** for hands-on testing, then verify, reset, stop, or
88
+ discard the runtime.
89
+
90
+ `npx rehearsal open` starts and verifies the existing local runtime, keeps the configured
91
+ app available until you press `Ctrl+C`, and preserves database and Storage changes for
92
+ the next session.
93
+
94
+ For an approved production-shaped copy, the optional sequence is `source plan`, `source
95
+ apply`, `refresh`, and `source retire`. `refresh` verifies the replacement before it
96
+ resets the local runtime or removes an old copy. Every source-side or identity change has
97
+ its own exact confirmation digest.
65
98
 
66
99
  When local disk space gets tight, choose **Clean up disk space** in the guide. Rehearsal
67
100
  previews old baseline generations first and keeps runtime or shared-image removal
@@ -85,15 +118,16 @@ loads.
85
118
 
86
119
  ## Supported today
87
120
 
88
- | Environment | Support |
89
- | ------------------------------------------- | ---------------------- |
90
- | Supabase CLI projects | Supported |
91
- | Ordinary PostgreSQL in local Docker | Supported |
92
- | macOS and Linux | Supported |
93
- | WSL | Experimental |
94
- | Native Windows | Not yet supported |
95
- | Hosted database URLs | Intentionally rejected |
96
- | MySQL, MongoDB, and other database families | Not yet supported |
121
+ | Environment | Support |
122
+ | ------------------------------------------------ | ---------------------- |
123
+ | Supabase CLI projects | Supported |
124
+ | Ordinary PostgreSQL in local Docker | Supported |
125
+ | macOS and Linux | Supported |
126
+ | WSL | Experimental |
127
+ | Native Windows | Not yet supported |
128
+ | Hosted database URLs | Intentionally rejected |
129
+ | Optional read-only PostgreSQL source preparation | Explicit opt-in beta |
130
+ | MySQL, MongoDB, and other database families | Not yet supported |
97
131
 
98
132
  See [COMPATIBILITY.md](COMPATIBILITY.md) for the exact support contract.
99
133
 
@@ -101,6 +135,7 @@ See [COMPATIBILITY.md](COMPATIBILITY.md) for the exact support contract.
101
135
 
102
136
  Start here:
103
137
 
138
+ - [Documentation home](docs/index.md) — choose the shortest path for your goal
104
139
  - [Getting started](docs/getting-started.md) — set up your own project
105
140
  - [Safe hands-on tutorial](docs/tutorial.md) — try the full flow in a disposable project
106
141
  - [Troubleshooting](docs/troubleshooting.md) — fix common setup problems
@@ -110,12 +145,17 @@ Reference:
110
145
 
111
146
  - [CLI commands](docs/commands.md)
112
147
  - [Configuration](docs/configuration.md)
148
+ - [TypeScript types](docs/typescript.md)
113
149
  - [Baselines](docs/baselines.md)
114
150
  - [Sanitization](docs/sanitization.md)
115
151
  - [Security model](docs/security-model.md)
116
152
  - [Project adapters](docs/adapters.md)
117
153
  - [Production data boundary](docs/production-source.md)
118
- - [Glossary and architecture](docs/glossary.md)
154
+ - [Standalone workflow and security gates](docs/standalone-workflow.md)
155
+ - [Runtime and local identity policies](docs/runtime-policies.md)
156
+ - [Glossary](docs/glossary.md)
157
+ - [Repository architecture](docs/architecture.md)
158
+ - [Stability and the first stable release](docs/stability.md)
119
159
  - [Release process](docs/releasing.md)
120
160
 
121
161
  ## Getting support
@@ -133,13 +173,20 @@ problems belong in the private process described in [SECURITY.md](SECURITY.md).
133
173
 
134
174
  ## For contributors
135
175
 
136
- Use Node.js 24, run `npm ci`, then run:
176
+ Use a supported Node.js release (22, 24, or 26), run `npm ci`, then run:
137
177
 
138
178
  ```bash
139
179
  npm run check
180
+ npm run test:fixture:standalone
140
181
  npm run test:fixture:postgresql
141
182
  npm run test:fixture
142
183
  ```
143
184
 
144
185
  The fixture commands install the packed package into clean synthetic projects. They do
145
186
  not connect to hosted services. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full rules.
187
+
188
+ Preview the styled documentation site locally with:
189
+
190
+ ```bash
191
+ npm run docs:preview
192
+ ```