@vibesdotdev/secrets 0.0.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 (208) hide show
  1. package/README.md +59 -0
  2. package/SPEC.md +47 -0
  3. package/dist/cli/check/schemas/check-result.d.ts +9 -0
  4. package/dist/cli/check/schemas/check-result.d.ts.map +1 -0
  5. package/dist/cli/check/schemas/check-result.js +2 -0
  6. package/dist/cli/check/schemas/check-result.js.map +1 -0
  7. package/dist/cli/check/secrets.check.cli-command.descriptor.d.ts +4 -0
  8. package/dist/cli/check/secrets.check.cli-command.descriptor.d.ts.map +1 -0
  9. package/dist/cli/check/secrets.check.cli-command.descriptor.js +19 -0
  10. package/dist/cli/check/secrets.check.cli-command.descriptor.js.map +1 -0
  11. package/dist/cli/check/secrets.check.cli-command.impl.d.ts +5 -0
  12. package/dist/cli/check/secrets.check.cli-command.impl.d.ts.map +1 -0
  13. package/dist/cli/check/secrets.check.cli-command.impl.js +135 -0
  14. package/dist/cli/check/secrets.check.cli-command.impl.js.map +1 -0
  15. package/dist/cli/export/secrets.export.cli-command.descriptor.d.ts +4 -0
  16. package/dist/cli/export/secrets.export.cli-command.descriptor.d.ts.map +1 -0
  17. package/dist/cli/export/secrets.export.cli-command.descriptor.js +20 -0
  18. package/dist/cli/export/secrets.export.cli-command.descriptor.js.map +1 -0
  19. package/dist/cli/export/secrets.export.cli-command.impl.d.ts +5 -0
  20. package/dist/cli/export/secrets.export.cli-command.impl.d.ts.map +1 -0
  21. package/dist/cli/export/secrets.export.cli-command.impl.js +104 -0
  22. package/dist/cli/export/secrets.export.cli-command.impl.js.map +1 -0
  23. package/dist/cli/hooks/pre-commit-secrets.d.ts +2 -0
  24. package/dist/cli/hooks/pre-commit-secrets.d.ts.map +1 -0
  25. package/dist/cli/hooks/pre-commit-secrets.js +68 -0
  26. package/dist/cli/hooks/pre-commit-secrets.js.map +1 -0
  27. package/dist/cli/import/secrets.import.cli-command.descriptor.d.ts +4 -0
  28. package/dist/cli/import/secrets.import.cli-command.descriptor.d.ts.map +1 -0
  29. package/dist/cli/import/secrets.import.cli-command.descriptor.js +19 -0
  30. package/dist/cli/import/secrets.import.cli-command.descriptor.js.map +1 -0
  31. package/dist/cli/import/secrets.import.cli-command.impl.d.ts +5 -0
  32. package/dist/cli/import/secrets.import.cli-command.impl.d.ts.map +1 -0
  33. package/dist/cli/import/secrets.import.cli-command.impl.js +155 -0
  34. package/dist/cli/import/secrets.import.cli-command.impl.js.map +1 -0
  35. package/dist/cli/list/secrets.list.cli-command.descriptor.d.ts +4 -0
  36. package/dist/cli/list/secrets.list.cli-command.descriptor.d.ts.map +1 -0
  37. package/dist/cli/list/secrets.list.cli-command.descriptor.js +18 -0
  38. package/dist/cli/list/secrets.list.cli-command.descriptor.js.map +1 -0
  39. package/dist/cli/list/secrets.list.cli-command.impl.d.ts +5 -0
  40. package/dist/cli/list/secrets.list.cli-command.impl.d.ts.map +1 -0
  41. package/dist/cli/list/secrets.list.cli-command.impl.js +61 -0
  42. package/dist/cli/list/secrets.list.cli-command.impl.js.map +1 -0
  43. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.descriptor.d.ts +4 -0
  44. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.descriptor.d.ts.map +1 -0
  45. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.descriptor.js +16 -0
  46. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.descriptor.js.map +1 -0
  47. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.impl.d.ts +5 -0
  48. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.impl.d.ts.map +1 -0
  49. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.impl.js +10 -0
  50. package/dist/cli/pre-commit/secrets.pre-commit-check.cli-command.impl.js.map +1 -0
  51. package/dist/cli/pull/secrets.pull.cli-command.descriptor.d.ts +4 -0
  52. package/dist/cli/pull/secrets.pull.cli-command.descriptor.d.ts.map +1 -0
  53. package/dist/cli/pull/secrets.pull.cli-command.descriptor.js +20 -0
  54. package/dist/cli/pull/secrets.pull.cli-command.descriptor.js.map +1 -0
  55. package/dist/cli/pull/secrets.pull.cli-command.impl.d.ts +5 -0
  56. package/dist/cli/pull/secrets.pull.cli-command.impl.d.ts.map +1 -0
  57. package/dist/cli/pull/secrets.pull.cli-command.impl.js +76 -0
  58. package/dist/cli/pull/secrets.pull.cli-command.impl.js.map +1 -0
  59. package/dist/cli/push/secrets.push.cli-command.descriptor.d.ts +4 -0
  60. package/dist/cli/push/secrets.push.cli-command.descriptor.d.ts.map +1 -0
  61. package/dist/cli/push/secrets.push.cli-command.descriptor.js +22 -0
  62. package/dist/cli/push/secrets.push.cli-command.descriptor.js.map +1 -0
  63. package/dist/cli/push/secrets.push.cli-command.impl.d.ts +5 -0
  64. package/dist/cli/push/secrets.push.cli-command.impl.d.ts.map +1 -0
  65. package/dist/cli/push/secrets.push.cli-command.impl.js +109 -0
  66. package/dist/cli/push/secrets.push.cli-command.impl.js.map +1 -0
  67. package/dist/cli/reveal/secrets.reveal.cli-command.descriptor.d.ts +4 -0
  68. package/dist/cli/reveal/secrets.reveal.cli-command.descriptor.d.ts.map +1 -0
  69. package/dist/cli/reveal/secrets.reveal.cli-command.descriptor.js +19 -0
  70. package/dist/cli/reveal/secrets.reveal.cli-command.descriptor.js.map +1 -0
  71. package/dist/cli/reveal/secrets.reveal.cli-command.impl.d.ts +5 -0
  72. package/dist/cli/reveal/secrets.reveal.cli-command.impl.d.ts.map +1 -0
  73. package/dist/cli/reveal/secrets.reveal.cli-command.impl.js +85 -0
  74. package/dist/cli/reveal/secrets.reveal.cli-command.impl.js.map +1 -0
  75. package/dist/cli/secrets.cli-group.descriptor.d.ts +4 -0
  76. package/dist/cli/secrets.cli-group.descriptor.d.ts.map +1 -0
  77. package/dist/cli/secrets.cli-group.descriptor.js +11 -0
  78. package/dist/cli/secrets.cli-group.descriptor.js.map +1 -0
  79. package/dist/cli/set/secrets.set.cli-command.descriptor.d.ts +4 -0
  80. package/dist/cli/set/secrets.set.cli-command.descriptor.d.ts.map +1 -0
  81. package/dist/cli/set/secrets.set.cli-command.descriptor.js +21 -0
  82. package/dist/cli/set/secrets.set.cli-command.descriptor.js.map +1 -0
  83. package/dist/cli/set/secrets.set.cli-command.impl.d.ts +5 -0
  84. package/dist/cli/set/secrets.set.cli-command.impl.d.ts.map +1 -0
  85. package/dist/cli/set/secrets.set.cli-command.impl.js +59 -0
  86. package/dist/cli/set/secrets.set.cli-command.impl.js.map +1 -0
  87. package/dist/cli/shared/resolve-environment.d.ts +14 -0
  88. package/dist/cli/shared/resolve-environment.d.ts.map +1 -0
  89. package/dist/cli/shared/resolve-environment.js +45 -0
  90. package/dist/cli/shared/resolve-environment.js.map +1 -0
  91. package/dist/cli/unset/secrets.unset.cli-command.descriptor.d.ts +4 -0
  92. package/dist/cli/unset/secrets.unset.cli-command.descriptor.d.ts.map +1 -0
  93. package/dist/cli/unset/secrets.unset.cli-command.descriptor.js +20 -0
  94. package/dist/cli/unset/secrets.unset.cli-command.descriptor.js.map +1 -0
  95. package/dist/cli/unset/secrets.unset.cli-command.impl.d.ts +5 -0
  96. package/dist/cli/unset/secrets.unset.cli-command.impl.d.ts.map +1 -0
  97. package/dist/cli/unset/secrets.unset.cli-command.impl.js +31 -0
  98. package/dist/cli/unset/secrets.unset.cli-command.impl.js.map +1 -0
  99. package/dist/docs/backends.docs.descriptor.d.ts +4 -0
  100. package/dist/docs/backends.docs.descriptor.d.ts.map +1 -0
  101. package/dist/docs/backends.docs.descriptor.js +149 -0
  102. package/dist/docs/backends.docs.descriptor.js.map +1 -0
  103. package/dist/docs/encryption.docs.descriptor.d.ts +4 -0
  104. package/dist/docs/encryption.docs.descriptor.d.ts.map +1 -0
  105. package/dist/docs/encryption.docs.descriptor.js +163 -0
  106. package/dist/docs/encryption.docs.descriptor.js.map +1 -0
  107. package/dist/docs/env-file.docs.descriptor.d.ts +4 -0
  108. package/dist/docs/env-file.docs.descriptor.d.ts.map +1 -0
  109. package/dist/docs/env-file.docs.descriptor.js +207 -0
  110. package/dist/docs/env-file.docs.descriptor.js.map +1 -0
  111. package/dist/index.d.ts +13 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +13 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/kinds/index.d.ts +4 -0
  116. package/dist/kinds/index.d.ts.map +1 -0
  117. package/dist/kinds/index.js +3 -0
  118. package/dist/kinds/index.js.map +1 -0
  119. package/dist/kinds/schemas/store.schema.d.ts +49 -0
  120. package/dist/kinds/schemas/store.schema.d.ts.map +1 -0
  121. package/dist/kinds/schemas/store.schema.js +34 -0
  122. package/dist/kinds/schemas/store.schema.js.map +1 -0
  123. package/dist/kinds/schemas/store.types.d.ts +28 -0
  124. package/dist/kinds/schemas/store.types.d.ts.map +1 -0
  125. package/dist/kinds/schemas/store.types.js +2 -0
  126. package/dist/kinds/schemas/store.types.js.map +1 -0
  127. package/dist/kinds/store.interface.d.ts +2 -0
  128. package/dist/kinds/store.interface.d.ts.map +1 -0
  129. package/dist/kinds/store.interface.js +2 -0
  130. package/dist/kinds/store.interface.js.map +1 -0
  131. package/dist/kinds/store.kind.d.ts +10 -0
  132. package/dist/kinds/store.kind.d.ts.map +1 -0
  133. package/dist/kinds/store.kind.js +36 -0
  134. package/dist/kinds/store.kind.js.map +1 -0
  135. package/dist/kinds/store.schema.d.ts +2 -0
  136. package/dist/kinds/store.schema.d.ts.map +1 -0
  137. package/dist/kinds/store.schema.js +2 -0
  138. package/dist/kinds/store.schema.js.map +1 -0
  139. package/dist/manifest/canonical.d.ts +30 -0
  140. package/dist/manifest/canonical.d.ts.map +1 -0
  141. package/dist/manifest/canonical.js +313 -0
  142. package/dist/manifest/canonical.js.map +1 -0
  143. package/dist/manifest/import-manifest.schema.d.ts +77 -0
  144. package/dist/manifest/import-manifest.schema.d.ts.map +1 -0
  145. package/dist/manifest/import-manifest.schema.js +55 -0
  146. package/dist/manifest/import-manifest.schema.js.map +1 -0
  147. package/dist/manifest/index.d.ts +3 -0
  148. package/dist/manifest/index.d.ts.map +1 -0
  149. package/dist/manifest/index.js +3 -0
  150. package/dist/manifest/index.js.map +1 -0
  151. package/dist/requirements/index.d.ts +2 -0
  152. package/dist/requirements/index.d.ts.map +1 -0
  153. package/dist/requirements/index.js +2 -0
  154. package/dist/requirements/index.js.map +1 -0
  155. package/dist/requirements/resolver.d.ts +52 -0
  156. package/dist/requirements/resolver.d.ts.map +1 -0
  157. package/dist/requirements/resolver.js +196 -0
  158. package/dist/requirements/resolver.js.map +1 -0
  159. package/dist/requirements/schemas/requirements.d.ts +27 -0
  160. package/dist/requirements/schemas/requirements.d.ts.map +1 -0
  161. package/dist/requirements/schemas/requirements.js +2 -0
  162. package/dist/requirements/schemas/requirements.js.map +1 -0
  163. package/dist/secrets.plugin.d.ts +8 -0
  164. package/dist/secrets.plugin.d.ts.map +1 -0
  165. package/dist/secrets.plugin.js +59 -0
  166. package/dist/secrets.plugin.js.map +1 -0
  167. package/package.json +108 -0
  168. package/src/cli/check/schemas/check-result.ts +8 -0
  169. package/src/cli/check/secrets.check.cli-command.descriptor.ts +21 -0
  170. package/src/cli/check/secrets.check.cli-command.impl.ts +163 -0
  171. package/src/cli/export/secrets.export.cli-command.descriptor.ts +22 -0
  172. package/src/cli/export/secrets.export.cli-command.impl.ts +139 -0
  173. package/src/cli/hooks/pre-commit-secrets.ts +73 -0
  174. package/src/cli/import/secrets.import.cli-command.descriptor.ts +21 -0
  175. package/src/cli/import/secrets.import.cli-command.impl.ts +178 -0
  176. package/src/cli/list/secrets.list.cli-command.descriptor.ts +21 -0
  177. package/src/cli/list/secrets.list.cli-command.impl.ts +79 -0
  178. package/src/cli/pre-commit/secrets.pre-commit-check.cli-command.descriptor.ts +18 -0
  179. package/src/cli/pre-commit/secrets.pre-commit-check.cli-command.impl.ts +11 -0
  180. package/src/cli/pull/secrets.pull.cli-command.descriptor.ts +22 -0
  181. package/src/cli/pull/secrets.pull.cli-command.impl.ts +103 -0
  182. package/src/cli/push/secrets.push.cli-command.descriptor.ts +24 -0
  183. package/src/cli/push/secrets.push.cli-command.impl.ts +149 -0
  184. package/src/cli/reveal/secrets.reveal.cli-command.descriptor.ts +21 -0
  185. package/src/cli/reveal/secrets.reveal.cli-command.impl.ts +108 -0
  186. package/src/cli/secrets.cli-group.descriptor.ts +13 -0
  187. package/src/cli/set/secrets.set.cli-command.descriptor.ts +23 -0
  188. package/src/cli/set/secrets.set.cli-command.impl.ts +77 -0
  189. package/src/cli/shared/resolve-environment.ts +57 -0
  190. package/src/cli/unset/secrets.unset.cli-command.descriptor.ts +22 -0
  191. package/src/cli/unset/secrets.unset.cli-command.impl.ts +41 -0
  192. package/src/docs/backends.docs.descriptor.ts +151 -0
  193. package/src/docs/encryption.docs.descriptor.ts +165 -0
  194. package/src/docs/env-file.docs.descriptor.ts +209 -0
  195. package/src/index.ts +35 -0
  196. package/src/kinds/index.ts +12 -0
  197. package/src/kinds/schemas/store.schema.ts +47 -0
  198. package/src/kinds/schemas/store.types.ts +35 -0
  199. package/src/kinds/store.interface.ts +1 -0
  200. package/src/kinds/store.kind.ts +52 -0
  201. package/src/kinds/store.schema.ts +8 -0
  202. package/src/manifest/canonical.ts +324 -0
  203. package/src/manifest/import-manifest.schema.ts +63 -0
  204. package/src/manifest/index.ts +12 -0
  205. package/src/requirements/index.ts +6 -0
  206. package/src/requirements/resolver.ts +216 -0
  207. package/src/requirements/schemas/requirements.ts +29 -0
  208. package/src/secrets.plugin.ts +65 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @vibesdotdev/secrets
