@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.
- package/LICENSE +64 -0
- package/README.md +223 -0
- package/bin/vess.js +2 -0
- package/dist/__mocks__/@napi-rs/keyring.d.ts +9 -0
- package/dist/__mocks__/@napi-rs/keyring.d.ts.map +1 -0
- package/dist/__mocks__/@napi-rs/keyring.js +33 -0
- package/dist/__mocks__/@napi-rs/keyring.js.map +1 -0
- package/dist/__mocks__/node-mac-auth.d.ts +8 -0
- package/dist/__mocks__/node-mac-auth.d.ts.map +1 -0
- package/dist/__mocks__/node-mac-auth.js +29 -0
- package/dist/__mocks__/node-mac-auth.js.map +1 -0
- package/dist/adapter/mcp/http-transport.d.ts +34 -0
- package/dist/adapter/mcp/http-transport.d.ts.map +1 -0
- package/dist/adapter/mcp/http-transport.js +158 -0
- package/dist/adapter/mcp/http-transport.js.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts +37 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.js +48 -0
- package/dist/adapter/mcp/mcp-adapter.js.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts +35 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.js +114 -0
- package/dist/adapter/mcp/mcp-server.factory.js.map +1 -0
- package/dist/adapter/mcp/stdio-transport.d.ts +7 -0
- package/dist/adapter/mcp/stdio-transport.d.ts.map +1 -0
- package/dist/adapter/mcp/stdio-transport.js +13 -0
- package/dist/adapter/mcp/stdio-transport.js.map +1 -0
- package/dist/adapter/mcp/transport.d.ts +10 -0
- package/dist/adapter/mcp/transport.d.ts.map +1 -0
- package/dist/adapter/mcp/transport.js +14 -0
- package/dist/adapter/mcp/transport.js.map +1 -0
- package/dist/approval/approval-token.d.ts +23 -0
- package/dist/approval/approval-token.d.ts.map +1 -0
- package/dist/approval/approval-token.js +81 -0
- package/dist/approval/approval-token.js.map +1 -0
- package/dist/audit/audit-dto-mapper.d.ts +29 -0
- package/dist/audit/audit-dto-mapper.d.ts.map +1 -0
- package/dist/audit/audit-dto-mapper.js +61 -0
- package/dist/audit/audit-dto-mapper.js.map +1 -0
- package/dist/audit/audit-logger.d.ts +35 -0
- package/dist/audit/audit-logger.d.ts.map +1 -0
- package/dist/audit/audit-logger.js +67 -0
- package/dist/audit/audit-logger.js.map +1 -0
- package/dist/audit/audit-sync.d.ts +12 -0
- package/dist/audit/audit-sync.d.ts.map +1 -0
- package/dist/audit/audit-sync.js +65 -0
- package/dist/audit/audit-sync.js.map +1 -0
- package/dist/auth/user-authenticator.d.ts +51 -0
- package/dist/auth/user-authenticator.d.ts.map +1 -0
- package/dist/auth/user-authenticator.js +155 -0
- package/dist/auth/user-authenticator.js.map +1 -0
- package/dist/cli/cli-db.d.ts +12 -0
- package/dist/cli/cli-db.d.ts.map +1 -0
- package/dist/cli/cli-db.js +20 -0
- package/dist/cli/cli-db.js.map +1 -0
- package/dist/cli/cli-utils.d.ts +14 -0
- package/dist/cli/cli-utils.d.ts.map +1 -0
- package/dist/cli/cli-utils.js +57 -0
- package/dist/cli/cli-utils.js.map +1 -0
- package/dist/cli/daemon-utils.d.ts +30 -0
- package/dist/cli/daemon-utils.d.ts.map +1 -0
- package/dist/cli/daemon-utils.js +131 -0
- package/dist/cli/daemon-utils.js.map +1 -0
- package/dist/cli/daemon.d.ts +13 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +207 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +135 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/env-delete.d.ts +6 -0
- package/dist/cli/env-delete.d.ts.map +1 -0
- package/dist/cli/env-delete.js +80 -0
- package/dist/cli/env-delete.js.map +1 -0
- package/dist/cli/env-list.d.ts +5 -0
- package/dist/cli/env-list.d.ts.map +1 -0
- package/dist/cli/env-list.js +42 -0
- package/dist/cli/env-list.js.map +1 -0
- package/dist/cli/env-post-integration.d.ts +21 -0
- package/dist/cli/env-post-integration.d.ts.map +1 -0
- package/dist/cli/env-post-integration.js +300 -0
- package/dist/cli/env-post-integration.js.map +1 -0
- package/dist/cli/env-restore.d.ts +15 -0
- package/dist/cli/env-restore.d.ts.map +1 -0
- package/dist/cli/env-restore.js +130 -0
- package/dist/cli/env-restore.js.map +1 -0
- package/dist/cli/env.d.ts +14 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +182 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/error-handlers.d.ts +13 -0
- package/dist/cli/error-handlers.d.ts.map +1 -0
- package/dist/cli/error-handlers.js +32 -0
- package/dist/cli/error-handlers.js.map +1 -0
- package/dist/cli/hook-check-env.d.ts +12 -0
- package/dist/cli/hook-check-env.d.ts.map +1 -0
- package/dist/cli/hook-check-env.js +117 -0
- package/dist/cli/hook-check-env.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +294 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-guard.d.ts +13 -0
- package/dist/cli/init-guard.d.ts.map +1 -0
- package/dist/cli/init-guard.js +62 -0
- package/dist/cli/init-guard.js.map +1 -0
- package/dist/cli/init.d.ts +19 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +440 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/install.d.ts +14 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +186 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/login.d.ts +6 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +76 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logs.d.ts +32 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +147 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/project.d.ts +8 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +102 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/reset.d.ts +8 -0
- package/dist/cli/reset.d.ts.map +1 -0
- package/dist/cli/reset.js +137 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +103 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/start.d.ts +2 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +29 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +12 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +131 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/uninstall.d.ts +8 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +111 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +64 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/constants.d.ts +3 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +6 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +58 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/core/execution-engine.d.ts +119 -0
- package/dist/core/execution-engine.d.ts.map +1 -0
- package/dist/core/execution-engine.js +1291 -0
- package/dist/core/execution-engine.js.map +1 -0
- package/dist/core/runtime.d.ts +43 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +143 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/sync-scheduler.d.ts +42 -0
- package/dist/core/sync-scheduler.d.ts.map +1 -0
- package/dist/core/sync-scheduler.js +131 -0
- package/dist/core/sync-scheduler.js.map +1 -0
- package/dist/core/types.d.ts +77 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/daemon/service-manager.d.ts +68 -0
- package/dist/daemon/service-manager.d.ts.map +1 -0
- package/dist/daemon/service-manager.js +303 -0
- package/dist/daemon/service-manager.js.map +1 -0
- package/dist/env/env-classifier.d.ts +14 -0
- package/dist/env/env-classifier.d.ts.map +1 -0
- package/dist/env/env-classifier.js +94 -0
- package/dist/env/env-classifier.js.map +1 -0
- package/dist/env/env-parser.d.ts +13 -0
- package/dist/env/env-parser.d.ts.map +1 -0
- package/dist/env/env-parser.js +33 -0
- package/dist/env/env-parser.js.map +1 -0
- package/dist/env/env-profile-store.d.ts +15 -0
- package/dist/env/env-profile-store.d.ts.map +1 -0
- package/dist/env/env-profile-store.js +35 -0
- package/dist/env/env-profile-store.js.map +1 -0
- package/dist/env/env-reference.d.ts +10 -0
- package/dist/env/env-reference.d.ts.map +1 -0
- package/dist/env/env-reference.js +33 -0
- package/dist/env/env-reference.js.map +1 -0
- package/dist/env/env-resolver.d.ts +18 -0
- package/dist/env/env-resolver.d.ts.map +1 -0
- package/dist/env/env-resolver.js +48 -0
- package/dist/env/env-resolver.js.map +1 -0
- package/dist/env/fs-utils.d.ts +9 -0
- package/dist/env/fs-utils.d.ts.map +1 -0
- package/dist/env/fs-utils.js +59 -0
- package/dist/env/fs-utils.js.map +1 -0
- package/dist/env/secret-backend.d.ts +15 -0
- package/dist/env/secret-backend.d.ts.map +1 -0
- package/dist/env/secret-backend.js +24 -0
- package/dist/env/secret-backend.js.map +1 -0
- package/dist/executor/executor-registry.d.ts +22 -0
- package/dist/executor/executor-registry.d.ts.map +1 -0
- package/dist/executor/executor-registry.js +42 -0
- package/dist/executor/executor-registry.js.map +1 -0
- package/dist/executor/process-launcher.d.ts +26 -0
- package/dist/executor/process-launcher.d.ts.map +1 -0
- package/dist/executor/process-launcher.js +98 -0
- package/dist/executor/process-launcher.js.map +1 -0
- package/dist/executor/secret-file.d.ts +28 -0
- package/dist/executor/secret-file.d.ts.map +1 -0
- package/dist/executor/secret-file.js +127 -0
- package/dist/executor/secret-file.js.map +1 -0
- package/dist/gateway/auth.d.ts +26 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +66 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/gateway-client.d.ts +298 -0
- package/dist/gateway/gateway-client.d.ts.map +1 -0
- package/dist/gateway/gateway-client.js +501 -0
- package/dist/gateway/gateway-client.js.map +1 -0
- package/dist/identity/agent-identity.d.ts +29 -0
- package/dist/identity/agent-identity.d.ts.map +1 -0
- package/dist/identity/agent-identity.js +54 -0
- package/dist/identity/agent-identity.js.map +1 -0
- package/dist/identity/did-manager.d.ts +17 -0
- package/dist/identity/did-manager.d.ts.map +1 -0
- package/dist/identity/did-manager.js +29 -0
- package/dist/identity/did-manager.js.map +1 -0
- package/dist/identity/key-manager.d.ts +18 -0
- package/dist/identity/key-manager.d.ts.map +1 -0
- package/dist/identity/key-manager.js +101 -0
- package/dist/identity/key-manager.js.map +1 -0
- package/dist/identity/session-key.d.ts +13 -0
- package/dist/identity/session-key.d.ts.map +1 -0
- package/dist/identity/session-key.js +17 -0
- package/dist/identity/session-key.js.map +1 -0
- package/dist/policy/policy-evaluator.d.ts +63 -0
- package/dist/policy/policy-evaluator.d.ts.map +1 -0
- package/dist/policy/policy-evaluator.js +266 -0
- package/dist/policy/policy-evaluator.js.map +1 -0
- package/dist/policy/policy-loader.d.ts +10 -0
- package/dist/policy/policy-loader.d.ts.map +1 -0
- package/dist/policy/policy-loader.js +71 -0
- package/dist/policy/policy-loader.js.map +1 -0
- package/dist/policy/types.d.ts +21 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +3 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/utils/credential-errors.d.ts +3 -0
- package/dist/utils/credential-errors.d.ts.map +1 -0
- package/dist/utils/credential-errors.js +23 -0
- package/dist/utils/credential-errors.js.map +1 -0
- package/dist/utils/resource-canonicalizer.d.ts +19 -0
- package/dist/utils/resource-canonicalizer.d.ts.map +1 -0
- package/dist/utils/resource-canonicalizer.js +100 -0
- package/dist/utils/resource-canonicalizer.js.map +1 -0
- package/dist/utils/vc-utils.d.ts +23 -0
- package/dist/utils/vc-utils.d.ts.map +1 -0
- package/dist/utils/vc-utils.js +53 -0
- package/dist/utils/vc-utils.js.map +1 -0
- package/dist/wallet/sqlite.d.ts +4 -0
- package/dist/wallet/sqlite.d.ts.map +1 -0
- package/dist/wallet/sqlite.js +158 -0
- package/dist/wallet/sqlite.js.map +1 -0
- package/dist/wallet/vp-builder.d.ts +18 -0
- package/dist/wallet/vp-builder.d.ts.map +1 -0
- package/dist/wallet/vp-builder.js +46 -0
- package/dist/wallet/vp-builder.js.map +1 -0
- package/dist/wallet/wallet.d.ts +58 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +170 -0
- package/dist/wallet/wallet.js.map +1 -0
- 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"}
|