@caelo-cms/provisioning 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/adapter.d.ts +95 -0
  2. package/dist/adapter.d.ts.map +1 -0
  3. package/dist/adapter.js +3 -0
  4. package/dist/adapter.js.map +1 -0
  5. package/dist/bootstrap-token.d.ts +11 -0
  6. package/dist/bootstrap-token.d.ts.map +1 -0
  7. package/dist/bootstrap-token.js +9 -0
  8. package/dist/bootstrap-token.js.map +1 -0
  9. package/dist/caddy.d.ts +34 -0
  10. package/dist/caddy.d.ts.map +1 -0
  11. package/dist/caddy.js +53 -0
  12. package/dist/caddy.js.map +1 -0
  13. package/{src/cdn-copy.ts → dist/cdn-copy.d.ts} +11 -42
  14. package/dist/cdn-copy.d.ts.map +1 -0
  15. package/dist/cdn-copy.js +48 -0
  16. package/dist/cdn-copy.js.map +1 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +670 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/compose.d.ts +27 -0
  22. package/dist/compose.d.ts.map +1 -0
  23. package/{src/compose.ts → dist/compose.js} +15 -35
  24. package/dist/compose.js.map +1 -0
  25. package/dist/dns/cloudflare.d.ts +9 -0
  26. package/dist/dns/cloudflare.d.ts.map +1 -0
  27. package/dist/dns/cloudflare.js +160 -0
  28. package/dist/dns/cloudflare.js.map +1 -0
  29. package/dist/dns/index.d.ts +12 -0
  30. package/dist/dns/index.d.ts.map +1 -0
  31. package/dist/dns/index.js +42 -0
  32. package/dist/dns/index.js.map +1 -0
  33. package/dist/dns/manual.d.ts +5 -0
  34. package/dist/dns/manual.d.ts.map +1 -0
  35. package/dist/dns/manual.js +96 -0
  36. package/dist/dns/manual.js.map +1 -0
  37. package/dist/dns/types.d.ts +23 -0
  38. package/dist/dns/types.d.ts.map +1 -0
  39. package/dist/dns/types.js +3 -0
  40. package/dist/dns/types.js.map +1 -0
  41. package/dist/gcloud.d.ts +42 -0
  42. package/dist/gcloud.d.ts.map +1 -0
  43. package/dist/gcloud.js +187 -0
  44. package/dist/gcloud.js.map +1 -0
  45. package/dist/index.d.ts +22 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +7 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/install-state.d.ts +54 -0
  50. package/dist/install-state.d.ts.map +1 -0
  51. package/dist/install-state.js +118 -0
  52. package/dist/install-state.js.map +1 -0
  53. package/dist/lifecycle.d.ts +19 -0
  54. package/dist/lifecycle.d.ts.map +1 -0
  55. package/dist/lifecycle.js +589 -0
  56. package/dist/lifecycle.js.map +1 -0
  57. package/dist/migration-runner.d.ts +15 -0
  58. package/dist/migration-runner.d.ts.map +1 -0
  59. package/dist/migration-runner.js +174 -0
  60. package/dist/migration-runner.js.map +1 -0
  61. package/dist/redirects-emit.d.ts +65 -0
  62. package/dist/redirects-emit.d.ts.map +1 -0
  63. package/dist/redirects-emit.js +92 -0
  64. package/dist/redirects-emit.js.map +1 -0
  65. package/dist/wizard.d.ts +35 -0
  66. package/dist/wizard.d.ts.map +1 -0
  67. package/dist/wizard.js +160 -0
  68. package/dist/wizard.js.map +1 -0
  69. package/dist/wizards/gcp-cost.d.ts +27 -0
  70. package/dist/wizards/gcp-cost.d.ts.map +1 -0
  71. package/dist/wizards/gcp-cost.js +77 -0
  72. package/dist/wizards/gcp-cost.js.map +1 -0
  73. package/dist/wizards/gcp-pulumi.d.ts +37 -0
  74. package/dist/wizards/gcp-pulumi.d.ts.map +1 -0
  75. package/dist/wizards/gcp-pulumi.js +100 -0
  76. package/dist/wizards/gcp-pulumi.js.map +1 -0
  77. package/dist/wizards/gcp.d.ts +9 -0
  78. package/dist/wizards/gcp.d.ts.map +1 -0
  79. package/dist/wizards/gcp.js +895 -0
  80. package/dist/wizards/gcp.js.map +1 -0
  81. package/package.json +34 -7
  82. package/stacks/aws/index.ts +6 -7
  83. package/stacks/azure/index.ts +11 -11
  84. package/stacks/gcp/Pulumi.production.yaml +16 -0
  85. package/stacks/gcp/Pulumi.yaml +52 -6
  86. package/stacks/gcp/index.ts +569 -188
  87. package/stacks/self-hosted/index.ts +3 -3
  88. package/static/welcome.html +155 -0
  89. package/src/adapter.ts +0 -103
  90. package/src/bootstrap-token.ts +0 -20
  91. package/src/caddy.ts +0 -93
  92. package/src/cli.ts +0 -674
  93. package/src/index.test.ts +0 -246
  94. package/src/index.ts +0 -52
  95. package/src/redirects-emit.ts +0 -166
  96. package/tsconfig.json +0 -16
