@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/link.js ADDED
@@ -0,0 +1,325 @@
1
+ /**
2
+ * `vibedefend link` — link a local repository to a CybeDefend project.
3
+ *
4
+ * Writes `<path>/.cybedefend/config.json` with the resolved `projectId`,
5
+ * MERGING into any existing file (so a hand-authored `apiBase` override
6
+ * survives). No secret is ever written — the config only ever carries the
7
+ * project id (and whatever keys were already there).
8
+ *
9
+ * Flow (spec §2.2):
10
+ * 1. Region — from `~/.cybedefend/runtime-config.json` when present,
11
+ * else the `--region` flag, else an interactive picker. When
12
+ * the runtime config is absent we print an "run install" hint
13
+ * at the end.
14
+ * 2. Auth — if no VibeDefend credentials are stored for the region's
15
+ * mcpName, run the browser PKCE login. A failed login aborts.
16
+ * 3. Project — `--project <id>` (validated + confirmed), else auto-resolve
17
+ * from the git origin (exactly one gateway match → confirm),
18
+ * else an interactive organization → project picker.
19
+ * 4. Path — prompt for the on-disk location (default: cwd), validating
20
+ * that the directory exists. An invalid `--path` falls through
21
+ * to the prompt.
22
+ * 5. Write — merge + write `.cybedefend/config.json`, then report.
23
+ *
24
+ * Every network / auth / git / runtime-config dependency is injectable via
25
+ * {@link LinkDeps} so the whole flow is unit-testable without a live gateway,
26
+ * keychain, or git repo. Interactive prompts come from `@inquirer/prompts`.
27
+ */
28
+ import { statSync } from 'node:fs';
29
+ import { homedir } from 'node:os';
30
+ import { join, resolve as resolvePath } from 'node:path';
31
+ import { confirm, input, select } from '@inquirer/prompts';
32
+ import kleur from 'kleur';
33
+ import { listOrganizations as listOrganizationsImpl, listProjects as listProjectsImpl, resolveProjectByRepository as resolveProjectByRepositoryImpl, } from './api/projects.js';
34
+ import { hasStoredAuth as hasStoredAuthImpl } from './auth/auth.js';
35
+ import { REGIONS } from './config.js';
36
+ import { loadCustomRegions } from './custom-regions.js';
37
+ import { deriveLogtoEndpoint } from './endpoints.js';
38
+ import { getOriginRemote as getOriginRemoteImpl, parseRemoteUrl } from './git.js';
39
+ import { loadRuntimeConfig as loadRuntimeConfigImpl } from './hooks/runtime/config.js';
40
+ import { resolveTokenWithRefresh } from './hooks/runtime/resolve.js';
41
+ import { runLogin as runLoginImpl } from './login.js';
42
+ import { log, readJson, writeJson } from './utils.js';
43
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
44
+ // ─── Small helpers ────────────────────────────────────────────────────────────
45
+ function defaultIsDirectory(p) {
46
+ try {
47
+ return statSync(p).isDirectory();
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ /** Expand a leading `~` to the user's home directory. */
54
+ function expandHome(p) {
55
+ if (p === '~')
56
+ return homedir();
57
+ if (p.startsWith('~/') || p.startsWith('~\\')) {
58
+ return join(homedir(), p.slice(2));
59
+ }
60
+ return p;
61
+ }
62
+ // ─── Region resolution ────────────────────────────────────────────────────────
63
+ /**
64
+ * Resolve the region to operate against. Runtime config wins when present
65
+ * (the normal post-`install` case); otherwise `--region` or an interactive
66
+ * picker is used and the caller is later hinted to run `vibedefend install`.
67
+ */
68
+ async function resolveRegion(opts, deps) {
69
+ const loadRuntime = deps.loadRuntimeConfig ?? loadRuntimeConfigImpl;
70
+ const rc = loadRuntime();
71
+ if (rc?.region?.apiBase && rc.region.mcpName) {
72
+ // Precedence: the installed runtime-config always wins. But if the user
73
+ // explicitly asked for a DIFFERENT region, say so — silently targeting
74
+ // the configured cluster would look like a mis-link.
75
+ if (opts.region && opts.region !== rc.region.id) {
76
+ log.warn(`Ignoring --region ${opts.region}: this machine is configured for ${rc.region.id}. ` +
77
+ 'Run `vibedefend install` to switch regions.');
78
+ }
79
+ const apiBase = rc.region.apiBase;
80
+ const region = rc.region;
81
+ const logtoEndpoint = region.logtoEndpoint ??
82
+ rc.logtoEndpoint ??
83
+ deriveLogtoEndpoint(apiBase);
84
+ return {
85
+ region: {
86
+ id: rc.region.id,
87
+ mcpName: rc.region.mcpName,
88
+ apiBase,
89
+ logtoEndpoint,
90
+ label: rc.region.label,
91
+ },
92
+ runtimeConfigPresent: true,
93
+ };
94
+ }
95
+ // No runtime config → --region flag or interactive picker.
96
+ const listRegions = deps.listRegions ?? (() => [...loadCustomRegions(), ...REGIONS]);
97
+ const regions = listRegions();
98
+ let chosen;
99
+ if (opts.region) {
100
+ chosen = regions.find((r) => r.id === opts.region);
101
+ if (!chosen) {
102
+ throw new Error(`Unknown region "${opts.region}". Known regions: ${regions
103
+ .map((r) => r.id)
104
+ .join(', ')}.`);
105
+ }
106
+ }
107
+ else {
108
+ chosen = await select({
109
+ message: 'Pick a region:',
110
+ choices: regions.map((r) => ({
111
+ name: `${r.label} — ${kleur.dim(r.description)}`,
112
+ value: r,
113
+ short: r.label,
114
+ })),
115
+ });
116
+ }
117
+ return {
118
+ region: {
119
+ id: chosen.id,
120
+ mcpName: chosen.mcpName,
121
+ apiBase: chosen.apiBase,
122
+ logtoEndpoint: chosen.logtoEndpoint ??
123
+ deriveLogtoEndpoint(chosen.apiBase),
124
+ label: chosen.label,
125
+ },
126
+ runtimeConfigPresent: false,
127
+ };
128
+ }
129
+ // ─── Auth ─────────────────────────────────────────────────────────────────────
130
+ /** Trigger the browser login flow when no VibeDefend credentials are stored. */
131
+ async function ensureAuth(region, deps) {
132
+ const hasAuth = (deps.hasStoredAuth ?? hasStoredAuthImpl)(region.mcpName);
133
+ if (hasAuth)
134
+ return;
135
+ log.info('No VibeDefend credentials found — signing you in first.');
136
+ const runLogin = deps.runLogin ?? runLoginImpl;
137
+ try {
138
+ await runLogin({
139
+ mcpName: region.mcpName,
140
+ apiBase: region.apiBase,
141
+ logtoEndpoint: region.logtoEndpoint,
142
+ });
143
+ }
144
+ catch (e) {
145
+ const msg = e instanceof Error ? e.message : String(e);
146
+ throw new Error(`Sign-in failed (${msg}). Run \`vibedefend login\` and try again.`);
147
+ }
148
+ }
149
+ // ─── Project resolution ───────────────────────────────────────────────────────
150
+ /**
151
+ * Resolve the project to link. Returns `null` when the user declines the
152
+ * `--project` confirmation (a clean cancel).
153
+ */
154
+ async function resolveProject(opts, deps, region) {
155
+ // 1. Explicit --project: validate the UUID shape, then confirm.
156
+ if (opts.project) {
157
+ const id = opts.project.trim();
158
+ if (!UUID_RE.test(id)) {
159
+ throw new Error(`"${id}" is not a valid project id (expected a UUID).`);
160
+ }
161
+ const ok = await confirm({
162
+ message: `Link project ${id}?`,
163
+ default: true,
164
+ });
165
+ if (!ok) {
166
+ log.info('Cancelled.');
167
+ return null;
168
+ }
169
+ return { projectId: id };
170
+ }
171
+ // Discovery needs a bearer token.
172
+ const resolveToken = deps.resolveToken ?? resolveTokenWithRefresh;
173
+ const token = await resolveToken(region.mcpName);
174
+ if (!token) {
175
+ throw new Error('Could not resolve an authentication token. Run `vibedefend login` and try again.');
176
+ }
177
+ // 2. Auto-resolve from the git origin: exactly one match → propose it.
178
+ const cwd = deps.cwd ?? process.cwd();
179
+ const getOrigin = deps.getOriginRemote ?? getOriginRemoteImpl;
180
+ const originUrl = getOrigin(cwd);
181
+ if (originUrl) {
182
+ const remote = parseRemoteUrl(originUrl);
183
+ if (remote?.provider) {
184
+ const resolveByRepo = deps.resolveProjectByRepository ?? resolveProjectByRepositoryImpl;
185
+ const matches = await resolveByRepo(region.apiBase, token, {
186
+ provider: remote.provider,
187
+ slug: remote.slug,
188
+ host: remote.host,
189
+ });
190
+ if (matches === null) {
191
+ // Network / gateway failure — not "no match". Tell the user why the
192
+ // auto-detection is being skipped instead of silently degrading.
193
+ log.warn('Could not check the gateway for this repository — falling back to manual selection.');
194
+ }
195
+ else if (matches.length === 1) {
196
+ const m = matches[0];
197
+ const ok = await confirm({
198
+ message: `Link this repo to « ${m.projectName} » (${m.projectId})?`,
199
+ default: true,
200
+ });
201
+ if (ok) {
202
+ return { projectId: m.projectId, projectName: m.projectName };
203
+ }
204
+ // Declined → fall through to manual selection below.
205
+ }
206
+ }
207
+ }
208
+ // 3. Interactive organization → project picker.
209
+ return selectProjectInteractively(deps, region, token);
210
+ }
211
+ async function selectProjectInteractively(deps, region, token) {
212
+ const listOrgs = deps.listOrganizations ?? listOrganizationsImpl;
213
+ const orgs = await listOrgs(region.apiBase, token);
214
+ if (!orgs) {
215
+ throw new Error('Could not list your organizations (gateway unreachable).');
216
+ }
217
+ if (orgs.length === 0) {
218
+ throw new Error('You do not belong to any organization yet.');
219
+ }
220
+ const orgId = orgs.length === 1
221
+ ? orgs[0].id
222
+ : await select({
223
+ message: 'Organization:',
224
+ choices: orgs.map((o) => ({ name: o.name, value: o.id })),
225
+ });
226
+ const listProjs = deps.listProjects ?? listProjectsImpl;
227
+ // Initial unfiltered fetch. This distinguishes "the organization has no
228
+ // projects at all" (clean failure — a search loop could never succeed)
229
+ // from "this particular search matched nothing" (retry another query).
230
+ const initial = await listProjs(region.apiBase, token, orgId, undefined);
231
+ if (!initial) {
232
+ throw new Error('Could not list projects (gateway unreachable).');
233
+ }
234
+ if (initial.length === 0) {
235
+ throw new Error('This organization has no projects yet — create one in the dashboard first.');
236
+ }
237
+ // ≥1 project exists — loop so an empty search result lets the user try
238
+ // another query. An empty search reuses the initial list (gateway caps the
239
+ // page at 10, so it is the first 10 projects, not every project).
240
+ for (;;) {
241
+ const search = (await input({
242
+ message: 'Search a project (empty = first 10 shown):',
243
+ default: '',
244
+ })).trim();
245
+ const projects = search
246
+ ? await listProjs(region.apiBase, token, orgId, search)
247
+ : initial;
248
+ if (!projects) {
249
+ throw new Error('Could not list projects (gateway unreachable).');
250
+ }
251
+ if (projects.length === 0) {
252
+ log.warn('No project matched that search — try another query.');
253
+ continue;
254
+ }
255
+ const picked = await select({
256
+ message: 'Project:',
257
+ choices: projects.map((p) => ({
258
+ name: `${p.name} ${kleur.dim(`(${p.projectId})`)}`,
259
+ value: p,
260
+ short: p.name,
261
+ })),
262
+ });
263
+ return { projectId: picked.projectId, projectName: picked.name };
264
+ }
265
+ }
266
+ // ─── Path resolution ──────────────────────────────────────────────────────────
267
+ /**
268
+ * Resolve the on-disk directory to write into. A valid `--path` is used
269
+ * directly; otherwise (including an invalid `--path`) we prompt, defaulting
270
+ * to the cwd and re-prompting until an existing directory is given.
271
+ */
272
+ async function resolveTargetPath(opts, deps) {
273
+ const isDir = deps.isDirectory ?? defaultIsDirectory;
274
+ const cwd = deps.cwd ?? process.cwd();
275
+ if (opts.path) {
276
+ const p = resolvePath(expandHome(opts.path));
277
+ if (isDir(p))
278
+ return p;
279
+ log.warn(`--path "${opts.path}" is not an existing directory.`);
280
+ }
281
+ const answer = await input({
282
+ message: 'Où se trouve le projet sur votre poste ?',
283
+ default: cwd,
284
+ validate: (v) => {
285
+ const p = resolvePath(expandHome((v || '').trim() || cwd));
286
+ return isDir(p)
287
+ ? true
288
+ : 'Ce dossier n’existe pas — indiquez un chemin valide.';
289
+ },
290
+ });
291
+ return resolvePath(expandHome((answer || '').trim() || cwd));
292
+ }
293
+ // ─── Entry point ──────────────────────────────────────────────────────────────
294
+ /**
295
+ * Run the full `vibedefend link` flow. Returns the {@link LinkResult} on
296
+ * success, or `null` when the user cancels. Throws on hard failures (unknown
297
+ * region, failed sign-in, gateway unreachable) — the CLI action wrapper maps
298
+ * that to a clean exit code.
299
+ */
300
+ export async function runLinkCommand(opts = {}, deps = {}) {
301
+ const { region, runtimeConfigPresent } = await resolveRegion(opts, deps);
302
+ await ensureAuth(region, deps);
303
+ const project = await resolveProject(opts, deps, region);
304
+ if (!project)
305
+ return null;
306
+ const targetPath = await resolveTargetPath(opts, deps);
307
+ const configPath = join(targetPath, '.cybedefend', 'config.json');
308
+ const existing = readJson(configPath, {});
309
+ const merged = { ...existing, projectId: project.projectId };
310
+ writeJson(configPath, merged);
311
+ const label = project.projectName
312
+ ? `${project.projectName} (${project.projectId})`
313
+ : project.projectId;
314
+ log.ok(`Projet lié — ${label}`);
315
+ log.hint(`Configuration écrite dans ${configPath}`);
316
+ if (!runtimeConfigPresent) {
317
+ log.hint('Astuce : lancez `vibedefend install` pour configurer le MCP et les hooks.');
318
+ }
319
+ return {
320
+ projectId: project.projectId,
321
+ projectName: project.projectName,
322
+ configPath,
323
+ };
324
+ }
325
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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"}
package/dist/login.js CHANGED
@@ -25,6 +25,7 @@ import { homedir } from 'node:os';
25
25
  import { join } from 'node:path';
26
26
  import { existsSync, readFileSync } from 'node:fs';
27
27
  import kleur from 'kleur';
28
+ import { deriveLogtoEndpoint } from './endpoints.js';
28
29
  import { resolveToken } from './hooks/runtime/resolve.js';
29
30
  import { log } from './utils.js';
30
31
  import { randomBase64url, pkceChallenge } from './auth/pkce.js';
@@ -309,7 +310,7 @@ export async function runLoginCommand(opts) {
309
310
  process.exit(1);
310
311
  }
311
312
  const logtoEndpoint = regionCfg.logtoEndpoint ??
312
- deriveLogtoEndpointFromApiBase(regionCfg.apiBase);
313
+ deriveLogtoEndpoint(regionCfg.apiBase);
313
314
  try {
314
315
  await runLogin({
315
316
  mcpName: regionCfg.mcpName,
@@ -330,26 +331,4 @@ export async function runLoginCommand(opts) {
330
331
  // their prompt back immediately.
331
332
  process.exit(0);
332
333
  }
333
- /**
334
- * Derive the Logto OIDC endpoint from the gateway apiBase when not explicitly
335
- * configured. Convention: api.cybedefend.com → auth.cybedefend.com.
336
- * Local dev: localhost:3000 → localhost:3003.
337
- */
338
- function deriveLogtoEndpointFromApiBase(apiBase) {
339
- // Production: https://api.cybedefend.com → https://auth.cybedefend.com
340
- if (apiBase.includes('://api.')) {
341
- return apiBase.replace('://api.', '://auth.');
342
- }
343
- // Regional: https://api-us.cybedefend.com → https://auth-us.cybedefend.com
344
- if (apiBase.match(/\/\/api-[a-z]+\./)) {
345
- return apiBase.replace('://api-', '://auth-');
346
- }
347
- // Local dev: http://localhost:3000 (gateway) → http://localhost:3003 (Logto).
348
- if (apiBase.includes('localhost')) {
349
- return apiBase.replace(':3000', ':3003');
350
- }
351
- // Fallback: assume Logto is at the same host (won't work but at least
352
- // gives a deterministic URL for the error message).
353
- return apiBase;
354
- }
355
334
  //# sourceMappingURL=login.js.map
package/dist/login.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
package/dist/logout.js ADDED
@@ -0,0 +1,87 @@
1
+ /**
2
+ * `vibedefend logout` — sign out of CybeDefend by clearing VibeDefend's own
3
+ * stored OAuth bundle(s) so the next `install` / `login` triggers a fresh
4
+ * browser sign-in.
5
+ *
6
+ * Scope, deliberately narrow:
7
+ * - Clears ONLY VibeDefend-owned credentials — the `<mcpName>|vibedefend`
8
+ * keychain entries written by `storeAuth` (macOS Keychain) and the
9
+ * `~/.cybedefend/auth.json` file fallback (Linux/Windows), via `clearAuth`,
10
+ * for every configured region (deduped by mcpName). Plus the legacy
11
+ * `~/.cybedefend/credentials.json` oauth store if present.
12
+ * - Does NOT touch the coding agents' OWN MCP OAuth tokens — Claude Code's
13
+ * protected `Claude Code-credentials` blob, or Codex's `<mcpName>|<hash>`
14
+ * entries. Those belong to the agents; silently nuking them is exactly the
15
+ * kind of surprise a `logout` should not spring. If an agent token still
16
+ * resolves afterwards (so `login` keeps saying "already logged in"), we tell
17
+ * the user how to clear it agent-side instead.
18
+ */
19
+ import { existsSync, rmSync } from 'node:fs';
20
+ import { homedir } from 'node:os';
21
+ import { join } from 'node:path';
22
+ import { clearAuth } from './auth/auth-store.js';
23
+ import { REGIONS } from './config.js';
24
+ import { loadCustomRegions } from './custom-regions.js';
25
+ import { log as defaultLog } from './utils.js';
26
+ /**
27
+ * Core logout logic. Pure except for the injected side-effecting deps, so it
28
+ * is fully unit-testable. The CLI wrapper (see index.ts) just calls this.
29
+ */
30
+ export function runLogout(opts = {}, deps = {}) {
31
+ const listRegions = deps.listRegions ?? (() => [...loadCustomRegions(), ...REGIONS]);
32
+ const clearAuthFn = deps.clearAuthFn ?? clearAuth;
33
+ const fileExists = deps.fileExists ?? existsSync;
34
+ const removeFile = deps.removeFile ?? ((p) => rmSync(p, { force: true }));
35
+ const l = deps.log ?? defaultLog;
36
+ const regions = listRegions();
37
+ const targets = opts.region
38
+ ? regions.filter((r) => r.id === opts.region)
39
+ : regions;
40
+ // Validate --region BEFORE clearing anything, so a typo is a no-op.
41
+ if (opts.region && targets.length === 0) {
42
+ const known = regions.map((r) => r.id).join(', ');
43
+ throw new Error(`Unknown region '${opts.region}'. Known regions: ${known || '(none)'}.`);
44
+ }
45
+ // Clear each distinct mcpName once (eu + us share 'cybedefend').
46
+ const seen = new Set();
47
+ const clearedMcpNames = [];
48
+ const clearedRegionIds = [];
49
+ for (const r of targets) {
50
+ clearedRegionIds.push(r.id);
51
+ if (seen.has(r.mcpName))
52
+ continue;
53
+ seen.add(r.mcpName);
54
+ clearAuthFn(r.mcpName);
55
+ clearedMcpNames.push(r.mcpName);
56
+ }
57
+ // Legacy ~/.cybedefend/credentials.json (older oauth store — not written by
58
+ // the current storeAuth path, but left behind by earlier versions).
59
+ const legacyPath = join(homedir(), '.cybedefend', 'credentials.json');
60
+ let legacyCredentialsRemoved = false;
61
+ if (fileExists(legacyPath)) {
62
+ try {
63
+ removeFile(legacyPath);
64
+ legacyCredentialsRemoved = true;
65
+ }
66
+ catch {
67
+ // Best-effort — a stale legacy file is better than a failed logout.
68
+ }
69
+ }
70
+ // ── Report ──────────────────────────────────────────────────────────────
71
+ if (clearedMcpNames.length === 0) {
72
+ l.info('No VibeDefend credentials were stored — nothing to clear.');
73
+ }
74
+ else {
75
+ l.ok('Signed out of CybeDefend.');
76
+ l.hint(`Cleared stored credentials for: ${clearedRegionIds.join(', ')}.`);
77
+ if (legacyCredentialsRemoved) {
78
+ l.hint('Removed legacy ~/.cybedefend/credentials.json.');
79
+ }
80
+ l.hint('Next `vibedefend install` will prompt a fresh browser sign-in.');
81
+ l.hint('Tip: `vibedefend login` and the hooks may still reuse a coding agent\'s');
82
+ l.hint('own MCP token if present — use `vibedefend login --force` (or `install');
83
+ l.hint('--force`) to re-auth anytime, no logout needed.');
84
+ }
85
+ return { clearedMcpNames, clearedRegionIds, legacyCredentialsRemoved };
86
+ }
87
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Organization gate — runs right after login in the install flow.
3
+ *
4
+ * VibeDefend is useless without an organization: every project (and thus every
5
+ * business rule, guard, and scan) lives under one. So before we wire any hooks
6
+ * we make sure the freshly-authenticated user belongs to at least one org.
7
+ *
8
+ * - If they already do, this is a no-op (`'ok'`, no browser).
9
+ * - If they don't, we open the dashboard on-boarding page ONCE and poll the
10
+ * gateway until an org appears — returning `'ok'` the moment one does.
11
+ * - If they give up (Ctrl-C), the poll times out, we can't read a token, or
12
+ * the gateway is unreachable, we return `'skipped'` and the install
13
+ * continues. The gate NEVER hard-blocks (fail-open) — it is a nudge, not a
14
+ * wall.
15
+ *
16
+ * Every dependency is injectable so the flow is deterministic and offline in
17
+ * tests: `resolveTokenImpl` (token), `listOrgsImpl` (gateway), `openBrowserFn`
18
+ * (browser), `sleepImpl` (the 5s poll delay), plus `maxPolls`/`intervalMs`.
19
+ */
20
+ import kleur from 'kleur';
21
+ import { listOrganizations as listOrganizationsImpl } from './api/projects.js';
22
+ import { openBrowser as openBrowserImpl } from './login.js';
23
+ import { resolveTokenWithRefresh } from './hooks/runtime/resolve.js';
24
+ import { log } from './utils.js';
25
+ /** 120 polls × 5s = 10 minutes. */
26
+ const DEFAULT_MAX_POLLS = 120;
27
+ const DEFAULT_INTERVAL_MS = 5_000;
28
+ function defaultSleep(ms) {
29
+ return new Promise((resolve) => setTimeout(resolve, ms));
30
+ }
31
+ /**
32
+ * Ensure the authenticated user belongs to at least one organization.
33
+ * Returns `'ok'` once membership is confirmed, or `'skipped'` on any
34
+ * give-up / can't-tell path (never throws).
35
+ */
36
+ export async function ensureOrganization(input, deps = {}) {
37
+ const resolveToken = deps.resolveTokenImpl ?? resolveTokenWithRefresh;
38
+ const listOrgs = deps.listOrgsImpl ?? listOrganizationsImpl;
39
+ const openBrowserFn = deps.openBrowserFn ?? openBrowserImpl;
40
+ const sleep = deps.sleepImpl ?? defaultSleep;
41
+ const maxPolls = deps.maxPolls ?? DEFAULT_MAX_POLLS;
42
+ const intervalMs = deps.intervalMs ?? DEFAULT_INTERVAL_MS;
43
+ const token = await resolveToken(input.mcpName);
44
+ if (!token) {
45
+ // Just logged in, yet no token resolves — a transient keychain/refresh
46
+ // hiccup. Don't force onboarding; the user can sort it out later.
47
+ log.warn('Could not read your credentials to verify organization membership — continuing. ' +
48
+ `Create or join an organization at ${input.dashboardUrl} if you have not yet.`);
49
+ return 'skipped';
50
+ }
51
+ // Fast path: already a member of ≥1 org.
52
+ const initial = await listOrgs(input.apiBase, token);
53
+ if (initial && initial.length >= 1) {
54
+ return 'ok';
55
+ }
56
+ if (initial === null) {
57
+ // Gateway unreachable — we CAN'T tell whether the user has orgs, so we do
58
+ // not force onboarding (fail-open). `null` never means "zero orgs".
59
+ log.warn('Could not reach the gateway to check your organizations — continuing.');
60
+ return 'skipped';
61
+ }
62
+ // 0 orgs → gate. Print the message, open onboarding once, then poll.
63
+ console.log();
64
+ log.warn('Before anything else, create or join an organization to use VibeDefend.');
65
+ const onboardingUrl = `${input.dashboardUrl}/on-boarding?source=vibedefend`;
66
+ const opened = openBrowserFn(onboardingUrl);
67
+ if (opened) {
68
+ log.hint(`Opened ${kleur.cyan(onboardingUrl)} in your browser.`);
69
+ }
70
+ else {
71
+ log.hint(`Open this URL to get started: ${kleur.cyan(onboardingUrl)}`);
72
+ }
73
+ log.hint('Waiting for you to create or join an organization (Ctrl-C to skip)...');
74
+ // Poll for an org to appear. A Ctrl-C during the wait resolves the current
75
+ // interval immediately and breaks the loop — the install continues rather
76
+ // than aborting. The handler is registered with `once` and ALSO removed in
77
+ // the `finally` below (same function reference — critical, otherwise the
78
+ // listener would leak and swallow the process's default SIGINT behaviour
79
+ // for the rest of the install).
80
+ let cancelled = false;
81
+ let resolveSigint = () => { };
82
+ const sigintPromise = new Promise((resolve) => {
83
+ resolveSigint = resolve;
84
+ });
85
+ const onSigint = () => {
86
+ cancelled = true;
87
+ resolveSigint();
88
+ };
89
+ process.once('SIGINT', onSigint);
90
+ try {
91
+ for (let i = 0; i < maxPolls; i++) {
92
+ await Promise.race([sleep(intervalMs), sigintPromise]);
93
+ if (cancelled)
94
+ break;
95
+ const orgs = await listOrgs(input.apiBase, token);
96
+ if (orgs && orgs.length >= 1) {
97
+ log.ok(`Organization detected — « ${orgs[0].name} ». Continuing.`);
98
+ return 'ok';
99
+ }
100
+ }
101
+ }
102
+ finally {
103
+ process.removeListener('SIGINT', onSigint);
104
+ }
105
+ log.warn(cancelled
106
+ ? 'Skipped the organization step — finish onboarding at the dashboard later.'
107
+ : 'Timed out waiting for an organization — continuing. Finish onboarding at the dashboard, then re-run any scan.');
108
+ return 'skipped';
109
+ }
110
+ //# sourceMappingURL=org-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-gate.js","sourceRoot":"","sources":["../src/org-gate.ts"],"names":[],"mappings":"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"}