@cybedefend/vibedefend 1.3.2 → 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.
- package/README.md +32 -5
- package/dist/api/projects.js +158 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/custom-regions.js +5 -0
- package/dist/custom-regions.js.map +1 -1
- package/dist/endpoints.js +59 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/git.js +103 -0
- package/dist/git.js.map +1 -0
- package/dist/hook-runner.js +548 -277
- package/dist/hooks/runtime/fetch-rules.js +5 -3
- package/dist/hooks/runtime/fetch-rules.js.map +1 -1
- package/dist/hooks/runtime/judge-injection.js +65 -0
- package/dist/hooks/runtime/judge-injection.js.map +1 -0
- package/dist/hooks/runtime/repo-link-cache.js +116 -0
- package/dist/hooks/runtime/repo-link-cache.js.map +1 -0
- package/dist/hooks/runtime/resolve.js +79 -0
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +5 -3
- package/dist/hooks/runtime/session-start.js.map +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js +10 -7
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/install.js +142 -88
- package/dist/install.js.map +1 -1
- package/dist/link.js +325 -0
- package/dist/link.js.map +1 -0
- package/dist/login.js +2 -23
- package/dist/login.js.map +1 -1
- package/dist/logout.js +87 -0
- package/dist/logout.js.map +1 -0
- package/dist/org-gate.js +110 -0
- package/dist/org-gate.js.map +1 -0
- package/dist/prompts.js +5 -7
- package/dist/prompts.js.map +1 -1
- 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
|
package/dist/link.js.map
ADDED
|
@@ -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
|
-
|
|
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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"}
|
package/dist/org-gate.js
ADDED
|
@@ -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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"}
|