@cybedefend/vibedefend 1.3.1 → 1.4.0

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 (57) hide show
  1. package/README.md +32 -5
  2. package/bin/resolve.js +19 -0
  3. package/bin/vibedefend.js +4 -1
  4. package/dist/api/projects.js +158 -0
  5. package/dist/api/projects.js.map +1 -0
  6. package/dist/clients/claude-code.js +2 -2
  7. package/dist/clients/claude-code.js.map +1 -1
  8. package/dist/clients/codex.js +2 -2
  9. package/dist/clients/codex.js.map +1 -1
  10. package/dist/clients/cursor.js +2 -2
  11. package/dist/clients/cursor.js.map +1 -1
  12. package/dist/clients/vscode.js +2 -2
  13. package/dist/clients/vscode.js.map +1 -1
  14. package/dist/clients/windsurf.js +2 -2
  15. package/dist/clients/windsurf.js.map +1 -1
  16. package/dist/config.js +2 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/custom-regions.js +5 -0
  19. package/dist/custom-regions.js.map +1 -1
  20. package/dist/endpoints.js +59 -0
  21. package/dist/endpoints.js.map +1 -0
  22. package/dist/git.js +103 -0
  23. package/dist/git.js.map +1 -0
  24. package/dist/hook-runner.js +554 -281
  25. package/dist/hooks/install.js +49 -6
  26. package/dist/hooks/install.js.map +1 -1
  27. package/dist/hooks/runtime/fetch-rules.js +5 -3
  28. package/dist/hooks/runtime/fetch-rules.js.map +1 -1
  29. package/dist/hooks/runtime/judge-injection.js +65 -0
  30. package/dist/hooks/runtime/judge-injection.js.map +1 -0
  31. package/dist/hooks/runtime/near-miss.js +6 -1
  32. package/dist/hooks/runtime/near-miss.js.map +1 -1
  33. package/dist/hooks/runtime/repo-link-cache.js +116 -0
  34. package/dist/hooks/runtime/repo-link-cache.js.map +1 -0
  35. package/dist/hooks/runtime/resolve.js +79 -0
  36. package/dist/hooks/runtime/resolve.js.map +1 -1
  37. package/dist/hooks/runtime/session-review.js +10 -3
  38. package/dist/hooks/runtime/session-review.js.map +1 -1
  39. package/dist/hooks/runtime/session-start.js +5 -3
  40. package/dist/hooks/runtime/session-start.js.map +1 -1
  41. package/dist/hooks/runtime/user-prompt-submit.js +10 -7
  42. package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
  43. package/dist/index.js +40 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/install.js +142 -88
  46. package/dist/install.js.map +1 -1
  47. package/dist/link.js +325 -0
  48. package/dist/link.js.map +1 -0
  49. package/dist/login.js +2 -23
  50. package/dist/login.js.map +1 -1
  51. package/dist/logout.js +87 -0
  52. package/dist/logout.js.map +1 -0
  53. package/dist/org-gate.js +110 -0
  54. package/dist/org-gate.js.map +1 -0
  55. package/dist/prompts.js +5 -7
  56. package/dist/prompts.js.map +1 -1
  57. package/package.json +1 -1
package/dist/git.js ADDED
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Git origin remote detection + parsing.
3
+ *
4
+ * Used by `vibedefend link` to auto-detect which CybeDefend project a repo
5
+ * corresponds to: read `origin`'s URL via `git remote get-url origin`, then
6
+ * parse it into a provider + host + slug the gateway can match against a
7
+ * project's configured repo.
8
+ */
9
+ import { spawnSync } from 'node:child_process';
10
+ /**
11
+ * Parse a git remote URL into { provider, host, slug }.
12
+ *
13
+ * Supports:
14
+ * - https(s)/git/ssh URLs with a `://` scheme, e.g.
15
+ * `https://github.com/o/r.git`, `ssh://git@gitlab.com/g/sg/p.git`
16
+ * - scp-like syntax, e.g. `git@github.com:o/r.git`
17
+ *
18
+ * `provider` is derived from a substring match on the host ("github" /
19
+ * "gitlab"), so self-hosted instances (`gitlab.example.com`, GitHub
20
+ * Enterprise) are still recognized. An unrecognized host still yields a
21
+ * result with `provider: null` — the caller can fall back to a manual
22
+ * project pick rather than failing outright.
23
+ *
24
+ * Returns `null` when the input can't be parsed into a host + non-empty
25
+ * slug at all (empty string, not a URL, no path component).
26
+ *
27
+ * Whitespace is trimmed, a trailing `.git` suffix is stripped from the
28
+ * slug, and any embedded userinfo (`user:pass@`) is ignored.
29
+ */
30
+ export function parseRemoteUrl(url) {
31
+ const trimmed = url.trim();
32
+ if (trimmed.length === 0)
33
+ return null;
34
+ let host;
35
+ let rawPath;
36
+ if (trimmed.includes('://')) {
37
+ let parsed;
38
+ try {
39
+ parsed = new URL(trimmed);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ if (!parsed.hostname)
45
+ return null;
46
+ host = parsed.hostname;
47
+ rawPath = parsed.pathname;
48
+ }
49
+ else {
50
+ // scp-like syntax: [user@]host:path (no "://" present).
51
+ const scpMatch = /^(?:[^@\s]+@)?([^:\s/]+):(.+)$/.exec(trimmed);
52
+ if (!scpMatch)
53
+ return null;
54
+ // Lowercase to match the `://` branch: WHATWG URL parsing ASCII-folds
55
+ // `hostname`, so both branches must agree on casing for the same host.
56
+ host = scpMatch[1].toLowerCase();
57
+ rawPath = scpMatch[2];
58
+ }
59
+ const slug = rawPath
60
+ .replace(/^\/+/, '')
61
+ .replace(/\/+$/, '')
62
+ .replace(/\.git$/i, '');
63
+ if (slug.length === 0)
64
+ return null;
65
+ return { provider: detectProvider(host), host, slug };
66
+ }
67
+ function detectProvider(host) {
68
+ const lower = host.toLowerCase();
69
+ if (lower.includes('github'))
70
+ return 'github';
71
+ if (lower.includes('gitlab'))
72
+ return 'gitlab';
73
+ return null;
74
+ }
75
+ const GIT_REMOTE_TIMEOUT_MS = 3000;
76
+ /**
77
+ * Read the `origin` remote's URL for the git repo at `cwd` via
78
+ * `git remote get-url origin`. Returns `null` when `cwd` isn't a git repo,
79
+ * there's no `origin` remote, or the command otherwise fails/times out —
80
+ * never throws.
81
+ */
82
+ export function getOriginRemote(cwd, deps = {}) {
83
+ const execImpl = deps.execImpl ?? defaultExecImpl;
84
+ const result = execImpl('git', ['remote', 'get-url', 'origin'], {
85
+ cwd,
86
+ timeoutMs: GIT_REMOTE_TIMEOUT_MS,
87
+ });
88
+ if (result.status !== 0)
89
+ return null;
90
+ const url = result.stdout.trim();
91
+ return url.length > 0 ? url : null;
92
+ }
93
+ function defaultExecImpl(cmd, args, opts) {
94
+ const result = spawnSync(cmd, args, {
95
+ cwd: opts.cwd,
96
+ encoding: 'utf8',
97
+ timeout: opts.timeoutMs,
98
+ stdio: ['ignore', 'pipe', 'ignore'],
99
+ windowsHide: true,
100
+ });
101
+ return { status: result.status, stdout: result.stdout ?? '' };
102
+ }
103
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}