@vess-id/vess 0.2.0-alpha.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 (280) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +223 -0
  3. package/bin/vess.js +2 -0
  4. package/dist/__mocks__/@napi-rs/keyring.d.ts +9 -0
  5. package/dist/__mocks__/@napi-rs/keyring.d.ts.map +1 -0
  6. package/dist/__mocks__/@napi-rs/keyring.js +33 -0
  7. package/dist/__mocks__/@napi-rs/keyring.js.map +1 -0
  8. package/dist/__mocks__/node-mac-auth.d.ts +8 -0
  9. package/dist/__mocks__/node-mac-auth.d.ts.map +1 -0
  10. package/dist/__mocks__/node-mac-auth.js +29 -0
  11. package/dist/__mocks__/node-mac-auth.js.map +1 -0
  12. package/dist/adapter/mcp/http-transport.d.ts +34 -0
  13. package/dist/adapter/mcp/http-transport.d.ts.map +1 -0
  14. package/dist/adapter/mcp/http-transport.js +158 -0
  15. package/dist/adapter/mcp/http-transport.js.map +1 -0
  16. package/dist/adapter/mcp/mcp-adapter.d.ts +37 -0
  17. package/dist/adapter/mcp/mcp-adapter.d.ts.map +1 -0
  18. package/dist/adapter/mcp/mcp-adapter.js +48 -0
  19. package/dist/adapter/mcp/mcp-adapter.js.map +1 -0
  20. package/dist/adapter/mcp/mcp-server.factory.d.ts +35 -0
  21. package/dist/adapter/mcp/mcp-server.factory.d.ts.map +1 -0
  22. package/dist/adapter/mcp/mcp-server.factory.js +114 -0
  23. package/dist/adapter/mcp/mcp-server.factory.js.map +1 -0
  24. package/dist/adapter/mcp/stdio-transport.d.ts +7 -0
  25. package/dist/adapter/mcp/stdio-transport.d.ts.map +1 -0
  26. package/dist/adapter/mcp/stdio-transport.js +13 -0
  27. package/dist/adapter/mcp/stdio-transport.js.map +1 -0
  28. package/dist/adapter/mcp/transport.d.ts +10 -0
  29. package/dist/adapter/mcp/transport.d.ts.map +1 -0
  30. package/dist/adapter/mcp/transport.js +14 -0
  31. package/dist/adapter/mcp/transport.js.map +1 -0
  32. package/dist/approval/approval-token.d.ts +23 -0
  33. package/dist/approval/approval-token.d.ts.map +1 -0
  34. package/dist/approval/approval-token.js +81 -0
  35. package/dist/approval/approval-token.js.map +1 -0
  36. package/dist/audit/audit-dto-mapper.d.ts +29 -0
  37. package/dist/audit/audit-dto-mapper.d.ts.map +1 -0
  38. package/dist/audit/audit-dto-mapper.js +61 -0
  39. package/dist/audit/audit-dto-mapper.js.map +1 -0
  40. package/dist/audit/audit-logger.d.ts +35 -0
  41. package/dist/audit/audit-logger.d.ts.map +1 -0
  42. package/dist/audit/audit-logger.js +67 -0
  43. package/dist/audit/audit-logger.js.map +1 -0
  44. package/dist/audit/audit-sync.d.ts +12 -0
  45. package/dist/audit/audit-sync.d.ts.map +1 -0
  46. package/dist/audit/audit-sync.js +65 -0
  47. package/dist/audit/audit-sync.js.map +1 -0
  48. package/dist/auth/user-authenticator.d.ts +51 -0
  49. package/dist/auth/user-authenticator.d.ts.map +1 -0
  50. package/dist/auth/user-authenticator.js +155 -0
  51. package/dist/auth/user-authenticator.js.map +1 -0
  52. package/dist/cli/cli-db.d.ts +12 -0
  53. package/dist/cli/cli-db.d.ts.map +1 -0
  54. package/dist/cli/cli-db.js +20 -0
  55. package/dist/cli/cli-db.js.map +1 -0
  56. package/dist/cli/cli-utils.d.ts +14 -0
  57. package/dist/cli/cli-utils.d.ts.map +1 -0
  58. package/dist/cli/cli-utils.js +57 -0
  59. package/dist/cli/cli-utils.js.map +1 -0
  60. package/dist/cli/daemon-utils.d.ts +30 -0
  61. package/dist/cli/daemon-utils.d.ts.map +1 -0
  62. package/dist/cli/daemon-utils.js +131 -0
  63. package/dist/cli/daemon-utils.js.map +1 -0
  64. package/dist/cli/daemon.d.ts +13 -0
  65. package/dist/cli/daemon.d.ts.map +1 -0
  66. package/dist/cli/daemon.js +207 -0
  67. package/dist/cli/daemon.js.map +1 -0
  68. package/dist/cli/doctor.d.ts +2 -0
  69. package/dist/cli/doctor.d.ts.map +1 -0
  70. package/dist/cli/doctor.js +135 -0
  71. package/dist/cli/doctor.js.map +1 -0
  72. package/dist/cli/env-delete.d.ts +6 -0
  73. package/dist/cli/env-delete.d.ts.map +1 -0
  74. package/dist/cli/env-delete.js +80 -0
  75. package/dist/cli/env-delete.js.map +1 -0
  76. package/dist/cli/env-list.d.ts +5 -0
  77. package/dist/cli/env-list.d.ts.map +1 -0
  78. package/dist/cli/env-list.js +42 -0
  79. package/dist/cli/env-list.js.map +1 -0
  80. package/dist/cli/env-post-integration.d.ts +21 -0
  81. package/dist/cli/env-post-integration.d.ts.map +1 -0
  82. package/dist/cli/env-post-integration.js +300 -0
  83. package/dist/cli/env-post-integration.js.map +1 -0
  84. package/dist/cli/env-restore.d.ts +15 -0
  85. package/dist/cli/env-restore.d.ts.map +1 -0
  86. package/dist/cli/env-restore.js +130 -0
  87. package/dist/cli/env-restore.js.map +1 -0
  88. package/dist/cli/env.d.ts +14 -0
  89. package/dist/cli/env.d.ts.map +1 -0
  90. package/dist/cli/env.js +182 -0
  91. package/dist/cli/env.js.map +1 -0
  92. package/dist/cli/error-handlers.d.ts +13 -0
  93. package/dist/cli/error-handlers.d.ts.map +1 -0
  94. package/dist/cli/error-handlers.js +32 -0
  95. package/dist/cli/error-handlers.js.map +1 -0
  96. package/dist/cli/hook-check-env.d.ts +12 -0
  97. package/dist/cli/hook-check-env.d.ts.map +1 -0
  98. package/dist/cli/hook-check-env.js +117 -0
  99. package/dist/cli/hook-check-env.js.map +1 -0
  100. package/dist/cli/index.d.ts +2 -0
  101. package/dist/cli/index.d.ts.map +1 -0
  102. package/dist/cli/index.js +294 -0
  103. package/dist/cli/index.js.map +1 -0
  104. package/dist/cli/init-guard.d.ts +13 -0
  105. package/dist/cli/init-guard.d.ts.map +1 -0
  106. package/dist/cli/init-guard.js +62 -0
  107. package/dist/cli/init-guard.js.map +1 -0
  108. package/dist/cli/init.d.ts +19 -0
  109. package/dist/cli/init.d.ts.map +1 -0
  110. package/dist/cli/init.js +440 -0
  111. package/dist/cli/init.js.map +1 -0
  112. package/dist/cli/install.d.ts +14 -0
  113. package/dist/cli/install.d.ts.map +1 -0
  114. package/dist/cli/install.js +186 -0
  115. package/dist/cli/install.js.map +1 -0
  116. package/dist/cli/login.d.ts +6 -0
  117. package/dist/cli/login.d.ts.map +1 -0
  118. package/dist/cli/login.js +76 -0
  119. package/dist/cli/login.js.map +1 -0
  120. package/dist/cli/logs.d.ts +32 -0
  121. package/dist/cli/logs.d.ts.map +1 -0
  122. package/dist/cli/logs.js +147 -0
  123. package/dist/cli/logs.js.map +1 -0
  124. package/dist/cli/project.d.ts +8 -0
  125. package/dist/cli/project.d.ts.map +1 -0
  126. package/dist/cli/project.js +102 -0
  127. package/dist/cli/project.js.map +1 -0
  128. package/dist/cli/reset.d.ts +8 -0
  129. package/dist/cli/reset.d.ts.map +1 -0
  130. package/dist/cli/reset.js +137 -0
  131. package/dist/cli/reset.js.map +1 -0
  132. package/dist/cli/run.d.ts +22 -0
  133. package/dist/cli/run.d.ts.map +1 -0
  134. package/dist/cli/run.js +103 -0
  135. package/dist/cli/run.js.map +1 -0
  136. package/dist/cli/start.d.ts +2 -0
  137. package/dist/cli/start.d.ts.map +1 -0
  138. package/dist/cli/start.js +29 -0
  139. package/dist/cli/start.js.map +1 -0
  140. package/dist/cli/status.d.ts +12 -0
  141. package/dist/cli/status.d.ts.map +1 -0
  142. package/dist/cli/status.js +131 -0
  143. package/dist/cli/status.js.map +1 -0
  144. package/dist/cli/uninstall.d.ts +8 -0
  145. package/dist/cli/uninstall.d.ts.map +1 -0
  146. package/dist/cli/uninstall.js +111 -0
  147. package/dist/cli/uninstall.js.map +1 -0
  148. package/dist/config/config.d.ts +10 -0
  149. package/dist/config/config.d.ts.map +1 -0
  150. package/dist/config/config.js +64 -0
  151. package/dist/config/config.js.map +1 -0
  152. package/dist/config/constants.d.ts +3 -0
  153. package/dist/config/constants.d.ts.map +1 -0
  154. package/dist/config/constants.js +6 -0
  155. package/dist/config/constants.js.map +1 -0
  156. package/dist/config/paths.d.ts +9 -0
  157. package/dist/config/paths.d.ts.map +1 -0
  158. package/dist/config/paths.js +58 -0
  159. package/dist/config/paths.js.map +1 -0
  160. package/dist/core/execution-engine.d.ts +119 -0
  161. package/dist/core/execution-engine.d.ts.map +1 -0
  162. package/dist/core/execution-engine.js +1291 -0
  163. package/dist/core/execution-engine.js.map +1 -0
  164. package/dist/core/runtime.d.ts +43 -0
  165. package/dist/core/runtime.d.ts.map +1 -0
  166. package/dist/core/runtime.js +143 -0
  167. package/dist/core/runtime.js.map +1 -0
  168. package/dist/core/sync-scheduler.d.ts +42 -0
  169. package/dist/core/sync-scheduler.d.ts.map +1 -0
  170. package/dist/core/sync-scheduler.js +131 -0
  171. package/dist/core/sync-scheduler.js.map +1 -0
  172. package/dist/core/types.d.ts +77 -0
  173. package/dist/core/types.d.ts.map +1 -0
  174. package/dist/core/types.js +7 -0
  175. package/dist/core/types.js.map +1 -0
  176. package/dist/daemon/service-manager.d.ts +68 -0
  177. package/dist/daemon/service-manager.d.ts.map +1 -0
  178. package/dist/daemon/service-manager.js +303 -0
  179. package/dist/daemon/service-manager.js.map +1 -0
  180. package/dist/env/env-classifier.d.ts +14 -0
  181. package/dist/env/env-classifier.d.ts.map +1 -0
  182. package/dist/env/env-classifier.js +94 -0
  183. package/dist/env/env-classifier.js.map +1 -0
  184. package/dist/env/env-parser.d.ts +13 -0
  185. package/dist/env/env-parser.d.ts.map +1 -0
  186. package/dist/env/env-parser.js +33 -0
  187. package/dist/env/env-parser.js.map +1 -0
  188. package/dist/env/env-profile-store.d.ts +15 -0
  189. package/dist/env/env-profile-store.d.ts.map +1 -0
  190. package/dist/env/env-profile-store.js +35 -0
  191. package/dist/env/env-profile-store.js.map +1 -0
  192. package/dist/env/env-reference.d.ts +10 -0
  193. package/dist/env/env-reference.d.ts.map +1 -0
  194. package/dist/env/env-reference.js +33 -0
  195. package/dist/env/env-reference.js.map +1 -0
  196. package/dist/env/env-resolver.d.ts +18 -0
  197. package/dist/env/env-resolver.d.ts.map +1 -0
  198. package/dist/env/env-resolver.js +48 -0
  199. package/dist/env/env-resolver.js.map +1 -0
  200. package/dist/env/fs-utils.d.ts +9 -0
  201. package/dist/env/fs-utils.d.ts.map +1 -0
  202. package/dist/env/fs-utils.js +59 -0
  203. package/dist/env/fs-utils.js.map +1 -0
  204. package/dist/env/secret-backend.d.ts +15 -0
  205. package/dist/env/secret-backend.d.ts.map +1 -0
  206. package/dist/env/secret-backend.js +24 -0
  207. package/dist/env/secret-backend.js.map +1 -0
  208. package/dist/executor/executor-registry.d.ts +22 -0
  209. package/dist/executor/executor-registry.d.ts.map +1 -0
  210. package/dist/executor/executor-registry.js +42 -0
  211. package/dist/executor/executor-registry.js.map +1 -0
  212. package/dist/executor/process-launcher.d.ts +26 -0
  213. package/dist/executor/process-launcher.d.ts.map +1 -0
  214. package/dist/executor/process-launcher.js +98 -0
  215. package/dist/executor/process-launcher.js.map +1 -0
  216. package/dist/executor/secret-file.d.ts +28 -0
  217. package/dist/executor/secret-file.d.ts.map +1 -0
  218. package/dist/executor/secret-file.js +127 -0
  219. package/dist/executor/secret-file.js.map +1 -0
  220. package/dist/gateway/auth.d.ts +26 -0
  221. package/dist/gateway/auth.d.ts.map +1 -0
  222. package/dist/gateway/auth.js +66 -0
  223. package/dist/gateway/auth.js.map +1 -0
  224. package/dist/gateway/gateway-client.d.ts +298 -0
  225. package/dist/gateway/gateway-client.d.ts.map +1 -0
  226. package/dist/gateway/gateway-client.js +501 -0
  227. package/dist/gateway/gateway-client.js.map +1 -0
  228. package/dist/identity/agent-identity.d.ts +29 -0
  229. package/dist/identity/agent-identity.d.ts.map +1 -0
  230. package/dist/identity/agent-identity.js +54 -0
  231. package/dist/identity/agent-identity.js.map +1 -0
  232. package/dist/identity/did-manager.d.ts +17 -0
  233. package/dist/identity/did-manager.d.ts.map +1 -0
  234. package/dist/identity/did-manager.js +29 -0
  235. package/dist/identity/did-manager.js.map +1 -0
  236. package/dist/identity/key-manager.d.ts +18 -0
  237. package/dist/identity/key-manager.d.ts.map +1 -0
  238. package/dist/identity/key-manager.js +101 -0
  239. package/dist/identity/key-manager.js.map +1 -0
  240. package/dist/identity/session-key.d.ts +13 -0
  241. package/dist/identity/session-key.d.ts.map +1 -0
  242. package/dist/identity/session-key.js +17 -0
  243. package/dist/identity/session-key.js.map +1 -0
  244. package/dist/policy/policy-evaluator.d.ts +63 -0
  245. package/dist/policy/policy-evaluator.d.ts.map +1 -0
  246. package/dist/policy/policy-evaluator.js +266 -0
  247. package/dist/policy/policy-evaluator.js.map +1 -0
  248. package/dist/policy/policy-loader.d.ts +10 -0
  249. package/dist/policy/policy-loader.d.ts.map +1 -0
  250. package/dist/policy/policy-loader.js +71 -0
  251. package/dist/policy/policy-loader.js.map +1 -0
  252. package/dist/policy/types.d.ts +21 -0
  253. package/dist/policy/types.d.ts.map +1 -0
  254. package/dist/policy/types.js +3 -0
  255. package/dist/policy/types.js.map +1 -0
  256. package/dist/utils/credential-errors.d.ts +3 -0
  257. package/dist/utils/credential-errors.d.ts.map +1 -0
  258. package/dist/utils/credential-errors.js +23 -0
  259. package/dist/utils/credential-errors.js.map +1 -0
  260. package/dist/utils/resource-canonicalizer.d.ts +19 -0
  261. package/dist/utils/resource-canonicalizer.d.ts.map +1 -0
  262. package/dist/utils/resource-canonicalizer.js +100 -0
  263. package/dist/utils/resource-canonicalizer.js.map +1 -0
  264. package/dist/utils/vc-utils.d.ts +23 -0
  265. package/dist/utils/vc-utils.d.ts.map +1 -0
  266. package/dist/utils/vc-utils.js +53 -0
  267. package/dist/utils/vc-utils.js.map +1 -0
  268. package/dist/wallet/sqlite.d.ts +4 -0
  269. package/dist/wallet/sqlite.d.ts.map +1 -0
  270. package/dist/wallet/sqlite.js +158 -0
  271. package/dist/wallet/sqlite.js.map +1 -0
  272. package/dist/wallet/vp-builder.d.ts +18 -0
  273. package/dist/wallet/vp-builder.d.ts.map +1 -0
  274. package/dist/wallet/vp-builder.js +46 -0
  275. package/dist/wallet/vp-builder.js.map +1 -0
  276. package/dist/wallet/wallet.d.ts +58 -0
  277. package/dist/wallet/wallet.d.ts.map +1 -0
  278. package/dist/wallet/wallet.js +170 -0
  279. package/dist/wallet/wallet.js.map +1 -0
  280. package/package.json +80 -0
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.detectScriptsToWrap = detectScriptsToWrap;
37
+ exports.wrapPackageJsonScripts = wrapPackageJsonScripts;
38
+ exports.appendClaudeMd = appendClaudeMd;
39
+ exports.mergeClaudeHook = mergeClaudeHook;
40
+ exports.findPackageJsonRoot = findPackageJsonRoot;
41
+ exports.runPostIntegration = runPostIntegration;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const readline = __importStar(require("node:readline/promises"));
45
+ const cli_utils_1 = require("./cli-utils");
46
+ // --- Script detection ---
47
+ const ENV_DEPENDENT_NAMES = new Set([
48
+ 'dev', 'start', 'build', 'serve', 'preview',
49
+ ]);
50
+ const ENV_INDEPENDENT_NAMES = new Set([
51
+ 'lint', 'test', 'format', 'typecheck', 'check', 'prettier', 'eslint',
52
+ ]);
53
+ const ENV_DEPENDENT_COMMANDS = [
54
+ 'next', 'vite', 'nuxt', 'remix', 'astro', 'webpack', 'turbo',
55
+ 'nest', 'express', 'flask', 'django', 'rails',
56
+ ];
57
+ function detectScriptsToWrap(scripts) {
58
+ const selected = [];
59
+ const unselected = [];
60
+ for (const [name, cmd] of Object.entries(scripts)) {
61
+ const nameLower = name.toLowerCase();
62
+ const cmdLower = cmd.toLowerCase();
63
+ if (ENV_INDEPENDENT_NAMES.has(nameLower)) {
64
+ unselected.push(name);
65
+ continue;
66
+ }
67
+ if (ENV_DEPENDENT_NAMES.has(nameLower)) {
68
+ selected.push(name);
69
+ continue;
70
+ }
71
+ if (ENV_DEPENDENT_COMMANDS.some(tool => cmdLower.includes(tool))) {
72
+ selected.push(name);
73
+ }
74
+ else {
75
+ unselected.push(name);
76
+ }
77
+ }
78
+ return { selected, unselected };
79
+ }
80
+ // --- Package.json wrapping ---
81
+ function wrapPackageJsonScripts(pkgPath, scriptNames) {
82
+ const raw = fs.readFileSync(pkgPath, 'utf-8');
83
+ const indentMatch = raw.match(/^(\s+)"/m);
84
+ const indent = indentMatch ? indentMatch[1].length : 2;
85
+ let pkg;
86
+ try {
87
+ pkg = JSON.parse(raw);
88
+ }
89
+ catch {
90
+ return scriptNames; // All skipped due to parse error
91
+ }
92
+ const scripts = pkg.scripts ?? {};
93
+ const originals = pkg.vess?.originals ?? {};
94
+ const skipped = [];
95
+ for (const name of scriptNames) {
96
+ if (originals[name]) {
97
+ skipped.push(name);
98
+ continue;
99
+ }
100
+ const original = scripts[name];
101
+ if (!original)
102
+ continue;
103
+ if (original.startsWith('vess run')) {
104
+ skipped.push(name);
105
+ continue;
106
+ }
107
+ originals[name] = original;
108
+ scripts[name] = `vess run -- ${original}`;
109
+ }
110
+ pkg.scripts = scripts;
111
+ pkg.vess = { ...pkg.vess, originals };
112
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, indent) + '\n');
113
+ return skipped;
114
+ }
115
+ // --- CLAUDE.md ---
116
+ const VESS_SECTION_MARKER = '## VESS Environment Protection';
117
+ const CLAUDE_MD_SCRIPTS_WRAPPED = `
118
+ ${VESS_SECTION_MARKER}
119
+ This project's .env contains vess:// references. Secret values are stored in OS Keychain
120
+ and are not available to processes started without VESS env resolution.
121
+
122
+ When executing commands that require environment variables:
123
+ - Use the project's npm scripts (e.g., npm run dev, npm run build) — they are pre-configured with vess run
124
+ - Do NOT execute commands directly (e.g., next dev, flask run) — vess:// references will not be resolved and the command will fail or run with missing configuration
125
+ `;
126
+ const CLAUDE_MD_NO_SCRIPTS = `
127
+ ${VESS_SECTION_MARKER}
128
+ This project's .env contains vess:// references. Secret values are stored in OS Keychain
129
+ and are not available to processes started without VESS env resolution.
130
+
131
+ When executing commands that require environment variables:
132
+ - Use: vess run -- <command> (e.g., vess run -- next dev, vess run -- flask run)
133
+ - If the project has a task runner with pre-configured scripts, prefer those
134
+ - Do NOT execute commands directly — vess:// references will not be resolved and the command will fail or run with missing configuration
135
+ `;
136
+ function appendClaudeMd(claudeMdPath, scriptsWrapped) {
137
+ const content = scriptsWrapped ? CLAUDE_MD_SCRIPTS_WRAPPED : CLAUDE_MD_NO_SCRIPTS;
138
+ if (fs.existsSync(claudeMdPath)) {
139
+ const existing = fs.readFileSync(claudeMdPath, 'utf-8');
140
+ if (existing.includes(VESS_SECTION_MARKER)) {
141
+ return 'skipped';
142
+ }
143
+ const separator = existing.endsWith('\n') ? '' : '\n';
144
+ fs.writeFileSync(claudeMdPath, existing + separator + content);
145
+ return 'appended';
146
+ }
147
+ fs.writeFileSync(claudeMdPath, content.trimStart());
148
+ return 'created';
149
+ }
150
+ // --- Claude Code Hook ---
151
+ const HOOK_COMMAND = 'vess hook check-env';
152
+ function mergeClaudeHook(settingsDir) {
153
+ const settingsPath = path.join(settingsDir, 'settings.json');
154
+ const hookEntry = {
155
+ type: 'command',
156
+ command: HOOK_COMMAND,
157
+ };
158
+ const matcherEntry = {
159
+ matcher: 'Bash',
160
+ hooks: [hookEntry],
161
+ };
162
+ if (!fs.existsSync(settingsDir)) {
163
+ fs.mkdirSync(settingsDir, { recursive: true });
164
+ }
165
+ if (fs.existsSync(settingsPath)) {
166
+ let settings;
167
+ try {
168
+ settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
169
+ }
170
+ catch {
171
+ // Malformed settings.json — skip rather than crash
172
+ return 'skipped';
173
+ }
174
+ const hooks = settings.hooks ?? {};
175
+ const preToolUse = hooks.PreToolUse ?? [];
176
+ const exists = preToolUse.some((entry) => entry.hooks?.some((h) => h.command === HOOK_COMMAND));
177
+ if (exists)
178
+ return 'skipped';
179
+ preToolUse.push(matcherEntry);
180
+ hooks.PreToolUse = preToolUse;
181
+ settings.hooks = hooks;
182
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
183
+ return 'merged';
184
+ }
185
+ const settings = { hooks: { PreToolUse: [matcherEntry] } };
186
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
187
+ return 'created';
188
+ }
189
+ // --- Project root detection ---
190
+ function findPackageJsonRoot(startDir) {
191
+ let dir = path.resolve(startDir);
192
+ const root = path.parse(dir).root;
193
+ while (dir !== root) {
194
+ if (fs.existsSync(path.join(dir, 'package.json'))) {
195
+ return dir;
196
+ }
197
+ dir = path.dirname(dir);
198
+ }
199
+ return null;
200
+ }
201
+ async function runPostIntegration(options) {
202
+ const result = {
203
+ scriptsWrapped: false,
204
+ claudeMdResult: 'declined',
205
+ hookResult: 'declined',
206
+ wrappedScriptNames: [],
207
+ };
208
+ if (options.skipIntegration) {
209
+ return result;
210
+ }
211
+ (0, cli_utils_1.log)('');
212
+ (0, cli_utils_1.log)('=== Post-Import Integration (optional) ===');
213
+ (0, cli_utils_1.log)('');
214
+ const rl = readline.createInterface({
215
+ input: process.stdin,
216
+ output: process.stderr,
217
+ });
218
+ try {
219
+ // Step 1: package.json
220
+ const projectRoot = findPackageJsonRoot(options.envFileDir);
221
+ if (projectRoot) {
222
+ const pkgPath = path.join(projectRoot, 'package.json');
223
+ let pkg;
224
+ try {
225
+ pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
226
+ }
227
+ catch {
228
+ (0, cli_utils_1.log)('[Step 1/3] package.json is malformed. Skipping script wrapping.');
229
+ pkg = null;
230
+ }
231
+ const scripts = pkg?.scripts ?? {};
232
+ if (Object.keys(scripts).length > 0) {
233
+ const { selected, unselected } = detectScriptsToWrap(scripts);
234
+ (0, cli_utils_1.log)('[Step 1/3] package.json scripts');
235
+ (0, cli_utils_1.log)('');
236
+ for (const name of selected) {
237
+ (0, cli_utils_1.log)(` ☑ ${name.padEnd(10)}: ${scripts[name]}`);
238
+ }
239
+ for (const name of unselected) {
240
+ (0, cli_utils_1.log)(` ☐ ${name.padEnd(10)}: ${scripts[name]}`);
241
+ }
242
+ (0, cli_utils_1.log)('');
243
+ if (selected.length > 0) {
244
+ const yes = await (0, cli_utils_1.promptYesNo)(rl, 'Wrap selected scripts with vess run?');
245
+ if (yes) {
246
+ const skipped = wrapPackageJsonScripts(pkgPath, selected);
247
+ result.scriptsWrapped = true;
248
+ result.wrappedScriptNames = selected.filter(s => !skipped.includes(s));
249
+ if (skipped.length > 0) {
250
+ (0, cli_utils_1.log)(`[vess] Skipped (already wrapped): ${skipped.join(', ')}`);
251
+ }
252
+ (0, cli_utils_1.log)(`[vess] Wrapped ${result.wrappedScriptNames.length} scripts in package.json`);
253
+ }
254
+ }
255
+ else {
256
+ (0, cli_utils_1.log)(' No env-dependent scripts detected. Skipping.');
257
+ }
258
+ }
259
+ else {
260
+ (0, cli_utils_1.log)('[Step 1/3] No scripts in package.json. Skipping.');
261
+ }
262
+ }
263
+ else {
264
+ (0, cli_utils_1.log)('[Step 1/3] No package.json found. Use `vess run -- <command>` for env injection.');
265
+ }
266
+ (0, cli_utils_1.log)('');
267
+ // Step 2: CLAUDE.md
268
+ (0, cli_utils_1.log)('[Step 2/3] CLAUDE.md AI guidance');
269
+ const claudeMdPath = path.join(options.envFileDir, 'CLAUDE.md');
270
+ const claudeYes = await (0, cli_utils_1.promptYesNo)(rl, 'Add VESS environment guidance to CLAUDE.md?');
271
+ if (claudeYes) {
272
+ result.claudeMdResult = appendClaudeMd(claudeMdPath, result.scriptsWrapped);
273
+ if (result.claudeMdResult === 'skipped') {
274
+ (0, cli_utils_1.log)('[vess] CLAUDE.md already contains VESS guidance');
275
+ }
276
+ else {
277
+ (0, cli_utils_1.log)(`[vess] CLAUDE.md ${result.claudeMdResult}`);
278
+ }
279
+ }
280
+ (0, cli_utils_1.log)('');
281
+ // Step 3: Claude Code Hook
282
+ (0, cli_utils_1.log)('[Step 3/3] Claude Code PreToolUse Hook');
283
+ const hookYes = await (0, cli_utils_1.promptYesNo)(rl, 'Add Claude Code PreToolUse Hook to .claude/settings.json?\n (Injects advisory context when Bash commands run with vess:// env references)');
284
+ if (hookYes) {
285
+ const claudeDir = path.join(options.envFileDir, '.claude');
286
+ result.hookResult = mergeClaudeHook(claudeDir);
287
+ if (result.hookResult === 'skipped') {
288
+ (0, cli_utils_1.log)('[vess] Hook already exists in .claude/settings.json');
289
+ }
290
+ else {
291
+ (0, cli_utils_1.log)(`[vess] .claude/settings.json ${result.hookResult}`);
292
+ }
293
+ }
294
+ }
295
+ finally {
296
+ rl.close();
297
+ }
298
+ return result;
299
+ }
300
+ //# sourceMappingURL=env-post-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-post-integration.js","sourceRoot":"","sources":["../../src/cli/env-post-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface EnvRestoreOptions {
2
+ profile: string;
3
+ output?: string;
4
+ }
5
+ /**
6
+ * Restore plaintext .env from Keychain secrets, gated by biometric authentication.
7
+ *
8
+ * Security note (Phase 1): Touch ID serves as a UX gate — it prevents
9
+ * accidental secret exposure by requiring physical user presence. The
10
+ * authentication and Keychain read are separate operations within the same
11
+ * process. Phase 2 will merge these into a single native call using
12
+ * Security.framework's kSecAccessControlUserPresence for OS-level protection.
13
+ */
14
+ export declare function runEnvRestore(options: EnvRestoreOptions): Promise<void>;
15
+ //# sourceMappingURL=env-restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-restore.d.ts","sourceRoot":"","sources":["../../src/cli/env-restore.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF7E"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runEnvRestore = runEnvRestore;
37
+ const fs = __importStar(require("fs"));
38
+ const fs_utils_1 = require("../env/fs-utils");
39
+ const key_manager_1 = require("../identity/key-manager");
40
+ const cli_db_1 = require("./cli-db");
41
+ const cli_utils_1 = require("./cli-utils");
42
+ const user_authenticator_1 = require("../auth/user-authenticator");
43
+ /**
44
+ * Restore plaintext .env from Keychain secrets, gated by biometric authentication.
45
+ *
46
+ * Security note (Phase 1): Touch ID serves as a UX gate — it prevents
47
+ * accidental secret exposure by requiring physical user presence. The
48
+ * authentication and Keychain read are separate operations within the same
49
+ * process. Phase 2 will merge these into a single native call using
50
+ * Security.framework's kSecAccessControlUserPresence for OS-level protection.
51
+ */
52
+ async function runEnvRestore(options) {
53
+ const { profile, output } = options;
54
+ const writeToStdout = !output || output === '-';
55
+ // 1. Load profile keys from SQLite metadata
56
+ const ctx = (0, cli_db_1.openProfileStore)('env restore');
57
+ if (!ctx)
58
+ return;
59
+ const { db, profileStore } = ctx;
60
+ try {
61
+ const keys = profileStore.listKeys(profile);
62
+ if (keys.length === 0) {
63
+ throw new Error(`No secrets found for profile '${profile}'`);
64
+ }
65
+ // 2. Authenticate user (Touch ID on macOS)
66
+ const authenticator = (0, user_authenticator_1.createAuthenticator)();
67
+ const available = await authenticator.isAvailable();
68
+ if (!available) {
69
+ throw new user_authenticator_1.AuthenticationUnavailableError('Touch ID is required to restore secrets. Biometric authentication is not available on this platform.');
70
+ }
71
+ (0, cli_utils_1.log)(`[vess] Requesting authentication to restore ${keys.length} secrets for profile "${profile}"...`);
72
+ await authenticator.authenticate(`VESS wants to restore env secrets for profile '${profile}'`);
73
+ // 3. Read secrets from Keychain
74
+ const keyManager = new key_manager_1.KeyManager();
75
+ const entries = [];
76
+ let missingCount = 0;
77
+ for (const { keyName } of keys) {
78
+ const value = keyManager.getEnvSecret(profile, keyName);
79
+ if (value == null) {
80
+ (0, cli_utils_1.log)(`[vess] Warning: secret '${keyName}' not found in keychain, skipping`);
81
+ missingCount++;
82
+ continue;
83
+ }
84
+ entries.push({ key: keyName, value });
85
+ }
86
+ // 4. Sort alphabetically and format output
87
+ entries.sort((a, b) => a.key.localeCompare(b.key));
88
+ const lines = entries.map(({ key, value }) => {
89
+ if (needsQuoting(value)) {
90
+ const escaped = value
91
+ .replace(/\\/g, '\\\\')
92
+ .replace(/\$/g, '\\$')
93
+ .replace(/`/g, '\\`')
94
+ .replace(/"/g, '\\"')
95
+ .replace(/\n/g, '\\n');
96
+ return `${key}="${escaped}"`;
97
+ }
98
+ return `${key}=${value}`;
99
+ });
100
+ const content = lines.join('\n') + '\n';
101
+ // 5. Write output
102
+ if (writeToStdout) {
103
+ process.stdout.write(content);
104
+ }
105
+ else {
106
+ if (fs.existsSync(output)) {
107
+ (0, cli_utils_1.log)(`[vess] Warning: overwriting existing ${output}`);
108
+ }
109
+ (0, fs_utils_1.atomicWriteFile)(output, content);
110
+ }
111
+ // 6. Summary
112
+ const dest = writeToStdout ? 'stdout' : output;
113
+ (0, cli_utils_1.log)(`[vess] Restored ${entries.length} secrets for profile "${profile}" to ${dest}`);
114
+ if (missingCount > 0) {
115
+ (0, cli_utils_1.log)(`[vess] ${missingCount} secret(s) were not found in keychain`);
116
+ }
117
+ }
118
+ finally {
119
+ db.close();
120
+ }
121
+ }
122
+ /** Check if a value needs double-quoting in .env format */
123
+ function needsQuoting(value) {
124
+ if (value.length === 0)
125
+ return true; // produce KEY="" for empty values
126
+ if (value.startsWith(' ') || value.endsWith(' '))
127
+ return true;
128
+ return /[#"'$`\n\t\\]/.test(value) || value.includes(' ');
129
+ }
130
+ //# sourceMappingURL=env-restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-restore.js","sourceRoot":"","sources":["../../src/cli/env-restore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { SecretMode } from '../env/env-classifier';
2
+ export interface EnvImportOptions {
3
+ envFile: string;
4
+ profile: string;
5
+ skipKeychain?: boolean;
6
+ mode?: SecretMode;
7
+ secretKeys?: string[];
8
+ plaintextKeys?: string[];
9
+ dryRun?: boolean;
10
+ interactive?: boolean;
11
+ skipIntegration?: boolean;
12
+ }
13
+ export declare function runEnvImport(options: EnvImportOptions): Promise<void>;
14
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAA8D,MAAM,uBAAuB,CAAA;AAE9G,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2J3E"}