@mp-lb/arcnet 0.0.0-stage → 0.2.0

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 (239) hide show
  1. package/README.md +48 -2
  2. package/dist/addDependency.d.ts +3 -0
  3. package/dist/addDependency.d.ts.map +1 -0
  4. package/dist/addDependency.js +29 -0
  5. package/dist/addDependency.js.map +1 -0
  6. package/dist/apiClient.d.ts +3 -0
  7. package/dist/apiClient.d.ts.map +1 -0
  8. package/dist/apiClient.js +39 -0
  9. package/dist/apiClient.js.map +1 -0
  10. package/dist/checkIdentity.d.ts +3 -0
  11. package/dist/checkIdentity.d.ts.map +1 -0
  12. package/dist/checkIdentity.js +9 -0
  13. package/dist/checkIdentity.js.map +1 -0
  14. package/dist/ciOutputs.d.ts +2 -0
  15. package/dist/ciOutputs.d.ts.map +1 -0
  16. package/dist/ciOutputs.js +31 -0
  17. package/dist/ciOutputs.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +9 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/createCli.d.ts +3 -0
  23. package/dist/createCli.d.ts.map +1 -0
  24. package/dist/createCli.js +90 -0
  25. package/dist/createCli.js.map +1 -0
  26. package/dist/createProject.d.ts +26 -0
  27. package/dist/createProject.d.ts.map +1 -0
  28. package/dist/createProject.js +35 -0
  29. package/dist/createProject.js.map +1 -0
  30. package/dist/createSetupCommand.d.ts +3 -0
  31. package/dist/createSetupCommand.d.ts.map +1 -0
  32. package/dist/createSetupCommand.js +11 -0
  33. package/dist/createSetupCommand.js.map +1 -0
  34. package/dist/deploy.d.ts +3 -0
  35. package/dist/deploy.d.ts.map +1 -0
  36. package/dist/deploy.js +47 -0
  37. package/dist/deploy.js.map +1 -0
  38. package/dist/fail.d.ts +2 -0
  39. package/dist/fail.d.ts.map +1 -0
  40. package/dist/fail.js +4 -0
  41. package/dist/fail.js.map +1 -0
  42. package/dist/index.d.ts +3 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +3 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/inspectReferences.d.ts +3 -0
  47. package/dist/inspectReferences.d.ts.map +1 -0
  48. package/dist/inspectReferences.js +10 -0
  49. package/dist/inspectReferences.js.map +1 -0
  50. package/dist/inspectStaticTree.d.ts +2 -0
  51. package/dist/inspectStaticTree.d.ts.map +1 -0
  52. package/dist/inspectStaticTree.js +17 -0
  53. package/dist/inspectStaticTree.js.map +1 -0
  54. package/dist/packageInfo.d.ts +3 -0
  55. package/dist/packageInfo.d.ts.map +1 -0
  56. package/dist/packageInfo.js +9 -0
  57. package/dist/packageInfo.js.map +1 -0
  58. package/dist/parseSelection.d.ts +3 -0
  59. package/dist/parseSelection.d.ts.map +1 -0
  60. package/dist/parseSelection.js +13 -0
  61. package/dist/parseSelection.js.map +1 -0
  62. package/dist/parseSetupInput.d.ts +16 -0
  63. package/dist/parseSetupInput.d.ts.map +1 -0
  64. package/dist/parseSetupInput.js +34 -0
  65. package/dist/parseSetupInput.js.map +1 -0
  66. package/dist/readSelection.d.ts +15 -0
  67. package/dist/readSelection.d.ts.map +1 -0
  68. package/dist/readSelection.js +36 -0
  69. package/dist/readSelection.js.map +1 -0
  70. package/dist/renderPlan.d.ts +27 -0
  71. package/dist/renderPlan.d.ts.map +1 -0
  72. package/dist/renderPlan.js +25 -0
  73. package/dist/renderPlan.js.map +1 -0
  74. package/dist/renderResult.d.ts +5 -0
  75. package/dist/renderResult.d.ts.map +1 -0
  76. package/dist/renderResult.js +15 -0
  77. package/dist/renderResult.js.map +1 -0
  78. package/dist/resolveRepository.d.ts +2 -0
  79. package/dist/resolveRepository.d.ts.map +1 -0
  80. package/dist/resolveRepository.js +24 -0
  81. package/dist/resolveRepository.js.map +1 -0
  82. package/dist/runProcess.d.ts +2 -0
  83. package/dist/runProcess.d.ts.map +1 -0
  84. package/dist/runProcess.js +16 -0
  85. package/dist/runProcess.js.map +1 -0
  86. package/dist/runTerraform.d.ts +8 -0
  87. package/dist/runTerraform.d.ts.map +1 -0
  88. package/dist/runTerraform.js +111 -0
  89. package/dist/runTerraform.js.map +1 -0
  90. package/dist/runVercel.d.ts +34 -0
  91. package/dist/runVercel.d.ts.map +1 -0
  92. package/dist/runVercel.js +52 -0
  93. package/dist/runVercel.js.map +1 -0
  94. package/dist/safePath.d.ts +2 -0
  95. package/dist/safePath.d.ts.map +1 -0
  96. package/dist/safePath.js +35 -0
  97. package/dist/safePath.js.map +1 -0
  98. package/dist/safeTargetPath.d.ts +2 -0
  99. package/dist/safeTargetPath.d.ts.map +1 -0
  100. package/dist/safeTargetPath.js +29 -0
  101. package/dist/safeTargetPath.js.map +1 -0
  102. package/dist/schemas.d.ts +106 -0
  103. package/dist/schemas.d.ts.map +1 -0
  104. package/dist/schemas.js +85 -0
  105. package/dist/schemas.js.map +1 -0
  106. package/dist/secrets/assertNewSource.d.ts +3 -0
  107. package/dist/secrets/assertNewSource.d.ts.map +1 -0
  108. package/dist/secrets/assertNewSource.js +32 -0
  109. package/dist/secrets/assertNewSource.js.map +1 -0
  110. package/dist/secrets/config.d.ts +37 -0
  111. package/dist/secrets/config.d.ts.map +1 -0
  112. package/dist/secrets/config.js +67 -0
  113. package/dist/secrets/config.js.map +1 -0
  114. package/dist/secrets/createSecretsCommands.d.ts +3 -0
  115. package/dist/secrets/createSecretsCommands.d.ts.map +1 -0
  116. package/dist/secrets/createSecretsCommands.js +93 -0
  117. package/dist/secrets/createSecretsCommands.js.map +1 -0
  118. package/dist/secrets/loadSecrets.d.ts +3 -0
  119. package/dist/secrets/loadSecrets.d.ts.map +1 -0
  120. package/dist/secrets/loadSecrets.js +35 -0
  121. package/dist/secrets/loadSecrets.js.map +1 -0
  122. package/dist/secrets/promptPassword.d.ts +2 -0
  123. package/dist/secrets/promptPassword.d.ts.map +1 -0
  124. package/dist/secrets/promptPassword.js +42 -0
  125. package/dist/secrets/promptPassword.js.map +1 -0
  126. package/dist/secrets/provisionSource.d.ts +25 -0
  127. package/dist/secrets/provisionSource.d.ts.map +1 -0
  128. package/dist/secrets/provisionSource.js +141 -0
  129. package/dist/secrets/provisionSource.js.map +1 -0
  130. package/dist/secrets/readRemoteSource.d.ts +7 -0
  131. package/dist/secrets/readRemoteSource.d.ts.map +1 -0
  132. package/dist/secrets/readRemoteSource.js +32 -0
  133. package/dist/secrets/readRemoteSource.js.map +1 -0
  134. package/dist/secrets/runWithSecrets.d.ts +6 -0
  135. package/dist/secrets/runWithSecrets.d.ts.map +1 -0
  136. package/dist/secrets/runWithSecrets.js +59 -0
  137. package/dist/secrets/runWithSecrets.js.map +1 -0
  138. package/dist/secrets/secretCommand.d.ts +2 -0
  139. package/dist/secrets/secretCommand.d.ts.map +1 -0
  140. package/dist/secrets/secretCommand.js +17 -0
  141. package/dist/secrets/secretCommand.js.map +1 -0
  142. package/dist/secrets/selectSecrets.d.ts +3 -0
  143. package/dist/secrets/selectSecrets.d.ts.map +1 -0
  144. package/dist/secrets/selectSecrets.js +18 -0
  145. package/dist/secrets/selectSecrets.js.map +1 -0
  146. package/dist/secrets/syncSecrets.d.ts +10 -0
  147. package/dist/secrets/syncSecrets.d.ts.map +1 -0
  148. package/dist/secrets/syncSecrets.js +43 -0
  149. package/dist/secrets/syncSecrets.js.map +1 -0
  150. package/dist/secrets/wireSecretsWorkflows.d.ts +2 -0
  151. package/dist/secrets/wireSecretsWorkflows.d.ts.map +1 -0
  152. package/dist/secrets/wireSecretsWorkflows.js +48 -0
  153. package/dist/secrets/wireSecretsWorkflows.js.map +1 -0
  154. package/dist/secrets/withDeploymentSecrets.d.ts +2 -0
  155. package/dist/secrets/withDeploymentSecrets.d.ts.map +1 -0
  156. package/dist/secrets/withDeploymentSecrets.js +58 -0
  157. package/dist/secrets/withDeploymentSecrets.js.map +1 -0
  158. package/dist/secrets/writeSecretsWorkflow.d.ts +3 -0
  159. package/dist/secrets/writeSecretsWorkflow.d.ts.map +1 -0
  160. package/dist/secrets/writeSecretsWorkflow.js +60 -0
  161. package/dist/secrets/writeSecretsWorkflow.js.map +1 -0
  162. package/dist/selectNetwork.d.ts +26 -0
  163. package/dist/selectNetwork.d.ts.map +1 -0
  164. package/dist/selectNetwork.js +48 -0
  165. package/dist/selectNetwork.js.map +1 -0
  166. package/dist/setup.d.ts +2 -0
  167. package/dist/setup.d.ts.map +1 -0
  168. package/dist/setup.js +192 -0
  169. package/dist/setup.js.map +1 -0
  170. package/dist/setupReport.d.ts +8 -0
  171. package/dist/setupReport.d.ts.map +1 -0
  172. package/dist/setupReport.js +2 -0
  173. package/dist/setupReport.js.map +1 -0
  174. package/dist/setupVercel.d.ts +9 -0
  175. package/dist/setupVercel.d.ts.map +1 -0
  176. package/dist/setupVercel.js +72 -0
  177. package/dist/setupVercel.js.map +1 -0
  178. package/dist/stageSite.d.ts +3 -0
  179. package/dist/stageSite.d.ts.map +1 -0
  180. package/dist/stageSite.js +31 -0
  181. package/dist/stageSite.js.map +1 -0
  182. package/dist/validateConfig.d.ts +3 -0
  183. package/dist/validateConfig.d.ts.map +1 -0
  184. package/dist/validateConfig.js +17 -0
  185. package/dist/validateConfig.js.map +1 -0
  186. package/docs/public/commands.md +132 -0
  187. package/docs/public/llms-full.txt +182 -0
  188. package/package.json +50 -3
  189. package/src/addDependency.ts +41 -0
  190. package/src/apiClient.ts +51 -0
  191. package/src/checkIdentity.ts +18 -0
  192. package/src/ciOutputs.ts +47 -0
  193. package/src/cli.ts +11 -0
  194. package/src/createCli.ts +128 -0
  195. package/src/createProject.ts +66 -0
  196. package/src/createSetupCommand.ts +16 -0
  197. package/src/deploy.ts +71 -0
  198. package/src/fail.ts +3 -0
  199. package/src/index.ts +2 -0
  200. package/src/inspectReferences.ts +20 -0
  201. package/src/inspectStaticTree.ts +19 -0
  202. package/src/packageInfo.ts +10 -0
  203. package/src/parseSelection.ts +22 -0
  204. package/src/parseSetupInput.ts +40 -0
  205. package/src/readSelection.ts +47 -0
  206. package/src/renderPlan.ts +27 -0
  207. package/src/renderResult.ts +18 -0
  208. package/src/resolveRepository.ts +38 -0
  209. package/src/runProcess.ts +26 -0
  210. package/src/runTerraform.ts +182 -0
  211. package/src/runVercel.ts +77 -0
  212. package/src/safePath.ts +43 -0
  213. package/src/safeTargetPath.ts +32 -0
  214. package/src/schemas.ts +126 -0
  215. package/src/secrets/assertNewSource.ts +40 -0
  216. package/src/secrets/config.ts +91 -0
  217. package/src/secrets/createSecretsCommands.ts +189 -0
  218. package/src/secrets/loadSecrets.ts +53 -0
  219. package/src/secrets/promptPassword.ts +46 -0
  220. package/src/secrets/provisionSource.ts +238 -0
  221. package/src/secrets/readRemoteSource.ts +73 -0
  222. package/src/secrets/runWithSecrets.ts +71 -0
  223. package/src/secrets/secretCommand.ts +26 -0
  224. package/src/secrets/selectSecrets.ts +33 -0
  225. package/src/secrets/syncSecrets.ts +60 -0
  226. package/src/secrets/wireSecretsWorkflows.ts +57 -0
  227. package/src/secrets/withDeploymentSecrets.ts +77 -0
  228. package/src/secrets/writeSecretsWorkflow.ts +83 -0
  229. package/src/selectNetwork.ts +73 -0
  230. package/src/setup.ts +277 -0
  231. package/src/setupReport.ts +11 -0
  232. package/src/setupVercel.ts +126 -0
  233. package/src/stageSite.ts +54 -0
  234. package/src/validateConfig.ts +22 -0
  235. package/templates/deploy-arc.yaml +73 -0
  236. package/templates/deploy-vercel.yaml +43 -0
  237. package/templates/network.yaml +105 -0
  238. package/templates/vercel-static/main.tf +128 -0
  239. package/templates/vercel-static/module.yaml +51 -0
