@rehearsal-db/core 0.1.0-beta.14 → 0.1.0-beta.16
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 +51 -1
- package/README.md +1 -0
- package/dist/package.json +101 -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/session.d.mts +96 -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 +128 -0
- package/dist/src/cli/basic_command_handlers.d.mts +4 -0
- package/dist/src/cli/basic_command_handlers.mjs +56 -0
- package/dist/src/cli/cli_commands.d.mts +14 -0
- package/dist/src/cli/cli_commands.mjs +32 -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 +719 -0
- package/dist/src/cli/identity_command_handlers.d.mts +8 -0
- package/dist/src/cli/identity_command_handlers.mjs +43 -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 +159 -0
- package/dist/src/cli/project_commands.mjs +183 -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 +269 -0
- package/dist/src/cli/runtime_commands.mjs +601 -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 +17 -0
- package/dist/src/identity/claim_identity_lookup.mjs +125 -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/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 +224 -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 +637 -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 +627 -0
- package/dist/src/targets/supabase_environment.d.mts +49 -0
- package/dist/src/targets/supabase_environment.mjs +162 -0
- package/dist/src/targets/target.d.mts +33 -0
- package/dist/src/targets/target.mjs +39 -0
- package/docs/README.md +1 -0
- package/docs/architecture.md +133 -10
- package/docs/configuration.md +9 -3
- package/docs/index.md +1 -0
- package/docs/releasing.md +8 -3
- package/docs/typescript.md +134 -0
- package/package.json +36 -29
- package/types/configuration.d.mts +5 -0
- package/scripts/install/create_root_config.mjs +0 -19
- package/src/README.md +0 -17
- package/src/application/session.mjs +0 -435
- package/src/baseline/artifact.mjs +0 -684
- 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 -1399
- package/src/baseline/privacy_structured_json.mjs +0 -554
- package/src/baseline/sanitization_policy.mjs +0 -299
- package/src/baseline/schema_snapshot.mjs +0 -113
- package/src/cli/arguments.mjs +0 -126
- package/src/cli/guided.mjs +0 -814
- package/src/cli/init_command.mjs +0 -94
- package/src/cli/rehearsal.mjs +0 -972
- package/src/cli/renderers.mjs +0 -638
- package/src/cli/runtime_commands.mjs +0 -707
- package/src/cli/source_commands.mjs +0 -355
- package/src/cli/terminal.mjs +0 -275
- package/src/identity/claim.mjs +0 -1165
- package/src/identity/provider_configuration.mjs +0 -177
- package/src/identity/storage.mjs +0 -165
- package/src/project/configuration.d.mts +0 -164
- package/src/project/configuration.mjs +0 -1337
- package/src/project/install_scaffold.mjs +0 -325
- package/src/project/setup.mjs +0 -474
- 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 -722
- package/src/runtime/policy.mjs +0 -438
- package/src/runtime/restore.mjs +0 -337
- package/src/runtime/service_environment.mjs +0 -82
- package/src/runtime/topology.mjs +0 -177
- package/src/shared/diagnostics.mjs +0 -207
- package/src/shared/node_runtime.mjs +0 -31
- package/src/shared/operation_guard.mjs +0 -162
- package/src/shared/process_environment.mjs +0 -68
- package/src/source/access.mjs +0 -798
- package/src/source/asset_transfer.mjs +0 -259
- package/src/source/baseline.mjs +0 -482
- package/src/source/external_reader.mjs +0 -368
- package/src/source/postgresql_access.mjs +0 -638
- package/src/source/privacy_paths.mjs +0 -38
- package/src/targets/postgresql.mjs +0 -808
- package/src/targets/supabase.mjs +0 -840
- package/src/targets/supabase_environment.mjs +0 -229
- package/src/targets/target.mjs +0 -66
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/** Database runtime action handlers shared by guided and scripted CLI flows. */
|
|
2
|
+
import * as prompts from "@clack/prompts";
|
|
3
|
+
import { buildApplicationEnvironment, runHttpProofs, startApplicationSession, } from "../application/session.mjs";
|
|
4
|
+
import { exactCommands, renderedCommand, silentCommand, } from "./command_contract.mjs";
|
|
5
|
+
import { topologyCommandEnvironment, topologyEnvironmentFiles, } from "./runtime_commands.mjs";
|
|
6
|
+
import { formatDuration, isHumanTerminal, terminalStyle, useStyledPrompts, } from "./terminal.mjs";
|
|
7
|
+
const RUNTIME_ACTIONS = [
|
|
8
|
+
"run",
|
|
9
|
+
"start",
|
|
10
|
+
"migrate",
|
|
11
|
+
"reset",
|
|
12
|
+
"status",
|
|
13
|
+
"stop",
|
|
14
|
+
"discard",
|
|
15
|
+
"verify",
|
|
16
|
+
];
|
|
17
|
+
const isRuntimeAction = (command) => RUNTIME_ACTIONS.includes(command);
|
|
18
|
+
export const createRuntimeActionHandlers = ({ prepareCandidateConfirmation, prepareDependentTargets, proveRuntimeStack, runRuntimeStack, }) => [
|
|
19
|
+
{
|
|
20
|
+
...exactCommands("runtime-action", RUNTIME_ACTIONS, async () => silentCommand()),
|
|
21
|
+
matches: ({ command, flags }) => isRuntimeAction(command) && !(command === "run" && flags.dryRun),
|
|
22
|
+
handle: async ({ command, flags, planOptions, guided, state }) => {
|
|
23
|
+
if (!isRuntimeAction(command)) {
|
|
24
|
+
throw new Error(`Unsupported runtime action: ${command}.`);
|
|
25
|
+
}
|
|
26
|
+
if (flags.dryRun && command !== "run") {
|
|
27
|
+
throw new Error("--dry-run is supported only by rehearsal run.");
|
|
28
|
+
}
|
|
29
|
+
if (!(await prepareCandidateConfirmation({
|
|
30
|
+
command,
|
|
31
|
+
flags,
|
|
32
|
+
planOptions,
|
|
33
|
+
session: state,
|
|
34
|
+
}))) {
|
|
35
|
+
return silentCommand();
|
|
36
|
+
}
|
|
37
|
+
const stack = await runRuntimeStack({
|
|
38
|
+
command,
|
|
39
|
+
flags,
|
|
40
|
+
planOptions,
|
|
41
|
+
session: state,
|
|
42
|
+
});
|
|
43
|
+
const { runtime, topology } = stack;
|
|
44
|
+
const stackEnvironment = topologyCommandEnvironment(topology);
|
|
45
|
+
const preparations = ["run", "reset", "migrate"].includes(command)
|
|
46
|
+
? prepareDependentTargets({
|
|
47
|
+
topology,
|
|
48
|
+
environment: stackEnvironment,
|
|
49
|
+
})
|
|
50
|
+
: [];
|
|
51
|
+
let applicationProof;
|
|
52
|
+
let dependentProofs = [];
|
|
53
|
+
let httpProofResults = [];
|
|
54
|
+
let applicationReadiness;
|
|
55
|
+
if (command === "run") {
|
|
56
|
+
const applicationConfig = topology.primary.config.application;
|
|
57
|
+
const mappedApplicationEnvironment = Object.keys(applicationConfig.environmentVariables).length
|
|
58
|
+
? await buildApplicationEnvironment({
|
|
59
|
+
files: topologyEnvironmentFiles(topology),
|
|
60
|
+
mappings: applicationConfig.environmentVariables,
|
|
61
|
+
})
|
|
62
|
+
: {};
|
|
63
|
+
const proofEnvironment = {
|
|
64
|
+
...stackEnvironment,
|
|
65
|
+
...mappedApplicationEnvironment,
|
|
66
|
+
};
|
|
67
|
+
const proofLabel = topology.targets.length > 1
|
|
68
|
+
? "project-owned dependent and application proofs"
|
|
69
|
+
: "project-owned application proof";
|
|
70
|
+
const proofSpinner = useStyledPrompts(flags) ? prompts.spinner() : null;
|
|
71
|
+
if (proofSpinner) {
|
|
72
|
+
proofSpinner.start(`Running the ${proofLabel}.`);
|
|
73
|
+
}
|
|
74
|
+
else if (isHumanTerminal(flags)) {
|
|
75
|
+
console.log(`${terminalStyle(flags, "36", "→")} Running the ${proofLabel}.`);
|
|
76
|
+
}
|
|
77
|
+
let applicationSession;
|
|
78
|
+
try {
|
|
79
|
+
if (applicationConfig.readiness) {
|
|
80
|
+
applicationSession = await startApplicationSession({
|
|
81
|
+
command: applicationConfig.startCommand,
|
|
82
|
+
cwd: topology.projectRoot,
|
|
83
|
+
files: topologyEnvironmentFiles(topology),
|
|
84
|
+
mappings: applicationConfig.environmentVariables,
|
|
85
|
+
readiness: applicationConfig.readiness,
|
|
86
|
+
});
|
|
87
|
+
applicationReadiness = applicationSession.ready;
|
|
88
|
+
}
|
|
89
|
+
({ applicationProof, dependentProofs } = await proveRuntimeStack({
|
|
90
|
+
topology,
|
|
91
|
+
planOptions,
|
|
92
|
+
environment: proofEnvironment,
|
|
93
|
+
}));
|
|
94
|
+
if (applicationConfig.httpProofs.length) {
|
|
95
|
+
httpProofResults = await runHttpProofs({
|
|
96
|
+
checks: applicationConfig.httpProofs,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (proofSpinner)
|
|
102
|
+
proofSpinner.stop("A project proof failed.");
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
await applicationSession?.stop();
|
|
107
|
+
}
|
|
108
|
+
if (proofSpinner) {
|
|
109
|
+
proofSpinner.stop("Project proofs passed.");
|
|
110
|
+
}
|
|
111
|
+
else if (isHumanTerminal(flags)) {
|
|
112
|
+
console.log(`${terminalStyle(flags, "32", "✓")} Project proofs passed.`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const data = command === "run"
|
|
116
|
+
? {
|
|
117
|
+
runtime,
|
|
118
|
+
preparations,
|
|
119
|
+
dependentProofs,
|
|
120
|
+
applicationProof,
|
|
121
|
+
applicationReadiness,
|
|
122
|
+
httpProofResults,
|
|
123
|
+
}
|
|
124
|
+
: preparations.length
|
|
125
|
+
? { ...runtime, preparations }
|
|
126
|
+
: runtime;
|
|
127
|
+
if (guided) {
|
|
128
|
+
state.lastGuidedDetails = [
|
|
129
|
+
runtime.output,
|
|
130
|
+
...preparations.map((preparation) => preparation.output),
|
|
131
|
+
...dependentProofs.map((proof) => proof.output),
|
|
132
|
+
applicationProof?.output,
|
|
133
|
+
]
|
|
134
|
+
.filter(Boolean)
|
|
135
|
+
.join("\n");
|
|
136
|
+
}
|
|
137
|
+
return renderedCommand({
|
|
138
|
+
data,
|
|
139
|
+
render: (value) => {
|
|
140
|
+
const runtimeResult = "runtime" in value ? value.runtime : value;
|
|
141
|
+
const renderedPreparations = "preparations" in value ? value.preparations : [];
|
|
142
|
+
const renderedDependentProofs = "dependentProofs" in value ? value.dependentProofs : [];
|
|
143
|
+
const renderedApplicationProof = "applicationProof" in value ? value.applicationProof : undefined;
|
|
144
|
+
const renderedApplicationReadiness = "applicationReadiness" in value
|
|
145
|
+
? value.applicationReadiness
|
|
146
|
+
: undefined;
|
|
147
|
+
const renderedHttpProofResults = "httpProofResults" in value ? value.httpProofResults : [];
|
|
148
|
+
const nextAction = {
|
|
149
|
+
run: "Next: run rehearsal open for hands-on testing, then rehearsal verify.",
|
|
150
|
+
start: "Next: run rehearsal open for hands-on testing or rehearsal status.",
|
|
151
|
+
migrate: "Next: run rehearsal verify to prove the current runtime.",
|
|
152
|
+
reset: "Next: run rehearsal open or rehearsal verify.",
|
|
153
|
+
status: "Next: run rehearsal verify, reset, stop, or discard.",
|
|
154
|
+
stop: "Next: run rehearsal start when you want to resume.",
|
|
155
|
+
discard: "The disposable runtime was removed; the immutable baseline remains.",
|
|
156
|
+
verify: "Next: continue testing, reset to the baseline, or stop the runtime.",
|
|
157
|
+
}[runtimeResult.action];
|
|
158
|
+
if (guided) {
|
|
159
|
+
const title = runtimeResult.action === "run"
|
|
160
|
+
? "REHEARSAL PASSED"
|
|
161
|
+
: "ACTION COMPLETE";
|
|
162
|
+
return [
|
|
163
|
+
title,
|
|
164
|
+
`✓ ${runtimeResult.action} completed in ${formatDuration(runtimeResult.durationMs)}`,
|
|
165
|
+
...renderedPreparations.map((preparation) => `✓ ${preparation.target} preparation passed: ${preparation.command}`),
|
|
166
|
+
...renderedDependentProofs.map((proof) => `✓ ${proof.target} proof passed: ${proof.command}`),
|
|
167
|
+
renderedApplicationProof
|
|
168
|
+
? `✓ Application proof passed: ${renderedApplicationProof.command}`
|
|
169
|
+
: null,
|
|
170
|
+
renderedApplicationReadiness
|
|
171
|
+
? `✓ Application became ready at ${renderedApplicationReadiness.url}`
|
|
172
|
+
: null,
|
|
173
|
+
...renderedHttpProofResults.map((proof) => `✓ ${proof.kind} HTTP proof passed: ${proof.name}`),
|
|
174
|
+
"",
|
|
175
|
+
"Technical output is available from Show details in the guide.",
|
|
176
|
+
]
|
|
177
|
+
.filter(Boolean)
|
|
178
|
+
.join("\n");
|
|
179
|
+
}
|
|
180
|
+
return [
|
|
181
|
+
runtimeResult.output ||
|
|
182
|
+
`Rehearsal ${runtimeResult.action} completed.`,
|
|
183
|
+
...renderedPreparations.map((preparation) => `${preparation.target} preparation passed: ${preparation.command}`),
|
|
184
|
+
...renderedDependentProofs.map((proof) => `${proof.target} proof passed: ${proof.command}`),
|
|
185
|
+
renderedApplicationProof
|
|
186
|
+
? `Application proof passed: ${renderedApplicationProof.command}`
|
|
187
|
+
: null,
|
|
188
|
+
renderedApplicationReadiness
|
|
189
|
+
? `Application readiness passed: ${renderedApplicationReadiness.url}`
|
|
190
|
+
: null,
|
|
191
|
+
...renderedHttpProofResults.map((proof) => `${proof.kind} HTTP proof passed: ${proof.name}`),
|
|
192
|
+
nextAction ? "" : null,
|
|
193
|
+
nextAction,
|
|
194
|
+
]
|
|
195
|
+
.filter((entry) => entry !== null)
|
|
196
|
+
.join("\n");
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
];
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI orchestration for one or more isolated database runtimes and their
|
|
3
|
+
* project-owned proof commands.
|
|
4
|
+
*/
|
|
5
|
+
import { holdApplicationSession } from "../application/session.mjs";
|
|
6
|
+
import type { RehearsalConfigPathOptions } from "../project/configuration.mjs";
|
|
7
|
+
import { buildRehearsalPlan } from "../runtime/plan.mjs";
|
|
8
|
+
import { loadRuntimeTopology } from "../runtime/topology.mjs";
|
|
9
|
+
import type { RuntimeTopologyTarget } from "../runtime/topology.mjs";
|
|
10
|
+
import type { InstalledPackageFingerprint } from "../shared/operation_guard.mjs";
|
|
11
|
+
import type { RehearsalCliFlags } from "./arguments.mjs";
|
|
12
|
+
import type { RehearsalErrorCategory } from "../shared/diagnostics.mjs";
|
|
13
|
+
import type { CliSessionState } from "./command_contract.mjs";
|
|
14
|
+
type RuntimeTopology = Awaited<ReturnType<typeof loadRuntimeTopology>>;
|
|
15
|
+
type RuntimeAction = "run" | "start" | "migrate" | "reset" | "status" | "stop" | "discard" | "verify";
|
|
16
|
+
interface ManagerReceipt {
|
|
17
|
+
readonly action: RuntimeAction;
|
|
18
|
+
readonly target: string;
|
|
19
|
+
readonly durationMs: number;
|
|
20
|
+
readonly output: string;
|
|
21
|
+
}
|
|
22
|
+
interface RuntimeStackResult {
|
|
23
|
+
readonly topology: RuntimeTopology;
|
|
24
|
+
readonly runtime: ManagerReceipt | Readonly<{
|
|
25
|
+
action: RuntimeAction;
|
|
26
|
+
durationMs: number;
|
|
27
|
+
output: string;
|
|
28
|
+
targets: readonly ManagerReceipt[];
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
export declare const buildRuntimeStackPlan: (planOptions: RehearsalConfigPathOptions) => Promise<{
|
|
32
|
+
config: {
|
|
33
|
+
schemaVersion: 1;
|
|
34
|
+
path: string;
|
|
35
|
+
project: string;
|
|
36
|
+
};
|
|
37
|
+
environment: {
|
|
38
|
+
target: "postgresql" | "supabase";
|
|
39
|
+
kind: string;
|
|
40
|
+
applicationUrl: string;
|
|
41
|
+
projectId: string;
|
|
42
|
+
ports: Readonly<{
|
|
43
|
+
api?: number;
|
|
44
|
+
database: number;
|
|
45
|
+
studio?: number;
|
|
46
|
+
}>;
|
|
47
|
+
hostedAccess: "disabled";
|
|
48
|
+
outboundNetwork: "deny";
|
|
49
|
+
authenticationProviders: readonly string[];
|
|
50
|
+
authenticationCallback: string | null;
|
|
51
|
+
barriers: string[];
|
|
52
|
+
};
|
|
53
|
+
baseline: {
|
|
54
|
+
rehearsalVersion: string;
|
|
55
|
+
formatVersion: 1 | 2;
|
|
56
|
+
generationId: string;
|
|
57
|
+
createdAt: string | null;
|
|
58
|
+
migrationCutoff: string;
|
|
59
|
+
migrationHistorySha256: string;
|
|
60
|
+
sanitizationPolicySha256: string;
|
|
61
|
+
dataSha256: string;
|
|
62
|
+
tableCount: number;
|
|
63
|
+
rowCount: number;
|
|
64
|
+
migrationCount: number;
|
|
65
|
+
verification: string;
|
|
66
|
+
};
|
|
67
|
+
migrations: {
|
|
68
|
+
representedCount: number;
|
|
69
|
+
candidateCount: number;
|
|
70
|
+
candidateSha256: string;
|
|
71
|
+
candidates: {
|
|
72
|
+
filename: string;
|
|
73
|
+
sha256: string;
|
|
74
|
+
}[];
|
|
75
|
+
};
|
|
76
|
+
execution: string[];
|
|
77
|
+
guarantee: string;
|
|
78
|
+
paths: {
|
|
79
|
+
artifactDirectory: string;
|
|
80
|
+
migrationDirectory: string;
|
|
81
|
+
sanitizationPolicy: string;
|
|
82
|
+
};
|
|
83
|
+
} | {
|
|
84
|
+
targets: {
|
|
85
|
+
name: string;
|
|
86
|
+
declaration: RuntimeTopologyTarget["declaration"];
|
|
87
|
+
plan: Awaited<ReturnType<typeof buildRehearsalPlan>>;
|
|
88
|
+
}[];
|
|
89
|
+
migrations: {
|
|
90
|
+
candidateCount: number;
|
|
91
|
+
candidateSha256: string;
|
|
92
|
+
};
|
|
93
|
+
execution: string[];
|
|
94
|
+
guarantee: string;
|
|
95
|
+
}>;
|
|
96
|
+
export declare const runRuntimeStackDoctor: (planOptions: RehearsalConfigPathOptions) => Promise<{
|
|
97
|
+
state: string;
|
|
98
|
+
checks: {
|
|
99
|
+
id: string;
|
|
100
|
+
label: string;
|
|
101
|
+
status: string;
|
|
102
|
+
detail: string;
|
|
103
|
+
remediation: string;
|
|
104
|
+
}[];
|
|
105
|
+
ambientHostedVariables?: never;
|
|
106
|
+
} | {
|
|
107
|
+
state: string;
|
|
108
|
+
checks: ({
|
|
109
|
+
status: string;
|
|
110
|
+
detail: unknown;
|
|
111
|
+
durationMs: number;
|
|
112
|
+
remediation?: never;
|
|
113
|
+
id: string;
|
|
114
|
+
label: string;
|
|
115
|
+
} | {
|
|
116
|
+
status: string;
|
|
117
|
+
detail: string;
|
|
118
|
+
remediation: string;
|
|
119
|
+
durationMs: number;
|
|
120
|
+
id: string;
|
|
121
|
+
label: string;
|
|
122
|
+
} | {
|
|
123
|
+
status: string;
|
|
124
|
+
detail: string;
|
|
125
|
+
remediation: string;
|
|
126
|
+
id: string;
|
|
127
|
+
label: string;
|
|
128
|
+
})[];
|
|
129
|
+
ambientHostedVariables: {
|
|
130
|
+
presentButQuarantined: string[];
|
|
131
|
+
note: string;
|
|
132
|
+
};
|
|
133
|
+
}>;
|
|
134
|
+
export declare const topologyCandidateSummary: (planOptions: RehearsalConfigPathOptions) => Promise<{
|
|
135
|
+
baselineGenerationId: string;
|
|
136
|
+
candidateSha256: string;
|
|
137
|
+
candidateCount: number;
|
|
138
|
+
candidates: {
|
|
139
|
+
version: string;
|
|
140
|
+
name: string;
|
|
141
|
+
filename: string;
|
|
142
|
+
sha256: string;
|
|
143
|
+
status: string;
|
|
144
|
+
target: string;
|
|
145
|
+
}[];
|
|
146
|
+
targets: {
|
|
147
|
+
name: string;
|
|
148
|
+
configPath: string;
|
|
149
|
+
baselineGenerationId: string;
|
|
150
|
+
candidateSha256: string;
|
|
151
|
+
candidateCount: number;
|
|
152
|
+
candidates: readonly {
|
|
153
|
+
version: string;
|
|
154
|
+
name: string;
|
|
155
|
+
filename: string;
|
|
156
|
+
sha256: string;
|
|
157
|
+
status: string;
|
|
158
|
+
}[];
|
|
159
|
+
}[];
|
|
160
|
+
topology: Readonly<{
|
|
161
|
+
projectRoot: string;
|
|
162
|
+
primary: RuntimeTopologyTarget;
|
|
163
|
+
dependents: readonly RuntimeTopologyTarget[];
|
|
164
|
+
targets: readonly RuntimeTopologyTarget[];
|
|
165
|
+
}>;
|
|
166
|
+
}>;
|
|
167
|
+
export declare const classifyManagerFailure: ({ action, output, inferredCategory, }: {
|
|
168
|
+
action: RuntimeAction;
|
|
169
|
+
output: string;
|
|
170
|
+
inferredCategory: RehearsalErrorCategory;
|
|
171
|
+
}) => RehearsalErrorCategory;
|
|
172
|
+
export declare const parseDockerCapacity: (output: string) => {
|
|
173
|
+
cpus: number;
|
|
174
|
+
memoryBytes: number;
|
|
175
|
+
runningContainers: number;
|
|
176
|
+
containers: number;
|
|
177
|
+
} | null;
|
|
178
|
+
export declare const parseColimaMemory: (output: string) => {
|
|
179
|
+
totalBytes: number;
|
|
180
|
+
availableBytes: number;
|
|
181
|
+
} | null;
|
|
182
|
+
export declare const topologyCommandEnvironment: (topology: RuntimeTopology) => NodeJS.ProcessEnv;
|
|
183
|
+
export declare const topologyEnvironmentFiles: (topology: RuntimeTopology) => Readonly<Record<string, string>> & {
|
|
184
|
+
readonly primary: string;
|
|
185
|
+
};
|
|
186
|
+
export declare const createRuntimeCommands: ({ packageRoot, projectRoot, managerPath, getActivePackageFingerprint, }: {
|
|
187
|
+
packageRoot: string;
|
|
188
|
+
projectRoot: string;
|
|
189
|
+
managerPath: string;
|
|
190
|
+
getActivePackageFingerprint: () => InstalledPackageFingerprint | undefined;
|
|
191
|
+
}) => {
|
|
192
|
+
openRuntimeApplication: ({ flags, planOptions, session: commandSession, onReady, }: {
|
|
193
|
+
flags: RehearsalCliFlags;
|
|
194
|
+
planOptions: RehearsalConfigPathOptions;
|
|
195
|
+
session: CliSessionState;
|
|
196
|
+
onReady?: Parameters<typeof holdApplicationSession>[0]["onReady"];
|
|
197
|
+
}) => Promise<{
|
|
198
|
+
action: string;
|
|
199
|
+
started: ManagerReceipt | Readonly<{
|
|
200
|
+
action: RuntimeAction;
|
|
201
|
+
durationMs: number;
|
|
202
|
+
output: string;
|
|
203
|
+
targets: readonly ManagerReceipt[];
|
|
204
|
+
}>;
|
|
205
|
+
verified: ManagerReceipt | Readonly<{
|
|
206
|
+
action: RuntimeAction;
|
|
207
|
+
durationMs: number;
|
|
208
|
+
output: string;
|
|
209
|
+
targets: readonly ManagerReceipt[];
|
|
210
|
+
}>;
|
|
211
|
+
preparations: {
|
|
212
|
+
command: string;
|
|
213
|
+
output: string;
|
|
214
|
+
target: string;
|
|
215
|
+
}[];
|
|
216
|
+
application: {
|
|
217
|
+
command: string;
|
|
218
|
+
readiness: Readonly<{
|
|
219
|
+
url: string;
|
|
220
|
+
status: number;
|
|
221
|
+
}>;
|
|
222
|
+
stoppedBy: string;
|
|
223
|
+
diagnostics: import("../application/session.mjs").ApplicationDiagnostics;
|
|
224
|
+
};
|
|
225
|
+
}>;
|
|
226
|
+
prepareCandidateConfirmation: ({ command, flags, planOptions, session, }: {
|
|
227
|
+
command: RuntimeAction;
|
|
228
|
+
flags: RehearsalCliFlags;
|
|
229
|
+
planOptions: RehearsalConfigPathOptions;
|
|
230
|
+
session: CliSessionState;
|
|
231
|
+
}) => Promise<boolean>;
|
|
232
|
+
prepareDependentTargets: ({ topology, environment, }: {
|
|
233
|
+
topology: RuntimeTopology;
|
|
234
|
+
environment: NodeJS.ProcessEnv;
|
|
235
|
+
}) => {
|
|
236
|
+
command: string;
|
|
237
|
+
output: string;
|
|
238
|
+
target: string;
|
|
239
|
+
}[];
|
|
240
|
+
proveRuntimeStack: ({ topology, planOptions, environment, }: {
|
|
241
|
+
topology: RuntimeTopology;
|
|
242
|
+
planOptions: RehearsalConfigPathOptions;
|
|
243
|
+
environment: NodeJS.ProcessEnv;
|
|
244
|
+
}) => Promise<{
|
|
245
|
+
applicationProof: {
|
|
246
|
+
command: string;
|
|
247
|
+
output: string;
|
|
248
|
+
};
|
|
249
|
+
dependentProofs: {
|
|
250
|
+
target: string;
|
|
251
|
+
command: string;
|
|
252
|
+
output: string;
|
|
253
|
+
}[];
|
|
254
|
+
}>;
|
|
255
|
+
runManager: ({ action, flags, configPath, confirmation, targetName, }: {
|
|
256
|
+
action: RuntimeAction;
|
|
257
|
+
flags: RehearsalCliFlags;
|
|
258
|
+
configPath?: string;
|
|
259
|
+
confirmation?: string;
|
|
260
|
+
targetName?: string;
|
|
261
|
+
}) => ManagerReceipt;
|
|
262
|
+
runRuntimeStack: ({ command, flags, planOptions, session, }: {
|
|
263
|
+
command: RuntimeAction;
|
|
264
|
+
flags: RehearsalCliFlags;
|
|
265
|
+
planOptions: RehearsalConfigPathOptions;
|
|
266
|
+
session: CliSessionState;
|
|
267
|
+
}) => Promise<RuntimeStackResult>;
|
|
268
|
+
};
|
|
269
|
+
export {};
|