@cybedefend/vibedefend 1.4.4 → 1.4.6

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 (67) hide show
  1. package/README.md +39 -3
  2. package/dist/auth/auth.js +15 -2
  3. package/dist/auth/auth.js.map +1 -1
  4. package/dist/clients/claude-code.js +108 -30
  5. package/dist/clients/claude-code.js.map +1 -1
  6. package/dist/clients/codex.js +117 -18
  7. package/dist/clients/codex.js.map +1 -1
  8. package/dist/clients/cursor-guards-rules.js +26 -1
  9. package/dist/clients/cursor-guards-rules.js.map +1 -1
  10. package/dist/clients/cursor.js +24 -14
  11. package/dist/clients/cursor.js.map +1 -1
  12. package/dist/clients/mcp-url.js +42 -0
  13. package/dist/clients/mcp-url.js.map +1 -0
  14. package/dist/clients/unwire.js +57 -0
  15. package/dist/clients/unwire.js.map +1 -0
  16. package/dist/clients/vscode.js +38 -16
  17. package/dist/clients/vscode.js.map +1 -1
  18. package/dist/clients/windsurf.js +32 -14
  19. package/dist/clients/windsurf.js.map +1 -1
  20. package/dist/config.js +7 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/diagnostics.js +4 -2
  23. package/dist/diagnostics.js.map +1 -1
  24. package/dist/doctor.js +15 -3
  25. package/dist/doctor.js.map +1 -1
  26. package/dist/global-cli.js +138 -0
  27. package/dist/global-cli.js.map +1 -0
  28. package/dist/hook-runner.js +196 -85
  29. package/dist/hooks/install.js +3 -1
  30. package/dist/hooks/install.js.map +1 -1
  31. package/dist/hooks/runtime/pre-compact.js +9 -2
  32. package/dist/hooks/runtime/pre-compact.js.map +1 -1
  33. package/dist/hooks/runtime/proposal-mode.js +75 -0
  34. package/dist/hooks/runtime/proposal-mode.js.map +1 -0
  35. package/dist/hooks/runtime/resolve.js +12 -5
  36. package/dist/hooks/runtime/resolve.js.map +1 -1
  37. package/dist/hooks/runtime/session-review.js +40 -20
  38. package/dist/hooks/runtime/session-review.js.map +1 -1
  39. package/dist/hooks/runtime/session-start.js +7 -1
  40. package/dist/hooks/runtime/session-start.js.map +1 -1
  41. package/dist/hooks/runtime/shell-writes.js +3 -2
  42. package/dist/hooks/runtime/shell-writes.js.map +1 -1
  43. package/dist/hooks/runtime/user-prompt-submit.js +12 -2
  44. package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
  45. package/dist/index.js +12 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/install.js +118 -23
  48. package/dist/install.js.map +1 -1
  49. package/dist/json-file.js +115 -0
  50. package/dist/json-file.js.map +1 -0
  51. package/dist/link.js +5 -2
  52. package/dist/link.js.map +1 -1
  53. package/dist/login.js +12 -4
  54. package/dist/login.js.map +1 -1
  55. package/dist/prompts.js +18 -3
  56. package/dist/prompts.js.map +1 -1
  57. package/dist/refresh-hooks.js +1 -1
  58. package/dist/refresh-hooks.js.map +1 -1
  59. package/dist/self-update.js +5 -0
  60. package/dist/self-update.js.map +1 -1
  61. package/dist/status.js +5 -1
  62. package/dist/status.js.map +1 -1
  63. package/dist/uninstall.js +166 -0
  64. package/dist/uninstall.js.map +1 -0
  65. package/dist/utils.js +1 -20
  66. package/dist/utils.js.map +1 -1
  67. package/package.json +6 -4
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Make `npx @cybedefend/vibedefend install` leave a real `vibedefend` command.
3
+ *
4
+ * Run through npx (or pnpm / yarn `dlx`), the CLI lives in a throwaway cache:
5
+ * the installer wired the MCP + hooks but left nothing on PATH (`vibedefend:
6
+ * command not found`), the hook runner was a frozen copy, and background
7
+ * auto-update was off. So on an ephemeral run the installer first installs the
8
+ * same version globally (`npm install -g`), then hands the rest of the install
9
+ * to that global binary — which renders the self-resolving shim exactly like a
10
+ * regular global install would.
11
+ *
12
+ * Never fatal: if the global install fails (root-owned prefix → EACCES,
13
+ * offline, no npm), the caller carries on with the ephemeral install and the
14
+ * user gets the one-line command to run themselves.
15
+ */
16
+ import { spawnSync } from 'node:child_process';
17
+ import { existsSync } from 'node:fs';
18
+ import { posix, win32 } from 'node:path';
19
+ import { detectInstallMode, resolveScriptPath } from './self-update.js';
20
+ import { log } from './utils.js';
21
+ import { pkg } from './version.js';
22
+ /** Set on the handed-off child so it can never hand off a second time. */
23
+ export const HANDOFF_ENV = 'VIBEDEFEND_GLOBAL_HANDOFF';
24
+ /**
25
+ * On an npx / dlx run: `npm install -g` this version, then run
26
+ * `vibedefend install <installArgs>` from the global package.
27
+ */
28
+ export function installGlobalCliAndHandOff(installArgs, deps = {}) {
29
+ const env = deps.env ?? process.env;
30
+ if (env[HANDOFF_ENV])
31
+ return { kind: 'not-needed' };
32
+ const mode = deps.installMode ?? detectInstallMode(resolveScriptPath());
33
+ if (mode !== 'npx-cache')
34
+ return { kind: 'not-needed' };
35
+ const platform = deps.platform ?? process.platform;
36
+ const runNpm = deps.runNpm ?? ((args) => defaultRunNpm(args, platform));
37
+ const spec = `${pkg.name}@${deps.version ?? pkg.version}`;
38
+ log.step('Installing the vibedefend CLI globally');
39
+ log.hint(`npm install -g ${spec}`);
40
+ const res = runNpm(['install', '-g', spec]);
41
+ if (res.status !== 0) {
42
+ const detail = lastLine(res.stderr);
43
+ log.warn(`Could not install the CLI globally (npm exited with ${res.status})` +
44
+ (detail ? `: ${detail}` : '.'));
45
+ hintManualInstall(spec, platform);
46
+ return { kind: 'failed' };
47
+ }
48
+ // <root>/@cybedefend/vibedefend/bin/vibedefend.js
49
+ const root = runNpm(['root', '-g']);
50
+ const rootDir = root.status === 0 ? root.stdout.trim() : '';
51
+ const { join } = platform === 'win32' ? win32 : posix;
52
+ const cliEntry = rootDir
53
+ ? join(rootDir, ...pkg.name.split('/'), 'bin', 'vibedefend.js')
54
+ : null;
55
+ if (!cliEntry || !(deps.exists ?? existsSync)(cliEntry)) {
56
+ log.warn('The CLI was installed globally, but its location could not be resolved ' +
57
+ '(`npm root -g`). Continuing with this one-off copy.');
58
+ return { kind: 'failed' };
59
+ }
60
+ log.ok('`vibedefend` CLI installed globally.');
61
+ warnIfBinNotOnPath(rootDir, platform, env);
62
+ const exitCode = (deps.runCli ?? defaultRunCli)(cliEntry, ['install', ...installArgs]);
63
+ return { kind: 'handed-off', exitCode };
64
+ }
65
+ /**
66
+ * npm puts global bins in `<prefix>/bin` on Unix (root = `<prefix>/lib/node_modules`)
67
+ * and in `<prefix>` itself on Windows (root = `<prefix>\node_modules`). A custom
68
+ * prefix that is not on PATH (e.g. `~/.npm-global`) installs fine but leaves the
69
+ * command unreachable — say so instead of letting `command not found` surprise.
70
+ */
71
+ function warnIfBinNotOnPath(rootDir, platform, env) {
72
+ const win = platform === 'win32';
73
+ const { dirname, join } = win ? win32 : posix;
74
+ const binDir = win ? dirname(rootDir) : join(dirname(dirname(rootDir)), 'bin');
75
+ const norm = (p) => {
76
+ const trimmed = p.replace(/[\\/]+$/, '');
77
+ return win ? trimmed.toLowerCase() : trimmed;
78
+ };
79
+ const entries = (env.PATH ?? env.Path ?? '')
80
+ .split(win ? ';' : ':')
81
+ .filter(Boolean)
82
+ .map(norm);
83
+ if (entries.includes(norm(binDir)))
84
+ return;
85
+ log.warn(`npm's global bin directory (${binDir}) is not on your PATH — ` +
86
+ 'add it to your shell profile to use the `vibedefend` command.');
87
+ }
88
+ function hintManualInstall(spec, platform) {
89
+ log.hint('Hooks and MCP are still set up below. For the `vibedefend` command, run:');
90
+ log.hint(` npm install -g ${spec}`);
91
+ if (platform !== 'win32') {
92
+ log.hint('(prefix it with `sudo` if your global npm directory is root-owned)');
93
+ }
94
+ }
95
+ function lastLine(text) {
96
+ const lines = text.split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
97
+ return lines.at(-1) ?? '';
98
+ }
99
+ /**
100
+ * The argv to run `npm <args>` WITHOUT a shell. Windows `npm` is a `.cmd` shim
101
+ * that spawn can only resolve through `cmd.exe` (CWE-78 surface), so there we
102
+ * run the npm CLI that every Windows Node distribution (official installer,
103
+ * nvm-windows, Volta, Scoop) bundles next to `node.exe`. Null when it is absent.
104
+ */
105
+ export function npmInvocation(args, platform = process.platform, execPath = process.execPath, exists = existsSync) {
106
+ if (platform !== 'win32')
107
+ return { command: 'npm', args };
108
+ const npmCli = win32.join(win32.dirname(execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js');
109
+ return exists(npmCli) ? { command: execPath, args: [npmCli, ...args] } : null;
110
+ }
111
+ function defaultRunNpm(args, platform) {
112
+ const inv = npmInvocation(args, platform);
113
+ if (!inv) {
114
+ return { status: 1, stdout: '', stderr: `npm not found next to ${process.execPath}` };
115
+ }
116
+ const r = spawnSync(inv.command, inv.args, {
117
+ encoding: 'utf8',
118
+ stdio: ['ignore', 'pipe', 'pipe'],
119
+ windowsHide: true,
120
+ });
121
+ return {
122
+ status: r.status ?? 1,
123
+ stdout: r.stdout ?? '',
124
+ stderr: (r.stderr ?? '') + (r.error ? `\n${r.error.message}` : ''),
125
+ };
126
+ }
127
+ function defaultRunCli(cliEntry, args) {
128
+ // By absolute path, not via PATH — that can resolve to a stale binary (or
129
+ // nothing) right after a global install.
130
+ const r = spawnSync(process.execPath, [cliEntry, ...args], {
131
+ stdio: 'inherit',
132
+ env: { ...process.env, [HANDOFF_ENV]: '1' },
133
+ });
134
+ if (r.status !== null)
135
+ return r.status;
136
+ return r.signal === 'SIGINT' ? 130 : 1;
137
+ }
138
+ //# sourceMappingURL=global-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-cli.js","sourceRoot":"","sources":["../src/global-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAoB,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AA8BvD;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAqB,EACrB,OAAsB,EAAE;IAExB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,IAAI,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxE,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;IAE1D,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACnD,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CACN,uDAAuD,GAAG,CAAC,MAAM,GAAG;YAClE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CACjC,CAAC;QACF,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,kDAAkD;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO;QACtB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,CACN,yEAAyE;YACvE,qDAAqD,CACxD,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,sCAAsC,CAAC,CAAC;IAC/C,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,OAAe,EACf,QAAyB,EACzB,GAAsB;IAEtB,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC;IACjC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;SACzC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,IAAI,CAAC,CAAC;IACb,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO;IAC3C,GAAG,CAAC,IAAI,CACN,+BAA+B,MAAM,0BAA0B;QAC7D,+DAA+D,CAClE,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,QAAyB;IAChE,GAAG,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACrF,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAc,EACd,WAA4B,OAAO,CAAC,QAAQ,EAC5C,WAAmB,OAAO,CAAC,QAAQ,EACnC,SAAoC,UAAU;IAE9C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/F,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,IAAc,EAAE,QAAyB;IAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,yBAAyB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;QACzC,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;QACtB,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAc;IACrD,0EAA0E;IAC1E,yCAAyC;IACzC,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE;QACzD,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE;KAC5C,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}