@rehearsal-db/core 0.1.0-beta.9 → 0.1.0-rc.2

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 (247) hide show
  1. package/CHANGELOG.md +319 -1
  2. package/COMPATIBILITY.md +15 -0
  3. package/README.md +73 -16
  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/{scripts → dist/scripts}/runtime/manage_database.mjs +6 -8
  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 +228 -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 +640 -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/{src → 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 +629 -0
  183. package/dist/src/targets/supabase_environment.d.mts +54 -0
  184. package/dist/src/targets/supabase_environment.mjs +184 -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 +35 -16
  188. package/docs/architecture.md +135 -10
  189. package/docs/commands.md +53 -15
  190. package/docs/configuration.md +186 -31
  191. package/docs/getting-started.md +66 -9
  192. package/docs/index.md +67 -0
  193. package/docs/production-source.md +175 -17
  194. package/docs/releasing.md +24 -12
  195. package/docs/roadmap.md +3 -2
  196. package/docs/runtime-lifecycle.md +99 -0
  197. package/docs/runtime-policies.md +80 -7
  198. package/docs/sanitization.md +572 -4
  199. package/docs/security-model.md +8 -0
  200. package/docs/stability.md +70 -0
  201. package/docs/standalone-workflow.md +36 -13
  202. package/docs/troubleshooting.md +82 -10
  203. package/docs/tutorial.md +7 -1
  204. package/docs/typescript.md +134 -0
  205. package/package.json +44 -29
  206. package/types/configuration.d.mts +5 -0
  207. package/src/README.md +0 -17
  208. package/src/application/session.mjs +0 -313
  209. package/src/baseline/artifact.mjs +0 -661
  210. package/src/baseline/builder.mjs +0 -164
  211. package/src/baseline/input_discovery.mjs +0 -155
  212. package/src/baseline/policy_review.mjs +0 -92
  213. package/src/baseline/preparation.mjs +0 -323
  214. package/src/baseline/privacy_engine.mjs +0 -413
  215. package/src/baseline/sanitization_policy.mjs +0 -299
  216. package/src/baseline/schema_snapshot.mjs +0 -113
  217. package/src/cli/arguments.mjs +0 -120
  218. package/src/cli/guided.mjs +0 -807
  219. package/src/cli/rehearsal.mjs +0 -933
  220. package/src/cli/renderers.mjs +0 -584
  221. package/src/cli/runtime_commands.mjs +0 -553
  222. package/src/cli/source_commands.mjs +0 -326
  223. package/src/cli/terminal.mjs +0 -275
  224. package/src/identity/claim.mjs +0 -975
  225. package/src/identity/storage.mjs +0 -165
  226. package/src/project/configuration.d.mts +0 -153
  227. package/src/project/configuration.mjs +0 -1197
  228. package/src/project/setup.mjs +0 -379
  229. package/src/project/support_report.mjs +0 -105
  230. package/src/runtime/cleanup.mjs +0 -381
  231. package/src/runtime/migration_history.mjs +0 -220
  232. package/src/runtime/plan.mjs +0 -685
  233. package/src/runtime/policy.mjs +0 -438
  234. package/src/runtime/restore.mjs +0 -329
  235. package/src/runtime/service_environment.mjs +0 -82
  236. package/src/runtime/topology.mjs +0 -177
  237. package/src/shared/diagnostics.mjs +0 -199
  238. package/src/shared/operation_guard.mjs +0 -162
  239. package/src/shared/process_environment.mjs +0 -68
  240. package/src/source/access.mjs +0 -578
  241. package/src/source/asset_transfer.mjs +0 -177
  242. package/src/source/baseline.mjs +0 -446
  243. package/src/source/postgresql_access.mjs +0 -480
  244. package/src/targets/postgresql.mjs +0 -808
  245. package/src/targets/supabase.mjs +0 -830
  246. package/src/targets/supabase_environment.mjs +0 -229
  247. package/src/targets/target.mjs +0 -66
@@ -8,16 +8,18 @@ The optional preparation workflow is a separate security boundary. It has
8
8
  three deliberately separate phases:
9
9
 
10
10
  1. `source plan` reads declarations and produces a redacted, exact plan.
11
- 2. `source apply` requires the plan digest and source-owner credentials from a
12
- named environment variable. It creates only the declared, time-limited
13
- reader and export surface.
11
+ 2. `source apply` requires the plan digest. Managed mode uses source-owner credentials
12
+ from a named environment variable and creates only the declared, time-limited reader
13
+ and export surface. External mode verifies an already restricted reader without an
14
+ administrator credential or source-side writes.
14
15
  3. `refresh` uses that reader in a read-only repeatable-read transaction, builds
15
16
  privately, activates only after verification, resets the local runtime, and applies
16
17
  reviewed retention. `baseline refresh` is the lower-level baseline-only form.
17
18
 
18
- `source retire` has its own preview and digest. It removes only the exact
19
- reader and export objects Rehearsal recorded. It never searches for similarly
20
- named roles or removes unrelated grants.
19
+ `source retire` has its own preview and digest. Managed mode removes only the exact
20
+ reader and export objects Rehearsal recorded. External mode removes only local Rehearsal
21
+ credentials and receipts, preserving provider-owned objects. It never searches for
22
+ similarly named roles or removes unrelated grants.
21
23
 
22
24
  ## What belongs in declarations
23
25
 
@@ -28,6 +30,8 @@ name:
28
30
  - whether rows are approved public data or belong to one explicitly approved
29
31
  owner;
30
32
  - privacy actions and bounded transformation recipes;
33
+ - hashed server-side owner bindings and explicit approved/other-owner branches;
34
+ - bounded nested JSON objects and arrays with required/optional fields;
31
35
  - licensed or consented Storage buckets and prefixes;
32
36
  - schema and extension prerequisites;
33
37
  - local identities and reference locations;
@@ -44,9 +48,16 @@ separate. A declaration contains only the name of an environment variable or
44
48
  owner-only secret file. Rehearsal never puts credential values in command-line
45
49
  arguments, reports, baselines, receipts, or a launched application.
46
50
 
47
- The current workflow creates and verifies its own temporary PostgreSQL reader. An
48
- externally provisioned reader is not yet accepted because Rehearsal cannot currently
49
- prove that reader's complete scope and retirement behavior.
51
+ The default managed workflow creates and verifies its own temporary PostgreSQL reader.
52
+ External mode accepts a provider-managed reader only when its complete non-system
53
+ readable-column surface exactly matches the reviewed export views and migration ledger.
54
+ It also verifies canonical view-definition fingerprints, `security_barrier`, ownership,
55
+ write denial, security-definer denial, and a short database-enforced expiration. An
56
+ external login can declare a bounded exact list of provider-owned permission groups;
57
+ each must be non-login, non-privileged, directly inherited, unable to be assumed or
58
+ delegated, and free of nested membership. Undeclared or unsafe role membership fails as
59
+ an actionable source-authorization refusal. Rehearsal never claims ownership or
60
+ revocation of provider-managed objects.
50
61
 
51
62
  ## Snapshot and privacy guarantees
52
63
 
@@ -55,16 +66,28 @@ read-only repeatable-read PostgreSQL transaction. Rehearsal rechecks the source
55
66
  identity and migration evidence before commit. Rows stream in bounded batches;
56
67
  record bodies never appear in progress or error output.
57
68
 
69
+ The snapshot boundary is deliberate: row commits made after extraction starts are left
70
+ for the next baseline, while concurrent schema or migration-ledger changes block the
71
+ current activation. Invalid estimates, malformed batches, connection loss, interruption,
72
+ and disk or configured-limit failures remove private staging and preserve the previously
73
+ active baseline.
74
+
75
+ Cleanup recursively makes only Rehearsal's private staging tree removable. A failed
76
+ Storage transfer therefore reports the original safe transfer error, removes incomplete
77
+ files, and does not alter the active generation.
78
+
58
79
  Storage objects do not share the database transaction guarantee. Their inventory records
59
80
  size and version metadata; transfer requires that version, verifies the exact byte count,
60
81
  and records a SHA-256 in the immutable baseline. Transfer refuses an object that changes,
61
82
  exceeds its declared limit, or falls outside an approved bucket and prefix.
62
83
 
63
84
  Privacy policy version 2 is executable without project sanitizer code. It
64
- supports exact keep, exclusion, keyed pseudonyms, constants, and a small set of
65
- documented derivations. Policies classify every selected field and supported
66
- nested JSON key. A new or unknown field blocks refresh until the policy is
67
- reviewed again.
85
+ supports exact keep, exclusion, keyed and constraint-preserving pseudonyms (including
86
+ safe loopback HTTPS replacements), bounded reviewed-identity substitution inside
87
+ retained text,
88
+ constants, named sanitized-input digests, and a small set of documented
89
+ derivations. Policies classify every selected field and supported nested JSON
90
+ key. A new or unknown field blocks refresh until the policy is reviewed again.
68
91
 
69
92
  The pseudonym key is an owner-only local secret. It is not stored in the
70
93
  baseline or source control. Receipts bind the policy bytes, schema shape,
@@ -11,23 +11,42 @@ Doctor names each missing or unsafe item. If you still need help, run
11
11
 
12
12
  ## `npx rehearsal` cannot find the command
13
13
 
14
- Confirm you are in the project directory and install the beta locally:
14
+ Confirm you are in the project directory and install the current release locally:
15
15
 
16
16
  ```bash
17
- npm install --save-dev @rehearsal-db/core@beta
17
+ npm install --save-dev @rehearsal-db/core
18
18
  npx rehearsal --help
19
19
  ```
20
20
 
21
21
  Do not use `sudo` or require a global install.
22
22
 
23
- ## Setup says Node.js 24 is required
23
+ ## Installation did not create `rehearsal.config.mjs`
24
24
 
25
- Rehearsal intentionally supports one maintained Node.js major in its first beta. Switch
26
- the current shell before installing or running it. With nvm:
25
+ Rehearsal intentionally skips automatic creation when install scripts are disabled, the
26
+ install is global or temporary, or more than one workspace application could own the
27
+ config. From the intended application directory, run:
27
28
 
28
29
  ```bash
29
- nvm install 24
30
- nvm use 24
30
+ npx rehearsal
31
+ ```
32
+
33
+ Choose **Set the stage** and approve the preview. For pnpm and Yarn, use this guided path;
34
+ automatic root generation is currently tested with npm. An existing supported config is
35
+ kept in place, including `infrastructure/rehearsal/rehearsal.config.mjs`. When npm shows
36
+ lifecycle output, the install message names the active path and explains when that
37
+ existing file prevented `rehearsal.config.mjs` from being generated. You can always run
38
+ `npx rehearsal init --json` and read `data.destination`. To relocate it safely, follow
39
+ [Move an existing config to the project root](configuration.md#move-an-existing-config-to-the-project-root).
40
+
41
+ ## Setup says this Node.js version is unsupported
42
+
43
+ Rehearsal supports the maintained Node.js 22, 24, and 26 release lines. Node.js 20 and
44
+ odd-numbered releases are end-of-life. Switch the current shell before installing or
45
+ running Rehearsal. The latest LTS is the recommended default:
46
+
47
+ ```bash
48
+ nvm install --lts
49
+ nvm use --lts
31
50
  node --version
32
51
  ```
33
52
 
@@ -39,6 +58,12 @@ writes setup files.
39
58
  Start Docker Desktop or Colima, confirm `docker info`, then rerun `rehearsal doctor`.
40
59
  Restarting the computer is rarely necessary.
41
60
 
61
+ When a container stays in `starting` or becomes `unhealthy`, Rehearsal reports a runtime
62
+ dependency failure rather than a migration failure. The safe diagnostic includes Docker
63
+ CPU, memory, and container counts; Colima also includes available VM memory when it can
64
+ be read. Stop unrelated local stacks or increase the engine's resources before retrying.
65
+ Rehearsal never changes engine settings or bypasses service health checks.
66
+
42
67
  ## Docker or Colima is out of disk space
43
68
 
44
69
  Preview what Rehearsal can safely remove:
@@ -122,11 +147,58 @@ starts. Give the configured `startCommand` or framework test mode an explicit sa
122
147
  override for the affected value. Do not delete or rewrite a developer's normal `.env`
123
148
  file as part of a rehearsal.
124
149
 
150
+ ## `rehearsal open` cannot start the app
151
+
152
+ `open` requires `application.readiness` in `rehearsal.config.mjs`. Confirm that its URL
153
+ uses `localhost`, `127.0.0.1`, or `::1`, matches the app's sandbox port, and returns the
154
+ configured status after startup. Rehearsal leaves the verified database runtime running
155
+ when application startup fails, so retrying does not discard local database or Storage
156
+ changes.
157
+
125
158
  ## Local authentication fails
126
159
 
127
- Confirm the provider is enabled in the dedicated local Supabase config, the allowlisted
128
- service environment file exists with owner-only permissions, and the provider callback
129
- is the local Auth callback. Do not paste provider secrets into config or terminal output.
160
+ For Google or GitHub, confirm `supabase.authentication` is declared in
161
+ `rehearsal.config.mjs`, its ignored environment file exists with `chmod 600`, and the
162
+ provider has the printed local Auth callback registered. Rehearsal generates the
163
+ disposable Supabase provider block.
164
+
165
+ When migrating from the legacy service environment fields, replace those fields together
166
+ with `supabase.authentication` and rerun `rehearsal doctor`. A compatible Google or
167
+ GitHub provider section may remain in the tracked template: Rehearsal supersedes it only
168
+ inside the generated runtime copy. Doctor refuses unknown provider settings, duplicate
169
+ or nested provider sections, and nonce or optional-email settings that do not match the
170
+ new declaration. Keep both options false unless there is a reviewed provider-specific
171
+ need; skipping nonce validation reduces replay protection. Otherwise keep using the
172
+ documented legacy configuration.
173
+ Never paste provider secrets into tracked config or terminal output.
174
+
175
+ For the shortest supported copied-account flow, run:
176
+
177
+ ```bash
178
+ npx rehearsal identity connect
179
+ ```
180
+
181
+ Leave that terminal open, then sign in through the sandbox application normally. Rehearsal
182
+ waits for one verified match and shows a redacted plan before it changes anything. If it
183
+ keeps waiting, finish the provider callback and confirm the reviewed matcher environment
184
+ value is available in the terminal that started Rehearsal. `Ctrl+C`, `Ctrl+Z`, or choosing
185
+ **Not now** stops only the owned application and leaves the database unchanged.
186
+
187
+ After a successful connection, sign out and sign in once so the application receives
188
+ fresh role claims. Rehearsal remembers the connection in the current disposable runtime;
189
+ `reset` deliberately removes that receipt, so the next copied-account connection requires
190
+ review again.
191
+
192
+ If `identity plan` refuses the matcher, read the message literally:
193
+
194
+ - **Provider or matcher type is unsupported:** use only the combinations documented in
195
+ [Runtime and identity policies](runtime-policies.md).
196
+ - **No verified identity matches:** complete an ordinary local sign-in, confirm the
197
+ correct environment value is present, then run the plan again.
198
+ - **More than one identity matches:** narrow the provider allowlist or use a hashed
199
+ provider-subject matcher. Rehearsal will not guess between accounts.
200
+ - **Provider subject conflicts:** the local Auth identity disagrees with itself; remove
201
+ and recreate that disposable local sign-in instead of forcing a claim.
130
202
 
131
203
  ## Runtime changes disappeared
132
204
 
package/docs/tutorial.md CHANGED
@@ -3,7 +3,8 @@
3
3
  This tutorial runs a complete PostgreSQL rehearsal in a temporary fictional project. It
4
4
  does not use your application, production data, or a hosted database.
5
5
 
6
- Allow about five minutes. You need Node.js 24 and a running Docker-compatible engine.
6
+ Allow about five minutes. You need Node.js 22, 24, or 26 and a running
7
+ Docker-compatible engine. Node.js 24 LTS is recommended.
7
8
 
8
9
  ## 1. Prepare Rehearsal
9
10
 
@@ -105,3 +106,8 @@ npm run test:fixture
105
106
  ```
106
107
 
107
108
  The PostgreSQL equivalent is `npm run test:fixture:postgresql`.
109
+
110
+ The release workflow also runs `npm run test:fixture:onboarding` from the packed package.
111
+ That check creates fresh Supabase and PostgreSQL consumers, verifies beta configuration
112
+ preservation, and exercises safe refusal and recovery for partial setup, occupied ports,
113
+ malformed configuration, and missing credentials.
@@ -0,0 +1,134 @@
1
+ # TypeScript
2
+
3
+ Rehearsal includes types for its documented public APIs. TypeScript is optional: the CLI and the
4
+ generated `rehearsal.config.mjs` work in JavaScript, TypeScript, CommonJS, and ESM
5
+ applications.
6
+
7
+ ## Type-check the generated config
8
+
9
+ Keep the generated configuration as `.mjs`. The `// @ts-check` line and
10
+ `defineRehearsalConfig` provide editor feedback without adding a build step or asking
11
+ Node.js to execute a TypeScript config file.
12
+
13
+ <!-- checked-example: javascript-config -->
14
+
15
+ ```js
16
+ // @ts-check
17
+ import { defineRehearsalConfig } from "@rehearsal-db/core";
18
+
19
+ export default defineRehearsalConfig({
20
+ schemaVersion: 1,
21
+ project: { name: "example-postgresql-app" },
22
+ postgresql: { migrationDirectory: "migrations" },
23
+ baseline: {
24
+ sanitizationPolicy: "rehearsal/sanitization-policy.json",
25
+ },
26
+ application: {
27
+ startCommand: "npm run dev",
28
+ proofCommand: "npm test",
29
+ },
30
+ runtime: {
31
+ target: "postgresql",
32
+ databasePort: 55432,
33
+ },
34
+ });
35
+ ```
36
+
37
+ This catches misspelled keys, missing required values, invalid runtime targets, and wrong
38
+ value types before Rehearsal starts. Runtime validation remains authoritative and still
39
+ fails closed when a configuration is unsafe.
40
+
41
+ ## Import the public types
42
+
43
+ Application tooling may import types from the package root. Type-only imports disappear
44
+ from compiled JavaScript and do not start Rehearsal.
45
+
46
+ <!-- checked-example: type-usage -->
47
+
48
+ ```ts
49
+ import type {
50
+ NormalizedRehearsalConfig,
51
+ RehearsalConfig,
52
+ RehearsalConfigVersion,
53
+ } from "@rehearsal-db/core";
54
+
55
+ export const schemaVersion: RehearsalConfigVersion = 1;
56
+
57
+ export const application = {
58
+ startCommand: "npm run dev",
59
+ proofCommand: "npm test",
60
+ } satisfies RehearsalConfig["application"];
61
+
62
+ export const localDatabasePort = (config: NormalizedRehearsalConfig): number =>
63
+ config.runtime.ports.database;
64
+ ```
65
+
66
+ ## Exported configuration types
67
+
68
+ | Export | Meaning |
69
+ | --------------------------- | ------------------------------------------------------------------------- |
70
+ | `RehearsalConfigVersion` | The supported configuration format. It is currently the literal type `1`. |
71
+ | `RehearsalConfig` | The reviewed input shape of `rehearsal.config.mjs`. |
72
+ | `NormalizedRehearsalConfig` | The immutable, defaulted configuration returned by Rehearsal's loader. |
73
+ | `defineRehearsalConfig()` | Checks a config while preserving its more specific inferred value types. |
74
+
75
+ Nested sections are available through indexed access types such as
76
+ `RehearsalConfig["application"]`, `RehearsalConfig["runtime"]`, and
77
+ `RehearsalConfig["safety"]`. The [configuration reference](configuration.md) explains
78
+ what each setting does and remains the source of truth for runtime behavior.
79
+
80
+ ## Type reviewed privacy policies
81
+
82
+ The advanced privacy entry point exports the normalized policy, table, column, engine,
83
+ foreign-key, and source-record types emitted from the same implementation used for
84
+ runtime validation. Keep policy input as ordinary JSON-compatible data and use the
85
+ validator's typed return value; runtime validation remains the authority for untrusted
86
+ files.
87
+
88
+ <!-- checked-example: privacy-usage -->
89
+
90
+ ```ts
91
+ import {
92
+ validateExecutablePrivacyPolicy,
93
+ type ExecutablePrivacyPolicy,
94
+ type PrivacyColumn,
95
+ } from "@rehearsal-db/core/privacy";
96
+
97
+ export const policy: ExecutablePrivacyPolicy = validateExecutablePrivacyPolicy({
98
+ policyVersion: 2,
99
+ migrationCutoff: "20260101000000",
100
+ tables: [
101
+ {
102
+ name: "widgets",
103
+ sourceRows: "STREAM AND SANITIZE",
104
+ columns: [
105
+ {
106
+ name: "id",
107
+ action: "PSEUDONYMIZE",
108
+ recipe: { format: "uuid", namespace: "widget-id" },
109
+ generated: "NEVER",
110
+ identity: "NO",
111
+ foreignKey: null,
112
+ },
113
+ ],
114
+ },
115
+ ],
116
+ });
117
+
118
+ export const identifierColumn: PrivacyColumn = policy.tables[0]!.columns[0]!;
119
+ ```
120
+
121
+ ## Package implementation and declarations
122
+
123
+ All shipped Rehearsal implementation source is TypeScript. The package build emits
124
+ ordinary ESM JavaScript for Node.js together with declaration files. Consumers do not
125
+ need TypeScript, a transpiler, or a TypeScript runtime.
126
+
127
+ The package-root import, `@rehearsal-db/core`, uses declarations generated from the
128
+ same TypeScript implementation that runs at runtime; the small `types/` entry point
129
+ only forwards those generated declarations. Advanced subpath imports such as
130
+ `@rehearsal-db/core/baseline` and `@rehearsal-db/core/privacy` also receive generated declarations, but they remain
131
+ advanced APIs: only their documented exports and behavior are compatibility promises.
132
+
133
+ Rehearsal's own `npm run typecheck` compiles every example on this page. A documentation
134
+ contract also requires the displayed snippets to match those checked files exactly.
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@rehearsal-db/core",
3
- "version": "0.1.0-beta.9",
3
+ "version": "0.1.0-rc.2",
4
4
  "private": false,
5
- "description": "Safely rehearse PostgreSQL and Supabase migrations against sanitized, production-shaped data.",
5
+ "description": "Catch PostgreSQL and Supabase migrations that pass on empty databases but fail on real data—before deploy.",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/Ddupasquier/rehearsal-db.git"
@@ -10,37 +10,36 @@
10
10
  "bugs": {
11
11
  "url": "https://github.com/Ddupasquier/rehearsal-db/issues"
12
12
  },
13
- "homepage": "https://github.com/Ddupasquier/rehearsal-db#readme",
13
+ "homepage": "https://ddupasquier.github.io/rehearsal-db/",
14
14
  "publishConfig": {
15
15
  "access": "public",
16
- "tag": "beta",
17
16
  "provenance": true
18
17
  },
19
18
  "type": "module",
20
19
  "engines": {
21
- "node": ">=24 <25"
20
+ "node": "^22.0.0 || ^24.0.0 || ^26.0.0"
22
21
  },
23
22
  "bin": {
24
- "rehearsal": "src/cli/rehearsal.mjs"
23
+ "rehearsal": "dist/src/cli/rehearsal.mjs"
25
24
  },
26
25
  "exports": {
27
26
  ".": {
28
- "types": "./src/project/configuration.d.mts",
29
- "import": "./src/project/configuration.mjs"
27
+ "types": "./types/configuration.d.mts",
28
+ "import": "./dist/src/index.mjs"
30
29
  },
31
- "./baseline": "./src/baseline/artifact.mjs",
32
- "./baseline-builder": "./src/baseline/builder.mjs",
33
- "./diagnostics": "./src/shared/diagnostics.mjs",
34
- "./migrations": "./src/runtime/migration_history.mjs",
35
- "./process-environment": "./src/shared/process_environment.mjs",
36
- "./privacy": "./src/baseline/privacy_engine.mjs",
37
- "./schema": "./src/baseline/schema_snapshot.mjs",
38
- "./service-environment": "./src/runtime/service_environment.mjs",
39
- "./source-access": "./src/source/access.mjs"
30
+ "./baseline": "./dist/src/baseline/artifact.mjs",
31
+ "./baseline-builder": "./dist/src/baseline/builder.mjs",
32
+ "./diagnostics": "./dist/src/shared/diagnostics.mjs",
33
+ "./migrations": "./dist/src/runtime/migration_history.mjs",
34
+ "./process-environment": "./dist/src/shared/process_environment.mjs",
35
+ "./privacy": "./dist/src/baseline/privacy_engine.mjs",
36
+ "./schema": "./dist/src/baseline/schema_snapshot.mjs",
37
+ "./service-environment": "./dist/src/runtime/service_environment.mjs",
38
+ "./source-access": "./dist/src/source/access.mjs"
40
39
  },
41
40
  "files": [
42
- "src",
43
- "scripts/runtime/manage_database.mjs",
41
+ "dist",
42
+ "types",
44
43
  "docs/*.md",
45
44
  "README.md",
46
45
  "BENCHMARKS.md",
@@ -51,16 +50,26 @@
51
50
  "LICENSE"
52
51
  ],
53
52
  "scripts": {
54
- "test": "vitest run",
55
- "test:unit": "vitest run tests/unit",
56
- "test:integration": "vitest run tests/integration tests/contracts",
57
- "test:docs": "vitest run tests/contracts/documentationCommands.test.mjs",
58
- "test:fixture": "node scripts/verification/fixtures/supabase.mjs",
59
- "test:fixture:postgresql": "node scripts/verification/fixtures/postgresql.mjs",
60
- "test:fixture:dependent": "node scripts/verification/fixtures/dependent.mjs",
61
- "test:fixture:standalone": "node scripts/verification/fixtures/standalone.mjs",
62
- "check": "npm run check:syntax && npm run test && npm run format:check && npm run package:audit",
63
- "check:syntax": "find src scripts tests -type f -name '*.mjs' -exec node --check {} +",
53
+ "postinstall": "node dist/scripts/install/create_root_config.mjs",
54
+ "prepack": "npm run build",
55
+ "build": "node scripts/build/clean.mjs && tsc --project tsconfig.build.json",
56
+ "docs:build": "node scripts/docs/build.mjs",
57
+ "docs:preview": "node scripts/docs/serve.mjs",
58
+ "test": "npm run build && vitest run",
59
+ "test:unit": "npm run build && vitest run tests/unit",
60
+ "test:integration": "npm run build && vitest run tests/integration tests/contracts",
61
+ "test:docs": "npm run build && vitest run tests/contracts/documentationCommands.test.mjs",
62
+ "test:fixture": "npm run build && node scripts/verification/run_scenario.mjs supabase",
63
+ "test:fixture:postgresql": "npm run build && node scripts/verification/run_scenario.mjs postgresql",
64
+ "test:fixture:dependent": "npm run build && node scripts/verification/run_scenario.mjs dependent-target",
65
+ "test:fixture:onboarding": "npm run build && node scripts/verification/run_scenario.mjs onboarding",
66
+ "test:fixture:typescript": "npm run build && node scripts/verification/run_scenario.mjs typescript",
67
+ "test:fixture:standalone": "npm run build && node scripts/verification/run_scenario.mjs standalone",
68
+ "test:fixture:privacy": "npm run build && node scripts/verification/run_scenario.mjs privacy",
69
+ "release:verify": "node scripts/verification/release_gate.mjs",
70
+ "check": "npm run check:syntax && npm run typecheck && npm run test && npm run docs:build && npm run format:check && npm run package:audit",
71
+ "check:syntax": "find scripts tests -type f -name '*.mjs' -exec node --check {} +",
72
+ "typecheck": "npm run build && tsc --project tsconfig.json",
64
73
  "format": "prettier --write .",
65
74
  "format:check": "prettier --check .",
66
75
  "package:audit": "node scripts/verification/audit_package.mjs"
@@ -78,8 +87,14 @@
78
87
  "pg": "^8.23.1"
79
88
  },
80
89
  "devDependencies": {
90
+ "@fontsource-variable/dm-sans": "^5.3.0",
91
+ "@fontsource-variable/fraunces": "^5.3.0",
81
92
  "@lydell/node-pty": "^1.2.0-beta.15",
93
+ "@types/node": "22.20.5",
94
+ "@types/pg": "^8.23.1",
95
+ "marked": "^18.0.14",
82
96
  "prettier": "^3.9.6",
97
+ "typescript": "7.0.2",
83
98
  "vitest": "^5.0.2"
84
99
  }
85
100
  }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Compatibility declaration entry point.
3
+ * Public types are emitted from the TypeScript implementation in dist/src.
4
+ */
5
+ export * from "../dist/src/index.mjs";
package/src/README.md DELETED
@@ -1,17 +0,0 @@
1
- # Source layout
2
-
3
- Production code is grouped by the responsibility it owns:
4
-
5
- - `application/` starts and proves the project application.
6
- - `baseline/` creates, validates, and stores safe baseline artifacts.
7
- - `cli/` is the human and automation entry point.
8
- - `identity/` associates copied data with verified local users.
9
- - `project/` owns configuration, setup, and support reporting.
10
- - `runtime/` plans, verifies, resets, migrates, and cleans local runtimes.
11
- - `shared/` contains small target-neutral infrastructure.
12
- - `source/` controls approved source access and baseline refresh.
13
- - `targets/` contains the PostgreSQL and Supabase runtime adapters.
14
-
15
- Place a new module in the domain that owns its policy. Keep database-specific behavior
16
- behind `targets/`, repository-only checks under `scripts/verification/`, and public
17
- imports behind the export map in `package.json`.