@saferun/cli 0.5.25 → 0.5.27
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/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.js +439 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/setup.d.ts +47 -0
- package/dist/commands/setup.js +528 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/interceptors/clean.js +7 -4
- package/dist/interceptors/clean.js.map +1 -1
- package/dist/interceptors/commit.js +8 -22
- package/dist/interceptors/commit.js.map +1 -1
- package/dist/interceptors/force-push.js +6 -6
- package/dist/interceptors/force-push.js.map +1 -1
- package/dist/interceptors/reset-hard.js +7 -4
- package/dist/interceptors/reset-hard.js.map +1 -1
- package/dist/register-commands.js +27 -0
- package/dist/register-commands.js.map +1 -1
- package/dist/utils/credentials.d.ts +48 -0
- package/dist/utils/credentials.js +143 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/gitignore.d.ts +22 -0
- package/dist/utils/gitignore.js +105 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SafeRun Setup Wizard
|
|
4
|
+
* Complete onboarding in one command: API Key → Slack → GitHub App → Repo Setup
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SetupCommand = void 0;
|
|
11
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
13
|
+
const child_process_1 = require("child_process");
|
|
14
|
+
const util_1 = require("util");
|
|
15
|
+
const os_1 = __importDefault(require("os"));
|
|
16
|
+
const git_1 = require("../utils/git");
|
|
17
|
+
const config_1 = require("../utils/config");
|
|
18
|
+
const installer_1 = require("../hooks/installer");
|
|
19
|
+
const credentials_1 = require("../utils/credentials");
|
|
20
|
+
const gitignore_1 = require("../utils/gitignore");
|
|
21
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
22
|
+
const SAFERUN_DASHBOARD_URL = 'https://saferun-landing.vercel.app';
|
|
23
|
+
const SAFERUN_API_URL = 'https://saferun-api.up.railway.app';
|
|
24
|
+
const SLACK_APP_URL = 'https://api.slack.com/apps';
|
|
25
|
+
const GITHUB_APP_URL = 'https://github.com/apps/saferun-ai/installations/new';
|
|
26
|
+
class SetupCommand {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.slackConfigured = false;
|
|
29
|
+
this.githubAppInstalled = false;
|
|
30
|
+
this.repoInitialized = false;
|
|
31
|
+
this.protectionMode = 'block';
|
|
32
|
+
}
|
|
33
|
+
async run(options = {}) {
|
|
34
|
+
console.log(chalk_1.default.cyan('\n🛡️ SafeRun Setup Wizard\n'));
|
|
35
|
+
console.log(chalk_1.default.gray('This wizard will help you set up complete SafeRun protection.\n'));
|
|
36
|
+
// Step 1: API Key
|
|
37
|
+
await this.stepApiKey(options.apiKey);
|
|
38
|
+
if (!this.apiKey) {
|
|
39
|
+
console.log(chalk_1.default.red('\n❌ Setup cancelled: API key is required.\n'));
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Step 2: Slack (required for alerts)
|
|
44
|
+
if (!options.skipSlack) {
|
|
45
|
+
await this.stepSlack();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(chalk_1.default.yellow('\n⚠️ Skipping Slack setup (--skip-slack)\n'));
|
|
49
|
+
}
|
|
50
|
+
// Step 3: GitHub App (optional but recommended)
|
|
51
|
+
if (!options.skipGithub) {
|
|
52
|
+
await this.stepGitHubApp();
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(chalk_1.default.yellow('\n⚠️ Skipping GitHub App setup (--skip-github)\n'));
|
|
56
|
+
}
|
|
57
|
+
// Step 4: Repository Setup (if in a git repo)
|
|
58
|
+
await this.stepRepoSetup();
|
|
59
|
+
// Step 5: Protection Mode
|
|
60
|
+
await this.stepProtectionMode();
|
|
61
|
+
// Summary
|
|
62
|
+
this.printSummary();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Step 1: Configure API Key
|
|
66
|
+
*/
|
|
67
|
+
async stepApiKey(providedKey) {
|
|
68
|
+
console.log(chalk_1.default.bold('Step 1/5: API Key'));
|
|
69
|
+
console.log(chalk_1.default.gray('─'.repeat(40)));
|
|
70
|
+
// Check if already configured
|
|
71
|
+
const existingKey = await (0, credentials_1.resolveApiKey)();
|
|
72
|
+
if (existingKey) {
|
|
73
|
+
console.log(chalk_1.default.green(`✓ API key already configured: ${(0, credentials_1.maskApiKey)(existingKey)}`));
|
|
74
|
+
const { useExisting } = await inquirer_1.default.prompt([{
|
|
75
|
+
type: 'confirm',
|
|
76
|
+
name: 'useExisting',
|
|
77
|
+
message: 'Use existing API key?',
|
|
78
|
+
default: true,
|
|
79
|
+
}]);
|
|
80
|
+
if (useExisting) {
|
|
81
|
+
this.apiKey = existingKey;
|
|
82
|
+
console.log('');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// If key provided via flag
|
|
87
|
+
if (providedKey) {
|
|
88
|
+
if ((0, credentials_1.isValidApiKeyFormat)(providedKey)) {
|
|
89
|
+
await (0, credentials_1.saveGlobalCredentials)({ api_key: providedKey });
|
|
90
|
+
this.apiKey = providedKey;
|
|
91
|
+
console.log(chalk_1.default.green(`✓ API key saved to ${(0, credentials_1.getGlobalConfigDir)()}/credentials`));
|
|
92
|
+
console.log('');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log(chalk_1.default.yellow('⚠️ Provided API key has invalid format (should start with sr_)'));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Interactive prompt
|
|
100
|
+
console.log(chalk_1.default.cyan('\n📋 How to get your API key:\n'));
|
|
101
|
+
console.log(' 1. Go to ' + chalk_1.default.bold('saferun.dev') + ' (or saferun-landing.vercel.app)');
|
|
102
|
+
console.log(' 2. Sign up with GitHub or email');
|
|
103
|
+
console.log(' 3. Copy your API key from the dashboard');
|
|
104
|
+
console.log(chalk_1.default.gray(' (starts with "sr_...")\n'));
|
|
105
|
+
const { openDashboard } = await inquirer_1.default.prompt([{
|
|
106
|
+
type: 'confirm',
|
|
107
|
+
name: 'openDashboard',
|
|
108
|
+
message: 'Open SafeRun website in browser?',
|
|
109
|
+
default: true,
|
|
110
|
+
}]);
|
|
111
|
+
if (openDashboard) {
|
|
112
|
+
await this.openBrowser(SAFERUN_DASHBOARD_URL);
|
|
113
|
+
console.log(chalk_1.default.gray('\n✓ Browser opened. Copy your API key after signing up.\n'));
|
|
114
|
+
}
|
|
115
|
+
const { apiKey } = await inquirer_1.default.prompt([{
|
|
116
|
+
type: 'password',
|
|
117
|
+
name: 'apiKey',
|
|
118
|
+
message: 'Enter your SafeRun API key:',
|
|
119
|
+
mask: '*',
|
|
120
|
+
validate: (value) => {
|
|
121
|
+
if (!value)
|
|
122
|
+
return 'API key is required';
|
|
123
|
+
if (!(0, credentials_1.isValidApiKeyFormat)(value)) {
|
|
124
|
+
return 'Invalid format. API key should start with "sr_" and be at least 20 characters.';
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
},
|
|
128
|
+
}]);
|
|
129
|
+
// Validate with API
|
|
130
|
+
const isValid = await this.validateApiKey(apiKey);
|
|
131
|
+
if (!isValid) {
|
|
132
|
+
console.log(chalk_1.default.red('❌ API key validation failed. Please check your key and try again.'));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Save globally
|
|
136
|
+
await (0, credentials_1.saveGlobalCredentials)({ api_key: apiKey });
|
|
137
|
+
this.apiKey = apiKey;
|
|
138
|
+
console.log(chalk_1.default.green(`\n✓ API key saved to ${(0, credentials_1.getGlobalConfigDir)()}/credentials (chmod 600)`));
|
|
139
|
+
console.log('');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Step 2: Configure Slack notifications
|
|
143
|
+
*/
|
|
144
|
+
async stepSlack() {
|
|
145
|
+
console.log(chalk_1.default.bold('\nStep 2/5: Slack Notifications'));
|
|
146
|
+
console.log(chalk_1.default.gray('─'.repeat(40)));
|
|
147
|
+
console.log(chalk_1.default.yellow('⚠️ Slack is REQUIRED for security alerts (force push, branch delete, etc.)\n'));
|
|
148
|
+
// Check if already configured
|
|
149
|
+
const slackStatus = await this.checkSlackStatus();
|
|
150
|
+
if (slackStatus.configured) {
|
|
151
|
+
console.log(chalk_1.default.green(`✓ Slack already configured: ${slackStatus.channel || 'webhook'}`));
|
|
152
|
+
this.slackConfigured = true;
|
|
153
|
+
const { reconfigure } = await inquirer_1.default.prompt([{
|
|
154
|
+
type: 'confirm',
|
|
155
|
+
name: 'reconfigure',
|
|
156
|
+
message: 'Reconfigure Slack?',
|
|
157
|
+
default: false,
|
|
158
|
+
}]);
|
|
159
|
+
if (!reconfigure) {
|
|
160
|
+
console.log('');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const { method } = await inquirer_1.default.prompt([{
|
|
165
|
+
type: 'list',
|
|
166
|
+
name: 'method',
|
|
167
|
+
message: 'Choose Slack setup method:',
|
|
168
|
+
choices: [
|
|
169
|
+
{ name: '🔗 Open browser to create Slack webhook (recommended)', value: 'browser' },
|
|
170
|
+
{ name: '📝 Enter existing webhook URL', value: 'manual' },
|
|
171
|
+
{ name: '⏭️ Skip for now (⚠️ you won\'t receive alerts!)', value: 'skip' },
|
|
172
|
+
],
|
|
173
|
+
}]);
|
|
174
|
+
if (method === 'skip') {
|
|
175
|
+
console.log(chalk_1.default.yellow('\n⚠️ Skipping Slack. You won\'t receive security alerts!'));
|
|
176
|
+
console.log(chalk_1.default.gray(' Run "saferun config slack" later to configure.\n'));
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (method === 'browser') {
|
|
180
|
+
console.log(chalk_1.default.cyan('\n📋 How to create Slack webhook:\n'));
|
|
181
|
+
console.log(' 1. Click "Create New App" → "From scratch"');
|
|
182
|
+
console.log(' 2. Name it "SafeRun" and select your workspace');
|
|
183
|
+
console.log(' 3. Go to ' + chalk_1.default.bold('"Incoming Webhooks"') + ' in left menu');
|
|
184
|
+
console.log(' 4. Toggle ' + chalk_1.default.bold('"Activate Incoming Webhooks"') + ' ON');
|
|
185
|
+
console.log(' 5. Click "Add New Webhook to Workspace"');
|
|
186
|
+
console.log(' 6. Select channel (e.g., #saferun-alerts)');
|
|
187
|
+
console.log(' 7. Copy the webhook URL');
|
|
188
|
+
console.log(chalk_1.default.gray(' (starts with "https://hooks.slack.com/...")\n'));
|
|
189
|
+
await this.openBrowser(SLACK_APP_URL);
|
|
190
|
+
}
|
|
191
|
+
const { webhookUrl } = await inquirer_1.default.prompt([{
|
|
192
|
+
type: 'input',
|
|
193
|
+
name: 'webhookUrl',
|
|
194
|
+
message: 'Paste your Slack webhook URL:',
|
|
195
|
+
validate: (value) => {
|
|
196
|
+
if (!value)
|
|
197
|
+
return 'Webhook URL is required';
|
|
198
|
+
if (!value.startsWith('https://hooks.slack.com/')) {
|
|
199
|
+
return 'Invalid URL. Should start with https://hooks.slack.com/';
|
|
200
|
+
}
|
|
201
|
+
return true;
|
|
202
|
+
},
|
|
203
|
+
}]);
|
|
204
|
+
const { channel } = await inquirer_1.default.prompt([{
|
|
205
|
+
type: 'input',
|
|
206
|
+
name: 'channel',
|
|
207
|
+
message: 'Slack channel name:',
|
|
208
|
+
default: '#saferun-alerts',
|
|
209
|
+
validate: (value) => {
|
|
210
|
+
if (!value.startsWith('#') && !value.startsWith('@')) {
|
|
211
|
+
return 'Channel should start with # or @';
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
},
|
|
215
|
+
}]);
|
|
216
|
+
// Configure via API
|
|
217
|
+
const success = await this.configureSlack(webhookUrl, channel);
|
|
218
|
+
if (success) {
|
|
219
|
+
console.log(chalk_1.default.green('\n✓ Slack configured!'));
|
|
220
|
+
console.log(chalk_1.default.gray(' Test by triggering a SafeRun operation (e.g., git push --force)'));
|
|
221
|
+
this.slackConfigured = true;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
console.log(chalk_1.default.red('\n❌ Failed to configure Slack. Run "saferun config slack" to try again.'));
|
|
225
|
+
}
|
|
226
|
+
console.log('');
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Step 3: Install GitHub App
|
|
230
|
+
*/
|
|
231
|
+
async stepGitHubApp() {
|
|
232
|
+
console.log(chalk_1.default.bold('\nStep 3/5: GitHub App'));
|
|
233
|
+
console.log(chalk_1.default.gray('─'.repeat(40)));
|
|
234
|
+
console.log(chalk_1.default.cyan('\n📋 Why GitHub App?\n'));
|
|
235
|
+
console.log(' GitHub App catches dangerous operations that bypass CLI:');
|
|
236
|
+
console.log(' • Force pushes made directly on GitHub');
|
|
237
|
+
console.log(' • Branch deletions via GitHub UI');
|
|
238
|
+
console.log(' • Changes from other machines without SafeRun\n');
|
|
239
|
+
const { install } = await inquirer_1.default.prompt([{
|
|
240
|
+
type: 'list',
|
|
241
|
+
name: 'install',
|
|
242
|
+
message: 'Install SafeRun GitHub App?',
|
|
243
|
+
choices: [
|
|
244
|
+
{ name: '✅ Yes, open browser to install', value: 'yes' },
|
|
245
|
+
{ name: '⏭️ Skip (CLI protection only)', value: 'skip' },
|
|
246
|
+
{ name: '✓ Already installed', value: 'done' },
|
|
247
|
+
],
|
|
248
|
+
}]);
|
|
249
|
+
if (install === 'skip') {
|
|
250
|
+
console.log(chalk_1.default.yellow('\n⚠️ Skipping GitHub App. Webhook protection won\'t be active.'));
|
|
251
|
+
console.log(chalk_1.default.gray(' Install later at: ' + GITHUB_APP_URL + '\n'));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (install === 'done') {
|
|
255
|
+
this.githubAppInstalled = true;
|
|
256
|
+
console.log(chalk_1.default.green('\n✓ GitHub App marked as installed.\n'));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
console.log(chalk_1.default.cyan('\n📋 How to install GitHub App:\n'));
|
|
260
|
+
console.log(' 1. Click "Install" on the GitHub page');
|
|
261
|
+
console.log(' 2. Select your account or organization');
|
|
262
|
+
console.log(' 3. Choose "All repositories" or select specific ones');
|
|
263
|
+
console.log(' 4. Click "Install" to confirm\n');
|
|
264
|
+
await this.openBrowser(GITHUB_APP_URL);
|
|
265
|
+
const { installed } = await inquirer_1.default.prompt([{
|
|
266
|
+
type: 'confirm',
|
|
267
|
+
name: 'installed',
|
|
268
|
+
message: 'Did you complete the GitHub App installation?',
|
|
269
|
+
default: true,
|
|
270
|
+
}]);
|
|
271
|
+
if (installed) {
|
|
272
|
+
this.githubAppInstalled = true;
|
|
273
|
+
console.log(chalk_1.default.green('\n✓ GitHub App installed!\n'));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Step 4: Initialize repository
|
|
278
|
+
*/
|
|
279
|
+
async stepRepoSetup() {
|
|
280
|
+
console.log(chalk_1.default.bold('\nStep 4/5: Repository Setup'));
|
|
281
|
+
console.log(chalk_1.default.gray('─'.repeat(40)));
|
|
282
|
+
const isRepo = await (0, git_1.isGitRepository)();
|
|
283
|
+
if (!isRepo) {
|
|
284
|
+
console.log(chalk_1.default.yellow('⚠️ Not inside a git repository.'));
|
|
285
|
+
console.log(chalk_1.default.gray(' Navigate to a repo and run "saferun init" to set up protection.\n'));
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const gitInfo = await (0, git_1.getGitInfo)();
|
|
289
|
+
if (!gitInfo) {
|
|
290
|
+
console.log(chalk_1.default.red('❌ Could not determine git repository info.\n'));
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
console.log(chalk_1.default.gray(`Repository: ${gitInfo.repoSlug || gitInfo.repoRoot}\n`));
|
|
294
|
+
const { initialize } = await inquirer_1.default.prompt([{
|
|
295
|
+
type: 'confirm',
|
|
296
|
+
name: 'initialize',
|
|
297
|
+
message: `Initialize SafeRun in this repository?`,
|
|
298
|
+
default: true,
|
|
299
|
+
}]);
|
|
300
|
+
if (!initialize) {
|
|
301
|
+
console.log(chalk_1.default.gray('\n Run "saferun init" later to initialize.\n'));
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Install hooks
|
|
305
|
+
console.log(chalk_1.default.gray('\nInstalling git hooks...'));
|
|
306
|
+
try {
|
|
307
|
+
const hooksResult = await (0, installer_1.installHooks)({
|
|
308
|
+
repoRoot: gitInfo.repoRoot,
|
|
309
|
+
gitDir: gitInfo.gitDir
|
|
310
|
+
});
|
|
311
|
+
console.log(chalk_1.default.green(`✓ ${hooksResult.installed.length} hooks installed`));
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
console.log(chalk_1.default.red(`❌ Failed to install hooks: ${err}`));
|
|
315
|
+
}
|
|
316
|
+
// Check/update .gitignore
|
|
317
|
+
console.log(chalk_1.default.gray('\nChecking .gitignore...'));
|
|
318
|
+
const gitignoreCheck = await (0, gitignore_1.checkGitignore)(gitInfo.repoRoot);
|
|
319
|
+
if (!gitignoreCheck.hasSaferunEntries) {
|
|
320
|
+
console.log(chalk_1.default.yellow(`⚠️ SafeRun entries not in .gitignore`));
|
|
321
|
+
if (gitignoreCheck.missingEntries.length > 0) {
|
|
322
|
+
console.log(chalk_1.default.gray(' Missing entries:'));
|
|
323
|
+
for (const entry of gitignoreCheck.missingEntries.slice(0, 3)) {
|
|
324
|
+
console.log(chalk_1.default.gray(` • ${entry}`));
|
|
325
|
+
}
|
|
326
|
+
if (gitignoreCheck.missingEntries.length > 3) {
|
|
327
|
+
console.log(chalk_1.default.gray(` • ... and ${gitignoreCheck.missingEntries.length - 3} more`));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const { updateGitignore } = await inquirer_1.default.prompt([{
|
|
331
|
+
type: 'confirm',
|
|
332
|
+
name: 'updateGitignore',
|
|
333
|
+
message: 'Add SafeRun entries to .gitignore?',
|
|
334
|
+
default: true,
|
|
335
|
+
}]);
|
|
336
|
+
if (updateGitignore) {
|
|
337
|
+
await (0, gitignore_1.addToGitignore)(gitInfo.repoRoot);
|
|
338
|
+
console.log(chalk_1.default.green('✓ .gitignore updated'));
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
console.log(chalk_1.default.yellow('⚠️ Please add .saferun/credentials to .gitignore manually!'));
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
console.log(chalk_1.default.green('✓ .gitignore already has SafeRun entries'));
|
|
346
|
+
}
|
|
347
|
+
// Save local config (mode will be set in Step 5)
|
|
348
|
+
console.log(chalk_1.default.gray('\nCreating .saferun/config.yml...'));
|
|
349
|
+
let config = await (0, config_1.loadConfig)(gitInfo.repoRoot, { allowCreate: true });
|
|
350
|
+
// Set repo info
|
|
351
|
+
if (gitInfo.repoSlug) {
|
|
352
|
+
config.github.repo = gitInfo.repoSlug;
|
|
353
|
+
}
|
|
354
|
+
if (gitInfo.defaultBranch) {
|
|
355
|
+
const branches = new Set(config.github.protected_branches);
|
|
356
|
+
branches.add(gitInfo.defaultBranch);
|
|
357
|
+
config.github.protected_branches = Array.from(branches);
|
|
358
|
+
}
|
|
359
|
+
await (0, config_1.saveConfig)(config, gitInfo.repoRoot);
|
|
360
|
+
console.log(chalk_1.default.green('✓ Config saved'));
|
|
361
|
+
this.repoInitialized = true;
|
|
362
|
+
console.log('');
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Step 5: Select Protection Mode
|
|
366
|
+
*/
|
|
367
|
+
async stepProtectionMode() {
|
|
368
|
+
console.log(chalk_1.default.bold('\nStep 5/5: Protection Mode'));
|
|
369
|
+
console.log(chalk_1.default.gray('─'.repeat(40)));
|
|
370
|
+
if (!this.repoInitialized) {
|
|
371
|
+
console.log(chalk_1.default.gray('Skipped (repository not initialized)\n'));
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
console.log(chalk_1.default.cyan('\n📋 What should SafeRun do when it detects risky operations?\n'));
|
|
375
|
+
const { mode } = await inquirer_1.default.prompt([{
|
|
376
|
+
type: 'list',
|
|
377
|
+
name: 'mode',
|
|
378
|
+
message: 'Select protection mode:',
|
|
379
|
+
default: 'block',
|
|
380
|
+
choices: [
|
|
381
|
+
{ name: '👀 Monitor — log only, no blocking (for testing)', value: 'monitor' },
|
|
382
|
+
{ name: '⚠️ Warn — show warnings, but allow operations', value: 'warn' },
|
|
383
|
+
{ name: '🛑 Block — require approval for risky actions (recommended)', value: 'block' },
|
|
384
|
+
{ name: '🔒 Enforce — strict blocking, maximum security', value: 'enforce' },
|
|
385
|
+
],
|
|
386
|
+
}]);
|
|
387
|
+
this.protectionMode = mode;
|
|
388
|
+
// Update config with mode
|
|
389
|
+
const gitInfo = await (0, git_1.getGitInfo)();
|
|
390
|
+
if (gitInfo) {
|
|
391
|
+
let config = await (0, config_1.loadConfig)(gitInfo.repoRoot, { allowCreate: false });
|
|
392
|
+
config.mode = mode;
|
|
393
|
+
await (0, config_1.saveConfig)(config, gitInfo.repoRoot);
|
|
394
|
+
}
|
|
395
|
+
console.log(chalk_1.default.green(`\n✓ Protection mode set to: ${mode.toUpperCase()}`));
|
|
396
|
+
console.log('');
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Print setup summary
|
|
400
|
+
*/
|
|
401
|
+
printSummary() {
|
|
402
|
+
console.log(chalk_1.default.cyan('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
|
|
403
|
+
console.log(chalk_1.default.bold('🎉 SafeRun Setup Complete!\n'));
|
|
404
|
+
console.log('Your setup:');
|
|
405
|
+
console.log(` ${this.apiKey ? chalk_1.default.green('✓') : chalk_1.default.red('✗')} API Key: ${this.apiKey ? 'configured (global)' : 'not configured'}`);
|
|
406
|
+
console.log(` ${this.slackConfigured ? chalk_1.default.green('✓') : chalk_1.default.yellow('⚠')} Slack: ${this.slackConfigured ? 'connected' : 'not configured'}`);
|
|
407
|
+
console.log(` ${this.githubAppInstalled ? chalk_1.default.green('✓') : chalk_1.default.yellow('⚠')} GitHub App: ${this.githubAppInstalled ? 'installed' : 'not installed'}`);
|
|
408
|
+
console.log(` ${this.repoInitialized ? chalk_1.default.green('✓') : chalk_1.default.yellow('⚠')} Repository: ${this.repoInitialized ? 'hooks installed' : 'skipped (run "saferun init")'}`);
|
|
409
|
+
console.log(` ${this.repoInitialized ? chalk_1.default.green('✓') : chalk_1.default.gray('○')} Mode: ${this.repoInitialized ? this.protectionMode.toUpperCase() : 'not set'}`);
|
|
410
|
+
console.log(chalk_1.default.gray('\nNext steps:'));
|
|
411
|
+
if (!this.slackConfigured) {
|
|
412
|
+
console.log(chalk_1.default.yellow(' • Run "saferun config slack" to configure notifications'));
|
|
413
|
+
}
|
|
414
|
+
if (!this.githubAppInstalled) {
|
|
415
|
+
console.log(chalk_1.default.gray(` • Install GitHub App: ${GITHUB_APP_URL}`));
|
|
416
|
+
}
|
|
417
|
+
if (this.repoInitialized) {
|
|
418
|
+
console.log(chalk_1.default.cyan(' • Test it: git push --force origin main'));
|
|
419
|
+
}
|
|
420
|
+
console.log(chalk_1.default.gray('\nVerify setup:'));
|
|
421
|
+
console.log(chalk_1.default.cyan(' saferun doctor'));
|
|
422
|
+
console.log(chalk_1.default.gray('\nDocumentation:'));
|
|
423
|
+
console.log(chalk_1.default.cyan(' https://saferun.dev/docs\n'));
|
|
424
|
+
}
|
|
425
|
+
// ─────────────────────────────────────────────────────────────────
|
|
426
|
+
// Helper methods
|
|
427
|
+
// ─────────────────────────────────────────────────────────────────
|
|
428
|
+
async openBrowser(url) {
|
|
429
|
+
const platform = os_1.default.platform();
|
|
430
|
+
try {
|
|
431
|
+
if (platform === 'darwin') {
|
|
432
|
+
await execAsync(`open "${url}"`);
|
|
433
|
+
}
|
|
434
|
+
else if (platform === 'win32') {
|
|
435
|
+
await execAsync(`start "" "${url}"`);
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
// Linux
|
|
439
|
+
await execAsync(`xdg-open "${url}"`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch {
|
|
443
|
+
console.log(chalk_1.default.gray(`\nCouldn't open browser. Please visit:\n${chalk_1.default.cyan(url)}\n`));
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
async validateApiKey(apiKey) {
|
|
447
|
+
try {
|
|
448
|
+
// Use an authenticated endpoint to validate the key
|
|
449
|
+
const response = await fetch(`${SAFERUN_API_URL}/v1/settings`, {
|
|
450
|
+
headers: { 'X-API-Key': apiKey },
|
|
451
|
+
});
|
|
452
|
+
// 200 = valid, 401/403 = invalid, 404 = endpoint not found (still valid key format)
|
|
453
|
+
return response.ok || response.status === 404;
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
// Network error - assume key is valid if format is correct
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
async checkSlackStatus() {
|
|
461
|
+
if (!this.apiKey)
|
|
462
|
+
return { configured: false };
|
|
463
|
+
try {
|
|
464
|
+
const response = await fetch(`${SAFERUN_API_URL}/v1/settings/notifications`, {
|
|
465
|
+
headers: { 'X-API-Key': this.apiKey },
|
|
466
|
+
});
|
|
467
|
+
if (response.ok) {
|
|
468
|
+
const data = await response.json();
|
|
469
|
+
return {
|
|
470
|
+
configured: data.slack_enabled === true,
|
|
471
|
+
channel: data.slack_channel,
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
catch {
|
|
476
|
+
// Ignore errors
|
|
477
|
+
}
|
|
478
|
+
return { configured: false };
|
|
479
|
+
}
|
|
480
|
+
async configureSlack(webhookUrl, channel) {
|
|
481
|
+
if (!this.apiKey)
|
|
482
|
+
return false;
|
|
483
|
+
try {
|
|
484
|
+
const response = await fetch(`${SAFERUN_API_URL}/v1/settings/notifications`, {
|
|
485
|
+
method: 'PUT',
|
|
486
|
+
headers: {
|
|
487
|
+
'Content-Type': 'application/json',
|
|
488
|
+
'X-API-Key': this.apiKey,
|
|
489
|
+
},
|
|
490
|
+
body: JSON.stringify({
|
|
491
|
+
slack_enabled: true,
|
|
492
|
+
slack_webhook_url: webhookUrl,
|
|
493
|
+
slack_channel: channel,
|
|
494
|
+
notification_channels: ['slack'],
|
|
495
|
+
}),
|
|
496
|
+
});
|
|
497
|
+
return response.ok;
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
async sendTestSlack() {
|
|
504
|
+
if (!this.apiKey)
|
|
505
|
+
return;
|
|
506
|
+
console.log(chalk_1.default.gray('Sending test notification...'));
|
|
507
|
+
try {
|
|
508
|
+
const response = await fetch(`${SAFERUN_API_URL}/v1/settings/notifications/test`, {
|
|
509
|
+
method: 'POST',
|
|
510
|
+
headers: {
|
|
511
|
+
'Content-Type': 'application/json',
|
|
512
|
+
'X-API-Key': this.apiKey,
|
|
513
|
+
},
|
|
514
|
+
});
|
|
515
|
+
if (response.ok) {
|
|
516
|
+
console.log(chalk_1.default.green('✓ Test notification sent! Check your Slack channel.'));
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
console.log(chalk_1.default.yellow('⚠️ Could not send test notification.'));
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
console.log(chalk_1.default.yellow('⚠️ Could not send test notification (network error).'));
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
exports.SetupCommand = SetupCommand;
|
|
528
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -137,20 +137,23 @@ async function interceptClean(context) {
|
|
|
137
137
|
catch (error) {
|
|
138
138
|
const message = error instanceof Error ? error.message : String(error);
|
|
139
139
|
console.error(chalk_1.default.red(`SafeRun error: ${message}`));
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
// SECURITY: Block operation when API unavailable (fail-secure)
|
|
141
|
+
console.error(chalk_1.default.red('🚫 Operation blocked - SafeRun API unreachable'));
|
|
142
|
+
console.error(chalk_1.default.yellow(' Cannot verify safety without API connection.'));
|
|
143
|
+
context.metrics.track('operation_blocked', {
|
|
142
144
|
hook: 'alias:clean',
|
|
143
145
|
operation_type: 'clean',
|
|
144
146
|
repo: repoSlug,
|
|
145
|
-
reason: '
|
|
147
|
+
reason: 'api_unreachable',
|
|
146
148
|
}).catch(() => undefined);
|
|
147
149
|
await (0, logger_1.logOperation)(context.gitInfo.repoRoot, {
|
|
148
150
|
event: 'clean',
|
|
149
151
|
operation: 'clean',
|
|
150
152
|
repo: repoSlug,
|
|
151
|
-
outcome: '
|
|
153
|
+
outcome: 'blocked_api_error',
|
|
152
154
|
error: message,
|
|
153
155
|
});
|
|
156
|
+
return 1;
|
|
154
157
|
}
|
|
155
158
|
const exitCode = await (0, git_1.runGitCommand)(['clean', ...context.args], {
|
|
156
159
|
cwd: context.gitInfo.repoRoot,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/interceptors/clean.ts"],"names":[],"mappings":";;;;;AAuBA,
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/interceptors/clean.ts"],"names":[],"mappings":"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"}
|