package/README.md CHANGED
@@ -1,3 +1,49 @@
1
- # Temporary Holding Version
1
+ # @mp-lb/arcnet
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ ArcNet's TypeScript CLI for installing deployment configuration and deploying projects. The package owns shared runners, validation, workflow templates and the Vercel Terraform module; projects keep configuration and application-specific Dockerfiles.
4
+
5
+ From an existing project with Zap, GitHub, and pinned pnpm:
6
+
7
+ ```sh
8
+ pnpm dlx @mp-lb/arcnet@0.2.0 setup hello-world --dry-run
9
+ pnpm dlx @mp-lb/arcnet@0.2.0 setup hello-world
10
+ pnpm install
11
+ pnpm exec arcnet check
12
+ ```
13
+
14
+ Setup pins this package in the existing root manifest. Commit the resulting lockfile. Deployment starts disabled, and setup never provisions cloud resources. Upgrades use the project's normal dependency workflow.
15
+
16
+ [Project setup](https://github.com/mp-lb/stackforge/blob/main/arcnet/SETUP.md) · [Environment setup](https://github.com/mp-lb/stackforge/blob/main/arcnet/environment/setup.md) · [Audit](https://github.com/mp-lb/stackforge/blob/main/arcnet/AUDIT.md) · [Command reference](docs/public/commands.md)
17
+
18
+ Zap Arc remains the pinned Terraform engine dependency. Environment bootstrap, health checks and teardown are not implemented by this package yet. The static Vercel adapter retains its existing static-only and explicit-project-reference limitations.
19
+
20
+ ## Layered secrets
21
+
22
+ `arcnet secrets add` attaches an existing Forum encrypted JSON file. `arcnet secrets init` creates one. Both register a file-specific decryption key in the selected GitHub repository, save an encrypted snapshot, and generate a validation workflow. Setup prompts for your Forum encryption password locally; it never prints the password or recipient key. Use `--existing-key` when the GitHub secret already exists. The local `fm` and `gh` CLIs must be authenticated; the selected Forum parent directory must exist.
23
+
24
+ The project keeps only `.arcnet/secrets.json`, encrypted snapshots under `.arcnet/secrets/`, and workflow references. Sources merge left to right, with later values winning. Each source names its own key environment variable. JSON must be an object; unused structured values are allowed, while selected environment values must be nonempty strings. Consumer mappings select and rename fields; an array of source names accepts aliases only when their values agree.
25
+
26
+ ```json
27
+ {
28
+ "version": 1,
29
+ "repository": "example/hello-world",
30
+ "sources": [
31
+ { "name": "standard", "store": "example/company", "path": "/admin/standard.json.enc", "keyEnv": "STANDARD_SECRETS_KEY" },
32
+ { "name": "project", "store": "example/company", "path": "/admin/hello-world.json.enc", "keyEnv": "PROJECT_SECRETS_KEY" }
33
+ ],
34
+ "consumers": {
35
+ "publish": { "NODE_AUTH_TOKEN": ["NPM_TOKEN", "NODE_AUTH_TOKEN"] },
36
+ "deploy": { "VERCEL_TOKEN": "VERCEL_API_TOKEN" }
37
+ }
38
+ }
39
+ ```
40
+
41
+ `secrets sync` fetches ciphertext and adds snapshot identity, revision and checksum to this configuration. Commit config and ciphertext together. CI uses the reviewed snapshots and needs only each file's decryption key, not a Forum login. Sync after editing or rotating a source; obsolete snapshots can be removed after checking that no configuration references them. Setup/sync also wire source-key references into workflow steps that call ArcNet's env or deployment commands.
42
+
43
+ For live loading, omit a snapshot or select `--live`: the installed `fm` CLI fetches each source using its local login or the source's optional `tokenEnv` access credential. A decryption recipient is **not** a Forum read token. Live CI therefore needs an installed, authenticated `fm` as well as the independent decryption keys. Generated CI intentionally uses snapshots.
44
+
45
+ `arcnet env check` reports source names and selected key names, never values. `arcnet env export` explicitly emits selected plaintext JSON. `arcnet env run` gives a subprocess only the selected values and a small execution environment; it removes file keys, isolates temporary HOME/cache paths, and withholds subprocess output. Keep npm publishing mappings scoped to publishing credentials. The command reference documents the exact options.
46
+
47
+ When `.arcnet/secrets.json` exists, deployment commands automatically load it. The `deploy` consumer selects operator credentials; Terraform application values are selected using the existing service env lists in `zap.yaml`. No duplicated application map is required. Offline project checks remain offline. Secrets commands in GitHub Actions require the configured repository's main branch.
48
+
49
+ Provisioning modifies Forum and GitHub separately. A failed GitHub upload leaves an unused Forum recipient; rerun `secrets add` to create/upload another and remove the unused recipient later. If upload succeeded but snapshot/config writing failed, attach the file with `--existing-key`. Existing sources are not silently rotated on reruns. Provision while nobody else is editing that file: the current fm write interface does not offer atomic revision-conditional writes, though ArcNet checks identity/revision before updating and refuses occupied init paths. GitHub secret names are repository-scoped; environment-level overrides take precedence in jobs that use an environment.
@@ -0,0 +1,3 @@
1
+ export declare const addDependency: (path: string) => string;
2
+ export declare const hasDependency: (root: string) => boolean;
3
+ //# sourceMappingURL=addDependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addDependency.d.ts","sourceRoot":"","sources":["../src/addDependency.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,WAiBzC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,YASzC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
4
+ import { packageVersion } from "./packageInfo.js";
5
+ const manifestSchema = z
6
+ .object({
7
+ dependencies: z.record(z.string(), z.string()).optional(),
8
+ devDependencies: z.record(z.string(), z.string()).optional(),
9
+ })
10
+ .passthrough();
11
+ export const addDependency = (path) => {
12
+ const manifest = manifestSchema.parse(JSON.parse(readFileSync(path, "utf8")));
13
+ const existing = manifest.dependencies?.["@mp-lb/arcnet"] ??
14
+ manifest.devDependencies?.["@mp-lb/arcnet"];
15
+ if (existing && existing !== packageVersion)
16
+ throw new Error("Existing ArcNet dependency differs; review its version before setup.");
17
+ if (!manifest.dependencies?.["@mp-lb/arcnet"])
18
+ manifest.devDependencies = {
19
+ ...manifest.devDependencies,
20
+ "@mp-lb/arcnet": packageVersion,
21
+ };
22
+ return JSON.stringify(manifest, null, 2) + "\n";
23
+ };
24
+ export const hasDependency = (root) => {
25
+ const manifest = manifestSchema.parse(JSON.parse(readFileSync(join(root, "package.json"), "utf8")));
26
+ return Boolean(manifest.dependencies?.["@mp-lb/arcnet"] ??
27
+ manifest.devDependencies?.["@mp-lb/arcnet"]);
28
+ };
29
+ //# sourceMappingURL=addDependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addDependency.js","sourceRoot":"","sources":["../src/addDependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzD,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9E,MAAM,QAAQ,GACZ,QAAQ,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC;QACxC,QAAQ,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAAC;IAE9C,IAAI,QAAQ,IAAI,QAAQ,KAAK,cAAc;QACzC,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC;QAC3C,QAAQ,CAAC,eAAe,GAAG;YACzB,GAAG,QAAQ,CAAC,eAAe;YAC3B,eAAe,EAAE,cAAc;SAChC,CAAC;IACJ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CACnC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAC7D,CAAC;IAEF,OAAO,OAAO,CACZ,QAAQ,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC;QACxC,QAAQ,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAC5C,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { VercelRequest } from "./schemas.js";
2
+ export declare const apiClient: (token: string | undefined, fetcher?: typeof fetch) => VercelRequest;
3
+ //# sourceMappingURL=apiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,eAAO,MAAM,SAAS,GACpB,OAAO,MAAM,GAAG,SAAS,EACzB,UAAS,OAAO,KAAa,KAC5B,aA2CF,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { fail } from "./fail.js";
2
+ import { vercelResponseSchema } from "./schemas.js";
3
+ export const apiClient = (token, fetcher = fetch) => {
4
+ if (!token)
5
+ fail("VERCEL_TOKEN is required for remote operations; check and plan remain offline.");
6
+ return async (method, path, account, body) => {
7
+ const url = new URL(path, "https://api.vercel.com");
8
+ if (account.type === "team")
9
+ url.searchParams.set("teamId", account.id);
10
+ let response;
11
+ try {
12
+ response = await fetcher(url, {
13
+ method,
14
+ headers: {
15
+ Authorization: `Bearer ${token}`,
16
+ "Content-Type": "application/json",
17
+ },
18
+ body: body === undefined ? undefined : JSON.stringify(body),
19
+ signal: AbortSignal.timeout(30000),
20
+ });
21
+ }
22
+ catch {
23
+ fail(method === "POST"
24
+ ? "Creation outcome uncertain. Inspect the named project before retrying; no automatic retry was attempted."
25
+ : "Vercel read failed; no changes attempted.");
26
+ }
27
+ if (response.status === 404 && method === "GET")
28
+ return null;
29
+ if (!response.ok)
30
+ fail(`Vercel ${method} failed (HTTP ${response.status}). Check scope/access; response content omitted.`);
31
+ try {
32
+ return vercelResponseSchema.parse(await response.json());
33
+ }
34
+ catch {
35
+ fail("Vercel returned an invalid response; inspect the project before retrying.");
36
+ }
37
+ };
38
+ };
39
+ //# sourceMappingURL=apiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAyB,EACzB,UAAwB,KAAK,EACd,EAAE;IACjB,IAAI,CAAC,KAAK;QACR,IAAI,CACF,gFAAgF,CACjF,CAAC;IAEJ,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACxE,IAAI,QAAQ,CAAC;QAEb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;gBAC5B,MAAM;gBACN,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,EAAE;oBAChC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC3D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CACF,MAAM,KAAK,MAAM;gBACf,CAAC,CAAC,0GAA0G;gBAC5G,CAAC,CAAC,2CAA2C,CAChD,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE;YACd,IAAI,CACF,UAAU,MAAM,iBAAiB,QAAQ,CAAC,MAAM,kDAAkD,CACnG,CAAC;QAEJ,IAAI,CAAC;YACH,OAAO,oBAAoB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CACF,2EAA2E,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { VercelAccount, VercelResponse, VercelSite } from "./schemas.js";
2
+ export declare const checkIdentity: (project: VercelResponse | null, site: VercelSite, account: VercelAccount) => void;
3
+ //# sourceMappingURL=checkIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIdentity.d.ts","sourceRoot":"","sources":["../src/checkIdentity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9E,eAAO,MAAM,aAAa,GACxB,SAAS,cAAc,GAAG,IAAI,EAC9B,MAAM,UAAU,EAChB,SAAS,aAAa,SAWvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { fail } from "./fail.js";
2
+ export const checkIdentity = (project, site, account) => {
3
+ if (!project ||
4
+ project.id !== site.projectId ||
5
+ project.name !== site.projectName ||
6
+ project.accountId !== account.id)
7
+ fail(`Project identity/scope mismatch for ${site.projectName}. No deployment attempted.`);
8
+ };
9
+ //# sourceMappingURL=checkIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIdentity.js","sourceRoot":"","sources":["../src/checkIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA8B,EAC9B,IAAgB,EAChB,OAAsB,EACtB,EAAE;IACF,IACE,CAAC,OAAO;QACR,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS;QAC7B,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW;QACjC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE;QAEhC,IAAI,CACF,uCAAuC,IAAI,CAAC,WAAW,4BAA4B,CACpF,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ciOutputs: (root: string) => Record<string, string>;
2
+ //# sourceMappingURL=ciOutputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ciOutputs.d.ts","sourceRoot":"","sources":["../src/ciOutputs.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAuC7D,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parse } from "yaml";
4
+ import { z } from "zod";
5
+ import { terraformConfigSchema } from "./schemas.js";
6
+ import { validateConfig } from "./validateConfig.js";
7
+ export const ciOutputs = (root) => {
8
+ const input = JSON.parse(readFileSync(join(root, ".arcnet/project.json"), "utf8"));
9
+ if (z.object({ mode: z.string().optional() }).parse(input).mode === "vercel") {
10
+ const c = validateConfig(input, root);
11
+ return {
12
+ approved: String(c.approved &&
13
+ Object.values(c.sites).every((s) => s.mode === "existing")),
14
+ };
15
+ }
16
+ const c = terraformConfigSchema.parse(input);
17
+ const n = z
18
+ .object({ region: z.string().regex(/^[a-z]+-[a-z]+[0-9]$/) })
19
+ .parse(parse(readFileSync(join(root, ".arcnet/network.yaml"), "utf8")));
20
+ if (c.approved &&
21
+ (!/^projects\/\d+\/locations\/global\/workloadIdentityPools\/github\/providers\/github-actions$/.test(c.workloadIdentityProvider) ||
22
+ !/^arc-deploy@[a-z][a-z0-9-]+\.iam\.gserviceaccount\.com$/.test(c.serviceAccount)))
23
+ throw new Error("Complete WIF configuration before approval.");
24
+ return {
25
+ approved: String(c.approved),
26
+ provider: c.approved ? c.workloadIdentityProvider : "",
27
+ account: c.approved ? c.serviceAccount : "",
28
+ registry: `${n.region}-docker.pkg.dev`,
29
+ };
30
+ };
31
+ //# sourceMappingURL=ciOutputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ciOutputs.js","sourceRoot":"","sources":["../src/ciOutputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAA0B,EAAE;IAChE,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAC/B,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,CACzD,CAAC;IAEF,IACE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,EACxE,CAAC;QACD,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE,MAAM,CACd,CAAC,CAAC,QAAQ;gBACR,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAC7D;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,CAAC,GAAG,CAAC;SACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC;SAC5D,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAE1E,IACE,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,8FAA8F,CAAC,IAAI,CACnG,CAAC,CAAC,wBAAwB,CAC3B;YACC,CAAC,yDAAyD,CAAC,IAAI,CAC7D,CAAC,CAAC,cAAc,CACjB,CAAC;QAEJ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;QACtD,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QAC3C,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,iBAAiB;KACvC,CAAC;AACJ,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createCli } from "./createCli.js";
3
+ await createCli()
4
+ .parseAsync()
5
+ .catch((error) => {
6
+ process.stderr.write(`ArcNet: ${error instanceof Error ? error.message : "Command failed"}\n`);
7
+ process.exitCode = 1;
8
+ });
9
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,MAAM,SAAS,EAAE;KACd,UAAU,EAAE;KACZ,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,CACzE,CAAC;IAEF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const createCli: () => Command;
3
+ //# sourceMappingURL=createCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCli.d.ts","sourceRoot":"","sources":["../src/createCli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,SAAS,eAiHrB,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { Command } from "commander";
2
+ import { appendFileSync, readFileSync, realpathSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { z } from "zod";
5
+ import { ciOutputs } from "./ciOutputs.js";
6
+ import { createSetupCommand } from "./createSetupCommand.js";
7
+ import { packageVersion } from "./packageInfo.js";
8
+ import { renderResult } from "./renderResult.js";
9
+ import { runTerraform } from "./runTerraform.js";
10
+ import { runVercel } from "./runVercel.js";
11
+ import { setup } from "./setup.js";
12
+ import { createSecretsCommands } from "./secrets/createSecretsCommands.js";
13
+ import { withDeploymentSecrets } from "./secrets/withDeploymentSecrets.js";
14
+ export const createCli = () => {
15
+ const cli = new Command("arcnet")
16
+ .description("Install and deploy ArcNet projects.")
17
+ .version(packageVersion)
18
+ .option("--root <directory>", "Target project root", process.cwd())
19
+ .option("--json", "Render one JSON result")
20
+ .option("--jsonl", "Render structured completion events")
21
+ .option("--noninteractive", "Run without prompts (all commands are noninteractive)");
22
+ cli.hook("preAction", () => {
23
+ if (cli.opts().json && cli.opts().jsonl)
24
+ throw new Error("Choose either --json or --jsonl.");
25
+ });
26
+ const output = (result) => {
27
+ process.stdout.write(renderResult(result, cli.opts()) + "\n");
28
+ };
29
+ createSecretsCommands(cli, output);
30
+ cli
31
+ .command("version")
32
+ .description("Show the installed package version.")
33
+ .action(() => output({ version: packageVersion }));
34
+ const install = createSetupCommand();
35
+ install.action(() => output({
36
+ ...setup(install.args.concat(install.options.flatMap((option) => {
37
+ const key = option.attributeName();
38
+ if (install.getOptionValueSource(key) !== "cli")
39
+ return [];
40
+ const value = install.opts()[key];
41
+ return value === true
42
+ ? [option.long]
43
+ : [option.long, String(value)];
44
+ })), realpathSync(cli.opts().root)),
45
+ }));
46
+ cli.addCommand(install);
47
+ for (const [name, description] of Object.entries({
48
+ check: "Validate project configuration offline.",
49
+ plan: "Plan deployment (Terraform contacts providers; static Vercel stays offline).",
50
+ deploy: "Deploy the approved project.",
51
+ preview: "Deploy static Vercel sites to preview.",
52
+ inspect: "Verify static Vercel project identities remotely.",
53
+ create: "Create one explicitly approved Vercel project.",
54
+ })) {
55
+ const command = cli.command(name).description(description);
56
+ if (name === "create")
57
+ command.argument("<site>", "Configured site name");
58
+ command.action(async (site) => {
59
+ const root = realpathSync(cli.opts().root);
60
+ const mode = z
61
+ .object({ mode: z.string().optional() })
62
+ .parse(JSON.parse(readFileSync(join(root, ".arcnet/project.json"), "utf8"))).mode;
63
+ const machine = Boolean(cli.opts().json || cli.opts().jsonl);
64
+ const execute = async () => {
65
+ if (mode === "vercel")
66
+ return runVercel(name, root, typeof site === "string" ? site : undefined, machine);
67
+ if (name === "check" || name === "plan" || name === "deploy")
68
+ return runTerraform(name, root, machine);
69
+ throw new Error(`${name} is only supported for static Vercel references.`);
70
+ };
71
+ output(await (name === "check" || (name === "plan" && mode === "vercel")
72
+ ? execute()
73
+ : withDeploymentSecrets(root, mode, execute)));
74
+ });
75
+ }
76
+ cli
77
+ .command("ci")
78
+ .description("Validate deployment identity and write GitHub Actions outputs.")
79
+ .action(() => {
80
+ const outputs = ciOutputs(realpathSync(cli.opts().root));
81
+ if (!process.env.GITHUB_OUTPUT)
82
+ throw new Error("GITHUB_OUTPUT is required for the ci command.");
83
+ appendFileSync(process.env.GITHUB_OUTPUT, Object.entries(outputs)
84
+ .map(([key, value]) => `${key}=${value}\n`)
85
+ .join(""));
86
+ output(outputs);
87
+ });
88
+ return cli;
89
+ };
90
+ //# sourceMappingURL=createCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCli.js","sourceRoot":"","sources":["../src/createCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { VercelConfig, VercelRequest } from "./schemas.js";
2
+ export declare const createProject: (config: VercelConfig, name: string, request: VercelRequest) => Promise<{
3
+ repository: string;
4
+ account: {
5
+ type: "team" | "personal";
6
+ id: string;
7
+ };
8
+ sites: Record<string, {
9
+ mode: "existing" | "new";
10
+ projectName: string;
11
+ build: string[];
12
+ output: string;
13
+ outputConfig: {
14
+ version: 3;
15
+ routes?: unknown[] | undefined;
16
+ overrides?: Record<string, unknown> | undefined;
17
+ };
18
+ projectId?: string | undefined;
19
+ creationApproved?: boolean | undefined;
20
+ }>;
21
+ version: 1;
22
+ mode: "vercel";
23
+ slug: string;
24
+ approved: boolean;
25
+ }>;
26
+ //# sourceMappingURL=createProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.d.ts","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhE,eAAO,MAAM,aAAa,GACxB,QAAQ,YAAY,EACpB,MAAM,MAAM,EACZ,SAAS,aAAa;;;;;;;;;;;;;;;;;;;;;;;EA0DvB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { checkIdentity } from "./checkIdentity.js";
2
+ import { fail } from "./fail.js";
3
+ export const createProject = async (config, name, request) => {
4
+ const site = config.sites[name];
5
+ if (!site)
6
+ fail("Choose a configured site.");
7
+ if (site.mode === "existing") {
8
+ checkIdentity(await request("GET", `/v9/projects/${site.projectId}`, config.account), site, config.account);
9
+ return config;
10
+ }
11
+ if (site.creationApproved !== true)
12
+ fail("Project creation disabled. Obtain explicit target/cost approval and set creationApproved=true for this site.");
13
+ if (config.account.type === "personal") {
14
+ const who = await request("GET", "/v2/user", config.account);
15
+ if (who?.user?.id !== config.account.id)
16
+ fail("Token personal account does not match configured account; no project created.");
17
+ }
18
+ if (await request("GET", `/v9/projects/${encodeURIComponent(site.projectName)}`, config.account))
19
+ fail(`Project name ${site.projectName} already exists. Set an explicit existing reference after verifying its ID; no duplicate project was created.`);
20
+ const created = await request("POST", "/v11/projects", config.account, {
21
+ name: site.projectName,
22
+ framework: null,
23
+ });
24
+ if (!created ||
25
+ !/^prj_[A-Za-z0-9]+$/.test(created.id ?? "") ||
26
+ created.accountId !== config.account.id ||
27
+ created.name !== site.projectName)
28
+ fail("Creation response identity mismatch. Inspect the account before retrying.");
29
+ const next = structuredClone(config);
30
+ next.approved = false;
31
+ next.sites[name] = { ...site, mode: "existing", projectId: created.id };
32
+ delete next.sites[name].creationApproved;
33
+ return next;
34
+ };
35
+ //# sourceMappingURL=createProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.js","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,MAAoB,EACpB,IAAY,EACZ,OAAsB,EACtB,EAAE;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,aAAa,CACX,MAAM,OAAO,CAAC,KAAK,EAAE,gBAAgB,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EACtE,IAAI,EACJ,MAAM,CAAC,OAAO,CACf,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;QAChC,IAAI,CACF,8GAA8G,CAC/G,CAAC;IAEJ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE;YACrC,IAAI,CACF,+EAA+E,CAChF,CAAC;IACN,CAAC;IAED,IACE,MAAM,OAAO,CACX,KAAK,EACL,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EACtD,MAAM,CAAC,OAAO,CACf;QAED,IAAI,CACF,gBAAgB,IAAI,CAAC,WAAW,+GAA+G,CAChJ,CAAC;IAEJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE;QACrE,IAAI,EAAE,IAAI,CAAC,WAAW;QACtB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,IACE,CAAC,OAAO;QACR,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE;QACvC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW;QAEjC,IAAI,CACF,2EAA2E,CAC5E,CAAC;IACJ,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,EAAG,EAAE,CAAC;IACzE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,gBAAgB,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const createSetupCommand: () => Command;
3
+ //# sourceMappingURL=createSetupCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSetupCommand.d.ts","sourceRoot":"","sources":["../src/createSetupCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,eAAO,MAAM,kBAAkB,eAcgC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Command } from "commander";
2
+ export const createSetupCommand = () => new Command("setup")
3
+ .description("Add ArcNet configuration and workflow; pin the CLI in the project manifest.")
4
+ .argument("<slug>", "Project slug matching zap.yaml")
5
+ .option("--dry-run", "Report generated files without writing")
6
+ .option("--service <name>", "Default container service", "backend")
7
+ .option("--dockerfile <path>", "Container Dockerfile", ".arcnet/Dockerfile")
8
+ .option("--repository <owner/repo>", "GitHub repository (defaults to origin)")
9
+ .option("--services <path>", "Explicit service selection JSON")
10
+ .option("--vercel <path>", "Static Vercel references JSON");
11
+ //# sourceMappingURL=createSetupCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSetupCommand.js","sourceRoot":"","sources":["../src/createSetupCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CACrC,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CACV,6EAA6E,CAC9E;KACA,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;KAC7D,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,EAAE,SAAS,CAAC;KAClE,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;KAC3E,MAAM,CACL,2BAA2B,EAC3B,wCAAwC,CACzC;KACA,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;KAC9D,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RunProcess, VercelConfig, VercelRequest } from "./schemas.js";
2
+ export declare const deploy: (config: VercelConfig, root: string, request: VercelRequest, run: RunProcess, environment: NodeJS.ProcessEnv, target?: string) => Promise<void>;
3
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EAEd,MAAM,cAAc,CAAC;AAItB,eAAO,MAAM,MAAM,GACjB,QAAQ,YAAY,EACpB,MAAM,MAAM,EACZ,SAAS,aAAa,EACtB,KAAK,UAAU,EACf,aAAa,MAAM,CAAC,UAAU,EAC9B,eAAqB,kBAoDtB,CAAC"}
package/dist/deploy.js ADDED
@@ -0,0 +1,47 @@
1
+ import { rmSync } from "node:fs";
2
+ import { fail } from "./fail.js";
3
+ import { inspectReferences } from "./inspectReferences.js";
4
+ import { stageSite } from "./stageSite.js";
5
+ import { validateConfig } from "./validateConfig.js";
6
+ export const deploy = async (config, root, request, run, environment, target = "production") => {
7
+ validateConfig(config, root);
8
+ if (config.approved !== true)
9
+ fail("Deployment disabled. Review account, project references, routing and production-trigger ownership before setting approved=true.");
10
+ if (!["production", "preview"].includes(target))
11
+ fail("Target must be production or preview.");
12
+ if (environment.GITHUB_ACTIONS === "true" &&
13
+ (environment.GITHUB_REPOSITORY !== config.repository ||
14
+ environment.GITHUB_REF !== "refs/heads/main"))
15
+ fail("CI deployment is restricted to the configured repository main branch.");
16
+ await inspectReferences(config, request); // Check every identity before building or uploading any site.
17
+ const stages = [];
18
+ try {
19
+ for (const site of Object.values(config.sites)) {
20
+ const buildEnv = Object.fromEntries(Object.entries(environment).filter(([k]) => !k.startsWith("VERCEL_")));
21
+ await run(site.build[0], site.build.slice(1), root, buildEnv);
22
+ stages.push([site, stageSite(root, site, config.account)]);
23
+ }
24
+ for (const [site, stage] of stages) {
25
+ const args = [
26
+ "--yes",
27
+ "vercel@63.1.2",
28
+ "deploy",
29
+ "--prebuilt",
30
+ "--yes",
31
+ ...(target === "production" ? ["--prod"] : []),
32
+ "--token",
33
+ environment.VERCEL_TOKEN,
34
+ ];
35
+ await run("npx", args, stage, {
36
+ ...environment,
37
+ VERCEL_PROJECT_ID: site.projectId,
38
+ VERCEL_ORG_ID: config.account.id,
39
+ });
40
+ }
41
+ }
42
+ finally {
43
+ for (const [, stage] of stages)
44
+ rmSync(stage, { recursive: true, force: true });
45
+ }
46
+ };
47
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,MAAoB,EACpB,IAAY,EACZ,OAAsB,EACtB,GAAe,EACf,WAA8B,EAC9B,MAAM,GAAG,YAAY,EACrB,EAAE;IACF,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI;QAC1B,IAAI,CACF,iIAAiI,CAClI,CAAC;IACJ,IAAI,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAChD,IACE,WAAW,CAAC,cAAc,KAAK,MAAM;QACrC,CAAC,WAAW,CAAC,iBAAiB,KAAK,MAAM,CAAC,UAAU;YAClD,WAAW,CAAC,UAAU,KAAK,iBAAiB,CAAC;QAE/C,IAAI,CACF,uEAAuE,CACxE,CAAC;IACJ,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,8DAA8D;IACxG,MAAM,MAAM,GAAgC,EAAE,CAAC;IAE/C,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CACtE,CAAC;YAEF,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG;gBACX,OAAO;gBACP,eAAe;gBACf,QAAQ;gBACR,YAAY;gBACZ,OAAO;gBACP,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,SAAS;gBACT,WAAW,CAAC,YAAa;aAC1B,CAAC;YAEF,MAAM,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC5B,GAAG,WAAW;gBACd,iBAAiB,EAAE,IAAI,CAAC,SAAS;gBACjC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM;YAC5B,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC"}
package/dist/fail.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const fail: (message: string) => never;
2
+ //# sourceMappingURL=fail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.d.ts","sourceRoot":"","sources":["../src/fail.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,KAEvC,CAAC"}
package/dist/fail.js ADDED
@@ -0,0 +1,4 @@
1
+ export const fail = (message) => {
2
+ throw new Error(message);
3
+ };
4
+ //# sourceMappingURL=fail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.js","sourceRoot":"","sources":["../src/fail.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAA+B,CAAC,OAAO,EAAE,EAAE;IAC1D,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createCli } from "./createCli.js";
2
+ export { setup } from "./setup.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createCli } from "./createCli.js";
2
+ export { setup } from "./setup.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { VercelConfig, VercelRequest } from "./schemas.js";
2
+ export declare const inspectReferences: (config: VercelConfig, request: VercelRequest) => Promise<void>;
3
+ //# sourceMappingURL=inspectReferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectReferences.d.ts","sourceRoot":"","sources":["../src/inspectReferences.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhE,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,YAAY,EACpB,SAAS,aAAa,kBAavB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { checkIdentity } from "./checkIdentity.js";
2
+ import { fail } from "./fail.js";
3
+ export const inspectReferences = async (config, request) => {
4
+ for (const site of Object.values(config.sites)) {
5
+ if (site.mode !== "existing")
6
+ fail(`Project ${site.projectName} is new. Create it explicitly, review and commit the returned reference before deployment.`);
7
+ checkIdentity(await request("GET", `/v9/projects/${site.projectId}`, config.account), site, config.account);
8
+ }
9
+ };
10
+ //# sourceMappingURL=inspectReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectReferences.js","sourceRoot":"","sources":["../src/inspectReferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,MAAoB,EACpB,OAAsB,EACtB,EAAE;IACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAC1B,IAAI,CACF,WAAW,IAAI,CAAC,WAAW,4FAA4F,CACxH,CAAC;QACJ,aAAa,CACX,MAAM,OAAO,CAAC,KAAK,EAAE,gBAAgB,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EACtE,IAAI,EACJ,MAAM,CAAC,OAAO,CACf,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const inspectStaticTree: (path: string) => void;
2
+ //# sourceMappingURL=inspectStaticTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectStaticTree.d.ts","sourceRoot":"","sources":["../src/inspectStaticTree.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,SAc7C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { lstatSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { fail } from "./fail.js";
4
+ export const inspectStaticTree = (path) => {
5
+ for (const name of readdirSync(path)) {
6
+ const p = join(path, name), stat = lstatSync(p);
7
+ if (stat.isSymbolicLink() ||
8
+ [".git", ".env", "node_modules"].includes(name) ||
9
+ name.startsWith(".env."))
10
+ fail(`Refusing unsafe static artifact entry: ${name}`);
11
+ if (stat.isDirectory())
12
+ inspectStaticTree(p);
13
+ else if (!stat.isFile())
14
+ fail("Static output contains a non-regular file.");
15
+ }
16
+ };
17
+ //# sourceMappingURL=inspectStaticTree.js.map