2
+
3
+ Runtime-resolved secrets management. Universal core: defines the
4
+ `secrets/store` kind. Backends live in sibling packages.
5
+
6
+ ## Quickstart
7
+
8
+ ### Read a secret
9
+
10
+ ```ts
11
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
12
+
13
+ const store = await getVibesRuntime().query('secrets/store').resolve();
14
+ const apiKey = await store.get('production', 'STRIPE_API_KEY');
15
+
16
+ if (!apiKey) {
17
+ throw new Error('STRIPE_API_KEY not set for production tier');
18
+ }
19
+ ```
20
+
21
+ If no backend is registered for the current scope, `resolve()` throws — apps
22
+ should surface this at bootstrap.
23
+
24
+ ### Declare requirements (consumed by `vibes secrets check`)
25
+
26
+ Apps declare what secrets they need via `infra/web-app` or `infra/worker`
27
+ descriptors (owned by [`infra-core`](../infra-core/SPEC.md)). The requirements
28
+ resolver extracts them; the CLI compares against the active store.
29
+
30
+ ## CLI
31
+
32
+ ```bash
33
+ vibes secrets check
34
+ vibes secrets list --environment <name>
35
+ vibes secrets list --environment <name> --show-values
36
+ vibes secrets set <key> [value] --environment <name>
37
+ vibes secrets unset <key> --environment <name>
38
+ vibes secrets pull --environment <name>
39
+ vibes secrets push --environment <name>
40
+ ```
41
+
42
+ ## Backends
43
+
44
+ Core ships zero backends. Apps load the backend packages their scope supports:
45
+
46
+ - [`@vibesdotdev/secrets-backend-env-file`](../secrets-backend-env-file/) — local `.env` files
47
+ - [`@vibesdotdev/secrets-backend-encrypted-local`](../secrets-backend-encrypted-local/) — encrypted local files
48
+ - External vendor integrations (AWS Secrets Manager, Vault, GCP) → [`platform`](../platform/SPEC.md)
49
+
50
+ ## Test
51
+
52
+ ```bash
53
+ bun test
54
+ ```
55
+
56
+ ## Docs
57
+
58
+ - [SPEC.md](./SPEC.md) — package contract, hard rules, migration debt
59
+ - [runtime](../runtime/SPEC.md), [infra-core](../infra-core/SPEC.md)
package/SPEC.md ADDED
@@ -0,0 +1,47 @@
1
+ # @vibesdotdev/secrets
2
+
3
+ Runtime-resolved secrets management. Universal core: defines the `secrets/store` kind, environment-tier resolution, and the requirements resolver. Backends live in sibling packages and register themselves.
4
+
5
+ ## Owns
6
+
7
+ - **Runtime kind:** `secrets/store`
8
+ - **Kind definition + resolver** (`./kinds/store.kind`): backend resolution by environment tier (`scope.qualifiers.environmentTier`) + descriptor priority
9
+ - **Schemas** (`./kinds/schemas`, `./kinds/store.schema`): Zod descriptors for stores and stored values; `EnvironmentTierSchema`, `SecretsBackendSchema`
10
+ - **Store interface** (`./kinds/store.interface`): TS contract every backend implements (`list`, `get`, `set`, `unset`, `getAll`, `setAll`)
11
+ - **Requirements resolver** (`./requirements/resolver`): reads `infra/web-app` and `infra/worker` descriptors to extract required secrets; helpers for grouping/deduping for `vibes secrets check`
12
+ - **CLI descriptors** (`./cli`): `vibes secrets` group + `check`, `list`, `set`, `unset`, `pull`, `push`, `import`, `export`, `reveal`, `pre-commit-check`. Commands query the runtime; they do not import backends.
13
+ - **Plugin:** `./plugin` (= `./secrets.plugin`) — registers the kind + CLI descriptors only
14
+
15
+ ## Does not own
16
+
17
+ - **Backend implementations** → each backend is its own package: [`secrets-backend-env-file`](../secrets-backend-env-file/), [`secrets-backend-encrypted-local`](../secrets-backend-encrypted-local/), and future cloud/keychain backends
18
+ - **External vendor integrations** (AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager, etc.) → [`platform`](../platform/SPEC.md) integrations
19
+ - **Encryption primitive** → [`security`](../security/SPEC.md) / [`config/services`](../config/SPEC.md). Encrypted backends consume it.
20
+ - **Application data persistence** (user/org/business secrets stored as data) → owning module's `storage/manifest`
21
+ - **Auth credentials, sessions, cookies** → [`auth`](../auth/SPEC.md)
22
+ - **Infra descriptor ownership** → [`infra-core`](../infra-core/SPEC.md)
23
+ - **A separate secrets UI surface.** Apps that need a UI consume secrets through the runtime; no standalone secrets app.
24
+
25
+ ## Hard rules
26
+
27
+ - **The core package is universal.** No FS, crypto, or HTTP imports in core. Anything that breaks browser or Cloudflare bundles belongs in a backend package.
28
+ - **All secret access goes through `runtime.query('secrets/store').resolve()`.** No direct backend imports in features. No reading `.env` files in feature code.
29
+ - **Backend selection is runtime-resolved by scope** (`hardware`, `qualifiers.environmentTier`). Features do not branch on `isCloud`/`connectionMode`.
30
+ - **Environment tiers are canonical** (dev/staging/prod). Backends declare which tiers they serve; the resolver picks the active backend by current tier + priority.
31
+ - **Missing-backend means hard failure.** No silent no-op fallback. `resolve()` throws "no `secrets/store` registered for current scope" if no backend has registered. Apps surface this at bootstrap, not at first secret access.
32
+ - **Backend package contract:** each `secrets-backend-{name}` package exports a plugin that registers a `secrets/store` descriptor + impl. Apps load only the backends their scope can support. Core never imports backend packages.
33
+ - **Requirements resolver is read-only.** It surfaces what's required from infra descriptors. It does not write or modify infra.
34
+
35
+ ## Public entrypoints
36
+
37
+ `.`, `./kinds`, `./kinds/*`, `./requirements`, `./plugin` (= `./secrets.plugin`).
38
+
39
+ ## Verification
40
+
41
+ `bun test` from package root. Covers kind registration, environment-tier resolution, requirements resolver against fixture infra descriptors, CLI descriptor wiring. Backend-specific tests live in each backend package.
42
+
43
+ ## Links
44
+
45
+ - [runtime/SPEC.md](../runtime/SPEC.md)
46
+ - [config/SPEC.md](../config/SPEC.md), [security/SPEC.md](../security/SPEC.md)
47
+ - [infra-core/SPEC.md](../infra-core/SPEC.md), [platform/SPEC.md](../platform/SPEC.md)
@@ -0,0 +1,9 @@
1
+ export interface CheckResult {
2
+ key: string;
3
+ appId: string;
4
+ required: boolean;
5
+ description: string | undefined;
6
+ status: 'ok' | 'missing' | 'warn';
7
+ source: string | undefined;
8
+ }
9
+ //# sourceMappingURL=check-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-result.d.ts","sourceRoot":"","sources":["../../../../src/cli/check/schemas/check-result.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;IAClC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-result.js","sourceRoot":"","sources":["../../../../src/cli/check/schemas/check-result.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { CLICommandAssetDescriptor } from '@vibesdotdev/cli/schemas/types';
2
+ declare const descriptor: CLICommandAssetDescriptor;
3
+ export default descriptor;
4
+ //# sourceMappingURL=secrets.check.cli-command.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.check.cli-command.descriptor.d.ts","sourceRoot":"","sources":["../../../src/cli/check/secrets.check.cli-command.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,QAAA,MAAM,UAAU,EAAE,yBAgBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,19 @@
1
+ const descriptor = {
2
+ kind: 'cli/command',
3
+ id: 'secrets.check',
4
+ name: 'check',
5
+ description: 'Validate stored secrets against infra manifest requirements',
6
+ group: 'secrets',
7
+ options: [
8
+ { flags: '--environment <name>', description: 'Target environment (default: current)' },
9
+ { flags: '--app <id>', description: 'Check a specific app or worker only' },
10
+ { flags: '--manifest', description: 'Also cross-check against the canonical import manifest' },
11
+ { flags: '--json', description: 'Output as JSON' }
12
+ ],
13
+ surfaces: ['cli'],
14
+ hardware: ['consumer'],
15
+ enabled: true,
16
+ order: 50
17
+ };
18
+ export default descriptor;
19
+ //# sourceMappingURL=secrets.check.cli-command.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.check.cli-command.descriptor.js","sourceRoot":"","sources":["../../../src/cli/check/secrets.check.cli-command.descriptor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA8B;IAC7C,IAAI,EAAE,aAAa;IACnB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,6DAA6D;IAC1E,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE;QACR,EAAE,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,uCAAuC,EAAE;QACvF,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,qCAAqC,EAAE;QAC3E,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,wDAAwD,EAAE;QAC9F,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;KAClD;IACD,QAAQ,EAAE,CAAC,KAAK,CAAC;IACjB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,EAAE;CACT,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare const _default: {
2
+ execute(_args: Record<string, unknown>, opts: Record<string, unknown>): Promise<void>;
3
+ };
4
+ export default _default;
5
+ //# sourceMappingURL=secrets.check.cli-command.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.check.cli-command.impl.d.ts","sourceRoot":"","sources":["../../../src/cli/check/secrets.check.cli-command.impl.ts"],"names":[],"mappings":";mBAkBsB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;;AAD5F,wBAiJE"}
@@ -0,0 +1,135 @@
1
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
2
+ import { resolveSecretRequirements, groupRequirementsByApp } from '../../requirements/resolver';
3
+ import { canonicalImportManifest } from '../../manifest/canonical';
4
+ import { resolveSecretsEnvironment } from '../shared/resolve-environment';
5
+ export default {
6
+ async execute(_args, opts) {
7
+ const runtime = getVibesRuntime();
8
+ const ui = (await runtime.context('cli/ui'));
9
+ const options = opts;
10
+ const { name: envName, tier: envTier } = await resolveSecretsEnvironment(ui, options.environment);
11
+ let requirements = await resolveSecretRequirements(runtime);
12
+ if (options.app) {
13
+ requirements = requirements.filter((r) => r.appId === options.app);
14
+ }
15
+ if (requirements.length === 0 && !options.manifest) {
16
+ ui.info(options.app
17
+ ? `No secret requirements found for app: ${options.app}`
18
+ : 'No secret requirements found in infra descriptors');
19
+ return;
20
+ }
21
+ const descriptors = runtime.assets('secrets/store').descriptors();
22
+ const tierStores = descriptors.filter((d) => d.tiers.includes(envTier));
23
+ const availableKeys = new Map();
24
+ for (const desc of tierStores) {
25
+ const impl = (await runtime
26
+ .query('secrets/store')
27
+ .withId(desc.id)
28
+ .resolve());
29
+ const entries = await impl.list(envName);
30
+ for (const entry of entries) {
31
+ if (entry.hasValue && !availableKeys.has(entry.key)) {
32
+ availableKeys.set(entry.key, entry.source);
33
+ }
34
+ }
35
+ }
36
+ const results = requirements.map((req) => {
37
+ const source = availableKeys.get(req.key);
38
+ let status;
39
+ if (source) {
40
+ status = 'ok';
41
+ }
42
+ else if (req.required) {
43
+ status = 'missing';
44
+ }
45
+ else {
46
+ status = 'warn';
47
+ }
48
+ return { ...req, status, source };
49
+ });
50
+ const manifestChecks = options.manifest
51
+ ? canonicalImportManifest.secrets.map((entry) => {
52
+ const storedIn = availableKeys.get(entry.key);
53
+ let status;
54
+ if (storedIn)
55
+ status = 'ok';
56
+ else if (entry.required)
57
+ status = 'missing';
58
+ else
59
+ status = 'warn';
60
+ return { key: entry.key, required: entry.required, source: entry.source, status, storedIn };
61
+ })
62
+ : [];
63
+ if (options.json) {
64
+ const summary = {
65
+ environment: envName,
66
+ tier: envTier,
67
+ total: results.length,
68
+ ok: results.filter((r) => r.status === 'ok').length,
69
+ missing: results.filter((r) => r.status === 'missing').length,
70
+ warn: results.filter((r) => r.status === 'warn').length,
71
+ results
72
+ };
73
+ if (options.manifest) {
74
+ summary.manifest = {
75
+ total: manifestChecks.length,
76
+ ok: manifestChecks.filter((m) => m.status === 'ok').length,
77
+ missing: manifestChecks.filter((m) => m.status === 'missing').length,
78
+ warn: manifestChecks.filter((m) => m.status === 'warn').length,
79
+ results: manifestChecks
80
+ };
81
+ }
82
+ ui.render(summary, { format: 'json' });
83
+ const manifestMissing = manifestChecks.filter((m) => m.status === 'missing').length;
84
+ if (results.filter((r) => r.status === 'missing').length > 0 || manifestMissing > 0) {
85
+ process.exit(1);
86
+ }
87
+ return;
88
+ }
89
+ const grouped = groupRequirementsByApp(requirements);
90
+ const okCount = results.filter((r) => r.status === 'ok').length;
91
+ const missingCount = results.filter((r) => r.status === 'missing').length;
92
+ const warnCount = results.filter((r) => r.status === 'warn').length;
93
+ ui.log(`\nSecrets check for environment: ${envName} (${envTier})\n`);
94
+ for (const [appId, reqs] of grouped) {
95
+ ui.log(` ${appId}`);
96
+ for (const req of reqs) {
97
+ const result = results.find((r) => r.key === req.key && r.appId === req.appId);
98
+ if (!result)
99
+ continue;
100
+ const icon = result.status === 'ok' ? '+' : result.status === 'missing' ? 'x' : '?';
101
+ const label = result.required ? 'required' : 'optional';
102
+ const src = result.source ? ` (${result.source})` : '';
103
+ ui.log(` [${icon}] ${result.key.padEnd(40)} ${label.padEnd(10)} ${result.status}${src}`);
104
+ }
105
+ ui.log('');
106
+ }
107
+ ui.log(` Summary: ${okCount} ok, ${missingCount} missing, ${warnCount} optional not set`);
108
+ if (missingCount > 0) {
109
+ ui.log(` Run 'vibes secrets set <KEY>' to add missing secrets`);
110
+ }
111
+ ui.log('');
112
+ let manifestMissing = 0;
113
+ if (options.manifest && manifestChecks.length > 0) {
114
+ ui.log(` Canonical manifest cross-check (${manifestChecks.length} entries)`);
115
+ for (const m of manifestChecks) {
116
+ const icon = m.status === 'ok' ? '+' : m.status === 'missing' ? 'x' : '?';
117
+ const label = m.required ? 'required' : 'optional';
118
+ const where = m.storedIn ? ` (${m.storedIn})` : ` <- ${m.source}`;
119
+ ui.log(` [${icon}] ${m.key.padEnd(40)} ${label.padEnd(10)} ${m.status}${where}`);
120
+ }
121
+ const mOk = manifestChecks.filter((m) => m.status === 'ok').length;
122
+ manifestMissing = manifestChecks.filter((m) => m.status === 'missing').length;
123
+ const mWarn = manifestChecks.filter((m) => m.status === 'warn').length;
124
+ ui.log(` Manifest summary: ${mOk} ok, ${manifestMissing} missing, ${mWarn} optional not set`);
125
+ if (manifestMissing > 0) {
126
+ ui.log(` Run 'vibes secrets import' to populate from local sources`);
127
+ }
128
+ ui.log('');
129
+ }
130
+ if (missingCount > 0 || manifestMissing > 0) {
131
+ process.exit(1);
132
+ }
133
+ }
134
+ };
135
+ //# sourceMappingURL=secrets.check.cli-command.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.check.cli-command.impl.js","sourceRoot":"","sources":["../../../src/cli/check/secrets.check.cli-command.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CLICommandAssetDescriptor } from '@vibesdotdev/cli/schemas/types';
2
+ declare const descriptor: CLICommandAssetDescriptor;
3
+ export default descriptor;
4
+ //# sourceMappingURL=secrets.export.cli-command.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.export.cli-command.descriptor.d.ts","sourceRoot":"","sources":["../../../src/cli/export/secrets.export.cli-command.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,QAAA,MAAM,UAAU,EAAE,yBAiBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,20 @@
1
+ const descriptor = {
2
+ kind: 'cli/command',
3
+ id: 'secrets.export',
4
+ name: 'export',
5
+ description: 'Export secrets from a local backend to an env-formatted file (audit-logged)',
6
+ group: 'secrets',
7
+ options: [
8
+ { flags: '--environment <name>', description: 'Source environment (default: current)' },
9
+ { flags: '--from <backend>', description: 'Source backend (default: highest-priority local)' },
10
+ { flags: '--out <path>', description: 'Output file path (required; created mode 0600)' },
11
+ { flags: '--manifest-only', description: 'Limit to keys declared in the canonical manifest' },
12
+ { flags: '--force', description: 'Skip the interactive bulk-reveal confirmation' }
13
+ ],
14
+ surfaces: ['cli'],
15
+ hardware: ['consumer'],
16
+ enabled: true,
17
+ order: 35
18
+ };
19
+ export default descriptor;
20
+ //# sourceMappingURL=secrets.export.cli-command.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.export.cli-command.descriptor.js","sourceRoot":"","sources":["../../../src/cli/export/secrets.export.cli-command.descriptor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA8B;IAC7C,IAAI,EAAE,aAAa;IACnB,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,6EAA6E;IAC1F,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE;QACR,EAAE,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,uCAAuC,EAAE;QACvF,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,kDAAkD,EAAE;QAC9F,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,gDAAgD,EAAE;QACxF,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,kDAAkD,EAAE;QAC7F,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,+CAA+C,EAAE;KAClF;IACD,QAAQ,EAAE,CAAC,KAAK,CAAC;IACjB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,EAAE;CACT,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare const _default: {
2
+ execute(_args: Record<string, unknown>, opts: Record<string, unknown>): Promise<void>;
3
+ };
4
+ export default _default;
5
+ //# sourceMappingURL=secrets.export.cli-command.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.export.cli-command.impl.d.ts","sourceRoot":"","sources":["../../../src/cli/export/secrets.export.cli-command.impl.ts"],"names":[],"mappings":";mBA8DsB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;;AAD5F,wBA6EE"}
@@ -0,0 +1,104 @@
1
+ import { resolve, dirname } from 'node:path';
2
+ import { mkdir, writeFile, chmod, rename } from 'node:fs/promises';
3
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
4
+ import { canonicalImportManifest } from '../../manifest/canonical.js';
5
+ import { resolveSecretsEnvironment } from '../shared/resolve-environment.js';
6
+ const LOCAL_BACKENDS = new Set(['env-file', 'encrypted-local']);
7
+ function findSourceBackend(descriptors, tier, backendId) {
8
+ if (backendId)
9
+ return descriptors.find((d) => d.id === backendId);
10
+ return descriptors
11
+ .filter((d) => d.tiers.includes(tier) && LOCAL_BACKENDS.has(d.backend))
12
+ .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))[0];
13
+ }
14
+ function serializeEnv(secrets) {
15
+ const lines = Object.keys(secrets)
16
+ .sort()
17
+ .map((key) => {
18
+ const value = secrets[key] ?? '';
19
+ const needsQuote = value.includes(' ') || value.includes('#') || value.includes('"');
20
+ const escaped = needsQuote ? `"${value.replace(/"/g, '\\"')}"` : value;
21
+ return `${key}=${escaped}`;
22
+ });
23
+ return `# Generated by 'vibes secrets export' — DO NOT COMMIT\n${lines.join('\n')}\n`;
24
+ }
25
+ async function writeEnvFile(path, content) {
26
+ const absolute = resolve(process.cwd(), path);
27
+ await mkdir(dirname(absolute), { recursive: true });
28
+ const tmp = `${absolute}.tmp.${Date.now()}.${Math.random().toString(36).slice(2)}`;
29
+ await writeFile(tmp, content, { encoding: 'utf-8', mode: 0o600 });
30
+ await rename(tmp, absolute);
31
+ await chmod(absolute, 0o600);
32
+ }
33
+ async function promptConfirm(prompt) {
34
+ process.stderr.write(prompt);
35
+ for await (const chunk of process.stdin) {
36
+ const answer = chunk.toString('utf-8').trim().toLowerCase();
37
+ return answer === 'y' || answer === 'yes';
38
+ }
39
+ return false;
40
+ }
41
+ function emitAudit(input) {
42
+ process.stderr.write(`[AUDIT] ${JSON.stringify({
43
+ id: crypto.randomUUID(),
44
+ timestamp: new Date().toISOString(),
45
+ ...input
46
+ })}\n`);
47
+ }
48
+ export default {
49
+ async execute(_args, opts) {
50
+ const runtime = getVibesRuntime();
51
+ const ui = (await runtime.context('cli/ui'));
52
+ const options = opts;
53
+ if (!options.out) {
54
+ ui.error('--out <path> is required. Export refuses to write secrets to stdout.');
55
+ process.exit(1);
56
+ }
57
+ const { name: envName, tier: envTier } = await resolveSecretsEnvironment(ui, options.environment);
58
+ const descriptors = runtime.assets('secrets/store').descriptors();
59
+ const source = findSourceBackend(descriptors, envTier, options.from);
60
+ if (!source) {
61
+ ui.error('No local secrets store found to export from.');
62
+ process.exit(1);
63
+ }
64
+ const impl = (await runtime
65
+ .query('secrets/store')
66
+ .withId(source.id)
67
+ .resolve());
68
+ let secrets = await impl.getAll(envName);
69
+ if (options.manifestOnly) {
70
+ const manifestKeys = new Set(canonicalImportManifest.secrets.map((s) => s.key));
71
+ secrets = Object.fromEntries(Object.entries(secrets).filter(([k]) => manifestKeys.has(k)));
72
+ }
73
+ const count = Object.keys(secrets).length;
74
+ if (count === 0) {
75
+ ui.info(`No secrets to export from [${source.id}] for ${envName}.`);
76
+ return;
77
+ }
78
+ if (!options.force) {
79
+ const confirmed = await promptConfirm(`\n[EXPORT] About to write ${count} secret value(s) from [${source.id}] (${envName}) to ${options.out}.\nThis bulk reveal is logged to the audit trail.\nContinue? [y/N] `);
80
+ if (!confirmed) {
81
+ ui.info('Export cancelled.');
82
+ return;
83
+ }
84
+ }
85
+ emitAudit({
86
+ category: 'data_access',
87
+ severity: 'high',
88
+ action: 'secrets.export',
89
+ actor: { id: 'cli', type: 'user', name: 'CLI user' },
90
+ target: { id: source.id, type: 'secrets-store', name: source.id },
91
+ outcome: 'success',
92
+ context: {
93
+ environment: envName,
94
+ backend: source.id,
95
+ count,
96
+ manifestOnly: options.manifestOnly === true,
97
+ outPath: options.out
98
+ }
99
+ });
100
+ await writeEnvFile(options.out, serializeEnv(secrets));
101
+ ui.success(`Exported ${count} secret(s) from [${source.id}] to ${options.out} (mode 0600)`);
102
+ }
103
+ };
104
+ //# sourceMappingURL=secrets.export.cli-command.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.export.cli-command.impl.js","sourceRoot":"","sources":["../../../src/cli/export/secrets.export.cli-command.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runSecretsPreCommitCheck(workspacePath: string): Promise<number>;
2
+ //# sourceMappingURL=pre-commit-secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-commit-secrets.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/pre-commit-secrets.ts"],"names":[],"mappings":"AASA,wBAAsB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DrF"}
@@ -0,0 +1,68 @@
1
+ const SECRET_PATTERNS = [
2
+ { pattern: /sk_live_[a-zA-Z0-9]{24,}/, name: 'Stripe live secret key (sk_live_)' },
3
+ { pattern: /pk_live_[a-zA-Z0-9]{24,}/, name: 'Stripe live public key (pk_live_)' },
4
+ { pattern: /do_[a-zA-Z0-9]{32,}/, name: 'DigitalOcean API key (do_)' },
5
+ { pattern: /AKIA[a-zA-Z0-9]{16,}/, name: 'AWS access key ID (AKIA)' },
6
+ { pattern: /ghp_[a-zA-Z0-9]{36}/, name: 'GitHub personal access token (ghp_)' },
7
+ { pattern: /gho_[a-zA-Z0-9]{36}/, name: 'GitHub OAuth token (gho_)' }
8
+ ];
9
+ export async function runSecretsPreCommitCheck(workspacePath) {
10
+ const { execSync } = await import('node:child_process');
11
+ let stagedFiles;
12
+ try {
13
+ const output = execSync('git diff --cached --name-only --diff-filter=ACM', {
14
+ cwd: workspacePath,
15
+ encoding: 'utf-8'
16
+ });
17
+ stagedFiles = output.trim().split('\n').filter(Boolean);
18
+ }
19
+ catch {
20
+ return 0;
21
+ }
22
+ if (!stagedFiles.length)
23
+ return 0;
24
+ const violations = [];
25
+ const { readFileSync } = await import('node:fs');
26
+ for (const file of stagedFiles) {
27
+ const fullPath = `${workspacePath}/${file}`;
28
+ let content;
29
+ try {
30
+ content = readFileSync(fullPath, 'utf-8');
31
+ }
32
+ catch {
33
+ continue;
34
+ }
35
+ const lines = content.split('\n');
36
+ for (let i = 0; i < lines.length; i++) {
37
+ const line = lines[i];
38
+ for (const { pattern, name } of SECRET_PATTERNS) {
39
+ if (pattern.test(line)) {
40
+ violations.push({
41
+ file,
42
+ name,
43
+ line: line.trim().substring(0, 80)
44
+ });
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ if (violations.length > 0) {
51
+ process.stderr.write(`\n[SECRETS-001] ${violations.length} secret pattern(s) detected in staged files.\n\n`);
52
+ for (const v of violations) {
53
+ process.stderr.write(` BLOCKED ${v.file}\n`);
54
+ process.stderr.write(` Pattern: ${v.name}\n`);
55
+ if (v.line) {
56
+ process.stderr.write(` Line: ${v.line}\n`);
57
+ }
58
+ process.stderr.write('\n');
59
+ }
60
+ process.stderr.write('Commit blocked: production secrets must not be committed.\n');
61
+ process.stderr.write(' - Rotate any exposed keys immediately.\n');
62
+ process.stderr.write(' - Use `vibes secrets set` to store in a secret manager.\n');
63
+ process.stderr.write(' - Add to .gitignore if genuinely not a secret.\n\n');
64
+ return 1;
65
+ }
66
+ return 0;
67
+ }
68
+ //# sourceMappingURL=pre-commit-secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-commit-secrets.js","sourceRoot":"","sources":["../../../src/cli/hooks/pre-commit-secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CLICommandAssetDescriptor } from '@vibesdotdev/cli/schemas/types';
2
+ declare const descriptor: CLICommandAssetDescriptor;
3
+ export default descriptor;
4
+ //# sourceMappingURL=secrets.import.cli-command.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.import.cli-command.descriptor.d.ts","sourceRoot":"","sources":["../../../src/cli/import/secrets.import.cli-command.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,QAAA,MAAM,UAAU,EAAE,yBAgBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,19 @@
1
+ const descriptor = {
2
+ kind: 'cli/command',
3
+ id: 'secrets.import',
4
+ name: 'import',
5
+ description: 'Import secrets from local root env files into a backend, driven by the canonical manifest',
6
+ group: 'secrets',
7
+ options: [
8
+ { flags: '--environment <name>', description: 'Target environment (default: current)' },
9
+ { flags: '--to <backend>', description: 'Target backend (default: encrypted-local)' },
10
+ { flags: '--source <id>', description: 'Restrict to one source from the manifest' },
11
+ { flags: '--dry-run', description: 'Show what would be imported without writing' }
12
+ ],
13
+ surfaces: ['cli'],
14
+ hardware: ['consumer'],
15
+ enabled: true,
16
+ order: 30
17
+ };
18
+ export default descriptor;
19
+ //# sourceMappingURL=secrets.import.cli-command.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.import.cli-command.descriptor.js","sourceRoot":"","sources":["../../../src/cli/import/secrets.import.cli-command.descriptor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA8B;IAC7C,IAAI,EAAE,aAAa;IACnB,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,2FAA2F;IACxG,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE;QACR,EAAE,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,uCAAuC,EAAE;QACvF,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,2CAA2C,EAAE;QACrF,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,0CAA0C,EAAE;QACnF,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,6CAA6C,EAAE;KAClF;IACD,QAAQ,EAAE,CAAC,KAAK,CAAC;IACjB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,EAAE;CACT,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare const _default: {
2
+ execute(_args: Record<string, unknown>, opts: Record<string, unknown>): Promise<void>;
3
+ };
4
+ export default _default;
5
+ //# sourceMappingURL=secrets.import.cli-command.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.import.cli-command.impl.d.ts","sourceRoot":"","sources":["../../../src/cli/import/secrets.import.cli-command.impl.ts"],"names":[],"mappings":";mBAsDsB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;;AAD5F,wBA4HE"}