@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.
- package/CHANGELOG.md +319 -1
- package/COMPATIBILITY.md +15 -0
- package/README.md +73 -16
- package/dist/package.json +100 -0
- package/dist/scripts/install/create_root_config.d.mts +3 -0
- package/dist/scripts/install/create_root_config.mjs +13 -0
- package/dist/scripts/runtime/manage_database.d.mts +6 -0
- package/{scripts → dist/scripts}/runtime/manage_database.mjs +6 -8
- package/dist/src/application/interactive_task.d.mts +30 -0
- package/dist/src/application/interactive_task.mjs +83 -0
- package/dist/src/application/session.d.mts +97 -0
- package/dist/src/application/session.mjs +380 -0
- package/dist/src/baseline/artifact.d.mts +119 -0
- package/dist/src/baseline/artifact.mjs +522 -0
- package/dist/src/baseline/builder.d.mts +19 -0
- package/dist/src/baseline/builder.mjs +142 -0
- package/dist/src/baseline/input_discovery.d.mts +13 -0
- package/dist/src/baseline/input_discovery.mjs +149 -0
- package/dist/src/baseline/policy_review.d.mts +56 -0
- package/dist/src/baseline/policy_review.mjs +73 -0
- package/dist/src/baseline/preparation.d.mts +63 -0
- package/dist/src/baseline/preparation.mjs +295 -0
- package/dist/src/baseline/privacy_contract.d.mts +147 -0
- package/dist/src/baseline/privacy_contract.mjs +2 -0
- package/dist/src/baseline/privacy_dependency_graph.d.mts +7 -0
- package/dist/src/baseline/privacy_dependency_graph.mjs +110 -0
- package/dist/src/baseline/privacy_engine.d.mts +5 -0
- package/dist/src/baseline/privacy_engine.mjs +4 -0
- package/dist/src/baseline/privacy_key.d.mts +7 -0
- package/dist/src/baseline/privacy_key.mjs +42 -0
- package/dist/src/baseline/privacy_pipeline.d.mts +7 -0
- package/dist/src/baseline/privacy_pipeline.mjs +127 -0
- package/dist/src/baseline/privacy_policy.d.mts +6 -0
- package/dist/src/baseline/privacy_policy.mjs +237 -0
- package/dist/src/baseline/privacy_recipe_validation.d.mts +5 -0
- package/dist/src/baseline/privacy_recipe_validation.mjs +289 -0
- package/dist/src/baseline/privacy_rule_registry.d.mts +18 -0
- package/dist/src/baseline/privacy_rule_registry.mjs +143 -0
- package/dist/src/baseline/privacy_structured_json.d.mts +66 -0
- package/dist/src/baseline/privacy_structured_json.mjs +464 -0
- package/dist/src/baseline/privacy_transforms.d.mts +18 -0
- package/dist/src/baseline/privacy_transforms.mjs +142 -0
- package/dist/src/baseline/privacy_validation_shared.d.mts +31 -0
- package/dist/src/baseline/privacy_validation_shared.mjs +127 -0
- package/dist/src/baseline/sanitization_policy.d.mts +69 -0
- package/dist/src/baseline/sanitization_policy.mjs +227 -0
- package/dist/src/baseline/schema_snapshot.d.mts +19 -0
- package/dist/src/baseline/schema_snapshot.mjs +79 -0
- package/dist/src/cli/application_command_handlers.d.mts +8 -0
- package/dist/src/cli/application_command_handlers.mjs +52 -0
- package/dist/src/cli/arguments.d.mts +38 -0
- package/dist/src/cli/arguments.mjs +130 -0
- package/dist/src/cli/basic_command_handlers.d.mts +4 -0
- package/dist/src/cli/basic_command_handlers.mjs +57 -0
- package/dist/src/cli/cli_commands.d.mts +14 -0
- package/dist/src/cli/cli_commands.mjs +34 -0
- package/dist/src/cli/command_contract.d.mts +57 -0
- package/dist/src/cli/command_contract.mjs +39 -0
- package/dist/src/cli/command_output.d.mts +12 -0
- package/dist/src/cli/command_output.mjs +20 -0
- package/dist/src/cli/command_registry.d.mts +7 -0
- package/dist/src/cli/command_registry.mjs +14 -0
- package/dist/src/cli/guided.d.mts +53 -0
- package/dist/src/cli/guided.mjs +727 -0
- package/dist/src/cli/identity_command_handlers.d.mts +12 -0
- package/dist/src/cli/identity_command_handlers.mjs +239 -0
- package/dist/src/cli/identity_renderer.d.mts +8 -0
- package/dist/src/cli/identity_renderer.mjs +33 -0
- package/dist/src/cli/init_command.d.mts +21 -0
- package/dist/src/cli/init_command.mjs +90 -0
- package/dist/src/cli/inspection_command_handlers.d.mts +3 -0
- package/dist/src/cli/inspection_command_handlers.mjs +79 -0
- package/dist/src/cli/project_command_handlers.d.mts +11 -0
- package/dist/src/cli/project_command_handlers.mjs +92 -0
- package/dist/src/cli/project_commands.d.mts +283 -0
- package/dist/src/cli/project_commands.mjs +192 -0
- package/dist/src/cli/rehearsal.d.mts +7 -0
- package/dist/src/cli/rehearsal.mjs +190 -0
- package/dist/src/cli/renderers.d.mts +299 -0
- package/dist/src/cli/renderers.mjs +554 -0
- package/dist/src/cli/runtime_action_handlers.d.mts +12 -0
- package/dist/src/cli/runtime_action_handlers.mjs +201 -0
- package/dist/src/cli/runtime_commands.d.mts +294 -0
- package/dist/src/cli/runtime_commands.mjs +619 -0
- package/dist/src/cli/source_command_handlers.d.mts +8 -0
- package/dist/src/cli/source_command_handlers.mjs +62 -0
- package/dist/src/cli/source_commands.d.mts +436 -0
- package/dist/src/cli/source_commands.mjs +301 -0
- package/dist/src/cli/terminal.d.mts +59 -0
- package/dist/src/cli/terminal.mjs +230 -0
- package/dist/src/identity/claim.d.mts +5 -0
- package/dist/src/identity/claim.mjs +4 -0
- package/dist/src/identity/claim_contract.d.mts +135 -0
- package/dist/src/identity/claim_contract.mjs +6 -0
- package/dist/src/identity/claim_executor.d.mts +10 -0
- package/dist/src/identity/claim_executor.mjs +358 -0
- package/dist/src/identity/claim_identity_lookup.d.mts +23 -0
- package/dist/src/identity/claim_identity_lookup.mjs +134 -0
- package/dist/src/identity/claim_plan.d.mts +8 -0
- package/dist/src/identity/claim_plan.mjs +61 -0
- package/dist/src/identity/claim_policy.d.mts +3 -0
- package/dist/src/identity/claim_policy.mjs +377 -0
- package/dist/src/identity/claim_sql.d.mts +10 -0
- package/dist/src/identity/claim_sql.mjs +46 -0
- package/dist/src/identity/claim_verification.d.mts +13 -0
- package/dist/src/identity/claim_verification.mjs +35 -0
- package/dist/src/identity/connect.d.mts +30 -0
- package/dist/src/identity/connect.mjs +111 -0
- package/dist/src/identity/provider_configuration.d.mts +37 -0
- package/dist/src/identity/provider_configuration.mjs +132 -0
- package/dist/src/identity/storage.d.mts +21 -0
- package/dist/src/identity/storage.mjs +122 -0
- package/dist/src/index.d.mts +4 -0
- package/dist/src/index.mjs +3 -0
- package/dist/src/project/configuration.d.mts +13 -0
- package/dist/src/project/configuration.mjs +9 -0
- package/dist/src/project/configuration_contract.d.mts +125 -0
- package/dist/src/project/configuration_contract.mjs +27 -0
- package/dist/src/project/configuration_discovery.d.mts +7 -0
- package/dist/src/project/configuration_discovery.mjs +37 -0
- package/dist/src/project/configuration_normalization.d.mts +107 -0
- package/dist/src/project/configuration_normalization.mjs +302 -0
- package/dist/src/project/configuration_rendering.d.mts +14 -0
- package/dist/src/project/configuration_rendering.mjs +228 -0
- package/dist/src/project/configuration_resolution.d.mts +125 -0
- package/dist/src/project/configuration_resolution.mjs +81 -0
- package/dist/src/project/configuration_schema.d.mts +22 -0
- package/dist/src/project/configuration_schema.mjs +160 -0
- package/dist/src/project/configuration_validation.d.mts +22 -0
- package/dist/src/project/configuration_validation.mjs +136 -0
- package/dist/src/project/install_scaffold.d.mts +42 -0
- package/dist/src/project/install_scaffold.mjs +263 -0
- package/dist/src/project/project_detection.d.mts +14 -0
- package/dist/src/project/project_detection.mjs +47 -0
- package/dist/src/project/setup.d.mts +87 -0
- package/dist/src/project/setup.mjs +414 -0
- package/dist/src/project/support_report.d.mts +88 -0
- package/dist/src/project/support_report.mjs +83 -0
- package/dist/src/runtime/cleanup.d.mts +85 -0
- package/dist/src/runtime/cleanup.mjs +311 -0
- package/dist/src/runtime/lifecycle_engine.d.mts +63 -0
- package/dist/src/runtime/lifecycle_engine.mjs +114 -0
- package/dist/src/runtime/migration_history.d.mts +51 -0
- package/dist/src/runtime/migration_history.mjs +170 -0
- package/dist/src/runtime/plan.d.mts +134 -0
- package/dist/src/runtime/plan.mjs +640 -0
- package/dist/src/runtime/policy.d.mts +66 -0
- package/dist/src/runtime/policy.mjs +369 -0
- package/dist/src/runtime/restore.d.mts +22 -0
- package/dist/src/runtime/restore.mjs +276 -0
- package/dist/src/runtime/service_environment.d.mts +11 -0
- package/dist/src/runtime/service_environment.mjs +58 -0
- package/dist/src/runtime/topology.d.mts +51 -0
- package/dist/src/runtime/topology.mjs +128 -0
- package/dist/src/shared/diagnostics.d.mts +97 -0
- package/dist/src/shared/diagnostics.mjs +170 -0
- package/dist/src/shared/human_output.d.mts +2 -0
- package/{src → dist/src}/shared/human_output.mjs +1 -3
- package/dist/src/shared/node_runtime.d.mts +14 -0
- package/dist/src/shared/node_runtime.mjs +25 -0
- package/dist/src/shared/operation_guard.d.mts +22 -0
- package/dist/src/shared/operation_guard.mjs +150 -0
- package/dist/src/shared/process_environment.d.mts +15 -0
- package/dist/src/shared/process_environment.mjs +50 -0
- package/dist/src/source/access.d.mts +165 -0
- package/dist/src/source/access.mjs +602 -0
- package/dist/src/source/asset_transfer.d.mts +27 -0
- package/dist/src/source/asset_transfer.mjs +202 -0
- package/dist/src/source/baseline.d.mts +66 -0
- package/dist/src/source/baseline.mjs +372 -0
- package/dist/src/source/external_reader.d.mts +42 -0
- package/dist/src/source/external_reader.mjs +278 -0
- package/dist/src/source/postgresql_access.d.mts +86 -0
- package/dist/src/source/postgresql_access.mjs +454 -0
- package/dist/src/source/privacy_paths.d.mts +10 -0
- package/dist/src/source/privacy_paths.mjs +27 -0
- package/dist/src/targets/driver.d.mts +2 -0
- package/dist/src/targets/driver.mjs +13 -0
- package/dist/src/targets/postgresql.d.mts +5 -0
- package/dist/src/targets/postgresql.mjs +620 -0
- package/dist/src/targets/supabase.d.mts +8 -0
- package/dist/src/targets/supabase.mjs +629 -0
- package/dist/src/targets/supabase_environment.d.mts +54 -0
- package/dist/src/targets/supabase_environment.mjs +184 -0
- package/dist/src/targets/target.d.mts +33 -0
- package/dist/src/targets/target.mjs +39 -0
- package/docs/README.md +35 -16
- package/docs/architecture.md +135 -10
- package/docs/commands.md +53 -15
- package/docs/configuration.md +186 -31
- package/docs/getting-started.md +66 -9
- package/docs/index.md +67 -0
- package/docs/production-source.md +175 -17
- package/docs/releasing.md +24 -12
- package/docs/roadmap.md +3 -2
- package/docs/runtime-lifecycle.md +99 -0
- package/docs/runtime-policies.md +80 -7
- package/docs/sanitization.md +572 -4
- package/docs/security-model.md +8 -0
- package/docs/stability.md +70 -0
- package/docs/standalone-workflow.md +36 -13
- package/docs/troubleshooting.md +82 -10
- package/docs/tutorial.md +7 -1
- package/docs/typescript.md +134 -0
- package/package.json +44 -29
- package/types/configuration.d.mts +5 -0
- package/src/README.md +0 -17
- package/src/application/session.mjs +0 -313
- package/src/baseline/artifact.mjs +0 -661
- package/src/baseline/builder.mjs +0 -164
- package/src/baseline/input_discovery.mjs +0 -155
- package/src/baseline/policy_review.mjs +0 -92
- package/src/baseline/preparation.mjs +0 -323
- package/src/baseline/privacy_engine.mjs +0 -413
- package/src/baseline/sanitization_policy.mjs +0 -299
- package/src/baseline/schema_snapshot.mjs +0 -113
- package/src/cli/arguments.mjs +0 -120
- package/src/cli/guided.mjs +0 -807
- package/src/cli/rehearsal.mjs +0 -933
- package/src/cli/renderers.mjs +0 -584
- package/src/cli/runtime_commands.mjs +0 -553
- package/src/cli/source_commands.mjs +0 -326
- package/src/cli/terminal.mjs +0 -275
- package/src/identity/claim.mjs +0 -975
- package/src/identity/storage.mjs +0 -165
- package/src/project/configuration.d.mts +0 -153
- package/src/project/configuration.mjs +0 -1197
- package/src/project/setup.mjs +0 -379
- package/src/project/support_report.mjs +0 -105
- package/src/runtime/cleanup.mjs +0 -381
- package/src/runtime/migration_history.mjs +0 -220
- package/src/runtime/plan.mjs +0 -685
- package/src/runtime/policy.mjs +0 -438
- package/src/runtime/restore.mjs +0 -329
- package/src/runtime/service_environment.mjs +0 -82
- package/src/runtime/topology.mjs +0 -177
- package/src/shared/diagnostics.mjs +0 -199
- package/src/shared/operation_guard.mjs +0 -162
- package/src/shared/process_environment.mjs +0 -68
- package/src/source/access.mjs +0 -578
- package/src/source/asset_transfer.mjs +0 -177
- package/src/source/baseline.mjs +0 -446
- package/src/source/postgresql_access.mjs +0 -480
- package/src/targets/postgresql.mjs +0 -808
- package/src/targets/supabase.mjs +0 -830
- package/src/targets/supabase_environment.mjs +0 -229
- 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
|
|
12
|
-
named environment variable
|
|
13
|
-
|
|
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.
|
|
19
|
-
reader and export objects Rehearsal recorded.
|
|
20
|
-
|
|
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
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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,
|
package/docs/troubleshooting.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
##
|
|
23
|
+
## Installation did not create `rehearsal.config.mjs`
|
|
24
24
|
|
|
25
|
-
Rehearsal intentionally
|
|
26
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
|
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-
|
|
3
|
+
"version": "0.1.0-rc.2",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "
|
|
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.
|
|
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": "
|
|
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": "./
|
|
29
|
-
"import": "./src/
|
|
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
|
-
"
|
|
43
|
-
"
|
|
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
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"test
|
|
60
|
-
"test:
|
|
61
|
-
"test:
|
|
62
|
-
"
|
|
63
|
-
"
|
|
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
|
}
|
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`.
|