@letterblack/lbe-exec 1.2.13 → 1.2.15
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/dist/cli.js +143 -4
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2686,11 +2686,10 @@ switch (cmd) {
|
|
|
2686
2686
|
const existing = process.env.NODE_OPTIONS || "";
|
|
2687
2687
|
const hookFlag = "--require " + hookPath;
|
|
2688
2688
|
const nodeOptions = existing.includes(hookFlag) ? existing : (existing + " " + hookFlag).trim();
|
|
2689
|
-
const npmArgs = rest;
|
|
2690
|
-
const
|
|
2691
|
-
const child = spawn(isWindows ? "npm.cmd" : "npm", npmArgs, {
|
|
2689
|
+
const npmArgs = rest.filter((v) => !v.startsWith("--mode") && v !== opts.mode);
|
|
2690
|
+
const child = spawn("npm", npmArgs, {
|
|
2692
2691
|
stdio: "inherit",
|
|
2693
|
-
shell:
|
|
2692
|
+
shell: true,
|
|
2694
2693
|
env: { ...process.env, NODE_OPTIONS: nodeOptions, LBE_MODE: opts.mode || "observe", LBE_ROOT: process.cwd() }
|
|
2695
2694
|
});
|
|
2696
2695
|
child.on("close", (code) => process.exit(code ?? 0));
|
|
@@ -2736,6 +2735,19 @@ switch (cmd) {
|
|
|
2736
2735
|
console.log(" " + (active ? "\u2713" : "\u2013") + " " + fn);
|
|
2737
2736
|
}
|
|
2738
2737
|
}
|
|
2738
|
+
const activationFile = path15.join(process.cwd(), ".lbe", "activation.json");
|
|
2739
|
+
const sessionActive = (process.env.NODE_OPTIONS || "").includes("register.cjs");
|
|
2740
|
+
if (fs14.existsSync(activationFile)) {
|
|
2741
|
+
try {
|
|
2742
|
+
const act = JSON.parse(fs14.readFileSync(activationFile, "utf8"));
|
|
2743
|
+
console.log("\nactivation: " + (act.permanent ? "permanent" : "session") + " (" + act.mode + ")" + (sessionActive ? " NODE_OPTIONS \u2713" : " restart terminal to apply"));
|
|
2744
|
+
} catch (_) {
|
|
2745
|
+
}
|
|
2746
|
+
} else if (sessionActive) {
|
|
2747
|
+
console.log("\nactivation: session active NODE_OPTIONS \u2713");
|
|
2748
|
+
} else {
|
|
2749
|
+
console.log("\nactivation: none \u2014 run: lbe-exec activate");
|
|
2750
|
+
}
|
|
2739
2751
|
console.log("\nevents log: .lbe/events.jsonl");
|
|
2740
2752
|
break;
|
|
2741
2753
|
}
|
|
@@ -2778,6 +2790,129 @@ switch (cmd) {
|
|
|
2778
2790
|
process.exit(1);
|
|
2779
2791
|
});
|
|
2780
2792
|
break;
|
|
2793
|
+
case "activate": {
|
|
2794
|
+
const hookPath = findHookPath();
|
|
2795
|
+
if (!fs14.existsSync(hookPath)) {
|
|
2796
|
+
console.error("Hook not found: " + hookPath + "\nRun: npm install @letterblack/lbe-exec");
|
|
2797
|
+
process.exit(1);
|
|
2798
|
+
}
|
|
2799
|
+
const mode = opts.mode || "observe";
|
|
2800
|
+
const root = process.cwd();
|
|
2801
|
+
const reqFlag = '--require "' + hookPath + '"';
|
|
2802
|
+
const lbeDir = path15.join(root, ".lbe");
|
|
2803
|
+
fs14.mkdirSync(lbeDir, { recursive: true });
|
|
2804
|
+
fs14.writeFileSync(path15.join(lbeDir, "activation.json"), JSON.stringify({
|
|
2805
|
+
activated: true,
|
|
2806
|
+
activatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2807
|
+
hookPath,
|
|
2808
|
+
mode,
|
|
2809
|
+
root,
|
|
2810
|
+
permanent: !!opts.permanent
|
|
2811
|
+
}, null, 2) + "\n");
|
|
2812
|
+
if (opts.permanent) {
|
|
2813
|
+
if (process.platform === "win32") {
|
|
2814
|
+
const psRead = spawnSync2("powershell.exe", [
|
|
2815
|
+
"-NoProfile",
|
|
2816
|
+
"-NonInteractive",
|
|
2817
|
+
"-Command",
|
|
2818
|
+
'[System.Environment]::GetEnvironmentVariable("NODE_OPTIONS","User")'
|
|
2819
|
+
], { encoding: "utf8" });
|
|
2820
|
+
const current = (psRead.stdout || "").trim();
|
|
2821
|
+
const merged = current.includes(hookPath) ? current : (current + " " + reqFlag).trim();
|
|
2822
|
+
spawnSync2("powershell.exe", [
|
|
2823
|
+
"-NoProfile",
|
|
2824
|
+
"-NonInteractive",
|
|
2825
|
+
"-Command",
|
|
2826
|
+
`[System.Environment]::SetEnvironmentVariable('NODE_OPTIONS','${merged}','User');[System.Environment]::SetEnvironmentVariable('LBE_ROOT','${root}','User');[System.Environment]::SetEnvironmentVariable('LBE_MODE','${mode}','User')`
|
|
2827
|
+
], { stdio: "inherit" });
|
|
2828
|
+
console.log("\n\u2713 LBE permanently activated \u2014 Windows user environment updated.");
|
|
2829
|
+
console.log(" Restart your terminal or IDE to apply.\n");
|
|
2830
|
+
console.log(" Every node / npm / npx process will be governed automatically.");
|
|
2831
|
+
} else {
|
|
2832
|
+
const home = process.env.HOME || "";
|
|
2833
|
+
const rcFiles = [".bashrc", ".zshrc"].map((f) => path15.join(home, f)).filter((f) => fs14.existsSync(f));
|
|
2834
|
+
const block = `
|
|
2835
|
+
# LBE Agent Governance
|
|
2836
|
+
export NODE_OPTIONS='${reqFlag}'
|
|
2837
|
+
export LBE_ROOT="${root}"
|
|
2838
|
+
export LBE_MODE="${mode}"
|
|
2839
|
+
`;
|
|
2840
|
+
for (const rc of rcFiles) {
|
|
2841
|
+
fs14.appendFileSync(rc, block);
|
|
2842
|
+
console.log("\u2713 Appended to " + rc);
|
|
2843
|
+
}
|
|
2844
|
+
if (!rcFiles.length) console.log("No .bashrc/.zshrc found \u2014 add these manually:\n" + block);
|
|
2845
|
+
console.log(" Run: source ~/.bashrc (or restart terminal)");
|
|
2846
|
+
}
|
|
2847
|
+
} else {
|
|
2848
|
+
console.log("\u2500\u2500 LBE Workspace Activation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
|
|
2849
|
+
console.log("workspace: " + root);
|
|
2850
|
+
console.log("hook: " + hookPath);
|
|
2851
|
+
console.log("mode: " + mode);
|
|
2852
|
+
console.log("\nCopy and run in your terminal to arm this session:\n");
|
|
2853
|
+
if (process.platform === "win32") {
|
|
2854
|
+
console.log("# PowerShell:");
|
|
2855
|
+
console.log(`$env:NODE_OPTIONS='--require "` + hookPath + `"'`);
|
|
2856
|
+
console.log('$env:LBE_ROOT="' + root + '"');
|
|
2857
|
+
console.log('$env:LBE_MODE="' + mode + '"');
|
|
2858
|
+
console.log("\n# cmd.exe:");
|
|
2859
|
+
console.log('set NODE_OPTIONS=--require "' + hookPath + '"');
|
|
2860
|
+
console.log("set LBE_ROOT=" + root);
|
|
2861
|
+
console.log("set LBE_MODE=" + mode);
|
|
2862
|
+
} else {
|
|
2863
|
+
console.log(`export NODE_OPTIONS='--require "` + hookPath + `"'`);
|
|
2864
|
+
console.log('export LBE_ROOT="' + root + '"');
|
|
2865
|
+
console.log('export LBE_MODE="' + mode + '"');
|
|
2866
|
+
}
|
|
2867
|
+
console.log("\nAfter running: every node / npm / npx command in this session is governed.");
|
|
2868
|
+
console.log("To persist across all terminals: lbe-exec activate --permanent");
|
|
2869
|
+
}
|
|
2870
|
+
break;
|
|
2871
|
+
}
|
|
2872
|
+
case "deactivate": {
|
|
2873
|
+
const activationFile = path15.join(process.cwd(), ".lbe", "activation.json");
|
|
2874
|
+
if (fs14.existsSync(activationFile)) fs14.unlinkSync(activationFile);
|
|
2875
|
+
if (opts.permanent) {
|
|
2876
|
+
if (process.platform === "win32") {
|
|
2877
|
+
const hookPath = findHookPath();
|
|
2878
|
+
const psRead = spawnSync2("powershell.exe", [
|
|
2879
|
+
"-NoProfile",
|
|
2880
|
+
"-NonInteractive",
|
|
2881
|
+
"-Command",
|
|
2882
|
+
'[System.Environment]::GetEnvironmentVariable("NODE_OPTIONS","User")'
|
|
2883
|
+
], { encoding: "utf8" });
|
|
2884
|
+
const current = (psRead.stdout || "").trim();
|
|
2885
|
+
const cleaned = current.replace('--require "' + hookPath + '"', "").replace("--require " + hookPath, "").trim();
|
|
2886
|
+
spawnSync2("powershell.exe", [
|
|
2887
|
+
"-NoProfile",
|
|
2888
|
+
"-NonInteractive",
|
|
2889
|
+
"-Command",
|
|
2890
|
+
(cleaned ? `[System.Environment]::SetEnvironmentVariable('NODE_OPTIONS','${cleaned}','User');` : `[System.Environment]::SetEnvironmentVariable('NODE_OPTIONS',$null,'User');`) + `[System.Environment]::SetEnvironmentVariable('LBE_ROOT',$null,'User');[System.Environment]::SetEnvironmentVariable('LBE_MODE',$null,'User')`
|
|
2891
|
+
], { stdio: "inherit" });
|
|
2892
|
+
console.log("\u2713 LBE deactivated \u2014 user environment cleared. Restart terminal to apply.");
|
|
2893
|
+
} else {
|
|
2894
|
+
console.log("Remove these lines from your shell RC file (.bashrc / .zshrc):");
|
|
2895
|
+
console.log(" export NODE_OPTIONS=... (the --require lbe line)");
|
|
2896
|
+
console.log(" export LBE_ROOT=...");
|
|
2897
|
+
console.log(" export LBE_MODE=...");
|
|
2898
|
+
}
|
|
2899
|
+
} else {
|
|
2900
|
+
console.log("Run these commands to disarm this session:\n");
|
|
2901
|
+
if (process.platform === "win32") {
|
|
2902
|
+
console.log("# PowerShell:");
|
|
2903
|
+
console.log("Remove-Item Env:NODE_OPTIONS -ErrorAction SilentlyContinue");
|
|
2904
|
+
console.log("Remove-Item Env:LBE_ROOT -ErrorAction SilentlyContinue");
|
|
2905
|
+
console.log("Remove-Item Env:LBE_MODE -ErrorAction SilentlyContinue");
|
|
2906
|
+
console.log("\n# cmd.exe:");
|
|
2907
|
+
console.log("set NODE_OPTIONS=");
|
|
2908
|
+
console.log("set LBE_ROOT=");
|
|
2909
|
+
console.log("set LBE_MODE=");
|
|
2910
|
+
} else {
|
|
2911
|
+
console.log("unset NODE_OPTIONS LBE_ROOT LBE_MODE");
|
|
2912
|
+
}
|
|
2913
|
+
}
|
|
2914
|
+
break;
|
|
2915
|
+
}
|
|
2781
2916
|
case "observe":
|
|
2782
2917
|
case "enforce":
|
|
2783
2918
|
policyModeCommand(cmd, opts).catch((e) => {
|
|
@@ -2829,6 +2964,10 @@ switch (cmd) {
|
|
|
2829
2964
|
console.log(" status Show workspace, mode, hook state, patched functions");
|
|
2830
2965
|
console.log(" audit Show unified event log (.lbe/events.jsonl)");
|
|
2831
2966
|
console.log(" policy List active policy rules");
|
|
2967
|
+
console.log(" activate Arm workspace \u2014 every node/npm/npx is governed");
|
|
2968
|
+
console.log(" [--mode observe|enforce] [--permanent]");
|
|
2969
|
+
console.log(" deactivate Disarm workspace");
|
|
2970
|
+
console.log(" [--permanent]");
|
|
2832
2971
|
console.log(" observe Switch to observer mode (log only, nothing blocked)");
|
|
2833
2972
|
console.log(" enforce Switch to enforcement mode (violations blocked)");
|
|
2834
2973
|
console.log(" execute Send a JSON request from stdin or --input file");
|