package/dist/gcloud.js ADDED
@@ -0,0 +1,187 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * Thin gcloud shell-out wrapper. The wizard composes high-level
4
+ * "create the project + link billing + enable APIs + create SA +
5
+ * grant roles + mint key" flows on top of these primitives.
6
+ *
7
+ * Why shell out instead of using the GCP SDK directly:
8
+ * - the user's gcloud auth state IS the auth (no separate
9
+ * credentials handling — `gcloud` already knows the user)
10
+ * - project create + billing link must happen as the user, NOT as
11
+ * a service account (the SA doesn't exist yet at bootstrap time)
12
+ * - error messages from gcloud are operator-readable; the SDK's
13
+ * gRPC errors aren't
14
+ */
15
+ import { spawn } from "node:child_process";
16
+ /**
17
+ * Run a gcloud command. Buffered stdout + stderr (max 4 MB each).
18
+ * Throws on spawn failure but NOT on non-zero exit — caller checks `ok`.
19
+ */
20
+ export async function gcloud(args, opts = {}) {
21
+ return new Promise((resolveResult, reject) => {
22
+ const child = spawn("gcloud", args, { stdio: ["pipe", "pipe", "pipe"] });
23
+ const stdout = [];
24
+ const stderr = [];
25
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
26
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
27
+ child.on("error", (e) => reject(e));
28
+ child.on("close", (code) => resolveResult({
29
+ ok: code === 0,
30
+ stdout: Buffer.concat(stdout).toString("utf8"),
31
+ stderr: Buffer.concat(stderr).toString("utf8"),
32
+ exitCode: code ?? 1,
33
+ }));
34
+ if (opts.stdin !== undefined) {
35
+ child.stdin.write(opts.stdin);
36
+ child.stdin.end();
37
+ }
38
+ });
39
+ }
40
+ /**
41
+ * Active gcloud account. Returns `null` when no account is logged in
42
+ * — caller prompts `gcloud auth login`.
43
+ */
44
+ export async function activeAccount() {
45
+ const r = await gcloud(["auth", "list", "--format=value(account)", "--filter=status:ACTIVE"]);
46
+ if (!r.ok)
47
+ return null;
48
+ const value = r.stdout.trim();
49
+ return value.length > 0 ? value : null;
50
+ }
51
+ export async function listBillingAccounts() {
52
+ const r = await gcloud(["billing", "accounts", "list", "--format=json"]);
53
+ if (!r.ok)
54
+ return [];
55
+ try {
56
+ const rows = JSON.parse(r.stdout);
57
+ return rows.map((row) => ({
58
+ id: row.name.replace(/^billingAccounts\//, ""),
59
+ displayName: row.displayName,
60
+ open: row.open,
61
+ }));
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ }
67
+ export async function projectExists(projectId) {
68
+ const r = await gcloud(["projects", "describe", projectId, "--format=value(projectId)"]);
69
+ return r.ok && r.stdout.trim() === projectId;
70
+ }
71
+ export async function createProject(projectId, displayName) {
72
+ return gcloud(["projects", "create", projectId, "--name", displayName]);
73
+ }
74
+ export async function linkBilling(projectId, billingAccountId) {
75
+ return gcloud(["billing", "projects", "link", projectId, "--billing-account", billingAccountId]);
76
+ }
77
+ const REQUIRED_APIS = [
78
+ "compute.googleapis.com",
79
+ "sqladmin.googleapis.com",
80
+ "run.googleapis.com",
81
+ "secretmanager.googleapis.com",
82
+ "servicenetworking.googleapis.com",
83
+ "dns.googleapis.com",
84
+ "storage.googleapis.com",
85
+ "cloudresourcemanager.googleapis.com",
86
+ "iam.googleapis.com",
87
+ "cloudbuild.googleapis.com",
88
+ "artifactregistry.googleapis.com",
89
+ "bigquery.googleapis.com",
90
+ "iap.googleapis.com",
91
+ // Used by gcp.projects.ServiceIdentity to provision the IAP-managed
92
+ // service account that forwards authenticated requests to Cloud Run.
93
+ "serviceusage.googleapis.com",
94
+ ];
95
+ export async function enableApis(projectId) {
96
+ return gcloud(["services", "enable", ...REQUIRED_APIS, "--project", projectId]);
97
+ }
98
+ export async function serviceAccountExists(projectId, saEmail) {
99
+ const r = await gcloud([
100
+ "iam",
101
+ "service-accounts",
102
+ "describe",
103
+ saEmail,
104
+ "--project",
105
+ projectId,
106
+ "--format=value(email)",
107
+ ]);
108
+ return r.ok && r.stdout.trim() === saEmail;
109
+ }
110
+ export async function createServiceAccount(projectId, accountId, displayName) {
111
+ return gcloud([
112
+ "iam",
113
+ "service-accounts",
114
+ "create",
115
+ accountId,
116
+ "--display-name",
117
+ displayName,
118
+ "--project",
119
+ projectId,
120
+ ]);
121
+ }
122
+ const PROVISIONER_ROLES = [
123
+ "roles/run.admin",
124
+ "roles/cloudsql.admin",
125
+ "roles/storage.admin",
126
+ "roles/secretmanager.admin",
127
+ "roles/iam.serviceAccountUser",
128
+ "roles/compute.networkAdmin",
129
+ "roles/dns.admin",
130
+ "roles/servicenetworking.networksAdmin",
131
+ "roles/iam.serviceAccountTokenCreator",
132
+ "roles/cloudbuild.builds.editor",
133
+ "roles/artifactregistry.admin",
134
+ "roles/compute.securityAdmin",
135
+ "roles/iam.serviceAccountAdmin",
136
+ "roles/bigquery.admin",
137
+ "roles/iap.admin",
138
+ // compute.admin includes RegionNetworkEndpointGroups + URL maps +
139
+ // BackendService variants the LB needs. compute.networkAdmin alone
140
+ // doesn't cover NEG create.
141
+ "roles/compute.admin",
142
+ // logging.configWriter creates ProjectSink (BigQuery edge logs).
143
+ "roles/logging.configWriter",
144
+ // serviceusage.serviceUsageAdmin lets us trigger the IAP managed
145
+ // service identity (gcp.projects.ServiceIdentity).
146
+ "roles/serviceusage.serviceUsageAdmin",
147
+ ];
148
+ /**
149
+ * Bind every role the GCP stack provisioner SA needs. Idempotent —
150
+ * gcloud silently no-ops a binding that already exists.
151
+ */
152
+ export async function grantProvisionerRoles(projectId, saEmail) {
153
+ let granted = 0;
154
+ const failed = [];
155
+ for (const role of PROVISIONER_ROLES) {
156
+ const r = await gcloud([
157
+ "projects",
158
+ "add-iam-policy-binding",
159
+ projectId,
160
+ "--member",
161
+ `serviceAccount:${saEmail}`,
162
+ "--role",
163
+ role,
164
+ "--condition=None",
165
+ "--quiet",
166
+ ]);
167
+ if (r.ok)
168
+ granted++;
169
+ else
170
+ failed.push(role);
171
+ }
172
+ return { granted, failed };
173
+ }
174
+ export async function createServiceAccountKey(saEmail, outputPath) {
175
+ return gcloud([
176
+ "iam",
177
+ "service-accounts",
178
+ "keys",
179
+ "create",
180
+ outputPath,
181
+ "--iam-account",
182
+ saEmail,
183
+ ]);
184
+ }
185
+ export const REQUIRED_API_LIST = REQUIRED_APIS;
186
+ export const PROVISIONER_ROLE_LIST = PROVISIONER_ROLES;
187
+ //# sourceMappingURL=gcloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcloud.js","sourceRoot":"","sources":["../src/gcloud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @caelo-cms/provisioning — P14.
3
+ *
4
+ * Pulumi-driven self-hosted stack + cms-provision CLI helpers.
5
+ *
6
+ * Public surface:
7
+ * - generateCaddyfile(spec) → string
8
+ * - generateDockerCompose(spec) → string
9
+ * - generateBootstrapToken() → { token, expiresAt }
10
+ *
11
+ * The CLI (cli.ts) wires these into init / up / regenerate-caddy /
12
+ * backup / restore / status sub-commands. The Pulumi stack files
13
+ * (stacks/self-hosted/*) are imported by the CLI's `up` path and
14
+ * declare the actual Docker resources.
15
+ */
16
+ export type { CloudAdapterInputs, CloudAdapterOutputs, DnsRecord, Environment, LocaleConfig, LocaleStrategy, ProvisioningOutputsJson, SupportedProvider, } from "./adapter.js";
17
+ export { type BootstrapToken, generateBootstrapToken, } from "./bootstrap-token.js";
18
+ export { type CaddyDomainSpec, type CaddyfileSpec, generateCaddyfile, } from "./caddy.js";
19
+ export { type CdnCopyAdapter, loadCdnCopyAdapter, selfHostedCdnCopy, } from "./cdn-copy.js";
20
+ export { type ComposeSpec, generateDockerCompose } from "./compose.js";
21
+ export { type CloudFrontRedirectArtifact, emitRedirectsAzureFrontDoor, emitRedirectsCloudFront, emitRedirectsCloudflare, type FrontDoorRule, type RedirectRow, type RedirectStatusCode, } from "./redirects-emit.js";
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,YAAY,EACZ,cAAc,EACd,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,cAAc,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,cAAc,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EACL,KAAK,0BAA0B,EAC/B,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ export { generateBootstrapToken, } from "./bootstrap-token.js";
3
+ export { generateCaddyfile, } from "./caddy.js";
4
+ export { loadCdnCopyAdapter, selfHostedCdnCopy, } from "./cdn-copy.js";
5
+ export { generateDockerCompose } from "./compose.js";
6
+ export { emitRedirectsAzureFrontDoor, emitRedirectsCloudFront, emitRedirectsCloudflare, } from "./redirects-emit.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AA4BnC,OAAO,EAEL,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAoB,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAEL,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,GAIxB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,54 @@
1
+ export type Provider = "self-hosted" | "gcp" | "aws" | "azure";
2
+ export interface InstallMetadata {
3
+ installId: string;
4
+ provider: Provider;
5
+ /** Cloud-side project / account / subscription id. NULL for self-hosted. */
6
+ projectId: string | null;
7
+ domain: string;
8
+ ownerEmail: string;
9
+ region: string | null;
10
+ createdAt: string;
11
+ }
12
+ export interface ProgressCheckpoint {
13
+ /** Last completed wizard step. Used for resume-after-failure. */
14
+ lastCompletedStep: string | null;
15
+ /** Per-step state (e.g. createdProjectId, mintedSaKeyAt, etc.). */
16
+ steps: Record<string, unknown>;
17
+ /** ISO timestamp of last successful update. */
18
+ updatedAt: string;
19
+ }
20
+ export declare function installRoot(installId: string): string;
21
+ /**
22
+ * Stable install id from the (provider, projectId-or-domain) pair so a re-run
23
+ * with the same inputs always lands on the same `~/.caelo-<id>/` directory.
24
+ * The id is short + readable — `gcp-caelo-website` / `self-hosted-mysite-com`.
25
+ */
26
+ export declare function deriveInstallId(provider: Provider, projectIdOrDomain: string): string;
27
+ /**
28
+ * Ensure the install directory exists with the right mode + sub-dirs.
29
+ * Idempotent.
30
+ */
31
+ export declare function ensureInstallDir(installId: string): {
32
+ root: string;
33
+ secretsDir: string;
34
+ stateDir: string;
35
+ };
36
+ export declare function readMetadata(installId: string): InstallMetadata | null;
37
+ export declare function writeMetadata(installId: string, meta: InstallMetadata): void;
38
+ export declare function readProgress(installId: string): ProgressCheckpoint;
39
+ export declare function writeProgress(installId: string, checkpoint: ProgressCheckpoint): void;
40
+ /**
41
+ * Mark a step complete. Wizard re-runs check `isStepDone(installId, name)` to
42
+ * skip already-done steps.
43
+ */
44
+ export declare function markStepDone(installId: string, stepName: string, payload?: unknown): void;
45
+ export declare function isStepDone(installId: string, stepName: string): boolean;
46
+ export declare function getStepPayload<T>(installId: string, stepName: string): T | null;
47
+ /**
48
+ * Read a secret file from the install's `secrets/` dir. Returns null if the
49
+ * file doesn't exist; throws if the file exists but has the wrong mode (a
50
+ * defence against the user copy-pasting a key into a 644 file by mistake).
51
+ */
52
+ export declare function readSecret(installId: string, name: string): string | null;
53
+ export declare function writeSecret(installId: string, name: string, value: string): void;
54
+ //# sourceMappingURL=install-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-state.d.ts","sourceRoot":"","sources":["../src/install-state.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAOrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAeA;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAItE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAG5E;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAMlE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAOrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAKzF;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAG/E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzE;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhF"}
@@ -0,0 +1,118 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * Per-install state — every Caelo install gets its own
4
+ * `~/.caelo-<install-id>/` directory with:
5
+ *
6
+ * secrets/ — mode-700 dir for the install's secrets
7
+ * anthropic-api-key (mode 600) — Anthropic API key (one-time prompt)
8
+ * pulumi-passphrase (mode 600) — Pulumi local-backend passphrase
9
+ * sa-key.json (mode 600) — GCP SA key (when local-deploy; absent
10
+ * when Workload Identity Federation
11
+ * deploys from CI)
12
+ * state/ — Pulumi local backend state (per-install isolated)
13
+ * progress.json — wizard checkpoint so re-runs resume cleanly
14
+ * install.json — install metadata (provider, project id, region,
15
+ * domain, owner email, install id, created_at)
16
+ *
17
+ * The CLAUDE.md §11.C contract: end-users never reach into this directory
18
+ * by hand. The wizard + lifecycle commands wrap every read + write.
19
+ */
20
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
21
+ import { homedir } from "node:os";
22
+ import { join } from "node:path";
23
+ const ROOT_PREFIX = ".caelo-";
24
+ export function installRoot(installId) {
25
+ return join(homedir(), `${ROOT_PREFIX}${installId}`);
26
+ }
27
+ /**
28
+ * Stable install id from the (provider, projectId-or-domain) pair so a re-run
29
+ * with the same inputs always lands on the same `~/.caelo-<id>/` directory.
30
+ * The id is short + readable — `gcp-caelo-website` / `self-hosted-mysite-com`.
31
+ */
32
+ export function deriveInstallId(provider, projectIdOrDomain) {
33
+ const slug = projectIdOrDomain
34
+ .toLowerCase()
35
+ .replace(/[^a-z0-9]+/g, "-")
36
+ .replace(/^-+|-+$/g, "")
37
+ .slice(0, 40);
38
+ return `${provider}-${slug}`;
39
+ }
40
+ /**
41
+ * Ensure the install directory exists with the right mode + sub-dirs.
42
+ * Idempotent.
43
+ */
44
+ export function ensureInstallDir(installId) {
45
+ const root = installRoot(installId);
46
+ const secretsDir = join(root, "secrets");
47
+ const stateDir = join(root, "state");
48
+ if (!existsSync(root))
49
+ mkdirSync(root, { recursive: true, mode: 0o700 });
50
+ if (!existsSync(secretsDir))
51
+ mkdirSync(secretsDir, { recursive: true, mode: 0o700 });
52
+ if (!existsSync(stateDir))
53
+ mkdirSync(stateDir, { recursive: true, mode: 0o700 });
54
+ // chmod every time in case the dirs existed with looser perms.
55
+ chmodSync(root, 0o700);
56
+ chmodSync(secretsDir, 0o700);
57
+ chmodSync(stateDir, 0o700);
58
+ return { root, secretsDir, stateDir };
59
+ }
60
+ export function readMetadata(installId) {
61
+ const path = join(installRoot(installId), "install.json");
62
+ if (!existsSync(path))
63
+ return null;
64
+ return JSON.parse(readFileSync(path, "utf8"));
65
+ }
66
+ export function writeMetadata(installId, meta) {
67
+ const path = join(installRoot(installId), "install.json");
68
+ writeFileSync(path, `${JSON.stringify(meta, null, 2)}\n`, { mode: 0o600 });
69
+ }
70
+ export function readProgress(installId) {
71
+ const path = join(installRoot(installId), "progress.json");
72
+ if (!existsSync(path)) {
73
+ return { lastCompletedStep: null, steps: {}, updatedAt: new Date().toISOString() };
74
+ }
75
+ return JSON.parse(readFileSync(path, "utf8"));
76
+ }
77
+ export function writeProgress(installId, checkpoint) {
78
+ const path = join(installRoot(installId), "progress.json");
79
+ writeFileSync(path, `${JSON.stringify({ ...checkpoint, updatedAt: new Date().toISOString() }, null, 2)}\n`, { mode: 0o600 });
80
+ }
81
+ /**
82
+ * Mark a step complete. Wizard re-runs check `isStepDone(installId, name)` to
83
+ * skip already-done steps.
84
+ */
85
+ export function markStepDone(installId, stepName, payload) {
86
+ const cur = readProgress(installId);
87
+ cur.lastCompletedStep = stepName;
88
+ if (payload !== undefined)
89
+ cur.steps[stepName] = payload;
90
+ writeProgress(installId, cur);
91
+ }
92
+ export function isStepDone(installId, stepName) {
93
+ return readProgress(installId).steps[stepName] !== undefined;
94
+ }
95
+ export function getStepPayload(installId, stepName) {
96
+ const v = readProgress(installId).steps[stepName];
97
+ return (v ?? null);
98
+ }
99
+ /**
100
+ * Read a secret file from the install's `secrets/` dir. Returns null if the
101
+ * file doesn't exist; throws if the file exists but has the wrong mode (a
102
+ * defence against the user copy-pasting a key into a 644 file by mistake).
103
+ */
104
+ export function readSecret(installId, name) {
105
+ const path = join(installRoot(installId), "secrets", name);
106
+ if (!existsSync(path))
107
+ return null;
108
+ const contents = readFileSync(path, "utf8").trim();
109
+ if (contents.length === 0)
110
+ return null;
111
+ return contents;
112
+ }
113
+ export function writeSecret(installId, name, value) {
114
+ ensureInstallDir(installId);
115
+ const path = join(installRoot(installId), "secrets", name);
116
+ writeFileSync(path, value.endsWith("\n") ? value : `${value}\n`, { mode: 0o600 });
117
+ }
118
+ //# sourceMappingURL=install-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-state.js","sourceRoot":"","sources":["../src/install-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ interface UpgradeOpts {
3
+ /** Explicit semver to roll to (e.g. "0.5.3"). Defaults to "latest". */
4
+ readonly version?: string;
5
+ /** Pre-release channel: "stable" (default), "rc", "beta". */
6
+ readonly channel?: "stable" | "rc" | "beta";
7
+ /**
8
+ * P21 ship 4 — escape hatch for forks / staging environments using
9
+ * unsigned images. Default = verify with cosign; refuse to roll on
10
+ * mismatch.
11
+ */
12
+ readonly skipVerify?: boolean;
13
+ }
14
+ export declare function upgradeCommand(opts?: UpgradeOpts): Promise<void>;
15
+ export declare function backupCommand(): Promise<void>;
16
+ export declare function rotateSecretCommand(name: string | undefined): Promise<void>;
17
+ export declare function destroyCommand(): Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAyGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD;AA0GD,UAAU,WAAW;IACnB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAqGD,wBAAsB,cAAc,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsL1E;AAwGD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCnD;AAMD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCjF;AAMD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA6CpD"}